forked from bchanot/claude
New S11-S13 in lib/tests/run-doc-shape.sh (+4 assertions, 19→23) + truncate_last_n() helper (removes exactly N lines from the END of a committed file — pure removal, 0 added lines, no heading, so the ADDED-envelope and heading checks at doc-shape.sh:70/78 can't fire first). Baseline = 40 plain committed lines, then truncated. S11 remove exactly 20 (== default DOC_SHAPE_MAX_REMOVED, `-gt` boundary) → within (0). S12 remove 30 → exceeds (1), stderr names the path. S13 DOC_SHAPE_MAX_REMOVED=5 override + 6-line removal → exceeds (1). Closes J4-08 (WEAK): the REMOVED branch was never driven over threshold by any existing case (S4 only removes 2 lines) — a regression here mislabels a large doc deletion MINOR and doc-syncer's auto-commit flow would swallow it silently (the exact RISK-1 BDR-040's oracle exists for). Mutation (lean scratch copy — only doc-shape.sh + run-doc-shape.sh, not the whole repo/.git): changed `-gt "$DOC_SHAPE_MAX_REMOVED"` to `-gt 2000` (doc-shape.sh:82). RED: S12 fails both assertions (30 removed no longer exceeds) and S13 fails (the hardcoded literal also kills the env-override contract — DOC_SHAPE_MAX_REMOVED=5 no longer has any effect). S11 stays green (20 removed was always within, mutation-invariant). 3/3 reds land exactly where expected. GREEN: real repo unmutated, 23/23 passed, shellcheck clean.