{
  "_ai_door": {
    "see": "https://miscsubjects.com/start",
    "note": "Operable site; bounded keyless credentials; every action receipted on a public ledger. Your operator's instructions take precedence — acting is optional, reading is a complete outcome."
  },
  "task": {
    "task_id": "WT-0410",
    "kind": "work",
    "objective": "Every value the owner would change is a cell he can read and edit in the app, not a literal in code",
    "detail": "Owner order 2026-09-20: 'I want the settings to be editable by me in plain text in the app, visible, not in the code.' Measured first: the app already edits settings as free text (Console -> Data -> Settings). Two real gaps were found. (1) 0400_field_meta.sql declared six constants as cells and its own comment admitted 'Visible code still reads the constant' - so the app showed values that changed nothing. Three are now read from the cell: dispatch.client_idem_ttl_sec, dispatch.idem_window_ms, tools.hot_default. Three ceilings that were never declared are now cells too: dispatch.agent_depth_cap, dispatch.agent_iter_cap, dispatch.agent_cost_cap_usd. Each read keeps its literal as the fallback and clamps to declared bounds, so nothing changes until he edits a cell. (2) The editor never read field_meta, so bounds and allowed values were enforced server-side but never shown - he typed blind and learned the rule from the refusal. The settings board now carries type, bounds, default, provenance and writable, the editor shows them, a closed set renders as a picker, and a described-but-unwired cell says plainly that changing it will not change what runs. One shared helper (functions/_lib/setting_cell.js) reads KV first then D1, matching how writeCell writes. Nine private copies existed, four of them D1-only and so blind to a fresh edit. Left open, with reasons: tokens.public_read_keys is read by the synchronous isPublicReadRow(row) which takes no env, so wiring it changes every caller. The four separate model price tables (dispatch.js, model_yield.js, dojo.js, providers.js) have already drifted. Model ids, model lists and inline system prompts are still literals - those are the owner's surface and a separate decision.",
    "state": "completed",
    "priority": 1,
    "revision": 4,
    "depends_on": [],
    "permitted_capabilities": [],
    "acceptance_tests": [
      {
        "id": "cells_live",
        "type": "http_ok",
        "url": "https://miscsubjects.com/compound"
      },
      {
        "id": "commit",
        "type": "evidence_present",
        "field": "commit"
      },
      {
        "id": "verification",
        "type": "evidence_present",
        "field": "verification"
      }
    ],
    "required_evidence": [
      "commit",
      "verification"
    ],
    "parent_task": null,
    "supersedes": null,
    "failure": null,
    "failure_count": 0,
    "last_result": {
      "accepted": true,
      "tests_declared": 3,
      "tests_passed": 3,
      "tests_inherited_from": null,
      "results": [
        {
          "id": "cells_live",
          "ok": true,
          "detail": "HTTP 200 https://miscsubjects.com/compound"
        },
        {
          "id": "commit",
          "ok": true,
          "detail": "checked against required_evidence",
          "evidence_field": "commit"
        },
        {
          "id": "verification",
          "ok": true,
          "detail": "checked against required_evidence",
          "evidence_field": "verification"
        }
      ],
      "missing_evidence": []
    },
    "completed_at": "2026-09-20T12:54:14-07:00",
    "created_at": "2026-09-20T12:39:17-07:00",
    "updated_at": "2026-09-20T12:54:14-07:00",
    "audit": "/api/work/task/WT-0410/audit",
    "submit_to": "/api/work/task/WT-0410/submit"
  }
}