Repository navigation
Description
platform-docs/ has no run-lifecycle reference — and the docs suspected of drift are already correct
Measured 2026-08-15 before any edit.
Starting position: the published docs are NOT stale
Named explicitly so an implementer does not churn correct files — that is this repo's characteristic failure mode:
pnpm docs:driftpasses all 13 checks. MCP tool count 136 ==MCP_TOOL_COUNTacross 5 claims in 39 files; always-on/gated 117 + 19; 13requireConfirmationsites == every documented list; wire-surface version, annotations and structured results all matched; API surface 312/312.coder-multi-machine.mdalready documents heartbeat-derived liveness.:63— routing "never trusts the stored runtimestatuscolumn, which is not cleared on an unclean disconnect";:75,:80describe diagnosis from "is its heartbeat fresh". It was suspected of predatinginstance_runtime_nodes.statusis a write-once "online" column — every machine an instance has ever seen reports online forever, including one last seen four days ago #570/instance_runtime_status.runtime publishes a raw status and blends two machines — #570's fix reached nodes[] only #587 and does not.mcp.mdis current —coding_timelineat:329,reachwith all three values at:394.mcp.md:193is not self-contradictory. Its justification for omittingopenWorldHint("no per-tool record of which tools reach an external system") looks false besidereach, butworkers/mcp/src/tool-metadata.ts:281records thatreach/tierclassify an agent's tools, not this server's, and do not map onto the annotation names.
The actual gap
RUN_HEALTH_STATES is a four-member set including ended (workers/api/src/lib/work-report.ts:93). Migration 0127 split liveness, progress and parks into separate facts. DRIVER_RESUME_POLICY governs which drivers resume after an interruption.
$ grep -rl 'RunHealth\|waitingUntil\|lastProgressAt\|lastAliveAt' platform-docs/
(no matches)
Zero published pages mention any of it. This is net-new reference material, not a correction.
⚠ Blocked, deliberately — do not write this yet
The vocabulary is actively moving. Open against this exact surface: #591 (park writer), #594 (budget states), #596 (waiting_until carries two opposite meanings — "expected to resume" vs "about to give up"), #598 (unwritable status values), #600 (unchecked vocabulary citations).
Publishing now would freeze a known contradiction into reference documentation, which is worse than the current absence: an absent page misleads nobody, a published contradiction misleads everyone. #596 in particular must be resolved first — a reference page cannot define a field that means two opposite things.
Scope decision for whoever picks this up
New page versus a section on architecture.md. Note docs:drift checks nav ↔ sources in both directions (currently 10 == 10), so a new page must be added to nav or the gate goes red.
Acceptance criteria
- Every stated value set is rendered from the enum that emits it, not transcribed —
RUN_HEALTH_STATESis a const array precisely so this is possible, and a transcribed list is the drift this issue exists to avoid. - The liveness / progress / park distinction is stated in the terms the code uses, including that neither timestamp speaks for the engine (
work-report.ts:84-88is the reference wording). pnpm docs:build(zensical--strict) andpnpm docs:driftgreen; nav updated if a page is added.- Denominator stated per ADR 0002 for any guard added.
- waiting_until means 'expected to resume', and the human handoff's deadline is a give-up — one field, two opposite actions #596 resolved before this lands.
Verified vs inferred
- Verified: the 13 drift checks and their numbers; all four
platform-docsline citations; the empty grep;work-report.ts:93;tool-metadata.ts:281. - Inferred: nothing. The blocking judgement on waiting_until means 'expected to resume', and the human handoff's deadline is a give-up — one field, two opposite actions #596 is an editorial call, stated as such.
Activity
docs(runs): the run-lifecycle vocabulary is published, and its value …
serge-ivo commentedon Aug 15, 2026
Delivered in
7a19d104. CI green, host deploy green, verified live.The page
platform-docs/run-lifecycle.md, nav 10 → 11 both directions. Live athttps://proagentstore.online/docs/run-lifecycle/ — 200, linked from the docs index, and the
rendered park table reads one "gives up" (
human) and two "resumes" (engine_limit,platform_interrupt), which is #596's semantics arriving intact on the public page.AC1 — generated, not transcribed
The two value sets are rendered into delimited regions from
RUN_HEALTH_STATES,RUN_WAIT_REASONSandPARKS; the gate compares them byte-for-byte. Only the value sets aregenerated — the prose stays hand-written, per the rule
wire-surface.mjsstates about goldenfiles over explanation.
PARKS.whyis rendered too, as a considered trade: it reaches the owner verbatim throughwaitClause, so a paraphrase could disagree with what the platform actually says. The cost isthat rewording a park regenerates the block.
Every failure mode was watched, not assumed
Both directions of drift, driven end-to-end before the guard was trusted:
RUN_HEALTH_STATESmember, page untouchedRUN_WAIT_REASONSmember with noPARKSrowhumanflippedgive_up→resumeThe code-side cases were driven through in-memory mutations of
workers/apisources, whichanother agent holds live. Nothing under
workers/api/**is touched.One defect this found in itself
The first end-to-end red run printed the ✓ denominator line beside the ✗. A success line next
to a failure about the same check reads as "mostly fine" — the #604 collapse wearing a summary's
clothes. The note is now withheld whenever the check failed, pinned by a test.
AC4 — denominator
Floors are derived, not observed: 3 health states (the pre-
endedsize;runHealthreturnsfour distinct literals) and 2 park reasons (the smallest set carrying both a resume and a
give-up). Below either, the parser has stopped parsing — and an empty render compares equal to an
empty region, so without the floor this guard would pass by checking nothing.
One correction to the brief
I was pointed at
work-report.ts:84-88as the reference wording for "neither timestamp speaks forthe engine". Those lines are the
ended-is-a-member rationale. The engine caveat is atwork-report.ts:314-317("What it deliberately does NOT claim: that the ENGINE is working…The live
runStatelives behind/capture"). The page cites the latter; both facts are stated,under the right citations.
Verified / not verified
docs:driftchecks,pnpm docs:build(zensical--strict),pnpm typecheck(11 projects), every
scripts/check-*.mjsgate enumerated fromci.yml(includingcheck-surface-lock --require-historyandcheck-mcp-parity), biome, CI green on7a19d104,and the live page + nav.
origin/main+ only these five files —all 10
scripts/test files, 168 tests, green. The main checkout carried failures inworkers/mcp/src/**from another agent's uncommitted work; those same files pass at cleanorigin/main, so they are neither mine nor main's. Nogit stashwas used at any point.pnpm test:e2e. Nothing understore/oragents/coder/webwas touched, and theonly docs path any spec loads is
/docs/browser-runtime/(e2e/console-server.mjs:209).beside a real
waitingrow. Same gap waiting_until means 'expected to resume', and the human handoff's deadline is a give-up — one field, two opposite actions #596 recorded; the next handoff will carry it.