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:
parent
829da487ec
commit
ca9cb53e79
2 changed files with 93 additions and 6 deletions
42
CHANGELOG.md
42
CHANGELOG.md
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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)}`);
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue