Skip to content

chore(release): 0.4.1#54

Merged
officialCodeWork merged 7 commits into
mainfrom
chore/release-0.4.1
Jul 15, 2026
Merged

chore(release): 0.4.1#54
officialCodeWork merged 7 commits into
mainfrom
chore/release-0.4.1

Conversation

@officialCodeWork

Copy link
Copy Markdown
Owner

Release 0.4.1

Second field-hardening round, folding in everything merged to development since 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)

Verification

  • 7 packages build · 231 unit tests · eval 297 pass / 0 fail, all honesty metrics 1.000 · typecheck clean
  • npm packui-lineage-0.4.1.tgz (176.7 KB, 21 files), both ui-lineage + ui-lineage-mcp bins, visualize wired, --version = 0.4.1, no runtime @coderadar/* leakage

After merge — publish (needs npm credentials)

git checkout main && git pull
pnpm install && pnpm build
cd packages/cli && npm publish

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

DeepCodeWork and others added 7 commits July 16, 2026 03:06
…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 (`&nbsp;`, `&#34;`, `&gt;`, `&quot;`, `&middot;`, `&lt;`,
`&rsaquo;`) survived into `renderedText` as a junk token (`nbsp`, `34`, `gt`),
creating spurious matches — and a numeric entity like `&#34;`→"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>
@officialCodeWork
officialCodeWork merged commit 9a38274 into main Jul 15, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants