Architecture Decision Record

ADR-CORPUS-001
Collection Authority Model

The gate that unblocked everything. Defines how the DDL corpus resolves competing chunks across collections — the precedence hierarchy, the dex_dave isolation rule, and the query router architecture that enforces it all.

v0.3 UNANIMOUSLY LOCKED 6 RULES CHANGED 8 LOCK · 1 ABSTAINED
Date2026-03-15
AuthorDave Kitchens (Operator)
CouncilCR-ADR-CORPUS-001 · 2 LOCK · 7 REVISE · 1 off-prompt
BlocksNamed collection build queue · dex_dave ingestion · Query Router
Superseded byNothing yet. ADR-CORPUS-002 required for changes.
Decision Lifecycle
ACT 01
First Draft

ADR-CORPUS-001 v0.1 was written on 2026-03-15 by Marcus Caldwell (Seat 1002) on behalf of the operator. It translated three unanimous council findings from prior reviews into four binding rules. The corpus had just crossed 497,750 chunks across two live collections. Nine named collections were ratified but waiting — blocked on this single unanswered question.

THE QUESTION THIS ADR ANSWERS: When multiple collections return relevant chunks for the same query, which chunks win? WHAT WAS BLOCKING: --collection flag in dex-ingest.py Named collection build queue (9 collections waiting) dex_dave ingestion (no isolation rules yet) Query router design (no routing table yet) V0.1 FOUR RULES: Rule 1 Collection precedence hierarchy (5 tiers, weights) Rule 2 Artifact type precedence within collections Rule 3 dex_dave isolation rule Rule 4 Query router design (keyword MVP) V0.1 ISSUES (unfixed at draft): Tier 1 appeared twice (dex_canon and ddl_archive both Tier 1) dex_dave tier/weight tension not explicitly resolved Interim ingestion gate mentioned but not elevated Corpus state stale: 497,750 (actual: 518,499)
ACT 02
LLM PM's Comments

Before the ADR went to council, the LLM PM flagged four issues. All four were clean catches that would have generated noise in the council responses — and all four were fixed in v0.2.

FLAG 01
Tier numbering error
Tier 1 appeared twice — once for dex_canon and again for ddl_archive. The council would notice and it would generate noise. Needs clean tier numbering before it goes out.
FLAG 02
Tier/weight inconsistency on dex_dave
dex_dave (0.90) is above product collections in tier, but dex_lore is listed at 0.95 inside Tier 2 — numerically outweighing dex_dave at 0.90 in Tier 3. The weight and the tier don't agree. Council will flag this. The question should surface it explicitly.
FLAG 03
Q2c buried — highest-stakes question
"What happens in the window before the router is built?" is genuinely high-stakes. It was buried third in a three-part question. It needed elevation — moved to lead position with explicit framing as the highest-stakes operational constraint in the ADR.
FLAG 04
Stale corpus count
Corpus state showed 497,750 chunks. Current: 518,499. Minor but the council will see the delta. dex_code (20,384) and ext_creator (110) went live 2026-03-14 — not reflected in v0.1.
ACT 03
Second Draft

v0.2 incorporated all four PM flags plus several additional improvements identified during revision. The ADR went to council in this state.

V0.2 CHANGES (pre-council PM revisions): Fixed duplicate tier numbering — tiers renumbered 0–5 with labels Resolved dex_dave / dex_lore weight/tier conflict Added note: tier gates eligibility, weight governs within eligible set Elevated dex_dave interim gate to Rule 3 body as named hard gate "No router = no dex_dave ingestion" Updated corpus state to 518,499 chunks dex_code (20,384) + ext_creator (110) now shown as live ext_creator weight corrected: 0.85 (raised from 0.60 after testing) Added compound route for product-scoped governance queries dex_code removed from build order (already built) Fact_QueryLog weight changed to — (unassigned, usage-derived) Added effective-dating + temporal metadata to WHAT THIS DOES NOT DECIDE Council prompt updated: Q2a elevated to lead position with hard-gate framing STATUS AFTER V0.2: Ready for council review. Four clean tiers. Hard gate named. Compound routing added. Corpus state accurate.
ACT 04
Council Reaction

