feat(schema): substrate tiers 1–6 (SCHEMA 34)#107
Conversation
Codemap-validated baseline and tracer-bullet execution order for tiers 1–6 remainder, explicitly excluding C.9 / files.is_entry.
Record args_count, method/constructor/optional-chain flags on call edges; extend find-call-sites recipe and golden fixture. First tracer bullet from the tiers 1–6 rollout plan.
Structured function shape on symbols (return_type, is_async, is_generator) with find-async-functions recipe; minimal fixture prefetch export for golden.
Record import() sites with specifier kind, async-fn context, and literal resolution; ship find-dynamic-imports recipe + minimal fixture golden.
Post-pass barrel detection from exports/symbols; parse-time module side- effect tracking; find-barrel-files and find-side-effect-files recipes.
Mark bindings that reach their symbol through a re-export chain; ship find-re-exported-bindings recipe + golden fixture.
Emit kind='side-effect' for bare imports; link specifiers to parent imports.id at insert time. Recipe + golden on fixtures/minimal polyfill.
Add jsx_elements/jsx_attributes extractors with parent linking, async_calls/try_catch/decorators/jsdoc_tags behavioral extractors, five flagship recipes + golden fixtures on fixtures/minimal.
Update ship status in substrate-extraction.md and close the rollout plan baseline (SCHEMA 34, all scoped slices landed, C.9 excluded).
SCHEMA 27→34; documents new substrate tables, recipes, and C.9 exclusion.
🦋 Changeset detectedLatest commit: 3fd7c93 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughSchema upgraded to 34 with new tables/columns; new extractors for JSX, behavioral data, dynamic imports, and call-shape flags; parser/adapters extended; indexing persists new substrates and barrel/side-effect flags; fixtures, goldens, tests, and recipes updated; docs and changeset added. ChangesSubstrate tiers 1–6 extraction and indexing
Sequence Diagram(s)sequenceDiagram
autonumber
participant Source as Source files
participant Parser as Parser
participant Extractors as JSX/Behavioral/Calls/Dynamic
participant Resolver as resolveModuleSpecifier
participant Index as IndexEngine
participant DB as Codemap DB
Source->>Parser: parse file
Parser->>Extractors: visit AST nodes (JSX, calls, await/try, import())
Extractors-->>Parser: elements/attrs, async_calls, try_catch, decorators, jsdocTags, calls, dynamicImports, hasSideEffects
Parser->>Resolver: resolve literal dynamic import
Resolver-->>Parser: resolved_path|null
Parser-->>Index: ParsedFile payload (+imports/specifiers incl. side-effect)
Index->>DB: insert files/symbols/calls/imports+specifiers
Index->>DB: insert dynamic_imports, async_calls, try_catch, decorators, jsdoc_tags, jsx_*
Index->>DB: update files.has_side_effects
Index->>DB: persistFileBarrelFlags()
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Possibly related PRs
Suggested labels
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
|
Delete execution plan per docs-governance (shipped content lives in substrate-extraction.md and architecture.md).
Rule 9 glossary entries and stale deferred text in substrate-extraction, research synthesis, and roadmap; trim restating SymbolRow JSDoc per concise-comments.
insert_ms median 151→145ms (7-run self-index); fewer JS↔SQLite round-trips via batchInsert.
insert_ms median 145→143ms (10-run self-index); batchInsert + id > maxBefore for import_id FK wiring preserves row order.
insert_ms median 145→143ms (10-run self-index); element inserts unchanged.
Add boundary config, tests, complexity/JSX/behavioral fixtures, and 16 golden scenarios so bundled recipes and tiers 1–6 tables have non-empty CI coverage.
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
docs/architecture.md (1)
190-190:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winUpdate stale schema version in architecture docs.
Line 190 still says schema version 27, but this PR documents and ships 34. Please update this to avoid migration/debugging confusion.
As per coding guidelines, "
**/*.md: Documentation files must be kept up-to-date with code changes".🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/architecture.md` at line 190, Update the documentation string "Current schema version: **27**" in docs/architecture.md to reflect the shipped schema version 34; search for the exact token "Current schema version" or the bolded version number and replace **27** with **34** so the README matches the code/PR.
🧹 Nitpick comments (1)
templates/recipes/find-side-effect-imports.md (1)
1-10: ⚡ Quick winAdd recipe frontmatter metadata for consistency with the template set.
This is the only new recipe doc in this cohort without
params/actionsfrontmatter, which makes behavior/documentation inconsistent with the other recipe templates.Suggested patch
+--- +params: [] +actions: + - type: navigate-to-definition + description: "Each row is a side-effect-only import occurrence." +--- + # find-side-effect-imports Side-effect-only import statements (`import "./mod"` with no bindings).As per coding guidelines: "
**/*.md: ... Use consistent terminology across all documentation" and "**/*.{json,yaml,yml,md}: Document all configuration options with examples".🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@templates/recipes/find-side-effect-imports.md` around lines 1 - 10, Add standard frontmatter to the find-side-effect-imports recipe markdown by inserting a YAML frontmatter block that documents the recipe's params and actions (even if empty/default) so it matches other templates; include keys "params" with descriptions/example values for any configurable query filters and "actions" describing outputs (e.g., columns like import_id) and expected usage, and ensure terminology matches the template set (use "params"/"actions" exact key names and include a short description and example invocation).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/research/codemap-richer-index-synthesis-2026-05.md`:
- Around line 25-26: The appendix currently shows a "fact-checked 2026-05-18"
heading while the new bullets reference 2026-05-19; update the appendix heading
(the text node reading "fact-checked 2026-05-18") to "fact-checked 2026-05-19"
or add a short annotation under that heading clarifying that the substrate plan
bullets were updated on 2026-05-19 so the dates are consistent with the new
entries (refer to the lines mentioning "Substrate plan Tiers 1–6 (2026-05-19)"
and the 2026-05-19 ship claims).
In `@fixtures/minimal/tsconfig.json`:
- Line 7: Add a short documentation snippet showing the new
"experimentalDecorators": true tsconfig option in the minimal fixture README:
explain what experimentalDecorators does and include a minimal example showing a
TypeScript class decorator usage (a simple `@log` or `@sealed` decorator applied to
a class) plus the corresponding tsconfig JSON line "experimentalDecorators":
true so readers can copy the config and example; update the README for the
minimal fixture to include this example and a one-line note linking it to the
tsconfig change.
In `@src/application/behavioral-persist.ts`:
- Around line 4-8: Add concise JSDoc blocks for the two exported persistence
functions so they qualify as public API docs: place a JSDoc comment immediately
above export function insertDecorators(db: CodemapDatabase, filePath: string,
rows: ParsedDecorator[]): void and another above export function
insertJsdocTags(...) that states the lookup criteria (how filePath and any
identifying keys are matched), what rows represent (ParsedDecorator / JsdocTag
shapes), and the insertion behavior (whether it upserts, replaces, or appends
existing records and any side-effects). Mention the expected types
(CodemapDatabase, ParsedDecorator) and any important constraints (e.g., id/key
fields used for lookup) in each comment.
In `@src/application/jsx-persist.ts`:
- Around line 5-9: Add a concise JSDoc block above the exported function
persistJsxElementsAndAttributes describing its public contract: explain that it
persists ParsedJsxElement and ParsedJsxAttribute rows into the CodemapDatabase,
that element parent relationships must be mapped to existing database IDs
(describe parent mapping behavior: unmapped parents are handled/ignored or cause
skip), that attribute rows whose local element IDs are not found in the mapping
will be skipped, and list parameter meanings (db, elements, attributes) and side
effects/return type (void). Include brief notes about expected invariants (e.g.,
elements may reference parentId mappings) so callers know preconditions.
In `@src/extractors/behavioral.ts`:
- Around line 90-112: bodyHasThrow is traversing into nested function/class
bodies and can falsely detect a throw inside an inner function as a catch
rethrow; update bodyHasThrow to skip descending into nodes whose type is
FunctionDeclaration, FunctionExpression, ArrowFunctionExpression,
ClassDeclaration, or ClassExpression (and their bodies) when iterating keys, so
you only inspect the catch block's top-level statements and nested
non-function/class nodes; keep the existing stack-based traversal and checks for
ThrowStatement and Identifier but do not push function/class nodes or their
inner body objects onto the stack.
- Around line 173-193: The regexes for tag parsing (the `@returns`, `@throws` blocks
and the general /^@(\w+)\s+(.*)$/ at the end) currently require trailing
whitespace/text so bare tags like "`@returns`" or "`@deprecated`" are skipped;
update them to allow missing trailing text by making the trailing
space+description optional and allowing optional whitespace after the tag and
optional type: e.g. change /^`@returns`?\s+(?:\{([^}]*)\}\s+)?(.*)$/ to something
like /^`@returns`?\s*(?:\{([^}]*)\}\s*)?(.*)$/ and change the general
/^@(\w+)\s+(.*)$/ to /^@(\w+)(?:\s+(.*))?$/ so that the description can be
null/empty before pushing to out in the parsing logic in behavioral.ts.
In `@src/extractors/jsx.ts`:
- Around line 167-183: tokenEnd/column_end for JSXFragment may use
closingFragment.end (or node.end) which can be on a different line than
line_start, producing wrong column_end; when isFragment is true compute
tokenStart/tokenEnd from openingFragment/closingFragment bounds (use
openingFragment.start and closingFragment.end) relative to lineStartOffset so
column_start/column_end reflect fragment token positions, and ensure the
elements entry uses those fragment-based tokenStart/tokenEnd instead of falling
back to node.start/node.end; update the logic around tokenStart, tokenEnd and
the elements push (column_start/column_end) to use
openingFragment/closingFragment when isFragment is true.
---
Outside diff comments:
In `@docs/architecture.md`:
- Line 190: Update the documentation string "Current schema version: **27**" in
docs/architecture.md to reflect the shipped schema version 34; search for the
exact token "Current schema version" or the bolded version number and replace
**27** with **34** so the README matches the code/PR.
---
Nitpick comments:
In `@templates/recipes/find-side-effect-imports.md`:
- Around line 1-10: Add standard frontmatter to the find-side-effect-imports
recipe markdown by inserting a YAML frontmatter block that documents the
recipe's params and actions (even if empty/default) so it matches other
templates; include keys "params" with descriptions/example values for any
configurable query filters and "actions" describing outputs (e.g., columns like
import_id) and expected usage, and ensure terminology matches the template set
(use "params"/"actions" exact key names and include a short description and
example invocation).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 55621d6b-0ea0-435f-8f0f-65819fb45a85
📒 Files selected for processing (122)
.changeset/substrate-tiers-1-6.mddocs/architecture.mddocs/glossary.mddocs/plans/substrate-extraction.mddocs/research/codemap-richer-index-synthesis-2026-05.mddocs/roadmap.mdfixtures/golden/minimal/barrel-files.jsonfixtures/golden/minimal/boundary-violations.jsonfixtures/golden/minimal/calls-consumer.jsonfixtures/golden/minimal/components-by-hooks.jsonfixtures/golden/minimal/components-touching-deprecated.jsonfixtures/golden/minimal/coverage-rows-after-ingest.jsonfixtures/golden/minimal/deeply-nested-functions.jsonfixtures/golden/minimal/dependencies-from-consumer.jsonfixtures/golden/minimal/deprecated-symbols.jsonfixtures/golden/minimal/enum-order-status.jsonfixtures/golden/minimal/env-var-audit.jsonfixtures/golden/minimal/fan-in.jsonfixtures/golden/minimal/fan-out.jsonfixtures/golden/minimal/files-by-coverage.jsonfixtures/golden/minimal/files-count.jsonfixtures/golden/minimal/files-hashes.jsonfixtures/golden/minimal/files-largest.jsonfixtures/golden/minimal/find-async-functions.jsonfixtures/golden/minimal/find-await-in-loop.jsonfixtures/golden/minimal/find-barrel-files.jsonfixtures/golden/minimal/find-by-param-type.jsonfixtures/golden/minimal/find-call-sites.jsonfixtures/golden/minimal/find-decorator-usage.jsonfixtures/golden/minimal/find-dynamic-imports.jsonfixtures/golden/minimal/find-export-sites.jsonfixtures/golden/minimal/find-import-sites.jsonfixtures/golden/minimal/find-jsx-usages.jsonfixtures/golden/minimal/find-leftover-console.jsonfixtures/golden/minimal/find-re-exported-bindings.jsonfixtures/golden/minimal/find-references.jsonfixtures/golden/minimal/find-side-effect-files.jsonfixtures/golden/minimal/find-side-effect-imports.jsonfixtures/golden/minimal/find-skipped-tests.jsonfixtures/golden/minimal/find-swallowed-errors.jsonfixtures/golden/minimal/find-symbol-definitions.jsonfixtures/golden/minimal/find-symbol-references.jsonfixtures/golden/minimal/find-throws-jsdoc.jsonfixtures/golden/minimal/find-write-sites.jsonfixtures/golden/minimal/high-complexity-untested.jsonfixtures/golden/minimal/index-summary.jsonfixtures/golden/minimal/jsdoc-tags-createClient.jsonfixtures/golden/minimal/jsx-attributes-product-card.jsonfixtures/golden/minimal/large-functions.jsonfixtures/golden/minimal/markers-all-kinds.jsonfixtures/golden/minimal/markers-by-kind.jsonfixtures/golden/minimal/refactor-risk-ranking.jsonfixtures/golden/minimal/suppressions-orphan.jsonfixtures/golden/minimal/tests-by-file.jsonfixtures/golden/minimal/text-in-deprecated-functions.jsonfixtures/golden/minimal/unimported-exports.jsonfixtures/golden/minimal/untested-and-dead.jsonfixtures/golden/minimal/visibility-tags.jsonfixtures/golden/minimal/worst-covered-exports.jsonfixtures/golden/scenarios.jsonfixtures/minimal/.codemap/config.jsonfixtures/minimal/README.mdfixtures/minimal/src/__tests__/smoke.test.tsfixtures/minimal/src/api/client.tsfixtures/minimal/src/api/decorated.tsfixtures/minimal/src/components/shop/ApiBridge.tsxfixtures/minimal/src/components/shop/ProductCard.tsxfixtures/minimal/src/components/shop/ShopButton.tsxfixtures/minimal/src/consumer.tsfixtures/minimal/src/env.tsfixtures/minimal/src/lib/cache.tsfixtures/minimal/src/lib/complexity-fixture.tsfixtures/minimal/src/orphan.tsfixtures/minimal/src/polyfill.tsfixtures/minimal/src/types/status.tsfixtures/minimal/src/utils/format.tsfixtures/minimal/tsconfig.jsonsrc/adapters/builtin.tssrc/adapters/types.tssrc/application/behavioral-persist.tssrc/application/bindings-engine.tssrc/application/file-graph-flags.tssrc/application/index-engine.tssrc/application/jsx-persist.tssrc/application/run-index.tssrc/application/types.tssrc/db.tssrc/extractors/behavioral.tssrc/extractors/calls.tssrc/extractors/dynamic-imports.tssrc/extractors/jsx.tssrc/extractors/module-side-effects.tssrc/extractors/symbols.tssrc/extractors/type-stringify.tssrc/extractors/types.tssrc/parsed-types.tssrc/parser.test.tssrc/parser.tssrc/resolver.tstemplates/recipes/find-async-functions.mdtemplates/recipes/find-async-functions.sqltemplates/recipes/find-await-in-loop.mdtemplates/recipes/find-await-in-loop.sqltemplates/recipes/find-barrel-files.mdtemplates/recipes/find-barrel-files.sqltemplates/recipes/find-call-sites.sqltemplates/recipes/find-decorator-usage.mdtemplates/recipes/find-decorator-usage.sqltemplates/recipes/find-dynamic-imports.mdtemplates/recipes/find-dynamic-imports.sqltemplates/recipes/find-jsx-usages.mdtemplates/recipes/find-jsx-usages.sqltemplates/recipes/find-re-exported-bindings.mdtemplates/recipes/find-re-exported-bindings.sqltemplates/recipes/find-side-effect-files.mdtemplates/recipes/find-side-effect-files.sqltemplates/recipes/find-side-effect-imports.mdtemplates/recipes/find-side-effect-imports.sqltemplates/recipes/find-swallowed-errors.mdtemplates/recipes/find-swallowed-errors.sqltemplates/recipes/find-throws-jsdoc.mdtemplates/recipes/find-throws-jsdoc.sql
💤 Files with no reviewable changes (1)
- fixtures/golden/minimal/files-by-coverage.json
Routine package upgrades after substrate tiers 1–6 work.
Update research appendix date, skip nested scopes in catch_rethrows scan, accept bare JSDoc tags, and use opening-fragment bounds for column_end.
Update stale schema 27→34 in architecture.md; add params/actions frontmatter to find-side-effect-imports template for consistency with cohort.
Exclude fixtures/minimal smoke.test.ts (intentional it.only for index coverage) from bun test. Update perf-baseline.json from CI ubuntu medians after substrate tiers 1–6 insert-path growth.
Bun treats bare `src` as a glob and still runs fixtures/minimal/src smoke.test.ts (it.only fails under CI=true).
Enforce PRAGMA query_only on printQueryResult, add extractor and migration tests, catch_rethrows + fan-out-sample goldens, and document the CLI contract.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/application/index-engine.test.ts`:
- Around line 36-46: Wrap each console spy setup in a try/finally so the spy is
always restored even if assertions fail: for the test that creates const log =
spyOn(console, "log").mockImplementation(() => {}), surround the assertion block
calling printQueryResult(...) and expect(...) with try { ... } finally {
log.mockRestore(); }, and apply the same change to the other tests that create a
log spy (the blocks around lines creating the spy for printQueryResult). This
ensures the spy on console.log is restored no matter what; reference the const
log spy and the printQueryResult calls to locate the tests to update.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: bb94803c-7a66-4041-a9b6-b42d72dbeeb9
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (27)
docs/architecture.mddocs/research/codemap-richer-index-synthesis-2026-05.mdfixtures/benchmark/perf-baseline.jsonfixtures/db/schema-v27.sqlfixtures/golden/minimal/barrel-files.jsonfixtures/golden/minimal/fan-out-sample-json.jsonfixtures/golden/minimal/fan-out-sample.jsonfixtures/golden/minimal/files-hashes.jsonfixtures/golden/minimal/files-largest.jsonfixtures/golden/minimal/index-summary.jsonfixtures/golden/minimal/refactor-risk-ranking.jsonfixtures/golden/minimal/try-catch-rethrow-heuristics.jsonfixtures/golden/minimal/unimported-exports.jsonfixtures/golden/minimal/untested-and-dead.jsonfixtures/golden/minimal/worst-covered-exports.jsonfixtures/golden/scenarios.jsonfixtures/minimal/README.mdfixtures/minimal/src/lib/complexity-fixture.tspackage.jsonsrc/application/index-engine.test.tssrc/application/index-engine.tssrc/db.test.tssrc/extractors/behavioral.test.tssrc/extractors/behavioral.tssrc/extractors/jsx.test.tssrc/extractors/jsx.tstemplates/recipes/find-side-effect-imports.md
✅ Files skipped from review due to trivial changes (10)
- fixtures/benchmark/perf-baseline.json
- fixtures/golden/minimal/refactor-risk-ranking.json
- fixtures/golden/minimal/unimported-exports.json
- fixtures/golden/minimal/try-catch-rethrow-heuristics.json
- fixtures/golden/minimal/untested-and-dead.json
- fixtures/golden/minimal/barrel-files.json
- fixtures/minimal/README.md
- fixtures/golden/minimal/files-largest.json
- fixtures/golden/minimal/files-hashes.json
- fixtures/golden/minimal/worst-covered-exports.json
Prevents spy leakage when assertions fail mid-test (CodeRabbit PR #107).
Expands the SQLite index substrate for tiers 1–6 of
substrate-extraction.md.SCHEMA_VERSION27 → 34 — rebuild on upgrade;coverage/query_baselines/recipe_recencypreserved.Summary
async_calls/try_catch, imports,jsx_attributes(~151→143 ms median on minimal fixture)fan-out-sample*Changeset: minor (→ 0.8.0 on release).
Schema (27 → 34)
calls.{args_count,is_method_call,is_constructor_call,is_optional_chain}; constructor vs call dedup key fixsymbols.{return_type,is_async,is_generator}dynamic_importstable + extractorfiles.{is_barrel,has_side_effects}bindings.resolution_kind='re-exported'import_specifiersrows (kind='side-effect') +import_idFKjsx_elements/jsx_attributes,async_calls,try_catch,decorators,jsdoc_tagsNew extractors:
extractors/jsx.ts,extractors/behavioral.ts,extractors/dynamic-imports.ts,extractors/module-side-effects.tsRecipes
find-call-sitesfind-async-functionsfind-dynamic-importsfind-barrel-filesfind-side-effect-filesfind-side-effect-importsfind-re-exported-bindingsfind-jsx-usagesfind-await-in-loopfind-swallowed-errorsfind-decorator-usagefind-throws-jsdocFixture & golden coverage
fixtures/minimalexercises tiers 1–6 end-to-end plus boundaries, FTS5, complexity, coverage, suppressions, test suites, and orphan exports. Seefixtures/minimal/README.md.+19 golden scenarios (71 total), including
boundary-violations,fan-out-sample/fan-out-sample-json,try-catch-rethrow-heuristics,components-by-hooks,refactor-risk-ranking, and more.Perf
7852ba2async_calls+try_catchb9ebdb8insertImportsWithSpecifiers12b40c0jsx_attributesonlyPost-review fixes
CodeRabbit (
9fe9c11,75a1a65)catch_rethrows— skip nested function/class bodies in catch scanparseJsDocTags— accept bare@returns/@throws/@taglinescolumn_endfromopeningFragment.end(was 239 on multi-line<></>)architecture.mdschema version 34QA remediation (
694eb1f)printQueryResult—PRAGMA query_only = 1(closes ad-hoc CLI DML/DDL gap)behavioral.test.ts(catch_rethrows, bare JSDoc),jsx.test.ts(fragment bounds),index-engine.test.ts(read-only enforcement)fixtures/db/schema-v27.sql)try-catch-rethrow-heuristics,fan-out-sample,fan-out-sample-jsonCI (
377de85,4473ca4)./src(excludesfixtures/minimal/srcit.onlyunderCI=true)CodeRabbit triage (9 actionable)
experimentalDecoratorsREADME; JSDoc on internal persist helpersNot in this PR
files.is_entry/ reachability —c9-plugin-layer.mdMigration
No in-place DDL. Schema mismatch triggers rebuild; user-data tables survive via
dropAll()exclusions. Re-runcodemap --fullafter upgrade. v27→34 path covered bydb.test.ts+ frozenfixtures/db/schema-v27.sql.Test plan
bun run checkbun run test:golden— 71 scenariosbun test ./src--full+validate --json→[]694eb1f)CODEMAP_ROOT=fixtures/minimal bun run dev --full)Summary by CodeRabbit