feat(bin): let the terminal record say a task failed (land of upstream #1978) - #62
Conversation
c586a96 to
04f5761
Compare
The fleet's terminal outcome was a constant. Teardown set outcome=landed and only --force changed it, so nothing anywhere produced failed: a record reading "40 terminal (landed 40)" was not a success rate, because the numerator could not move. Definition first. bin/fm-wake-ledger.sh now owns what a terminal outcome means and what evidence stands behind it. The enum stays three members pinned to the v1 line schema; every terminal record gains outcome_source naming where its outcome came from - declared, discarded, unreleased, or assumed. A record written before the field existed reads as assumed, which is exactly what those records were, so the append-only file needs no rewrite. Field second. Teardown derives the outcome from the task's own last declaration instead of a constant, and a --force discard still outranks it. A second producer covers the case teardown never sees: a task that fails and is never released was silent in the ledger, and silence there is indistinguishable from a task that never failed. `sweep` records those once, receipt-guarded, and a locked session start runs it. Diagnostic only, deliberately. The report breaks outcomes down by evidence and refuses to print a rate: this ledger counts released tasks while the no-mistakes pipeline counts validation runs, and until that divergence is reconciled any ratio would describe neither. The report names that gap on every run. The attempt counter and the unified terminal vocabulary are separate increments and are not absorbed here.
04f5761 to
7480694
Compare
Rebased onto the current fork trunkRebased onto Conflicts and how they were resolvedBoth landed in the same review commit, and both are cases where the trunk and this branch edited the same prose for different reasons:
No other integration fix was needed. Test results, disclosed in full
Every one of the six fails identically on unmodified trunk in a clean checkout, so none is a defect in this branch:
These are local-environment failures, not branch failures: the same behavior lanes pass in CI, as #60's green lanes on the same trunk show.
The reporting was not trusted on absence: the runner produced real |
CI noteThe first CI pass had one red beyond the structural gate: Settled state on head |
…kunchenguid#1978) (#62) * feat(bin): let the terminal record say a task failed The fleet's terminal outcome was a constant. Teardown set outcome=landed and only --force changed it, so nothing anywhere produced failed: a record reading "40 terminal (landed 40)" was not a success rate, because the numerator could not move. Definition first. bin/fm-wake-ledger.sh now owns what a terminal outcome means and what evidence stands behind it. The enum stays three members pinned to the v1 line schema; every terminal record gains outcome_source naming where its outcome came from - declared, discarded, unreleased, or assumed. A record written before the field existed reads as assumed, which is exactly what those records were, so the append-only file needs no rewrite. Field second. Teardown derives the outcome from the task's own last declaration instead of a constant, and a --force discard still outranks it. A second producer covers the case teardown never sees: a task that fails and is never released was silent in the ledger, and silence there is indistinguishable from a task that never failed. `sweep` records those once, receipt-guarded, and a locked session start runs it. Diagnostic only, deliberately. The report breaks outcomes down by evidence and refuses to print a rate: this ledger counts released tasks while the no-mistakes pipeline counts validation runs, and until that divergence is reconciled any ratio would describe neither. The report names that gap on every run. The attempt counter and the unified terminal vocabulary are separate increments and are not absorbed here. * no-mistakes(review): count terminal sweep records from durable appends, add coverage * no-mistakes(review): remove terminal-recorded receipt in remote-secondmate teardown * no-mistakes(document): point AGENTS.md mutating-sweep list at bootstrap header owner
…kunchenguid#1978) (#62) * feat(bin): let the terminal record say a task failed The fleet's terminal outcome was a constant. Teardown set outcome=landed and only --force changed it, so nothing anywhere produced failed: a record reading "40 terminal (landed 40)" was not a success rate, because the numerator could not move. Definition first. bin/fm-wake-ledger.sh now owns what a terminal outcome means and what evidence stands behind it. The enum stays three members pinned to the v1 line schema; every terminal record gains outcome_source naming where its outcome came from - declared, discarded, unreleased, or assumed. A record written before the field existed reads as assumed, which is exactly what those records were, so the append-only file needs no rewrite. Field second. Teardown derives the outcome from the task's own last declaration instead of a constant, and a --force discard still outranks it. A second producer covers the case teardown never sees: a task that fails and is never released was silent in the ledger, and silence there is indistinguishable from a task that never failed. `sweep` records those once, receipt-guarded, and a locked session start runs it. Diagnostic only, deliberately. The report breaks outcomes down by evidence and refuses to print a rate: this ledger counts released tasks while the no-mistakes pipeline counts validation runs, and until that divergence is reconciled any ratio would describe neither. The report names that gap on every run. The attempt counter and the unified terminal vocabulary are separate increments and are not absorbed here. * no-mistakes(review): count terminal sweep records from durable appends, add coverage * no-mistakes(review): remove terminal-recorded receipt in remote-secondmate teardown * no-mistakes(document): point AGENTS.md mutating-sweep list at bootstrap header owner
Fork landing of CFVC-12, the task-outcome-failure work.
What this changes
The terminal record can now say a task failed.
bin/fm-wake-ledger.shderives a task's terminal outcome from what the task itself declared and records the evidence behind it, so an outcome nothing corroborated cannot pass as an observed one. The outcome-source vocabulary is closed; an unstated evidence records as assumed.state/<id>.terminal-recordedreceipt.bin/fm-bootstrap.shruns the sweep as a mutating sweep (dry run underFM_BOOTSTRAP_DETECT_ONLY=1, so a read-only session still reports the failures it declined to record) and counts durable appends rather than intent.bin/fm-teardown.shremoves the terminal-recorded receipt, including on the remote-secondmate path.AGENTS.mdandbin/fm-session-start.shdrop their drifted mutating-sweep counts and point atbin/fm-bootstrap.sh's header as the single owner of that list.tests/fm-bootstrap.test.sh,tests/fm-teardown.test.sh, andtests/fm-wake-ledger.test.sh.Provenance
This is a fork landing of content that was validated by the no-mistakes pipeline upstream; the run evidence lives on upstream PR kunchenguid#1978. That upstream branch was replayed onto the upstream base, so its commit ids diverge from this branch while the content matches. This branch was cut fresh from the fork trunk and carries only this contribution's own changes;
bin/fm-wake-ledger.sh, its tests, and thebin/fm-wake-drain.shrecording call already exist on the fork, so the diff here is the delta on top of them rather than the upstream file additions.No pipeline run was executed against this fork branch, and this PR carries no validation attestation.
Test evidence (run on this branch)
Base for comparison: fork trunk
ed376cf.bin/fm-lint.shbin/fm-doc-audience-check.shtests/fm-wake-ledger.test.shtests/fm-teardown.test.shtests/fm-bootstrap.test.shtests/fm-session-start.test.shDisclosed failure:
tests/fm-session-start.test.shfails onMISSING diagnostic did not appear at all. This failure reproduces identically on the unmodified fork trunked376cf(checked out separately and run there: same single failing case, same 5 passing cases), so it is pre-existing on the base and not introduced here.Branch cleanliness was verified with
git merge-tree --write-tree fork/main HEAD, exit status 0.Known in-flight sibling work on the fork trunk (the serial-2 red fix and the head-bound check replacement) may surface as red checks on this PR that are not caused by this change.