docs(changelog): the third review remediation, decision 41's door line and the findings decision 42 defers

Review findings of S153; operator decisions 37 to 43.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-10-14 18:32:04 +02:00
commit ca9cb53e79
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
2 changed files with 93 additions and 6 deletions

View file

@ -11,9 +11,9 @@ A new plan version, 1.9, in which every path in a step's `Files:` and on its
guesses paths from prose (decision 16). The same delivery closes the six
findings from the test repo's trial 4 and stops `npm test` from pointing a live
session's stop guard at a temp-repo lock. Every fix began with a test that
failed on the code before it. Suite 2508 (2506 pass, 0 fail, 2 skipped),
measured by `npm test` on the second remediation's Step 8 commit
(`f746f27`), the commit before this section.
failed on the code before it. Suite 2517 (2515 pass, 0 fail, 2 skipped),
measured by `npm test` on the third remediation's Step 2 commit
(`829da48`), the commit before this section.
Nothing here asks anything of users. Older plans warn, they do not fail: a plan
below 1.9 is read as in 6.3.1, apart from the fixes under Fixed, and gets one
@ -35,6 +35,7 @@ warning per step whose `Files:` names a path that is not backticked.
- two-way: red proof reads the step's test files from the plan, prints them, and refuses a plan it cannot read (operator decision 30) — the older prose that passes --tests still runs against it.
- two-way: original_severity names what the kept finding asserted — only tests read the field.
- two-way: the workflow review fails closed when its coordinator returns nothing, and names every reviewer that did not run in allow_blocked_by — opt-in path only.
- two-way: below 1.8, when the plan names no test file, the helper and the executor give red proof the files the helper wrote (operator decision 41) — a revert leaves such a step unproven and unlocked.
### Added
@ -198,6 +199,18 @@ warning per step whose `Files:` names a path that is not backticked.
- **K6 keeps its own normaliser and `LIST_ITEM` is one literal again**
(operator decision 27, 13.10; review `7961a700`). The two `/simplify` edits
that crossed the first remediation's fence around K6 are reverted.
- **The control-run test leaves headroom over a slow start** (review
`703d87e1`). Under full-suite load the start-point run of red proof's
control-run test was killed at its 2 s timeout. The test now gives red proof
a 15 s timeout and starts every run but the control slowly on purpose, so a
timeout without headroom fails on demand; the numbers live in
`tests/helpers/timing.mjs`.
- **Below 1.8 a plan that names no test file gets the files the helper
wrote** (review `7b3b59ed`; operator decision 41, 14.10). A `File:` line
below 1.8 may name its test without backticks, so red proof reads no test
file from the plan and answers `no test files given`. The helper then runs
the same red proof again with `--tests` naming the files it wrote, and the
executor gives red proof that same list, so such a step is proven and locked.
### Known issues
@ -210,6 +223,29 @@ warning per step whose `Files:` names a path that is not backticked.
- Below 1.9 the plan-file sweep (K6) keeps its own wider reader of the `File:`
line (operator 2026-10-11): it plans every backticked path on that line, also
one in the description that decision 20 no longer counts as a test file.
- Red proof accepts a `--tests` that matches the plan's list and prints it in
the spelling it was given, not the plan's (review `2d624b54`; deferred by
operator decision 42, 14.10).
- `ingest` keeps a `pass1_raised_from` and an `original_severity` that a
payload wrote on its own finding (reviews `c06d5385`, `e031a480`; deferred
by operator decision 42, 14.10).
- When its coordinator returns nothing, the workflow review raises the merged
findings in place; this has no effect on its output today (review
`6ff82e75`; deferred by operator decision 42, 14.10).
- A whitespace-only line ends a 1.9 `Test first:` `File:` entry but not a
`Files:` entry, to be skipped in both by operator decision 40 (review
`4b6460e5`; deferred by operator decision 42, 14.10). The same id stands
in a Fixed bullet above, which fixed the list-item case of that review; the
whitespace-only case came back open.
- A 1.9 wrapped line read as description is dropped without a warning, even
when it opens with a backticked path, to be warned on by
operator decision 39 (review `4e1607cb`; deferred by
operator decision 42, 14.10).
- Handover 4's `Files:` bullet words its empty-entry rule as for a `File:`
line (review `4f22b101`; deferred by operator decision 42, 14.10).
- Accepted deviation: the 1.9 `File:` selector repeats the list-marker set of
`LIST_ITEM` (review `4dce7c74`; operator decision 38, 14.10, decision 27
stands).
## v6.3.1 — 2026-10-11 — Fixes from the release review of 6.3.0, and two verdict-gate holes closed

View file

