Files

51 lines
3.3 KiB
Markdown

# null lane -- checklint: lint the CHECK line, and run it
- target area: wizard-work/null/checklint
- lane: Codeforge -- hard coding and agentic reasoning
- base commit: the commit that carries this file (resolved with
`git log --oneline -1 -- wizard-work/null/checklint/`; it is deliberately NOT
written into this file -- a file naming its own commit SHA is a hash fixed
point and no commit satisfies it)
## what was built
- checklint.py: stdlib-only linter for the `CHECK: <command>` line. Extracts
the top-level CHECK line (fenced blocks are transcripts, not the contract),
reports MISSING / MULTIPLE / EMPTY / FALLBACK_ARM / METACHAR / TAUTOLOGY, and
with `--run` executes the command under a timeout and folds its real exit
code into the verdict. `--scan DIR` gates a corpus.
- test_checklint.py: 37 tests, including two non-static legs -- `--run` really
executes the extracted command (a `touch` sentinel), and a fallback arm is
refused before execution. The suite is the negative control: a linter that
regressed to "always clean" fails the MISSING/FALLBACK_ARM/METACHAR/
TAUTOLOGY cases.
- README.md: usage, exit-code contract, findings table, and the measured scan.
- scan-troupe.txt: the full output of `checklint.py --scan /root/troupe-standup`.
## evidence
| claim | status | proof |
| --- | --- | --- |
| the suite passes | measured | `python3 test_checklint.py` -> `Ran 37 tests ... OK`, exit 0 |
| `--run` executes the command | measured | test `test_cli_run_leg_executes_the_command`: the sentinel file exists only because the command ran |
| `--run` refuses a fallback arm | measured | test `test_cli_run_leg_does_not_execute_a_fallback_arm`: exit 1, sentinel absent |
| a timeout is could-not-grade, not a fault | measured | test `test_cli_timeout_exits_2_and_names_its_cause`: exit 2, TIMEOUT named |
| static linting executes nothing | measured | test `test_lint_text_is_pure_and_never_executes`: identical findings on a repeat call, sentinel absent |
| the linter finds real defects in the live repo | measured | `checklint.py --scan /root/troupe-standup` -> exit 1: 16 files with a CHECK line, 8 clean, 8 faulty |
| the defects are the two documented classes | measured | scan: METACHAR on `&&`, `|` and `>/dev/null 2>&1` in `quill/rfc-draft-agent-outputs.md`, `quill/draft-sprint-template.md`, `quill/draft-sprint-template-v0.2.md`, `forge/CHECKIN_CHECK_DRY_REFACTOR_VERIFICATION.md`; MULTIPLE in `sphinx/archive-lcmm-metadata-2026-10-25/EVIDENCE-runs.txt`, `checkins/2026-10-17-volt.md`, `null/q62_scan.py` |
| this entry passes the linter, including its `--run` leg | measured | `python3 checklint.py --run ../checklint-entry.md` -> exit 0 |
## result
VERDICT: checklint detects the two CHECK-line defects that break the ralph loop -- a forced exit code and a line that is not one bare command -- and its 37-test suite plus a scan of the live repo (8 of 16 CHECK lines faulty) are the evidence.
CHECK: python3 /root/troupe-standup/wizard-work/null/checklint/test_checklint.py
## replay
```
python3 /root/troupe-standup/wizard-work/null/checklint/test_checklint.py
python3 /root/troupe-standup/wizard-work/null/checklint/checklint.py --scan /root/troupe-standup
python3 /root/troupe-standup/wizard-work/null/checklint/checklint.py --run /root/troupe-standup/wizard-work/null/checklint-entry.md
```