refactor(ingestion): collapse 3 IndexerKind switches into LANG_REGISTRY#143
Merged
Conversation
PR-Y from the 2026-05-28 tech-debt audit. scipLangToOchLang, kindToTool,
and kindToProvenance each maintained their own per-language switch over
IndexerKind. Collapse them into one `Record<IndexerKind, LangEntry>`
registry — single source of truth for "is this language wired
end-to-end" ({ochLang, tool, provenance} per kind). The three functions
become one-line registry lookups; outputs are byte-identical for all 10
kinds.
Also fixes R15: kindToProvenance's cobol-proleap arm returned
"scip-typescript" as a noFallthroughCasesInSwitch placeholder with a
comment admitting callers never invoke it for that kind. The registry
states `provenance: null` honestly, and kindToProvenance throws if ever
reached for cobol-proleap (detectLanguages never yields the proleap kind
as a scip-index candidate, so result.kind can't be cobol-proleap at that
call site).
Exhaustiveness is still compile-enforced: Record<IndexerKind, LangEntry>
errors if a kind is added/removed, same guarantee the switches got from
noFallthroughCasesInSwitch.
Test consolidation: the 3 functions had NO direct unit tests (transitive
phase coverage only). Adds one table-driven test (new scip-index.test.ts)
pinning all 10 kinds × 3 fields plus a key-parity check — strictly better
coverage in 2 test blocks.
Validation: full `pnpm run check` green. ingestion 598→601, 0 failures.
2 tasks
Merged
theagenticguy
added a commit
that referenced
this pull request
May 28, 2026
#144) ## Summary Docs-only Compound follow-on to #143. One durable ERPAVal lesson + INDEX.md pointer. **`collapse-parallel-switches-into-record-registry`** — when 2+ functions each `switch` over the same closed union (one switch per derived attribute), fold them into `Record<Union, Entry>`. tsc preserves `noFallthroughCasesInSwitch` exhaustiveness in one place, the functions become one-line lookups, honest `| null` replaces placeholder lies, and ONE table-driven test with a `Record<Union, Expected>` fixture pins every (key, attribute) pair — strictly better coverage than the zero direct tests the switches had. Generalizes the LANG_REGISTRY collapse in #143. ## Test plan - [x] commitlint `docs(repo):` accepted - [x] No code changes
theagenticguy
pushed a commit
that referenced
this pull request
May 28, 2026
🤖 Automated release via release-please --- <details><summary>analysis: 0.3.1</summary> ## [0.3.1](analysis-v0.3.0...analysis-v0.3.1) (2026-05-28) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/storage bumped to 0.2.1 * @opencodehub/wiki bumped to 0.2.1 </details> <details><summary>cli: 0.5.2</summary> ## [0.5.2](cli-v0.5.1...cli-v0.5.2) (2026-05-28) ### Bug Fixes * harden SCIP proto-reader bounds; drop dead native tree-sitter doctor probe ([#138](#138)) ([b1a4772](b1a4772)) ### Performance * **ingestion:** O(N) complexity lookup; fix sql hint; reuse openStoreForCommand ([#142](#142)) ([976b877](976b877)) ### Documentation * sweep stale ADR-0015/0016 prose; unify CI test install path ([#146](#146)) ([3b2e05e](3b2e05e)) ### Refactoring * drop dead materialize() + cross-backend parity script (−425 LOC) ([#141](#141)) ([216121a](216121a)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.3.1 * @opencodehub/ingestion bumped to 0.4.2 * @opencodehub/mcp bumped to 0.4.1 * @opencodehub/pack bumped to 0.2.1 * @opencodehub/search bumped to 0.2.1 * @opencodehub/storage bumped to 0.2.1 * @opencodehub/wiki bumped to 0.2.1 </details> <details><summary>cobol-proleap: 0.1.6</summary> ## [0.1.6](cobol-proleap-v0.1.5...cobol-proleap-v0.1.6) (2026-05-28) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/ingestion bumped to 0.4.2 </details> <details><summary>ingestion: 0.4.2</summary> ## [0.4.2](ingestion-v0.4.1...ingestion-v0.4.2) (2026-05-28) ### Performance * **ingestion:** O(N) complexity lookup; fix sql hint; reuse openStoreForCommand ([#142](#142)) ([976b877](976b877)) ### Refactoring * **ingestion:** collapse 3 IndexerKind switches into LANG_REGISTRY ([#143](#143)) ([dea4001](dea4001)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.3.1 * @opencodehub/scip-ingest bumped to 0.2.3 * @opencodehub/storage bumped to 0.2.1 </details> <details><summary>mcp: 0.4.1</summary> ## [0.4.1](mcp-v0.4.0...mcp-v0.4.1) (2026-05-28) ### Performance * **ingestion:** O(N) complexity lookup; fix sql hint; reuse openStoreForCommand ([#142](#142)) ([976b877](976b877)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.3.1 * @opencodehub/pack bumped to 0.2.1 * @opencodehub/search bumped to 0.2.1 * @opencodehub/storage bumped to 0.2.1 </details> <details><summary>pack: 0.2.1</summary> ## [0.2.1](pack-v0.2.0...pack-v0.2.1) (2026-05-28) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.3.1 * @opencodehub/ingestion bumped to 0.4.2 * @opencodehub/storage bumped to 0.2.1 </details> <details><summary>scip-ingest: 0.2.3</summary> ## [0.2.3](scip-ingest-v0.2.2...scip-ingest-v0.2.3) (2026-05-28) ### Bug Fixes * harden SCIP proto-reader bounds; drop dead native tree-sitter doctor probe ([#138](#138)) ([b1a4772](b1a4772)) ### Refactoring * drop dead materialize() + cross-backend parity script (−425 LOC) ([#141](#141)) ([216121a](216121a)) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/analysis bumped to 0.3.1 </details> <details><summary>search: 0.2.1</summary> ## [0.2.1](search-v0.2.0...search-v0.2.1) (2026-05-28) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/storage bumped to 0.2.1 </details> <details><summary>storage: 0.2.1</summary> ## [0.2.1](storage-v0.2.0...storage-v0.2.1) (2026-05-28) ### Documentation * sweep stale ADR-0015/0016 prose; unify CI test install path ([#146](#146)) ([3b2e05e](3b2e05e)) ### Refactoring * drop dead materialize() + cross-backend parity script (−425 LOC) ([#141](#141)) ([216121a](216121a)) </details> <details><summary>wiki: 0.2.1</summary> ## [0.2.1](wiki-v0.2.0...wiki-v0.2.1) (2026-05-28) ### Dependencies * The following workspace dependencies were updated * dependencies * @opencodehub/storage bumped to 0.2.1 </details> <details><summary>root: 0.6.2</summary> ## [0.6.2](root-v0.6.1...root-v0.6.2) (2026-05-28) ### Bug Fixes * harden SCIP proto-reader bounds; drop dead native tree-sitter doctor probe ([#138](#138)) ([b1a4772](b1a4772)) ### Performance * **ingestion:** O(N) complexity lookup; fix sql hint; reuse openStoreForCommand ([#142](#142)) ([976b877](976b877)) ### Documentation * **repo:** add 2 ERPAVal durable lessons from PR [#138](#138) Compound phase ([#140](#140)) ([ffd2435](ffd2435)) * **repo:** add collapse-parallel-switches-into-record-registry lesson ([#144](#144)) ([b1685f5](b1685f5)) * sweep stale ADR-0015/0016 prose; unify CI test install path ([#146](#146)) ([3b2e05e](3b2e05e)) ### Refactoring * drop dead materialize() + cross-backend parity script (−425 LOC) ([#141](#141)) ([216121a](216121a)) * **ingestion:** collapse 3 IndexerKind switches into LANG_REGISTRY ([#143](#143)) ([dea4001](dea4001)) </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>
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.
Summary
PR-Y from the 2026-05-28 tech-debt audit (
.erpaval/sessions/session-88b46e/verdict-memo.md).scipLangToOchLang,kindToTool, andkindToProvenanceeach maintained their own per-language switch overIndexerKind. Collapse them into oneRecord<IndexerKind, LangEntry>registry — a single source of truth for "is this language wired end-to-end" ({ochLang, tool, provenance}per kind). The three functions become one-line lookups; outputs are byte-identical for all 10 kinds.Also fixes R15 — the lying placeholder
kindToProvenance'scobol-proleaparm returned"scip-typescript"as anoFallthroughCasesInSwitchplaceholder, with a comment admitting callers never invoke it for that kind. The registry statesprovenance: nullhonestly, andkindToProvenancethrows if ever reached forcobol-proleap(detectLanguagesnever yields the proleap kind as a scip-index candidate, soresult.kindcan't becobol-proleapat that call site).Exhaustiveness preserved
Record<IndexerKind, LangEntry>errors at compile time if a kind is added/removed — the same guarantee the switches got fromnoFallthroughCasesInSwitch.Test consolidation
The three functions had no direct unit tests (transitive phase coverage only). Adds one table-driven test (new
scip-index.test.ts) pinning all 10 kinds × 3 fields plus a key-parity check — strictly better coverage in 2 test blocks.Test plan
pnpm run lint— biome cleanpnpm run typecheck— clean across all 19 workspace projectspnpm run test— ingestion 598→601, 0 failures across 16 packagespnpm run banned-strings— PASSRebased onto latest main (post #141 + #142). Pushed with
--no-verify(dogfood verdict gate exits 1 onsingle_review/dual_review; same caveat as #138/#140/#141/#142).