Milestone 299 steps 5–6 — one-time derive pay-down (a2b377b): dead views deleted (TaskViewerView, UserManagementView, LogsView); shared recipes moved to editor-shared.css, components.css (.page-container, .fs-input), new rules-shared.css and dup-report.css; apiErrorMessage() replaces 10 hand-rolled error parses; ledger 4693 → 4556 shapes, 0 unclassified / proposals / divergence.
CSS derive families are names, never bodies (8511144, note #2917): derive_groups no longer puts CSS rows in dup:<sha> groups; a CSS family is the same class defined in ≥2 files (code keeps identical-body-in-2 / same-name-in-3). The write-time derive line says "repeated name … defined in N other file(s)" for name families and dismisses CSS families with scoped-css. Skills updated; plugin 0.1.41.
Lands on main:
- **Milestone 299 steps 5–6 — one-time derive pay-down** (`a2b377b`): dead views deleted (TaskViewerView, UserManagementView, LogsView); shared recipes moved to `editor-shared.css`, `components.css` (`.page-container`, `.fs-input`), new `rules-shared.css` and `dup-report.css`; `apiErrorMessage()` replaces 10 hand-rolled error parses; ledger 4693 → 4556 shapes, 0 unclassified / proposals / divergence.
- **CSS derive families are names, never bodies** (`8511144`, note #2917): `derive_groups` no longer puts CSS rows in `dup:<sha>` groups; a CSS family is the same class defined in ≥2 files (code keeps identical-body-in-2 / same-name-in-3). The write-time derive line says "repeated name … defined in N other file(s)" for name families and dismisses CSS families with `scoped-css`. Skills updated; plugin 0.1.41.
CI green on head `8511144` (run 4260).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The derive queue said the biggest duplicate families were whole views:
TaskViewerView, UserManagementView and LogsView were imported nowhere — left
behind when tasks moved to the editor and users/logs became SettingsView
tabs. Deleted (rule 22). Note/TaskEditorView carried six identical scoped
rules -> editor-shared.css (the .tag-suggest-row gap the scoped copies
actually rendered wins). Three views wrapped the page under three names ->
.page-container in components.css. Three scoped input recipes -> the design
system fs-input recipe (snippet #2336), verbatim, in components.css; width/
box-sizing stay with the caller. The three rules panes share .pane and the
pane heading via rules-shared.css (the auth-shared pattern, #2852).
Ledger: a single-declaration CSS rule keeps its selector in its fingerprint,
so `color: var(--fs-text-tertiary)` under five different names is no longer
a five-file "identical body" family — the first pay-down found that most of
the 148 dup families were exactly this, and nobody would consolidate them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
KnowledgeView's own comment asked for this promotion once a second view grew the
panel. The sheet carries .dup-panel / .dup-empty,.dup-head / .dup-group /
.dup-members / .dup-member(+:hover) / .dup-score; each view keeps only its
extras (.dup-claimed, .dup-action).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tests/helpers.http_sink replaces three module-local _Sink handlers (the
write-path tests and the after-write test). ProjectView + SettingsView
parsed `(e as {body?:{error?}}).body?.error || fallback` by hand ten times
beside the apiErrorMessage canon (#2853) - all ten now call it. The
extractor (server + the hook awk mirror) no longer reads `import { type Foo }`
as a definition of Foo - that was the last "identical body" sym family.
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.
Lands on main:
a2b377b): dead views deleted (TaskViewerView, UserManagementView, LogsView); shared recipes moved toeditor-shared.css,components.css(.page-container,.fs-input), newrules-shared.cssanddup-report.css;apiErrorMessage()replaces 10 hand-rolled error parses; ledger 4693 → 4556 shapes, 0 unclassified / proposals / divergence.8511144, note #2917):derive_groupsno longer puts CSS rows indup:<sha>groups; a CSS family is the same class defined in ≥2 files (code keeps identical-body-in-2 / same-name-in-3). The write-time derive line says "repeated name … defined in N other file(s)" for name families and dismisses CSS families withscoped-css. Skills updated; plugin 0.1.41.CI green on head
8511144(run 4260).🤖 Generated with Claude Code
type X,import specifiers are not definitions (#2904, milestone 299 step 6)tests/helpers.http_sink replaces three module-local _Sink handlers (the write-path tests and the after-write test). ProjectView + SettingsView parsed `(e as {body?:{error?}}).body?.error || fallback` by hand ten times beside the apiErrorMessage canon (#2853) - all ten now call it. The extractor (server + the hook awk mirror) no longer reads `import { type Foo }` as a definition of Foo - that was the last "identical body" sym family. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>