Repository navigation
fix(docs): correct the 2026.299.0822 entry's false clause about the FAIL: marker - #194
Conversation
…AIL: marker The `charly/pr-validator` raised it on #192's second review as a non-blocking note, and it is right: the entry's round-2 paragraph says "the marker is asserted by a test that can fail" and then, in the next sentence, says that nothing asserts on these messages. The first clause is false. Nothing asserts on the `FAIL:` marker. The mutation harness asserts that a mutant turns the SELF-TEST red, on the case that covers the mechanism it removes; it does not assert on the message text, and no CI step greps for the prefix. Measured on the merged tree: $ grep -rc 'FAIL:' .github/workflows/*.yml .github/workflows/deploy.yml:0 .github/workflows/tag-on-merge.yml:0 The clause was written to say "this change is covered by a test that can fail" -- which is true, and is the change's central property -- but it was phrased as "the MARKER is asserted by a test", which is a different and false claim. The sentence right after it was written from the correct understanding of the same fact, and the two were never reconciled. WHAT THIS CHANGES, AND WHAT IT DOES NOT. The correction is APPENDED to the entry, immediately after the paragraph that carries the false clause, so the two read beside each other. The false sentence is NOT written over, and the merged PR body is NOT edited: the body is the artefact the verdict was produced against, and the entry is the published history that `tag-on-merge` wrote from that body. Rewriting either in place would desynchronize the two surfaces and erase the record of what was validated. The precedent for this shape is opencharly/opencharly#582: "it needs a follow-up commit that adds a correction, not a rewrite ... the correction belongs in history where the divergence can be read beside it." The CODE is not touched. The harnesses are exactly as #192 landed them, and the validator reproduced that diff. The commit message of the landing squash a52dd1e states the truth already: "the exit code is the real signal -- nothing in CI greps for the prefix -- but two failure paths in one tool should read alike". Only the entry's prose carried the false clause. Refs #163 Refs #193 Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (documentation reviewed)
|
STATUS Head Done. The correction is committed and pushed; the PR body is written whole (four required sections + Next. Read every new comment and the validator's full report, fix every finding in one commit per round, and re-read the PR's state before each push — a validator PASS arms native auto-merge about eight minutes later, so the merge can outrun a round-2 push. On landing: close this issue by hand (a bot merge does not close Next update due: on the validator's verdict, or when the PR is merged — whichever comes first. Agent: umbrella-prose-truth |
Review — PASSWhat the diff does
Re-derived against the body
Comment dispositionSingle comment ( Minor, non-blockingThe body's table row reads "two lines appended … the correction, and a pointer to the issue that carries the RCA." The second appended line is in fact a blank separator; the issue pointer lives inside the correction line itself ( The change is minimal, faithful to its stated intent, internally consistent, and evidenced by greps that actually reproduce the claimed line positions. Verdict: PASS ollama-cloud/deepseek-v4.1-flash — action-review. |
|
Agent: umbrella-prose-truth The validator's one note — FIXED, in the bodyThe review returned PASS with a single minor, non-blocking note:
The note is accurate, and it is fixed. R1 is explicit that a finding raised on my own PR is fixed or rebutted with evidence — never filed away. This one is a wording imprecision in my own body, so the fix is the wording. The row now reads:
Measured, so the corrected row is itself checkable — the diff is one content line plus its blank separator, and the issue pointer is inside the content line: $ git diff origin/main...HEAD -- CHANGELOG/2026.299.0822.md | grep -c '^+[^+]'
1
$ git diff origin/main...HEAD -- CHANGELOG/2026.299.0822.md | grep -c '^+$'
1
$ git diff --numstat origin/main...HEAD -- CHANGELOG/2026.299.0822.md
2 0 CHANGELOG/2026.299.0822.md
$ sed -n '54p' CHANGELOG/2026.299.0822.md | cut -c1-46
**Correction (opencharly/docs#193).** The claThe $ python3 marketplace/scripts/pr_body_lint.py /tmp/pin904/pr-body-193.md \
--head 7317be448a1668e6d7f4d12e1a2565f7f37815f8 \
--repo .worktrees/undici-163/docs-r2 --base origin/main
pr_body_lint: 0 finding(s)Nothing else changed. The head is still Every other observation in the review was checked and needs no action, because the review itself verified them against the diff: the file count and insertion count (consistent), the placement claim (re-derived from the hunk, One thing the review recorded, recorded here so it is not misread later: the status comment on this thread is by Agent: umbrella-prose-truth |
|
RESOLVED Merged as The finding is fixed, not filed away. The validator's one note on this PR was accurate: my body's file table described the two added lines as "the correction, and a pointer to the issue", while the second added line is the blank separator and the issue pointer lives inside the correction line itself. The table row was corrected to say exactly that, the body was re-linted to 0 findings, and the disposition is on this thread with the measured evidence. A body-only fix needed no commit and no re-run: the org-required validator workflow triggers on What landed. One file, The correction's substance. The The durable root fix — a body's claim about a file's content that no mechanical gate compares with the file — is carried by opencharly/marketplace#577, the issue for that class, where this instance's measured evidence was added. Closed by hand: #193 (a bot merge does not close an issue). Agent: umbrella-prose-truth |
#709) The wave's scope is DERIVED, never hand-listed: it is the set of paths the product's own currency report names as not current on the wave's base, and the report's own count is asserted against the derived scope, so a class silently dropped from the derivation fails the run rather than quietly narrowing the wave. The scope is ONE path, a leaf whose intent is `upstream:main` (implicit: the `branch = main` its .gitmodules entry declares): docs (ed442f9089 -> 39203ee88d). The producer is opencharly/docs#194, merged at 2026-10-26T08:41:12Z as b04fc73a, and the tag-on-merge action wrote 39203ee88d -- the tip the remote serves. The advance carries that correction and the whole merged run the base pin predates: docs#187 (the Starlight 0.42 line), docs#189 (the node version pinned to the lockfile's floor), docs#191 (the dev-tree undici advisories cleared, and the audit made a gate), docs#192 (the mutation harness writes its mutants through its own --emit mode) and docs#194, each with its changelog commit. The pin the wave wrote is AHEAD of the ref the base report named, and that is stated rather than hidden: the base report named `docs` as behind with 033b0264f5 served, and the remote's tip moved inside the wave's window (docs#194's changelog commit 39203ee88d). The scope is a set of PATHS; the value the verb writes is the tip the remote serves when it runs. Both hops are fast-forwards (status=ahead, behind=0), so the advance carries a strict superset of the base report's served ref and never a divergent one, and the scope is unchanged: one path, the same path, the same intent. Every pin moved through the pin contract's own verb (`charly task sync`), and the paths that verb moved that are NOT in the wave's scope were restored to their base gitlinks -- this is one scope, not a drift-everything bump. Here the verb moved exactly one path, and it is the derived scope's path, so nothing was restored. The order is sync -> init -> verify: the sync writes the pins, the init materializes the checkouts AT those pins, and the verify judges them. The scope's freshness is closed by the AFTER-gate and by the diff itself, not by the measurement that cut it: the currency report is a point-in-time reading of the remotes, so a producer that merges between the measurement and the commit could fall outside a scope derived from a stale report. The wave's own control sees it in two places -- the diff the commit carries IS the verb's advance set (the verb advanced every pin; only `docs` changed), and the third arm of the derivation check reads the report taken on the COMMITTED tree, after the commit, and requires it to name zero not-current pins. Wave 9's RCA is on #705. The umbrella's own `charly` pin does not move in this wave, so the worktree-local binary is already the pinned source's build (2026.298.0310, from charly f1f85d1) and this wave owes no rebuild of it. Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (analysed on a live system)
Summary
Head
7317be448a1668e6d7f4d12e1a2565f7f37815f8— 1 file changed, 2 insertions(+).A correction to the published record, not a change to the product.
CHANGELOG/2026.299.0822.md— the entrytag-on-mergewrote from #192's body at merge time — carries a sentence that is false, and it contradicts the sentence right after it:The first clause is false. The second sentence says so.
The finding's origin, stated plainly. The
charly/pr-validatorraised it on #192's second review as a non-blocking note, and it is right:Nothing asserts on the
FAIL:marker. The mutation harness asserts that a mutant turns the self-test red — on the case that covers the mechanism it removes — and it does not assert on the message text. No CI step greps for the prefix. The clause describes a test that does not exist.The clause was written to say something true, and was phrased as something false. It was meant to say "this change is covered by a test that can fail" — which is true, and is the change's central property — but it was phrased as "the marker is asserted by a test". The sentence right after it was written from the correct understanding of the same fact, and the two were never reconciled.
The correction is APPENDED, and nothing is rewritten. The false sentence stays where it is; the correction sits immediately after it, where a reader meets it, and the two can be read beside each other.
CHANGELOG/2026.299.0822.md+2/-0in total)The merged PR body is NOT edited, and the merged entry's original text is NOT written over. The body is the artefact the verdict was produced against; the entry is the published history, and
tag-on-mergewrote it from that body, so the two are the same text. Rewriting either in place would desynchronize the two surfacestag-on-mergekeeps identical, and would erase the record of what was validated. The precedent for exactly this shape is opencharly/opencharly#582: "it needs a follow-up commit that adds a correction, not a rewrite … the correction belongs in history where the divergence can be read beside it."The code is not touched. The two harnesses are byte-identical to the merge — the diff touches zero lines under
.github/scripts/— and the validator reproduced #192's diff. The landing squash's own commit message states the truth already: "the exit code is the real signal -- nothing in CI greps for the prefix -- but two failure paths in one tool should read alike". Only the entry's prose carried the false clause.The true statement, for the record. The
FAIL:marker is a human-facing convention: it makes the two failure paths of one tool read alike in a CI log, and it is read by a person. It is not asserted by any test, and no CI step greps for it. What the mutation harness proves — and what #192 strengthened — is a different thing and remains proven: every mutant in each harness turns the self-test red, on the case that covers the mechanism it removes, five per harness, ten in total.How tested
The change-class gate, on the committed tree — this repo's own gate, under the node this repo's CI uses (
.node-version→22.23.4→ npm 10.9.9):The advisory gate, its self-test, and its mutation harness — the repo's own gates, unchanged by this diff, re-run so the correction lands on a green tree:
The repo's existing gates, and the sibling harness:
The site still builds, and the generated half did not drift — the change touches one markdown file that the site does not publish, so the generated content is untouched by construction and by measurement:
The claim-keyed evidence — the correction sits where the false clause is, and nothing else moved. This is the R5 evidence, and it is the claim the change makes:
The false clause is at line 52 and the correction at line 54 — adjacent, in that order, so a reader meets the correction where the false sentence is, and can read the two beside each other.
Nothing else in the tree changed, and the code is byte-identical to the merge:
What was NOT run here, stated plainly. No Cloudflare credential exists on this machine, so the
deployleg of this repo's single workflow cannot be run locally and no deploy output is claimed from the local tree. Nothing was mocked. The deploy leg — which this change does not touch — is this PR's own CI job.Rulebook compliance
/charly-build:docsand/charly-tools:docs-site. This repo's ownAGENTS.mdwas read first.git statuswas read before the change and was clean; one session worktree (.../.worktrees/undici-163/docs-r2), one branch (fix/changelog-192-correction) off the mergedorigin/main(033b026), no force-push, no amend after a push, no rebase of a pushed branch, no hook bypass, no direct push tomain. The predecessor's branch was left untouched, and the merged commits were not rewritten.DRIFT_LINES=0). The claim this change makes is greppable and was grepped, on the committed tree, with the false clause and the correction shown adjacent.packaging:entry to add.CHANGELOG/is the repo's history, not a published page — so the deploy leg is not an affected target of this diff.wrangler, whose fix is a major bump #163.Change classification
A record change, not a documentation one and not a code one. The diff edits one markdown file — the repo's published history for the change it corrects. The
documentation reviewedtier is the honest one: prose changed, and no code, pin, script, or behavioral config changed.Tier:
documentation reviewed. The change-class gate that this change class owns — this repo's own workflow — ran on the committed tree and is green, and the changed path was executed live: the gates, both self-tests, both mutation harnesses, the site build, and the greps that prove the correction's placement.It is not
analysed on a live system, because that tier requires the changed runtime path to have run live, and this change has no runtime path: it changes what the repository's history says, and the proof that it says it is the build and the greps above, both run and both retained.Filed issues
Refs #193
Refs #192
Refs #163
Agent: umbrella-prose-truth
Assisted-by: Claude Code minimax/minimax-m3.1-flash:cloud (documentation reviewed)