{"type":"meta","schema":"session-state/v1","slug":"harness-tier-backlog","topic":"Tier taxonomy rename (critical/regular/simple -> low/medium/high) + tier-downgrade backlog/triage feature","created":"2026-07-01","exec_mode":"ship","scheduler":"dag-parallel","land_mode":"merge-to-main","base_branch":"main","status_enum":["BLOCKED","PENDING","WORKING","WRITTEN","REVIEWED","COMMITTED"],"truth_rule":"this file is ground truth for INTENT (goals/directions/task list); git is ground truth for DONE-NESS \u2014 reconcile statuses against git, never trust a COMMITTED line with no commit","refresh_how":"native Read of THIS file \u2014 NEVER ctx_execute/ctx_search","refresh_what":"meta + every goal/methodology/intent/direction record + all WORKING and BLOCKED tasks (skip COMMITTED lines)","refresh_when":["wave/phase boundary","any task status change","after a compaction system-reminder","before calling advisor"],"update_rule":"on status change, rewrite that task's single line in place; append new tasks/session_memory as new lines","report_rule":"at session end emit brief: done / blocked / deferred / canceled \u2014 NO 'next action' (if you know it, do it)","preflight":{"task_graph_hash":"785573113cf3d75237543d1521a3d386a9945cd3"}}
{"type":"goal","text":"Rename the tier taxonomy to low/medium/high with a closed-enum all-or-nothing coverage lint, then build the tier-downgrade backlog/triage feature on top: auto-detect silent rung-4 fallbacks, allow manual flagging, scope views per-plan/per-project/global, and support manual re-run at an explicit tier override."}
{"type":"methodology","text":"Contract-level plan, fresh subagent per task via ship, two-stage review. Wave 1-3 (tier rename) is a hard gate before wave 4-8 (backlog feature) starts \u2014 enforced by wave ordering/deps, not a human gate."}
{"type":"intent","text":"resolve-seat.sh silently falls back to a preset's flat/default binding when a role has no tier layer for the requested tier, with zero signal \u2014 tasks authored for a high tier can silently run on a weaker model. This closes that blind spot: surface it, record it durably, and make it triageable/re-runnable."}
{"type":"direction","verbatim":"we don't want anything backwards compatible, i'm a single dev it's not a product for releasing... agents can deal with it, and in a few hours they won't need to."}
{"type":"direction","verbatim":"llm mismatch could not lead to a halt"}
{"type":"direction","verbatim":"priority can be assigned... backlog per plan, per project, and global"}
{"type":"anchor","path":"docs/specs/2026-07-01-harness-tier-backlog-design.md","what":"spec"}
{"type":"anchor","path":"docs/plans/2026-07-01-harness-tier-backlog.md","what":"plan"}
{"type":"task","id":"t1","wave":1,"phase":1,"desc":"Close the tier enum in spec/presets.schema.json to low/medium/high","status":"COMMITTED","deps":[],"requires_decision":null,"files":["spec/presets.schema.json"],"blocker":null}
{"type":"task","id":"t2","wave":1,"phase":1,"desc":"Add all-or-nothing tier-coverage lint to presets/_validate.mjs, update self-test fixtures","status":"COMMITTED","deps":[],"requires_decision":null,"files":["presets/_validate.mjs"],"blocker":null}
{"type":"task","id":"t3","wave":2,"phase":1,"desc":"Add low/medium/high tier layer to presets/codex.json — 3 genuinely distinct bindings per seat (coder.high=gpt-5.5-high kept, +medium=gpt-5.5-medium, +low=gpt-5.5-low; reviewer.low=gpt-5.5-low kept, +medium=gpt-5.5-medium, +high=gpt-5.5-high), with high->medium->low fallbacks","status":"COMMITTED","deps":["t1","t2"],"requires_decision":null,"files":["presets/codex.json"],"blocker":null}
{"type":"task","id":"t5","wave":2,"phase":1,"desc":"Rename default tier fallback in src/runner.js (regular -> medium)","status":"COMMITTED","deps":["t1","t2"],"requires_decision":null,"files":["src/runner.js"],"blocker":null}
{"type":"task","id":"t5b","wave":2,"phase":1,"desc":"Rename tier vocabulary in lib/test-resolve-seat.sh and test/runner-integration.sh (part of the frozen ship TESTCMD)","status":"COMMITTED","deps":["t1","t2"],"requires_decision":null,"files":["lib/test-resolve-seat.sh","test/runner-integration.sh"],"blocker":null}
{"type":"task","id":"t6","wave":3,"phase":1,"desc":"Full validation gate: confirm tier rename complete and internally consistent before backlog feature work starts","status":"COMMITTED","deps":["t3","t5","t5b"],"requires_decision":null,"files":[],"blocker":null}
{"type":"task","id":"t7","wave":4,"phase":1,"desc":"Add rung field (1|2|3|4) to resolve-seat.sh's resolved binding output","status":"COMMITTED","deps":["t6"],"requires_decision":null,"files":["lib/resolve-seat.sh"],"blocker":null}
{"type":"task","id":"t8","wave":4,"phase":1,"desc":"Create lib/backlog.sh: backlog/v1 persistence helper (append, set-status, locking, independent of journal.sh)","status":"COMMITTED","deps":["t6"],"requires_decision":null,"files":["lib/backlog.sh"],"blocker":null}
{"type":"task","id":"t9","wave":5,"phase":1,"desc":"Capture tierExplicit at plan-parse time in src/runner.js loadPlan","status":"COMMITTED","deps":["t6"],"requires_decision":null,"files":["src/runner.js"],"blocker":null}
{"type":"task","id":"t10","wave":5,"phase":2,"desc":"Auto-downgrade detector in src/runner.js: append backlog/v1 record when tierExplicit && rung==4","status":"COMMITTED","deps":["t7","t8","t9"],"requires_decision":null,"files":["src/runner.js"],"blocker":null}
{"type":"task","id":"t11","wave":5,"phase":3,"desc":"Add runSingleTaskWithOverrides wrapper in src/runner.js for backlog requeue","status":"COMMITTED","deps":["t9"],"requires_decision":null,"files":["src/runner.js"],"blocker":null}
{"type":"task","id":"t12","wave":6,"phase":1,"desc":"Gateway route: POST /api/gateway/runs/:runId/tasks/:taskId/backlog (manual flag)","status":"COMMITTED","deps":["t8"],"requires_decision":null,"files":["web/src/pages/api/gateway/runs/[runId]/tasks/[taskId]/backlog.js"],"blocker":null}
{"type":"task","id":"t13","wave":6,"phase":1,"desc":"Gateway route: POST /api/gateway/backlog/:backlogId/requeue","status":"COMMITTED","deps":["t11"],"requires_decision":null,"files":["web/src/pages/api/gateway/backlog/[backlogId]/requeue.js"],"blocker":null}
{"type":"task","id":"t14","wave":7,"phase":1,"desc":"Gateway route: GET /api/gateway/backlog?scope=plan|project|global (list with reap-on-read)","status":"COMMITTED","deps":["t12","t13"],"requires_decision":null,"files":["web/src/pages/api/gateway/backlog.js"],"blocker":null}
{"type":"task","id":"t15","wave":8,"phase":1,"desc":"Backlog web UI page: scope tabs, priority set, re-run action","status":"COMMITTED","deps":["t14"],"requires_decision":null,"files":["web/src/pages/backlog.astro","web/src/components/Backlog.tsx","lib/backlog.sh","web/src/pages/api/gateway/backlog/[backlogId]/priority.js"],"blocker":null}
