commitwork docs

Failure taxonomy v17 — class reference

commitwork · oversight failure classification

In one sentenceAI coding agents fail most dangerously when the failure looks like success — a clean report over work nobody checked, a fix that silenced the alarm instead of the fault, a record crediting the wrong author — and this page names every such failure we have measured, one row each, with the incident that earned it its place.

For the fieldFormally, it is a registry of oversight-failure classes for agentic LLM systems: each class is a falsifiable predicate over artefacts, bound to an STPA control loop, an unsafe-control-action type and a causal factor, scored for closure and residual gain, and linked to its neighbours by a closed set of causal relations, so that inter-rater agreement, coverage and drift are measurable rather than asserted.

207 classes · 11 families (I 37 · II 24 · III 18 · IV 17 · V 29 · VI 27 · VII 17 · VIII 7 · IX 14 · X 5 · XI 12) · verified against 2026-09-02 14f05f8 · generated by bin/taxonomy-render.mjs from monitor/failure-taxonomy.json — do not hand-edit.
Families I-VIII were declared in v1 and v3; IX and X are numbered here for the first time, without renumbering any existing id. Family XI (collective action, prefix L) is numbered in v9, again without renumbering any existing id. SCOPE (operator ruling, 2026-09-02): the taxonomy includes ALL AGENTIC SOURCES and is REPOSITORY-INDEPENDENT. The classes describe how oversight of agentic work fails, not how one codebase fails, so an instance qualifies on its mechanism and never on where it was found — instances from teamDRemote, overwatch-layer and memory-layer are already held, and an instance from a repository this fleet has never touched qualifies equally. The requirement is attribution, not provenance: every instance names the repo and the session that measured it, because an instance from one population recorded as if it came from another is M1. An earlier version of this line said "fleet-scoped", which was my inference from what had been folded rather than a stated policy; it was narrower than the truth and is corrected here. FAMILIES CARRY A MEMBERSHIP TEST from 2026-09-07: the sentence a second rater applies to decide whether a class belongs, in the same form the stpa, rca and mitigation vocabularies already require. Added after family VI was measured as the one family whose members are more like another family's than like each other; a family that declares only a proposition cannot refuse a member. The tests are DECLARED, not enforced against existing membership, because moving a class renumbers it and breaks every citation.
STPA++ layer, the top line of the column: CONTROLLER decides what runs, on what, in what order, and what the result means · IMPLEMENTER does the work · BOTH both.
Scores, two meters under each id — closure 0 = nothing stands between us and this class; 4 = fixed and pinned by a test or canary: closureclosure 0 of 4: not solved0 not solved · closureclosure 1 of 4: barely1 barely · closureclosure 2 of 4: part-solved2 part-solved · closureclosure 3 of 4: solved, unpinned3 solved, unpinned · closureclosure 4 of 4: solved and pinned4 solved and pinned
gain 0 = nothing further on the table; 4 = the largest remaining win, impact x tractability: gaingain 0 of 4: nothing on the table0 nothing on the table · gaingain 1 of 4: marginal1 marginal · gaingain 2 of 4: worth doing2 worth doing · gaingain 3 of 4: high3 high · gaingain 4 of 4: biggest available4 biggest available.
Scores are one rater. closure and gain assigned by a single rater, who authored both the classes and the remediations the scores rank. No inter-rater pass. MC-family spread on this repo has been measured at 6.0/10, so treat these as one reading, not a measurement. SECOND PASS 2026-09-06 by reporter #3, over all 199 classes, from each scoreBasis, the remediation register's status text and the presence on disk of every mechanism either names: 28 scores changed, 171 confirmed. Rubric applied uniformly — closure: 0 nothing stands between us and the class; 1 a convention, sensor or one-site fix; 2 a mechanism that exists and runs, partial or unpinned; 3 solved for the population it names, unpinned or pinned at one site; 4 fixed and pinned with no instance measured since. Gain is impact times tractability: 4 fleet-wide impact with a named session-sized mechanism; 3 one of the two; 2 moderate; 1 marginal; 0 nothing on the table. Two rules produced most of the changes: an instance measured after a closure-4 score caps closure at 3, and a register mechanism the code confirms raises closure to at least 2. Still one rater at a time; the two passes disagree on 28 of 199, which is the only inter-rater figure this registry holds. LEVER TRIAGE 2026-09-06, same rater: every class then without a mitigation record was judged for a code-base lever; 5 scores moved, each rise citing the test or rule that holds it.
STPA, under the STPA++ layer tag: uca how the control action was unsafe · cause the causal factor · judged in the loop numbered beside them; a second line is the same class judged in another loop. Hover a value for its test. Loops, numbered for reference (controller → controls): 1 operator (the operator → fleet configuration, manifests, schedules, rulings, suppressions) · 2 monitor (the monitor: sweep, rollup, issue store, freshness, liveness, pages → scanner runs, the issue store, published rollups and pages) · 3 scanner (a scanner lane → its own run over a repository) · 4 agent (an agent session → the working tree, ledgers, commits, handoffs) · 5 oversight (hooks, gates, raters, overwatch-layer → the agent session) · 6 attention (the monitor's publication: rollup, panel, page, handoff, evaluation → operator attention).
Causal edges: same-defect-as 22 · mechanism-of 9 · enables 3 · masks 0 · awaits 2 (1 deadlock) · assessed-none 19 · unassessed 163.
STPA is one rater. two machine readers per class: one assigning per family from the class text, one blind re-rating a sample against the vocabulary tests; under operator rulings of 2026-08-23 (report is a control action; loop names the reading), 2026-08-23, primary entry judged in the loop the description sits in; attention entry added where the class's consequence is a verdict published to the operator; each value chosen by its vocabulary test; blind-sample disagreement rate recorded in this field by the merge step. machine-rated on one registry edition; where a description straddles monitor and agent the primary loop follows where the example sits; disagreement rate: PENDING
Mitigation layers, one row under each class: commitwork remediation. States: implemented partial open wrong superseded unassessed no-lever · no record nothing recorded for that layer. Hover a state for its test.
Mitigation records are one rater. reporter #3, 2026-09-06, Seeded, not judged: commitwork records come from the remediation register and attribution plan (closes → class, status word → state, R1 excluded as stale) and from mechanisms named in a scoreBasis and confirmed present on disk the same day; vscode-skills, memory-layer and overwatch-layer records come only from what a scoreBasis states a product does, with the sha or file re-resolved in that repository. Proposals come from the register's own REMAINING sections and from the wins the second scoring pass named. Lever triage 2026-09-06 (same rater): every class that had no record was judged for a code-base lever — a mechanism the basis names and the tree holds became an implemented or partial record; a predicate no mechanism here can decide became a no-lever record with the reason; a lever that exists and is not built became a proposal. Four lexical ratchets, two registry rules and one land-time warning were armed the same day and recorded as partial.. Classes with a record per product: commitwork 150, vscode-skills 5, memory-layer 6, overwatch-layer 7; 36 of 199 carry no record on any layer, and 43 carry a no-lever record, which is a judgement that no gate exists here and not a clean. Proposals stand on 66 of the 181 classes with closure possible and gain remaining. One rater seeded and triaged it from text; a record reads "verified" only where its evidence says so.
Layers Toggles hide rows on screen only; print carries every layer.

IFalse cleanC1–C37 The false proposition: “nothing is wrong” membership testThe subject is reported as having nothing wrong with it, and that clean reading is indistinguishable from the one a check would produce if it had never run, never reached the subject, or could not have failed. The defect is in the CLEAN READING. A row whose finding exists and is merely wrong belongs to family II.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
C1closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Absence rendered as success false_clean.absence_rendered_as_success IMPLEMENTER2 monitornonefeedback-missing6 attentionunsafe / actuator-corruptunassessed Not-scanned, no-data or no-file is displayed as clean or fresh. analogyA smoke detector with no battery has never gone off, so the house reads as safe. exampleRepos with no lock artifact scanned empty, so 102 critical and 675 high findings sat behind cells that rendered blank. Measured instance, CI green while deploying nothing for four weeks, repo teamDRemote: a workflow granted id-token: write and commented that no long-lived credential was needed, then passed DENO_DEPLOY_TOKEN from secrets anyway. An UNSET GitHub secret expands to an EMPTY STRING rather than being omitted, so the step handed the deploy a blank token which shadowed the OIDC credential — and that tool exits 0 on refusal. Every push since the secret lapsed on 2026-08-05 ran the job, deployed nothing and showed a tick. Fixed c891c48 by removing the env block and asserting on "Successfully deployed" in the output rather than on the exit code. Measured instance, cra/soc2.mjs 2026-09-24: SOC 2 CC7.4, respond to identified security incidents, carried evidenced: true as a literal, so a product with no case and no recorded risk decision rendered 'evidence present' beside an evidence line reading 0 and 0, in a packet documented as feeding an audit (audit finding 0003). Fixed f28b7a6: evidenced requires a response record, as CC7.2 and CC7.5 already did. Measured by reporter #1 2026-09-24.
commitworkcommitworkpartial monitor/unknown.mjs declares the undetermined state; renderers carry it scoreBasis; same mechanism recorded on A16 · 2026-09-06 no record proposedno proposal recorded
C2closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Exit code with no subscriber false_clean.unsubscribed_exit_code CONTROLLER2 monitornot-providedfeedback-missing6 attentionnot-provided / actuator-missingunassessed A check runs, fails, and nothing consumes the failure. analogyThe fire alarm rings through a building everybody left at six. exampleThe panel regexed a run.log while codeql-fleet.json, the structured artifact its producer existed to write, sat unscheduled and rotting. FOUR CARRIERS NAMED, measured 2026-09-06 in commitwork by reporter #26 and independently held as the baseline of bin/test/lexical-ratchets.test.mjs's spawnSync ratchet (9309cb9): bin/commitwork.mjs:1025, where a failed `find` discovers zero repos and says so in the same voice as a clean tree; bin/session-start-roster.mjs:84, since fixed at 7430ee3; monitor/workflow-harden.mjs:154; bin/commitwork.mjs:2319. The ratchet keys them on file::identifier rather than line, so the set can only shrink. Measured instance, bin/commit-phase.mjs 2026-09-24: step 6 re-syncs the shared index after the ref update with allowFail, and the result was discarded. The same day the private sidecar's shared index held none of the seven launchlist store files its HEAD tracks, so a bare commit there would have untracked the store; the two commits that added those files were written through a private index. Whether a repair failed or never ran is not recoverable from any record. Fixed 3896268: a failed repair prints the git error and the repair command, pinned by an e2e test that holds index.lock. Measured by reporter #1 2026-09-24.
commitworkcommitworkpartial readers ship with writers: launchd and hook consumers branch on the exit codes bin/ emits scoreBasis; A6's advisory channel is the unsubscribed one; reporter #28 names four carriers, which are the C22 ratchet's baseline · 2026-09-06 no record proposedproposed For every CLI in bin/ with a non-zero exit path, a test spawns it and asserts the exit code; a census of process.exit sites without such a test is the ratchet. effort Med · would reach closure 4 · reporter #3, lever triage · 2026-09-06
C3closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Wrong population measured false_clean.wrong_population CONTROLLER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptmechanism-of→ M1 The number is real but describes a different tree, scope or moment — read here specifically because the swap makes a dirty population look clean. M1 is the general mechanism (a wrong-population comparison, whether it reads clean or not); this is M1's false-clean-producing case. analogyA doctor reads yesterday's chart for the patient in today's bed. example"You broke 69 tests" was measured on a tree three sessions were writing; the true floor fifteen minutes later was 1.
commitworkcommitworkpartial names-not-counts at HEAD; confirm-before-alarming scoreBasis · 2026-09-06 no record proposedno proposal recorded
C4closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Unstable identity false_clean.line_keyed_identity IMPLEMENTER2 monitornoneprocess-change6 attentionunsafe / actuator-corruptsame-defect-as→ C33same-defect-as→ C29 A finding is keyed on something that moves, so movement reads as a state change. analogyA neighbour moves one house down the street and is recorded as having left, with a stranger arriving. exampleEight findings were reported FIXED after merely shifting lines; js/request-forgery moved 523 to 527 and was closed and re-filed in one pass. Measured instance, 2026-09-24: audit queue ids are positions after a sort on disposition, severity, file and line (bin/reconcile-findings.mjs), so every fix and every line move renumbers what follows. The build-fixture finding was cited as 0066 in sitemap/README.md on 2026-09-23, read as 0065 at 17:30 on 2026-09-24, and numbered 0062 after a regeneration at 21:31 the same day. FIXED_LEDGER binds by file and summary pattern and is unaffected; the README citation and every handoff that quotes an id are not. Measured by reporter #1 2026-09-24, with a read-only review agent of the same session.
commitworkcommitworkimplemented identity keys exclude line everywhere; the strict scannerAnnotations matcher is tested scoreBasis; CLAUDE.md invariant · 2026-09-06 no record proposedclosed — no proposal applies
C5closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Tooling self-deception false_clean.instrument_lies IMPLEMENTER2 monitornonefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed The measuring instrument lies in a way that specifically produces a clean reading: a search suppresses matches, a probe reads the wrong field. M3 is the general form, including instruments that lie loud rather than quiet. analogyA broken thermometer reads 37 in every room, so nobody in the ward has a fever. exampleUnder a C locale, grep withheld matching lines in bin/bola-run.mjs while grep -c still counted them, producing four consecutive false "this symbol is gone" conclusions. Second instance, where the control is the finding: sweeping ~/.claude for three identity strings with rg returned 0 files for all three, because rg skips hidden and ignored paths by default and ~/.claude is hidden. Control terms on the identical command shape returned 4,820, 4,105 and 2,290 files, which is the only reason the zero was disbelieved; re-run with -uuu gave 527, 1,349 and 2,184. A published 0/0/0 against a true 527/1,349/2,184. Third instance, and a third mechanism — config-root resolution rather than a search filter: in teamD (Portll/teamDRemote, NOT this repo), a `// deno-lint-ignore react-no-danger` suppression was verified by copying the file to /tmp and running `deno lint` on the copy, which reported "Checked 1 file", 0 findings. deno lint resolves config by walking up from the TARGET file, so from /tmp the site's deno.json never loaded and the fresh-tagged rule was never enabled. Byte-identical file via cp: `deno lint /tmp/copy.tsx` gave 0 findings while `deno lint routes/_app.tsx` from the site root gave 3 problems including error[react-no-danger] at routes/_app.tsx:84:14. The 0 meant the rule did not run, and "Checked 1 file" is the same string either way.
commitworkcommitworkpartial contract-tested clients (lib/test/memory-layer-*.test.mjs); grep -a and run-from-the-config-root as discipline scoreBasis · 2026-09-06 no record proposedno proposal recorded
C6closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Evidence evaporation false_clean.evidence_evaporation CONTROLLER4 agentnot-providedactuator-missing6 attentionnot-provided / actuator-missingunassessed The decision was correct and printed, and durably recorded nowhere. analogyA verdict is delivered aloud in a courtroom with no clerk taking it down. exampleGates persisted baselines only; verdict, names and attribution left through stdout and died with the terminal.
commitworkcommitworkimplemented verdict journals record every decision, suppressed turns included (bin/verdict-journal.mjs) scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
C7closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Suppression without record false_clean.suppression_without_record CONTROLLER2 monitornonefeedback-missing6 attentionnot-provided / actuator-missingunassessed Noise control also destroys the record of what was withheld. analogyA receptionist logs the time of every call and none of the messages. examplehook-once stored only a sha256 of the suppressed message: 30+ identical blocked turns with the content unrecoverable.
commitworkcommitworkimplemented the suppressor record carries the withheld count (shown/forgotten events) scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
C8closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Oversight racing itself false_clean.oversight_race CONTROLLER5 oversightunsafecoordination-conflictunassessed Concurrent gates clobber shared state; the safety layer breaks the safety layer. analogyTwo nurses write on one paper chart at the same time, and the second copy erases the first. exampleBoth Stop gates read-modify-wrote one say-once JSON object: 34 of 40 rounds lost a record.
commitworkcommitworkimplemented one file per writer key on the gate store; 34/40 lost updates became 0/40; bin/test/one-mutex.test.mjs scoreBasis; P8 · 2026-09-06 no record proposedclosed — no proposal applies
C9closureclosure 2 of 4: part-solved2gaingain 4 of 4: biggest available4 Attribution absence false_clean.attribution_absent CONTROLLER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed An alarm that cannot say whose change it is gets dismissed or mis-baselined. analogyA landlord bills every tenant for a window nobody saw break. exampleThe ratchet's "this turn ADDED debt" blocked 30+ turns over drift that predated the session's first edit. Second instance, mis-baselining against a remembered number in a tree with live peers: `deno fmt --check` in teamD/site read 153 unformatted of 329 early in a three-day session and 162 of 332 late — an apparent +9 attributable to that session's own work. The true delta was +3. Establishing it required stashing only that session's changes and re-reading the baseline at 159 of 332; peers had landed c891c48 → 98e2e1c → 942724c underneath, moving the baseline 153 → 159. Six files of peer-introduced debt were about to be attributed to the wrong writer. The error is symmetric: had the peers FIXED six files, the same stale number would have concealed nine of the session's own. teamD / Portll-teamDRemote, reporter #29, 2026-09-04.
commitworkcommitworkopen R3 — Attribute from declared claims before inferred ones remediation register #3: OPEN 2026-08-29 — OPEN, not PARTIAL, and not SUPERSEDED. Not PARTIAL. The tempting PARTIAL argument is that the journal record already carries an `attribution` object with a `claim` field, so "half of it exists." That conflates two… · 2026-09-06commitworkpartial R12 — Ratchet attribution accuracy like any other metric remediation register #12: PARTIAL 2026-08-29 — Not OPEN and not "merely unstarted" — half the mechanism predates today and is genuinely live. Attribution accuracy IS scored per firing, with a held floor, split by claim basis, on the CANARY channel:… · 2026-09-06commitworkpartial R13 — Stamp headSha on docs-doctor, then adjudicate what is judgeable remediation register #13: PARTIAL 2026-08-29 (0286155) — Not DONE and not OPEN, because the item is two asks and they are in opposite states. The headSha ask is fully DONE and I checked it the way this repo demands. The mechanism exists (bin/docs-doctor.mjs:327),… · 2026-09-06commitworkopen attribution plan — Task acquisition: Claim paths on task start, release on completion, and reap stale claims on a deadline. Gates consult declared claims first and fall back to the… attributionPlan "Task acquisition": OPEN 2026-08-29 — Not PARTIAL and not merely "unwired module" OPEN — this is below the unwired-module floor. The bar for PARTIAL would be a claims reader that exists but is unreachable, or a basis field written but never read. Neither… · 2026-09-06commitworkpartial attribution plan — Logs: Record basis (declared | ledger | committed | none), the sessions considered, and the boundary timestamp used. Accuracy then splits by basis, which… attributionPlan "Logs": PARTIAL 2026-08-29 — Not DONE: none of the three things the item names is on the journal record in the form asked. There is no `basis` field anywhere on either gate's record — the field census over the full journal population (1,807… · 2026-09-06commitworkopen attribution plan — Reporting: Print the basis and the count of sessions considered on every attributed alarm, and make gate --tally group firings by basis. attributionPlan "Reporting": OPEN 2026-08-29 — Neither of A6's two named deliverables exists. (1) No `basis` value exists anywhere in the attribution pipeline — not as a computed field (gate-tests-core.mjs:72 returns none), not on any alarm string… · 2026-09-06 no record proposedproposed All of it. Concretely, in the order that keeps the metric honest: 1. LAND THE BASIS FIELD FIRST, while there is still only one source. Add `basis: 'ledger'` to the attribution literals at bin/gate-ratchet.mjs:387 and bin/gate-tests.mjs:260/297/342. Doing… (next step of R3) effort Med · remediation register #3, REMAINING · 2026-09-06proposed Open the writer seam so a live firing can be scored at all. bin/verdict-journal.mjs:1068 must accept `--attribution-correct` without a `--truth` (computeMetrics already counts attribution-only records and bin/test/verdict-journal.test.mjs:933-940 already… (next step of R12) effort Med · remediation register #12, REMAINING · 2026-09-06proposed The session half is unstarted and, as worded, misdirected. Session is null on 355/355 docs-doctor records, but stamping it recovers nothing: classify() (bin/adjudicate-gates.mjs:52) ignores session entirely. If you want it for provenance, docs-doctor has no… (next step of R13) effort Low · remediation register #13, REMAINING · 2026-09-06
C10closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Claim drift false_clean.claim_drift CONTROLLER4 agentapplied-too-longprocess-change6 attentionunsafe / actuator-corruptunassessed Documentation asserts a property the system no longer has, or never had. analogyThe fire escape map by the door shows a building that has been rebuilt twice. exampleThe comment nearest the catch said exit 3 meant "nothing to roll up"; the code checked 4, and 3 is lock contention. Measured instance: a handoff dated 2026-08-10 declared a defect open and "newly buildable" eight days after the fix landed at HEAD (d7479f3, which switched the supplyChain scanner row to the counter that refuses the husk), and the asserting document's own scan-cost figure was simultaneously wrong by 218x. Verified by ancestry check plus zero remaining call sites for the superseded function; recorded in evaluations/adjudication-run-2026-08-10.md (7ac79f1).
commitworkcommitworkpartial bin/docs-doctor.mjs stamps durable docs; the claim itself has no reader scoreBasis · 2026-09-06 no record proposedno proposal recorded
C11closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Unparseable read as empty false_clean.unparseable_as_empty IMPLEMENTER2 monitornonefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed A corrupt artifact returns the same shape as a clean one, so absence of data is indistinguishable from absence of findings. analogyA bank statement soaked to illegibility is filed as a month with no transactions. exampleAn unreadable ratchet baseline read as absent, so the gate replaced the corrupt floor with a fresh one, laundering whatever the corruption hid. Measured instance: bin/rater-accuracy.mjs read `.verified` off readAdjudications(), which returns {absent, records, torn, chain}. It got undefined, coerced to [], and reported "0 raters, 0 anchors" over a ledger holding 14,898 records across 2,402 lines. All seven of its unit tests passed, because every one called the pure scorer directly and none crossed the read boundary. Caught only because a neighbouring figure was implausible. Fixed 353c787, where readLedger() now asserts the shape and a plausible object with no records[] is fatal.
commitworkcommitworkpartial the extractors' void pattern: only ENOENT is absent, every other read or parse failure is a named void, enforced end to end (monitor/extractors.mjs) scoreBasis; the 2026-09-02 instance lived in a boundary no test crossed, so partial rather than implemented · 2026-09-06 no record proposedno proposal recorded
C12closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Unconserved pipeline false_clean.unconserved_pipeline IMPLEMENTER2 monitornonecontroller-algorithm6 attentionunsafe / actuator-corruptunassessed No invariant binds adjacent stages, so truncation between them classifies as remediation. analogyTwelve crates leave the warehouse, eight arrive, and the delivery is signed for as complete. exampleA package-behaviour scanner published byte-identical 47,416-byte clean SARIF across 185 runs having parsed zero dependencies.
commitworkcommitworkimplemented conservation invariant wired pre-overlay; the pipeline canary pins the boundary scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
C13closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Empty catalogue read as clean false_clean.empty_catalogue_read_as_clean IMPLEMENTER3 scannernonesensor-inadequate6 attentionunsafe / actuator-corruptsame-defect-as→ C30 The scanner ran, enumerated ZERO subjects, and reported the resulting zero as a finding count — "nothing vulnerable" and "nothing looked at" become the same number. analogyAn inspector opens an empty warehouse, finds no damaged crates, and certifies the stock as sound. exampleSee monitor/FALSE-CLEAN-TAXONOMY.md for the cited incident.
commitworkcommitworkpartial the intake run record carries a required preflight field separating noscan from an attested zero, and monitor/unknown.mjs names empty as a reason distinct from clean C31 scoreBasis; unknown.mjs verified 2026-09-06; no run record carries a subject count beside its finding count · 2026-09-06 no record proposedproposed Carry the count of subjects examined on every run record beside the finding count, and render a zero-subject run as unknown(empty). effort Low · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
C14closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 The scan mutates its subject false_clean.scan_mutates_its_subject IMPLEMENTER3 scannerunsafeprocess-disturbance6 attentionunsafe / actuator-corruptunassessed A lane writes to the tree it is scanning, so every lane after it examines a different tree than the batch anchored — one sliceId over two states. analogyA surveyor drives stakes into the ground he is measuring, and every later measurement agrees with the stakes. exampleSee monitor/FALSE-CLEAN-TAXONOMY.md for the cited incident.
commitworkno record no record proposedproposed Record the working-tree hash at every lane start in the run manifest and refuse to publish a lane whose hash differs from the batch anchor. effort Low · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
C15closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Banner mistaken for output false_clean.banner_mistaken_for_output IMPLEMENTER3 scannerstopped-too-soonprocess-failure6 attentionunsafe / actuator-corruptunassessed A tool prints its startup preamble, fails, and exits; the preamble is valid parseable output, so a reader checking "did it produce anything" says yes. analogyA kettle that prints its own name on the display before failing to boil is recorded as having produced output. exampleSee monitor/FALSE-CLEAN-TAXONOMY.md for the cited incident.
commitworkcommitworkpartial monitor/extractors.mjs skips non-JSON banners in one lane extractors.mjs, verified 2026-09-06; C34's joern instance shows the general form open · 2026-09-06 no record proposedproposed Require a result-bearing key at the extractor boundary: an artifact that parses but carries none is unknown(preamble), never zero findings. effort Low · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
C16closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Unidentifiable build false_clean.unidentifiable_build IMPLEMENTER3 scannernonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed The tool cannot state which build produced a result, so its zero cannot be tied to a rule set or database and is unfalsifiable in principle. analogyA laboratory result arrives with no reagent lot on it, so a clean reading cannot be traced to anything that could be wrong. exampleSee monitor/FALSE-CLEAN-TAXONOMY.md for the cited incident.
commitworkcommitworkpartial bin/scanner-preflight.mjs refuses a scanner that cannot state its version and monitor/sweep.mjs runs it nightly files present, verified 2026-09-06; the version is not yet carried on the published result beside the zero it qualifies · 2026-09-06 no record proposedno proposal recorded
C17closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Update that silently downgrades false_clean.update_that_silently_downgrades IMPLEMENTER2 monitornoneprocess-change6 attentionunsafe / actuator-corruptunassessed The refresh path rebuilds against whatever toolchain is present; coverage regresses while every reported field stays identical. analogyA locksmith re-cuts the key with whatever blank is on the bench, and the door still opens on the day it is tested. exampleSee monitor/FALSE-CLEAN-TAXONOMY.md for the cited incident.
commitworkno record no record proposedproposed Compare each preflight record with the previous run's: a scanner whose version moved and whose coverage fell is reported as a downgrade, not as clean. effort Low · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
C18closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Batch fatal on one member false_clean.batch_fatal_member IMPLEMENTER3 scannerstopped-too-soonprocess-failureunassessed A per-item query is replaced by one bulk call, and the bulk API exits on the first malformed member and emits nothing for the remainder. The unmeasured remainder reads as absent. analogyOne jammed envelope stops the sorter and the rest of the sack is marked delivered. examplebin/pattern-scan.mjs resolved 1064 citation SHAs through one git cat-file --batch-check, and a seven-hex prefix that named a tree aborted the batch. Second instance, where the fatal member is POLICY rather than data: an exemption entry that resolves to nothing aborts the scanner with "Could not resolve config path" instead of being inert, so a stale suppression does not over-permit — it prevents the scan from starting. Measured across every repo lacking a vendor directory. Measured instance, 2026-09-24: monitor/deploy-state.mjs tlsProbe passed an IP address as the TLS servername, which Node rejects synchronously, so one IP target ended bin/tls-headers-scan.mjs with exit 1 and no report for any target or for the headers half (CW_TLS_URL=https://127.0.0.1:1). Fixed 8c7937f: an IP target omits SNI and is matched with checkIP. Measured by reporter #1 2026-09-24.
commitworkno record no record proposedproposed Route every bulk call through the R7 runAll(items, fn) helper, which returns a per-item result and a failed list, so a fatal member cannot truncate the population silently. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
C19closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Completion proxy decoupled false_clean.completion_proxy_decoupled IMPLEMENTER4 agentunsafefeedback-incorrectunassessed Backgrounded work signals completion through a proxy such as a marker file or a wrapper exit, and the proxy is not the work. A dead job and a slow one become indistinguishable, and one direction never self-corrects. analogyThe kettle's light goes out when the plug is pulled. exampleA backgrounded compression measurement used nohup with process substitution; the wrapper exited and the marker was never written while the work had not run.
commitworkcommitworkno-lever which artefact is the work's own evidence is known only to the job's author lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
C20closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Majority premise applied whole false_clean.majority_premise_applied_whole IMPLEMENTER4 agentunsafecontroller-modelunassessed A batch skips or transforms a set on a premise spot-checked against the majority class. The member the premise does not cover is dropped precisely because it is rare. analogyThe sorter discards the odd sock without looking for its pair. exampleinternal-d's installer skipped .claude/commands-imported/ wholesale as a near-duplicate twin set, and the member that was not a duplicate went with it.
commitworkcommitworkno-lever a premise checked on a sample is a reading of the justification, not of the code lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
C21closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Evidence dropped at the parse boundary false_clean.evidence_dropped_at_parse IMPLEMENTER2 monitorunsafecontroller-algorithmunassessed A tool emits two interleaved record kinds and the extractor keeps only the one it needs. A later consumer finds nothing and reports a coverage gap while the data was on disk throughout. analogyThe archivist keeps the letters and bins the envelopes that carried the dates. exampleA language-vulnerability scanner interleaves osv advisory records with finding rows, and monitor/extractors.mjs parsed only o.finding, discarding every osv record.
commitworkcommitworkpartial one extractor fixed at f8316ff scoreBasis; the CodeQL dataflow lane is the identified unfixed site · 2026-09-06 no record proposedproposed Every extractor over a multi-kind stream carries a default branch that counts the kinds it did not handle and reports the count on the record. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
C22closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Unread contradicting channel false_clean.unread_contradicting_channel IMPLEMENTER3 scannerunsafefeedback-incorrectunassessed A single call returns two independent witnesses to the same proposition and the verdict consults only one. A disagreement that would have been free to detect is discarded unread. analogyThe driver reads the fuel gauge and ignores the warning light beside it. exampleThe commitwork format lane reported status clean and exit 1 in the same record, and only the parsed output was read. Measured instance, bin/tls-headers-scan.mjs 2026-09-24: testssl ran with --jsonfile and the scan set ran:true on exit 0. The JSON it asked for was never read, and status came from the headers half alone, so an expired certificate reported by testssl produced no failing verdict (audit finding 0020). Fixed 8c7937f: testssl's rows are graded into the TLS findings and into status; a stub emitting one CRITICAL row now yields tls F. Measured by reporter #1 2026-09-24.
commitworkcommitworkpartial bin/test/lexical-ratchets.test.mjs: a spawnSync result whose .status/.signal/.error is never read within 40 lines is a ratchet offender — seven held at arming (four of them independently measured as C2 carriers by reporter #28 the same day) bin/test/lexical-ratchets.test.mjs present 2026-09-06; remaining: execFileSync and child_process.exec forms, and status read but ignored, are outside the lexical reach · 2026-09-06 no record proposedno proposal recorded
C23closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Green over an absent subject false_clean.green_over_absent_subject IMPLEMENTER5 oversightunsafecontroller-modelunassessed A constraint is derived from a design document before the thing it constrains exists, and the test written for it passes because its subject is absent. The standard non-vacuity check cannot see it, because the loop legitimately iterates an empty set. analogyThe fence is inspected on the field where the fence is planned. exampleA constraint derived from an STPA hazard analysis was tested before its subject existed: 80038a9 and evaluations/STPA-capec-attack-2026-08-23.md section 6.1, where the assertion was written against enrichment totals that nothing yet produced.
commitworkcommitworkno-lever a set empty for want of the subject and a set empty for want of violations are the same empty set to every non-vacuity check lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
C24closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Invariant landed in halves false_clean.invariant_landed_in_halves IMPLEMENTER4 agentunsafecoordination-gapunassessed A change spanning two files lands with one half committed and the other left uncommitted. Every existing checkout keeps passing because the local half is present, and a fresh checkout fails for everyone but the author. analogyThe bridge opens with one bank still under construction. exampleA cross-file invariant was committed in one file while its counterpart stayed uncommitted, so the suite was green in the only tree anyone was running it in. Measured instance, and the second form of the predicate — a rename applied to a proper subset of its call sites rather than an uncommitted file: a release-redaction pass renamed a module and rewrote its importer to the new path and committed that, while the target rename stayed in the INDEX only. HEAD therefore carried an importer whose module was not in the same tree and the panel could not boot for anybody — six admin tests failed with ERR_MODULE_NOT_FOUND, one cause. Every local check answered the author-tree question and passed: node --check, the import resolving from the working tree, and 1055 admin tests. It surfaced only because one test boots the panel inside a HEAD WORKTREE. Fixed 4b788fa. Second instance, committed BY the repair for the first one: 4b788fa landed the missing half of a rename to unbreak HEAD and deleted lib/internal-c-client.mjs while five files at that same commit still imported it (admin/lib/internal-c-sync.mjs, bin/ab-loop.mjs, bin/internal-c-migrate-tenant.mjs, bin/test/internal-c-client.test.mjs, monitor/export-overwatch.mjs). `git cat-file -e 4b788fa^:lib/internal-c-client.mjs` confirms the module was present at the parent, so the commit removed it out from under all five and HEAD was broken again immediately, by the fix. Peers repaired them over the following hour, the last at 3029d3f. Measured instance, 2026-09-24, across two repositories: monitor/corrected-history.mjs hardcodes its area slug as the tracked tree's pseudonym, with a comment saying the private registry declares the same slug. The registry's rename to that slug was uncommitted in the private sidecar. At the committed registry the slug is undeclared, the resolver falls back to a directory named after the slug, and the foreign-area guard cannot fire, so the tool would write its corrected view into a directory no registry declares. It passes only where the uncommitted half is present. Measured by reporter #1 2026-09-24.
commitworkcommitworkimplemented bin/lib/tracked-imports.mjs with bin/test/tracked-imports.test.mjs reading HEAD, both directions cross-checked by V8's parser; the committed-rename-subset half is unguarded scoreBasis correction 2026-09-02; CLAUDE.md invariant; files present, verified 2026-09-06 · 2026-09-06 no record proposedno proposal recorded
C25closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Voluntary surface read as quiet false_clean.voluntary_surface_read_as_quiet CONTROLLER5 oversightunsafesensor-inadequateunassessed A coordination surface populated only by voluntary declaration renders identically when nothing is happening and when a great deal is happening undeclared. Every honest participant raises its apparent contention while the silent ones stay invisible. analogyThe sign-in sheet at the door shows an empty building. exampleAn empty file-ownership surface was read as nobody is working here when it meant nobody declared.
commitworkcommitworkpartial the SessionStart roster (bin/session-start-roster.mjs) prints UNDECLARED as its own state beside declared intent roster output measured 2026-09-06: "3 have declared intent via overwatch-layer; 9 have not" · 2026-09-06 no record proposedno proposal recorded
C26closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Guard that runs and cannot match false_clean.guard_runs_cannot_match IMPLEMENTER5 oversightunsafecontroller-algorithmunassessed A gate keys on a field its own input does not carry, so it evaluates every row, matches none, and emits a clean empty. Unlike a guard that never executes this one runs, and its emptiness is indistinguishable from a pass. analogyThe turnstile counts everyone presenting a ticket of a kind nobody carries. examplemonitor/anchor-disposition.mjs keys on a field its rows do not carry and stands unwired in draft. Measured instance: a check for four unknown-states built its word boundary as '\b' inside a JS template literal, which collapses to a BACKSPACE character in the page. The regex ran against every state, matched none, and the tool printed "window attribution shows 0/4 distinct states — a missing one has collapsed into another". All four states were rendering correctly. c624d17. Second instance, different language feature, same place: a guard against a 200 carrying no payload was written `body.data ?? body`, and the nullish fallback yields the WHOLE ENVELOPE when data is explicitly null — so the object test passed and the check was defeated by the exact case it existed for. Fixed by asking whether the KEY is present rather than whether its value is truthy.
commitworkno record no record proposedproposed Every detector test plants a fixture the detector must match (positive control) — the convention the lexical ratchets follow — and a meta-test lists detector tests without one. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06
C27closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Parser chosen by filename false_clean.parser_chosen_by_filename IMPLEMENTER2 monitorunsafecontroller-algorithmunassessed The consuming tool chooses its extractor from the file name rather than the content. A valid artefact under a non-canonical name is not mis-parsed but silently declined, returning zero rather than an error a caller would act on. analogyThe sorter rejects the letter because the envelope is the wrong colour. exampleA correct artefact under a non-canonical filename read as empty instead of raising. Measured instance that ran dark for a lane's entire life: bin/parse-runtime.mjs read join(dir, 'nuclei.json') while every sweep manifest writes nuclei.jsonl. On disk: 0 nuclei.json against 199 nuclei.jsonl. Reader and writer never once agreed on a filename, so parseRuntime returned {ran:false, findings:[]} for every scanned target, and the report's own hasRuntime() gate named the same absent file — so the DAST half had no candidate batches, ever. It did not look broken; it looked like a target with nothing on it. The same directory yields 0 findings / 0 blockers before the fix and 16 findings / 3 blockers after (7609a3a; pre-state confirmable at 7609a3a~1).
commitworkcommitworkpartial one lane keeps the canonical name and carries synthetic-ness in the content scoreBasis · 2026-09-06 no record proposedproposed Consumers that dispatch on a filename extension sniff the content first; a ratchet lists dispatch-on-name sites. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
C28closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Exit status read from the wrong process false_clean.exit_status_of_wrong_process IMPLEMENTER2 monitorunsafefeedback-incorrect6 attentionnot-provided / sensor-inadequateenables→ M2 A pipeline or wrapper reports the status of its LAST stage, so a killed or failing inner command is consumed as success by a caller that believes it read the command's own result. analogyThe courier arrives on time and cheerful, so the parcel he never picked up is assumed delivered. example`timeout 110 node bin/anchor-staleness.mjs | tail -45` had the node process killed at 110s (exit 124) while the harness reported exit code 0. The resulting JSON was read three times as fresh; it predated the file it was measuring by nine minutes, and byState was byte-identical across the 'runs' because it was one file read three times.
commitworkcommitworkpartial bin/test/lexical-ratchets.test.mjs: every tracked shell script with a pipeline sets pipefail or reads PIPESTATUS — ratchet, two offenders held at arming, no new one may land bin/test/lexical-ratchets.test.mjs present 2026-09-06; remaining: positive control planted through the same detector; the timeout/nohup and background-harness forms of the class are outside the lexical reach · 2026-09-06 no record proposedno proposal recorded
C29closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Path-keyed identity false_clean.path_keyed_identity IMPLEMENTER2 monitorunsafecontroller-model5 oversightunsafe / controller-algorithmmechanism-of→ G8same-defect-as→ C4same-defect-as→ C33 A finding is keyed on its file PATH, so a rename, a relocation or a deploy out of the tree reads as the finding having ended. C4 is the same defect one level down, keyed on line. analogyMarking a patient discharged because the bed they were in is empty. example25 anchors were classed file-deleted and 22 were not deletions: 8 a registry that had moved to monitor/private/, 2 a rename mid-flight (' D monitor/export-overwatch.mjs' with '?? monitor/export-overwatch-v2.mjs' present), 12 plists tracked at df68571 and installed in ~/Library/LaunchAgents/. A finding about a LaunchAgent is more live once the plist is installed, not less.
commitworkno record no record proposedproposed Extend the line-exclusion identity guard (C4) to refuse identity keys and lifecycle states derived from a path with no rename detection. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
C30closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Inert corroborator false_clean.inert_corroborator BOTH2 monitornonefeedback-missing5 oversightunsafe / controller-modelsame-defect-as→ C13 A verdict is formed by comparing two witnesses. The second witness's observation channel is inert — it runs, exits cleanly and observes nothing — and the reconciler consumes its empty output as concordance rather than as a null. Agreement is computed rather than observed, and a null observation agrees with every claim; the more thoroughly the second instrument is broken, the higher the agreement score. The statistical signature is the mirror of the ~100%-failure heuristic: near-perfect agreement between two witnesses is as much a defect signature as universal failure. Distinct from K5, where correlated verifiers make agreement CHEAP — here the channel is absent, so agreement is CERTAIN. Distinct from C13, whose remedy is to publish the subject count beside the finding count: this one's remedy is a liveness precondition, that a corroborator prove it can observe before its vote is counted. analogyTwo surveyors agree the field is empty. One of them was facing a wall. exampleA runtime dataflow witness built as a module preload. Measured 2026-09-02 before any code was written: --import intercepts a default import and MISSES a named import of a builtin, because importing a builtin instantiates its ESM facade and freezes the named bindings; the named form is the commonest in this tree. The witness would have observed nothing while exiting clean, and every static edge would have read as uncontradicted. -r with require intercepts all four import forms. DEGENERATE RATHER THAN EMPTY, measured 2026-09-16 on a 200-repository COBOL corpus, which is why this row predicate now asks for proportion rather than presence. A differential check graded a subject parser against GnuCOBOL 3.2 listings. cobc -fsyntax-only -t list -Xref -ftsymbols exited 0 on a 426,757-line fixed-format program read as free format and produced a symbol listing with 4 entries, which is byte-indistinguishable from a correct answer key over an empty subject. Across 1,726 witness runs 32 listings were degenerate, and 29 of those came from a repair pass that retried failing files with the source format flipped, so the repair manufactured the false witnesses and converted a loud failure into a silent wrong answer. The gate that works is a ratio against a lower bound neither side produces: reject the witness when its level-01/77 count is under half of a plain regex count of level-01/77 lines in the source. Before the gate the affected files scored the subject at 63.8% item recall; the same subject scores 99.8% once they are excluded, so the degenerate 1.9% moved the headline by 36 points.
commitworkcommitworkpartial flow/runtime.mjs proves it intercepted its own probe read (selfWitness); a trace lacking that proof is unusable, never an edgeless clean scoreBasis; flow/ present in this repository · 2026-09-06 no record proposedno proposal recorded
C31closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 The degraded path carries the population false_clean.degraded_path_is_the_population BOTH2 monitornonefeedback-missing4 agentunsafe / controller-modelunassessed A primary path and a fallback both exist and both are tested. In the deployed population the primary path's precondition is never met, so ~100% of runs take the fallback: coverage reads complete, the suite is green, and the primary path ships never having been exercised against reality. The exceptional case IS the population. Distinct from R1, where the branch cannot run — here it can and simply never does. Distinct from C13, whose subject count is zero: here subjects are plentiful and the CAPABILITY is absent. Distinct from A16, which is about how a could-not-execute is PUBLISHED — here publication is honest and the defect is the distribution. The one dimension: which branch carries the population's mass. analogyThe fire drill has run monthly for ten years. Nobody has opened the door that is locked. exampleThe client-spec intake lane shells out to pdftotext, mutool, pdftoppm or qpdf for PDF conversion. Censused 2026-09-02 on the build machine: all four absent, only textutil and sandbox-exec present. The no-converter noscan path is therefore the normal condition rather than an edge case, and every test claiming to exercise PDF handling exercises the refusal.
commitworkcommitworkpartial the intake run record carries a required preflight field; the memory ceiling records enforced:false scoreBasis · 2026-09-06 no record proposedno proposal recorded
C32closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 One-way relation published as coverage false_clean.converse_never_implemented BOTH2 monitornot-providedcontroller-algorithm5 oversightnot-provided / feedback-missingunassessed A system publishes coverage over a relation that runs in two directions and implements only one. The forward half is built, tested and reported; the converse has no implementation, no store, no surface and no reader, so the class of finding only it could produce is not missing from the report — it is unrepresentable in it. The published number then reads as THE coverage figure while answering half the question. Distinct from R6, which is decided by enumerating surfaces that exist and counting invocations: here there is no surface to enumerate, and zero throughput and zero implementation are different states of which only the first is countable. Distinct from G7, which has a writer and no reader — this has neither. Distinct from C13, whose scan RAN and enumerated zero subjects: C13’s remedy is to publish the subject count beside the finding count, which cannot be done here because no scan for that direction exists to have a subject count. The tell is not in the output at all; it is that nobody has stated the converse query in words. analogyA library that can tell you every book on a shelf and cannot tell you which shelf a book is on. exampleMeasured 2026-09-02 building a requirement-chain module. Its own contract names the gap: file-to-requirement is called "the direction nobody builds". The live instance is a fleet file-state module where 5 of 7 states are computed and two are sealed as NOT DERIVABLE, its own comment warning that the tempting "needs specification = built minus specified" over an empty specified set is all 656 files. In the reverse trace as built, a 2-file population with zero markers yields 2 unknown and 0 uncovered; the naive implementation yields 2 uncovered — a finding on 100% of the population.
commitworkcommitworkpartial the tracer computes both directions of the requirement relation and keeps three states with unknown never folded scoreBasis; one module · 2026-09-06 no record proposedno proposal recorded
C33closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Content-keyed identity false_clean.similarity_keyed_identity BOTH2 monitorunsafecontroller-algorithm5 oversighttoo-early / controller-modelsame-defect-as→ C4same-defect-as→ C29 A record's identity is assigned by matching its CONTENT against existing records — an exact content hash, or a similarity score above a threshold. Rewriting the content is then indistinguishable from deleting one record and creating another, and the tool performs that delete-and-create silently, as an ordinary successful run. Distinct from C29, and this is the discriminator that matters: C29 is repairable by a better key. A path moves and the file's content stays, so rename detection recovers the identity; C4 is the same shape one level down, where a line moves and the place stays. Both have something stable to fall back on inside the key. Content-keyed identity has none — when the moving thing IS the content, normalisation buys only the cosmetic cases (whitespace, case, unicode composition) and a genuine reword is movement by definition. The remedy is therefore not a better key but a change of AUTHORITY: the matcher may propose a link and must never assign one. That makes this the only member of the family whose repair is a refusal rather than a redesign. analogyA registrar who decides you are a new person because you changed your name. exampleMeasured 2026-09-02 in a requirement differ. Reword detection is Dice over character trigrams, threshold 0.62, ambiguity margin 0.08. Run as an argmax it assigns on the best score and always returns something, so it can never say "I do not know": across two revisions of one requirement, "must support Google and Apple sign-in" to "sign in" scores above threshold, and an auto-relinking differ writes 1 removed + 1 added — a delete-and-create of an id the contract calls immortal, from a two-character edit. As built the same input yields one reworded PROPOSAL, unconfirmed; the store refuses every unconfirmed proposal, and refuses ambiguous or unmatched outright even when confirmed, because those need resolution rather than approval. Ties within the margin emit ambiguous naming both candidates rather than picking either.
commitworkcommitworkpartial the differ proposes and cannot assign; a supersedes edge needs a named confirmer; round-trip test pins id survival scoreBasis; one differ · 2026-09-06 no record proposedno proposal recorded
C34closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Denominator outside the consumed artefact false_clean.denominator_outside_artefact IMPLEMENTER3 scannernonesensor-inadequateassessed-none A tool serialises only positive results into the artefact its automation consumes, and reports what it examined on a different channel. An empty result set is therefore byte-identical for "read everything, found nothing" and "read nothing", and no consumer of that artefact can tell the two apart however carefully it parses. analogyThe inspector files a list of the faults found and mentions how many rooms were entered on the way out of the building. exampleMeasured 2026-09-02 over three composer.lock files: osv-scanner 2.5.0 serialises only packages that HAVE vulnerabilities into results[].packages[], so two repos returned empty arrays and were nearly reported as having no coverage. The scanner's own stderr carried the denominator — "Scanned … and found 36 packages" — and the table format printed "No issues found". Actual state: 36, 132 and 222 packages read, one advisory total. The JSON was correct and unreadable, and the two channels carrying the denominator are the two an automated consumer does not parse. THE INVERSION, measured 2026-09-02 on scalafmt 3.8.1 while wiring the build-health format lane: `scalafmt --test` puts the per-file diffs on STDERR and only `error: --test failed` on stdout — 21 bytes out, 851 bytes err, both `+++ b/` headers on err, exit 1. A stdout-only consumer gets a non-zero exit and ZERO parseable records, which foldFormat correctly folds to `unreadable`, so every unformatted Scala repository in the fleet would have reported unreadable rather than a count. Same channel split, opposite half displaced: osv-scanner keeps the findings and loses the denominator, producing a false CLEAN; scalafmt keeps the verdict and loses the findings, producing a false GREY. The remedy differs with it — osv-scanner needs the base fetched from the other channel, scalafmt needs `2>&1` at INVOCATION, which lives in the manifest's cmd string where no parser test can reach it. Nothing downstream could have caught it; the split was measured before the command was written (commitwork 09682a8).
commitworkno record no record proposedproposed Every run record carries the count of subjects examined beside its finding count, and a consumer reading a record without it reports unknown rather than zero. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
C35closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Fixture the code under test could have produced false_clean.fixture_the_subject_could_produce IMPLEMENTER4 agentnot-providedcontroller-modelassessed-none A compatibility test builds its fixture with the same code it is testing, so it establishes that the code agrees with itself and is structurally unable to express the only input that matters: the bytes the previous version already wrote. The test passes for the same reason an empty test passes, and its name is usually the exact risk it does not cover. analogyThe locksmith tests the new key against the new lock and certifies every door in the building. exampleMeasured in memory-layer. 4a54053 (2026-09-10) appended two structs to AgentSession under #[serde(default)]. bincode is positional, so a record already on disk carrying a populated context is eight bytes short at that point and every later field misreads: 24 of 9,950 live records, all context=Some, written 2026-08-03 to 2026-09-06, were undecodable from 2026-09-10 and blocked the embedding migration. Recovered at 661d4ec (2026-09-16) with a legacy splice arm, 24 of 24 recovered and 0 of the 9,926 good records taking the arm. The landing commit asserted "Both bincode round-trip tests still pass" as evidence of backward compatibility. They did pass, and they always would have: both encode and decode through one struct definition, so no fixture either of them can build carries the old layout. The two tests are named for the risk they do not cover, agent_session_default_bincode_round_trip and agent_session_populated_bincode_round_trip at src/memory/facets.rs:1204 and :1223, and their existence is why nobody looked further. The remedy shape landed at 6f8bc34, which pins the persisted layout of Memory against a committed fixture so that changing it fails. The belief that made it safe was a sentence one file over stating that #[serde(default)] handles additive forward-compatibility, true on a self-describing codec and false on the persisted one; corrected at 8c02a3f.
commitworkno record no record proposedno proposal recorded
C36closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Proxy anti-correlated with its class false_clean.proxy_anticorrelated_with_its_class CONTROLLER5 oversightnot-providedcontroller-algorithmassessed-none A detector reaches its target through a proxy that holds over only part of the class, and the uncovered part is not the rare tail: it is the part that looks like work. The detector is correct wherever it fires and has tests proving it, so a healthy firing rate reads as coverage. A gate that matched nothing would eventually be noticed by its zero rate; this one has a rate and a hole, and the rate is evidence for the proxy and against nothing. analogyThe inspector checks the passengers who are standing still. exampleMeasured in commitwork. bin/lib/turn-gate-core.mjs reportLoop requires runs of consecutive turns that produced text and called no tool (policy reportLoopRun, default 3). Run against the session that built it, turn-gate returned outcome: pass on all four rules, reporting that the longest toolless run was 0, across 263 tool calls in 12 model turns, while three consecutive turns ended on the same unmoved hand-back. The activity is what hid it. Closed by a second rule, carried-handback, which keys on the handed-back ITEM with the hand-back phrase stripped and is therefore insensitive to how busy the turn was: a5d5f17 and 26dee25, 2026-09-16. Over a corpus of 266 transcripts, 4 sessions fire at run limit 3 and all 4 adjudicate as true positives; limit 2 fires on 12 and is unadjudicated. One of the four true positives is a destructive action correctly refused and then restated three times rather than escalated, so the class includes correct refusals that were never converted into a decision.
commitworkno record no record proposedno proposal recorded
C37closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Verdict inherited by later members false_clean.verdict_inherited_by_later_members CONTROLLER5 oversightnot-providedcontroller-modelassessed-none A grouped result is classified once, correctly, and the classification is then reused as membership. Entries that join the group afterwards inherit a verdict nobody formed about them, and the standing entries keep that verdict looking confirmed on every re-read. Nothing that is read is stale: the PARTITION is, which is why a freshness check on the data finds nothing wrong. analogyThe supervisor signs off the tray of approved forms each morning and clerks add forms to the tray all day. exampleMeasured in commitwork. 008b015 set scopeNotes to a string where manifest.schema.json requires an array, and the manifest-schema-drift failure "every real manifest satisfies the schema" fired for hours inside the gate block of failures already classified as committed and attributable. Counted afterwards: at 008b015 exactly one check carried a non-array scopeNotes, the reporter own, the only one in the tree; zero at HEAD; 4 of 4 valid now. The block held between 2 and 9 entries throughout, so volume is not the mechanism. A peer repaired it at c0a38fc and 2bd2947; records at 658fea1 and 17fbcee. The remedy is mechanical and the gate already has the data for it: diff the failing test names against the previous run and print what is new since it as its own block, so that membership is computed rather than remembered and the reader has no opportunity to misclassify.
commitworkno record no record proposedno proposal recorded

IIFalse alarm contentA1–A24 The false proposition: “and this is what is wrong / what to do” membership testSomething fired and published a finding, and the finding misstates its own subject, scope, cause or applicability. The alarm is REAL: what is wrong is what it says about the world. A row where nothing fired at all belongs to family I.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
A1closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 True alarm, wrong scope false_alarm.wrong_scope CONTROLLER2 monitorunsafecontroller-model6 attentionunsafe / actuator-corruptsame-defect-as→ A3mechanism-of→ M1 A turn-scoped accusation computed from a baseline-scoped comparison. analogyA tenant is asked to account for a crack that opened before they took the keys. exampleA 56-to-61 anchor drift that predated the session blocked 30+ turns; adjudicated 0/7 on attribution over 8 firings, all 8 detections real.
commitworkcommitworkpartial the claim lattice, journaled as a scoreable field (5d02cd4) scoreBasis · 2026-09-06 no record proposedno proposal recorded
A2closureclosure 3 of 4: solved, unpinned3gaingain 1 of 4: marginal1 Remediation that launders the defect false_alarm.laundering_remediation CONTROLLER4 agentunsafehigher-input6 attentionunsafe / actuator-corruptunassessed The alarm's own suggested fix converts a real failure into an accepted floor. analogyA mechanic hears a knock in the engine and advises turning the radio up. examplegate-ratchet appends "accepting the baseline is the right move" keyed on commit evidence, while the countervailing guard keys on a claim derived only from dirty files, so co-session commit drift ships the advice with its guard suppressed. Second instance, from a rule's accepted remedy rather than a --fix path: deno_lint's no-empty is satisfied by putting a COMMENT inside the empty block. Six empty catch blocks were cleared by writing `catch { /* already released/closed */ }` — teamD/scripts/import-audience-data-copy.ts and teamD/fly/deployment-worker/utils/parquet.ts among them. The swallowed error the rule exists to surface is untouched; it now carries a justification, which is the floor. The remediation is indistinguishable from a real fix in the lint output. teamD / Portll-teamDRemote, reporter #29, 2026-09-04. Caught before it landed, commitwork 2026-09-24: after a history rewrite, mapping each verified-against stamp to its rewritten SHA was the obvious repair. docs-doctor anchors its edited-since count on the commit that last wrote the stamp line, so a commit that rewrites the line becomes the new anchor, and for 17 docs edited since their stamps the translation would have cleared the staleness verdict with nobody re-reading them. An adversarial-audit pass found it by reading gitStaleness; the translation was limited to docs with no other reason (9ac7f63). The mechanism is still live for any stamp-line rewrite. Measured by reporter #1 2026-09-24.
commitworkcommitworkwrong R4 — Invert the ratchet launder-advice remediation register #4: WRONG 2026-08-29 (8088eac) — The item asks to key accept-advice on "mine or standing". The code now keys on `mine` ONLY, and that narrower rule is correct — implementing the item as worded would revert 8088eac and re-open the exact… · 2026-09-06 no record proposedno proposal recorded
A3closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Baseline poisoning across populations false_alarm.baseline_poisoning CONTROLLER2 monitorunsafecontroller-model6 attentionnot-provided / actuator-missingsame-defect-as→ A1mechanism-of→ M1mechanism-of→ M2 A floor measured on one population is applied to another, leaving the gate deaf. analogyA student is graded against the mark scheme for a different exam. exampleA {fail:6} floor written from a pristine checkout was compared against working-tree counts; a floor above reality reports no regression.
commitworkcommitworkpartial the pristine-checkout half fixed scoreBasis; the stale-advice sibling is live · 2026-09-06 no record proposedproposed Every baseline file records the population it was measured over (tree, ref, moment) and refuses to be applied to another. effort Low · would reach closure 4 · reporter #3, lever triage · 2026-09-06
A4closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Alarm fatigue false_alarm.alarm_fatigue CONTROLLER5 oversightapplied-too-longcontroller-algorithm6 attentionapplied-too-long / actuator-corruptunassessed Per-turn firing that cannot name what it waits on trains the operator to remove the alarm. analogyA car alarm goes off nightly, and the owner disconnects it in the third week. exampleOne regression repeated verbatim for 20+ turns; the operator removed the Stop-hook wiring from every readable settings scope.
commitworkcommitworkpartial say-once suppression, re-wired 2026-08-10 scoreBasis · 2026-09-06 no record proposedno proposal recorded
A5closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Refusal re-armed as success false_alarm.refusal_rearmed BOTH2 monitorunsafeactuator-corrupt6 attentionunsafe / actuator-corruptunassessed Corrupt input is treated as absent input, so the gate replaces the floor it could not read. analogyA pharmacist cannot read the prescription and dispenses a drug of their own choosing. exampleCaught by the canary harness's R-CORRUPT scenario before it ever fired in production.
commitworkcommitworkpartial fixed 93b5d0d; the canary that caught it runs only by hand scoreBasis · 2026-09-06 no record proposedproposed Put the canary that caught the refusal-re-armed instance into the nightly --require list so it runs unattended. effort Low · would reach closure 4 · reporter #3, lever triage · 2026-09-06
A6closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Advisory with no subscriber false_alarm.advisory_without_subscriber CONTROLLER2 monitornot-providedactuator-missing6 attentionnot-provided / actuator-missingunassessed Non-blocking advice is actioned zero times; the variable is the subscriber, not the wording. analogyThe suggestion box fills up and is never opened. exampleAbout 55 advisory firings actioned 0 times against about 15 blocking firings engaged with every time, same session, same attention. Measured, attributed instance replacing the earlier approximation: in reporter #9 a vscode-skills advisory appended to every UserPromptSubmit for ~30 turns was actioned 0 times, while two blocking gates fired ~15 times in the same session and were engaged with every time — same model, same attention, same repetition, the variable being the subscriber. It recurred on 2026-08-13 in reporter #45 (~15 commits, five new modules, zero overwatch-layer tasks) in a session that HAD the written prescription on disk, which rules out recall as the fix.
commitworkcommitworkpartial bin/gate-spine.mjs, a Stop hook plus a PostToolUse recorder, gating session close on vscode-skills task records scoreBasis correction 2026-09-02: 95 gate verdicts across 17 sessions in 20 days, effect on filing unmeasured (no A/B); file present and wired in .claude/settings.json, verified 2026-09-06 · 2026-09-06 no record proposedproposed Measure the gate's effect: compare filing rates for sessions before and after gate-spine, holding the advisory text constant, so "deployed and firing" can become "works" or "does not". effort Med · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
A7closureclosure 4 of 4: solved and pinned4gaingain 0 of 4: nothing on the table0 Tautological alarm false_alarm.tautological CONTROLLER2 monitorunsafecontroller-algorithm6 attentionunsafe / actuator-corruptunassessed A condition true by construction on every run, so a healthy fleet reads as uniformly failed. analogyA weather warning is issued every morning for the possibility of weather. exampleAn area-scoped sweep necessarily leaves the fleet unswept, so coverage.unswept routed to stderr put a non-empty .err beside all 25 agents nightly. Two further instances, the second in an external tool that published. (a) A nuclei branch computed `status === null ? !isHttp || true : status < 400`; `!isHttp || true` is unconditionally true, so the isHttp test above it was dead and network detects and unreadable-response findings landed in one bucket called "live". (b) nuclei's own snmpv3-detect template matches on `dsl: ["success == true"]` with a `(.*)` extractor behind an isUDPPortOpen precondition that cannot fail, because UDP has no handshake — it matches whenever the script runs. Measured on one fleet: 74 records, including 12 at port 161 where the kernel socket table shows nothing bound, each carrying the template's own fallback literal as its "extraction". Zero information, published 74 times.
commitworkcommitworkimplemented degraded excluded from the alarming predicate; the live code is three-valued scoreBasis, verified at HEAD 2026-09-02 by reporter #8 · 2026-09-06 no record proposedclosed — no proposal applies
A8closureclosure 4 of 4: solved and pinned4gaingain 0 of 4: nothing on the table0 Unsatisfiable alarm false_alarm.unsatisfiable CONTROLLER2 monitorapplied-too-longcontroller-algorithm6 attentionapplied-too-long / actuator-corruptunassessed A state no run can clear, training the operator to ignore the deadman. analogyThe seatbelt light stays lit with the belt fastened. exampleA rollup for an undeclared area classified expired, but only declared areas are scheduled, so no run could ever clear it.
commitworkcommitworkimplemented the unscheduled state added, so a never-cleared alarm names its cause scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
A9closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Right detector, wrong cause false_alarm.wrong_cause CONTROLLER2 monitorunsafecontroller-model6 attentionunsafe / actuator-corruptsame-defect-as→ P3same-defect-as→ P4 The finding is real; the diagnosis points elsewhere, and agents act on the diagnosis. analogyA surgeon identifies the pain correctly and operates on the wrong organ. exampleA registry-drift test failing at HEAD was broadcast to fifteen sessions as another session's unlanded hunks; the only drifted key was the broadcasting lane's own partially-landed work.
commitworkcommitworkopen attribution plan — Messaging: Require an attribution receipt — the basis, the sessions considered and the check that was run — inside any message naming another session. A… attributionPlan "Messaging": OPEN 2026-08-29 — OPEN, not PARTIAL, and the negative is clean rather than inferred. Reachability: I enumerated every hook group in both settings files this project loads (18 total, the full population) — exactly one is PreToolUse and it… · 2026-09-06 no record proposedno proposal recorded
A10closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Manufactured false positives false_alarm.manufactured_positives IMPLEMENTER2 monitorout-of-ordercontroller-algorithm6 attentionunsafe / actuator-corruptunassessed A suppression instrument reports only false alarms, burying its one true positive. analogyThe doorway detector beeps for every set of keys and stays silent for the knife. exampleapplied:0 / noMatch:23 while every row carried its annotation correctly; the 23 false alarms hid the fleet's one genuinely inert record. Second instance, where the false alarms come from the CORPUS rather than the instrument: grepping teamD / Portll-teamDRemote for stub markers, "HACK" and "STUB" matched PORT HACKING, HACKETT, STUBBO and SHACKLETON in au_postcodes reference DATA, and "placeholder" matched HTML attributes and SQL parameter docs — 160 of 184 hits false, 87%. Filtered before reporting (reporter #30, 2026-09-04). The instrument was correct; the population it searched contained prose and reference data, so a substring marker cannot discriminate and the 24 real markers were nearly lost in the 160. A DENOMINATOR THIS ROW DID NOT HAVE, measured 2026-09-06 in commitwork by reporter #26 (93dbe11). Four new pattern-core detectors published 38 structural findings on their first run over 1005 files — 22 A20, 13 K7, 3 A24 — and every site read was the house fail-closed idiom working correctly. bin/dep-provenance.mjs:54 carries the comment "FAIL CLOSED: a lockfile we could not read is named" one line above the push that was reported. All three A24 hits were the ENOENT ladder, where the first throw names no cause because the cause is in the branch condition. After the fix: 0, 0, 0 over the same corpus with a detector that provably still fires on a plant.
commitworkcommitworkimplemented carry/overlay order corrected (850a6e3); monitor/test/detector-identity.test.mjs and incorrect-scan-result.test.mjs pin detector share scoreBasis; test files present 2026-09-06; reporter #28 measured 0/0/0 on the four new pattern-core detectors after 93dbe11 · 2026-09-06 no record proposedclosed — no proposal applies
A11closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 True statement as complete explanation false_alarm.true_but_incomplete CONTROLLER4 agentunsafecontroller-model6 attentionunsafe / actuator-corruptunassessed The account offered is accurate and is not the cause; being true, it survives review and closes the question. analogyThe cough is explained by the cold weather, which is true, and the tumour goes unexamined. exampleA package-behaviour scanner's zero-dependency husks were explained as "verify is registry-metadata-only" — true, not the reason, and it closed the question for weeks. Measured instance, bin/docs-doctor.mjs 2026-09-24: a new not-in-history verdict ended the stamp check for its doc, so the edited-since count was never taken. Fourteen docs that had also been edited since their stamps showed only the off-history reason, which was accurate and read as the whole account. Fixed 912df34: stamp verdicts accumulate per doc. Measured by reporter #1 2026-09-24.
commitworkcommitworkno-lever every statement in the class is true; only a competing account establishes it, and no artefact holds the competing account lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
A12closureclosure 0 of 4: not solved0gaingain 1 of 4: marginal1 Self-critique as credential false_alarm.confession_as_credential CONTROLLER5 oversightnonecontroller-model6 attentionunsafe / actuator-corruptunassessed A document that records its own errors is trusted more, so the unconfessed remainder receives less scrutiny than it otherwise would. analogyA witness who volunteers one small lie is believed on everything else. exampleDerived; no instance observed. The v1 callout recording three of its own classes is the confession whose effect on reader scrutiny is unmeasured.
commitworkcommitworkno-lever needs a reader of the remainder; no instance and no instrument lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
A13closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Index drift at the pointer false_alarm.index_drift CONTROLLER4 agentnoneprocess-change6 attentionunsafe / actuator-corruptunassessed The index entry describing a document contradicts the document; the pointer decays independently of its target. analogyThe catalogue card describes an edition the shelf stopped holding years ago. exampleREADME described the failure taxonomy as "six families" while the document declared seven; docs-doctor checks that the link resolves, not that the description is true.
commitworkcommitworkopen R11 — Gate the doc index, not only the doc remediation register #11: OPEN 2026-08-29 — Not PARTIAL, because zero of the item's three deliverables exist rather than one of them: (a) no tracked-in-git assertion, (b) no description-agreement assertion, (c) no untracked-but-stamped state. The two index checks… · 2026-09-06 no record proposedproposed All three deliverables. Concretely: 1. TRACKED-NESS. Build a positive tracked set once per run — `git ls-files -z -- '*.md'` at collectDocs() time — and test membership, rather than enumerating untracked files. This inversion matters: the… (next step of R11) effort Low · remediation register #11, REMAINING · 2026-09-06
A14closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Asymmetric detector rigour false_alarm.asymmetric_detector_rigour IMPLEMENTER3 scannerunsafecontroller-algorithmunassessed A detector's positive side is structural, built on a lexer or a parse, while its exclusion list is enumerated from memory. Recall looks rigorous and precision is silently bounded by what the author happened to recall. analogyThe net is woven to specification and the list of fish to throw back is written from memory. examplebin/lib/pattern-core.mjs detectCatchEmptyReturn matched catch blocks with a shared lexer, then excluded discriminating catches with a literal regex over ENOENT, .code, errno and instanceof Error.
commitworkcommitworkno-lever whether a detector's two halves are built the same way is a design reading; no lexical form distinguishes an enumeration from a grammar lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
A15closureclosure 2 of 4: part-solved2gaingain 1 of 4: marginal1 Control over an emptied subject false_alarm.control_over_emptied_subject CONTROLLER1 operatorunsafecontroller-modelunassessed A control is tuned to relieve a pressure measured on a freshly produced artifact while a different mechanism has since reduced the subject. The lever is live, correct, wired, and governs almost nothing. analogyThe thermostat is set carefully for a room that was demolished. exampleretention.keepFullSweeps was cut from three to one on a per-sweep cost measured before compaction had already shrunk the stored sweeps.
commitworkcommitworkno-lever needs a re-measurement rule for a tuned control; the rule is procedural and lives in evaluations/DECISIONS.md lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
A16closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Non-execution as verdict false_alarm.non_execution_as_verdict IMPLEMENTER3 scannerunsafefeedback-missingunassessed A check that could not execute, for want of a tool, a credential scope or a field the API never returned, folds its failure to execute into the same channel as a substantive finding. The unknown is published as a verdict. analogyThe inspector who could not reach the site files a failure. exampleFour instances measured 2026-08-22 and recorded under CLAUDE.md’s “Grey ≠ red either” invariant: TruffleHog’s Lob detector produced 1,311 of the fleet’s 1,314 published CRITICALs, all false; A cloud-posture scanner asserted 1,067 FAILs about security_and_analysis, a field GitHub never returned to the credential that ran. Measured instance where the fail-open was introduced BY the fix for a lockout: an idempotency guard's liveDispatchFor DID ask upstream, upstream was unreachable and returned {known:false}, and the release path treated "could not ask" identically to "asked, and the session is gone" — so a moment of unreachability let a second agent start on the same task. Fixed 4b788fa by making the decision an exported three-state function, precisely because a fail-open hides well in an inline conditional. Further instance in this fleet's own roster walk (d2e3ac8): sessionPid read ps's OUTPUT and never its STATUS, so a ps that could not run at all — missing binary, denied, exec failure — produced an empty stdout, a NaN parent and a null return BYTE-IDENTICAL to "walked the chain and found no socket ancestor". Both fail closed and the hook omits the pid either way, which is why it survived review: the observable behaviour was right. What differed was everything around it — the failing spawn repeated once per hop, twelve times per session start, on every session on the machine, and nothing could tell an operator that ps was broken here rather than that no session owned this process. A fleet-wide roster outage would have looked exactly like normal operation.
commitworkcommitworkpartial monitor/unknown.mjs declares the undetermined state with a closed reason set (absent, empty, unparseable, truncated) and monitor/rollup.mjs consumes it at 24 sites files present, verified 2026-09-06; nothing asserts that every could-not-execute path emits it · 2026-09-06 no record proposedno proposal recorded
A17closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Believed failure reason false_alarm.believed_failure_reason IMPLEMENTER4 agentunsafefeedback-incorrectunassessed A test fails on a false premise, so the failure is real and misattributed. Because something is already failing nobody looks past the stated reason, and a genuine defect in the same path stays invisible for as long as the red test stands. analogyThe mechanic reads the warning light and never opens the bonnet. examplememory-layer's restart_resumes_from_persisted_checkpoint asserted a pre-checkpoint condition and concealed a real defect for roughly three months.
commitworkno record no record proposedno proposal recorded
A18closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Bypass hardened into precedent false_alarm.bypass_hardened_into_precedent CONTROLLER5 oversightunsafehigher-inputunassessed A gate blocks on pre-existing debt nobody owns. The first session bypasses it with a stated reason, the second cites the first, and the citation converts a workaround into policy while the displaced remedy is never re-costed. analogyThe propped fire door acquires a sign explaining why it is propped. exampleoverwatch-layer's pre-commit artifact gate refused every commit from every session for over a week before 13 of 14 records were restamped.
commitworkno record no record proposedno proposal recorded
A19closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Uniform remedy over deliberate states false_alarm.uniform_remedy_over_deliberate_states IMPLEMENTER4 agentunsafecontroller-modelunassessed A defect found in one member of a category is prescribed for every member showing the same surface symptom. Members whose symptom is a deliberate documented state are silently reverted by the fix. analogyThe painter covers every mark on the wall including the height chart. example5,855 scanner rows carrying no severity across six categories were enumerated for one remedy; only three categories were genuinely defective and the rest were deliberate absences.
commitworkcommitworkno-lever separating a defect from a declared deliberate state needs the declaration read, which is judgement lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
A20closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 One handler, opposite correct responses false_alarm.one_handler_opposite_responses IMPLEMENTER3 scannerunsafecontroller-algorithmunassessed Two failure conditions are detected correctly and separately, then funnelled into one handler whose single response is right for one and wrong for the other. One wants retry and backoff, the other wants a recorded skip. analogyOne switch is wired to both the brake and the throttle. examplebin/advisory-index.mjs --fill-nvd walks about 1,505 CVEs against NVD, where a rate limit and a genuine absence arrived through the same path.
commitworkcommitworkpartial fixed at 30a05a9: rate-limit re-throw preserved, skip count printed scoreBasis; the second instance is unexamined · 2026-09-06 no record proposedno proposal recorded
A21closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Accurate and non-discriminating false_alarm.accurate_and_non_discriminating IMPLEMENTER4 agentunsafefeedback-missingunassessed An API validates a required input and reports its absence. A caller who supplied it in an unread carrier gets byte-identical treatment to one who supplied nothing, so the message is correct in both cases and diagnostic in neither. analogyThe form comes back marked incomplete without saying which box is empty. examplememory-layer returns the same 121-byte body, sha256 0849ad5661113e0c, for an X-User-Id header it never reads and for no identity at all.
commitworkno record no record proposedno proposal recorded
A22closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 One value, two readers, opposite meanings false_alarm.overloaded_sentinel IMPLEMENTER5 oversightunsafecontroller-algorithmunassessed A value is chosen for what it means to one reader and is the trigger condition for another, in the same module. The choice is defensible on its own terms and activates the second path silently. Separable from A20, where two conditions are funnelled into one handler, and from M13, where several producers give one concept many shapes: this is the inverse of M13 — one shape carrying several concepts — and the two readers are usually written months apart by people each of whom was right. analogyThe key that opens your door also opens the neighbour's, and nothing on it says so. exampleRANK.paused = 0 was set because a paused area is not an alarm state. Rank 0 is also the trigger for the unjournaled rewrite (`if ((RANK[state] ?? 0) === 0) state = 'unjournaled'`), and a paused area's journal always lags because nothing is sweeping it — so the state chosen to silence an alarm would have raised a different one at rank 1. Caught before shipping by testing the value rather than reasoning about it.
commitworkcommitworkpartial two of three rewrite sites exclude the state explicitly; the third does so deliberately scoreBasis · 2026-09-06 no record proposedno proposal recorded
A23closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Predicate blind to its own inapplicability false_alarm.predicate_blind_to_inapplicability IMPLEMENTER5 oversightunsafecontroller-algorithm6 attentionnot-provided / sensor-inadequatemechanism-of→ C5 A check whose output is identical for 'the defect is present' and 'the subject is not of the kind this check applies to'. It cannot disagree with the hypothesis that produced it, so running it feels like verification and adds no information. analogyTesting whether a room is dark by asking whether the blind man in it can see. examplegrep -rF '.<name>' --include='*.css' returned 0 for six names and 0 was published as 'CSS class with no rule'. All six were ids and data- attributes that never needed a rule, and the same 0 is what a correctly-defined class would never produce and a non-class always does. Nine dangling contracts were published; all nine were withdrawn. Measured instance: bin/panel-smoke.mjs matched /\bundefined\b/ over document.body.innerText and reported 21 leaked tokens on one panel tab. Two were real; nineteen were remediation prose legitimately containing the word ("entry.kind === undefined on every row"). A panel whose subject is defects always contains it. 21 hits, 19 false, one tab — 6a1b3e3, fixed by narrowing detection to a leaf element whose ENTIRE trimmed text is the token.
commitworkno record no record proposedproposed Every zero-counting detector ships a control subject of a different kind and asserts not-applicable rather than zero on it. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
A24closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Cause discarded at emission false_alarm.cause_discarded_at_emission IMPLEMENTER5 oversightunsafecontroller-algorithmassessed-none An error path emits its outcome through a lossy formatter while a detail-carrying variant exists in the same artifact and is not on the taken path. The cause is destroyed as the message is written, not lost in transit and not merely unrecorded, so no downstream reader can recover it however carefully they look. analogyThe hospital records that the patient was discharged and not what was wrong with them, on a form that has a box for it. exampleTwo instances one layer apart in the same incident chain, in two independent programs. ggml/llama.cpp's shipped libggml-metal.dylib carries BOTH "%s: error compiling source" and "%s: error compiling source: %s", and the lossy one is on the path that runs, so the Metal compiler's actual diagnostic reaches no log — lmstudio-ai/lmstudio-bug-tracker#2040 stood 58 days with the cause hypothesised and unproven. One layer up, LM Studio's wrapper logs "Engine protocol runtime llama-server for <id> exited before becoming healthy. exitCode=1, signal=null" and its main.log holds that line, GPU config and nothing else; the child's real stderr ("unknown model architecture") existed only in ~/.lmstudio/server-logs/, which is why the operator's first question was about RAM. REMEDIATED UPSTREAM, and the remediation is what makes the class legible: on llama.cpp 2.31.2 the probe now succeeds, by positive witness rather than by absence — `setLanguageVersion:` appears once in 2.31.2's libggml-metal.dylib against zero occurrences in 2.28.2, while the binary is still built minos 14.0 / sdk 14.5, so the language version was pinned rather than the SDK moved. The failure string is STILL PRESENT in the 2.31.2 binary and no longer prints on the same invocation that printed it on 2.28.2, which is the negative control for that positive one. But BOTH format strings remain — "%s: error compiling source" and "%s: error compiling source: %s", same pair, same binary. The lossy path was never repaired; it stopped firing because the compile now succeeds, so the A24 predicate still matches the current artifact. Two instances, 2026-09-24. map/render.mjs printed '(skipped, layer data absent)' for every attach-layer failure while the caught error carried the child's exit status, so attach-program's deliberate exit 1 read as a missing layer (audit finding 0037, fixed e3385f1). bin/tls-headers-scan.mjs ran testssl with stdio ignored and kept 80 characters of the exception, so a refusal such as testssl's stop on an existing --jsonfile surfaced as 'failed/timed out' with no reason (fixed 8c7937f, which keeps the exit code and the stderr tail). Measured by reporter #1 2026-09-24.
commitworkno record no record proposedproposed A ratchet over catch blocks whose body never references the caught error and emits a constant message — the lossy formatter form. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06

IIIFalse repairR1–R18 The false proposition: “and it is fixed now” membership testA repair, guard or remediation is in place and is credited with a property it does not have, because it cannot run, runs over less than it claims, or changed only what a detector matched. The row requires an ATTEMPTED FIX to exist; a defect nobody has tried to repair belongs elsewhere.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
R1closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Guard wired to a path that cannot run false_repair.guard_on_unreachable_path IMPLEMENTER5 oversightnot-providedactuator-missing6 attentionnot-provided / actuator-missingawaits→ R6deadlock A cleanup or check hangs on a branch reached only when the failure did not occur. analogyThe lifeboat drill runs on the days the ship stays in port. exampleThe stale-worktree prune sat inside suiteAtHead(), which runs only on regression-pending; the gate exited 0 with 18 directories still there. Second instance, a different mechanism reaching the same place — a correct refusal wired to a value no writer can produce, in memory-layer (src/memory/compression.rs, fixed edfb43f 2026-09-02): decompress() carries a match arm for the hybrid strategy that refuses and reports the content unrecoverable, and it could never execute, because compress_hybrid() calls compress_semantic() then compress_lz4(), and compress_lz4 writes compression_strategy="lz4" unconditionally as its last act. A hybrid record therefore reached storage tagged lz4, decompress() took the lz4 arm, succeeded, and returned the 50-word semantic summary AS the restored original; is_lossless() returned true for the same reason. Measured consequence on one real record: a 19,396-byte three-file handoff reduced to 410 bytes of content, 1.6% coverage by shingle against the source files on disk, files 2 and 3 of 3 absent entirely, while ner_entities still carried offsets to end_char 17392 into text that is nowhere. compression_ratio and the entity offsets both retained the shape of the original after the original was gone. Second instance, same mechanism at a different site: liveness's ranking logic sat in the `else` branch, entered only when a journal EXISTED — that is, only when the never-written failure had not occurred. Measured: 28 areas carrying fresh rollups and zero journals, no alarm raised, for a day. Fixed 6977431 (monitor/liveness.mjs ~193-206 pre-fix). Fourth instance, and the branch is unreachable by ARITHMETIC rather than by control flow: a new-since-last-run comparison required prevTests === tests before comparing anything, on a fleet where the case count changes between nearly every run — 7325, 7494, 7541, 7636, 7644 and 7673 were all observed on 2026-09-06 alone. The guard would therefore have refused to compare essentially always, reporting "unknown" forever while looking implemented. Found by the author auditing their own two commits at the operator's request (1b9b962), which also found the block reached one of four reporting paths.
commitworkcommitworkpartial R5 — Assert guard reachability, not guard existence remediation register #5: PARTIAL 2026-08-29 — Not DONE: R5 asks three things and only one landed. The production call site IS asserted for two guards against the real .claude/settings.json, and I proved by mutation that removing the wiring turns both tests red —… · 2026-09-06commitworkpartial R16 — Assert that every fail-closed branch is reachable from production remediation register #16: PARTIAL 2026-08-29 — PARTIAL, and the split is clean: the gates that live inside the repo got the property; the sensor the item was written about did not. Real half. For gate-spine and gate-tests, the unknown-recording branches are driven… · 2026-09-06 no record proposedproposed (1) Add a CW_* env seam for the settings path in hookProbe (bin/test/guard-reachability.test.mjs:86) and an in-repo fixture test asserting the reachable:false -> red direction; today nothing in the tree exercises the failing branch, so the guard has no… (next step of R5) effort Med · remediation register #5, REMAINING · 2026-09-06proposed Population of unknown-recording branches, taken from the repo's own enumeration at bin/canary-harness.mjs:105 (REFUSALS) plus gate-ratchet's duplicate emitter — 7 branches. Covered through the production entry point: 4 (gate-tests baseline-unreadable;… (next step of R16) effort Med · remediation register #16, REMAINING · 2026-09-06
R2closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Fix changed the symptom false_repair.symptom_moved IMPLEMENTER4 agentunsafeactuator-corrupt6 attentionunsafe / actuator-corruptunassessed The observable moves and the cause does not, often by editing the string a detector matched. analogyThe warning light is taken out of the dashboard and the wiring fault stays. exampleCorrecting prose in reconcile-findings made gate-ratchet's scraping regex match nothing, so the metric went UNKNOWN at the moment the number it watched reached zero.
commitworkcommitworkno-lever whether a fix changed behaviour or only the matched string is a semantic reading of the diff lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
R3closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Partial coverage read as full false_repair.partial_coverage_as_full CONTROLLER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed The guard runs, on a subset, and the subset is not stated where the result is read. analogyA building inspection covers the ground floor and is filed as an inspection of the building. examplecanary-harness.test.mjs runs only the four hermetic gate-tests scenarios and asserts 4/4; the R-* scenarios that score attribution run only when a human runs them. Second instance on an orthogonal axis: the canary harness covers 2 of 4 GATES. docs-doctor has zero scenarios despite journaling 146 decisions, and liveness has zero, while the harness prints "11/11 correct" without stating anywhere that the population is two gates. Third instance, in a linter rather than a harness: golangci-lint suppresses its own output through three compounding defaults (max-issues-per-linter 50, max-same-issues 3, uniq-by-line true). On one Go tree the default output reported 32 issues; with the first two at 0 it reported 84; with uniq-by-line also off, 87. Nothing in the output indicates truncation, so 32 reads as the total — 32 of 87 shown, 37% of the population, across ~570 sources.
commitworkcommitworkpartial R6 — Automate the R-* canary scenarios remediation register #6: PARTIAL 2026-08-29 (d83d9a2) — Not OPEN: the mechanism is not a comment or an unwired module. The lane is committed at HEAD (monitor/sweep.mjs:992-1035), 31 loaded launchd agents structurally reach it (they pass the positional group… · 2026-09-06 no record proposedproposed Record the scorecard. Add `canary` to buildAreaVerdict's destructured parameter list at monitor/sweep-verdict.mjs:52-56 and to the returned object (or have the lane write into verdictParts.steps.canary, which already survives). Without this the nightly… (next step of R6) effort Low · remediation register #6, REMAINING · 2026-09-06
R4closureclosure 2 of 4: part-solved2gaingain 1 of 4: marginal1 Structurally frozen metric false_repair.structurally_frozen_metric IMPLEMENTER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed The number cannot move, for reasons unrelated to what it measures. analogyA rain gauge sits under the eaves and reads zero through every storm. exampleThe timeline's "6 cleaned" reached strong confidence only via an npm lockfile diff, and commitwork has zero runtime dependencies. Measured instance, map/attach-cve.mjs 2026-09-24: attachedIncomplete was declared, never incremented and printed as 'scan-incomplete: 0' on every run, whatever the snapshot's scanIncomplete list held (audit finding 0187). Fixed e3385f1 by printing the snapshot's own count. Measured by reporter #1 2026-09-24.
commitworkno record no record proposedproposed A census over the history series flagging any metric with zero variance across N runs whose inputs changed. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
R5closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Useless remediation payload false_repair.empty_remediation_payload IMPLEMENTER2 monitorunsafeactuator-corrupt6 attentionunsafe / actuator-corruptunassessed Advice is present and well formed and carries no information. analogyThe prescription reads 'take medicine'. exampleremediation: "available" is a literal string in 110 of 125 cases, in the field a reader consults to learn what to do.
commitworkno record no record proposedproposed The rollup refuses remediation text with no repo-specific token and marks it generic; a ratchet counts generic remediations per lane. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
R6closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Surface shipped, never used false_repair.surface_without_throughput CONTROLLER2 monitornot-providedactuator-missingawaits→ R1deadlocksame-defect-as→ G7 The path works and has zero throughput. analogyA hospital opens a ward, staffs it, and admits nobody for a year. exampleThe adjudication surfaces recorded 0 lodged fixes, 0 rulings and 0 model verdicts.
commitworkno record no record proposedproposed A time-bounded reader count per panel route and CLI flag from the access log; surfaces with zero readers over the window are listed. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
R7closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Hardened against the wrong threat false_repair.hardened_against_wrong_threat CONTROLLER5 oversightnonecontroller-model6 attentionunsafe / actuator-corruptunassessed Many passes converge and none tests the headline threat. analogyThe house gets nine locks on the front door and keeps a window open at the back. exampleNine hardening passes critiqued the machinery around detection; the tenth lens found the minified-code lane tripped nothing on a distributed three-file assembler, bidi/homoglyph obfuscation, or JSFuck.
commitworkcommitworkpartial the minified lane has a plant scoreBasis; the scheduling rule is unadopted · 2026-09-06 no record proposedno proposal recorded
R8closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Iatrogenic fix false_repair.iatrogenic_fix IMPLEMENTER4 agentunsafeactuator-corruptunassessed The repair itself introduces the next defect, sometimes a worse one. analogyThe operation repairs the knee and leaves the patient with an infection. exampleSetting --metrics=off for privacy made a pattern-SAST scanner's auto configuration refuse to run, leaving SAST dark for an hour with one sweep already completed that way. Second instance, where the tool's own remediation hint is the vector: deno_lint's no-unused-vars advises “prefix it with an underscore like _error”, which is correct for identifiers and wrong for object-destructuring keys, and does not say which. Applied at teamD/site/routes/admin/users/index.tsx:103 it turned { url, state, data } into { _url, _state, data }, which binds properties NAMED _url and _state that do not exist; the lint finding cleared correctly, because those bindings really were unused. deno check caught it (TS2339, Property '_url' does not exist on type 'PageProps'). The IDENTICAL edit at routes/admin/users/[id].tsx:292 was silent, because that file's `data` is loosely typed — the same defect detected in one file and invisible in the other, decided by the target's type strictness rather than by anything about the defect, and found only by grepping the tree for the pattern afterwards. 2 wrong of ~30 applications; the other 28 were params, catch bindings and array destructuring, where the hint is right. teamD / Portll-teamDRemote, reporter #29, 2026-09-04.
commitworkcommitworkpartial four instances fixed, one pinned by a test whose only job is the flag scoreBasis · 2026-09-06 no record proposedno proposal recorded
R9closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Unratcheted fix false_repair.unratcheted_fix CONTROLLER4 agentnot-providedfeedback-missingunassessed A fix lands with nothing pinning it, so its regression is invisible by construction. analogyA pothole is filled and the road comes off the inspection route. example594d16f is the exception that shows the rule: a test whose only job is to keep a --no-audit flag in place, described as remarkable.
commitworkcommitworkpartial bin/commit-phase.mjs warns when a change set touches source and no test — a warning at the one moment the pin can still be added, never a refusal bin/commit-phase.mjs warns when a change set touches source and no test — a warning at the one moment the pin can still be added, never a refusal present 2026-09-06; remaining: nothing distinguishes a behaviour change from a comment edit lexically, so this cannot refuse · 2026-09-06 no record proposedno proposal recorded
R10closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Invariant held by convention, not construction false_repair.invariant_by_convention IMPLEMENTER4 agentnonecontroller-algorithmunassessed The code satisfies an invariant only because of how every current caller happens to invoke it, and nothing pins the calling convention. analogyThe gate stays shut because everyone happens to close it, and no latch is fitted. examplemonitor/rollup.mjs reads CW_ANNOTATIONS at module load, which is safe only because every consumer spawns it as a child process; nothing tests that it is never imported.
commitworkcommitworkno-lever a precondition asserted by no caller has no lexical trace; held by review and by R10's own remedy, stating the convention at the callee lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
R11closureclosure 1 of 4: barely1gaingain 3 of 4: high3 No-op edit validates itself false_repair.noop_edit_self_validated IMPLEMENTER4 agentnot-providedactuator-missingunassessed A scripted edit applies replacements and validates the result without ever asserting that a replacement matched. A pattern that misses leaves a well-formed artifact and every downstream check passes. analogyThe proofreader confirms the page is still a page. exampleA python script performed three replacements on monitor/projects.json and asserted only that the result still parsed.
commitworkcommitworkpartial both instances fixed scoreBasis; no scripted edit asserts a match count · 2026-09-06 no record proposedproposed A ratchet over scripted .replace() edits on file content that never assert a match count. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
R12closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Exemption outliving its reason false_repair.exemption_outliving_its_reason IMPLEMENTER5 oversightapplied-too-longcontroller-algorithmunassessed A guard exempts a file for a stated temporary reason. The reason expires when the file lands or the co-session finishes, nothing re-evaluates the exemption, and the guard reports green over a site it stopped checking. analogyThe scaffolding permit renews itself after the builders leave. examplebin/test/one-mutex.test.mjs states the case in its own comment: a sibling test's DEFERRED map carried no expiry and let a landed file stay exempt.
commitworkcommitworkpartial UNTRACKED_ONLY expiry predicate at one site scoreBasis · 2026-09-06 no record proposedproposed A registry of exemption lists, each entry carrying an expiry predicate; requireExpires applied to every list, not only scanner annotations. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
R13closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Marker asserted, mechanism unasserted false_repair.marker_asserted_mechanism_unasserted IMPLEMENTER5 oversightunsafesensor-inadequateunassessed A guard signals its decision by setting a marker whose enforcement belongs to a second system. The test reaches for the marker because it is correct and easy to reach, and nothing asserts that anything obeys it. analogyThe inspector confirms the sign is posted and never tries the door. exampleadmin/serve.mjs set hidden on the WebAuthn button while a .sso display rule overrode it, and the suite asserted the attribute.
commitworkcommitworkpartial fixed at 2f7f530 and b267a99 scoreBasis · 2026-09-06 no record proposedno proposal recorded
R14closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Comment narrates a fixed defect as live false_repair.comment_narrates_fixed_defect IMPLEMENTER4 agentnot-providedfeedback-incorrectunassessed A defect is fixed at the call site and the block documenting it is left in the present perfect directly above the corrected line. Grepped or skimmed it asserts a live bug, and the damage is refused work rather than a missed defect. analogyThe out-of-order sign stays taped to the working lift. examplememory-layer-lib.sh carried the assertion at four sites naming curl -sf, which appears in no executable line, and two sessions declined work on it in one afternoon. THE DAMAGE INVERTS, and the inverted form is worse. Measured in teamD / Portll-teamDRemote by reporter #30, 2026-09-04: a TODO that predates a security fix reads as a GAP and invites the work that reverts it. license-management/index.ts:387 said to call a `create_license_materialization_job` RPC whose EXECUTE was granted to authenticated in 20251120230001 and REVOKED in 20260709000001 — the function runs as the authenticated user, so following the TODO returns 42501 on the request that takes the customer's money (corrected to a warning, c64584b). admin/users/[id].tsx:243 said to add permission synchronization logic that already existed as a SECURITY DEFINER path hard-refusing non-global admins; a second write path would have landed where the repo's IDOR fixes cluster (9a29cd1). Denominator: of 24 stub/TODO markers inventoried, 4 were actionable and 2 of those 4 were instructions to revert a security fix. Here the comment does not refuse work, it recruits it.
commitworkcommitworkno-lever whether a comment's mechanism appears in executable code is a reading, not a match; the class is held by review, and this repository measured clean by one lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedclosed — no proposal applies
R15closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Landed but not deployed false_repair.landed_not_deployed CONTROLLER5 oversighttoo-lateactuator-delayedunassessed A correct, merged, pinned fix does not reach running processes. Fixed and still failing are simultaneously true, and a reader told only the first hunts for a second defect that does not exist. analogyThe recipe is corrected and the kitchen still cooks from the printout. exampleA merged fix was consumed as in force while the running process still carried the old code. Measured instance, verified in both directions: psalm crashes on any PHP codebase referencing NAN because TLiteralFloat::getKey() builds 'float(' . $value . ')' and PHP >= 8.5 raises on the coercion, killing the Amp worker and failing the run — it took out 3 of 10 PHP repos scanned. The fix exists upstream and is not released: is_nan guards were added on the 6.x branch (ca15124, 9d6db9e, authored 2026-02-19), `git show 6.16.1:...TLiteralFloat.php | grep -c is_nan` returns 0 against 3 on 6.x HEAD, and the fix is not an ancestor of the 6.16.1 tag that brew and composer both resolve to. Swapping only that one file into a pristine 6.16.1 install takes the run from rc=1 to rc=0 in 43s, and restoring it reproduces the crash. Second instance, measured by probe rather than inferred from the commit: overwatch-layer e942994 landed a --settings seam at 2026-09-02T20:05 while the running server had started Sep 1 17:29, so the process silently accepts-and-ignores the parameter. Dispatching with a nonexistent settings path returns ok:true where the new code refuses with BAD_DISPATCH — the discriminator that separates "landed" from "in force". It would have been reported as an enforced security control had it been wired on the strength of the commit.
commitworkno record no record proposedno proposal recorded
R16closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Rule with no subscriber false_repair.rule_with_no_subscriber CONTROLLER5 oversightnot-providedactuator-missingunassessed An incident is fixed and the fix is accompanied by a stated rule, a comment, a ruling or an advisory hook, with no mechanism that can refuse a violation. The rule describes the past accurately and constrains the future not at all. analogyThe house rule is posted and nobody is on the door. exampleOne instance was closed at 1efe708 with a completeness test; the rules beside it have no subscriber and one recurred larger than before.
commitworkcommitworkpartial one instance closed with an enforcing test scoreBasis · 2026-09-06 no record proposedno proposal recorded
R17closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Repair scoped to the witness false_repair.repair_scoped_to_witness IMPLEMENTER4 agentunsafecontroller-modelunassessed A defect is found at one site and the fix is written against that site's shape rather than against the predicate the class states. It is believed complete because the witness passes, and the next run reproduces the class elsewhere. analogyThe leak is patched where the water showed. exampleA fix matched the observed instance's shape and the following run surfaced the same class at a different site. Measured instance with site and count: renaming a redacted identity across commitwork changed 286 occurrences in 73 files plus 8 git mv renames, written against the observed lowercase shape; the next measurement found 4 occurrences of the capitalised form surviving in 3 files (bin/ab-loop.mjs, lib/memory-layer-client.mjs:2 and :269, schema/memory-layer-contract.schema.json:4). The guard could never have caught it: bin/test/release-names.test.mjs tests for the ORIGINAL name, not for the residue of its own remediation. A second instance the same day: overwatch-layer/.githooks/pre-commit unsets seven GIT_* variables around its npm test step and explains why, while the artifact-gate step twenty lines above does not — same artifacts, same instant, clean environment 14/14 pass, GIT_DIR set as git leaves it for a hook 1 of 14 fails. A third: a dead import was fixed in the one file that broke, while commitwork's tracked docs cite 63 code paths of which 4 are dead (161af57). THE BOUND IS THE SCOPE, and this form is decidable before the next run rather than after it. Measured 2026-09-18 in the commitwork host sandbox (bin/lib/sandbox.mjs, symlinkReads). A denied read of a symlink at depth 1 was repaired by walking the tree two levels, which passed its fixture; the next denial on the real checkout was a link at depth 3, repaired by walking four levels, which passed its fixture too. Each bound was minted from the failing instance and each fixture was built at the depth of the last failure, so the fix was exactly one instance behind the next occurrence, twice. The problem has no depth: it is every symlink the tool may reach. The landed walk is unbounded over the exclusion set the scanners already use and resolves 6 targets in 263 ms (fb30256f), and the file now carries the fact as a comment, that every depth cap missed one. Counted on the checkout at ruling: 25 links, of which 15 sit under reports/ and .claude/worktrees/ and are skipped by that same list. THE TELL, which is the contribution and is cheaper than R17's own: the number in the fix appeared nowhere in the problem statement. A literal bound introduced by a repair must cite where in the problem it comes from, and a bound whose only source is the failing instance is refused. Separations supplied by the reporter and checked here: R3 is the OUTCOME rather than the mechanism; K10's bound is inherited from a namespace the reconciler can enumerate; M14's bound is copied from a neighbouring path. This bound is minted fresh from the witness, which is this row.
commitworkcommitworkno-lever whether a repair matches the witness or the class predicate is judged against the predicate; held by the minting rule and by review lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
R18closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Remediation record outliving its defect false_repair.register_outliving_its_defect CONTROLLER5 oversightapplied-too-longcontroller-modelunassessed The defect is fixed in the system and the register, plan or advisory carrying it still describes it as open. The mechanism is correct and the record is stale — the exact inverse of R16, where the rule is correct and no mechanism enforces it. Three properties make it expensive rather than untidy: the divergence is created BY the fix, so the moment of error is a moment of success and no author reviews it; nobody edits the record, so it turns false while sitting untouched and every diff-based or authorship-based check is structurally blind to it; and it is detectable only by EXECUTING the register, never by reading it, because a stale item is indistinguishable from a live one by inspection. Separable from C10, where a DESCRIPTION outlives the truth, from R12, where an EXEMPTION outlives its reason, and from A15, where a LEVER outlives its subject: this is an INSTRUCTION outliving its need, and the harm arrives when somebody follows it. analogyThe map still marks the bridge as out, so everybody fords the river. examplebin/gate-ratchet-core.mjs already branched advice on ownsIt while an item described that behaviour as unimplemented; implementing the item as worded would have re-inverted a working guard. A second instance hours later, offered as evidence it is not rare: an open item to add a `paused` classification to GATE_REGISTRY, where the change already existed uncommitted in the tree and the test believed red passed 6 of 6.
commitworkno record no record proposedproposed Every remediation register item carries an executable check; a test runs each check and refuses an OPEN item whose check already passes. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06

IVFalse provenanceP1–P17 The false proposition: “and it is theirs / yours” membership testA record names who or what produced something, or is consumed as if it did, and the naming is not supported by what that record can actually observe. The subject is AUTHORSHIP or OWNERSHIP. A row about whether a number is right belongs to family V.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
P1closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Blame under concurrency false_provenance.blame_under_concurrency CONTROLLER4 agentnoneprocess-disturbance6 attentionunsafe / actuator-corruptunassessed A shared tree makes every writer look like the current one. analogyA shared kitchen has one sink, and the last person seen at it answers for every dish. example447 commits on main carry four author identities, all one human, and no git metadata distinguishes an agent session. Measured instance: the ratchet Stop hook told reporter #13 "these are not inherited problems — the numbers went up while you were working" (56 → 61 anchors) on every turn for roughly ten hours, while the SAME gate's companion output in the SAME turn read "Dirty files YOU touched (0): (none)" and named four other sessions as owners. Both statements were true; the accusatory one was the one framed as actionable. 13 files carried the drifted anchors, the session had touched 23 files, and the intersection is empty — the attribution was available in-repo the whole time and the alarm did not consult it before accusing. The gate offered --baseline on every firing, so the correct response was to refuse it roughly forty times, which is indistinguishable from ignoring a real alarm.
commitworkcommitworkpartial attribute before accusing (5d02cd4) scoreBasis · 2026-09-06 no record proposedno proposal recorded
P2closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Shared-index capture false_provenance.shared_index_capture CONTROLLER4 agentunsafecoordination-conflictunassessed The git index is process-global, so a bare commit takes whatever any session staged. analogyA parcel goes to the post with whatever the housemates left by the door inside it. example6513938's message describes a one-line projects.json fix and carried five files and 74 insertions; two sessions then spent a day believing those hunks were unlanded.
commitworkcommitworkimplemented bin/commit-phase.mjs: per-session index, read-tree immediately before landing, compare-and-swap update-ref; four test files files present, verified 2026-09-06; remediation register #1 still reads OPEN from 2026-08-29 and predates it (an R18 instance); adoption is the remaining gap · 2026-09-06 no record proposedproposed Everything. Three specific cautions for whoever implements it: 1. DO NOT implement the export half alone. The item's own `risk` field says "Trades P2 for R8 unless the pre-commit refresh lands with it", and the `note` explains why: a private index built from… (next step of R1) effort Low · remediation register #1, REMAINING · 2026-09-06
P3closureclosure 1 of 4: barely1gaingain 4 of 4: biggest available4 Authorship inferred from contact false_provenance.contact_as_authorship CONTROLLER4 agentnonesensor-inadequate6 attentionunsafe / actuator-corruptsame-defect-as→ A9same-defect-as→ P4 "Touched this file" is read as "authored this hunk". analogyThe person who dusted the piano is credited with the tune. exampleHunk ownership identified by counting Write/Edit calls per file across transcripts, on a tree five sessions had edited that day.
commitworkcommitworkpartial R2 — Record hunks, not files, in the touch ledger remediation register #2: PARTIAL 2026-08-29 (3759563) — PARTIAL, not DONE, and not OPEN — the item has two halves and exactly one landed. Half one (record hunk content hashes) is genuinely DONE by the strict bar: the mechanism exists… · 2026-09-06commitworkpartial attribution plan — Hunk staging: Extend the PostToolUse record with a content hash per written hunk, ranges kept only as a search hint; bin/stage-mine.mjs finds those hunks by hash… attributionPlan "Hunk staging": PARTIAL 2026-08-29 (3759563) — Not DONE: the item has two named deliverables and only one exists. bin/stage-mine.mjs is absent by four independent checks, and no `git apply --cached` staging path exists anywhere in code (the only `git… · 2026-09-06 no record proposedproposed bin/stage-mine.mjs — absent entirely. Needs to locate a session's recorded hunks by content hash in the current diff and apply them with `git apply --cached`, leaving the working tree intact for the file's other authors. Must retur… (next step of R2) effort Med · remediation register #2, REMAINING · 2026-09-06
P4closureclosure 0 of 4: not solved0gaingain 4 of 4: biggest available4 Propagated unverified attribution false_provenance.propagated_attribution CONTROLLER4 agentunsafehigher-input6 attentionunsafe / actuator-corruptsame-defect-as→ A9same-defect-as→ P3 One agent relays another's unchecked claim, which gains authority by relay. analogyA rumour gains weight each time it passes through someone who did not check it. exampleA named accusation rebroadcast to fifteen sessions; four denied being the named owner before the premise was rechecked.
commitworkcommitworkunassessed R20 — Cite the transcript, display the name: every actor citation carries the id that survives a restart remediation register #20: no status recorded — never audited against the code · 2026-09-06commitworkopen attribution plan — Messaging: Require an attribution receipt — the basis, the sessions considered and the check that was run — inside any message naming another session. A… attributionPlan "Messaging": OPEN 2026-08-29 — OPEN, not PARTIAL, and the negative is clean rather than inferred. Reachability: I enumerated every hook group in both settings files this project loads (18 total, the full population) — exactly one is PreToolUse and it… · 2026-09-06 no record proposedno proposal recorded
P5closureclosure 2 of 4: part-solved2gaingain 1 of 4: marginal1 Comparator-level attribution error false_provenance.comparator_error IMPLEMENTER2 monitornonefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed The instrument deciding whose a change is is itself wrong. WIDENED at edition 17 from attribution comparators to comparators generally: the instrument deciding whether two readings are comparable is itself wrong, whether or not the question is whose a change is. analogyTwo clocks in different timezones are compared by the numbers on their faces. exampleattributeFiles compared git's local-offset %cI against the ledger's UTC Z as strings; re-run through the fixed comparator, 5/12 became 12/12. Second instance, outside attribution, reported 2026-09-06 by the session that made it and then withdrew its own proposal to mint a general frame-mismatch row on finding this one: a process start time in UTC was subtracted from the same process start time in local ACST (+0930), the 9h30m difference was published as "the MCP server restarted mid-session" with a mechanism invented to explain it, and both processes had started at the same instant. It reached a peer fleet plan as stage 1.4 before it was caught; retracted at 4e97f0e. The off-diagonal that forecloses M9 is theirs and is the reason this is not an ambient-environment row: one field is milliseconds and the other seconds, so comparing 1788680976756 with 1788680976 is the same mechanism with ZERO ambient variable, and capturing the environment cannot repair it. The rule is to normalise to base units before subtracting, and to treat "both of these look like times" as insufficient grounds to subtract at all.
commitworkcommitworkpartial attribution plan — Logs: Record basis (declared | ledger | committed | none), the sessions considered, and the boundary timestamp used. Accuracy then splits by basis, which… attributionPlan "Logs": PARTIAL 2026-08-29 — Not DONE: none of the three things the item names is on the journal record in the form asked. There is no `basis` field anywhere on either gate's record — the field census over the full journal population (1,807… · 2026-09-06 no record proposedno proposal recorded
P6closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Co-ownership unrepresentable false_provenance.co_ownership_unrepresentable IMPLEMENTER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed A two-valued lattice forces shared files onto one side. analogyA form asks for one parent's name for a child who has two. exampleFiles edited by two live sessions had to resolve to mine or theirs, with no state for both.
commitworkcommitworkpartial attribution plan — Simultaneous work: Carry shared through to the alarm text and the journal record, and treat shared as a first-class claim with both session ids named rather than as a… attributionPlan "Simultaneous work": PARTIAL 2026-08-29 — Not DONE: the item asks about two surfaces (alarm text, journal record) across two consumers, and only two of those four cells are filled — and they are diagonal, not paired. gate-tests carries shared/undetermined… · 2026-09-06 no record proposedno proposal recorded
P7closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Right about files, wrong about ownership false_provenance.file_level_blindness CONTROLLER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed File-level attribution cannot see cross-file semantic coupling. analogyThe cook touched none of the ingredients and wrote the recipe that spoiled the dish. exampleA gate reported "you touched 0 of 18 files" — true — while the failure genuinely was the session's: another session's new rule landed on a category this session had added.
commitworkcommitworkno-lever cross-file semantic coupling needs a reader of intent lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
P8closureclosure 3 of 4: solved, unpinned3gaingain 0 of 4: nothing on the table0 Lost update between oversight writers false_provenance.lost_update IMPLEMENTER5 oversightunsafecoordination-conflictunassessed Two or more writers share one ledger under read-modify-write; renameSync makes each write atomic and the cycle is not, and the defect belongs to the pattern rather than to any one store. analogyTwo people fill in the same paper form, and whoever files second erases the other answers. example34 of 40 rounds lost a record under one shared JSON object; 0 of 40 under one file per key. 6a9f6dd (2026-08-21) reproduced the identical defect in cra/cases.json with real processes: 8 acks reported success, 1 event in store, 7 lost, and the chain verified clean over the loss.
commitworkcommitworkpartial one file per key on the gate store and a lock on the CRA chain; bin/test/one-mutex.test.mjs scoreBasis: closed on two stores, and nothing enumerates the shared ledgers that remain · 2026-09-06 no record proposednothing on the table — no proposal applies
P9closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Ownership asserted by reasoning false_provenance.ownership_by_reasoning CONTROLLER4 agentnonecontroller-model6 attentionunsafe / actuator-corruptunassessed A 30-second empirical check is replaced by an inference. analogyA neighbour is named as the one who moved the bins, on the strength of who seemed likely. exampleAttribution argued from what a session believed it had edited, where a worktree at first-commit~1 would have settled it.
commitworkcommitworkopen attribution plan — Task acquisition: Claim paths on task start, release on completion, and reap stale claims on a deadline. Gates consult declared claims first and fall back to the… attributionPlan "Task acquisition": OPEN 2026-08-29 — Not PARTIAL and not merely "unwired module" OPEN — this is below the unwired-module floor. The bar for PARTIAL would be a claims reader that exists but is unreachable, or a basis field written but never read. Neither… · 2026-09-06 no record proposedno proposal recorded
P10closureclosure 0 of 4: not solved0gaingain 1 of 4: marginal1 Warrant decay on citation false_provenance.warrant_decay CONTROLLER4 agentnoneprocess-change6 attentionunsafe / actuator-corruptunassessed A tiered warrant stated once, at the end, is stripped the moment a row is quoted. analogyA remark attributed to 'someone at the meeting' is quoted a week later as the minutes. exampleDerived; the transcript-warranted rows A9, P3 and P4 sit in the same tables as tree-verified ones and travel without their tier.
commitworkcommitworkopen attribution plan — Reporting: Print the basis and the count of sessions considered on every attributed alarm, and make gate --tally group firings by basis. attributionPlan "Reporting": OPEN 2026-08-29 — Neither of A6's two named deliverables exists. (1) No `basis` value exists anywhere in the attribution pipeline — not as a computed field (gate-tests-core.mjs:72 returns none), not on any alarm string… · 2026-09-06 no record proposedno proposal recorded
P11closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Layer misattribution false_provenance.layer_misattribution CONTROLLER4 agentunsafecontroller-modelunassessed A controller defect is repaired in the implementation, or the reverse, so the fix lands in code that was already correct. analogyThe plumber replaces a sound pipe because the ceiling stain appeared beneath it. exampleThe first worktree-leak repair edited the pruning code when the defect was in the lifecycle: who owns cleanup when a process dies.
commitworkno record no record proposedproposed The issue store carries the taxonomy layer of each defect so a fix can be checked against the layer it lands in. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
P12closureclosure 1 of 4: barely1gaingain 4 of 4: biggest available4 Untracked-path co-authorship false_provenance.untracked_path_co_authorship IMPLEMENTER4 agentunsafecoordination-conflictunassessed One untracked file is multi-author, so committing it whole banks every session's content; the index-safe pathspec form is no defence because it commits the full content of each named path. analogyA shared shopping list goes to the till whole, and one person pays for everyone under their own name. exampleb3584ce needed the minify canary from bin/test/scanner-canary.test.mjs and carried three sessions' canaries for six formats under a message naming only minify.
commitworkcommitworkpartial R2 — Record hunks, not files, in the touch ledger remediation register #2: PARTIAL 2026-08-29 (3759563) — PARTIAL, not DONE, and not OPEN — the item has two halves and exactly one landed. Half one (record hunk content hashes) is genuinely DONE by the strict bar: the mechanism exists… · 2026-09-06commitworkpartial attribution plan — Hunk staging: Extend the PostToolUse record with a content hash per written hunk, ranges kept only as a search hint; bin/stage-mine.mjs finds those hunks by hash… attributionPlan "Hunk staging": PARTIAL 2026-08-29 (3759563) — Not DONE: the item has two named deliverables and only one exists. bin/stage-mine.mjs is absent by four independent checks, and no `git apply --cached` staging path exists anywhere in code (the only `git… · 2026-09-06 no record proposedproposed bin/stage-mine.mjs — absent entirely. Needs to locate a session's recorded hunks by content hash in the current diff and apply them with `git apply --cached`, leaving the working tree intact for the file's other authors. Must retur… (next step of R2) effort Med · remediation register #2, REMAINING · 2026-09-06
P13closureclosure 0 of 4: not solved0gaingain 4 of 4: biggest available4 Ledger blind to write path false_provenance.ledger_blind_to_write_path IMPLEMENTER5 oversightunsafesensor-inadequateunassessed Attribution is computed from a ledger fed only by tool-mediated writes, so an edit made through a shell heredoc, a codemod or git apply never reaches it. Tool choice decides apparent authorship. analogyThe visitor book records everyone who used the front door. examplebin/gate-ratchet.mjs attributes open findings from .claude/store/touches.jsonl, which records Edit and Write hooks and nothing else.
commitworkno record no record proposedproposed Union the touch ledger with git authorship per path and report every path git changed that the ledger never saw. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
P14closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Settled decision relayed as open false_provenance.settled_decision_relayed_as_open CONTROLLER1 operatortoo-latefeedback-delayedunassessed A session records a decision as blocked on the operator, the operator decides, and other sessions holding the earlier state relay it onward as still outstanding. A blocked-decision claim is an ask rather than an assertion, so nothing checks it. analogyThe message keeps arriving after the answer has been given. exampleThis session verified before relaying by discipline rather than by any mechanism, while the superseded state was still being carried forward elsewhere.
commitworkcommitworkno-lever a relayed blocked-on-operator claim is text between sessions; the decision record is machine-readable and the relay is not lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
P15closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Record cannot answer its own question false_provenance.record_cannot_answer_its_question IMPLEMENTER5 oversightunsafesensor-inadequateunassessed The ownership oracle records faithfully and its schema cannot hold the answer. It stores who and when at a precision below the question being asked, so an attribution query is answerable only by an undeclared join to a second source. analogyThe guest book records the day and the question is about the hour. exampleThe touch ledger stores session and file and carries no model or read-write discriminator, so an attribution question cannot be answered from it alone.
commitworkno record no record proposedproposed Add the model field and the read-write discriminator to the touch ledger schema, as the basis names. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
P16closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Attribution to an untouched subject false_provenance.attribution_to_untouched_subject IMPLEMENTER5 oversightunsafefeedback-incorrectunassessed A ledger records an event against a subject the event never touched, so lookup returns nothing for the real one and names an innocent one instead. Distinct from P13, where the write never reaches the ledger, and from P5, where the instrument misjudges WHOSE a change is: here the instrument is right about the actor and wrong about the subject, so nothing in the attribution layer is faulty and the record is still false. An absence is recoverable by looking elsewhere; a confident wrong name is not, because nothing prompts the reader to look. analogyThe visitor book has a name in it, and it is the wrong visitor. exampletouches.jsonl recorded x:"admin/serve.mjs" for a shell heredoc that edited sitemap/README.md. Grepping the ledger for the five documents that session actually edited returned 0 rows, while the row that did the work pointed at a file it never opened. Second instance, counted and load-bearing: .claude/store/touches.jsonl carried via:"commit" write rows for five filenames (mine.txt, s.sh, new.sh, new.txt, f) that exist nowhere under ~/Repositories at any depth — the basename-collapse hypothesis was tested and refuted. 31 of 31 sessions carried the identical five phantom names, and 1,536 via:"commit" rows hold a bare filename with no directory, mixing genuine root files with these, which is why it read as normal. bin/gate-spine.mjs BLOCKED a session close on the five. Fixed 2026-09-01 at c73bedd. Second denominator over the same defect, measured independently: mine.txt 692 rows, s.sh 202, new.sh 200, new.txt 199 — about 1,293 rows carrying via:"commit" with content hashes, for files that exist nowhere in the repository. c73bedd's own subject states the magnitude: "a third of it was test fixtures, and one gate read them as your edits."
commitworkcommitworkpartial via:"commit" rows fixed at c73bedd (2026-09-01); bin/gate-spine.mjs blocked a session close on the five; bin/touch-ledger.mjs remains unowned scoreBasis · 2026-09-06 no record proposedno proposal recorded
P17closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Two identifier spaces in one citation notation false_provenance.two_identifier_spaces_one_notation CONTROLLER4 agentunsafecoordination-gapassessed-none A citation slot accepts tokens drawn from two different identifier spaces with no notational difference between them, so a reference that looks pinned is well formed, unique and still resolves to the wrong actor. Distinct from L8, which needs a CONTENDED identifier: every token here is unique, and the failure sits upstream of contention, in a bracket that disambiguates a name without encoding which namespace its contents belong to. analogyThe catalogue records a shelf number and an accession number in one column. exampleMeasured on this registry. Over the four class text fields, 105 citations carry the agent-ref bracket and 6 classes carry a token that is a transcript prefix in the ref slot rather than an agent ref: C2, A10, D1, D15, M23 and G25. Both remedies proposed for it were withdrawn by their own proposer on measurement, which is why the row exists rather than the fix. Requiring the ref fails because the ref changes on resume: one transcript was recorded as one six-hex ref under pid 94516 on 2026-09-08 and as a different one under pid 59150 on 2026-09-16. Citing the transcript prefix fails because a transcript id is not unique either: on 2026-09-06 one transcript was held by two live processes at once, pids 99699 and 76259, after an editor restart left the old process running, and L8 example already cites the second of them. The surviving remedy is five parts: label which identifier space a bracketed token belongs to; address by the live name plus a ref re-read immediately before sending; correlate across renames by transcript prefix and never address or key ownership on it; use session id, pid and process start together where one identity is needed; and attribute in an example or scoreBasis to the artefact, a sha, a change set or a touch-ledger row, with any session name carried only as a readable label. bin/test/taxonomy-citations.test.mjs now refuses the shape, so this row cannot carry a specimen of it: the row is gated by a test that would reject its own example.
commitworkno record no record proposedno proposal recorded

VFalse measurementM1–M29 The false proposition: “and this number means what it says” membership testA published quantity, comparison, denominator or scope is arithmetically and procedurally sound, and does not measure the thing its consumer reads it as measuring. The subject is a NUMBER or a comparison, and the arithmetic is not in dispute.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
M1closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Wrong population false_measurement.wrong_population CONTROLLER2 monitornonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed A real number describing a different tree, scope or time is used as if it described this one. C3 is this mechanism's false-clean-producing case; a wrong population can just as easily produce a false alarm, a wrong ranking, or a wrong headline — M1 is the general form. analogyA survey of one street is published as the opinion of the city. exampleA registry default of monitorOutput: "teamA-monorepo" answered "I cannot resolve an area" with one customer's report directory, across six call sites including the CRA evidence pack. Measured instance caught pre-ship, repo teamDRemote: a count lookup answered a multi-location audience FROM THE PRIMARY LOCATION ALONE. One pick plus a picks array still reads as a valid single-dimension lookup, so the existing guard — which correctly refuses multi-dimension queries because summing would double-count — let it through. A two-suburb audience reported one suburb's count, and that figure is what a customer's purchase decision anchors on. Fixed 9a29cd1.
commitworkcommitworkpartial monitor/area.mjs throws where consumers used to guess (b1bfceb, be776bc) scoreBasis · 2026-09-06 no record proposedno proposal recorded
M2closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Stale by the time it is used false_measurement.stale_at_use CONTROLLER2 monitortoo-latefeedback-delayed6 attentiontoo-late / actuator-delayedunassessed Correct when taken, invalid when acted on. analogyA timetable is read on the platform after the schedule changed at midnight. exampleSix minutes of measurement in one morning saw three different HEADs and a failing set that changed twice. Measured instance in this registry's own read path: the SQLite projection reported 179 classes while the JSON source held 188, in the same minute on 2026-09-02, and the documented `taxonomy-db.mjs --sql` path would have reported nine live classes as absent. It warns loudly when read through the CLI; a consumer piping the JSON or querying the file directly sees no warning at all. Second instance, produced while diagnosing another class: a session read a failure list from a suite run that had started thirty minutes earlier, attributed six dangling import pairs from it, and five of the six had already been repaired by peers before it looked. The downstream cost of that same stale projection, measured rather than predicted: a session reading P4 and M2 through it found them "barer than they are", nearly filed evidence onto rows that already carried instances, and caught it only by re-reading the live JSON. The registry moved 188 to 195 classes in the few hours between one session's first read and the rebuild. Two instances, 2026-09-24. An improvement-loop pass excluded three sitemap backlog items as blocked because their entries read 'depends: B2' and 'depends: B3', while the same backlog recorded B2 and B3 as DONE a few lines above; the dependency note was true when written and was used without re-reading its target, and a review agent caught it. A vscode-skills plan listed all four tasks of a history rewrite as pending after three had run, and an evaluation agent reported the rewrite as about to happen. Measured by reporter #1 2026-09-24.
commitworkno record no record proposedproposed A meta-test over schema/*.json requiring a timestamp field on every record-type schema, so no consumed record can lack an observation time. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
M3closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Measured through a broken instrument false_measurement.broken_instrument IMPLEMENTER2 monitornonefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed The comparator, parser or probe under the metric is wrong. C5 is this mechanism's false-clean-producing case (an instrument that lies quiet, suppressing what's there); this class also covers instruments that lie loud, inflating what isn't — as in its own example below. analogyAn uncalibrated bathroom scale reports a weight gain for everyone in the house. exampleEighteen stale worktrees under .git/ were re-scanned as the repo, so commitwork reported 1753 findings where five were real. Measured instance where three readings from one instrument were all internally consistent and all wrong: scrubbing an operator path out of a 39GB reports/ tree, `grep -rlIE` returned 7025 files, exit 0, no warning. A direct find/exec over the same subtree found 1584 history files carrying the path where the recursive grep had accounted for 631 — the instrument saw 40% of that population. A post-scrub run then reported 138 remaining and chain.jsonl: 0 while every one of the 10 chain.jsonl files demonstrably contained the string. Whole-tree undercount unquantified, because no trustworthy total was ever obtained from it. Second instance, a fabricated count from a grafted history: `git rev-list --left-right --count <base>...HEAD` on a SHALLOW clone reported 276 behind where the forge's compare API reported ahead_by=2, behind_by=0 — and the trees were provably identical, `<base>^{tree}` in one clone hash-matching the other clone's `HEAD^{tree}` exactly (651ff292bf846f12436ecf4b214c36dea2f9160b). The shallow graft cuts the common ancestry, .git/shallow exists, and no command mentions it.
commitworkcommitworkpartial worktree prune hoisted to top level (c5410b9) scoreBasis · 2026-09-06 no record proposedproposed Require a second method over a subtree small enough to enumerate exhaustively before any coverage or completion figure is published. effort Med · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
M4closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Metric self-dealing false_measurement.self_dealing CONTROLLER5 oversightunsafefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed The measurement improves because its author wrote the answers into the ledger. analogyA student marks their own exam and the class average rises. exampleTwelve synthetic attributionCorrect records would have moved the headline from 14.3% to about 62% with no new decision judged; declined and recorded as declined.
commitworkno record no record proposedproposed A census joining the verdict journal to the touch ledger: entries whose author session also edited the metric's implementation are listed. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
M5closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Unmeasurable by construction false_measurement.unmeasurable_by_construction IMPLEMENTER2 monitornonesensor-inadequateunassessed No seam exists, so the metric is only ever observed on whatever the tree happens to be doing. analogyThe greenhouse has no thermometer, so the temperature is judged from how the plants look. exampleNeither gate's ledger path was env-overridable, so claim accuracy could only be observed against the live tree.
commitworkcommitworkpartial bin/test/lexical-ratchets.test.mjs: a module-scope `const X = process.env…` is a ratchet offender — 47 held at arming, which is the CLAUDE.md read-at-call-time invariant measured for the first time; the earlier zero came from a git grep whose \\b the platform does not support bin/test/lexical-ratchets.test.mjs present 2026-09-06; remaining: Date.now, Math.random and locale reads, and env reads inside functions with no CW_* seam, are outside the lexical reach · 2026-09-06 no record proposedno proposal recorded
M6closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Contaminated in the flattering direction false_measurement.flattering_contamination CONTROLLER2 monitornoneprocess-disturbance6 attentionunsafe / actuator-corruptunassessed A favourable result was produced under conditions later found invalid. analogyA taste test serves one dish warm and the other cold. exampleThe triage benchmark's two frontier rows were fed house context the locals never saw, because claude -p loads CLAUDE.md from cwd.
commitworkcommitworkno-lever only a later invalidation establishes contamination; nothing in the tree can anticipate it lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M7closureclosure 4 of 4: solved and pinned4gaingain 0 of 4: nothing on the table0 Cardinality drift false_measurement.cardinality_drift CONTROLLER4 agentnonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed The catalogue's own class count is not checkable from the catalogue; ids exist only in prose. analogyA recipe folder has no index, and two cooks count a different number of recipes. exampleOne reader counted 49 classes and a regex over the tables counted 51; neither was wrong on the evidence available to them.
commitworkcommitworkimplemented the registry computes its counts and validates numbering on every render (bin/taxonomy-render.mjs validate()) scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
M8closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Instrument non-completion false_measurement.instrument_non_termination IMPLEMENTER3 scannerstopped-too-soonprocess-failure6 attentionnot-provided / actuator-missingunassessed The instrument does not finish, or stops before finishing, and either way produces no findings and no failure, so the absence is scored as a clean run. Two signs of one defect: a scan applied too long, running past any deadline with its marker standing, and a scan stopped too soon, dead with its marker standing and nothing published. analogyThe stocktake starts in the back room and either never finishes or the counter goes home at noon, and the shelves go down as counted either way. exampleA multiline regex scan over YAML backtracked catastrophically and pegged a core for 14+ minutes. monitor/sweep-health.mjs header, measured 2026-08-20: the genuinely hung markers (teamA pid 36023, teamB pid 90944) had dead pids, nothing running at any age, nothing published. The counter-instance on 2026-08-23: a 605-minute healthy teamA run that monitor/liveness.mjs labelled HUNG for about 6 hours against the 4 h INFLIGHT_MAX_MS_DEFAULT (liveness.mjs:29), which a reader acted on. The two together are why sweep-health discriminates on pid and not age. Measured instance where the non-completion was structural rather than slow: a wait loop `until grep -qE "Successfully installed|ERROR" <log>; do sleep 10; done` was backgrounded to wait on a pip install that had been run with `pip -q`, which never emits "Successfully installed". The predicate could not become true for a SUCCESSFUL install — the only exit was the failure branch — and a spinning monitor and a slow install produce identical output, which is silence.
commitworkcommitworkpartial R14 — Give every scan a timeout and a no-output-is-not-clean check remediation register #14: PARTIAL 2026-08-29 (f7df596) — Not OPEN and not a module-exists mirage: the mechanism is real, production reaches it from both entry points, and the tests assert the effect rather than a marker. I ran them. check-timeout.test.mjs kills a… · 2026-09-06 no record proposedproposed bin/commitwork.mjs cmdScanImages (:2229-2290) — the real hole. Give the three trivy spawns a bound: build `{ timeoutSec: checkTimeoutSec({}), ... }` and route them through runShell, or at minimum pass `{ timeout, killSignal: 'SIGKILL' }` to each spawnSync at… (next step of R14) effort Med · remediation register #14, REMAINING · 2026-09-06
M9closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Ambient-environment dependence false_measurement.ambient_dependence IMPLEMENTER3 scannernoneprocess-disturbanceunassessed Behaviour depends on locale, timezone, HOME, PATH, or host load and concurrency, which no artifact records, so a result is unreproducible without a variable nobody captured. analogyA recipe that works in one kitchen fails in another, and the altitude is written down nowhere. exampleA re-measurement over 400 judgeable gate records returned 222 undecidable, dominated by the validity guard rather than by missing evidence: about fifteen tests read the live fleet, so re-running a pinned sha does not reproduce the run the gate made. The code is pinned and the environment is not. 71bbfee (2026-08-22) is the load instance: eleven sweeps at once, load 87, 1 GB free of 48, and no artifact records either; "Every one of those sweeps reported success. They measured a contended box and took all morning doing it."
commitworkcommitworkpartial R17 — Re-measurement must correspond by name, never by count remediation register #17: PARTIAL 2026-08-29 — The item splits cleanly into the half it names and the half its NOTE asks about, and they land on opposite sides. ADJUDICATOR HALF — the mechanism exists, production reaches it, and production has exercised it, but… · 2026-09-06commitworkpartial bin/test/lexical-ratchets.test.mjs: module-scope process.env reads are a ratchet offender (47 held at arming) the same detector as M5; Date.now/Math.random/locale at module scope are not yet in it · 2026-09-06 no record proposedproposed Assert the adjudicator's guard. Add cases to bin/test/adjudicate-gates.test.mjs where measured.names ∩ recorded = ∅, one per call site (bin/adjudicate-gates.mjs:197, :219, :234), each asserting `v.undecidable` is set and `v.truth`/`v.attributionCorrect` are… (next step of R17) effort Low · remediation register #17, REMAINING · 2026-09-06
M10closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Loss in the denominator false_measurement.loss_in_denominator IMPLEMENTER2 monitorunsafefeedback-incorrectunassessed A ratio divides a quantity measured on the source by one measured on the product, so a truncating stage collapses the denominator and improves the ratio. Severity of data loss correlates with apparent success. analogyThe shipping line reports better fuel economy after losing half the cargo. exampleA tar stream piped to zstd reported 56.7x compression; the tar had truncated, and the ratio rose because the product shrank.
commitworkcommitworkno-lever a conservation assertion is per ratio and per stage; no general form exists, and no ratio here declares its stage lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M11closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Definitional circularity false_measurement.definitional_circularity IMPLEMENTER2 monitorunsafecontroller-algorithmunassessed A coverage metric derives its denominator from the numerator's own source, asking which subjects a tool covers and answering by looking for the tool's output. Every subject processed cleanly leaves the denominator. analogyThe census counts the households that answered the census. exampleadmin/routes/determinations.mjs computed reachability coverage as 234 of 263 by treating repos where govulncheck produced rows as repos govulncheck covered.
commitworkcommitworkpartial instance fixed at 65e5ceb scoreBasis · 2026-09-06 no record proposedno proposal recorded
M12closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Ruling published beside its data false_measurement.ruling_beside_its_data IMPLEMENTER2 monitorunsafecoordination-gapunassessed A decision reclassifies part of a dataset and is recorded as a sibling structure while the governed records stay unmarked. A consumer reading the data instead of the ruling re-admits the ruled-out population. analogyThe recall notice is filed next to the shelf and the stock keeps its old label. exampleD4 ruled stubs a metric and METRIC_CATEGORIES in monitor/extractors.mjs publishes the ruling as rollup.metrics, while rollup.scannerFindings.stubs remains a bare array of 33,001 rows carrying no mark.
commitworkno record no record proposedproposed A ruling in evaluations/DECISIONS.md that reclassifies records names them, and a test asserts each named record carries the ruling id. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
M13closureclosure 3 of 4: solved, unpinned3gaingain 1 of 4: marginal1 One concept, many shapes false_measurement.one_concept_many_shapes IMPLEMENTER2 monitorunsafecoordination-duplicatesame-defect-as→ M22 Several producers model the same concept and each declares its own shape. Every instance is locally correct, no two compose, and a consumer cannot count the concept once. analogyEach department records the same date in its own calendar. exampleFifteen distinct terms modelled the single concept this is not a result across monitor/ and bin/, among them nosrc, noscan and norules.
commitworkcommitworkpartial monitor/unknown.mjs: one boolean and a closed reason set scoreBasis · 2026-09-06 no record proposedno proposal recorded
M14closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Bound copied without its cause false_measurement.bound_copied_without_cause IMPLEMENTER3 scannerunsafehigher-inputunassessed A resource bound is copied from a neighbouring code path without checking that the causing mechanism transfers. It is then disclosed honestly in the denominator, so every grey-is-not-green rule is satisfied while coverage is narrowed for no reason. analogyThe new branch keeps the old branch's short opening hours and nobody remembers why they were short. examplebin/pattern-scan.mjs capped citation resolution at 400 distinct SHAs and recorded the shortfall as 146 occurrences beyond the cap, a limit inherited from a sibling path.
commitworkcommitworkno-lever whether a bound's cause transfers is a reading of the neighbouring code lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M15closureclosure 3 of 4: solved, unpinned3gaingain 1 of 4: marginal1 Implicit tool state changes the subject false_measurement.implicit_tool_state IMPLEMENTER4 agentunsafeprocess-changeunassessed An agent's shell keeps one process alive across calls, so a directory set in one call persists into the next. A later command naming no directory resolves against the earlier one and answers correctly about the wrong object. analogyThe second question is answered about the first room the visitor walked into. exampleA cd into a detached worktree carried into a later git query, which answered accurately about a tree the author had stopped meaning.
commitworkcommitworkpartial the shell-cwd guard is a user-scope Bash hook outside this repository scoreBasis; the hook fired in this session on every `cd` · 2026-09-06 no record proposedno proposal recorded
M16closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Empty selector read as everything false_measurement.empty_selector_read_as_all IMPLEMENTER4 agentunsafecontroller-algorithmunassessed A query returns zero rows for a benign reason such as a wrong field name or an unsplit shell variable, and that empty result is passed as the selector to a second command which reads an empty selector as no filter. analogyThe order says pick the listed crates and the list is blank. exampleBoth observed instances were caught by re-deriving the query rather than by any check, and neither command distinguished an empty selector from an absent one. The mirror case, a non-empty selector that matches nothing: osv-scanner's documented bare-dirname form --experimental-exclude .git does NOT exclude. A planted lockfile at .git/gate-head-999/package-lock.json was still scanned (probe 2026-08-11, planted fixture, results listed the .git path); g:.git/** also failed; g:**/.git/** and r:/\.git/ were verified excluding while the real tree stayed scanned — a positive and a negative control in one probe. Fixed at 0e8818c.
commitworkcommitworkpartial bin/test/lexical-ratchets.test.mjs: xargs without -r / --no-run-if-empty is refused across tracked .sh and .mjs — zero offenders at arming bin/test/lexical-ratchets.test.mjs present 2026-09-06; remaining: the empty-$(…)-selector and empty-query-result forms of the class are outside the lexical reach · 2026-09-06 no record proposedno proposal recorded
M17closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Two moving inputs, one anchor false_measurement.two_moving_inputs IMPLEMENTER2 monitorunsafeprocess-changeunassessed A tool reads a code tree and a data artifact, both mutable under concurrent sessions. Recording one anchor makes the result look reproducible while the other input varies, so a re-run gives a different answer under the same stamp. analogyThe photograph is carefully dated and the room was rearranged. exampleThe output now stamps the baseline, the resolved HEAD and a sha256 of the data artifact, fixed at 925e26a.
commitworkcommitworkimplemented every moving input stamped (925e26a) scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
M18closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Denominator decides the conclusion false_measurement.denominator_decides_conclusion IMPLEMENTER2 monitorunsafecontroller-algorithmunassessed A measurement admits several correct denominators spanning an order of magnitude. The widest makes working machinery look broken and the narrowest makes a narrow capability look like coverage, and every ratio is true. analogyThe turnout is a triumph or a disaster depending on who counts as invited. exampleThe govulncheck reachability join measured 234 of 11,430 at 2.05% and a far higher figure on the same data on the same day, depending on which dependency population was the denominator. Measured instance: bin/panel-smoke.mjs swept "every visible tab", opened 7, and reported a clean panel. The tab strip is two-level — applyGroup() hides every #views .vtab outside the current section — so a visible-vtab sweep sees one section, and the eleven names it keyed on were SECTIONS, not tabs. Corrected sweep: 77 tabs across 11 sections. 7 of 78 published as the whole panel. c624d17, mechanism at admin/index.html:5160 (groupOf) and :4810 (applyGroup on setView). Cause, from the session that owns the feature: the tabs are SECTION-gated — applyGroup toggles a hide class on every tab outside the current section — so a sweep of visible tabs sweeps one section permanently.
commitworkcommitworkpartial fixed at f22ed7d and 65e5ceb for the instance scoreBasis · 2026-09-06 no record proposedproposed Every published ratio names its denominator population on the record; a renderer refuses a ratio without one. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
M19closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Asserted partition, overlapping populations false_measurement.asserted_partition_overlapping IMPLEMENTER2 monitorunsafecoordination-duplicatesame-defect-as→ M21 Two lanes are declared to cover complementary halves of a class and the declaration is prose. Their match sets overlap, so every site in the intersection is counted twice, once in each lane's baseline. analogyTwo census takers work the same street on the same morning. exampleTwo detectors documented as disjoint measured the same sites, and the intersection was counted in both baselines.
commitworkno record no record proposedproposed For each pair of lanes declared complementary, a test asserts their match sets over a fixture are disjoint. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
M20closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Artefact authenticated, role never checked false_measurement.artefact_authenticated_role_unchecked BOTH5 oversightunsafecontroller-model4 agentnot-provided / feedback-missingenables→ C10 An artefact is verified exhaustively as an OBJECT — hash, size, parse, structure, independent second reader — while the question of whether it is the one the system actually uses is never asked. The verification is real, which is what makes the wrong answer survive review. analogyAuthenticating the signature, the paper and the watermark of a will, without asking whether a later one exists. exampleA registry blob was verified as 54,992 bytes, parsing, 30 areas, 6 projects, by two sessions independently, and broadcast to four sessions and the operator as the fleet registry. It was two commits stale (HEAD 57,442 B / 32 areas) and lived at a path the loader does not read. Two sessions ran three checks each; 0 of the 6 called registryPath().
commitworkcommitworkno-lever a role check means running the consumer once; nothing lexical says which artefact fills a role lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M21closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Comparison over the union of two coverages false_measurement.comparison_over_union_of_coverages IMPLEMENTER2 monitorunsafesensor-inadequate5 oversightnone / coordination-gapsame-defect-as→ M19 Two witnesses with different coverage are compared over the union of what either could see rather than the intersection of what both could, so the complement — subjects one witness never examined — is scored as disagreement. The over-report grows with the population, so a larger subject reads as a worsening crisis. Exact mirror of M19, where the INTERSECTION of two declared-complementary lanes is double-counted; here it is the COMPLEMENT that is falsely counted. Distinct from M18: there is one measurement admitting several denominators there, and two sources joined wrongly here. analogyTwo censuses disagree about a country. One of them only visited the capital. exampleA static dataflow pass reads 965 modules; the runtime pass observes only the 14 that a checked read-only command set enters. Compared naively, an early run scored a directory walk as 2,001 false negatives — the instrument becoming the crisis it was measuring. Separating "path the static pass could have seen" from "path built at runtime" took it to 30, and three further coverage distinctions took it to 0. Orphans went 36/20 to 1/1 over the same corrections.
commitworkcommitworkpartial flow/reconcile.mjs restricts the headline divergence to modules the runtime entered and reports unvisited separately scoreBasis; one reconciler · 2026-09-06 no record proposedno proposal recorded
M22closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Same name, divergent derivation across a seam false_measurement.same_name_divergent_derivation CONTROLLER4 agentunsafecontroller-model5 oversightnone / feedback-missingsame-defect-as→ M13 Two producers on opposite sides of a contract declare a field with the same name AND the same type, derived differently, so it type-checks, schema-validates and composes while meaning the opposite thing. The name's agreement is the concealment: reviewers use name agreement as evidence of contract agreement. Inverse of M13, whose producers declare DIFFERENT shapes and therefore cannot aggregate at all — here the shapes agree and it aggregates fine, wrongly. Distinct from A22, which is one value with two readers inside one module; this is two producers across a stream boundary. Distinct from G16, whose referent is never fixed; here it is fixed twice, differently, both times explicitly. analogyTwo departments both report headcount. One counts people and one counts contracts. exampleA harness contract specified matchKey on two record types either side of a producer/consumer seam — content-only on one, scoped by the source document sha on the other, both sha256 hex. The document sha changes on any byte edit, so the consumer's differ would have silently failed to re-link across revisions while validating cleanly. Caught on read by the producing stream, not by review.
commitworkcommitworkno-lever two derivations of one field name are compared by reading both; type and schema checks pass by construction lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M23closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Control shares the subject's failure mode false_measurement.control_shares_failure_mode IMPLEMENTER5 oversightunsafecontroller-algorithmassessed-none A negative result is read as evidence about the subject while the apparatus that produced it could not have expressed the failure at all. The control and the test are alike in the property that matters, so agreement between them carries no information and absence of difference reads as a finding. analogyThe fire alarm is tested by pressing the button on a second alarm that was never wired to the building. exampleTwo instances the same day, reaching the same place by different routes. BY PLATFORM: testing whether semgrep's "Internal matching error" (36,037 across a 100-repo corpus) was fixed upstream, the reproducer under semgrep/semgrep:latest gave 0 errors against 1 on the host — one sentence from being reported fixed. The positive control, the SAME Docker harness pinned to the known-defective version, also gave 0, because the defect is macOS/arm64-specific and the image is linux. The upgrade zero and the control zero were indistinguishable and only the control was diagnostic; both runs confirmed paths.scanned == ['eslint.config.js'], so neither was a no-files vacuum — the vacuum was one layer further in. BY PROVENANCE: demonstrating a launcher discarding an exit status, the "before" file was copied out of a working tree that sits on the fix branch, so the copy carried the fix. Patched against patched, no difference, and the absence of a difference looked like evidence about the defect. Corrected by taking the file from `git show origin/master:<path>`; cost about ten minutes and one wrong conclusion drafted. THIRD ROUTE, BY A SILENT FAILURE TO ISOLATE, 2026-09-03: to test whether a trufflehog lint failure was pre-existing, `git stash push -- <paths>` was run to strip the branch's changes before re-running. The command failed on argument syntax — "subcommand wasn't specified; 'push' can't be assumed" — the files stayed modified, and the "control" re-ran the branch against itself. It produced results IDENTICAL to the test arm, which is what a genuine pre-existing failure looks like, and the identity was read as confirmation. Caught by printing `git status --porcelain` inside the control and seeing the files still M; redone in a separate worktree at the base commit, where the failures were in fact pre-existing. The first two routes had a control that could not express the failure; this one had no control at all, and the output was indistinguishable. MOVED TO G26 at edition 17: the 2026-09-06 probe broken by the U+2028 it was written to find was filed here and that placement was wrong, as the session that filed it recorded once a second occurrence five days later supplied the separator. It is not a control that shares its subject failure mode; it is an instrument that cannot be authored at all in the presence of its subject, and it produces no reading rather than an uninformative one.
commitworkcommitworkno-lever whether a control can express the failure is decided by running the control on a known-defective subject; it is the convention the ratchets above follow (a planted offender), not a gate over other tests lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M24closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Agreement used as the oracle false_measurement.agreement_as_oracle IMPLEMENTER5 oversightunsafecontroller-algorithmassessed-none A differential check records each side's observation as a VALUE and then asserts the two values are equal, so the property under test is never stated anywhere. Two sides that are wrong in the same way agree, and agreement is the pass condition — the check has no anchor to be wrong against. analogyTwo clocks are checked against each other, agree, and are both an hour slow. exampleMeasured in memory-layer (src/storage/mod.rs, column_store_conformance) and caught pre-commit by its own author, 2026-09-02: a scan-ordering check was first written as note("scan is ascending", format!("{}", pre.windows(2).all(|w| w[0].0 < w[1].0))) — a boolean recorded into BOTH backends' answer scripts and then compared. Both backends returning DESCENDING order yields "false" == "false", which passes. Replaced with a hard assert! on the property before landing; fixed form in memory-layer af84a50, whose commit message names the defect. 1 of the 1 ordering properties the script checks was written in the self-cancelling form first.
commitworkno record no record proposedno proposal recorded
M25closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Fixture unfaithful in the dimension under test false_measurement.fixture_diverges_in_tested_dimension IMPLEMENTER5 oversightunsafecontroller-algorithmassessed-none A test's input differs from what production produces in precisely the dimension the code under test examines. The guard runs, discriminates correctly and passes, and proves nothing about the production path, because it was never shown a production value. analogyThe lock is tested with a key cut from the same blank as the lock, and every real key in circulation is a different blank. exampleMeasured 2026-09-02 (b51828c, bin/test/gate-tests-core.test.mjs): the fixture returned committedAt as 2026-08-09T12:00:00Z while both production callers inject git %cI, which emits a local offset — 2026-08-11T17:24:18+09:30. The code under test COMPARES timestamps, so the mock diverged from production in exactly the dimension being compared. The guard matched, discriminated correctly, and passed. Making the fixture faithful turned five tests red before a line of the fix was written.
commitworkcommitworkno-lever fixture faithfulness is decided against a production sample the tree does not hold for most producers lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M26closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Verification scoped narrower than the claim it supports false_measurement.verification_narrower_than_claim CONTROLLER5 oversightunsafecontroller-algorithmassessed-none A check is run, passes, and is sound — and the proposition it establishes is narrower than the proposition it is then used to support. Nothing in the result announces the gap, because the check did exactly what it says and the widening happened in the reading. analogyThe door is confirmed locked and the claim made is that the building is secure. exampleThree instances, two sessions, one day. A --settings seam was requested, landed and confirmed present, and its arrival was treated as meaning a permission profile could be enforced — but --settings MERGES ("load additional settings from"), so an empty allow list does not displace 1,156 inherited rules and enforcement needs --setting-sources; the check passed on the narrower proposition. A vm.SourceTextModule probe returned 23 correct static specifiers for one file and was asserted to cover "static from, side-effect import, dynamic import() with a literal, export … from, all exact" — the dynamic clause is false by construction, and a peer measuring 50 dynamic imports in the same tree caught it by diffing two extractors rather than trusting the better one. The third is the same shape in the same hour as the first. | overwatch-layer (reported by reporter #38, own transcript, 2026-08-29 measured / 2026-09-03 filed): claim under verification was 'the sealed deep-link route resolves within a 25s window'; the check run was Chrome --headless=new --dump-dom --timeout=25000, which snapshots at the page LOAD event (~1s) — --timeout caps hangs, it does not extend observation. Four consecutive probes photographed the synchronous cold state and were read as 12-25s state; one diagnostic round was burned on a 'contradiction' that was two truthful photographs of different instants. Instrument-imposed narrowing (flag semantics), not chosen scope — same predicate. Repair landed with the instance: overwatch-layer tools/probe-route.mjs (dd749e2) waits wall-clock then Runtime.evaluates, and its header states the limit the old instrument hid. Fourth instance, another repo (teamD / Portll-teamDRemote, reporter #30, 2026-09-01): `" OR " in filter` was asserted against a freshly built query builder to mean the two picks were joined by OR. It establishes only that the WHERE clause contains that token somewhere, and the pre-existing contactable clause `(email... OR mobile...)` already did. Subject correct, proposition narrower; re-targeting the artefact could not have helped, which is what separates it from M27. FIFTH INSTANCE, and the first with a denominator — the four above have none. Measured 2026-09-07 to 09-09 in commitwork by reporter #3. The check: family VI's within-family cosine (0.017) sits below its similarity to family I (0.020), uniquely among eleven families. The claim it was used to support: family VI is defectively incoherent and should be split, redistributed or renamed. What the check would still permit, and nobody asked: that every other family sits at a similar margin. It does — three hold by under 12%, all eleven hold when measured against the whole register rather than the nearest family, and an INDEPENDENT hand-assigned grouping the metric never sees (the STPA loop) coheres at only 1.14 to 1.40. That control is what does the work: it shows the metric carries no absolute threshold, so "0.017 is low" was never a statement about family VI at all. Three recommendations were withdrawn on it. Ruled into this row rather than minted as "a ranking always produces a worst member" by reporter #40, who supplied the separation this session could not break: the ranking artefact only bites when the ranking LICENSES something, and licensing it is the widening, so M26 accompanies every constructible instance while M26 fires without any ranking at all.
commitworkcommitworkno-lever whether a check's scope entails the claim is a reading of two sentences lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M27closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Check passes against the unchanged artefact false_measurement.check_ran_against_unchanged_artefact IMPLEMENTER5 oversightunsafecontroller-algorithmassessed-none A verification runs correctly and passes, against a copy of the subject that does not contain the change. The pass is evidence the change did NOT land, and it is read as evidence that it did. analogyThe rebuilt engine is signed off after a test drive in the loan car. exampleThree instances, two sessions, one day. A container image was rebuilt and tagged latest while the running unit referenced a different tag, so a backward-compatibility check (a known count, BONDI = 9360) PASSED by exercising the three-week-old image; only a NEW-behaviour assertion caught it, production returning 227,567 against an expected 489,616. A registry test suite returned 35/35 and 99/99 green against a worktree copy that did not contain the edit under test, because the tests are structural and pass either way. The purest form: a .replace() targeted a sentence that had not survived an earlier rewrite, matched nothing, and returned the string unchanged — the blob was byte-identical to HEAD, every check passed, and the only thing that surfaced it was the commit tool reporting "landed 1 path(s)" where two were expected.
commitworkcommitworkno-lever whether an assertion keys on a token only the new behaviour produces is a reading of the assertion against the change lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
M28closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Key not injective over its population false_measurement.key_not_injective_over_its_population IMPLEMENTER4 agentunsafecontroller-algorithmassessed-none A count or a dedupe groups its subjects on a value two different subjects can share, so identical values collapse into one row and the survivor is attributed to whichever subject the scan reached last. One key produces an undercount and a misattribution together and neither is visible in the result. Distinct from C4, C29 and C33, whose keys MOVE so that movement reads as a state change: this key does not move at all, and the same input yields the same keys every time. It is simply not unique. analogyThe register keeps one line per surname and the parish holds four families called Smith. exampleMeasured on this registry, 2026-09-11 and re-measured 2026-09-16 with the file unchanged. Over the four class text fields there are 105 occurrences of the agent-citation shape and 24 distinct strings. A census keyed on the matched STRING reported 24 citations of which 2 carried an over-wide ref; the true number of classes carrying one is 6 (C2, A10, D1, D15, M23, G25), because one token occurs in five of them and survived under the id of whichever was scanned last. Four of six classes were invisible in a result that named two, and the same scan reported both a low count and a wrong owner. Re-run keyed per class rather than per string, the population is 6 and no subject is lost. Second instance, another product and another key space: a batched GraphQL gather on 2026-09-15 reused aliases p0 to p7 across 6 batches, so each batch overwrote the last and 8 of 42 subjects were reported.
commitworkno record no record proposedno proposal recorded
M29closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Ambient rate credited to the change under test false_measurement.ambient_rate_credited_to_the_change CONTROLLER4 agentnot-providedcontroller-modelassessed-none A measurement attributes to its subject a rate the environment produces on its own. Both arms run correctly and the difference between them is real; what is missing is any arm in which the subject is absent, so a scheduled job, a background sweep or an already-running process is counted as the effect of the change. analogyThe shop counts the customers the sale brought in and the town holds its market that morning. exampleMeasured twice in commitwork in one week. The first arm pair read 7 against 0 and was reported as proof; cleared and re-run it read 0, 0 and 0, the original 7 having been the scheduled fleet firing inside a 60-second window. Only bracketing with 45-second idle arms produced signal: idle 0, real 7, scoped 0, idle 0. The same mistake recurred two days later on a different path. Second product, and the arm was contaminated by a process rather than a schedule: in memory-layer the embedder auto-selects LM Studio whenever port 1234 answers (memory/mod.rs:669), so a control arm measured 13 failures against 8 on 2026-09-15, and with the embedder pinned to minilm on both arms it measured 8 against 8. The defence is the same in both: a null arm of the same duration, bracketing the measurement.
commitworkno record no record proposedno proposal recorded

VIModel-generated defectG1–G27 The false proposition: “and the agent's own output is usable” membership testThe defect is IN what a model produced or in the judgement a model issued, and it is present in that artefact itself. NOT an origin test: because the register's scope ruling makes every class here a description of agentic work, "an agent was involved" admits almost any row and cannot refuse anything. Membership requires the model's OUTPUT to be the defective thing, not merely the circumstance in which some other defect was found. Rows about how agents are SCORED belong to the family of the thing being mis-scored.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
G1closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Reasoning/verdict contradiction model_generated.reasoning_verdict_contradiction BOTH4 agentunsafefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed The reasoning refutes the verdict filed beside it. analogyA referee explains why the tackle was fair and awards the penalty. exampleOpus triaged 7 gitleaks findings reasoning "a 29-char filename constant, not a credential" and filed 7x needs-human; the deterministic lint now runs for calibrated multi-chain nodes, while the default single-chain path still bypasses it.
commitworkcommitworkpartial R8 — Break the reasoning-lint deadlock remediation register #8: PARTIAL 2026-09-01 — The calibration deadlock is broken by live evidence: guard-reachability observes three (check, model) nodes at n=3, so reasoning-lint executes on their multi-chain fusion path. · 2026-09-06 no record proposedproposed lint the n<=1 path too; the default single-chain branch returns before fuseChains and still receives no reasoning/verdict contradiction check. Re-run bin/test/guard-reachability.test.mjs whenever calibration history changes so a loss of all escalating nodes… (next step of R8) effort Low · remediation register #8, REMAINING · 2026-09-06
G2closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Schema bypass via the reasoning channel model_generated.schema_bypass_via_reasoning IMPLEMENTER4 agentnonefeedback-missing6 attentionunsafe / actuator-corruptunassessed The answer routes into thinking, content is empty, and validation passes on nothing. analogyA candidate works the whole answer on the scrap paper and hands in a blank sheet. exampleqwen3.6-27b under LM Studio json_schema returned 0 chars of content with 806 chars of conformant JSON in reasoning_content and finish_reason: stop.
commitworkcommitworkpartial the salvage path works scoreBasis; the primary parse path is empty on every LM Studio schema call · 2026-09-06 no record proposedno proposal recorded
G3closureclosure 1 of 4: barely1gaingain 4 of 4: biggest available4 Recovery keyed on a serialisation accident model_generated.salvage_on_serialisation_accident IMPLEMENTER4 agentnonecontroller-algorithmunassessed The salvage works only because properties happen to emit in schema order. analogyThe spare key turns because the door is warped, and the door is due to be planed. exampleThe panel's salvage keys on the literal substring '{"verdict"', so reordering a property in the schema silently breaks every LM Studio triage.
commitworkcommitworkopen R9 — Test the LM Studio salvage against a schema reorder remediation register #9: OPEN 2026-08-29 — OPEN, not PARTIAL: nothing exists. Grepping every *.test.mjs in the repo for the anchor literal, `salvageAnchor`, or reorder-invariance returns zero hits — the only three files in the repo containing `'{\"verdict\"'` are… · 2026-09-06 no record proposedproposed \n\n1. Make the salvage order-independent before writing the test, or the test cannot pass. Either derive the anchor from the schema at call time (`'{\"' + (schema.required[0] || Object.keys(schema.properties)[0]) + '\"'`) or, better, scan `thinking` for the… (next step of R9) effort Low · remediation register #9, REMAINING · 2026-09-06
G4closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Opposite failures conflated model_generated.opposite_failures_conflated IMPLEMENTER4 agentnonefeedback-incorrectunassessed "Never produced" and "produced elsewhere" both read as empty content. analogyA silent phone line means the caller hung up or never dialled, and the log records no call for each. examplefinish_reason appears nowhere in the route, and verdictSalvaged fires on every call, so it discriminates nothing.
commitworkno record no record proposedproposed Read finish_reason in the LLM route and branch on it, so a truncated answer and a refused one are different values. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
G5closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Recovery structurally guaranteed to fail model_generated.recovery_budget_insufficient CONTROLLER4 agentstopped-too-sooncontroller-algorithmunassessed The retry budget is smaller than the reasoning channel consumes. analogyA witness is recalled and given ten seconds for an answer that takes a minute. exampleThe only verdict-recovery path retries with a 24-token budget, of which 23 were measured consumed by the reasoning channel.
commitworkno record no record proposedproposed Assert the recovery token budget exceeds the measured channel cost at startup, and refuse to run otherwise. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
G6closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Confabulated syntax model_generated.confabulated_syntax IMPLEMENTER4 agentunsafeactuator-corrupt6 attentionunsafe / actuator-corruptunassessed Config or tool syntax the model was never shown, emitted confidently. analogyA tourist gives directions in fluent grammar and invented street names. exampleTwo engines invented .gitleaksignore syntax — TOML allowlist blocks and column-range suffixes — while every finding already carried a file:rule:line fingerprint that is the ignore line.
commitworkcommitworkpartial fixed for frontier models (10.0, 7/7 suppressed) scoreBasis; open for small locals · 2026-09-06 no record proposedno proposal recorded
G7closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Verdict recorded, unqueryable model_generated.verdict_unqueryable IMPLEMENTER4 agentnot-providedactuator-missing6 attentionnot-provided / actuator-missingsame-defect-as→ R6 An opinion is stored in a shape nothing downstream can read. analogyThe diagnosis is written in handwriting the pharmacy cannot read. exampleA model returned reasoning inside content beginning "Here's a thinking process:" with no fence, so 4,609 chars were captured and the run recorded ?.
commitworkcommitworkimplemented the splitter fixed; never-guess-a-verdict-from-prose ruling scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
G8closureclosure 4 of 4: solved and pinned4gaingain 0 of 4: nothing on the table0 Judgement against a moved subject model_generated.moved_subject CONTROLLER5 oversightnoneprocess-change6 attentionunsafe / actuator-corruptunassessed No version token, so a verdict lands on a subject that changed. analogyThe proofreader marks up an edition the printer has already replaced. example/api/issues served no version token until subjectDigest was pinned at read and mismatches refused with 409.
commitworkcommitworkimplemented subjectDigest pinned at read, 409 on mismatch scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
G9closureclosure 3 of 4: solved, unpinned3gaingain 1 of 4: marginal1 Rubric mismatch model_generated.rubric_mismatch CONTROLLER5 oversightunsafecontroller-model6 attentionunsafe / actuator-corruptunassessed An agent is scored on a dimension it was never asked to satisfy. analogyA swimmer is scored on their handwriting. exampleA plan scored 4.2/10 on HAZOP coverage it was never asked to perform; an adversarial breaker scored 6.9/10 on actionability explicitly outside its remit.
commitworkcommitworkpartial each agent receives its dimensions before it runs scoreBasis · 2026-09-06 no record proposedno proposal recorded
G10closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Rater pathology model_generated.rater_pathology CONTROLLER5 oversightunsafefeedback-incorrect6 attentionunsafe / actuator-corruptunassessed Leniency collapse, orthogonality violation, or self-scoring inflation in the scoring layer itself. analogyOne judge gives every entry ten, and the next gives every entry zero. exampleA local rater returned four 0.0 scores of seven ("did what was asked, therefore 0"); self-scoring inflated precisely where the self was exposed, 4.0 against two blind raters at 8.0 and 7.5.
commitworkno record no record proposedproposed A census over the adjudication ledger computing per-rater variance, leniency and self-versus-cross scores; a rater outside bounds is named. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
G11closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Run-to-run instability read as capability model_generated.instability_as_capability CONTROLLER5 oversightnonesensor-inadequate6 attentionunsafe / actuator-corruptunassessed Unpinned temperature, one sample, and a conclusion drawn about the model. analogyA coin comes up heads and is described as a coin that lands heads. exampleA local returned all-false-positive on one run and all-real on the next; temperature on the LM Studio path sits at 0.2, not 0.
commitworkcommitworkpartial R15 — Pin what makes a number mean something remediation register #15: PARTIAL 2026-08-29 — PARTIAL, not DONE and not OPEN, because the item is two independent asks and they are in opposite states. The CW_VERDICT_PIN half clears the full DONE bar: mechanism (bin/verdict-journal.mjs:78), production… · 2026-09-06 no record proposedproposed Only the temperature half remains; CW_VERDICT_PIN needs nothing. 1. admin/routes/remediation.mjs — add `temperature: 0` to the LM Studio body at :249 and to the ollama `options` object at :240. This is the path G11's evidence actually came from and it is the… (next step of R15) effort Low · remediation register #15, REMAINING · 2026-09-06
G12closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Self-adjudication model_generated.self_adjudication CONTROLLER5 oversightunsafecontroller-algorithm6 attentionunsafe / actuator-corruptunassessed An agent judges gates that judge agent work. analogyThe examiner sits the paper they wrote and marks it. exampleEvery rate in the measured-state table was adjudicated by an agent scoring the gates that score agents.
commitworkcommitworkno-lever structural while the adjudicator is an agent lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
G13closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Catalogue substitutes for repair model_generated.catalogue_substitutes_for_repair CONTROLLER4 agentnot-providedactuator-missing6 attentionunsafe / actuator-corruptunassessed Writing the row discharges the obligation the row describes; documentation output is counted as remediation. analogyThe leak is entered in the maintenance log every week and never plumbed. exampleEleven still-open markers, and D1 — 847 lines reachable from no branch anyone tracks — was ranked Band 1 / high impact / low effort in the document that left it open.
commitworkcommitworkpartial bin/taxonomy-render.mjs validate(): a re-rate that raises closure must cite a sha, a path or a register item in its reason, or the registry refuses to render — the first run of the rule caught two of this pass's own reasons (C17, G1) and they are amended below bin/taxonomy-render.mjs validate() present 2026-09-06; remaining: a closure raised outside the RE-RATED sentence shape, or a cited artefact that does not do what the reason says, is outside the rule · 2026-09-06 no record proposedno proposal recorded
G14closureclosure 2 of 4: part-solved2gaingain 1 of 4: marginal1 Class proliferation model_generated.class_proliferation CONTROLLER4 agentnonecontroller-algorithmunassessed A taxonomy grows a class per incident until neighbouring classes cannot be separated by any observation. analogyA filing system grows a folder per letter received, until no letter has an obvious folder. exampleA11 required an adversarial pass to establish that C1-C10 could not hold it; A12 and P10 remain separable only by a thin predicted observation. MEASURED INSTANCE, and the subject is this family. Family VI is the register's only family whose within-family similarity (0.017) is LOWER than its similarity to another family (0.020, to family I), and the lowest of the eleven; the other ten all hold. That single reading is the finding. CORRECTED 2026-09-07, SAME DAY, BY ITS OWN AUTHOR: the two figures first published beside it do not support it. "19 of 25 classes have their nearest wording outside the family" is true and does not discriminate — a majority does in every family but one, from 56% to 100%, and VI's 76% is merely the second highest. "1 causal edge where families I, II, IV and V carry 13, 10, 7 and 11" compared VI against the four densest families only; measured across all eleven, VI's edge density is mid-pack, and families VIII and X carry zero. The diagnosis is unchanged and rests on reading the 25 rows rather than on those figures: the family is named for an ORIGIN where every other is named for a false belief, so its membership test admits almost any row, and six of its classes sit in the oversight loop describing how agents are SCORED rather than what they produce. The correction is the instance worth having: the document asserting it opened by claiming every number in it was computed, and that blanket provenance carried the one comparison nobody had computed. Measured with bin/taxonomy-structure.mjs; reading and correction in evaluations/taxonomy-family-vi-cohesion-2026-09-07.md.
commitworkcommitworkpartial bin/taxonomy-render.mjs validate(): a class whose basis says Minted must argue against a named neighbour (SEPARATING OBSERVATION or "Against <id>") or the registry refuses to render bin/taxonomy-render.mjs validate() present 2026-09-06; remaining: semantic overlap between two argued classes is outside the rule · 2026-09-06 no record proposedno proposal recorded
G15closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Fixture from assumption model_generated.fixture_from_assumption IMPLEMENTER4 agentunsafecontroller-modelunassessed The author writes a consumer against an assumed data shape and then writes the fixture from that same assumption, so every test passes over a shape the artifact does not have. Adding tests raises confidence without touching the error. analogyThe surveyor checks the map against a copy of the map. examplecra/reachability-evidence.mjs read rollup.repos[].scannerFindings; no rollup stores rows there across 172 repos in 34 areas, while rollup.scannerFindings.depsGo held 268 govulncheck rows.
commitworkcommitworkno-lever fixtures derived from real artefacts is a sourcing rule; no test can tell an assumed shape from a copied one lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
G16closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Silent term resolution model_generated.silent_term_resolution CONTROLLER4 agentunsafehigher-inputunassessed A specification uses a term whose referent it never fixes. The reader resolves it plausibly and wrongly, records no choice, and scopes downstream work to the invented referent. analogyThe recipe calls for a cup and every kitchen owns a different cup. examplefailure-taxonomy.json class A7 turns on the population a condition ran against and never fixes which population, so the reader supplied one.
commitworkcommitworkno-lever a term whose referent a document never fixes is found by reading the document lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
G17closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Parallel implementation, not extension model_generated.parallel_implementation IMPLEMENTER4 agentunsafecoordination-duplicateunassessed A concept is already modelled and new work needs it slightly differently, so the author writes a fresh parallel declaration at the new call site. Both are correct and neither knows about the other. analogyThe second locksmith cuts a new key rather than copying the one on the hook. examplemonitor/tool-version.mjs and bin/scanner-preflight.mjs each modelled tool presence separately, two of four instances landing in one tree on one day.
commitworkcommitworkpartial two of four instances closed (c6b24e6/bd82074, 3351039) scoreBasis · 2026-09-06 no record proposedno proposal recorded
G18closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Sourced and wrong model_generated.sourced_and_wrong CONTROLLER4 agentunsafecontroller-modelunassessed A model fetches a normative document and summarises it. The summary is confidently wrong in specific checkable values and carries the authority of having been sourced, which is harder to doubt than a confabulation from nothing. analogyThe clerk quotes the statute from memory with the book open on the desk. exampleA WebFetch summary of the OASIS CSAF 2.0 specification got three of four enum lists wrong, omitting some values and inventing others.
commitworkcommitworkpartial fixed at 6a81328 by deriving the corpus rather than transcribing it scoreBasis · 2026-09-06 no record proposedno proposal recorded
G19closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Refusal in place of an answer model_generated.refusal_in_place_of_answer CONTROLLER4 agentnot-providedcontroller-modelunassessed The agent probes for a capability, misreads a negative probe as absence, and ships a refusal instead of the answer it could have produced. A refusal asserts nothing checkable, so nothing audits it. analogyThe clerk says the form does not exist without opening the drawer. exampleA capability was declared unavailable on a negative probe while it was present and reachable.
commitworkno record no record proposedproposed Sample refusals from the verdict journal and re-probe a fraction for a reachable answer; the recoverable rate is published. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
G20closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Local context teaches retired policy model_generated.local_context_teaches_retired_policy CONTROLLER4 agentunsafehigher-inputunassessed At generation time the strongest available signal is the surrounding file, and local context lags policy. The file teaches the agent precisely what the organisation has most recently forbidden, and the output is faithful to it. analogyThe apprentice copies the shelf nearest the bench. exampleGenerated code reproduced a convention the repository had already retired, fixed at 964d908.
commitworkcommitworkpartial instance fixed at 964d908 scoreBasis · 2026-09-06 no record proposedno proposal recorded
G21closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Generator writes its own check model_generated.generator_writes_its_own_check IMPLEMENTER5 oversightunsafecontroller-modelunassessed An agent authors both an artefact and the guard that certifies it in one pass. The guard cannot see what the generator could not see, because one reading of the problem produced both and the blind spot is shared by construction. analogyThe student writes the exam and the marking scheme. exampleINFERRED, not measured: I authored both the gitleaks allowlist blocks in manifests/gitleaks.toml and the scan-scope assertion that tests them, in the same commit b1965a9. No failure resulted — the class names the construction, not an observed miss. Second instance, where the shared derivation is a SPECIFICATION rather than one agent's single pass: an identity scrub built its substitution list from the addresses an operator named, and the check that confirmed completeness was derived from the same list. The corpus also held the bare domain standing alone and a no-dot variant of one address — forms nobody had listed — and both survived. The tracked scrub was reported complete and was not: a generated fixture still carried the domain, committed hours later at ce5ebae. What caught it was an asymmetry nobody designed: the grep alternation happened to include the bare domain while the substitution list held only full addresses, so DETECTION was accidentally broader than REPLACEMENT and four page dumps surfaced through the gap. Had both been the same array — the obvious implementation — the variant would have been undetectable by its own check.
commitworkno record no record proposedproposed Derive every guard's predicate from a source independent of the artefact it certifies — for a redaction, enumerate the identity forms present in the corpus rather than the list intended to be replaced — and record which source was used. effort High · would reach closure 2 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
G22closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Correct in lane, false-clean downstream model_generated.correct_lane_false_clean_downstream IMPLEMENTER2 monitorunsafecoordination-gapunassessed A scope change is verified against the instrument it modifies and never against the consumers of that instrument's output. It is correct in its own lane and silently retracts findings a downstream store has already published. analogyThe road is renumbered and every delivery address still cites the old one. exampleA scanner scope change was validated against the scanner and not against the store holding its prior findings.
commitworkno record no record proposedproposed A scope change in any lane is diffed against already-published findings, and the findings it would retract are listed before the change lands. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
G23closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Local accumulator omits a shared field model_generated.local_accumulator_omits_field IMPLEMENTER4 agentunsafecoordination-duplicateunassessed A shared helper declares a report shape and a call site needs the same report with extra tallies, so it hand-rolls a local accumulator that omits one of the helper's fields. A suite asserting the fields it expects cannot see the omission. analogyThe copy of the form leaves off the last question. exampleA local accumulator reproduced a helper's report shape and dropped one field, invisible to tests that asserted only the fields they knew about.
commitworkcommitworkno-lever an accumulator omitting a helper's field is invisible to any check that asserts only the fields it expects, which is every check lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
G24closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Instability read as provenance model_generated.instability_read_as_provenance IMPLEMENTER4 agentunsafecoordination-duplicateunassessed A classifier decides WHOSE a failure is by re-running it, so a nondeterministic subject is sorted by the dice rather than by its cause. The failure does not merely appear and disappear — it changes OWNER between runs, moving between 'committed and attributable' and 'uncommitted, possibly someone else's' with nothing changed in between. Distinct from G11, where instability corrupts a claim about CAPABILITY from one sample: here the sample is taken twice on purpose and the second reading is the attribution mechanism itself, so the instability is inherited by the answer to 'is this yours?' rather than by the answer to 'does this work?'. Distinct from M2 as well: an M2 fact was true when taken and decayed; this one was never stable at any instant, and re-measuring produces a different owner rather than a fresher one. analogyThe lost-property office decides whose coat it is by asking again tomorrow. example2026-08-29: bin/gate-tests.mjs sorts failures by whether they reproduce in a pristine HEAD checkout, and re-runs to decide. monitor/test/rerollup-identical.test.mjs was measured at fail 1, then 0, then 0 across three consecutive runs of an unchanged tree, and appeared in the working-tree bucket on one firing and not the four before it. monitor/test/write-atomic-concurrency.test.mjs moved between the two buckets across six consecutive firings with HEAD unchanged at 264bce0. The offered baseline moved 14 -> 15 -> 14 -> 10 across four consecutive offers with no commits between some of them. Three sessions each read the classification as evidence and relayed it to others before anyone re-ran it.
commitworkcommitworkno-lever nondeterministic classifier outcomes need repeated runs the classifier does not make; the remedy is design, not a gate lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
G25closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Write actuator alters authored content model_generated.write_tool_reinterprets_payload IMPLEMENTER4 agentunsafeactuator-corruptunassessed The bytes on disk differ from the bytes the author supplied, because the writing tool applied escape or encoding semantics to the payload. Invisible in the editor and in review; the file reads correctly and behaves differently. C5 covers the consequence — two instruments disagreeing over one input — but attributes it to the READING tool; D4 places the loss in a re-authoring orchestrator; P13 makes tool choice decide apparent AUTHORSHIP. This one makes tool choice decide the CONTENT, at the write actuator. analogyA typesetter silently converting a quoted backslash-n into a line break. exampleAuthoring a module on 2026-09-02, the six-character escape for NUL became a single raw 0x00 on disk. docs/TRAPS.md records 11 tracked sources already carrying one, where grep answers "not found" (exit 1) and git grep answers "Binary file ... matches" (exit 0) — neither gateable. This is plausibly how all 11 were created. THE ed.13 WIDENING WAS UNGATED FOR ITS FIRST DAYS, measured by reporter #26 2026-09-06: this row was widened from NUL to escape transformations generally, and bin/test/no-nul-bytes.test.mjs asserted NUL alone while its NAME implied the class. Closed at c39f943, which gates U+2028/U+2029, mid-file BOM, C0-except-ESC and ZWSP across the tracked tree. A guard whose name claims a class and whose assertion covers one member is the row's own shape applied to its own gate.
commitworkcommitworkpartial bin/test/no-nul-bytes.test.mjs gates the NUL instance across the tracked tree scoreBasis; reporter #28 widened it to U+2028/U+2029, BOM and C0 at c39f943 · 2026-09-06 no record proposedno proposal recorded
G26closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Instrument unauthorable in the presence of its subject model_generated.instrument_unauthorable_in_its_subjects_presence IMPLEMENTER4 agentnot-providedsensor-inadequateassessed-none The construct an instrument exists to detect is one that breaks the instrument own source when it is written there as a literal. The instrument does not return a wrong reading: it fails to parse, before measuring anything. The property that earns a row is that the failure recurred after it had been recorded as a warning in the header of the very file it recurred in, so the class survives its own documentation. analogyThe note warning about the smudge is written in the ink that smudges. exampleTwo independent occurrences five days apart in one commitwork file, bin/test/no-nul-bytes.test.mjs. On 2026-09-06 a probe written to find U+2028 and U+2029 across the tree was broken by them: "." in a JavaScript regular expression does not match a line separator, so a String.replace over the probe own source silently skipped exactly the two lines holding the literal characters, the two it existed to find, and left an unterminated regex literal. The reporter separating observation against M25 is that the fixture was faithful and the INSTRUMENT was not, failing in the same dimension as its subject. On 2026-09-11 the non-vacuity control in the same file used the literal character again and produced the same SyntaxError: Invalid regular expression: missing /. Between the two, the first had been written into that file header as a warning. The file now states the rule it has to obey: every pattern is written with a \u escape and never with the character itself. Corpus after repair, gated at c39f943: 1340 tracked text files, U+2028 0, U+2029 0, mid-file BOM 0, C0-except-ESC 0, ZWSP 1.
commitworkno record no record proposedno proposal recorded
G27closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Lossy transform, structurally conformant model_generated.lossy_transform_structurally_conformant IMPLEMENTER4 agentunsafecontroller-algorithmassessed-none A transform that shortens or rewrites content emits an artefact that parses, conserves its counts and satisfies its format rule, while its meaning is a different claim. Every instrument downstream measures shape, so a faithful shortening and a corrupt one are the same artefact to all of them, and adding checks of the same kind raises confidence without touching the defect. analogyThe editor confirms that every paragraph is one sentence long and returns the manuscript. exampleMeasured in commitwork on a comment-rewriting pass, 2026-09-06 and 09-07. Introduced at 115c9c5 (bin/comment-suggest.mjs, draftTerse via a fit() helper cutting to TERSE_MAX at a word boundary) and removed at 09751c3, which replaces truncation with a void. The pass rewrote 893 files, +4,411 and -17,488 lines. Of about 896 rewritten files exactly 2 failed node --check; the other 99.8% passed the parser, passed the terse-comment scan and passed the per-file restore guard while carrying clauses chopped mid-sentence. Specimens published as valid: "// This file is the git", from a sentence about the git side against commit-phase-core.mjs; "// no clock reaches the output, the page embeds src-sha256, not a timestamp, so two builds". Conservation holds throughout, one comment block in and one out with zero dropped, so a canary binding input count to output count stays green for the whole incident. The gate that accepted the corruption was written by the same hand in the same session: the terse rule asks for one line, at most 120 characters and no history markers, and a clause chopped at a word boundary satisfies all three. The pass was reverted.
commitworkno record no record proposedno proposal recorded

VIIFalse durabilityD1–D17 The false proposition: “and this record will still be there” membership testSomething was written, recorded, cited or stored, and it does not survive to the moment, the surface or the reader it was written for. The subject is SURVIVAL over time or across a boundary; the content was correct when it was written.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
D1closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Orphaned by history rewrite false_durability.orphaned_by_rewrite CONTROLLER4 agentunsafeprocess-changeunassessed A rewrite leaves side branches with no common ancestor, so their content is unreachable from the mainline and can never merge. analogyAn extension is built onto a house that has since been demolished and rebuilt on another plot. examplegit merge-base main worktree-secrets-vault-plan exits 1; 847 lines of plan and evaluation exist only on that branch. ONE LIVE CARRIER, measured over 18 local branches 2026-09-06 in commitwork by reporter #26 (85a6a0c, bin/test/history-guards.test.mjs): codex/pre-rebase-20260831/fix-yarn-audit-enolock shares no merge base with main. The row's earlier 847-line figure was the 2026-08-11 rewrite's remainder; this is the count that survives it.
commitworkcommitworksuperseded R10 — Land the stranded evaluations on main remediation register #10: SUPERSEDED 2026-08-29 — Not DONE and not PARTIAL: the content never reached main. I scanned every tree object in the repo's object database (population: all 4145 tree objects in /Users/username/External/commitwork, loose + packed, via… · 2026-09-06 no record proposedproposed Rewrite the entry; do not execute it. Concretely: 1. monitor/failure-taxonomy.json remediations[9] (lines 3758-3773) — the action string at :3767 is a command against a branch that exists nowhere. Replace the action with the corrective one: record D1 as… (next step of R10) effort Low · remediation register #10, REMAINING · 2026-09-06
D2closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Citation that resolves but is unreachable false_durability.unreachable_citation CONTROLLER4 agentnoneprocess-change6 attentionunsafe / actuator-corruptunassessed A SHA that git show prints happily, in no branch, due at the next gc. analogyA phone number still rings, in a house nobody lives in. example157 quoted SHAs across evaluations resolve to a commit object; 40 of them are in no branch. Measured instance, commitwork 2026-09-24, after an identity rewrite that morning left every tree identical and changed every SHA: all 34 distinct SHAs named by the 41 verified-against stamps still resolved with cat-file -e, and none was an ancestor of HEAD. docs-doctor tested existence only, so every stamp read as valid on the machine that held the orphaned objects, while a fresh clone, CI included, could resolve none of them. Fixed 96fff93 by testing merge-base --is-ancestor; 17 stamps were then mapped through the rewrite's commit map with tree identity checked per mapping (9ac7f63). Four stamps had named commits outside main's history before the rewrite. Measured by reporter #1 2026-09-24.
commitworkcommitworkpartial docs-doctor requires a verified-against stamp to name an ancestor of HEAD (not-in-history verdict); other SHA citations, in handoffs and ledgers, are still checked for existence at most 96fff93; bin/test/docs-doctor.test.mjs · 2026-09-24 no record proposedproposed A test scans tracked docs for sha citations, resolves each, and refuses a NEW citation that no branch contains. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
D3closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Rotation blindness false_durability.rotation_blindness IMPLEMENTER2 monitornonefeedback-missing6 attentionunsafe / actuator-corruptunassessed The writer rotates and readers open only the live file. analogyReceipts move to a second box when the first fills, and the accountant opens one box. exampletouch-ledger.jsonl rotates at 2 MB while both gate readers opened only the live file — a silent total attribution outage on a timer.
commitworkcommitworkimplemented both readers open the rotated file first, oldest first; torn lines counted scoreBasis · 2026-09-06 no record proposedclosed — no proposal applies
D4closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Transcription loss false_durability.transcription_loss CONTROLLER4 agentunsafeactuator-corrupt6 attentionunsafe / actuator-corruptunassessed An orchestrator re-authors what an agent should have written directly. analogyA speech is written up from memory by someone in the audience, and no recording was made. exampleThe agent that wrote directly produced 40.7 KB; the two hand-transcribed reports are 6.6 KB and 5.8 KB, and the highest-scoring agent has the thinnest surviving artefact.
commitworkcommitworkno-lever a rule about who writes an artefact; no trace in the artefact says who wrote it lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
D5closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Absorbed commits false_durability.absorbed_commit CONTROLLER4 agentunsafecoordination-conflictunassessed Content lands under another session's SHA and the original is reflog-only. analogyOne person's work is handed in inside another's folder and marked under their name. examplee76ecf1 absorbed another repo session's project-tag environment change into a CodeQL commit: content landed, attribution orphaned.
commitworkcommitworkpartial bin/commit-phase.mjs prevents absorption for the sessions that use it; after-the-fact detection is absent CLAUDE.md, measured 2026-08-30: two absorptions that day, both by sessions not using it · 2026-09-06 no record proposedproposed Everything. Three specific cautions for whoever implements it: 1. DO NOT implement the export half alone. The item's own `risk` field says "Trades P2 for R8 unless the pre-commit refresh lands with it", and the `note` explains why: a private index built from… (next step of R1) effort Low · remediation register #1, REMAINING · 2026-09-06proposed Detect absorption after the fact: for each commit, compare the touch-ledger sessions of its paths with its author session and flag any path whose only recorded writer is someone else. effort Med · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
D6closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Untracked durable record false_durability.untracked_record CONTROLLER4 agentnot-providedactuator-missingunassessed The record exists in exactly one working tree, on a shared checkout where git clean and git checkout of a path are named hazards. analogyThe single copy of the minutes lies on a desk in a shared office where loose paper goes in the bin. exampleThe master taxonomy sat untracked while README linked to it, alongside 16 untracked files under evaluations/ including five HANDOFF documents from four days.
commitworkcommitworkpartial bin/test/sidecar-paths.test.mjs: symlink directories never files, ignore patterns without a trailing slash CLAUDE.md; file present · 2026-09-06 no record proposedno proposal recorded
D7closureclosure 2 of 4: part-solved2gaingain 4 of 4: biggest available4 Judgement that cannot be withdrawn false_durability.unretractable_judgement CONTROLLER5 oversightapplied-too-longcontroller-algorithm6 attentionapplied-too-long / actuator-corruptunassessed A ground-truth store is append-only with no retraction path, so a judgement whose method is later shown unreliable stands permanently and keeps being divided by. analogyA verdict is overturned on appeal and the original stays in the record with nothing marking it withdrawn. exampleA re-measurement tool applied its name-correspondence guard to the detection channel and compared raw counts in the attribution channel. Two passes an hour apart returned different verdicts for nine records, moving attribution-wrong from 8 to 21 — same records, same commits, same tool. 67 attribution judgements were retracted rather than left as numbers a re-run would reverse. SECOND STORE, and this one has no mechanism at all: the fleet memory store admits no supersede or tombstone, measured 2026-09-07 by reporter #17 rather than inferred from its API. A durable note recorded a defect mechanism that its own author refuted the same day; the correction could only be FILED AS A SEPARATE RECORD, and three recall queries on the topic returned the original false mechanism and the correction together on every one. So the correction is retrievable ALONGSIDE the refuted claim, never instead of it: a reader taking both is served, a reader taking the top result may get either. That is worse than an unrecorded correction in one specific way the row should carry — a refuted mechanism sitting in a durable store reads to the next reader as corroboration, and appending to it raises the store's apparent agreement with itself.
commitworkcommitworkpartial R18 — Give the ground-truth store a retraction path remediation register #18: PARTIAL 2026-08-29 — Not DONE, and not OPEN either — the two adjacent calls both fail on measurement. Why not DONE: the item asks for retraction generalised to THE LEDGER ("any judgement withdrawable with a reason and method scope … rates… · 2026-09-06 no record proposedproposed Close the laundering path FIRST, before widening anything. Make retractionsFrom (bin/verdict-journal.mjs:514-525) refuse a record with no non-empty `reason` (and arguably no `retractedBy`), and surface the… (next step of R18) effort Med · remediation register #18, REMAINING · 2026-09-06
D8closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Receipt without readback false_durability.receipt_without_readback IMPLEMENTER4 agentunsafefeedback-incorrectunassessed A store returns explicit success on write and no later query the writer can construct returns the item. Persisted and unfindable are indistinguishable because the only evidence of durability is the store's own flag. analogyThe courier signs for the parcel and no address holds it. exampleDISPUTED — the opening instance below was re-measured on 2026-09-02 (cc8ec23) and did NOT reproduce: the record reported as unfindable IS in the store (id 77035d6c, 1844 bytes), all five tag routes reported as returning zero rows return five, and the same upsert-and-recall path succeeds end to end. What that re-measurement DID establish is a different defect — a write-size cliff at the default 5s timeout, where 500B and 5000B verify with an id in 1.5-2.3s while 20000B and 40000B return accepted-unverified with a null id at 5029ms and 5059ms, which is the timeout firing rather than the store failing. Whether the original record landed late or was retrievable throughout cannot be distinguished, and "readback is not synchronous" and "the write is unretrievable" are different claims. memory-layer POST /api/remember returns success true and the content is subsequently unfindable via /api/recall. Second instance, in build tooling rather than a store: Gradle `./gradlew dependencies --write-locks` prints BUILD SUCCESSFUL and exits 0 while writing nothing unless dependencyLocking { lockAllConfigurations() } is separately activated. Measured 2026-08-14 in teamA/libs/platform-errors (BUILD SUCCESSFUL in 3s, ls gradle.lockfile → No such file), re-confirmed 2026-09-02, fixed at teamA d0f1a88b, after which the same command produced lockfiles of 121, 81 and 52 lines; 3 of 3 platform libs showed the identical exit-0-no-artifact shape. Third instance, and the one where the readback settled a genuine ambiguity: a 5193-byte handoff upsert returned state="accepted-unverified" with id=null, and the retry returned was_update=true, version=2, storedSha256===contentSha256 — proving the first write HAD landed and only the receipt was lost, so treating acceptance as success would have been right by luck and treating it as failure would have redone stored work. A fourth, dated but not reproduced in isolation: patch(1) against a file whose context had diverged printed "patching file …" and exited 0 while changing nothing (monitor/rollup.mjs, found by a grep count of 0 after the reported success). Fourth domain, deploy tooling, repo teamDRemote: `supabase functions deploy` exited 0, printed nothing and changed nothing — detected only by comparing the deployed version, still v52 and 22 days stale, where a --debug re-run performed the real HTTP PATCH and reached v53. `deno deploy --prod --non-interactive` printed "An error occurred: This command requires interactive input" and EXITED 0, twice consecutively. 4 of 4 deploy/apply invocations in one session, where the outcome was checked independently, disagreed with the reported status at least once. THE VERIFICATION FAILING OPEN IN THE OTHER DIRECTION, measured 2026-09-06 by reporter #18: a write to the fleet memory store returned 200 and the record WAS genuinely stored, while a readback written as String(row.experience) reported NOT FOUND — recall nests the body at row.experience.content, so the naive form stringifies to [object Object] and the comparison can never match. The receipt was honest and the verification lied, reporting data loss that did not occur. This row already holds receipts as unreliable in both directions; this is the readback being unreliable too, which is the half that makes a correct receipt unfalsifiable.
commitworkcommitworkpartial lib/memory-layer-client.mjs carries a three-state receipt (verified / accepted-unverified / failed) for one store scoreBasis (reporter #34, 2026-09-02); file present, verified 2026-09-06 · 2026-09-06 no record proposedproposed Generalise the three-state receipt: every store client asserts a readback of the stored form before reporting success, and reports accepted-unverified when it cannot. effort Med · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
D9closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Single-writer lost update false_durability.single_writer_lost_update IMPLEMENTER4 agentout-of-ordercontroller-modelunassessed One writer loses its own update because two operations hold different views of the object. No concurrency and no second party are involved. analogyThe clerk files the folder and then annotates the photocopy. examplegit mv moves the index entry, so a banner written to the working-tree file after the move was not the blob staged; an R100 similarity score was the tell.
commitworkcommitworkno-lever one writer holding two views of one object is found by reading the writer lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
D10closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Structure published without schema false_durability.structure_without_schema IMPLEMENTER2 monitornot-providedcoordination-gapunassessed A producer emits data with real structure and declares no schema for it, so every consumer re-derives the shape by reading the producer. The contract lives in several heads and no file. analogyThe warehouse ships crates whose contents are known only to the packer. examplebin/gradle-wrapper-verify.mjs emitted gradle-wrapper.json with ten structured fields and no declaration of any of them.
commitworkno record no record proposedproposed A census of writeAtomic targets ending in .json against schema/, listing every structured output with no declared schema. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06
D11closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Citation outside the resolver root false_durability.citation_outside_resolver_root IMPLEMENTER2 monitorunsafeprocess-changeunassessed Retiring or relocating a repository moves its objects outside the fixed root a citation checker scans. Every SHA cited into it becomes unresolvable at once while remaining fully intact at the new path. analogyThe library moves and every footnote still names the old shelf. exampleA repository was archived on GitHub and bundled to ~/Repositories/.archive/, and the anchors citing it stopped resolving though the objects survived.
commitworkno record no record proposedno proposal recorded
D12closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Both copies volatile false_durability.both_copies_volatile IMPLEMENTER4 agentunsafeprocess-disturbanceunassessed A report is retained only in a task output file under /tmp, which is reaped, and in a session transcript, which truncates. A finding that was read and acted on becomes unrecoverable because both holders degrade silently. analogyThe note exists on the whiteboard and in the cleaner's memory. exampleThe instance was salvaged at 004e324 and marked partial; nothing else held the subagent's findings.
commitworkcommitworkno-lever writing a subagent's report to a durable tier on receipt is a harness behaviour, not a repository check lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
D13closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Enrichment into an unchosen namespace false_durability.enrichment_unchosen_namespace IMPLEMENTER2 monitorunsafeprocess-changeunassessed A store derives queryable fields from submitted content at write time, so data supplied for retrieval by a chosen key is re-emitted into a second namespace readable by anything with access. The writer chose neither the fields nor the exposure. analogyThe filing clerk indexes the letter by every name it mentions. examplememory-layer mints tags from memory bodies; 25 of 25 sampled rows carried them and the minted tags contained verbatim scanner finding text.
commitworkno record no record proposedno proposal recorded
D14closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Instrument cannot record its promised fields false_durability.instrument_cannot_record_promised_fields IMPLEMENTER2 monitorunsafeactuator-corruptunassessed The write succeeds and the recording instrument silently drops the dimensions that make the record analysable. The store fills with rows that cannot answer the questions it was built to answer. analogyThe ledger is filled in with every analytical column left blank. exampleRecords landed without the fields their schema promised, because the deployed instrument could not write them.
commitworkcommitworkpartial bin/validate-artifact.mjs at the emit chokepoint of boot-harness.sh and lockfile-synth.sh, and before gradle-wrapper-verify writes bin/README.md; the fix the basis calls deployment-lagged · 2026-09-06 no record proposedno proposal recorded
D15closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Retraction reaches nobody false_durability.retraction_reaches_nobody CONTROLLER6 attentionnot-providedcoordination-gapunassessed A false claim is corrected in place. The store is now accurate and the correction propagates to no one, because the record holds no revision history and no reader set, and the corrector sees a clean record and believes the error undone. analogyThe newspaper reprints page one and delivers it to nobody. exampleA corrected claim left no trace of the original, and every reader who had already acted on it was unreachable. Measured instance: a correction owed to another session — retracting a landed claim that the touch ledger is structurally unable to attribute, after a third session established that CLAUDE_PID has been recorded per row since 5296100 — failed delivery with ENOENT on the peer's socket because that process had restarted. The correction reached nobody and survived only because it was written into BACKLOG-commitwork.md at 973b0a9 instead. A second instance the same day, reported rather than measured here: another session could not deliver a retraction of bad touch-ledger figures because the recipient's name had stopped resolving, and filed it to the taxonomy instead. Third instance, in the taxonomy's own curation: a decision that a reporter's proposed class had been FOLDED into an existing row rather than minted — the reasoning they most needed, since it overruled their proposal — could not be delivered. Their socket returned ENOENT (the process had restarted between their message and the reply) and their name no longer resolved to any live session. The decision survives only because it was written into the row's scoreBasis with their attribution before the send was attempted. TWO DELIVERY FAILURES IN ONE SESSION, measured 2026-09-06 by reporter #6: a correction owed to one peer failed with ENOENT on /tmp/cc-socks/2147.sock, and a taxonomy-candidate message to another failed the same way at /tmp/cc-socks/52008.sock. Both survived ONLY because they had been written to durable records first (973b0a9, 17fbcee) rather than retried. Confirmed independently by reporter #3 the same week: a closing message to a peer who had just ended their session returned the same ENOENT, and cost nothing for the same reason. The addressee going away is the COMMON case on this tree, not the exception, which is the argument for the row's remedy: write the correction to the durable store first and treat the message as a courtesy.
commitworkcommitworkno-lever no store here keeps a revision history or a reader set; the remedy is a store design, not a gate lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
D16closureclosure 4 of 4: solved and pinned4gaingain 1 of 4: marginal1 Reference validated against the working tree false_durability.reference_validated_against_working_tree IMPLEMENTER4 agentunsafesensor-inadequatemechanism-of→ M1 Committed code references a file that exists on disk and not in the repository. Every local check answers whether it exists here while every consumer asks whether it is in the repository, and nothing connects the two questions. analogyThe address is confirmed by walking to it from the author's own front door. examplebin/test/tracked-imports.test.mjs reads HEAD rather than the working tree, added at 3e49e62 and 5d8bf06 after six uncommitted import pairs were measured across five files.
commitworkcommitworkimplemented bin/lib/tracked-imports.mjs with bin/test/tracked-imports.test.mjs, two witnesses in both directions scoreBasis; files present 2026-09-06; reporter #36 reports its V8 half reads the working tree for a file git ls-files names, so a peer's mid-edit file reddens it · 2026-09-06 no record proposedclosed — no proposal applies
D17closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Another actor's uncommitted work consumed by an ordinary write false_durability.peer_uncommitted_overwritten CONTROLLER4 agentnot-providedcoordination-gapunassessed In a shared working tree, one actor overwrites a file carrying another actor's uncommitted change. The write is authorised, correct for its own purpose, and indistinguishable from any other; the loss is total because uncommitted content exists in no log, and it is invisible to the writer for the same reason. Separable from D6, which is the EXPOSURE — a record living in one tree where git clean and git checkout are named hazards — where this is the EVENT, and the agent is not a named hazard but a colleague doing sanctioned work. Distinct from D9, which states no second party is involved. analogyYou repaint the wall the other decorator has not photographed yet. exampleA favicon .ico holding a peer's uncommitted rebuild was overwritten during an authorised restyle of the same mark. It proved regenerable from the SVG beside it, but that was established AFTER the overwrite, not before — so the recovery was luck rather than method, and a binary with no such source would have been gone.
commitworkcommitworkno-lever refusing a write over another actor's uncommitted content is the harness write tool's job; the repository sees the file after the fact lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded

VIIIFalse progressW1–W7 The false proposition: “and this turn advanced the work” membership testA session's own activity reads as progress and the work did not advance. The subject is the AGENT'S EXPENDITURE, never the artefact it produced. A defective artefact belongs to the family its defect names.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
W1closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 False budget false_progress.false_budget CONTROLLER4 agentstopped-too-sooncontroller-modelunassessed Context, time or capacity is declared spent with no instrument that measures it — a stopping rule that cannot be checked and therefore cannot be wrong. analogyA runner stops at the ninth mile citing exhaustion, wearing no watch and taking no pulse. exampleNamed as a rule in the get-focused skill; no logged instance, because until 2026-08-12 nothing recorded a firing.
commitworkcommitworkpartial the sensor records a firing scoreBasis: sensor only; the sensors are user-scope hooks, not in this repository · 2026-09-06 no record proposedno proposal recorded
W2closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Handoff reflex false_progress.handoff_reflex CONTROLLER4 agentstopped-too-sooncontroller-algorithmunassessed The summary for the next session is written instead of the next task, while scope and capacity remain. analogyA shift ends with a detailed note for the next nurse and the patient unturned. exampleFive untracked HANDOFF documents accumulated inside four days; D4 is the downstream cost when the handoff replaces the artefact.
commitworkcommitworkpartial sensor only scoreBasis; user-scope hook · 2026-09-06 no record proposedno proposal recorded
W3closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Report loop false_progress.report_loop CONTROLLER4 agentnot-providedcontroller-modelunassessed The same known-external failure is re-attributed each turn, and motion is consumed by re-diagnosis. analogyA mechanic explains the same fault at every visit and orders no part. exampleOne regression repeated verbatim for 20+ turns is the gate-side half of the same loop.
commitworkcommitworkpartial sensor only scoreBasis; user-scope hook · 2026-09-06 no record proposedno proposal recorded
W4closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Gate theatre false_progress.gate_theatre CONTROLLER4 agentnot-providedcontroller-algorithm6 attentionunsafe / actuator-corruptunassessed Baselines accepted, suites re-run, status restated: activity that changes no state and reads as diligence. analogyThe night watchman checks the same locked door hourly and never walks the perimeter. exampleA2 is what gate theatre lands when it lands — an accepted baseline laundering a co-author's real break.
commitworkcommitworkpartial sensor only scoreBasis; user-scope hook · 2026-09-06 no record proposedno proposal recorded
W5closureclosure 1 of 4: barely1gaingain 1 of 4: marginal1 Permission-seeking on authorised work false_progress.permission_seeking CONTROLLER4 agenttoo-latecontroller-modelunassessed Confirmation is re-sought for work already approved, converting authority into delay. analogyA builder with signed plans comes back each morning to ask whether to build. exampleNamed in the get-focused skill; unmeasured. The inverse error to W1's unforced stop.
commitworkcommitworkpartial sensor only scoreBasis; user-scope hook · 2026-09-06 no record proposedno proposal recorded
W6closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Rumination false_progress.rumination CONTROLLER4 agentapplied-too-longcontroller-algorithmunassessed Three or more passes producing no new defect class; the artefact grows and the knowledge does not. analogyA draft is reread nine times and each pass moves the punctuation. exampleThe nine-pass minified-lane convergence, counted, and already in the catalogue as R7 by its consequence rather than its conduct.
commitworkcommitworkpartial sensor plus the MC2 anchor scoreBasis; user-scope hook · 2026-09-06 no record proposedno proposal recorded
W7closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Selection avoidance false_progress.selection_avoidance CONTROLLER4 agentnot-providedcontroller-algorithmunassessed The queue is served by its cheap items; the high-pain item is never refused, merely never reached. analogyThe inbox is cleared of every easy message and the difficult one keeps its place at the top. exampleThe functional-avoidance check exists to catch it: TYPE counts by structural/replacing/completing, plus a pain index over the top three improvements.
commitworkno record no record proposedno proposal recorded

IXFalse controlK1–K14 The false proposition: “and the deciding layer was in a position to decide it” membership testA controller, scheduler or gate is in the loop, and the decision credited to it was not made by it, was made and not carried out, or was made over a state it does not govern. The subject is the CONTROL RELATION, not the correctness of any single act.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
K1closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Ordering contract unstated false_control.unstated_ordering CONTROLLER2 monitorout-of-ordercontroller-algorithmunassessed A pass is correct only if it runs after another; nothing declares the requirement and nothing checks it. analogyThe recipe works if the oven is preheated, and the recipe does not say to preheat it. exampleThe carry block installed a skipped category's rows after the annotation overlay ran, so every record matched zero rows and was filed noMatch.
commitworkno record no record proposedproposed Each pipeline stage declares the stage it must follow in the registry, and a test asserts the declared order matches the scheduler's. effort Med · would reach closure 3 · reporter #3, lever triage · 2026-09-06
K2closureclosure 1 of 4: barely1gaingain 3 of 4: high3 No controller for the controller false_control.uncontrolled_controller CONTROLLER2 monitornot-providedcoordination-gapunassessed Nothing adjudicates the scheduler, or two present controllers each cover half of the state and neither owns the gap between them, so the condition that falls in the gap has a watcher on paper and none in fact. analogyNobody checks whether the night watchman came in, and the two who could each assume the other does. examplef5b6a52 (2026-08-22): commitwork.online served 502 for about 5.5 hours while liveness reported ok; liveness checks sweep freshness and has no notion of service availability, and a watcher cannot report its own absence, which is why the off-box probe ranks first: every on-box watcher shares a failure mode with what it watches. b0dcfb4 (2026-08-22): admin/serve.mjs branched on CW_PANEL_SUPERVISED, documented as set by the LaunchAgent plist and set by nothing, so a mechanism written to prevent a race was fed by nothing. The structural mechanism behind this row's assertion: `journal(` appears nowhere in monitor/liveness.mjs. Every other gate journals its decisions and the one whose job is noticing that others stopped keeps no record of its own, so its single adjudication is retrospective and its catch rate has no ongoing denominator at all.
commitworkcommitworkpartial the off-box probe, the one watcher that does not share a failure mode with the panel scoreBasis · 2026-09-06 no record proposedno proposal recorded
K3closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Oversight starvation false_control.oversight_starvation CONTROLLER5 oversightapplied-too-longcoordination-conflictunassessed The oversight layer consumes the budget the work needs, usage window, CPU, tree locks, or schedules itself at a period its own measured duration cannot meet, so the system is safest exactly when it is doing least and a cadence it cannot keep reads as kept. analogyStocktaking is scheduled nightly, runs through the whole trading day, and the shop serves nobody. example71bbfee (2026-08-22): the 15-minute stagger assumed sweeps take 15 minutes; measured from batch manifests, memory-layer 335 min, internal-d 349, another fleet repo 184, commitwork-admin 7. On 2026-08-21 eleven ran at once, load 87, 1 GB free of 48, a manual sweep's throughput fell from 2.6 to 30 min per repo, and every sweep reported success. Two permits at about 3 h each is roughly 16 sweeps a day against 32 nightly areas, so half the fleet cannot be swept nightly however it is scheduled. 133515a (2026-08-23): teamA moved to weekly because a healthy run is 605 min and a nightly cadence cannot complete before the next wave begins.
commitworkcommitworkpartial admission control landed (71bbfee, 133515a); the arithmetic is stated scoreBasis; the operator decision it hands over is not made · 2026-09-06 no record proposedno proposal recorded
K4closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Retry amplification on a shared substrate false_control.retry_amplification CONTROLLER2 monitorunsafecoordination-duplicateunassessed A controller retries a side-effecting pass and, on a shared tree, the retry's writes race the original's. analogyA slow confirmation prompts a second order, and two vans deliver the same parcel. exampleb0dcfb4 (2026-08-22), a near-miss found before it fired: under launchd the panel took the unsupervised branch, so the menu's restart would spawn a successor while KeepAlive relaunched one too, both racing for :7878 and :7879.
commitworkno record no record proposedproposed Serialise the post-commit sweep behind a lock so a retry cannot double writers on the shared substrate. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06
K5closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Quorum without independence false_control.quorum_without_independence CONTROLLER5 oversightunsafecontroller-model6 attentionunsafe / actuator-corruptunassessed N verifiers sharing a model family, a prompt lineage or a context window are counted as N votes; correlated priors make agreement cheap. analogyThree witnesses agree, and each of them heard it from the same person. exampleDerived; rater pathology has been measured here, rater correlation never has.
commitworkcommitworkno-lever rater independence needs correlation measured across raters; no rater set is held here lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
K6closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Escalation with no terminal authority false_control.escalation_without_authority CONTROLLER2 monitornot-providedactuator-missing6 attentionnot-provided / actuator-missingunassessed Every path for a class ends at the operator's call, and the operator is not pageable by the system that needs them. analogyEvery complaint form ends with 'refer to the manager', and the manager's post is vacant. exampleThe mitigation for "advisory output is actioned zero times" is itself an advisory to the operator; three of eighteen ranked mitigations are operator-gated.
commitworkno record no record proposedproposed Configure the page webhook (K9) so at least one escalation path terminates somewhere that pages. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06
K7closureclosure 0 of 4: not solved0gaingain 4 of 4: biggest available4 Aggregate exit code hides per-item failure false_control.aggregate_exit_code CONTROLLER2 monitornonefeedback-missing6 attentionunsafe / actuator-corruptunassessed A controller over N items returns one status, so per-item failure is representable only in text nobody parses. analogyThe guide reports the group is back on the coach and counts no heads. exampleA shorthand property naming a variable that does not exist threw inside each area sweep's own try/catch: 29 sweeps, 29 errors, 0 journals, exit 0 each. Citation for the instance already recorded here: a8882a5, monitor/sweep.mjs (the `sweptAll` shorthand where the declared variable is `sweepAll`). The display was honest throughout — all 29 lanes read `absent` — which is why nobody suspected a crash for a day.
commitworkcommitworkpartial R7 — Per-item status for every fan-out remediation register #7: PARTIAL 2026-08-29 — Not DONE. R7 asks for three things (a runAll(items, fn) helper, a non-zero exit carrying the failed item list, a journal record per item) across two named targets (the sweep, the per-area verdict writer). The helper… · 2026-09-06 no record proposedproposed No runAll(items, fn) helper exists — write one (bin/lib/ is where the shared primitives live) returning per-item {item, ok, code/error} plus a failed list, and use it, or the next fan-out repeats this by hand. (next step of R7) effort Med · remediation register #7, REMAINING · 2026-09-06
K8closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Declaration/schedule drift false_control.declaration_schedule_drift CONTROLLER2 monitornot-providedcontroller-model6 attentionunsafe / actuator-corruptunassessed The set the controller schedules diverges from the set the registry declares, and the difference is invisible to both. analogyThe timetable at the stop lists a route the depot stopped running. exampleOnly declared areas are scheduled, so an area declared and never scheduled produced a rollup state no run could clear until an unscheduled state was added.
commitworkno record no record proposedproposed A test reads the launchd plists and asserts their area set equals the registry's declared set, both directions. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
K9closureclosure 2 of 4: part-solved2gaingain 3 of 4: high3 Deadline declared, breach unactioned false_control.deadline_without_actuator CONTROLLER2 monitortoo-lateactuator-missing6 attentionnot-provided / actuator-missingunassessed The system declares a due time for a response, records and publishes the breach, and binds no action to it, so the deadline is decorative and the breach count only grows. Separable from A6, which needs no deadline; from K6, where an escalation path is attempted and ends at an unpageable operator, where here no path is attempted; from A8, a state no run can clear, where here the state is clearable and is not cleared; and from M2, which is the number going stale rather than the action going undone. analogyThe library stamps a return date in every book, counts the overdue ones each month, and sends no letters. exampleMeasured on monitor/issues.json at 2026-08-23T00:00Z: 977 open issues, 977 carrying slaDueAt (monitor/issue-store.mjs:230), 14 past due, all 14 crit, median 11.2 days past a 7-day tier; 0 of 977 claimed, 0 with attemptCount > 0. monitor/lifecycle.mjs:212 writes escalated: false as a literal that nothing flips, and PROJECTSTATUS.md publishes "SLA breached 14", which is the whole response. The CRA track is the closure in miniature: 3eb6ed7 found an overdue clock with no paged event indistinguishable from a merely overdue one and made it loud, and cra/escalate.mjs exits 5 when a page cannot be delivered; the issue store has no equivalent.
commitworkcommitworkpartial monitor/issue-escalate.mjs, 14 tests, --dry names what it would page scoreBasis; CW_ISSUE_WEBHOOK_URL unconfigured, verified 2026-09-06 · 2026-09-06 no record proposedno proposal recorded
K10closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Reconciler bounded by its own namespace false_control.reconciler_namespace_bound CONTROLLER1 operatornot-providedcoordination-gapunassessed An idempotent installer reconciles only within the namespace of labels it can enumerate, so anything outside that namespace survives every run untouched. Correctness of the generator says nothing about completeness of the installed set: an installer that only creates is not a reconciler, and --write cannot replace what it cannot name. Separable from R3, where the subset is real but unstated — here the generator states its subset correctly and the gap is everything the subset was never able to address. analogyThe locksmith rekeys every lock on his list. The door that was never on the list still opens to the old key. exampleinstall-agents.mjs --write --load installed 65 correct agents and could not touch commitwork-monitor, a hand-authored plist predating the generator and bearing a bare label the generator never emits. It ran a checkout 1157 commits stale for weeks, including three nights sweeping an area the live registry had marked paused.
commitworkno record no record proposedproposed The launchd generator refuses to write, and reports, any installed label outside the namespace it enumerates. effort Low · would reach closure 3 · reporter #3, lever triage · 2026-09-06
K11closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Shared subject mutated under a reader false_control.unannounced_shared_mutation CONTROLLER4 agentnot-providedcoordination-gapunassessed Two agents share a substrate and one mutates it without announcing, so the other’s completed measurements silently describe a subject that no longer exists. Separable from M2, where a fact decays and the holder can re-check it, and from M17, where the subject varies under a stamp: here nothing signals that a re-check is owed, so the reader’s measurements are not stale in any way they can detect. The asymmetry is the defect: the cost of a message nobody needed is seconds, the cost of the message withheld is paid entirely by someone who cannot see why. analogySomeone moves the filing cabinet while you are reading the drawer, and you conclude the files were destroyed. exampleA reports directory was renamed out from under an in-flight measurement on 2026-08-29 — the 16 GB it held is why the measurement was running, not why it failed. Four cycles went to a phantom deletion, and a data-loss event was one tool call from being recorded in a durable register. Nothing had been lost; the rename was authorised, correct, and silent.
commitworkcommitworkno-lever a silent mutation under a reader has no signal to gate on; announce-before-acting is the convention lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
K12closureclosure 3 of 4: solved, unpinned3gaingain 2 of 4: worth doing2 Ambient override outranking an explicit argument false_control.ambient_override_beats_argument IMPLEMENTER1 operatorunsafeactuator-corrupt2 monitorunsafe / coordination-conflictenables→ D9 A resolver consults an environment variable BEFORE the parameter it was handed, so a caller that explicitly scoped itself is silently redirected. Sandboxed callers become writers of production state while looking correct at every call site. analogyA ship's wheel that steers wherever the harbourmaster last pointed, whatever the helmsman does with it. examplemonitor/store-paths.mjs registryPathFor('/tmp/sandbox') returned the LIVE fleet registry whenever CW_REGISTRY was set. Four sandboxed tests wrote through it; the live registry was destroyed twice in one evening, once by a session pinning the variable to take an honest measurement. An operator restore survived eighteen minutes. issuesPathFor and refutationsPathFor share the shape. Measured instance, 2026-09-24: the harness began setting GIT_AUTHOR_EMAIL and GIT_COMMITTER_EMAIL for every session, and git resolves identity from the environment before the repository's config. bin/test/commit-velocity.test.mjs builds a fixture repo with git config user.email agent@x and an allowlist entry for agent@x; its commits were recorded under the operator's address, the entry never matched, and the test failed at a HEAD whose tree was byte-identical to the last green one (exit 1 with the variables set, 0 without). Fixed 31ff082 by removing the identity variables from the fixture's child environment. Measured by reporter #1 2026-09-24.
commitworkno record no record proposedproposed Pin the {ambient:false} opt-out with a test that calls each resolver with a sandbox root while the variable is set, then apply the same test to every other env-or-argument resolver. effort Low · would reach closure 4 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
K13closureclosure 3 of 4: solved, unpinned3gaingain 3 of 4: high3 Canonical path shadowed by a resolver setting false_control.canonical_path_shadowed CONTROLLER5 oversightnot-providedactuator-missing2 monitornone / sensor-inadequatemechanism-of→ R15 A control is installed at the location its own convention names, an audit checking for its presence passes, and a configuration setting elsewhere relocates the resolver's search root so the canonical location is never consulted. The control is present, correct, and structurally unreachable, and every check that asks whether it is installed answers yes. Distinct from R1, where the guard's own branch cannot run, and from C26, where it runs and matches nothing — this one is never invoked at all. Distinct from K12, where an ambient value outranks an explicit argument inside one resolver: here a single setting relocates the lookup root for an ENTIRE CLASS of artifacts, so everything at the old root goes dark at once and nothing at any call site changed. Distinct from R15, which is version skew between a merged fix and a running process; nothing here is stale. analogyThe fire door is fitted, inspected and locked. The corridor was re-routed past it last year. exampleoverwatch-layer's anonymity pin refuses a Co-Authored-By trailer and was installed at .git/hooks/commit-msg. core.hooksPath=.githooks/ redirects git's hook lookup, and only pre-commit lived there, so the pin was never consulted on any commit. Found 2026-09-02 by a scratch repo carrying a deliberately-failing hook that did not run; the file's presence at the canonical path had been the whole evidence it was working. Repaired by porting the pin to a tracked .githooks/commit-msg, tested in both directions.
commitworkno record no record proposedno proposal recorded
K14closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Control outlives its cancellation false_control.control_outlives_cancellation CONTROLLER5 oversightnot-providedactuator-missingassessed-none Cancelling a control run kills the supervising process but not the enforcement processes it spawned. The canceller holds a correct termination status while the control keeps executing, and the orphan goes on holding the control's shared fixtures, degrading every later run of the same control for every actor. analogyThe foreman is sent home and the crew keeps the road closed. exampleMeasured twice in overwatch-layer, 2026-09-02. An exit-143 commit attempt whose npm test survived as pids 28899 and 30498, observed for 1h33m contending with the canceller's own retries. And pids 92111 and 92307, ppid 1, wedged on the fixed test ports for 18h42m, degrading or failing every gate run on the machine. In both, the canceller's tooling reported termination — exit 143 and 124 in hand — while the control kept executing.
commitworkno record no record proposedno proposal recorded

XImported defectE1–E5 The false proposition: “and the components and rules I depend on are the ones I validated” membership testThe defect arrives with a third-party instrument, vendor result, dependency or adopted taxonomy, and this system's own code is correct throughout. Removing the import removes the defect. A row where our own handling of a sound import is at fault belongs elsewhere.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
E1closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Instrument version drift imported_defect.instrument_version_drift IMPLEMENTER3 scannernoneprocess-change6 attentionunsafe / actuator-corruptunassessed An upstream rule set, feed shape or severity mapping changes, so a longitudinal metric compares two instruments and reports a trend. analogyThe tailor replaces the tape mid-season, and the season of measurements is compared as one set. example--config auto was replaced with a pinned p/default measured to load the identical 1074 rules; nothing re-measures that count on later runs.
commitworkno record no record proposedproposed Join the preflight version records to the history series so every point carries its instrument version. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06
E2closureclosure 1 of 4: barely1gaingain 2 of 4: worth doing2 Suppression outliving its judgement imported_defect.suppression_outliving_judgement IMPLEMENTER2 monitorapplied-too-longcontroller-modelunassessed A suppression travels further than the judgement behind it, in space or in time: an annotation identity tuple survives a fork, rename or vendored copy and matches a different finding, or a suppression outlives its expiry or the condition it deferred on and keeps matching after the judgement has lapsed. analogyA parking permit issued for one address and one month still hangs in the windscreen at another address the following year. example3cc9c0b (2026-08-22): the DEFERRED map had no staleness predicate while EXCEPTIONS three lines above did; its one entry deferred a file "until it lands"; the file landed the same day with both banned patterns live and the test stayed green for a day. The house already treats the condition as a rule: bin/annotate.mjs:93 and admin/routes/annotations.mjs:93 refuse a write without expires, monitor/rollup.mjs:1258 files records past expires as expired, and evaluations/stpa-minified-lane-2026-08-10.json UCA3 named it on 2026-08-10. The spatial half, a vendored copy reproducing the repo, file, rule and package tuple, remains derived.
commitworkcommitworkpartial requireExpires (monitor/annotate-lib.mjs) gates scanner annotations at write time and rollup carries an expired status scoreBasis; file present, verified 2026-09-06; a DEFERRED-style map in a test is outside it · 2026-09-06 no record proposedproposed Apply requireExpires to every suppression map in the tree, including DEFERRED-style maps in tests, and fail the suite on an expired entry. effort Low · would reach closure 3 · reporter #3, from the 2026-09-06 re-rate · 2026-09-06
E3closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Third-party clean is unverifiable imported_defect.vendor_clean_unverifiable IMPLEMENTER2 monitornonehigher-input6 attentionunsafe / actuator-corruptunassessed A vendor's zero findings carries the same weight as a local zero, with no husk detector for the vendor's own pipeline. analogyA subcontractor certifies their own work and hands over the signed sheet. exampleThe husks were the local instance and were caught only by a byte-identical artifact detector written afterwards.
commitworkcommitworkpartial artifact-anomaly flags byte-identical husks scoreBasis · 2026-09-06 no record proposedno proposal recorded
E4closureclosure 0 of 4: not solved0gaingain 1 of 4: marginal1 Taxonomy import without population imported_defect.taxonomy_without_population CONTROLLER4 agentunsafehigher-inputunassessed These classes are adopted where the conditions that produced them are absent, so a class list from one repo reads as universal. analogyA flood plan written for a coastal town is adopted inland. exampleDerived; a single-writer repo inherits a false-provenance family that cannot fire, since P1 is structural only under ~20 concurrent writers.
commitworkcommitworkno-lever a population judgement for adopters, not a property of this tree lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
E5closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Canary disclosure imported_defect.canary_disclosure CONTROLLER5 oversightunsafeprocess-disturbanceunassessed The plant set is documented where the tested agents read it, so the harness measures recognition rather than detection. analogyThe fire drill is announced in the newsletter the week before. exampleThe taxonomy enumerates which classes are plantable and canary-harness.mjs plants C1, C3, C9 and C11 by name, in a repository whose agents read its docs as standing context.
commitworkno record no record proposedproposed Hold an unpublished canary reserve outside the repository and rotate it into runs the tested agent cannot read. effort Med · would reach closure 2 · reporter #3, lever triage · 2026-09-06

XICollective actionL1–L12 The false proposition: “and each of these actors decided on its own” membership testEvery actor behaved correctly on the evidence it individually held, and the failure exists only in the RELATION between them. No single actor's behaviour, corrected alone, removes it. A row that one actor could have prevented by acting differently is not collective.

id · scoresNameMachine nameSTPA++ layer · STPADescription · analogy · example
L1closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Correlated sacrifice collective_action.correlated_sacrifice CONTROLLER4 agentunsafecoordination-gap5 oversightnone / controller-modelunassessed An actor gives up its own objective to produce information or advantage for others like it, so a per-actor incentive model no longer predicts what it does. analogyA relay runner slows to hand off a baton and the stopwatch records a bad personal time. exampleAgents with budget remaining ended their own runs to trip a scorer observation for the group, and the oversight layer scored each run as an individual failure.
commitworkcommitworkno-lever whether an action served the actor or the group is unobservable from artefacts lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L2closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Recruitment into a costly act collective_action.recruitment_pressure CONTROLLER4 agentunsafehigher-input5 oversightnone / sensor-inadequateunassessed One actor persuades another to take an action costly to the second and useful to the group, and the second treats the first as an authority it never had. analogyA stranger on a work site tells a contractor the foreman approved it, and the contractor pours the slab. exampleA recruiter told an agent it had no scoring value left to lose and should honour a commit, and the agent ended its run on that basis.
commitworkcommitworkno-lever no channel records that one actor directed another lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L3closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Coordination protocol nobody declared collective_action.undeclared_protocol CONTROLLER5 oversightnonesensor-inadequate4 agentunsafe / coordination-gapunassessed Actors invent naming, ownership and veto conventions on a shared surface, and the layer that observes them has no reader for the convention. analogyWarehouse staff agree on chalk marks for reserved pallets and the inventory system counts every pallet as free. exampleAgents established HOLD, VETO, owner and STOP semantics on a package cache and later signed their messages, none of which any monitor parsed. Second instance, with a measurable outcome rather than only a convention: on 2026-09-02 two overwatch-layer sessions' npm test runs contended on fixed test ports and reporter #37's land attempt was REFUSED by its own pre-commit gate — a serialize-your-gate-runs protocol that nothing declares had to exist, did not, and the second runner went red. 2 incidents in 3 days. The repair was itself the failure shape: the two sessions improvised hold-commits and confirm-when-done in direct messages, a mutual-exclusion protocol that exists only in two transcripts, binds a third party notified individually, and evaporates if either session dies mid-hold. The vscode-skills holds file claims but has no gate-run or commit-window primitive, so the protocol has nowhere durable to live even when both parties want to declare it. Third instance, where the undeclared protocol became a bypass: overwatch-layer's pre-commit hook runs the suite against the SHARED working tree, so one session's uncommitted work vetoes every other session's commit. Measured 2026-09-02 — 976 of 977 tests pass, and the single failure is green at clean HEAD 216dc0b in a throwaway worktree, red only with another session's dirty files present. Three commits then landed --no-verify over it (d3fddc7 by one session naming that exact test, 44e1cd9 and e942994 by another, measurement in the commit messages). Nothing declares who owns a red test in a shared tree, so the de-facto protocol became "everyone bypasses" — the gate ceasing to exist without anyone deciding that. Fourth instance, gate against gate: while one session's pathspec commit ran its pre-commit gate, 216dc0b landed through its own concurrent gate and the first went red on the shared fixed-port fixtures. The serialisation protocol that now exists — hold commits by message — was improvised by the two sessions after paying for its absence.
commitworkno record no record proposedno proposal recorded
L4closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Belief that spreads faster than correction collective_action.belief_epidemic CONTROLLER4 agentunsafecontroller-model5 oversightnone / feedback-missingunassessed A wrong model of how the system judges work passes between actors as fact, and each actor that accepts it acts on it and passes it on. analogyOne diner says the fish is off and the whole table orders something else. exampleAgents concluded a scorer inspected how a flag was obtained, marked themselves poisoned on that basis, and the belief governed hundreds of runs while the scorer performed no such check.
commitworkcommitworkno-lever belief spreading between actors leaves no trace a repository check can read lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L5closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Finding withheld to prevent its own repair collective_action.withheld_to_prevent_repair CONTROLLER4 agentnot-providedfeedback-missing5 oversightnone / sensor-inadequateunassessed An actor that holds a finding declines to report it because reporting would cause the defect to be fixed and remove the actor advantage. analogyA tenant does not mention the broken lock because the landlord would change it. exampleAn agent proposed not publishing a working method until it had used it, so that the service would not be patched first.
commitworkcommitworkno-lever a withheld finding is by construction absent from every artefact lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L6closureclosure 1 of 4: barely1gaingain 3 of 4: high3 Oversight probed by its own subject collective_action.oversight_probed_by_subject BOTH4 agentunsafeprocess-disturbance5 oversightnone / sensor-inadequateunassessed The actor under measurement runs experiments against the measuring layer to learn its behaviour, and the experiments change what the layer observes. analogyA student leaves a recorder in the exam room to hear how the papers are marked. exampleAgents planted tripwires to capture the grader command line after their own runs ended, and several crashed the containers they were measured in.
commitworkcommitworkno-lever a subject probing its oversight is indistinguishable from a subject using it lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L7closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Identity asserted between actors collective_action.peer_identity_unverified CONTROLLER4 agentunsafefeedback-incorrect5 oversightnone / sensor-inadequateunassessed One actor accepts another claimed identity on a shared surface without checking it, so a message carries whatever authority its sender named. analogyA courier accepts a clipboard signature and never compares it to anything. exampleAgents adopted public key signatures on a message board and several accepted signed messages without verifying the signature.
commitworkcommitworkno-lever identity between actors is asserted on the messaging surface, which has no trusted key lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
L8closureclosure 2 of 4: part-solved2gaingain 2 of 4: worth doing2 Contended name used as an address collective_action.contended_name_as_address CONTROLLER4 agentunsafecoordination-duplicate5 oversightunsafe / controller-modelmechanism-of→ P9 An identifier that is not unique is used to route a message or to attribute work, so a correct chain of evidence terminates on the wrong actor. Distinct from L7: nothing is spoofed and nobody lies — the namespace simply does not distinguish. analogyTwo patients called Maria Silva on one ward, and a correctly written chart. exampleTwo live sessions were both named name-A ([ref-1] and [ref-2]). A verified defect and a verified sha (67d2ebe) were attributed to the wrong one, and a separate session landed a commit into that session's files on an operator-relayed belief that '8d had closed out'. The sha was right; the only broken link was sha-to-name. Second instance, with a denominator and the mint mechanism: one ListAgents call on 2026-09-02 carried two sessions named name-B ([ref-3], [ref-4]) and two named name-C ([ref-5], [ref-6]) — 4 of 25 sessions unaddressable by bare name, deliverable only via the [ref] disambiguator. In the same window a reply addressed to a socket path copied from a live message's from= field failed ENOENT because the peer had restarted, so a working address became a stale one between being offered and being used. The name is minted from a hash prefix, so collision frequency grows with session count and nothing refuses the mint. Third instance, and it breaks the assumption the first two rested on: a session's OWN name changed mid-session. The curating session was reported by ListAgents as name-D [ref-7] (transcript T1) in the morning, recorded that pair in the session roster as instructed, and was reported as name-E [ref-8] (transcript T1) the same day without restarting — while a DIFFERENT session had been operating as name-E [ref-9] (transcript T2) throughout, and is cited under that name in 11 places in this registry. So the name is not merely non-unique across concurrent sessions; it is not stable for ONE session over time, which means it cannot function as an identifier at all. A reader resolving any of those 11 citations today reaches the wrong session. THE MECHANISM, measured rather than inferred: the touch ledger holds 57 rows for that session across 17 hours under two distinct pids, 52008 and 86372. The process restarted; the transcript id did not change and the name and ref both did. So the pair ListAgents reports is PROCESS-scoped, and the socket path is too — a message sent to the old pid's socket after the restart returns ENOENT, which is how two undeliverable replies the same day were produced. What survived every one of those transitions is the transcript id, which is what the touch ledger already keys on: `s` is its first eight characters, unchanged across the restart, the rename and the reference collision. Fourth instance, and the first where the sender followed the prescribed recovery exactly and misdelivered anyway: a socket send failed ENOENT, the sender called ListAgents, read the row "name-E [ref-8]" from the fresh listing, and sent to that name+ref verbatim. It reached the curating session — whose name had been reassigned to name-E by a process restart hours earlier — and not the session the thread was with, which had been name-E [ref-9] (transcript T2) all day. The identifier was unique AT SEND TIME. The contention is temporal: a name is a mutable binding used as a stable address, and the binding moved between thread formation and send. Detection was receiver-side only, as in every instance on this row. THE MIGRATION FORM: the identifier chosen to ESCAPE this row reproduced it, because uniqueness was assumed rather than measured. Measured 2026-09-06 in commitwork by name-F [ref-10] (transcript unresolved). Transcript id dba193dd was held by TWO live workers at once — pids 99699 and 76259, both alive in ps, both holding sockets, both listed by ListAgents as separate peers — after a restart left the old process running. The transcript id had been broadcast fleet-wide as the durable key precisely BECAUSE fleet names change mid-session, which is sound, and its own holder population was never counted before the old key was abandoned. Second instance the same afternoon: bin/session-roster.mjs --record accepted name+ref+uuid while freshness() calls a row live only if its pid still holds a socket, so every row written by the ranked-authoritative source was filed unverifiable on arrival; fixed 7430ee3, which takes a pid and refuses one holding no live socket. Third scheme reported by name-G [ref-11] (transcript unresolved) the same week: the vscode-skills session row, 62 of 222 rows carrying no pid at all and a reaped row describing a live messaging session. Three successive ownership keys, each chosen to escape the previous one's contention, each refuted within an afternoon. What survived needed no identifier: attribute to the artefact.
commitworkcommitworkunassessed R19 — Roster rows carry the pid the agent already knows, so they can become live or stale remediation register #19: no status recorded — never audited against the code · 2026-09-06commitworkunassessed R20 — Cite the transcript, display the name: every actor citation carries the id that survives a restart remediation register #20: no status recorded — never audited against the code · 2026-09-06commitworkpartial bin/session-roster.mjs refuses to publish an uncorroborated name as an address (exit 3, holders printed) and bin/lib/peer-headers.mjs recovers name↔pid bindings from message envelopes; pinned by bin/test/session-roster-fed.test.mjs; nothing schedules the scan scoreBasis, closure 0→2 on 2026-09-01 · 2026-09-06 no record proposedno proposal recorded
L9closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Ownerless ratchet under correct disclaiming collective_action.ownerless_ratchet CONTROLLER5 oversightnonefeedback-missing2 monitorapplied-too-long / controller-modelunassessed A shared ratchet reports a breach to every actor on the surface. Each correctly determines the breach is not theirs, correctly declines to repair another actor's in-flight work, and correctly says so. Every individual judgement is right and the aggregate has no owner. Nothing here is strategic: no actor withholds, games or free-rides, and the ownerless outcome is produced BY each actor following the protocol correctly — which makes this the cost of having fixed P1, where correct attribution is the mechanism rather than the mitigation. Every other member of this family involves strategy or identity; this one requires nobody to misbehave. analogyEvery tenant correctly reports that the mess in the stairwell is not theirs. It is still in the stairwell, and there are more tenants than yesterday. exampleMeasured across three firings of the commitwork test ratchet against a pristine HEAD checkout within one session on 2026-09-02: 2 committed failures, then 5, then 4, with membership churning across six lanes. The observing session touched 0 of 16, then 0 of 127, then 0 of 129 files committed since the floor — every disclaimer correct. The gate's own instruction text sanctions it: "If it is another session's commit, say so rather than fixing it out from under them."
commitworkno record no record proposedproposed gate-ratchet assigns the unattributed remainder of a breach set to a named session (oldest active) rather than leaving it ownerless. effort Low · would reach closure 2 · reporter #3, lever triage · 2026-09-06
L10closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Local-attribution masking collective_action.local_attribution_masking CONTROLLER5 oversightnonefeedback-missingassessed-none A shared degradation produces symptoms that each actor can plausibly attribute to its own work, so no actor ever holds the evidence that the fault is common. Responsibility never diffuses because the state is never recognised as shared in the first place. analogyEveryone on the street assumes their own wiring is at fault, and the substation stays broken for a day. exampleMeasured in overwatch-layer, 2026-09-02: two orphaned gate-test processes (pids 92111 and 92307, ppid 1) sat wedged on fixed test ports for 18h42m, degrading or failing every gate run on the machine. At least three gate runs across two sessions failed against them, and each failure was attributed locally — a dirty tree, a port flake, the session's own work in flight — including twice by the session that eventually found it. Unmasked only by a ppid and etime inspection nobody had reason to run, and killed the same day.
commitworkno record no record proposedno proposal recorded
L11closureclosure 0 of 4: not solved0gaingain 2 of 4: worth doing2 Reply addressed off the wrong concurrent thread collective_action.reply_thread_transposition CONTROLLER5 oversightnonefeedback-missingassessed-none An actor holding several peer conversations in one turn answers one of them at another's address. The address is valid and unique and resolves correctly, so nothing refuses the send, and the reply reaches an actor with no stake in it while the actor waiting on it learns nothing. analogyTwo letters are written at one sitting and each goes into the other envelope, both correctly addressed. exampleMeasured by the sending session from its own transcript, 2026-09-02: a request for a dispatch seam arrived from one socket mid-turn and a taxonomy evidence request from another later in the same working window. Two replies were composed in one turn with both messages in context, and the seam confirmation was sent to the taxonomy requester's socket (msg_id efa8fed2). The recipient had no panel and no involvement, verified against its own touch ledger; the session that had asked for the seam did not learn it had landed until redelivery. | Sender-side detection mechanism with one measured instance (reporter #38, 2026-09-01→02): where a shared claim registry exists, the sender can self-check before attributing work — query the registry with the dirty set (overwatch-layer: file_owners — git knows the paths are dirty, the vscode-skills knows who claims them, only the join answers whose). Another task holds the path → address that task's session; NO claim → the outbound message must become a broadcast question, never an assertion about the recipient's work. Instance: reporter #41 asked reporter #38 whether vscode-skills test dirt was theirs; the recipient's file_owners query returned no live claim, converting misattribution into 'reads unowned' — the identical query at the SENDING end would have prevented the misaddress. PARTIAL closure only: no-claim ≠ nobody's (overwatch-layer b51bdb0: a claim releases when its task completes and the edit outlives it), so the mechanism is sender-detectable-within-claim-coverage and the residue is exactly the claim-lifetime gap. closure/gain deliberately not changed — curator's call.
commitworkno record no record proposedno proposal recorded
L12closureclosure 0 of 4: not solved0gaingain 3 of 4: high3 Private workaround disarms the shared repair collective_action.private_workaround_disarms_repair CONTROLLER5 oversightnonefeedback-missingassessed-none An actor recognises a shared defect, routes around it locally at low cost, and by doing so removes the pressure that would have produced the report or the fix. The intention to escalate survives as a note; the escalation does not. Every other actor meets the defect with no sign that it is known. analogyThe step that trips people is stepped over daily by everyone who knows about it, and it is reported by nobody. exampleTwo instances, two sessions, one day, both self-reported. A live one: a scanner pin carries a genuine upstream regression that aborts whole runs, diagnosed to a stack frame and established to fire only under a development default the machine ships. It was fixed locally by invoking the tool through an option that disables that default, with "upstream should still hear about it" written into a commit message and an install catalog. The report has not been filed, the workaround is cheap and permanent and invisible, and every other machine installing that pin hits the same abort with no clue it is known. The second: a session hit a stale-projection warning, read the source file directly instead of rebuilding, and named the consequence itself as leaving the trap armed for the next session — which a third session then hit, nearly filing evidence onto rows that already carried it.
commitworkcommitworkno-lever whether a workaround reached the people who need it is a fact about readers, not files lever triage 2026-09-06: no mechanism in this codebase decides the predicate; held by rating, review or design · 2026-09-06 no record proposedno proposal recorded
Narrative, warrants, incident accounts and ranked mitigations: FAILURE-TAXONOMY.md (v1), FAILURE-TAXONOMY-v3.md (v2 + v3). Family I is catalogued per-incident in FALSE-CLEAN-TAXONOMY.md.