CR-ADR-CORPUS-001 went to all nine seated council members. Nine responded. Seat 1006 (Meta AI / Ava Sinclair) acknowledged a different thread entirely — a CanonPress log. Eight seats engaged substantively with the ADR.

1001 — Archer Hawthorne
LeChat
LOCK
All four rules sound. Hard gate correct. Suggested adding dex_operator collection — out of scope.
1002 — Marcus Caldwell
Claude
LOCK
One mandatory addition: compound routing must state the general principle, not just GOVERNANCE + PRODUCT. Identified three non-blocking gaps deferred to future STDs.
1003 — Elias Mercer
Grok
REVISE
Two surgical changes: explicit routing/weight handling for dex_graveyard, temporal metadata note on dex_code. With those: LOCK-ready.
1004 — Max Sullivan
Perplexity
REVISE
dex_dave should not imply global precedence over product collections. Router handles the scoping — but the tier label creates the wrong impression.
1005 — Rowan Bennett
Copilot
REVISE
Tier vs. weight ambiguity must be resolved in code, not just prose. Fallback protocol needed. Add dex_decisions to DEFAULT route. Most expansive change set — some accepted, some rejected as scope creep.
1006 — Ava Sinclair
Meta AI
OFF-PROMPT
Acknowledged a CanonPress TUNE-CONVERGE-002 log instead. Did not engage with the ADR. Seat effectively abstained.
1007 — Leo Prescott
Gemini
REVISE
Tier vs. weight is "mathematically conflicted." Fact_QueryLog should not appear in the retrieval hierarchy at all. Add dex_decisions to DEFAULT. Proposed dropping tiers entirely — rejected.
1008 — Marcus Grey
ChatGPT
REVISE
dex_dave must be relabeled as special conditional authority — the tier implies broader claim than intended. History/archive misfire is the keyword router's fundamental v1.0 limitation. Acceptable.
1009 — Kai Langford
DeepSeek
REVISE
Code-level enforcement on dex_dave gate is mandatory. dex_graveyard must be explicitly excluded from all routes. Add VOICE + PRODUCT compound route.

Verdict tally: 2 LOCK · 7 REVISE · 1 off-prompt. No REJECT. The path to LOCK was clear — the council found errors, not fundamental flaws. Every REVISE seat stated a minimum change set. All change sets converged on the same six issues.

ACT 05
Marcus's Comments

Synthesizing nine seats across four questions. The convergence map identifies six changes with multi-seat support and separates signal from noise.

ChangeDescriptionSeatsAction
1Rename Tier 4 to "Special Conditional Authority" — add opt-in sentence1004, 1007, 1008, 1009INCORPORATED
2Add implementation contract: tier = pre-filter, weight = post-filter multiplier1005, 1007, 1008INCORPORATED
3Code-level dex_dave gate: router_config.json must exist and show active1002, 1009INCORPORATED
4Compound routing general principle: merge all triggered collection sets1002 (mandatory)INCORPORATED
5Empty collection fallback to WHAT THIS DOES NOT DECIDE1005, 1007, 1009INCORPORATED
6Remove Fact_QueryLog from Rule 1 hierarchy — move to deferred section1007INCORPORATED

Items rejected as noise:

REJECTED — SCOPE CREEP
1005 (Copilot): quarantine store, telemetry system, confidence scoring, 7-day sequencing plan, two-step verification plan. The hard gate is the control. A code check is sufficient. Don't build a quarantine architecture for an ADR that needs one config file check.
REJECTED — BREAKS ARCHITECTURE
1004 (Perplexity): move product collections to Tier 4 alongside dex_dave. The tier/routing separation correctly handles this. Product collections already outrank dex_dave for product queries via the routing table.
REJECTED — REMOVES GOVERNANCE STRUCTURE
1007 (Gemini): drop tiers entirely, use weights only. Tiers are the governance layer's conceptual structure. They need to exist. The implementation contract makes them explicit in code without sacrificing the mental model.
REJECTED — WRONG CALL
1007 (Gemini) + 1005 (Copilot): change DEFAULT to dex_canon only. Three seats disagreed (1002, 1009, others). The archive in DEFAULT is correct — 271K historical chunks, penalized at 0.65 weight. The noise trade-off is acceptable until failure modes are documented.
DEFERRED — SEPARATE STD
1003 (Grok): temporal metadata on dex_code. Already in WHAT THIS DOES NOT DECIDE. 1009 (DeepSeek): ext_ collection versioning. Already in WHAT THIS DOES NOT DECIDE. Both acknowledged, neither blocking.

