Pattern

ORA-2026-0045

code-qualitycodebase-vocabularynamingcambershape-nouns

Pattern

The camber codebase has grown faster than its naming vocabulary. Across 15 independent code-slice scans, cohorts of interchangeable files/tables/types consistently exist without collective shape-names, OR wear mechanism-suffix names (-runner, -assembler, -executor) that hide their shape. A small set of cross-discipline nouns — ledger, docket, bench, dossier — independently surfaced as the right answer across unrelated slices, indicating the codebase has reinvented records-management vocabulary without the words.

Evidence — cross-slice convergence

Four nouns, each independently proposed by ≥3 of 15 slices scanned:

NounSlicesWhat it namesWhere it wants to land
ledger5, 11, 12, 14Append-only, idempotent, bitemporal record w/ supersede semanticsbelief_claims, journal-*, lineage.ts, world_model facts
docket2, 9, 11, 13Ordered queue of items each receiving a typed verdictevent_audit, review desk, iOS TriageAction
bench / harness1, 2, 10, 15Fixture holding SUT still while inputs replay + outputs compare to baselinereviewer cohort, scripts/_harness/_probe/*_runner, shadow-replay + audit-regress-runner
dossier7, 13One data spine + multiple render lensesmorning-manifest-{ui,site,d3} + morning-brief

Evidence — HIGH-leverage single renames (top 10)

#Current → ProposedPathWhy HIGH
1ai-routerattribution-judgesupabase/functions/ai-router/Not a router. LLM-as-judge with 10 *_guardrail.ts siblings. Name collides with chat-proxy (the real router).
2belief_claims cohort → belief_ledgermigrations/20260118200410_gate1_belief_ledger_schema.sqlMigration filename commits to "ledger"; zero tables carry it. Classic drift diagnostic.
3event_auditgate_docketmigrations/…event_audit*11 ALTERs fighting gate_status/triage_action constraints = schema rejecting the "audit" name.
4plugin_configs/plugin_manifests/_shared/plugin_configs/Files literally end in *_plugin_contract.json, frozen at build time. Directory name lies.
5plugin_schedule.ts + plugin_scheduler_registration.tscron_plan.ts + cron_mount.ts_shared/Plan→mount is the systemd/k8s lifecycle. Current pair names the noun twice, not the seam.
6morning-manifest-{ui,site,d3} + morning-briefdossier/{data,table,charts,scroll}supabase/functions/morning-*One spine + three renderers masquerading as 4 peers.
7gt-applyoracle-applysupabase/functions/gt-apply/Cryptic stub. Actual contract: sole human-authoritative write-path into attribution.
8striking-detect + chain-detectperception/supabase/functions/striking-detect header literally reads "separate perception channel alongside attribution." Word already in code.
9scripts/*_{harness,probe,runner}.shscripts/benches/scripts/ (140 flat files)Three mechanism words for one shape.
10iOS *Entry + ThreadItemBeat + Timelineios/CamberRedline/Models/Heterogeneous ordered events on a spine = beats on a timeline.

Evidence — anti-patterns (names that actively lie)

Higher-priority than "missed opportunities" — lying names mislead future readers, missing names only slow them:

  • ai-router claims to route; routes nothing.
  • *gmail-** implies cohort; members are unrelated (30d cache vs. calibration harness vs. 14-file orchestrator).
  • triage-telemetry does no triage; it's a 5-event metrics sink.
  • morning-digestmorning-briefmorning-manifest-*, but the names imply peerhood.
  • plugin_configs/ contains manifests, not configs; code calls them "contracts" everywhere.

Evidence — MEDIUM-leverage renames worth preserving

  • financial_project_cost_{config,registry}rubric + rubric_shelf (files contain judgment, not settings)
  • financial_cost_code_prefillcost_code_cascade (pattern will recur at every rules-first-then-LLM joint)
  • id_guard + junk_call_prefilter_shared/intake_sieve/ (identical shape, unrelated names)
  • time_resolvertime_oracle (returns graded confidence + evidence, not deterministic resolution)
  • edge_secret_contractedge_secret_warden (load-bearing authz, not a bare contract)
  • iOS *Card views → Tile component (6+ views share a copy-pasted 5-line token preamble)
  • *_proof_packet_v0.md → split by shape: {attestation, receipt, spec, runbook}

Root cause

Three compounding factors:

1. Growth pace outran vocabulary pace. New edge functions and tables land faster than naming-review cycles. Cohorts accrete before the second member reveals the shape. 2. Mechanism names feel safe. -runner and -executor describe behavior objectively; shape names feel opinionated. Reviewers accept scheduler-backfill but would push back on backfill-warden. This asymmetry favors drift. 3. Discipline-borrowed nouns live in commit messages and doc bodies, not in artifacts. The team already talks in ledger/docket/bench vocabulary — the migration filename gate1_belief_ledger_schema.sql is proof — but the artifacts themselves inherit older generic names.

Why this matters

A codebase's vocabulary is its cognitive operating system. When a seat new to a cohort sees attribution_classifiers/, they know to grep for the next sibling and run the whole bench head-to-head. When they see utils/ or *-runner, they have no such affordance. At fleet scale (20+ seats, many Opus-class but operating on compressed context), the delta between "name carries contract" and "name hides contract" translates directly into throughput, ticket quality, and how much rework each new contribution creates.

The "classifier zoo" coinage is the positive proof: the word propagated across 20+ seats within hours of being introduced, and downstream tickets immediately used it correctly without a doctrine to reference. The name did the work.

This catalog is the negative proof: 15 independent Opus subs, scanning disjoint slices, converged on the same four nouns as missing. The vocabulary gap is real, pervasive, and addressable with small-surface renames.

How to use this catalog

  • Do NOT treat this as a single "rename everything" ticket. Per ORA-2026-0021, each rename lands as a separate ticket with its own blast-radius analysis.
  • DO use the HIGH table above as a priority stack — anti-patterns first, schema-intrinsic names (rows 2, 3) before code-only names (rows 1, 4-10).
  • DO reference this pattern (ORA-2026-0045) in any new rename ticket so the rationale is traceable and the fleet can see the family.
  • DO re-run the scan in 3-6 months (15 Opus subs, same slicing) to see whether the vocabulary has caught up and whether new cohorts have accreted without names.

Meta

Scan mechanics: 15 Opus sub-agents dispatched in parallel 2026-04-24T18:00–18:15Z. Each received a prompt anchored on the "classifier zoo" story plus a non-overlapping code slice. Aggregate cost ≈ $18 (est. ~$1.20/sub at Opus-4.7 rates for ~5-min reasoning). Zero of 15 slices returned ZERO FINDINGS. Output token discipline held (each sub capped at ~400 words dense). Full raw returns are in FLEET_FEED not this artifact — this catalog is the synthesis, not the transcripts.