testsAndMisc/docs/superpowers/evidence/check-file-length-gate-2026-08-17.json
Krzysztof kuhy Rudnicki c4bb3e93f6 meta: add the check_file_length.sh gate the splits assumed existed
The shell-splitting work has been referring to check_file_length.sh --all
as its per-commit gate. No such script was ever committed: it is absent
from the working tree and from every commit in history, so each split so
far was checked by eye.

Cap is 250 lines, source extensions only (sh/bash/zsh, py, kt/kts, dart,
ts/tsx/js/jsx). Markdown, HTML, JSON, YAML and lockfiles are out of
scope, as are third_party/ and docs/superpowers/.

--all reports exactly 24 files over the cap, independently reproducing
the count the brief carried. That agreement is what confirms the
extension scope is the intended one.

Deliberately NOT wired into .pre-commit-config.yaml: 24 files are still
over, so a hook would block every commit. It becomes a hook once --all
exits 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
2026-08-17 14:52:24 +02:00

54 lines
3.4 KiB
JSON

{
"intent": "Provide the per-commit file-length gate that the shell-splitting work has been referring to. It did not exist: no check_file_length.sh was ever committed to this repo, so every split so far was checked by eye.",
"scope": [
"meta/scripts/check_file_length.sh — new script",
"Non-goal: wiring it into .pre-commit-config.yaml. 24 files are still over the cap, so a hook would block every commit. It lands as a hook once --all exits 0."
],
"changes": [
"New meta/scripts/check_file_length.sh enforcing a 250-line cap, taking either --all (every tracked file) or an explicit file list.",
"Scope is source extensions only (sh/bash/zsh, py, kt/kts, dart, ts/tsx/js/jsx). Markdown, HTML, JSON, YAML, lockfiles and .gitignore are excluded: a length cap on data and prose is noise.",
"third_party/ and docs/superpowers/ are excluded as vendored or generated trees.",
"Reports each violation with its line count and the overage, sorted worst-first, on stderr; exits 1 when anything is over."
],
"verification": [
{
"command": "bash meta/scripts/check_file_length.sh --all",
"result": "fail-as-expected",
"evidence": "Reports exactly 24 files over the cap and exits 1. This independently reproduces the count carried in NEXT_SESSION_PROMPT.md (20 shell, 2 kotlin, 1 dart, plus the markdown brief which this scope correctly excludes), which is what confirms the extension scope matches the intended one."
},
{
"command": "bash meta/scripts/check_file_length.sh meta/scripts/check_file_length.sh",
"result": "pass",
"evidence": "'all checked files are within 250 lines', exit 0 — the gate passes its own cap at 135 lines."
},
{
"command": "bash meta/scripts/check_file_length.sh phone_focus_mode/dns_enforcer.sh",
"result": "fail-as-expected",
"evidence": "'325 phone_focus_mode/dns_enforcer.sh (+75)', exit 1 — named-file mode reports the overage."
},
{
"command": "bash meta/scripts/check_file_length.sh NEXT_SESSION_PROMPT.md third_party/agent-skills/hooks/simplify-ignore.sh",
"result": "pass",
"evidence": "Both exit 0: the markdown is out of extension scope and the 302-line vendored script is under an excluded prefix."
},
{
"command": "bash meta/scripts/check_file_length.sh",
"result": "fail-as-expected",
"evidence": "'Error: pass --all or one or more file paths', exit 1 — no-argument invocation cannot be mistaken for a clean run."
},
{
"command": "shellcheck meta/scripts/check_file_length.sh",
"result": "pass",
"evidence": "Clean. An initial SC2155 on the readonly SCRIPT_NAME assignment was fixed by splitting declaration from assignment, not suppressed."
}
],
"risks": [
"The cap is a blunt measure: a 260-line file with one long data table is treated the same as a 260-line file with tangled control flow. The gate is an alarm, not a judgement.",
"Excluding docs/superpowers/ means generated evidence and contract artifacts are never capped. That is intended, but a genuinely oversized script placed there would go unchecked."
],
"rollback": [
"git revert the commit and delete the script; nothing depends on it yet because it is deliberately not wired into pre-commit.",
"After rollback, confirm pre-commit run --all-files still passes, which it will, since no hook references the script."
]
}