diff --git a/WORK-RECORDS.md b/WORK-RECORDS.md index b2ac774..9eae32e 100644 --- a/WORK-RECORDS.md +++ b/WORK-RECORDS.md @@ -62,9 +62,9 @@ | task | RAILIANCE-WP-0014-T02 | done | — | workplans/RAILIANCE-WP-0014-credential-change-suite-stabilization.md | | task | RAILIANCE-WP-0014-T03 | done | — | workplans/RAILIANCE-WP-0014-credential-change-suite-stabilization.md | | task | RAILIANCE-WP-0014-T04 | done | — | workplans/RAILIANCE-WP-0014-credential-change-suite-stabilization.md | -| task | RAILIANCE-WP-0015-T01 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | +| task | RAILIANCE-WP-0015-T01 | done | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | | task | RAILIANCE-WP-0015-T02 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | -| task | RAILIANCE-WP-0015-T03 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | -| task | RAILIANCE-WP-0015-T04 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | -| task | RAILIANCE-WP-0015-T05 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | +| task | RAILIANCE-WP-0015-T03 | done | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | +| task | RAILIANCE-WP-0015-T04 | done | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | +| task | RAILIANCE-WP-0015-T05 | done | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | | task | RAILIANCE-WP-0015-T06 | todo | — | workplans/RAILIANCE-WP-0015-platform-rapp-consistency.md | diff --git a/docs/rapp-platform-service-pattern.md b/docs/rapp-platform-service-pattern.md index bce0138..b104e56 100644 --- a/docs/rapp-platform-service-pattern.md +++ b/docs/rapp-platform-service-pattern.md @@ -114,6 +114,54 @@ Operator decision of 2026-08-11: rapp granularity is **grouped by bounded context** — one rapp per cohesive group of services that deploys, versions and rolls back together, rather than one rapp per deployable. +### Rapp context is its own dimension + +A bounded rapp context is **not** derived from a Forgejo organization, nor from +a State Hub domain. It is a grouping in its own right. This follows OAS P1 +(`canon/standards/orthogonal-architecture_v1.0.md`) — independent perspectives +MUST stay in separate dimensions — and it is forced by cardinality: + +| Grouping | Answers | Cardinality to repos | +| --- | --- | --- | +| Forgejo org | who may push; what is discoverable together | 1:many (a repo has one org — it is a path segment in the clone URL) | +| State Hub domain | which strand of work, for attention and priority | 1:many | +| Rapp context | what deploys, versions and rolls back together | **many:many** | + +A repo can legitimately contribute to more than one rapp — a shared library, or +a service that is both a member of one bundle and a dependency of another. A +many:many grouping cannot be derived from a 1:many one. Domains fail in both +directions: several rapps sit within one domain, and a cross-cutting rapp such +as an identity bundle serves every domain rather than sitting inside one. + +The three also change at different speeds — org membership is expensive to +change, domains change occasionally, rapp contexts change often as workloads +consolidate. Deriving the volatile grouping from the expensive one guarantees +churn in the wrong place. + +**One precision matters for enforcement:** repos are many:many with rapps, but +*deployables* are **1:1** — each running deployable has exactly one rapp owning +its rollout. That distinction is what makes the coverage check well-defined: +*does every live deployable belong to exactly one rapp?* + +### Declaring the composition + +A rapp declares what it combines: first-party repos and pinned third-party +components, plus the purpose the combination serves. The normative shape is +`railiance-master`'s to settle; the proposed form is: + +```yaml +composition: + purpose: + member_repos: + - repo: + role: + deployables: [] + upstream_components: + - name: + source: + version: +``` + For a grouped rapp: - members **must** be declared explicitly; an undeclared bundle is not a rapp,