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 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 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 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), failed on the code before it. Suite 2517 (2515 pass, 0 fail, 2 skipped),
measured by `npm test` on the second remediation's Step 8 commit measured by `npm test` on the third remediation's Step 2 commit
(`f746f27`), the commit before this section. (`829da48`), the commit before this section.
Nothing here asks anything of users. Older plans warn, they do not fail: a plan 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 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: 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: 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: 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 ### 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** - **K6 keeps its own normaliser and `LIST_ITEM` is one literal again**
(operator decision 27, 13.10; review `7961a700`). The two `/simplify` edits (operator decision 27, 13.10; review `7961a700`). The two `/simplify` edits
that crossed the first remediation's fence around K6 are reverted. 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 ### 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:` - 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 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. 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 ## 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)}`); 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 body = unreleasedBody();
const firstSub = body.search(/^### /m); const firstSub = body.search(/^### /m);
const intro = firstSub < 0 ? body : body.slice(0, firstSub); 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.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/, 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)}`); `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/, assert.match(intro, /the\s+third\s+remediation's\s+Step\s+2\s+commit/,
`the intro names "the second remediation's Step 8 commit": ${JSON.stringify(intro)}`); `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 // 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}"`); 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)}`);
});