chore(release): 0.4.1#54
Merged
Merged
Conversation
…ng (6F.9, A15) Self-found validating 0.4.0 on Grafana's frontend: `find "Find silences by matcher"` ranked OrderBySection (renders a bare "BY") top-1 over SilencesFilter, because a lone stopword is a rare literal with high IDF; and `find "The"` returned confident matches on "the". New isLowSignal() in core/text.ts (extends the A14 hasMatchSignal guard): true when a normalized string is empty, punctuation-only, or entirely stopwords (the stopword set is folded through foldPlural so it compares to normalized text). matchComponents drops stopword-only query terms and skips stopword-only rendered-text targets, so the exact-phrase component wins and a stopword-only query declines no-signal. Verified on the real Grafana graph: "Find silences by matcher" -> SilencesFilter top-1 (OrderBySection gone), "The" -> no-signal, and resolve on a stopword-heavy ticket went from confidently-wrong to an honest no-signal. New failure mode A15 + fixture a15-stopword-noise; 5 unit tests. A separate finding (HTML-entity rendered text -> junk tokens) is filed as A16/6F.10 — an extraction bug, out of scope for a scoring PR. Tests 221 green; eval 297/0/0/0, gate OK, all metrics 1.000. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-stopword-scoring fix(core): stopword & rare-literal scoring noise (6F.9, A15)
…6F.10, A16) Self-found validating 0.4.0 on Grafana's frontend: rendered text that is an HTML entity (` `, `"`, `>`, `"`, `·`, `<`, `›`) survived into `renderedText` as a junk token (`nbsp`, `34`, `gt`), creating spurious matches — and a numeric entity like `"`→"34" let a gibberish query sharing those digits ("zzqwxnomatch12345") match. New `entities.ts` decodes the HTML entities React resolves at render time (numeric decimal/hex generically, named entities from a curated map; unknown names left verbatim, matching React). `extractRenderedText` decodes JSX text and quoted attribute values — the surfaces React HTML-decodes — while JS string/template literals stay untouched. Decoded entities become the character React renders, which the normalizer strips as punctuation/whitespace, so an entity-only component yields no discriminating match target. New fixture `a16-html-entities`: the entity-only component produces no target, and the named-entity token, numeric-entity token, and digit-sharing gibberish all decline `no-signal` while a real query still lands on the real component. 7 new parser-react tests (136 total); eval 304/0/0/0, gate OK, metrics 1.000. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…0-html-entities fix(parser-react): decode HTML entities in rendered-text extraction (6F.10, A16)
…hs (6F.6, F3)
The field run found 1 covered-by edge across a whole app, so every bundle
falsely warned "untested" — near-universal noise. buildBundle now, when test
files exist but < 5% of components carry a covered-by edge, emits one honest
graph-level note ("coverage-unmapped — only N/M components have mapped test
coverage") instead of a per-component false "untested". A genuinely test-free
repo (no test nodes) keeps the accurate "untested".
3 agent-sdk unit tests (near-empty -> downgrade, healthy -> keep, no-tests ->
keep). Verified on the real Grafana graph (34% coverage -> per-component
"untested" preserved, no spurious downgrade).
This is the defensive half of 6F.6. The detection half (custom render
wrappers / alias-imported / outside-__tests__ test resolution) stays open:
could not reproduce the field failure — the renderWithProviders fixture shape
already maps and Grafana yielded 1,009 covered-by edges — so it waits on a
real failing test file from the tester.
Tests 231 green; eval 297/0/0/0, gate OK.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-coverage-unmapped feat(agent-sdk): coverage-unmapped downgrade for near-empty test graphs (6F.6 defensive half, F3)
Bump all packages to 0.4.1 and the generator / CLI / MCP version strings. Folds in the second field-hardening round (all merged to development since 0.4.0): - 6F.8 galaxy visualizer (self-contained interactive HTML) - 6F.9 stopword & rare-literal scoring (A15) - 6F.10 HTML-entity rendered-text decoding (A16) - 6F.6 coverage-unmapped downgrade (defensive half, F3) Validated by self-running against Grafana's frontend (6,461 files -> 15,334-node graph in 72 s: 55 RTK-query data sources, 32 routes, 1,009 coverage edges). README changelog updated. Verified: 7 packages build, 231 unit tests, eval 297/0/0, typecheck clean, npm pack -> ui-lineage-0.4.1.tgz (both bins, visualize wired, no runtime @coderadar/* leakage). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release 0.4.1
Second field-hardening round, folding in everything merged to
developmentsince 0.4.0. Validated by self-running against Grafana's frontend (6,461 files → a 15,334-node graph in 72 s: 55 RTK-query data sources, 32 routes, 1,009 test-coverage edges — all previously 0/1 in the original field run).What's in it (vs 0.4.0)
BYno longer outranks the exact-phrase match; stopword-only queries declineno-signal. (fix(core): stopword & rare-literal scoring noise (6F.9, A15) #51) /"/>decoded during extraction (as React does), so they stop producing junk match tokens. (fix(parser-react): decode HTML entities in rendered-text extraction (6F.10, A16) #52)coverage-unmappeddowngrade (defensive half, F3): when test files exist but almost none map, bundles emit one honest note instead of near-universal falseuntested. (feat(agent-sdk): coverage-unmapped downgrade for near-empty test graphs (6F.6 defensive half, F3) #53)visualize: self-contained interactive HTML galaxy, responsive at 15k+ nodes. (feat(cli): galaxy visualizer — self-contained interactive HTML graph explorer (6F.8) #49)Verification
npm pack→ui-lineage-0.4.1.tgz(176.7 KB, 21 files), bothui-lineage+ui-lineage-mcpbins,visualizewired,--version= 0.4.1, no runtime@coderadar/*leakageAfter merge — publish (needs npm credentials)
Then the tester points their MCP client at
ui-lineage@0.4.1(ui-lineage-mcp) and re-runs the validation.🤖 Generated with Claude Code