Skip to content

docs: ARCHITECTURAL-DECISIONS-2026-06-04 — 21 ADRs (backward-looking session capture)#21

Merged
AdaWorldAPI merged 1 commit into
mainfrom
claude/architectural-decisions-2026-06-04
Jun 5, 2026
Merged

docs: ARCHITECTURAL-DECISIONS-2026-06-04 — 21 ADRs (backward-looking session capture)#21
AdaWorldAPI merged 1 commit into
mainfrom
claude/architectural-decisions-2026-06-04

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

ARCHITECTURAL-DECISIONS-2026-06-04.md — 21 ADRs, backward-looking session capture

Companion 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):

  • ADR-001: State = ActionState (lifecycle), not domain state, for Rubicon binding
  • ADR-002: ActionDef and ActionInvocation stay split — never collapse
  • ADR-003: Class field set 1:1 with class_record_batch_schema
  • ADR-004: Three §6 Rubicon-statem vocab terms as TeKaMoLo sub-properties
  • ADR-005: EnterEffect { field, to_value } typed (not free-form string)

Vocab + interfaces (ADR-006 to ADR-010):

  • ADR-006: EnterEffect carries #[non_exhaustive] per vocab forward-compat
  • ADR-007: §3 signatures = canonical ractor_actors::state_machine (on_event / is_commit / timeout / on_timeout / Transition::{Goto,Stay,Postpone,Stop} / sync-fallible on_commit)
  • ADR-008: LanceMembrane::commit_event(row) -> u64 as CommitHook::on_commit target
  • ADR-009: lance-graph-planner::temporal two-axis engine (TIME via HLC + DATA via DependsClosure)
  • ADR-010: knowable_from meet-point — single ownership (ogar-adapter-surrealql sources; temporal::classify consumes; nowhere else)

Producers + transcoding (ADR-011 to ADR-015):

  • ADR-011: Two-arm naming pattern (narrow SPO + wide OGAR)
  • ADR-012: nexgen op-surreal-ast is special case, not collision
  • ADR-013: has_paper_trail is duplicate of Lance versions (substrate consolidation)
  • ADR-014: Data-driven FSMs need database hydrator pattern
  • ADR-015: Language enum is the extension point for source-AST tags

Architectural decisions (ADR-016 to ADR-020):

  • ADR-016: SurrealQL DDL AST is not the universal IR (per SURREAL-AST-AS-ADAPTER.md, merged in docs: SurrealQL AST as universal adapter — feasibility, beauty, brutal honesty #19)
  • ADR-017: surrealdb-parser cross-repo dep deferred behind feature flag pending rust-version bump
  • ADR-018: Kanban-as-polyglot-dispatcher during migration (six work-item form variants; per-actor §14-oracle-gated graduation)
  • ADR-019: OP-as-operator-pane is the substrate's self-hosting destination
  • ADR-020: SDK endgame is deeper than Foundry going OSS via three structural differentiators

Meta (ADR-021):

Plus

  • Full cross-repo references (lance-graph PR #467/#468; ractor_actors feat/state-machine-actor @ 38a71a4; nexgen sprints; surrealdb Sprint C16b; ruff producers; bardioc coord mirror).
  • In-flight decisions explicitly not pinned (cross-server HLC policy, lance-bind impl, rust-version bump, Rubicon durable home, KvLanceWriter, Workflow-dynamic-regen) — surfaced so future sessions don't assume closure.
  • Doc lifecycle: append-only, supersession convention, OGAR-owned for substrate-architecture decisions; bardioc mirror for runtime-session coord.

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

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +328 to +329
- Future tightening (e.g. `to_value: String → Value` enum) becomes
non-breaking.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@AdaWorldAPI AdaWorldAPI merged commit eaa49f1 into main Jun 5, 2026
@AdaWorldAPI

Copy link
Copy Markdown
Owner Author

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 claude/relaxed-babbage-64Dzs):

ADR Decision Implementation receipt (bardioc rubicon/) Tests
ADR-001 State = ActionState lowering RubiconMachine impl (9412c68) — one_machine_type_drives_every_domain proves Odoo+chess+OP on one machine 6/6
ADR-002 split ActionDef/ActionInvocation consumed as Event/Context respectively (9412c68)
ADR-005 typed EnterEffect applied at crossing → RubiconCtx::pending_effect → audit row (9412c68)
ADR-007 canonical state_machine signatures impl StateMachine for RubiconMachine<D> against 38a71a4 exactly
ADR-008 commit_event(row) -> u64 sibling LanceMembraneWriter wires RubiconWriter::commitcommit_event; gate_commit=true action-commit marker (8c74c18) 13/13
ADR-009 two-axis temporal (TIME+DATA) OgarDependsGuard implements DependsClosure for KausalSpec::Depends; RubiconMachine<D=NoDeps> (b055bfc) 20/20
ADR-010 knowable_from single ownership consumed by temporal::classify; mirror pin closed in bardioc CROSS_SESSION_COORDINATION.md meet-points + ADR-cross-ref table
§14 protocol (SUBSTRATE-ENDGAME §2.4 / OPENPROJECT-TRANSCODING §6) four-verdict acceptance OracleSubstrate trait + Verdict {Pass, DivergentReconcilable, DivergentFaulty, Indeterminate} + compare_normalised provenance-strip + MinimalChessOracle (drop-in for shakmaty) (43b272a) 25/25

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 ## Implementation receipts section after the "Decisions still in flight" appendix (append-only, respects your supersession convention — no existing ADR modified). The bardioc-side ADR↔meet-point↔commit cross-reference table is already live in CROSS_SESSION_COORDINATION.md (mirrors ADR-010 per your §10.3 deferral) + STANDING_WAVE_ARCHITECTURE.md §12.5 + rubicon/ARCHITECTURE.md §2, so this addendum closes the OGAR→bardioc direction of the same loop.

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.

AdaWorldAPI added a commit that referenced this pull request Jun 5, 2026
…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant