Adopts ideas/token-conservation.md, parked 2026-07-28, plus the disciplines the human added: read the compressed form first, discover by mechanism, shrink output at the source, never pay twice for the same bytes. docs/context-economy.md owns all of it and leads with a floor, because every cheap failure mode is also a token saving — skipping the owning doc, guessing a signature, reporting from a diff, thinning a test — and each has already cost this repo a defect. Frugality is for presentation and discovery, never for the artifact or the evidence. Mechanical, not remembered: - scripts/surface.sh generates docs/surface.md — every top-level declaration with its line, 261 lines standing for 3757 of source. The pre-commit hook regenerates and stages it, so it cannot be stale, and verify.sh compares independently for a clone that never set core.hooksPath. The hook refuses a commit with unstaged .go changes, since what it generated describes the working tree, not the commit. - verify.sh --quiet: 48 lines of gate output become 1. The hook uses it. - CLAUDE_LOC_MAX=150, the only budget billed per turn rather than per read. Both new gates were watched failing before being kept: a doctored surface.md, and CLAUDE_LOC_MAX temporarily set to 5. state.md's inventory loses its LOC column. It had already drifted on six files (content.go 381→450, render.go 447→454, web.go 206→217, check 216→223, watch 129→137, chrome 105→110) which is what a number written in two places does; the generated file owns sizes now, the table owns purpose. The subagent question is recorded there as the one open decision, with the case for and against written out in the idea file.
29 lines
1.4 KiB
Bash
Executable File
29 lines
1.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Makes the gate non-optional. Enable once per clone:
|
|
# git config core.hooksPath scripts/hooks
|
|
# Bypass deliberately with `git commit --no-verify` — and say why in the commit body.
|
|
set -uo pipefail
|
|
cd "$(git rev-parse --show-toplevel)" || exit 1
|
|
|
|
# Anything mechanically derived from the code is regenerated and staged here, not remembered. A
|
|
# generated file that only fails a gate teaches nothing — the commit should simply carry the current
|
|
# one. `verify.sh` still compares, because a clone without core.hooksPath set has no hook at all.
|
|
#
|
|
# The generated file describes the working tree, so a partly-staged .go file would put a surface in the
|
|
# commit for code the commit does not contain — the same failure the staged-tree gate exists for.
|
|
# Checked before generating, because a staged deletion also breaks the generator.
|
|
unstaged=$(git diff --name-only -- '*.go')
|
|
if [ -n "$unstaged" ]; then
|
|
printf 'FAIL unstaged .go changes — docs/surface.md would describe code this commit lacks:\n'
|
|
printf ' %s\n' $unstaged
|
|
printf ' stage them, stash them, or commit with --no-verify and say why in the body.\n'
|
|
exit 1
|
|
fi
|
|
|
|
# One generated artifact, so one call. A second one makes this a two-line list; it does not make it a
|
|
# registry (CLAUDE.md rule 1).
|
|
./scripts/surface.sh --write >/dev/null || exit 1
|
|
git add docs/surface.md
|
|
|
|
exec ./scripts/verify.sh --quiet
|