Files
claude/.claude/tasks/plans/2026-09-28-floor-guard-xit-boundary-1648.md
T

3.8 KiB

PLAN — floor-guard-xit-boundary (hotfix, logic fix → challenged) — r2

  • r2 after 3 challengers (simplicity SOLID, correctness SOLID, robustness CONCERNS(2)): SKIP_IDENT_RE sits right under SKIP_SUBSTRINGS; the waiver instruction on the guard's own lines is gone (SKIP never scans lib/floor-guard.sh: no test/spec in its path); the new fixture echo lines in the TEST file carry # floor-guard: allow flip-test fixture OUTSIDE the echoed string (the test path contains test, so a later scan of that diff would flag the fixture itself); def fit( / function xit( / xit.each( stay unmatched or matched as before and are recorded as a shortcut: comment; fixtures extended to prove the whole alternation.
  • date: 2026-09-28 | contract: contracts/2026-09-28-floor-guard-xit-boundary-1648.md
  • branch: bugfix/floor-guard-xit-boundary | executor: hotfixer (sonnet)

Root cause

lib/floor-guard.sh:99-102 SKIP_SUBSTRINGS = ('.skip(', '.only(', 'xit(', 'xdescribe(', 'fit(', 'fdescribe(', 'it.todo(', '@pytest.mark.skip', '@unittest.skip', 't.Skip('); :188-189 skip_kind(text) = any(p in text …). Plain substring: xit( ⊂ exit(, SystemExit(, process.exit(; fit( ⊂ profit(, model.fit(. Only test files are scanned for SKIP (line_findings, if test_file:), so the false positive hits inline python/JS helpers inside test files — the 2026-09-28 case: sys.exit(1 if violations else 0) in lib/tests/profile-census.test.sh (BLK-023).

The exact edit (lib/floor-guard.sh)

  1. SKIP_SUBSTRINGS keeps only the dotted/decorator forms: ('.skip(', '.only(', 'it.todo(', '@pytest.mark.skip', '@unittest.skip', 't.Skip(').
  2. New SKIP_IDENT_RE = re.compile(r'(?<![A-Za-z0-9_.])(?:xit|fit|xdescribe|fdescribe)\(') DIRECTLY UNDER the SKIP_SUBSTRINGS tuple (per-kind grouping, like STUB_SUBSTRINGS + its regexes), with two comment lines: bare Jasmine/Jest focus-or-skip calls; the lookbehind keeps exit(, SystemExit(, model.fit( out. Plus one # shortcut: line: def fit( / function xit( still match (space before), xit ( and xit.each( still do not (as before); upgrade path (?<!def )(?<!function ) and (?:\.each)?\s*\(.
  3. skip_kind(text): return 'SKIP' if any substring matches OR SKIP_IDENT_RE.search(text); else None. Still ≤ 25 logic lines, one function.
  4. No waiver comment on the guard's own new lines: SKIP is only scanned on test files (is_test_file: test/spec/__tests__ in the path) and lib/floor-guard.sh is not one; the new lines carry no SUPPRESS/STUB trigger either. Header comment line 27 unchanged.

The exact edit (lib/tests/floor-guard.test.sh)

After the SKIP block (:51-55), two blocks in the same style. Every echo that writes a trigger-looking line ends with the bash comment # floor-guard: allow flip-test fixture AFTER the closing quote (never inside the string): the test file's path contains test, so a later diff scan would otherwise flag the fixture line itself (informational WAIVED on a test file).

  • SKIP_EXIT_CLEAN: d=$(mk_repo skipexit); append three lines to sample.test.js: process.exit(1); // sys.exit(1), model.fit(x);, const p = profit(1);; run; check_kind SKIP_EXIT_CLEAN "$rc" 0 "$out" 'FLOOR GUARD: clean'.
  • SKIP_XIT_FLAGS: d=$(mk_repo skipxit); append xit('skipped', () => {}); (leading spaces on purpose); run; check_kind SKIP_XIT_FLAGS "$rc" 2 "$out" 'FLOOR SKIP'. Then two more repos in the same block proving the rest of the alternation: fit('focused', () => {}); → check_kind SKIP_FIT_FLAGS … 2 … 'FLOOR SKIP'; fdescribe('focused', () => {}); → check_kind SKIP_FDESCRIBE_FLAGS … 2 … 'FLOOR SKIP'. Header comment (:2-3) gains "plus boundary cases for SKIP" after "one CLEAN fixture".

Not changed

Messages, exit codes, waiver syntax, other kinds, test harness helpers.