v2.2.0 — duck-shape
duck-shape
A new skill: shape code by the concepts a reader must hold to change it safely — never line count, never nesting depth.
The distinction that makes it different from a size metric: depth is not the defect. A five-level hierarchy where every level names what it is for is cheap; two levels called Manager and Helper are expensive, and no nesting metric tells them apart. The target is clarity, not flatness.
It cuts both ways, which a lines-of-code lens cannot: a golfed one-liner is fewer lines and more held facts. A regex replacing a named parser is one line, and the reader now holds the grammar.
Top of the measure is "does this concept need to exist at all?" — deleting a concept outranks naming it well. Deleting two hundred lines that were one concept removes one held fact; deleting a single line that was a mode flag removes a held fact from every reader of every branch downstream.
Roles
duck-shape— the doer, at change timeduck-roastangle 2 — the same lens at milestone altitude, with churn as evidence on a finding, never a rankduck-review— reports what change time missed
duck-run: eight stages to six
duck-shape and duck-dry moved from separate stages into the per-unit cycle inside Execute: failing test, minimal pass, shape, dry. They belong there because the diff is not committed yet — the one window where neither costs ceremony. Defer them and shaping becomes a restructure, drying becomes a sweep, and both then need their own commit and their own trip through the gate.
Gate
- Required cross-references must exist, not merely resolve. A load-bearing link could previously be deleted with the whole gate green.
- Skill descriptions are bounded — every host loads all of them, every session.
- A directory under
skills/with noSKILL.mdis reported rather than silently uncounted.
Also
duck-break owns "red team it"; duck-shape owns "duck simplification"; trigger descriptions normalized across the collection.