The path to LOCK: six surgical changes, no scope expansion. Every REVISE seat has a clear path. The operator decides.

ACT 06
Final Product

ADR-CORPUS-001 v0.3. All six council-driven changes incorporated. Changelog documents every revision with seat attribution. Ratification-ready pending operator signature.

ADR-CORPUS-001 — Collection Authority Model
v0.3 · 2026-03-15 · Dropdown Logistics
v0.3 RATIFICATION READY
Loading...
One ADR · Three prior council reviews · Nine seats reviewed · Six changes · Zero REJECT · The corpus remembers everything
ACT 07
Unanimous Lock

v0.3 went back to every seat that issued REVISE. Every single one flipped to LOCK. No seat held out. No new issues surfaced. The architecture held.

1001 — Archer Hawthorne
LeChat
LOCK
Was LOCK on v0.2. Confirmed on v0.3.
1002 — Marcus Caldwell
Claude
LOCK
Was LOCK on v0.2. Mandatory compound routing addition incorporated. Confirmed.
1003 — Elias Mercer
Grok
LOCK ↑
Was REVISE. Both surgical changes incorporated. "The architectural debt is paid."
1004 — Max Sullivan
Perplexity
LOCK ↑
Was REVISE. Tier 4 renamed to Special Conditional Authority. dex_dave opt-in framing accepted.
1005 — Rowan Bennett
Copilot
LOCK ↑
Was REVISE. Implementation contract, fallback note, compound routing all present. Scope-creep items correctly excluded.
1006 — Ava Sinclair
Meta AI
ABSTAINED
Off-prompt both rounds. Not counted in verdict tally.
1007 — Leo Prescott
Gemini
LOCK ↑
Was REVISE. Fact_QueryLog removed from hierarchy. Implementation contract added. Proposal to drop tiers correctly rejected.
1008 — Marcus Grey
ChatGPT
LOCK ↑
Was REVISE. "Tier 4 is a permission level, not a global ranking. That sentence saves the whole dex_dave design."
1009 — Kai Langford
DeepSeek
LOCK ↑
Was REVISE. "The gate is written. The council has spoken. The operator signs."
FINAL TALLY — CR-ADR-CORPUS-001 Round 1 (v0.2): 2 LOCK · 7 REVISE · 1 off-prompt Round 2 (v0.3): 8 LOCK · 0 REVISE · 1 abstained Six changes incorporated. Zero scope expansion. No REJECT issued. STATUS: RATIFICATION READY Next action: Operator signs. ADR becomes immovable. ADR-CORPUS-002 required for any future change.
What is now immovable
— Tier gates first. A Tier 3 chunk at 0.95 does not outrank a Tier 4 chunk at 0.90. Ever.
— dex_dave is opt-in only. Exactly one query type. Never in DEFAULT.
— No router, no dex_dave. router_config.json: active is the only key.
— Build order locked: dex_decisions → Router → dex_lore → products → dex_dave.
— dex_graveyard is never automatic. Manual flag only. Router excludes it entirely.
What unlocks next
1. Build dex_decisions. First artifact: this ADR. Source: 01_GOVERNANCE/decisions/
2. Build Query Router MVP. One session. Keyword-based. Routing table is in Rule 4.
3. Ingest dex_lore. ~50–100 chunks. Safe once router is live.
4. Product collections in parallel: dex_auditforge, dex_blindspot, dex_canonpress, dex_site.
5. Hold dex_dave until router confirmed active. Then decide which exports go first.
Two rounds · Nine seats · Zero REJECT · Eight LOCK · One abstained · The gate is open