@ -373,7 +373,7 @@ test('CHANGELOG: Known issues name the verdict gate, the engine payloads and ope
assert.match(known, /\boperator\s+decision\s+25\b/, `Known issues name operator decision 25: ${JSON.stringify(known)}`);
});
test('CHANGELOG: the intro names the second remediation\'s Step 8 commit, and no longer acd0e3d, 5b94952 or the Step 13 commit', () => {
test('CHANGELOG: the intro names the third remediation\'s Step 2 commit with its measured suite, and no longer acd0e3d, 5b94952 or the Step 13 commit', () => {
const body = unreleasedBody();
const firstSub = body.search(/^### /m);
const intro = firstSub < 0 ? body : body.slice(0, firstSub);
@ -381,8 +381,14 @@ test('CHANGELOG: the intro names the second remediation\'s Step 8 commit, and no
assert.ok(!intro.includes('5b94952'), `the intro no longer names 5b94952: ${JSON.stringify(intro)}`);
assert.doesNotMatch(intro, /the\s+remediation's\s+Step\s+13\s+commit/,
`the intro no longer names "the remediation's Step 13 commit": ${JSON.stringify(intro)}`);
assert.match(intro, /the\s+second\s+remediation's\s+Step\s+8\s+commit/,
`the intro names "the second remediation's Step 8 commit": ${JSON.stringify(intro)}`);
assert.match(intro, /the\s+third\s+remediation's\s+Step\s+2\s+commit/,
`the intro names "the third remediation's Step 2 commit": ${JSON.stringify(intro)}`);
assert.doesNotMatch(intro, /the\s+second\s+remediation's\s+Step\s+8\s+commit/,
`the intro no longer names "the second remediation's Step 8 commit": ${JSON.stringify(intro)}`);
// Measured by `npm test` at 829da48, the third remediation's Step 2 commit.
assert.match(intro, /Suite\s+2517\s+\(2515\s+pass,\s+0\s+fail,\s+2\s+skipped\)/,
`the intro names the measured suite "Suite 2517 (2515 pass, 0 fail, 2 skipped)": ${JSON.stringify(intro)}`);
assert.ok(intro.includes('(`829da48`)'), `the intro names the backticked short sha 829da48: ${JSON.stringify(intro)}`);
});
// Second remediation, Step 9: the CHANGELOG records round 2. Door lines name
@ -470,3 +476,48 @@ test('CHANGELOG: the old rerun wording is gone from the Unreleased section', ()
assert.ok(!flat.includes(phrase), `the Unreleased section no longer says "${phrase}"`);
}
});
// Third remediation, Step 3: the CHANGELOG records round 3. A door line names
// operator decision 41 (below 1.8 the helper's own files go to red proof); the
// Fixed bullets name `703d87e1` and `7b3b59ed`; Known issues name each finding
// operator decision 42 defers, and the accepted deviation of operator decision
// 38. The Known-issues bullets are read from that slice only (knownIssues
// above), so the round-1 Fixed bullet that names `4b6460e5` never counts.
// The Unreleased section's `### Fixed` body, up to the next heading.
const fixedSlice = (body) => {
const lines = body.split('\n');
const start = lines.findIndex((l) => /^### Fixed\s*$/.test(l));
assert.ok(start >= 0, 'the Unreleased section has a "### Fixed" heading');
let end = lines.length;
for (let i = start + 1; i < lines.length; i++) {
if (/^###? /.test(lines[i])) { end = i; break; }
}
return lines.slice(start + 1, end).join('\n');
};
test('CHANGELOG: round 3 — the decision-41 door line, two Fixed bullets and the findings deferred by decision 42', () => {
const body = unreleasedBody();
const d = releaseCheck.parseDoors(body);
assert.deepEqual(d.bad, [], 'every top-level door line reads "- one-way: ..." or "- two-way: ..."');
const texts = d.entries.map((e) => e.text);
assert.ok(texts.some((t) => /\boperator decision 41\b/.test(t)),
`a door line names operator decision 41: ${JSON.stringify(texts)}`);
const fixed = fixedSlice(body);
const f703 = bullet(fixed, /703d87e1/, 'Fixed bullet 703d87e1');
assert.ok(f703.includes('tests/helpers/timing.mjs'), `the 703d87e1 bullet names tests/helpers/timing.mjs: ${JSON.stringify(f703)}`);
const f7b3 = bullet(fixed, /7b3b59ed/, 'Fixed bullet 7b3b59ed');
assert.match(f7b3, /\boperator\s+decision\s+41\b/, `the 7b3b59ed bullet names operator decision 41: ${JSON.stringify(f7b3)}`);
const known = knownIssues(body);
for (const id of ['2d624b54', 'c06d5385', '6ff82e75', '4b6460e5', '4e1607cb', '4f22b101']) {
const b = bullet(known, new RegExp(id), `Known-issues bullet ${id}`);
assert.match(b, /\boperator\s+decision\s+42\b/, `the ${id} Known-issues bullet names operator decision 42: ${JSON.stringify(b)}`);
}
const dev = bullet(known, /4dce7c74/, 'Known-issues bullet 4dce7c74');
assert.match(dev, /\boperator\s+decision\s+38\b/, `the 4dce7c74 Known-issues bullet names operator decision 38: ${JSON.stringify(dev)}`);
const c06 = bullet(known, /c06d5385/, 'Known-issues bullet c06d5385');
assert.ok(c06.includes('e031a480'), `the c06d5385 bullet names e031a480: ${JSON.stringify(c06)}`);
assert.ok(c06.includes('original_severity'), `the c06d5385 bullet names original_severity: ${JSON.stringify(c06)}`);
});