blue/.blue/dialogues/2026-02-06T1839Z-rfc-0058-supersession-hybrid-relational-dynamodb-architecture/verdict.md
Eric Garcia 6e8f0db6c0 chore: add dialogues, RFCs, docs and minor improvements
- Add dialogue prompt file writing for audit/debugging
- Update README install instructions
- Add new RFCs (0053, 0055-0059, 0062)
- Add recorded dialogues and expert pools
- Add ADR 0018 dynamodb-portable-schema
- Update TODO with hook configuration notes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-26 08:51:56 -05:00

148 lines
16 KiB
Markdown

# Final Verdict — RFC 0058 Supersession Dialogue
## 100% CONVERGENCE ACHIEVED
```
Final Dialogue Summary
┌───────────────────────┬──────────────────────────────┐
│ Metric │ Value │
├───────────────────────┼──────────────────────────────┤
│ Rounds │ 4 (R0-R3) │
├───────────────────────┼──────────────────────────────┤
│ Total ALIGNMENT │ 415 │
│ (W:135 C:104 T:92 R:84) │
├───────────────────────┼──────────────────────────────┤
│ Experts Consulted │ 12 unique │
├───────────────────────┼──────────────────────────────┤
│ Tensions Resolved │ 17/17 │
├───────────────────────┼──────────────────────────────┤
│ Final Velocity │ 0 │
└───────────────────────┴──────────────────────────────┘
```
## Answer to the Question
**Should RFC 0058 (Encrypted DynamoDB Storage) be superseded by a hybrid architecture that uses a scalable relational database alongside DynamoDB?**
### NO.
RFC 0058 should NOT be superseded by a hybrid architecture. Instead, the implementation sequence should be amended to build the trait boundary (RFC 0053) first, define a portable encryption envelope second, and implement DynamoDB behind the stable trait third.
## Converged Decisions
```
┌────────────────────────────┬──────────────────────────────────────────────────────────┐
│ Topic │ Decision │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Hybrid architecture │ REJECTED — unanimous across all 12 experts │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Implementation sequence │ Three-phase gate: Trait → Envelope → DynamoDB │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Trait governance │ ADR + PartitionScoped marker trait + AnalyticsStore split │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Trait shape │ Domain access patterns (partition-scoped CRUD) │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Verdict denormalization │ ELIMINATED — in-memory assembly from full-partition load │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Encryption portability │ Canonical entity address AAD: dialogue:{id}/entity:{t}/{s} │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Graph assembly │ Shared library above trait, not a trait method │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Refs table design │ Deferred to Phase C (both designs equivalent under │
│ │ full-partition-load + in-memory assembly) │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Cross-partition queries │ Separate AnalyticsStore trait (optional per backend) │
├────────────────────────────┼──────────────────────────────────────────────────────────┤
│ Hash chain boundary │ Phase C migration protocol detail, not a blocker │
└────────────────────────────┴──────────────────────────────────────────────────────────┘
```
## Three-Phase Implementation Sequence
### Phase A — Build the Trait Boundary (RFC 0053)
- Extract `DialogueStore` trait from 32 existing `&Connection` functions
- Implement `SqliteDialogueStore` as reference implementation
- Convert all `dialogue.rs` handler call sites
- Strip verdict denormalization arrays from domain model
- **Exit gate:** Zero bare `pub fn ...(conn: &Connection)` signatures in `alignment_db.rs`
- **Governance:** `PartitionScoped` marker trait on return types; methods that violate partition scope go to `AnalyticsStore`
### Phase B — Define Portable Encryption Envelope
- AAD = `sha256(canonical_entity_address)` where canonical address = `dialogue:{id}/entity:{type}/{subkey}`
- Backend-independent by construction — same string regardless of physical key structure
- **Exit gate:** Envelope spec passes round-trip test across both SQLite and DynamoDB backends
- **Critical:** Must ship before first encrypted write
### Phase C — Implement DynamoDB Behind the Trait (RFC 0058)
- `DynamoDialogueStore` implements the stable `DialogueStore` trait
- Full-partition load + in-memory graph assembly (no verdict denormalization)
- Refs table design resolved empirically (inline vs cleartext items)
- Hash chain boundary event specified in migration protocol
- DynamoDB Local integration tests pass the same generic test suite as SQLite
- **Exit gate:** Dual-implementation CI passes
## Resolved Tensions
```
┌──────────────────────┬───────────────────────────────────────────────────────────────┐
│ ID │ Resolution │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ MUFFIN-T01 (R0) │ Evolved → eliminated: denormalized arrays removed entirely │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ SCONE-T01 (R0) │ Narrowed: only refs table is genuine mismatch │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ STRUDEL-T01 (R0) │ Narrowed → resolved: refs-only redesign, Phase C detail │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ ECLAIR-T01 (R0) │ Narrowed: parity is code-path, not DynamoDB-specific │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ CROISSANT-T01 (R0) │ Refined → resolved: ADR + PartitionScoped marker trait │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ BRIOCHE-T01 (R0) │ Resolved: YAGNI — analytics is speculative │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ CANNOLI-T01 (R0) │ Resolved: serverless is implicit baseline │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ MACARON-T01 (R0) │ Resolved: trait's single-active-backend = rollback plan │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ CUPCAKE-T01 (R0) │ Resolved: AnalyticsStore trait for cross-partition queries │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ DONUT-T01 (R0) │ Resolved: cost is negligible at current scale │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ CROISSANT R1-T01 │ Resolved: ADR + PartitionScoped + dual-impl CI │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ STRUDEL R1-T01 │ Resolved: trait shaped by domain, workarounds behind impl │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ MUFFIN R1-T01 │ Resolved: verdicts immutable, denormalization eliminated │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ ECLAIR R1-T01 │ Resolved: denormalized fields redundant, removed │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ MACARON R1-T01 │ Resolved: cost negligible, denormalization eliminated │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ TARTLET R1-T01 │ Resolved: canonical entity address AAD in Phase B │
├──────────────────────┼───────────────────────────────────────────────────────────────┤
│ GALETTE R1-T01 │ Resolved: trait-first sequencing adopted │
└──────────────────────┴───────────────────────────────────────────────────────────────┘
```
## Key Insights (by contribution)
1. **Strudel** (R0): "The schema is the problem, not the storage engine" — reframed the entire debate away from DynamoDB-vs-PostgreSQL
2. **Croissant** (R0-R2): Trait abstraction as resolution mechanism → ADR + PartitionScoped marker → 91% of functions already comply
3. **Galette** (R1): Prerequisite inversion — the trait doesn't exist in code yet; building it IS the design decision
4. **Cannoli** (R1-R2): Full-partition load + in-memory assembly eliminates denormalization entirely
5. **Tartlet** (R1-R2): Canonical entity address for AAD portability — one-line spec, prevents re-encryption catastrophe
6. **Muffin** (R2): Self-corrected on verdict consistency — verdicts are immutable snapshots, not live views
7. **Strudel** (R1): Narrowed from "redesign everything" to "redesign only the refs table"
## What This Means for RFC 0058
RFC 0058 is **NOT superseded**. It proceeds with three amendments:
1. **Sequencing**: Build RFC 0053's trait boundary first (Phase A), then encryption envelope (Phase B), then DynamoDB implementation (Phase C)
2. **Schema**: Eliminate verdict denormalization arrays; use full-partition load + in-memory assembly instead
3. **Encryption**: Use canonical entity address `dialogue:{id}/entity:{type}/{subkey}` for AAD binding, not DynamoDB pk||sk
---
All 6 experts signaled [MOVE:CONVERGE]. Velocity = 0. 17/17 tensions resolved.
🧁🧁🧁💙🧁🧁🧁