feat: v1 finalize Track C — debt sweep (7 ACs)#73
Merged
Conversation
Closed
theagenticguy
pushed a commit
that referenced
this pull request
May 10, 2026
## Track C — debt sweep (7 ACs)
Closes the debt-sweep leg of v1-finalize per
`.erpaval/specs/006-v1-finalize/`.
Spec: [spec.md§Track C](.erpaval/specs/006-v1-finalize/spec.md).
ADR:
[0014-scip-references-and-embedder-fingerprint](docs/adr/0014-scip-references-and-embedder-fingerprint.md).
PR-split: A → C → B → D ordering — this is leg 3 of 4.
### What changes
- **AC-C-1 parse-cache LRU eviction** — `evictIfOverCap(cacheDir,
capBytes)` lists shards, sorts mtime-asc, deletes oldest until ≤0.9×cap.
Wired into `writeCacheEntry` post-write; gated on
`CODEHUB_PARSE_CACHE_MAX_BYTES` (default 1 GiB; 0 disables). Eviction
errors swallowed silently — cache failure is never fatal. JSDoc at
`content-cache.ts:133` updated to point at the new helper. +12 tests.
- **AC-C-2 stringArrayField round-trip symmetry** — `stringArrayOrNull`
writer + 3 readers (`duckdb-adapter.ts:setStringArrayField`,
`graphdb-adapter.ts:setStringArrayFieldGd`,
`analyze.ts:stringArrayField`) now preserve `[]` distinct from
`undefined`. The columns are already typed arrays (DuckDB `TEXT[]`,
GraphDb `STRING[]`); the fix removes the `length > 0` coalescing. New
`medium-with-empty-keywords` parity fixture + a difference assertion
that proves `graphHash({keywords: []}) ≠ graphHash({})`. DuckDB binder
needed an explicit `LIST(VARCHAR)` type-hint to bind empty arrays —
caught and fixed alongside.
- **AC-C-3 SageMaker rebuild-on-switch refusal** — `embedder_model_id
TEXT` column added to `store_meta` (DuckDb) + StoreMeta NODE TABLE
(GraphDb) via append-only DDL + `ALTER TABLE IF NOT EXISTS` migration.
`Store.{getMeta,setMeta}` round-trip the field.
`assertEmbedderCompatible` lives in
`@opencodehub/embedder/fingerprint.ts`; cli `runQuery` exits 2 with the
frozen remediation hint, MCP `runQuery` returns a new
`EMBEDDER_MISMATCH` envelope, both honor `--force-backend-mismatch` /
`force_backend_mismatch`. graphHash invariant unaffected (store_meta is
not part of the hash). +5 fingerprint tests.
- **AC-C-4 openDefaultEmbedder factory consolidation** — new
`packages/embedder/src/factory.ts` exports `openDefaultEmbedder({
allowOnnxFallback?: boolean })`. Replaces the duplicated 6-line block at
`packages/cli/src/commands/query.ts:122-127` and
`packages/mcp/src/tools/query.ts:453-458`. Ingestion's fuller variant
(offline flag + ONNX variant + pool + canary) intentionally diverges
with a one-line comment pointing at the factory. +4 tests covering
HTTP-priority + ONNX-fallback + EmbedderNotSetupError + ONNX-failure
branches.
- **AC-C-5 SCIP REFERENCES + TYPE_OF emission** — `TYPE_OF` appended at
position 25 of `RelationType` union, `RELATION_TYPES` array,
`ALL_RELATION_TYPES` (DuckDb), and `RELATION_KINDS` (GraphDb) per the
append-only rule. `deriveEdges` widens to emit `REFERENCES` for non-call
non-DEF non-IMPORT occurrences whose enclosing scope is function-like.
New `emitRelations` sibling in `scip-index.ts` consumes
`derived.relations` and writes IMPLEMENTS + TYPE_OF graph edges via the
same `symbolDef`-resolved caller→callee join shape (`+1` boundary
translation per `scip-0-indexed-vs-graph-1-indexed.md`). Existing
`incremental-determinism.test.ts` is self-consistent (asserts cross-run
hash stability, not against a frozen golden) so no fixture file regen is
needed; the first SCIP re-index after merge produces the documented
one-time content delta. Large parity fixture auto-extends from 24 → 25
edge kinds via `getAllRelationTypes()`.
- **AC-C-6 four READMEs** —
`packages/{cli,mcp,ingestion,scanners}/README.md` (62-80 lines each)
following the `packages/policy/README.md` template (Surface / table /
Design). Root README cross-links updated. scanners README cites the
20-scanner P1+P2 breakdown post-Track-B.
- **AC-C-7 .gitmodules debt closed as stale** — file was removed when
`packages/gym` moved to `opencodehub-testbed` (commit 378f79f).
`.erpaval/debt.md` updated to status `CLOSED-STALE`.
### AC summary (Track C — 7 of 7)
| AC | What |
|---|---|
| C-1 | parse-cache LRU eviction (env-gated, default 1 GiB) |
| C-2 | stringArrayField round-trip symmetry ([] vs absent) |
| C-3 | embedder fingerprint refusal + EMBEDDER_MISMATCH envelope |
| C-4 | openDefaultEmbedder factory consolidation |
| C-5 | SCIP REFERENCES + TYPE_OF (position 25, append-only);
emitRelations |
| C-6 | 4 package READMEs + root README cross-links |
| C-7 | .gitmodules debt closed as stale |
### Validation
- **`mise run check` exits 0.**
- `pnpm -r exec tsc --noEmit` clean.
- `bash scripts/check-banned-strings.sh` PASS.
- 244/244 storage tests + 1 skip (lbug binding absent on dev box).
- 80/80 embedder tests (was 71; +9 new).
- 607/607 ingestion tests (parse-cache eviction +12 new).
- 58/58 scip-ingest tests; 73/73 core-types; 235/235 cli.
- graphHash byte-identity holds: cross-adapter parity green for
`medium-with-empty-keywords` and the 25-edge-kind sweep on the DuckDb
leg; GraphDb leg skip-clean as expected without `@ladybugdb/core`
binding on dev box.
### graphHash content delta (one-time)
Per ADR 0014 + spec W-A-2: the first SCIP re-index after this PR merges
produces additional REFERENCES + IMPLEMENTS + TYPE_OF edges. Expected,
documented as a v1.0 minor bump (schema-shape preserved via append-only;
only content changes). Existing OCH stores need `codehub analyze
--force` to pick up the new edges.
### Compound lesson extracted
`.erpaval/solutions/best-practices/no-spec-coordinate-leakage-into-source.md`
— ERPAVal `AC-*` / `M-*` / `W-*` / `CL-*` prefixes belong in commits, PR
bodies, and ADR `## References` sections, NOT in JSDoc, inline comments,
CLI flag help, MCP tool descriptions, or test names. The leakage
compounds because LLM clients pick up the vocabulary and start citing it
back. Sweep `rg -n "AC-[A-Z]-[0-9]" packages/` before every PR-open.
Track A's already-merged `AC-A-*` leakage is flagged for a separate
cleanup PR (out of scope for this Track C diff to keep the review
focused).
### Out of scope (queued for follow-on PRs)
- Track D — dogfood polish (semgrep.yml, osv.yml split,
och-self-scan.yml, code-pack release asset, lefthook polish, mise
och:self-* tasks)
- chore(repo): scrub Track-A `AC-A-*` spec coordinates from production
source (mechanical sweep, separate session)
🤖 Squashed via
[bonk-ai](https://github.com/theagenticguy/ai-gateway/blob/main/scripts/bot-push.py).
Co-authored-by: bonk-ai[bot] <269762587+bonk-ai[bot]@users.noreply.github.com>
Merged
theagenticguy
added a commit
that referenced
this pull request
May 12, 2026
🤖 Automated release via release-please --- <details><summary>analysis: 0.1.1</summary> ## [0.1.1](analysis-v0.1.0...analysis-v0.1.1) (2026-05-12) ### Features * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * consolidate repo-local dir references on META_DIR_NAME ([ce4b63d](ce4b63d)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.2.0 * @opencodehub/sarif bumped to 0.1.1 * @opencodehub/storage bumped to 0.1.1 </details> <details><summary>cli: 0.2.0</summary> ## [0.2.0](cli-v0.1.0...cli-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * artifact factory + codehub init + CI UX fixes ([#38](#38)) ([d6ffafa](d6ffafa)) * **cli:** add --granularity flag to analyze for hierarchical embeddings ([defa9b6](defa9b6)) * **cli:** add --strict-detectors flag + ts-morph optional dep ([329f5c3](329f5c3)) * **cli:** add exact-name resolver and disambiguation flags to context ([7f279a9](7f279a9)) * **cli:** flip query hybrid-by-default with --bm25-only + --rerank-top-k ([3e924b5](3e924b5)) * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * **ingestion:** WASM fallback via web-tree-sitter + --wasm-only flag ([cecb401](cecb401)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp,cli:** join symbol summaries into query results (P04 surface) ([3d73b65](3d73b65)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **scanners:** persist partialFingerprint, baselineState, suppressedJson ([fb4585d](fb4585d)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Bug Fixes * **cli:** accurate doctor native-binding + int8 weights checks ([fb569f9](fb569f9)) * **storage:** wire @ladybugdb/core binding, fix lbug open() guards, upgrade pnpm v10→v11 ([#93](#93)) ([78d6a85](78d6a85)) ### Performance * **embeddings:** cross-node batching + worker pool ([#33](#33)) ([acb59d0](acb59d0)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.1 * @opencodehub/core-types bumped to 0.2.0 * @opencodehub/embedder bumped to 0.1.1 * @opencodehub/ingestion bumped to 0.2.0 * @opencodehub/mcp bumped to 0.2.0 * @opencodehub/sarif bumped to 0.1.1 * @opencodehub/scanners bumped to 0.1.1 * @opencodehub/search bumped to 0.1.1 * @opencodehub/storage bumped to 0.1.1 </details> <details><summary>core-types: 0.2.0</summary> ## [0.2.0](core-types-v0.1.0...core-types-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * **core-types:** scaffold v1.1 node-shape extensions for planned packets ([e17a4b5](e17a4b5)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **storage:** populate reserved complexity, coverage, deadness columns ([c81e4c3](c81e4c3)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * **core-types:** centralize LanguageId in core-types ([4c33fc7](4c33fc7)) </details> <details><summary>embedder: 0.1.1</summary> ## [0.1.1](embedder-v0.1.0...embedder-v0.1.1) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** add SageMaker backend for remote embeddings ([9b5c53d](9b5c53d)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.2.0 </details> <details><summary>ingestion: 0.2.0</summary> ## [0.2.0](ingestion-v0.1.0...ingestion-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * **cli:** add --strict-detectors flag + ts-morph optional dep ([329f5c3](329f5c3)) * **embedder:** add SageMaker backend for remote embeddings ([9b5c53d](9b5c53d)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * **ingestion:** [@doc](https://github.com/doc) captures + description field populated ([d63dfa6](d63dfa6)) * **ingestion:** add receiver resolver + detector precision (P06) ([431f428](431f428)) * **ingestion:** add top-20 framework detection catalog and dispatcher ([02f4864](02f4864)) * **ingestion:** capture MCP tool inputSchema as canonical JSON ([9872710](9872710)) * **ingestion:** emit CodeElement stubs for external imports ([49eefe7](49eefe7)) * **ingestion:** emit file-level and community-level embeddings ([09a117f](09a117f)) * **ingestion:** FastAPI, Spring, NestJS, Rails route detectors ([62bebfb](62bebfb)) * **ingestion:** Go IMPLEMENTS method-set resolver + C++20 import ([85c60f9](85c60f9)) * **ingestion:** nested .gitignore with layered negation ([40b5286](40b5286)) * **ingestion:** populate DependencyNode license from manifest ([f947194](f947194)) * **ingestion:** provider-driven complexity + Halstead volume ([5e1379a](5e1379a)) * **ingestion:** soft-fail summarize on credential errors, thread summaryModel ([d90eb38](d90eb38)) * **ingestion:** WASM fallback via web-tree-sitter + --wasm-only flag ([cecb401](cecb401)) * **ingestion:** wire framework catalog into profile phase ([d491401](d491401)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Bug Fixes * **ingestion:** enumerate git submodule paths in the scan phase ([d290d04](d290d04)) * **ingestion:** skip submodule paths in the ownership blame pass ([e28f3e6](e28f3e6)) * **scip-ingest:** resolve caller/callee correctly for SCIP edges ([c15f928](c15f928)) ### Performance * **embeddings:** cross-node batching + worker pool ([#33](#33)) ([acb59d0](acb59d0)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * consolidate repo-local dir references on META_DIR_NAME ([ce4b63d](ce4b63d)) * **core-types:** centralize LanguageId in core-types ([4c33fc7](4c33fc7)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.1 * @opencodehub/core-types bumped to 0.2.0 * @opencodehub/embedder bumped to 0.1.1 * @opencodehub/storage bumped to 0.1.1 </details> <details><summary>mcp: 0.2.0</summary> ## [0.2.0](mcp-v0.1.0...mcp-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp,cli:** join symbol summaries into query results (P04 surface) ([3d73b65](3d73b65)) * **mcp:** short-circuit list_findings_delta via stored baselineState ([4d9c187](4d9c187)) * **mcp:** surface structured FrameworkDetection in project_profile tool ([15fb309](15fb309)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * **mcp:** consume shared tryOpenEmbedder + embeddingsPopulated from @opencodehub/search ([54f00de](54f00de)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.1 * @opencodehub/core-types bumped to 0.2.0 * @opencodehub/embedder bumped to 0.1.1 * @opencodehub/sarif bumped to 0.1.1 * @opencodehub/scanners bumped to 0.1.1 * @opencodehub/search bumped to 0.1.1 * @opencodehub/storage bumped to 0.1.1 </details> <details><summary>sarif: 0.1.1</summary> ## [0.1.1](sarif-v0.1.0...sarif-v0.1.1) (2026-05-12) ### Features * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) </details> <details><summary>scanners: 0.1.1</summary> ## [0.1.1](scanners-v0.1.0...scanners-v0.1.1) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/sarif bumped to 0.1.1 </details> <details><summary>search: 0.1.1</summary> ## [0.1.1](search-v0.1.0...search-v0.1.1) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * **search:** extract tryOpenEmbedder + embeddingsPopulated, demote NullEmbedder throw ([c4cc680](c4cc680)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.2.0 * @opencodehub/storage bumped to 0.1.1 </details> <details><summary>storage: 0.1.1</summary> ## [0.1.1](storage-v0.1.0...storage-v0.1.1) (2026-05-12) ### Features * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * **ingestion:** emit file-level and community-level embeddings ([09a117f](09a117f)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp:** short-circuit list_findings_delta via stored baselineState ([4d9c187](4d9c187)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * **storage:** add granularity column to embeddings for hierarchical retrieval ([b5bd5f8](b5bd5f8)) * **storage:** add summary fields to SearchResult and batch lookup helper ([4944a56](4944a56)) * **storage:** persist structured FrameworkDetection in frameworks_json ([75423fe](75423fe)) * **storage:** populate reserved complexity, coverage, deadness columns ([c81e4c3](c81e4c3)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Bug Fixes * **storage:** wire @ladybugdb/core binding, fix lbug open() guards, upgrade pnpm v10→v11 ([#93](#93)) ([78d6a85](78d6a85)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.2.0 </details> <details><summary>root: 0.2.0</summary> ## [0.2.0](root-v0.1.1...root-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * **release:** footers in the commit log. * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * artifact factory + codehub init + CI UX fixes ([#38](#38)) ([d6ffafa](d6ffafa)) * cleanups ([bf1536e](bf1536e)) * **cli:** add --granularity flag to analyze for hierarchical embeddings ([defa9b6](defa9b6)) * **cli:** add --strict-detectors flag + ts-morph optional dep ([329f5c3](329f5c3)) * **cli:** add exact-name resolver and disambiguation flags to context ([7f279a9](7f279a9)) * **cli:** flip query hybrid-by-default with --bm25-only + --rerank-top-k ([3e924b5](3e924b5)) * **core-types:** scaffold v1.1 node-shape extensions for planned packets ([e17a4b5](e17a4b5)) * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** add SageMaker backend for remote embeddings ([9b5c53d](9b5c53d)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * **gym:** add rust-spike trigger benchmark ([43c26d3](43c26d3)) * **ingestion:** [@doc](https://github.com/doc) captures + description field populated ([d63dfa6](d63dfa6)) * **ingestion:** add receiver resolver + detector precision (P06) ([431f428](431f428)) * **ingestion:** add top-20 framework detection catalog and dispatcher ([02f4864](02f4864)) * **ingestion:** capture MCP tool inputSchema as canonical JSON ([9872710](9872710)) * **ingestion:** emit CodeElement stubs for external imports ([49eefe7](49eefe7)) * **ingestion:** emit file-level and community-level embeddings ([09a117f](09a117f)) * **ingestion:** FastAPI, Spring, NestJS, Rails route detectors ([62bebfb](62bebfb)) * **ingestion:** Go IMPLEMENTS method-set resolver + C++20 import ([85c60f9](85c60f9)) * **ingestion:** nested .gitignore with layered negation ([40b5286](40b5286)) * **ingestion:** populate DependencyNode license from manifest ([f947194](f947194)) * **ingestion:** provider-driven complexity + Halstead volume ([5e1379a](5e1379a)) * **ingestion:** soft-fail summarize on credential errors, thread summaryModel ([d90eb38](d90eb38)) * **ingestion:** WASM fallback via web-tree-sitter + --wasm-only flag ([cecb401](cecb401)) * **ingestion:** wire framework catalog into profile phase ([d491401](d491401)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp,cli:** join symbol summaries into query results (P04 surface) ([3d73b65](3d73b65)) * **mcp:** short-circuit list_findings_delta via stored baselineState ([4d9c187](4d9c187)) * **mcp:** surface structured FrameworkDetection in project_profile tool ([15fb309](15fb309)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **scanners:** persist partialFingerprint, baselineState, suppressedJson ([fb4585d](fb4585d)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * **search:** extract tryOpenEmbedder + embeddingsPopulated, demote NullEmbedder throw ([c4cc680](c4cc680)) * **storage:** add granularity column to embeddings for hierarchical retrieval ([b5bd5f8](b5bd5f8)) * **storage:** add summary fields to SearchResult and batch lookup helper ([4944a56](4944a56)) * **storage:** persist structured FrameworkDetection in frameworks_json ([75423fe](75423fe)) * **storage:** populate reserved complexity, coverage, deadness columns ([c81e4c3](c81e4c3)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) * v1 finalize Track D — dogfood polish (6 ACs) ([#75](#75)) ([e9da048](e9da048)) ### Bug Fixes * **ci:** pin gopls@v0.18.1 for Go 1.23 + add pnpm build-script allowlist ([c78b31d](c78b31d)) * **cli:** accurate doctor native-binding + int8 weights checks ([fb569f9](fb569f9)) * **deps:** bump minimatch override to 9.0.7 (GHSA-23c5/-7r86) ([7f6e2ae](7f6e2ae)) * **deps:** pin brace-expansion/minimatch/picomatch to patched versions ([5a7d1e0](5a7d1e0)) * **deps:** refresh pnpm-lock.yaml with ts-morph optional dep from P06 ([0dfee11](0dfee11)) * **docs:** rename agents/*.md to .mdx so JSX components render ([#89](#89)) ([d2d8bc7](d2d8bc7)) * **gym:** update corpus test waiver ID to window.desktop after PR [#38](#38) rename ([933b5f2](933b5f2)) * **ingestion:** enumerate git submodule paths in the scan phase ([d290d04](d290d04)) * **ingestion:** skip submodule paths in the ownership blame pass ([e28f3e6](e28f3e6)) * **repo:** replace stale lsp-oracle tsconfig reference with scip-ingest ([0ce5e29](0ce5e29)) * **scip-ingest:** resolve caller/callee correctly for SCIP edges ([c15f928](c15f928)) * **storage:** wire @ladybugdb/core binding, fix lbug open() guards, upgrade pnpm v10→v11 ([#93](#93)) ([78d6a85](78d6a85)) ### Performance * **embeddings:** cross-node batching + worker pool ([#33](#33)) ([acb59d0](acb59d0)) ### Documentation * add SPECS, USECASE, and OBJECTIVES docs ([f3120de](f3120de)) * **adr:** record hierarchical embeddings decision (0004) ([6d28631](6d28631)) * **adr:** update 0002 with P09 Phase 1 measurements ([92b9a1c](92b9a1c)) * clean-slate v1 — drop migration prose, milestone framing, 0.x caveats ([#90](#90)) ([af88fbc](af88fbc)) * compound — durable lessons from docs site revival ([#88](#88)) ([95642f0](95642f0)) * compound — durable lessons from v1 upstream bug sweep ([#77](#77)) ([60eef57](60eef57)) * deep refresh + sync + new architecture pages ([3693ddd](3693ddd)) * **repo:** durable lesson — set NODE_ENV at script scope for astro in CI ([18c159b](18c159b)) * **repo:** durable lesson — stale tsconfig project references ([ea67d7a](ea67d7a)) * **repo:** EARS 006 spec — v1 finalize (M7 + constraint-10 + debt + dogfood) ([67198e3](67198e3)) * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) * restore Starlight site + refresh for v1 + agent-friendly USAGE section ([#87](#87)) ([d9b2b30](d9b2b30)) * **site:** add Astro Starlight docs site + GitHub Pages deploy ([#34](#34)) ([5ce0191](5ce0191)) * **site:** add llms.txt + Copy-as-Markdown + Open-in-ChatGPT/Claude ([#36](#36)) ([149ba4e](149ba4e)) * **site:** inject LLM-nav banner + 'See also' footer into every .md ([#37](#37)) ([77190a5](77190a5)) * strip legacy stanzas + capture session lessons ([85f6881](85f6881)) ### Refactoring * consolidate repo-local dir references on META_DIR_NAME ([ce4b63d](ce4b63d)) * **core-types:** centralize LanguageId in core-types ([4c33fc7](4c33fc7)) * **mcp:** consume shared tryOpenEmbedder + embeddingsPopulated from @opencodehub/search ([54f00de](54f00de)) * **plugin:** file-level packet skeletons for codehub-document ([40a09c8](40a09c8)) ### CI * **release:** keep 0.x semver — breaking changes bump minor, feats bump patch ([a6ee4bf](a6ee4bf)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Laith Al-Saadoon <alsaadoonlaith@gmail.com> Co-authored-by: Laith Al-Saadoon <9553966+theagenticguy@users.noreply.github.com>
Merged
theagenticguy
added a commit
that referenced
this pull request
May 12, 2026
🤖 Automated release via release-please --- <details><summary>analysis: 0.1.2</summary> ## [0.1.2](analysis-v0.1.1...analysis-v0.1.2) (2026-05-12) ### Features * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * consolidate repo-local dir references on META_DIR_NAME ([ce4b63d](ce4b63d)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/sarif bumped to 0.1.2 * @opencodehub/storage bumped to 0.1.2 * @opencodehub/wiki bumped to 0.1.1 </details> <details><summary>cli: 0.2.2</summary> ## [0.2.2](cli-v0.2.1...cli-v0.2.2) (2026-05-12) ### Bug Fixes * **repo:** track all 17 packages in release-please + republish pack/cobol-proleap on fixed ingestion ([f4656d5](f4656d5)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.2 * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/embedder bumped to 0.1.2 * @opencodehub/ingestion bumped to 0.3.1 * @opencodehub/mcp bumped to 0.3.0 * @opencodehub/pack bumped to 0.1.2 * @opencodehub/policy bumped to 0.1.1 * @opencodehub/sarif bumped to 0.1.2 * @opencodehub/scanners bumped to 0.1.2 * @opencodehub/search bumped to 0.1.2 * @opencodehub/storage bumped to 0.1.2 * @opencodehub/wiki bumped to 0.1.1 </details> <details><summary>cobol-proleap: 0.1.2</summary> ## [0.1.2](cobol-proleap-v0.1.1...cobol-proleap-v0.1.2) (2026-05-12) ### Bug Fixes * **repo:** track all 17 packages in release-please + republish pack/cobol-proleap on fixed ingestion ([f4656d5](f4656d5)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/ingestion bumped to 0.3.1 </details> <details><summary>core-types: 0.3.0</summary> ## [0.3.0](core-types-v0.2.0...core-types-v0.3.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * **core-types:** scaffold v1.1 node-shape extensions for planned packets ([e17a4b5](e17a4b5)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **storage:** populate reserved complexity, coverage, deadness columns ([c81e4c3](c81e4c3)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * **core-types:** centralize LanguageId in core-types ([4c33fc7](4c33fc7)) </details> <details><summary>embedder: 0.1.2</summary> ## [0.1.2](embedder-v0.1.1...embedder-v0.1.2) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** add SageMaker backend for remote embeddings ([9b5c53d](9b5c53d)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 </details> <details><summary>frameworks: 0.1.1</summary> ## [0.1.1](frameworks-v0.1.0...frameworks-v0.1.1) (2026-05-12) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 </details> <details><summary>ingestion: 0.3.1</summary> ## [0.3.1](ingestion-v0.3.0...ingestion-v0.3.1) (2026-05-12) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.2 * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/embedder bumped to 0.1.2 * @opencodehub/frameworks bumped to 0.1.1 * @opencodehub/scip-ingest bumped to 0.2.0 * @opencodehub/storage bumped to 0.1.2 * @opencodehub/summarizer bumped to 0.1.1 </details> <details><summary>mcp: 0.3.0</summary> ## [0.3.0](mcp-v0.2.0...mcp-v0.3.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp,cli:** join symbol summaries into query results (P04 surface) ([3d73b65](3d73b65)) * **mcp:** short-circuit list_findings_delta via stored baselineState ([4d9c187](4d9c187)) * **mcp:** surface structured FrameworkDetection in project_profile tool ([15fb309](15fb309)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * **mcp:** consume shared tryOpenEmbedder + embeddingsPopulated from @opencodehub/search ([54f00de](54f00de)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.2 * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/embedder bumped to 0.1.2 * @opencodehub/pack bumped to 0.1.2 * @opencodehub/sarif bumped to 0.1.2 * @opencodehub/scanners bumped to 0.1.2 * @opencodehub/search bumped to 0.1.2 * @opencodehub/storage bumped to 0.1.2 </details> <details><summary>pack: 0.1.2</summary> ## [0.1.2](pack-v0.1.1...pack-v0.1.2) (2026-05-12) ### Features * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) ### Bug Fixes * **repo:** track all 17 packages in release-please + republish pack/cobol-proleap on fixed ingestion ([f4656d5](f4656d5)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.2 * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/ingestion bumped to 0.3.1 * @opencodehub/sarif bumped to 0.1.2 * @opencodehub/storage bumped to 0.1.2 </details> <details><summary>policy: 0.1.1</summary> ## [0.1.1](policy-v0.1.0...policy-v0.1.1) (2026-05-12) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) </details> <details><summary>sarif: 0.1.2</summary> ## [0.1.2](sarif-v0.1.1...sarif-v0.1.2) (2026-05-12) ### Features * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) </details> <details><summary>scanners: 0.1.2</summary> ## [0.1.2](scanners-v0.1.1...scanners-v0.1.2) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/sarif bumped to 0.1.2 </details> <details><summary>scip-ingest: 0.2.0</summary> ## [0.2.0](scip-ingest-v0.1.0...scip-ingest-v0.2.0) (2026-05-12) ### ⚠ BREAKING CHANGES * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * replace LSP oracle with SCIP indexers (TS/Py/Go/Rust/Java) ([#32](#32)) ([1cceb24](1cceb24)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Bug Fixes * **scip-ingest:** resolve caller/callee correctly for SCIP edges ([c15f928](c15f928)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Refactoring * consolidate repo-local dir references on META_DIR_NAME ([ce4b63d](ce4b63d)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.1.2 * @opencodehub/core-types bumped to 0.3.0 </details> <details><summary>search: 0.1.2</summary> ## [0.1.2](search-v0.1.1...search-v0.1.2) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * **search:** extract tryOpenEmbedder + embeddingsPopulated, demote NullEmbedder throw ([c4cc680](c4cc680)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/storage bumped to 0.1.2 </details> <details><summary>storage: 0.1.2</summary> ## [0.1.2](storage-v0.1.1...storage-v0.1.2) (2026-05-12) ### Features * **embedder:** replace Arctic Embed XS with gte-modernbert-base ([#31](#31)) ([1214071](1214071)) * **ingestion:** emit file-level and community-level embeddings ([09a117f](09a117f)) * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) * **mcp:** short-circuit list_findings_delta via stored baselineState ([4d9c187](4d9c187)) * **search:** add filter-aware zoom retrieval across hierarchical tiers ([5ab80c4](5ab80c4)) * **storage:** add granularity column to embeddings for hierarchical retrieval ([b5bd5f8](b5bd5f8)) * **storage:** add summary fields to SearchResult and batch lookup helper ([4944a56](4944a56)) * **storage:** persist structured FrameworkDetection in frameworks_json ([75423fe](75423fe)) * **storage:** populate reserved complexity, coverage, deadness columns ([c81e4c3](c81e4c3)) * v1 finalize Track C — debt sweep (7 ACs) ([#73](#73)) ([06d2bb1](06d2bb1)) ### Bug Fixes * **storage:** wire @ladybugdb/core binding, fix lbug open() guards, upgrade pnpm v10→v11 ([#93](#93)) ([78d6a85](78d6a85)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 </details> <details><summary>summarizer: 0.1.1</summary> ## [0.1.1](summarizer-v0.1.0...summarizer-v0.1.1) (2026-05-12) ### Features * initial public release of opencodehub v0.1.1 ([3f23006](3f23006)) ### Documentation * deep refresh + sync + new architecture pages ([3693ddd](3693ddd)) * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) </details> <details><summary>wiki: 0.1.1</summary> ## [0.1.1](wiki-v0.1.0...wiki-v0.1.1) (2026-05-12) ### Features * detect-secrets as 20th scanner (Track B) ([#72](#72)) ([8fbdd61](8fbdd61)) * M7 LadybugDB default + IGraphStore abstraction hardening (Track A) ([#71](#71)) ([0175113](0175113)) ### Documentation * **repo:** pre-publish npm readiness — READMEs, GOVERNANCE, CODEOWNERS, package metadata ([dd10f72](dd10f72)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/core-types bumped to 0.3.0 * @opencodehub/storage bumped to 0.1.2 * @opencodehub/summarizer bumped to 0.1.1 </details> <details><summary>root: 0.3.1</summary> ## [0.3.1](root-v0.3.0...root-v0.3.1) (2026-05-12) ### Bug Fixes * **repo:** track all 17 packages in release-please + republish pack/cobol-proleap on fixed ingestion ([f4656d5](f4656d5)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Laith Al-Saadoon <alsaadoonlaith@gmail.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.
Track C — debt sweep (7 ACs)
Closes the debt-sweep leg of v1-finalize per
.erpaval/specs/006-v1-finalize/.Spec: spec.md§Track C.
ADR: 0014-scip-references-and-embedder-fingerprint.
PR-split: A → C → B → D ordering — this is leg 3 of 4.
What changes
evictIfOverCap(cacheDir, capBytes)lists shards, sorts mtime-asc, deletes oldest until ≤0.9×cap. Wired intowriteCacheEntrypost-write; gated onCODEHUB_PARSE_CACHE_MAX_BYTES(default 1 GiB; 0 disables). Eviction errors swallowed silently — cache failure is never fatal. JSDoc atcontent-cache.ts:133updated to point at the new helper. +12 tests.stringArrayOrNullwriter + 3 readers (duckdb-adapter.ts:setStringArrayField,graphdb-adapter.ts:setStringArrayFieldGd,analyze.ts:stringArrayField) now preserve[]distinct fromundefined. The columns are already typed arrays (DuckDBTEXT[], GraphDbSTRING[]); the fix removes thelength > 0coalescing. Newmedium-with-empty-keywordsparity fixture + a difference assertion that provesgraphHash({keywords: []}) ≠ graphHash({}). DuckDB binder needed an explicitLIST(VARCHAR)type-hint to bind empty arrays — caught and fixed alongside.embedder_model_id TEXTcolumn added tostore_meta(DuckDb) + StoreMeta NODE TABLE (GraphDb) via append-only DDL +ALTER TABLE IF NOT EXISTSmigration.Store.{getMeta,setMeta}round-trip the field.assertEmbedderCompatiblelives in@opencodehub/embedder/fingerprint.ts; clirunQueryexits 2 with the frozen remediation hint, MCPrunQueryreturns a newEMBEDDER_MISMATCHenvelope, both honor--force-backend-mismatch/force_backend_mismatch. graphHash invariant unaffected (store_meta is not part of the hash). +5 fingerprint tests.packages/embedder/src/factory.tsexportsopenDefaultEmbedder({ allowOnnxFallback?: boolean }). Replaces the duplicated 6-line block atpackages/cli/src/commands/query.ts:122-127andpackages/mcp/src/tools/query.ts:453-458. Ingestion's fuller variant (offline flag + ONNX variant + pool + canary) intentionally diverges with a one-line comment pointing at the factory. +4 tests covering HTTP-priority + ONNX-fallback + EmbedderNotSetupError + ONNX-failure branches.TYPE_OFappended at position 25 ofRelationTypeunion,RELATION_TYPESarray,ALL_RELATION_TYPES(DuckDb), andRELATION_KINDS(GraphDb) per the append-only rule.deriveEdgeswidens to emitREFERENCESfor non-call non-DEF non-IMPORT occurrences whose enclosing scope is function-like. NewemitRelationssibling inscip-index.tsconsumesderived.relationsand writes IMPLEMENTS + TYPE_OF graph edges via the samesymbolDef-resolved caller→callee join shape (+1boundary translation perscip-0-indexed-vs-graph-1-indexed.md). Existingincremental-determinism.test.tsis self-consistent (asserts cross-run hash stability, not against a frozen golden) so no fixture file regen is needed; the first SCIP re-index after merge produces the documented one-time content delta. Large parity fixture auto-extends from 24 → 25 edge kinds viagetAllRelationTypes().packages/{cli,mcp,ingestion,scanners}/README.md(62-80 lines each) following thepackages/policy/README.mdtemplate (Surface / table / Design). Root README cross-links updated. scanners README cites the 20-scanner P1+P2 breakdown post-Track-B.packages/gymmoved toopencodehub-testbed(commit 378f79f)..erpaval/debt.mdupdated to statusCLOSED-STALE.AC summary (Track C — 7 of 7)
Validation
mise run checkexits 0.pnpm -r exec tsc --noEmitclean.bash scripts/check-banned-strings.shPASS.medium-with-empty-keywordsand the 25-edge-kind sweep on the DuckDb leg; GraphDb leg skip-clean as expected without@ladybugdb/corebinding on dev box.graphHash content delta (one-time)
Per ADR 0014 + spec W-A-2: the first SCIP re-index after this PR merges produces additional REFERENCES + IMPLEMENTS + TYPE_OF edges. Expected, documented as a v1.0 minor bump (schema-shape preserved via append-only; only content changes). Existing OCH stores need
codehub analyze --forceto pick up the new edges.Compound lesson extracted
.erpaval/solutions/best-practices/no-spec-coordinate-leakage-into-source.md— ERPAValAC-*/M-*/W-*/CL-*prefixes belong in commits, PR bodies, and ADR## Referencessections, NOT in JSDoc, inline comments, CLI flag help, MCP tool descriptions, or test names. The leakage compounds because LLM clients pick up the vocabulary and start citing it back. Sweeprg -n "AC-[A-Z]-[0-9]" packages/before every PR-open. Track A's already-mergedAC-A-*leakage is flagged for a separate cleanup PR (out of scope for this Track C diff to keep the review focused).Out of scope (queued for follow-on PRs)
AC-A-*spec coordinates from production source (mechanical sweep, separate session)🤖 Squashed via bonk-ai.