Skip to content

chore(release): 0.5.0 — Phase 6 (lifecycle, scale, hardening)#60

Merged
officialCodeWork merged 11 commits into
mainfrom
chore/release-0.5.0
Jul 16, 2026
Merged

chore(release): 0.5.0 — Phase 6 (lifecycle, scale, hardening)#60
officialCodeWork merged 11 commits into
mainfrom
chore/release-0.5.0

Conversation

@officialCodeWork

Copy link
Copy Markdown
Owner

Release 0.5.0 — Phase 6 complete (Gate 6 passed · M6 reached)

Bumps all packages + generator/CLI/MCP version strings 0.4.1 → 0.5.0 and folds the whole Phase 6 — lifecycle, scale, and hardening line (merged to development since 0.4.1) into main.

What's in it

  • 6.1 Incremental re-scanscan --update (byte-identical to a full re-scan, skips work when nothing changed) and scan --watch; per-file hashes in GraphMeta.
  • 6.2 Scale — ~2,000-file synthetic benchmark + nightly, budget-gated perf CI (< 5 min scan, < 4 GB RSS).
  • 6.3 Determinism — stable node/edge/candidate ordering; the eval runner hard-gates two-run byte-identity.
  • 6.4 Version skew & rename tracking — SHA-keyed graph store; bundle --against <sha|latest> warns on renamed/moved definitions.
  • 6.5 Generated/vendored classification + PII policy — codegen excluded from matching (kept in lineage); docs/security.md, enforced by a test.

