# Railiance Architecture Blueprint > The structural backbone of Railiance: the axes along which repositories are > classified, the layers of the stack, and the rules that keep them from > collapsing into each other. > > **Status:** working blueprint, established 2026-08-11. Structural claims here > are verified; items marked **OPEN** are undecided and name their deciding > repo. This file records structure, not runtime state — for what is currently > deployed, see each repo's `SCOPE.md`. > > **Authority note:** `railiance-master` owns the repo-family model and > `the-custodian` owns canon. This blueprint consolidates and applies them from > the S3 perspective; where the two disagree, they win. --- ## 1. Four classification axes Railiance classifies repositories along four **orthogonal** axes. They are complementary, not competing — a workload has a position on all four. | Prefix | Axis | Unit | Answers | | --- | --- | --- | --- | | `railiance-*` | ownership and responsibility | one architectural responsibility area | who owns this capability or layer? | | `rail-*` | execution contract | one workload execution architecture | how does a workload run here? | | `rapp-*` | managed workload package | one Railiance-managed workload | what exactly is packaged and operated? | | `reef-*` | substrate boundary | one durable substrate reality | where does this run, and what is bound there? | Source: `railiance-master/docs/repository-axes.md`. ### The separation rule Independent perspectives stay in separate dimensions. This is **normative**, not stylistic — OAS P1, `canon/standards/orthogonal-architecture_v1.0.md`: *"Architecture descriptions MUST separate independent perspectives into orthogonal dimensions."* Three groupings are routinely confused and must not be derived from each other: | Grouping | Answers | Cardinality to repos | Changes | | --- | --- | --- | --- | | Forgejo org | who may push; what is discoverable together | 1:many | slowly (renames break clone URLs, CI, GitOps sources) | | State Hub domain | which strand of work, for attention and priority | 1:many | occasionally | | **Rapp context** | what deploys, versions and rolls back together | **many:many** | often | A repo lives in exactly one Forgejo org — it is a path segment in the clone URL. A repo may contribute to several rapps. **A many:many grouping cannot be derived from a 1:many one.** Decision `d07ee5f9`. **The cardinality that makes enforcement possible:** repos are many:many with rapps, but **deployables are 1:1** — each running deployable has exactly one rapp owning its rollout. That is what makes the coverage check well-formed: *does every live deployable belong to exactly one rapp?* --- ## 2. The stack The OAS Stack dimension defines five levels. Railiance implements them as responsibility repos, plus cross-cutting and meta concerns that sit beside the stack rather than inside it. | Level | Repo | Owns | | --- | --- | --- | | S1 | `railiance-infra` | OS provisioning, hardening, server baseline, at-rest bootstrap secrets | | S2 | `railiance-cluster` | k3s, Helm, ingress, CNI, admission controllers, operators, kubeconfig | | S3 | `railiance-platform` | shared stateful services: data, cache, secrets, object storage, messaging | | S4 | `railiance-enablement` | paved paths: CI/CD templates, SDKs, portal, promotion conventions | | S5 | `railiance-apps` | user-facing application workloads and release operations | Repos that are not stack levels are **not homeless** — they belong to other OAS dimensions (§2.1): | Repo | Dimension | Owns | | --- | --- | --- | | `railiance-telemetry` | **Quality / Q2 Observability** | metrics, logs, traces, alerting — the substrate other layers emit into | | `railiance-bootstrap` | lifecycle (pre-stack) | the ignition sequence: bare VM → working Railiance, then handoff | | `railiance-master` | the architecture description itself | repo taxonomy, framework ADRs, boundary rules, vocabulary | | `railiance-fabric` | **Capability** | repo → service → capability → interface → dependency model | | `railiance-forge` | **being placed** (§5.2) | workload → `rapp-forgejo`; layer responsibility → S4 | ### 2.1 Railiance uses one of six canonical dimensions **This is the central coherence finding of the 2026-08-11 review.** OAS defines **six** canonical architecture dimensions, and states that *"Each architecture description MUST use these dimensions"* (`canon/standards/orthogonal-architecture_v1.0.md` §4): | Dimension | Purpose | Railiance use | | --- | --- | --- | | Stack | technical hosting substrate | **used** — S1–S5, the whole model to date | | Logic | functional decomposition | unused | | Plane | operational responsibility | unused | | Quality | cross-cutting architecture properties | **unused — and this is where the gaps are** | | Capability | stable capability modeling | partial (`railiance-fabric`, capability registry) | | Intelligence | degree of intelligent automation | unused | Railiance has modelled itself almost entirely on the Stack dimension. Anything that did not fit a stack level was treated as an anomaly — "unplaced", "beside the stack", "cross-cutting" — and accumulated as exceptions. They were never anomalies. **They are concerns on dimensions Railiance was not using.** The Quality dimension's sub-levels map almost one-to-one onto the capability gaps found independently by this review: | Quality sub-level | Canon definition | Railiance concern | State | | --- | --- | --- | --- | | Q1 Security and Compliance | — | credential custody, OpenBao lanes, CCR approval | **implemented** (S3), never named as Q1 | | Q2 Observability | "telemetry and monitoring: metrics, logs, traces" | `railiance-telemetry` | **seeded** 2026-08-11 | | Q3 Operability and Resilience | — | restore drills, rollback proof | split across S1/S3/S5, unowned | | Q4 Isolation and Tenancy | — | `rapp-postgres` ADR-0001, tenant keying | implemented per-consumer, not modelled | | Q5 Performance and Scalability | — | — | unaddressed | | Q6 Cost and Efficiency | — | `resource-control`, `fin-hub`, cost attribution keys | outside the family, boundary undeclared | | Q7 Governance and Change Management | "policies and architecture governance" | **the conformance loop** | unowned (§5.3) | Two consequences worth stating plainly: 1. **`railiance-telemetry` is not an exception to the stack model** — it is Q2 Observability, named in canon in exactly those words. Its placement question (§5.1) is effectively answered; `railiance-master` need only ratify it. 2. **The conformance loop is Q7**, not a missing stack layer. That reframes §5.3 from "invent a home" to "implement the Quality dimension." The recurring "self-evidencing" aspiration across five stack layers (§3) is, in OAS terms, five Stack-dimension repos each independently asking for Q2 and Q7. That is what a missing dimension looks like from inside the one you are using. ### 2.2 The six dimensions, established Railiance's position on each canonical dimension, with owners where they exist. Sub-levels are canon's, not invented here. **Status** is honest about what is implemented versus merely named. #### Stack — technical hosting substrate · *in use* S1 `railiance-infra` · S2 `railiance-cluster` · S3 `railiance-platform` · S4 `railiance-enablement` · S5 `railiance-apps`. See §2. #### Quality — cross-cutting architecture properties · *the priority* | Sub-level | Railiance concern | Owner | Status | | --- | --- | --- | --- | | Q1 Security and Compliance | credential custody, OpenBao lanes, CCR approval, grant catalog | S3 | **implemented**, never named Q1 | | Q2 Observability | metrics, logs, traces, alerting | `railiance-telemetry` | seeded 2026-08-11, no implementation | | Q3 Operability and Resilience | restore drills, rollback proof, DR | — | split S1/S3/S5, **unowned** | | Q4 Isolation and Tenancy | consumer isolation, tenant keying | `rapp-postgres` (per-consumer) | implemented, not modelled fleet-wide | | Q5 Performance and Scalability | — | — | **unaddressed** | | Q6 Cost and Efficiency | cost attribution, unit economics | `resource-control`, `fin-hub` | outside the family, boundary undeclared | | Q7 Governance and Change Management | the conformance loop, policy enforcement | — | **unowned** (§5.3) | Q1 is worth dwelling on: S3 has been building a mature Q1 practice for months — approval gates, delegated apply, revocation semantics, front-door readiness — without ever naming the dimension. That is evidence the dimensions describe real structure rather than imposing vocabulary. #### Plane — operational responsibility · *implicit, unnamed* | Sub-level | Railiance reality | | --- | --- | | P1 Workload Plane | `rapp-*` packages and the workloads they run | | P2 Control Plane | ArgoCD, CNPG operator, External Secrets, cert-manager | | P3 Management Plane | State Hub, `railiance-master`, workplans, decisions | Railiance already operates all three; none is declared. This is the dimension most likely to clarify the `rapp-*` / `rail-*` relationship, since a rail is essentially a P1 contract. #### Capability — stable capability modeling · *partial* C1 Capability Model / C2 Contract / C3 Realization / C4 Shared Platform Capabilities / C5 Business Capabilities. `railiance-fabric` models C1–C3; the per-repo `registry/capabilities/` declarations and `reuse-surface` federation cover C4. C5 is unaddressed and is where the boundary with `resource-control` / `fin-hub` (and Q6) belongs. **Contradiction C1 lives here**: the hub's capability attributions do not match repo declarations. #### Logic — functional decomposition · *unused* L1 Capability Domain / L2 Service Realization / L3 Composition and Integration / L4 Solution Layer. No Railiance repo is organised on this axis. Lowest priority: the Stack and Quality dimensions carry more weight for an operations framework, and Logic is likely more relevant to Helix Forge's capability-first model. #### Intelligence — degree of intelligent automation · *emerging, unnamed* I1 Deterministic Automation / I2 Language Interaction / I3 Knowledge and Reasoning / I4 Assisted Adaptation / I5 Agentic Delegation. Already referenced in practice — `qonto-assistant/docs/SecurityPractice.md` cites an "I1 Reinforced minimum" isolation profile — and the whole agent operating model (autonomy lanes, Kaizen agents, `/ralph-workplan`) is I4–I5 territory. Declared nowhere in Railiance. Given how much of this fleet is agent-operated, leaving Intelligence unmodelled understates what the system actually is. ### Establishing order Recommended sequence, for `railiance-master` to ratify: 1. **Quality first.** It holds the most unowned concerns (Q3, Q7) and the already-built-but-unnamed ones (Q1, Q4). Q2 has a home as of 2026-08-11. 2. **Plane second.** Cheap — it is descriptive of what already runs, and it sharpens the `rail-*` contract. 3. **Capability third.** Requires resolving C1 (hub attribution drift) and C4 first, or the model is built on bad data. 4. **Intelligence fourth.** Needs a real decision about how much of the agent operating model belongs in Railiance versus the-custodian. 5. **Logic last**, or never, if Helix Forge owns functional decomposition. ### The layering contract Each layer hands the next a **verified** substrate and does not reach past its neighbours. The handoffs are declared from both sides — S4 names its forge contract for runner labels and registry endpoints; S5 names backup and data-ownership handoffs with S3. Preserve this property when editing any `INTENT.md`: a handoff stated by only one side is a latent boundary dispute. --- ## 3. The self-evidencing thread Five layers independently declare the same aspiration in their `Direction of Evolution`: - S1 — "self-evidencing, auditable provisioning" - S2 — "self-evidencing, auditable runtime state" - S3 — "self-healing and observable platform services" - S5 — "self-evidencing, reviewable application readiness" - forge — "self-evidencing forge health and readiness checks" **This is the architectural through-line of Railiance**: the system should prove its own state rather than be asserted correct. It reached five INTENT files independently and was never named as a fleet-wide quality dimension. It has two halves, and they belong to different repos: | Half | Question | Home | | --- | --- | --- | | **Evidence plane** | is the running system behaving as expected? | `railiance-telemetry` | | **Conformance loop** | do declarations match reality and each other? | **OPEN** (§5.3) | Both are required. Observability without conformance checking finds outages but not drift; conformance checking without observability finds drift but not outages. --- ## 4. Repository status Not every `railiance-*` directory is a canonical repository. Verified 2026-08-11 by comparing remotes, HEADs, and working trees. | Repo | Status | Evidence | | --- | --- | --- | | `railiance-infra` | **canonical S1** | active; strict content superset of `hosts` | | `railiance-hosts` | **superseded** | distinct remote, unrelated history, byte-identical `INTENT.md`, **zero unique files**; quiet since 2026-07-30 | | `railiance-cluster` | **canonical S2** | active; has `install/` and rail-kubernetes extraction docs | | `railiance-bootstrap` | **superseded as S2; repurpose candidate** | distinct remote, unrelated history, declares itself S2 verbatim; frozen 2026-07-08. Carries `QUICKSTART.md` (newcomer path) — candidate home for *seeding a new Railiance* | | `railiance-platform` | canonical S3 | active | | `railiance-enablement` | canonical S4, **aspiration-only** | 25 commits, 0 workplans; widest aspiration-to-reality gap in the family | | `railiance-apps` | canonical S5 | active | | `railiance-telemetry` | **seeded** 2026-08-11 | `INTENT.md`/`SCOPE.md` written; no implementation | | `railiance-master` | canonical meta | active | | `railiance-fabric` | canonical meta | quiet since 2026-07-30; non-standard `INTENT.md` format | | `railiance-forge` | canonical, **unplaced** | active workplan; not on any stack level | ### The duplication pattern `bootstrap`, `cluster`, `hosts`, `infra` have **mutually unrelated git histories but near-identical content**. They were created by copying working trees into fresh repos as the S1/S2 layering idea emerged — not by forking. Two lineages, each with a frozen elder and an active successor. Consequence for tooling: **fleet inventories built by scanning directories overcount.** Deduplicate by origin URL, not by directory name. --- ## 5. Open decisions Each names the repo that decides it. None should be settled in `railiance-platform`. ### 5.1 Where does `railiance-telemetry` sit? → `railiance-master` Observability is cross-cutting: it draws signal from every level and is consumed by all of them. Is it an S3 platform capability (it runs stateful services and is consumed by others), or a Quality-dimension concern outside the Stack dimension? Stated explicitly at seeding so it does not drift into §5.2's state. ### 5.2 Where does `railiance-forge` sit? → **DECIDED 2026-08-11** **Place it, do not retire it.** Operator decision: - the Forgejo **workload** becomes `rapp-forgejo` (a managed workload package) - the **layer responsibility** — runner placement and labels, registry retention, artifact lifecycle, package credentials — folds into **S4 `railiance-enablement`**, which already declares the handoff contract for exactly these concerns This also gives S4, currently the widest aspiration-to-reality gap in the family, its first concrete owned responsibility. Implementation is `railiance-master` and `railiance-forge` territory; this blueprint records the decision, not the migration. The retirement hypothesis was **tested and rejected**: `railiance-forge` and `helix-forge` are different lineages. `helix-forge` is methodological (capability-first ecosystem, OAS dimensions, VSM vocabulary); `railiance-forge` is operational (`helm/`, `manifests/`, `releases/`, `runner/`, live workplan on Forgejo resource economics). Retiring it would orphan runner placement, registry retention, and artifact lifecycle. **Place it, do not retire it.** The likely resolution: the Forgejo *workload* becomes `rapp-forgejo`; the *layer* responsibility folds into S4, which already declares the handoff contract. ### 5.3 Who owns the conformance loop? → `railiance-master` Candidates: S4 (the paved-path layer), `railiance-master` (the definition home), or a new responsibility repo. Related: the family declaration validator proposed to `railiance-master` (`04c776c4`, amended `f88f938d`). ### 5.4 Retirement and repurposing → `railiance-master`, then the repos - retire `railiance-hosts` (content-safe; **check git history before deletion**, and move its live hub goal "Secure Single-Server Bootstrap at HostEurope" to `railiance-infra` first, or it resurfaces as unstarted S1 work) - repurpose `railiance-bootstrap` as the seed-a-new-Railiance repo, consolidating the newcomer path that currently exists in both it and `railiance-cluster` - delete the local `~/railiance-bootstrap` directory, which is a mis-cloned copy of `railiance-cluster.git` ### 5.6 Does Railiance use ArgoCD? → **REOPENED 2026-08-12 on corrected evidence** Decided 2026-08-11 as "keep it", on the basis that S3 runs ArgoCD as its live deployment mechanism. **That basis was wrong.** Verified against both clusters once API access was restored: | Fact | Evidence | | --- | --- | | ArgoCD does **not** run on railiance01 | namespace `argocd` NotFound | | ArgoCD runs on **CoulombCore** | `argocd` namespace, Active 344d | | The Applications target **CoulombCore, not railiance01** | all four declare `server: https://kubernetes.default.svc` — in-cluster | | Their health is poor | `issue-core` Degraded, `openbao-secretstore` Degraded, `target-revenue` OutOfSync/Missing | | The real workloads run on **railiance01** | `target-revenue` deploy 1/1 up 6d, `openbao` sts 1/1, `external-secrets` 3 deploys 1/1 | | Nothing on railiance01 is ArgoCD-managed | no namespace carries an `argocd.argoproj.io/instance` label | So the live S3 workloads are deployed **outside GitOps**, by Makefile and hand, while the ArgoCD Applications describe a deployment path into the **frozen** CoulombCore cluster — where `target-revenue` is registered but Missing, and two others are Degraded. The earlier claim that removing ArgoCD documentation would "describe a system that does not exist" was backwards: **the ArgoCD documentation already describes a deployment path that is largely not in effect.** This does not settle the question — it restates it honestly. Three real options: 1. **Adopt properly** — stand up ArgoCD on railiance01 and bring the live workloads under GitOps. The Applications become true. 2. **Retire** — remove the Applications and `docs/argocd-gitops.md`, and accept Makefile-driven deployment as the declared method. 3. **Relocate** — GitOps becomes Helix Forge tooling, as originally suspected. Doing nothing is the one option with a cost: a stale control plane on a frozen cluster, showing Degraded, that no longer reflects how anything ships. Note this is the same defect class as `RAIL-HO-WP-0009` — declared state and live state diverged, and nothing detected it. ### 5.5 Rapp granularity and composition → decided, implementation open Grouped by bounded context; members declared explicitly; grouping legitimate only where members share rollout and rollback fate (`7a1f7a7e`). A rapp declares a **composition**: first-party member repos plus pinned upstream components plus a stated purpose. --- ## 6. Known gaps, mapped to dimensions Read with §2.1: most of these are not scattered omissions but **one unbuilt dimension**. | Gap | Dimension | State | | --- | --- | --- | | Observability | Q2 | home created 2026-08-11; **no implementation**, no monitoring namespace in-cluster | | Conformance loop | Q7 | **unowned** (§5.3) | | End-to-end restore proof | Q3 | split across S1, S3, S5; no single owner; backing object-storage decision escalated and unresolved (`9c21c0e0`) | | Cost and resource attribution | Q6 | `resource-control` and `fin-hub` hold it; no `railiance-*` INTENT declares the boundary | | Performance and scalability | Q5 | unaddressed | | Identity dependency declaration | Capability | `net-kingdom` referenced in prose; rarely declared structurally. `railiance-fabric` exists to fix this | ## 6.1 Contradictions to resolve Found by the 2026-08-11 coherence review. These are places where two parts of Railiance currently say different things. | # | Contradiction | Resolution | | --- | --- | --- | | C1 | **Capability attribution crosses layer boundaries.** State Hub attributes ~11 capabilities to `railiance-platform`, including Terraform server provisioning and Ansible hardening (S1), k3s provisioning and cluster addons (S2), CI/CD automation (S4), and application workload deployment (S5). `SCOPE.md` declares only four, all correctly S3, and the repo's boundary rule disowns the rest. These are pre-split attributions the hub never dropped. | `SCOPE.md` is source of truth; the hub needs reconciliation. Until then, hub capability data for this repo is not trustworthy for boundary reasoning. | | C2 | **"Five independent repos per OAS Stack layer"** — stated in `SCOPE.md` — contradicts the four-axis model and the current inventory (§4). | Corrected in `SCOPE.md` 2026-08-11. | | C3 | **One dimension in use, six required** by ratified canon (§2.1). | Route to `railiance-master` and `the-custodian`; implement Quality first. | | C4 | **Ecosystem modelling is split four ways** — `railiance-fabric` (graph), State Hub (read model), `reuse-surface` (capability federation), `railiance-master` (vocabulary). Fabric draws the boundary crisply in prose but does not mention `reuse-surface`. | Needs an explicit statement of who owns what; `railiance-master` and `railiance-fabric` territory. | --- ## 7. Sources - `railiance-master/docs/repository-axes.md` — the four families - `railiance-master/docs/repo-family-bootstrap-contract.md` — required declarations - `railiance-master/docs/rapp-first-wave-candidates.md` — extraction criteria and sequencing - `the-custodian/canon/standards/orthogonal-architecture_v1.0.md` — OAS, P1 - `railiance-platform/docs/rapp-platform-service-pattern.md` — S3 platform-service pattern - `railiance-platform/history/2026-08-11-railiance-architecture-in-aspiration.md` — the INTENT-based assessment behind this blueprint - decisions `7a1f7a7e` (rapp granularity), `d07ee5f9` (dimensional separation)