Closes the loop the shape catalogue was built for (#2280): a duplicate family is named at the moment a copy is written, whichever tool writes it, and on arrival — instead of waiting for an audit.
Step 1 (#2899) — the coverage line shows standing work even with 0 unclassified (; standing: …), and derive_new names copies that joined a family since the previous refresh ("+2 new copies since last refresh: .error-msg in InceptionCard.vue").
Step 2 (#2900) — write-path derive arm: shape_ledger.write_time_derive + _derive_line in the prior-art hint name a duplicate family (no canon) or a canon elsewhere for the names being written; exclude_derive dedup channel (hook .derive.ids).
Step 3 (#2901) — scribe_after_write.sh, a PostToolUse hook on Bash: diffs the working tree per session (path+blob snapshot) and runs the same arms on what sed/heredocs/scripts just wrote, through the same endpoint and dedup channels. Shared scribe_defs.sh; plugin 0.1.39.
Closes the loop the shape catalogue was built for (#2280): a duplicate family is named at the moment a copy is written, whichever tool writes it, and on arrival — instead of waiting for an audit.
- **Step 1 (#2899)** — the coverage line shows standing work even with 0 unclassified (`; standing: …`), and `derive_new` names copies that joined a family since the previous refresh ("+2 new copies since last refresh: .error-msg in InceptionCard.vue").
- **Step 2 (#2900)** — write-path derive arm: `shape_ledger.write_time_derive` + `_derive_line` in the prior-art hint name a duplicate family (no canon) or a canon elsewhere for the names being written; `exclude_derive` dedup channel (hook `.derive.ids`).
- **Step 3 (#2901)** — `scribe_after_write.sh`, a PostToolUse hook on Bash: diffs the working tree per session (path+blob snapshot) and runs the same arms on what sed/heredocs/scripts just wrote, through the same endpoint and dedup channels. Shared `scribe_defs.sh`; plugin 0.1.39.
- **Step 4 (#2902)** — shape-accounting + reusing-code skills, static floor, plugin README, api-reference.
CI green on head 1068712 (run 4241). Pay-down of the derive backlog (steps 5–6) follows after deploy, as the live verification.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Since the scoped bucket (#2869) the ledger reads 100% accounted while 439
derive rows stand; the standing block was gated on unclassified > 0 and so
went silent. Build it whatever the todo count ("; standing: ..."), and add
derive_new — derive-grouped rows first seen after the previous refresh
stamp — so entering a project names the drift ("+2 new copies since last
refresh: .error-msg in InceptionCard.vue") instead of waiting for an audit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
shape_ledger.write_time_derive asks the ledger what it knows about each
named (kind, symbol): a derive-grouped family (identical body / same name
in N other files) -> "derive it now, do not add a copy"; a canonical row
at another path -> "canon #N at <path>, reuse". Judged rows at the path and
the canon own file stay silent. Rendered by _derive_line beside the
divergence line; keyed (group id / canon:<id>) on a third per-session dedup
channel in the hook (.derive.ids -> exclude_derive=).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Edits made through sed/heredocs/scripts never reached the PreToolUse
Write|Edit hook, so a whole class of writes got no prior-art hint, no
ledger feed and no duplicate-family warning. scribe_after_write.sh asks git
what changed since it last looked (per-session path+blob snapshot; first
call = files touched in the last minute), extracts the definitions in the
added lines and calls /api/plugin/prior-art with the same three dedup
channels the pre hook keeps. Never blocks; silent on any failure. The
extractor, the prose/data skip list and the local by-name arm move to
scribe_defs.sh, sourced by both hooks. Version bump covers the step-2 hook
change too (run 4239 failed only on the bump check).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Run 4240: two pre-write hook tests pinned the skip case and scribe_defs()
inside scribe_prior_art.sh, which moved to the shared library; the after-write
test saw the same derive key appended once per changed file. Keep each token
once (sort -u after the appends) and point the pins at the library.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes the loop the shape catalogue was built for (#2280): a duplicate family is named at the moment a copy is written, whichever tool writes it, and on arrival — instead of waiting for an audit.
; standing: …), andderive_newnames copies that joined a family since the previous refresh ("+2 new copies since last refresh: .error-msg in InceptionCard.vue").shape_ledger.write_time_derive+_derive_linein the prior-art hint name a duplicate family (no canon) or a canon elsewhere for the names being written;exclude_derivededup channel (hook.derive.ids).scribe_after_write.sh, a PostToolUse hook on Bash: diffs the working tree per session (path+blob snapshot) and runs the same arms on what sed/heredocs/scripts just wrote, through the same endpoint and dedup channels. Sharedscribe_defs.sh; plugin 0.1.39.CI green on head
1068712(run 4241). Pay-down of the derive backlog (steps 5–6) follows after deploy, as the live verification.🤖 Generated with Claude Code