fix(execute): the Phase 8 payload goes on stdin; /trekreview findings closed
/trekreview of 5680591..84a0621 (verdict WARN: 0 BLOCKER, 3 MAJOR, 1 MINOR,
1 MAJOR suppressed as unverified for length only). All closed red -> green:
- Suppressed MAJOR 1d0171a7 (verified live): Phase 8 spliced {plan-path}
into a single-quoted --payload. A lone quote broke the shell parse (event
lost, no written:false to report); a quoted pair ran a command
substitution and still reported written:true. event-emit now reads
`--payload -` from stdin and the three Phase 8 blocks pass the payload
through a quoted heredoc. Checked under bash and zsh.
- 570ba19b: the SC5 set-step extractor read line by line and never saw the
wrapped Step 0 sentinel (`blocked`); it now matches across the break and
the test asserts `blocked` is read.
- c69a865a: the Phase 9 line_ref in jsonl-schemas.md was 9 lines off. Both
trekexecute rows are now pinned to the exact span by a test.
- 0004fa23 (MINOR): the gates_mode_flag_override block says what to do on
written:false (print the reason, continue).
- emit() docstring no longer says failures are swallowed silently.
- 7ffaede5: chosen to KEEP the prose-only legacy `passed` tolerance, because
a public-plugin run started under the 6.1.0 prose would otherwise re-run
every finished step on resume; recorded as an accepted deviation in the
(local-only) brief. No code change.
Suite 1400 (1398/0/2), was 1393.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
84a0621fcc
commit
cb68c4f125
7 changed files with 130 additions and 28 deletions
|
|
@ -74,7 +74,6 @@ function writtenStatuses(text) {
|
|||
if (fresh) for (const m of fresh[1].matchAll(/`([^`]+)`/g)) add(n, m[1], 'run', 'fresh-mode');
|
||||
for (const m of l.matchAll(/first step (?:with|where) status != `([^`]+)`/g)) add(n, m[1], 'step', 'resume');
|
||||
for (const m of l.matchAll(/steps with `status=([a-z_-]+)`/g)) add(n, m[1], 'step', 'phase-7.5');
|
||||
for (const m of l.matchAll(/Set step status = [`"]([^`"]+)[`"]/g)) add(n, m[1], 'step', 'set-step');
|
||||
for (const m of l.matchAll(/steps\.\{N\}\.status = "([^"]+)"/g)) add(n, m[1], 'step', 'steps.{N}.status');
|
||||
if (/update progress/i.test(l)) {
|
||||
for (const m of l.matchAll(/`status: "([^"]+)"`/g)) add(n, m[1], 'run', 'update-progress');
|
||||
|
|
@ -84,6 +83,8 @@ function writtenStatuses(text) {
|
|||
});
|
||||
// The escalation rule spans a line break: "steps with\n`status: "X"`".
|
||||
for (const m of text.matchAll(/steps with\s+`status: "([^"]+)"`/g)) add(lineOf(m.index), m[1], 'step', 'escalation');
|
||||
// So does the Step 0 sentinel: "Set step\nstatus = `blocked`".
|
||||
for (const m of text.matchAll(/Set step\s+status = [`"]([^`"]+)[`"]/g)) add(lineOf(m.index), m[1], 'step', 'set-step');
|
||||
return out;
|
||||
}
|
||||
|
||||
|
|
@ -133,6 +134,10 @@ test('SC5: every status the prose tells the executor to write is in the validato
|
|||
assert.ok(sites.has(site), `the ${site} extractor found nothing - teach it the new wording`);
|
||||
}
|
||||
assert.equal(entries.filter((e) => e.site === 'resume').length, 2, 'both resume rules');
|
||||
// The Step 0 sentinel's "Set step\nstatus = `blocked`" wraps a line; the guard
|
||||
// above was satisfied by another set-step line while this one went unread.
|
||||
const setStep = entries.filter((e) => e.site === 'set-step').map((e) => e.value);
|
||||
assert.ok(setStep.includes('blocked'), `the Step 0 sentinel must be read; set-step saw: ${setStep.join(', ')}`);
|
||||
const updateLines = text.split('\n').filter((l) => /update progress/i.test(l));
|
||||
assert.ok(updateLines.length >= 5, `expected >= 5 "Update progress" sites, found ${updateLines.length}`);
|
||||
const withValue = new Set(entries.filter((e) => e.site === 'update-progress' || e.site === 'steps.{N}.status').map((e) => e.line));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue