docs(adrs): ADR 0103 — language-neutral contracts, React-first, .NET-core/Rust-edge - #222
Conversation
….NET-core/Rust-edge Records CIC's ratified strategy direction resolving the UI/backend fork. Five decisions: - D1 language-neutral contracts are source-of-truth; .NET and TS both generated. - D2 React-first expression; offline-essential selects Tauri-React desktop as the canonical product client; Blazor is a second generated target + showcase. - D3 .NET stays the authoritative core, Rust owns the edge tier it already owns; no ideological rewrite (protects the live-auth launch gate). - D4 standing dependency criterion MIT plus permissive-compatible (Apache-2.0/BSD/ISC, no copyleft); excludes proprietary UI vendors; extends the governance/license posture ADR. - D5 triggers the offline-desktop adoption-posture flip; MAUI Blazor becomes showcase/secondary, supersession candidate on full adoption. Status Accepted, ratified by CIC (BDFL) 2026-05-31. Opening as DRAFT pending the ADR-0069 pre-merge soundness council (sec-eng plus .NET-architect plus frontend-arch). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
📝 WalkthroughWalkthroughPR 222 adds ADR 0103, documenting a governance decision to establish language-neutral UI/domain contracts as the authoritative source of truth, express UI-first via React with Blazor as generated showcase, split backend tiers between .NET core and Rust edge/on-device, and enforce MIT + permissive-compatible-only dependency licensing. The document includes implementation checklist, compatibility plan, open questions, revisit triggers, and pre-merge/pre-acceptance quality gates. ChangesADR 0103: Language-Neutral Contracts, React-First Approach, and Backend Tier Split
Estimated Code Review Effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
All three pre-merge councils returned GREEN with non-blocking findings. Folded the two factual ADR-text corrections plus a forward-looking council-folds capture: - correct the contract-mirror claim: no inherited automated C#-to-TS codegen mirror exists today; standing up and validating emit fidelity is in-scope for the contract-format follow-up, not an assumption - clarify the Tauri-React client path label across the two sister ADRs - record license-gate transitivity, contracts-only codegen invariant, offline-Blazor ruled-out citation, adapter-drift, and TS-bias notes Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/adrs/0103-language-neutral-contracts-react-first-offline-tier-split.md`:
- Line 174: The word "councilled" in the sentence "A future councilled migration
ADR proposes relocating the authoritative core off .NET (would reopen D3)." is a
typo; update that phrase to the project's preferred form (e.g.,
"council-approved" or "counseled"/"counciled" depending on style) so it reads
consistently (for example: "A future council-approved migration ADR proposes
relocating the authoritative core off .NET (would reopen D3)."). Ensure the
replacement preserves the sentence meaning and style consistent with other ADRs.
- Around line 212-213: The doc uses inconsistent package root paths: replace the
short form `packages/ui-core`, `packages/ui-adapters-react`,
`packages/ui-react`, `packages/ui-adapters-blazor` with the canonical path used
elsewhere (e.g., `shipyard/packages/ui-core`,
`shipyard/packages/ui-adapters-react`, `shipyard/packages/ui-react`,
`shipyard/packages/ui-adapters-blazor`) so all references match the earlier
`shipyard/packages/...` style; update the list in the block containing
`sunfish/apps/desktop/` and the four package entries to the canonical
`shipyard/packages/...` form.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 1c639cce-604e-41bd-96ea-a28bc06ed4f7
📒 Files selected for processing (1)
docs/adrs/0103-language-neutral-contracts-react-first-offline-tier-split.md
|
|
||
| ## Revisit triggers | ||
|
|
||
| - A future councilled migration ADR proposes relocating the authoritative core off .NET (would reopen D3). |
There was a problem hiding this comment.
Fix spelling in revisit trigger wording.
“councilled” is likely a typo; please normalize to the project’s intended form (e.g., “council-approved” / “counciled”) for consistency across ADRs.
🧰 Tools
🪛 LanguageTool
[grammar] ~174-~174: Ensure spelling is correct
Context: .... --- ## Revisit triggers - A future councilled migration ADR proposes relocating the a...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/adrs/0103-language-neutral-contracts-react-first-offline-tier-split.md`
at line 174, The word "councilled" in the sentence "A future councilled
migration ADR proposes relocating the authoritative core off .NET (would reopen
D3)." is a typo; update that phrase to the project's preferred form (e.g.,
"council-approved" or "counseled"/"counciled" depending on style) so it reads
consistently (for example: "A future council-approved migration ADR proposes
relocating the authoritative core off .NET (would reopen D3)."). Ensure the
replacement preserves the sentence meaning and style consistent with other ADRs.
| - `sunfish/apps/desktop/` — Tauri v2 + React 19 local-first client (offline-capable). | ||
| - `packages/ui-core`, `packages/ui-adapters-react`, `packages/ui-react`, `packages/ui-adapters-blazor`. |
There was a problem hiding this comment.
Use one canonical package root path in references.
Line 213 lists packages/..., while earlier audit lines use shipyard/packages/.... This inconsistency can send readers to the wrong location during verification.
Suggested doc fix
-- `packages/ui-core`, `packages/ui-adapters-react`, `packages/ui-react`, `packages/ui-adapters-blazor`.
+- `shipyard/packages/ui-core`, `shipyard/packages/ui-adapters-react`, `shipyard/packages/ui-react`, `shipyard/packages/ui-adapters-blazor`.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - `sunfish/apps/desktop/` — Tauri v2 + React 19 local-first client (offline-capable). | |
| - `packages/ui-core`, `packages/ui-adapters-react`, `packages/ui-react`, `packages/ui-adapters-blazor`. | |
| - `sunfish/apps/desktop/` — Tauri v2 + React 19 local-first client (offline-capable). | |
| - `shipyard/packages/ui-core`, `shipyard/packages/ui-adapters-react`, `shipyard/packages/ui-react`, `shipyard/packages/ui-adapters-blazor`. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/adrs/0103-language-neutral-contracts-react-first-offline-tier-split.md`
around lines 212 - 213, The doc uses inconsistent package root paths: replace
the short form `packages/ui-core`, `packages/ui-adapters-react`,
`packages/ui-react`, `packages/ui-adapters-blazor` with the canonical path used
elsewhere (e.g., `shipyard/packages/ui-core`,
`shipyard/packages/ui-adapters-react`, `shipyard/packages/ui-react`,
`shipyard/packages/ui-adapters-blazor`) so all references match the earlier
`shipyard/packages/...` style; update the list in the block containing
`sunfish/apps/desktop/` and the four package entries to the canonical
`shipyard/packages/...` form.
Status: DRAFT — awaiting pre-merge soundness council per ADR 0069 §D1
ADR 0103 records CIC's ratified strategy direction (BDFL per ADR 0018), resolving the long-running UI/backend strategy fork. Strategic content is already ratified by CIC (2026-05-31, verbatim: "Offline is essential, tech stack is less important but needs to be mit and best oss support the priority" + "MIT + permissive-compatible" + "Accepted"). This PR is held in DRAFT only for a technical-soundness / cited-symbol-drift check — not a re-litigation of the strategic call.
The five decisions
sunfish/apps/desktop/, SQLite + Loro CRDT + offline write-queue, ADR 0086) is the canonical product client. Blazor continues as a contract-generated second target + platform showcase, not a parallel product.§A0 cited-symbol verification (done 2026-05-31)
shipyard/packages/{ui-core, ui-adapters-blazor, ui-adapters-blazor-a11y, ui-adapters-react, ui-react};sunfish/apps/{desktop, web}.Registry / index caveat (housekeeping, not blocking)
docs/adrs/STATUS.md,INDEX.md,GRAPH.mdare marked "auto-generated bytools/adr-projections/project.py— do not edit by hand." That generator is not present anywhere in the committed tree (verified: not in worktree, not in the main checkout, not gitignored, not git-tracked; no CI workflow regenerates it). Rather than hand-edit files marked do-not-edit, this PR commits only the ADR source (the frontmatter is the source-of-truth the projections derive from). TheREADME.mdindex table is independently stale (stops at 0072). Locating/restoring the projection generator + refreshing the registries + README index is filed as a separate housekeeping item — out of scope for this PR.Council ask (3 councils — pre-merge, ADR 0069 §D1)
Auto-merge will be armed (
--squash --auto) only on 3-council GREEN.🤖 Generated with Claude Code
Summary by CodeRabbit