Verification

  • 7 packages build; full unit suite green; eval 317/0/0 · determinism 1.000; typecheck + lint clean.
  • npm packui-lineage-0.5.0.tgz (21 files, both bins run, --version 0.5.0, scan works, no runtime @coderadar/* leakage).

Publish (npm publish) is intentionally left to the maintainer (needs npm credentials). After publish, the tester re-validates via ui-lineage-mcp.

🤖 Generated with Claude Code

DeepCodeWork and others added 11 commits July 16, 2026 04:07
… gate (6.3, G8)

Make scan output reproducible across runs and machines, and enforce it in CI.

- scanReact iterates source files in stable path order (new sortedSourceFiles)
  across all three file passes, and returns nodes sorted by id + edges by a
  total-order key over every identifying field (edgeSortKey).
- resolveHookEdges re-sorts and dedups after rewriting unresolved-hook
  placeholders (a rewrite can collide two edges onto one hook id).
- Candidate ranking gets a final id tiebreak (same-named components rank
  deterministically instead of by scan order).
- Eval runner scans each fixture twice and byte-compares (dropping only
  generatedAt): new determinismStablePct metric, printed and hard-gated.
- 4 new parser-react determinism tests; queryfn.test order-fragile assertion
  made order-independent.

eval 304/0/0/0, determinism 1.000, all metrics 1.000; typecheck + lint clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eterminism

feat(determinism): stable ordering + eval two-run byte-diff gate (6.3, G8)
…nt (6.5, D5/G7)

Machine-generated code is retained as lineage/API metadata but kept out of match
candidates, and the screenshot-privacy policy is enforced in CI.

- isGeneratedFile classifies files by __generated__//generated/ path segment,
  .generated./.gen. filename infix, @generated/DO NOT EDIT banner, or a
  minified (>=3000-char) line. A post-pass tags component/hook nodes with a
  `generated` flag (function + class components + hooks, uniformly).
- matchComponents drops `generated` components from the candidate pool and IDF
  corpus; their nodes/edges (incl. data sources) stay for tracing.
- docs/security.md states the G7 PII policy; packages/vision/src/policy.test.ts
  enforces it — greps vision source for fs-write/image-persistence APIs and
  asserts the package never imports fs.
- New fixture d5-generated-code: path- and banner-classified generated
  components trace to endpoints but decline on their text; the hand-written
  component matches and isn't poisoned by generated text in the query.

6 parser-react + 7 vision tests; eval 314/0/0/0, determinism 1.000, all metrics
1.000; typecheck + lint clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…enerated-classification

feat(classification): generated-code exclusion + PII policy enforcement (6.5, D5/G7)
…king (6.4, G3/A11)

Warn when a ticket resolved against a stored (production) graph points at a
definition that was renamed or moved in the current code.

- core diffRenames(from, to): pairs a definition gone by identity (name+file)
  with a same-body-signature definition that is new in the newer graph. Signature
  = structural fingerprint + normalized rendered text + props + rendered-children,
  stable across a rename/move. Confident 1:1 only; generic/ambiguous bodies
  skipped (no false renames).
- core SHA-keyed store: saveGraphToStore/loadGraphFromStore/graphStoreDir ->
  .coderadar/graphs/<sha>.json (or "working") + a latest pointer.
- buildBundle gains a currentGraph option -> "version skew — matched `X`;
  renamed `Y` (file) in the current graph".
- CLI: scan --store writes the store; bundle --against <sha|latest> loads the
  current graph for the diff.
- Fixture pair g3-version-skew/{old,new} (InvoiceCard.tsx -> BillingCard.tsx,
  renamed and moved). .coderadar/ gitignored.

7 core + 4 store + 2 parser-react + 3 agent-sdk tests; verified end-to-end via
the CLI. eval 317/0/0/0, determinism 1.000, all metrics 1.000; typecheck + lint
clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ersion-skew

feat(version-skew): SHA-keyed store + cross-version rename tracking (6.4, G3/A11)
Guard against scaling regressions with a large synthetic app and a gated budget.

- eval/src/bench.ts deterministically generates a ~2,000-file React app with
  realistic import depth (page -> 8 sections -> 8 atoms + a hook, direct fetch
  per section), scans it, and asserts a perf budget (--files / --budget-seconds
  / --budget-rss-mb), measuring wall time and peak RSS via
  process.resourceUsage().maxRSS.
- Measured ~2,016 files in ~2s / ~400 MB — far under the 300s / 4 GB budget, so
  the optional worker-thread / tree-sitter fast paths were deliberately not
  applied (no measured bottleneck).
- Root `pnpm bench` script; nightly .github/workflows/perf.yml (schedule +
  manual dispatch) runs the budget-gated bench off the per-PR path.
- eval/bench/ gitignored and self-cleaned after each run.

eval 317/0/0/0, determinism 1.000; typecheck + lint clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…cale-bench

feat(bench): scale benchmark generator + nightly perf budget (6.2, D3)
…ch (6.1, D1/G2)

Re-scan only what changed, with a graph provably identical to a full re-scan.

- Split scanReact into createScanProject (build/load the ts-morph project) and
  scanProject (the full analysis).
- New IncrementalScanner keeps one project alive; update() refreshes only files
  whose bytes changed (refreshFromFileSystemSync), adds new / drops deleted
  files, then re-runs scanProject. Correctness by construction: every node and
  cross-file edge is re-derived from current ASTs, so an update's graph is
  byte-identical to a fresh scan — the changed file's dependents are recomputed
  for free. The win is parsing: unchanged files keep cached ASTs.
- Property test: an interconnected app stays byte-identical to a full re-scan
  across 20 randomized single-file edits, plus add/delete with exact `changed`.
- GraphMeta.fileHashes (path -> sha256; schema regenerated) records provenance;
  projectFileHashes computes it.
- CLI: `scan --update` short-circuits when nothing changed (else reports the
  changed set and full-rescans); `scan --watch` re-emits on debounced changes.

Also strips a stray NUL byte that shipped in the 6.3 edgeSortKey join separator
(now the intended space) — functionally inert but flagged the file as binary.

eval 317/0/0/0, determinism 1.000; parser-react 151 tests, typecheck + lint
clean. Gate 6 passes; M6 reached.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ncremental-rescan

feat(incremental): incremental re-scan + scan --update/--watch (6.1, D1/G2)
Bump all packages to 0.5.0 and the generator / CLI / MCP version strings. Folds
in Phase 6 — lifecycle, scale, and hardening (all merged to development since
0.4.1):
- 6.1 incremental re-scan (scan --update / --watch, byte-identical to full)
- 6.2 scale benchmark + nightly budget-gated perf CI (< 5 min / < 4 GB)
- 6.3 determinism (stable ordering; eval hard-gates two-run byte-identity)
- 6.4 version skew & rename tracking (SHA-keyed store; bundle --against)
- 6.5 generated/vendored classification + PII policy (docs/security.md, enforced)

Gate 6 passed; M6 reached (production-grade: incremental, fast, deterministic,
versioned). README changelog updated.

Verified: 7 packages build, full unit suite, eval 317/0/0 + determinism 1.000,
typecheck + lint clean, npm pack -> ui-lineage-0.5.0.tgz (both bins, scan works,
no runtime @coderadar/* leakage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@officialCodeWork
officialCodeWork merged commit e899867 into main Jul 16, 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