docs: the worker-identity lane is implemented, with its gate outcome

Section-local update to `docs/active-work.md`'s "Worker identity Stage 1
(§9)" block, which was written pre-implementation with the lane's first
commit. It now records what actually shipped rather than what was
planned, because the difference is where the reviewable claims are.

Three things it records that a status flip alone would not:

- **`journey_acceptance` passed UNTOUCHED (47/47).** Q#W-7 edits the
  `commit_to` guard family, so that suite was the lane's stop signal: any
  established pin needing an edit would have meant the change altered
  Journey Stage 1a's semantics rather than closing a gap in them. The
  same for all three `#pmacs.process.list()` leak detectors, which are
  Q#W-4's preservation claim.
- **One pre-existing assertion did change**, and it is named here so the
  change is not mistaken for an accommodation: the builtin statusline
  provider inventory in `statusline_segments_acceptance` grows by the
  fourth adopter. That assertion exists to grow.
- **Two residuals, stated rather than tested around.** A raw
  `coroutine.yield` inside either dynamic scope still leaks the scope,
  and Q#W-7's reachability by a real caller is unproven.

Also lists the surfaces that changed shape — the collapsed allocation
funnel, the two grown constructor signatures, the new required fields —
for anyone rebasing a concurrent lane onto this one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
This commit is contained in:
Levi Neuwirth 2026-08-09 16:57:28 +02:00
parent 689fb8333d
commit 1ca76e055b
No known key found for this signature in database
1 changed files with 52 additions and 3 deletions

View File

@ -265,7 +265,7 @@ also removed: this branch's "R8 NEEDS A LANE" investigation block, and
durable facts are in the retired registry row and the handoff §6 durable facts are in the retired registry row and the handoff §6
census. census.
## Worker identity Stage 1 (§9) — BRANCHED, pre-implementation ## Worker identity Stage 1 (§9) — IMPLEMENTED, no PR yet
**Written with the lane's first commit**, per the standing correction **Written with the lane's first commit**, per the standing correction
from #171 and #215. from #171 and #215.
@ -343,8 +343,57 @@ the authoritative tip** — the ref, not a SHA. Recover with
only the first two. A parent needs an ambient "currently-running job" only the first two. A parent needs an ambient "currently-running job"
context, and an unpopulated `parent` reads as "no parent" rather than context, and an unpopulated `parent` reads as "no parent" rather than
"not tracked" (Q#W-5). "not tracked" (Q#W-5).
- **Gates:** `scripts/gate --acceptance <the new suite>`. No - **Gates:** `scripts/gate --acceptance worker_identity_acceptance
`--protocol`. --acceptance journey_acceptance --acceptance
statusline_segments_acceptance`. No `--protocol` — no wire change.
- **IMPLEMENTED at `1aca0ee`**, one commit on top of the four framing
revisions. `tests/worker_identity_acceptance.rs` is the new suite: 18
tests, plus one consumer-side witness beside the private renderer in
`pmacs-gpu`.
- **`journey_acceptance` passed UNTOUCHED (47/47)** — the stop signal
did not fire. Q#W-7 edits the `commit_to` guard family, so any of its
established pins needing an edit would have meant this altered Journey
Stage 1a's semantics rather than closing a gap in them. Its diff
versus `main` is empty, and so is the diff for all three
`#pmacs.process.list()` leak-detector suites
(`m6_8_multi_repl_acceptance`, `compile_mode_acceptance`,
`lean4_stage1_acceptance`) — Q#W-4's preservation claim, checked the
way the framing asked.
- **One pre-existing assertion did change, and it is an inventory
rather than a contract**: `statusline_segments_acceptance`'s builtin
provider list becomes `["activity", "mode", "terminal", "lsp"]`.
`activity` sorts first because `async.lua` is loaded before
`syntax.lua`, `terminal.lua` and `lsp.lua`. That assertion exists to
grow when a builtin provider is added; it is listed here so the change
is not mistaken for an accommodation.
- **20 mutation checks, each test falsified by removing its own fix.**
The ones worth naming: siting the `await` guard *inside* the
`_is_complete` branch (the already-complete case then slips through —
which is the whole reason the guard is unconditional); replacing
`pcall`/pop/rethrow with a bare handler call (a raising handler leaves
the name pushed and the *next* dispatch inherits it); composing
`"<name>"` instead of `"<name>: <purpose>"` and vice versa (each half
passes the other's test); `first()` instead of `last()` on the name
stack; oldest→newest in `activity_summary`; and, on the GPU side,
painting an unthemed modeline face as the band colour, which would
have made the indicator invisible without failing anything else.
One of the twenty is a **preservation** check rather than a new
claim: bracketing `pmacs.workers.dispatch` with
`local ok, result = pcall(...)` truncates a handler that returns more
than one value, which every other test in the suite tolerates.
- **Two residuals, stated rather than tested around.** Raw
`coroutine.yield` inside either dynamic scope still leaks the scope —
loudly, through `pmacs.error`, but it leaks; no refusal sited in a
yield helper can intercept it (framing §2). And Q#W-7's reachability
by a real caller stays **unproven**: the commit message says so, and
the test pins the guard rather than reproducing a fault.
- **Surfaces that changed shape, for anyone rebasing onto this:**
`AsyncRuntime::allocate`/`allocate_with_resource` collapsed into one
private `JobSpec`-taking funnel; `register_external` grew a third
parameter; `ProcessSpec::new` grew a third parameter (~40 call sites,
nearly all tests); `ActiveJobInfo`/`CompletedJobInfo`/`ProcessSpec`
each grew a required `purpose` field. `pmacs.process.spawn`'s Lua
surface keeps `purpose` optional, falling back to the label.
## Discovery Stage 2 — PR #228 OPEN, **MERGE-BLOCKED** ## Discovery Stage 2 — PR #228 OPEN, **MERGE-BLOCKED**