fix(execute): the step loop survives an adversarial review
An independent review of abc3083 found 15 defects, the two worst verified
in scratch repos. Each fix started with a test that failed.
- Proof of red could be "proven" by the environment: a start point
unpacked with git archive had no node_modules and no .git, so any test
failed there. The start point is now a git clone --shared checked out at
start_sha, gitignored top-level entries are linked in, and a control run
(start point + the change) must pass, or the result is not-run.
- The Test first file was never committed (the template lists it apart
from Files:) and leaked into the next step's diff. The step's scope is
now Files: + test files, staged at the checkpoint.
- New files outside Files: were invisible to every check. Every untracked
file is registered with --intent-to-add; a revert unregisters them.
- The floor guard paired renames (foo.test.js -> .bak read as clean) and
missed skipIf and node's t.skip/t.todo; prose files no longer count as
stubs.
- Phase 7.5 audited from the last step's start_sha; it now uses the run's
session_start_sha.
- The done line is written after the checkpoint and checked with --commit.
- fix_rounds never passes 5; attempts are never reset; re-control keeps
the spec/quality verdicts and earlier floor-guard rulings; the closed
stop list maps every existing stop; failed vs stopped made consistent;
the controller's effort is said, not assumed.
Tests: 1470 (1468 pass, 0 fail, 2 skipped).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
382d5ccba2
commit
44dcc779a9
11 changed files with 466 additions and 148 deletions
|
|
@ -82,6 +82,54 @@ test('floor guard: hunk line counts decide what is content - a removed "-- x" li
|
|||
assert.deepEqual(r.findings.map((f) => [f.kind, f.file]), [['removed-assert', 'tests/a.test.mjs']]);
|
||||
});
|
||||
|
||||
test('floor guard: skipIf and node\'s lowercase t.skip() / t.todo() are skips too', () => {
|
||||
const diff = (line) => [
|
||||
'diff --git a/tests/a.test.mjs b/tests/a.test.mjs',
|
||||
'--- a/tests/a.test.mjs',
|
||||
'+++ b/tests/a.test.mjs',
|
||||
'@@ -1,1 +1,2 @@',
|
||||
" test('a', (t) => {",
|
||||
`+${line}`,
|
||||
].join('\n');
|
||||
for (const l of [" it.skipIf(process.env.CI)('x', () => {});", ' t.skip();', " t.todo('later');", "test('b', { todo: true }, () => {});"]) {
|
||||
assert.deepEqual(analyzeDiff(diff(l)).findings.map((f) => f.kind), ['skipped-test'], l);
|
||||
}
|
||||
});
|
||||
|
||||
test('floor guard: renaming a test out of the runner\'s pattern is a deleted test (--base never pairs renames)', () => {
|
||||
const dir = mkdtempSync(join(tmpdir(), 'floor-guard-rename-'));
|
||||
const git = (...a) => {
|
||||
const r = spawnSync('git', a, { cwd: dir, encoding: 'utf8' });
|
||||
assert.equal(r.status, 0, `git ${a.join(' ')}: ${r.stderr}`);
|
||||
return r.stdout.trim();
|
||||
};
|
||||
try {
|
||||
git('init', '-q');
|
||||
git('config', 'user.email', 't@example.invalid');
|
||||
git('config', 'user.name', 'test');
|
||||
writeFileSync(join(dir, 'foo.test.js'), "test('a', () => {\n assert.equal(1, 1);\n});\n");
|
||||
git('add', 'foo.test.js');
|
||||
git('commit', '-q', '-m', 'base');
|
||||
const base = git('rev-parse', 'HEAD');
|
||||
git('mv', 'foo.test.js', 'foo.test.js.bak');
|
||||
const r = cli(['--base', base, '--cwd', dir, '--json']);
|
||||
assert.equal(r.status, 1, r.stdout + r.stderr);
|
||||
assert.ok(JSON.parse(r.stdout).findings.some((f) => f.kind === 'deleted-test'), r.stdout);
|
||||
} finally { rmSync(dir, { recursive: true, force: true }); }
|
||||
});
|
||||
|
||||
test('floor guard: prose files are not code - "not implemented" in a .md is not a stub', () => {
|
||||
const diff = [
|
||||
'diff --git a/docs/guide.md b/docs/guide.md',
|
||||
'--- a/docs/guide.md',
|
||||
'+++ b/docs/guide.md',
|
||||
'@@ -1,1 +1,2 @@',
|
||||
' # Guide',
|
||||
"+Never write `throw new Error('not implemented')` or an eslint-disable as a fix.",
|
||||
].join('\n');
|
||||
assert.deepEqual(analyzeDiff(diff).findings, []);
|
||||
});
|
||||
|
||||
test('floor guard: an empty diff is clean (nothing changed weakens nothing)', () => {
|
||||
assert.equal(analyzeDiff('').status, 'clean');
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue