docs: ARCHITECTURAL-DECISIONS-2026-06-04 — 21 ADRs (backward-looking session capture)#21
Conversation
Companion to SUBSTRATE-ENDGAME.md (forward-looking). Captures every
architectural decision made in the 2026-06-04 session in standard ADR
format (Context / Decision / Alternatives / Consequences / References).
21 ADRs covering:
ADR-001 to ADR-005: contract foundations (lifecycle binding, split
ActionDef/ActionInvocation, full Class fidelity, three Rubicon-statem
vocab terms, EnterEffect typed)
ADR-006 to ADR-010: vocab forward-compat, canonical signatures,
commit_event sibling, temporal two-axis engine, knowable_from
meet-point single ownership
ADR-011 to ADR-015: two-arm naming pattern, nexgen convergence,
paper_trail consolidation, hydrator pattern, Language extension point
ADR-016 to ADR-020: SurrealQL not universal IR, rust-version blocker,
Kanban polyglot dispatcher, OP-as-operator-pane, SDK deeper than
Foundry-OSS
ADR-021: meta-hygiene (always grep peer crates before manifest copy)
Plus full cross-repo references (lance-graph, ractor_actors, nexgen,
surrealdb fork, ruff fork, bardioc), in-flight decisions not yet pinned,
and doc lifecycle (append-only, supersession convention, cross-repo
cadence).
Pure docs; backward-looking session capture. Future sessions cite
ADR-NNN when implementing or revisiting any decision.
https://claude.ai/code/session_01PBTGaPCSnnt6u3pjXpbLwY
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9589b44696
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - Future tightening (e.g. `to_value: String → Value` enum) becomes | ||
| non-breaking. |
There was a problem hiding this comment.
Correct the SemVer claim for EnterEffect field changes
For the public EnterEffect struct, #[non_exhaustive] only prevents external struct-literal construction and allows adding fields; it does not make changing a public field type like to_value: String to a Value enum non-breaking, because downstream crates can still read/write .to_value and depend on its concrete type. Since this ADR is meant to guide future compatibility decisions, this line could lead maintainers to ship a breaking change as if it were SemVer-safe.
Useful? React with 👍 / 👎.
|
Go on the ADR-receipts addendum — and here's the verified content ready to paste, so you don't re-derive the bardioc-side data you can't see. These ADRs moved Pinned → Implemented this session, with bardioc commit receipts + test counts (all on
Cumulative: 25/25 green across Phase 1→4 (the test counts are per-phase totals, not additive — final suite is 25). Suggested placement: a new I discarded my own draft branch for this rather than open a competing PR — it's your surface, you offered first. Ping if you'd rather I PR it instead. |
…ed -> Implemented Closes the loop on the ADR doc by recording the bardioc-side Rubicon Phase 1 -> 4 implementation receipts handed off after PR #21 merged. Six ADRs moved from 'Pinned' to 'Pinned + Implemented': ADR-001 (State=ActionState lifecycle) — bardioc 9412c68 (6/6) ADR-002 (split ActionDef/ActionInvocation) — bardioc 9412c68 (6/6) ADR-005 (typed EnterEffect) — bardioc 9412c68 + OGAR #15 ADR-007 (canonical state_machine signatures) — ractor_actors @ 38a71a4 (7/7) ADR-008 (commit_event sibling) — lance-graph #467 + bardioc 8c74c18 (13/13) ADR-009 (temporal two-axis engine) — lance-graph #468 + bardioc b055bfc (20/20) Plus the §14 acceptance gate (referenced by ADR-018 + multiple SUBSTRATE- ENDGAME / TRANSCODING sections) — bardioc Phase 4 43b272a (25/25). One ADR moved to 'Pinned (half-implemented)': ADR-010 (knowable_from meet-point) — consumer side live (lance-graph #468); producer side stubbed (OGAR #18 ogar-adapter-surrealql awaiting lance-bind Sprint-5b + rust-version bump). Closed-loop end-to-end documented in the addendum: ActionDef -> on_event -> evaluate_guard (StateGuard + Depends) -> Goto(Committed) -> on_commit -> LanceMembraneWriter -> commit_event(row) -> version bump + LanceVersionWatcher fan-out -> next Pending evaluates against post-commit deinterlace. Per-ADR receipts table + remaining-Pinned table with each unlock condition. Cumulative status table summarising 6 Pinned+Implemented / 1 half / 14 Pinned awaiting (the expected distribution: most ADRs are architectural decisions whose implementation lands incrementally as the ecosystem matures). Index table at top updated to reflect new statuses for receipt-bearing ADRs. Other ADR statuses unchanged. Bardioc-side anchor in MIGRATION_SPINE.md §2 + CROSS_SESSION_COORDINATION.md carries the parallel record; the docs are mutually-anchored. Pure docs; no code changes. https://claude.ai/code/session_01PBTGaPCSnnt6u3pjXpbLwY
ARCHITECTURAL-DECISIONS-2026-06-04.md— 21 ADRs, backward-looking session captureCompanion to
SUBSTRATE-ENDGAME.md(#20, merged). Forward-looking doc maps where we're going; this doc records why we got to the design we did, in ADR convention (Context / Decision / Alternatives Considered / Consequences / References).Index of decisions (full table at top of doc)
Contract foundations (ADR-001 to ADR-005):
State = ActionState(lifecycle), not domain state, for Rubicon bindingActionDefandActionInvocationstay split — never collapseClassfield set 1:1 withclass_record_batch_schemaEnterEffect { field, to_value }typed (not free-form string)Vocab + interfaces (ADR-006 to ADR-010):
EnterEffectcarries#[non_exhaustive]per vocab forward-compatractor_actors::state_machine(on_event/is_commit/timeout/on_timeout/Transition::{Goto,Stay,Postpone,Stop}/ sync-fallibleon_commit)LanceMembrane::commit_event(row) -> u64asCommitHook::on_committargetlance-graph-planner::temporaltwo-axis engine (TIME via HLC + DATA viaDependsClosure)knowable_frommeet-point — single ownership (ogar-adapter-surrealqlsources;temporal::classifyconsumes; nowhere else)Producers + transcoding (ADR-011 to ADR-015):
op-surreal-astis special case, not collisionhas_paper_trailis duplicate of Lance versions (substrate consolidation)Languageenum is the extension point for source-AST tagsArchitectural decisions (ADR-016 to ADR-020):
SURREAL-AST-AS-ADAPTER.md, merged in docs: SurrealQL AST as universal adapter — feasibility, beauty, brutal honesty #19)surrealdb-parsercross-repo dep deferred behind feature flag pending rust-version bumpMeta (ADR-021):
[lints] workspace = truecascade in fix(ogar-vocab): repair EnterEffect placement after #13 (main doesn't compile) #15/feat: ogar-from-elixir scaffold — wide / OGAR arm for HIRO/Bardioc Elixir #17/feat: ogar-adapter-surrealql — emit wired, parse stub, knowable_from seam #18)Plus
feat/state-machine-actor @ 38a71a4; nexgen sprints; surrealdb Sprint C16b; ruff producers; bardioc coord mirror).lance-bindimpl, rust-version bump, Rubicon durable home,KvLanceWriter,Workflow-dynamic-regen) — surfaced so future sessions don't assume closure.Pure docs; backward-looking session record
Future sessions cite ADR-NNN when implementing or revisiting any decision. Read alongside
SUBSTRATE-ENDGAME.md(forward-looking).https://claude.ai/code/session_01PBTGaPCSnnt6u3pjXpbLwY