The attr audit segmented each provider by `runtime.part('X')` and scanned the
whole segment, so it false-positived on type annotations, per-part source
registrations (`props: { role: () => … }`), and non-part helper getters (a
hidden `inputProps` with its own `type`). Now it matches only inside
`.assert({ … })` blocks — the real part props getters.
Backlog corrected: 607/50 → 559/44 (switch, announce, etc. were pure false
positives — 0 real duplication). number-field (1) / css-field (2) residue
unchanged; guard still green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
`scripts/soma-attr-audit.ts` compiles every morfo and flags attrs a provider
hardcodes in its props getter that the morfo already declares with a resolvable
value (segmenting the provider by `runtime.part('<kebab>')` to map getter→part).
Measures the migration backlog and catches new drift.
Current backlog: 607 hits across 50 components (worst: words 49, dropdown/context
menus ~28, combobox/command/time-field ~24). The migrated spin-field family is
down to its legitimate residue — number-field 1, css-field 2 (formatted
aria-valuetext, parsed aria-valuenow — values the morfo can't express).
`soma-attr-audit.test.ts` pins each migrated component to its legit-override
ceiling so it can't regress to hardcoded attrs. Extend the ceiling map as more
components migrate.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>