Compare commits

..

2 commits

Author SHA1 Message Date
codex
d58d9af799 Merge remote bootstrap history 2026-07-26 02:38:26 +02:00
codex
c17a28fb8b Bootstrap grouped home reef repo 2026-07-26 02:38:10 +02:00
33 changed files with 37 additions and 1682 deletions

View file

@ -1,28 +0,0 @@
<!-- custodian-brief: generated by fix-consistency — do not edit manually -->
# Custodian Brief — reef-railiance
**Domain:** financials
**Last synced:** 2026-10-11 18:24 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Active Workstreams
### Complete rapp-qonto production gates
Progress: 3/4 done | workplan_id: `8ac413ad-2f57-53e6-b586-c5bec9cfbd1f`
**Open tasks:**
- ! T04 - Reassess production failure-domain risk `9d792070`
*(wait: Production approval requires mitigation or explicit acceptance of the single-node/shared-control-plane risk.)*
## Inbox Hygiene
**Stale unread:** 2 message(s) older than 3 day(s) — triage at session start.
**Missing thread_id:** 2 unread message(s) lack supersession chains.
---
## MCP Orientation (when available)
If the state-hub MCP server is reachable, call:
`get_domain_summary("financials")`
This provides richer cross-domain context.
If the MCP call fails, use this file as your orientation source.

3
.gitignore vendored
View file

@ -1,3 +0,0 @@
__pycache__/
*.py[cod]
.pytest_cache/

172
LICENSE
View file

@ -1,151 +1,21 @@
# Target Revenue Source License
**Version 1.0, Candidate 1 (V1C1)**
---
> **PRELIMINARY CANDIDATE — SUBJECT TO CHANGE — NOT FINAL**
>
> This repository is governed by the Target Revenue Source License
> (TRSL), Version 1, Candidate 1. This is the framework's first working
> candidate, adopted as the org's preliminary operating license across
> all repos (maintainer decision, 2026-07-29) during the build/alpha
> stage — see `SCOPE.md` §1 and Appendix A of the canonical text (link
> below) for the alpha/beta risk-acceptance decision this reflects and
> what it does and does not mean. Full specialist legal review is
> explicitly deferred until the framework moves out of beta.
>
> **Canonical source, full candidate-status banner, and Appendix A
> (non-normative candidate notes tracking every open item):** the
> `coulomb` org's `target-revenue` repository,
> `specs/TargetRevenueSourceLicense-V1C1.md` — this file is the operative
> legal text (Preamble through Section 11) only; the canonical document
> is authoritative if this copy and that document ever diverge.
---
## Preamble
This Target Revenue Source License ("**License**") governs the Software identified in the applicable Phase Manifest. It implements the Target Revenue Framework: a defined development Phase accumulates Development Credit and Remission Credit against an immutable Initial Target until the Milestone Release automatically and irrevocably converts to a declared permissive Future License.
Commercial beneficiaries fund the creation and early availability of a software improvement; once the declared target is satisfied, the governed release becomes permissively open source.
## 1. Definitions
Capitalized terms used in this License have the meanings given below. Where a term is also defined in the Phase Manifest or Target Ledger for a specific Phase, the Phase Manifest and Target Ledger govern the *values* (amounts, dates, identifiers) and this License governs the *legal effect* of those values — the two must not be read as conflicting definitions of the same concept.
**"Commercial Entitlement"** means a right, purchased or otherwise granted under a Commercial Use Agreement, to make Commercial Use of the Software during a Phase.
**"Commercial Use"** means billing, invoicing, or otherwise charging any customer a fee, subscription, license fee, or other consideration for or in connection with use of the Software, at any time before the Conversion Event for the applicable Phase, regardless of whether the person or organization billed would otherwise qualify for Noncommercial Use. Commercial Use occurs by virtue of such billing alone, whether or not the resulting payment is registered with the Trust Service; in particular, billing a customer for pre-conversion use of the Software without recording the corresponding payment in the applicable Phase's Target Ledger is Commercial Use without a valid Commercial Entitlement — a violation of Section 3, addressed under Section 7 and, where applicable, the Enforcement Network described in the canonical repository's `specs/EnforcementNetworkConcept.md`.
**"Commercial Use Agreement"** means the separate agreement, referenced by the applicable Phase Manifest, under which a Commercial Entitlement is purchased or granted. This License does not itself set pricing, metering, or payment terms — those are governed by the Commercial Use Agreement.
**"Conversion Event"** means the moment the Outstanding Target for a Phase reaches zero, as computed from the Phase Manifest and Target Ledger per the Target Ledger Specification. The Conversion Event occurs automatically and is not conditioned on any declaration, attestation, or other act by the Licensor or any Trust Service.
**"Development Credit"** means the portion of a collected and settled payment explicitly allocated toward satisfying the Initial Target of a specific Phase, as recorded in that Phase's Target Ledger.
**"Future License"** means the permissive license identified in the applicable Phase Manifest, being either the MIT License or the Apache License, Version 2.0, which applies to the Milestone Release upon the Conversion Event.
**"Initial Target"** means the immutable monetary target declared for a Phase in its Phase Manifest.
**"Licensor"** means **Binky Hedgehog GmbH**, the party that publishes the Phase Manifest and holds the rights necessary to grant this License and the Future License for the Milestone Release.
**"Milestone Release"** means the precisely identified software release designated in the applicable Phase Manifest, identified by an immutable source revision, release artifact, or cryptographic digest.
**"Noncommercial Use"** means use of the Software for personal purposes, private study, hobby or amateur projects; use by any charitable organization, educational institution, public research organization, or government institution acting in a non-revenue-generating capacity; or other use of a materially similar character.
**"Outstanding Target"** means, at any time, `max(0, Initial Target − cumulative Development Credit − cumulative Remission Credit)` for a Phase, as computed from that Phase's Target Ledger.
**"Phase"** means a bounded development undertaking governed by one Initial Target, one Milestone Release, one degeneration policy, and one Future License declaration, as declared in a Phase Manifest.
**"Phase Manifest"** means the published, immutable declaration identifying a Phase, its Milestone Release, Initial Target, Future License, degeneration policy, and Target Ledger location, as specified in the Phase Manifest Specification.
**"Remission Credit"** means a transparent, non-revenue reduction of a Phase's Outstanding Target, generated under that Phase's published degeneration policy and recorded in the Target Ledger.
**"Settled Payment"** means a payment that has cleared through its payment processor and is no longer subject to reversal in the ordinary course (chargeback, dispute, or equivalent), as further specified by the applicable Commercial Use Agreement or monetization extension.
**"Software"** means the source code, object code, and associated documentation of the Milestone Release identified in the applicable Phase Manifest.
**"Target Ledger"** means the append-only record of Development Credit, Remission Credit, and correction entries for a Phase, as specified in the Target Ledger Specification.
**"You"** or **"Licensee"** means the individual or entity exercising rights under this License.
## 2. Grant of Rights for Noncommercial Use
Subject to the terms of this License, the Licensor grants You a worldwide, royalty-free, non-exclusive license, during the applicable Phase, to:
(a) use, reproduce, and study the Software for any Noncommercial Use;
(b) modify the Software and create derivative works of it for any Noncommercial Use; and
(c) redistribute the Software and Your modifications, in source or object form, for any Noncommercial Use, provided that You include this License, unmodified, with any such redistribution, and that You do not remove or alter any copyright, patent, trademark, or attribution notices contained in the Software.
This grant does not extend to Commercial Use. Commercial Use requires a Commercial Entitlement under Section 3.
## 3. Commercial Use
You may not make Commercial Use of the Software during the applicable Phase unless You hold a valid, current Commercial Entitlement under a Commercial Use Agreement with the Licensor covering the applicable Phase. A Commercial Entitlement granted under one Phase's Commercial Use Agreement does not extend to a later Phase's Milestone Release unless the Commercial Use Agreement expressly says so.
This Section 3 states the existence and boundary of the commercial-use restriction. It does not itself set pricing, invoicing, metering, audit rights, or payment terms — those are governed exclusively by the applicable Commercial Use Agreement.
## 4. Patent License
Subject to the terms of this License, each contributor to the Software grants You, during the applicable Phase and solely to the extent of rights granted under Sections 2 and 3, a perpetual (subject to the termination below), worldwide, non-exclusive, no-charge, royalty-free patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Software, limited to those patent claims licensable by that contributor that are necessarily infringed by their contribution(s) alone or by combination of their contribution(s) with the Software.
If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Software or a contribution incorporated within it constitutes direct or contributory patent infringement, then any patent licenses granted to You under this Section 4 for the Software shall terminate as of the date such litigation is filed.
## 5. Automatic Conversion to the Future License
**5.1 Automatic effect.** Upon the Conversion Event for a Phase, the rights and restrictions in Sections 3 (Commercial Use) of this License, as they apply to that Phase's Milestone Release, terminate automatically. In their place, the Milestone Release is licensed under the Future License identified in that Phase's Phase Manifest, effective as of the Conversion Event, without any further act, declaration, or attestation required by the Licensor, any Trust Service, or any other party.
**5.2 Irrevocability.** Once a valid Conversion Event has occurred for a Phase, no subsequent refund, chargeback, accounting correction, dispute, or termination of this License for an unrelated breach shall revoke, suspend, or otherwise impair the Future License grant for that Phase's Milestone Release. Any shortfall or dispute arising after a Conversion Event is a commercial or accounting matter between the relevant parties and does not reinstate a commercial-use restriction over already-converted Software.
**5.3 Prior freedom preserved.** A later Phase covering subsequent improvements to the Software does not restrict, withdraw, or otherwise affect the rights granted under the Future License for an earlier Phase's already-converted Milestone Release.
**5.4 Evidence, not cause.** A Trust Service may publish a Conversion Attestation documenting a Conversion Event. Such an attestation is evidence that the Conversion Event occurred; it is not a condition of, and its absence or delay does not postpone, the automatic effect described in Section 5.1. Any person may independently verify whether a Conversion Event has occurred directly from the Phase Manifest and Target Ledger.
## 6. Successive Phases
The Licensor may declare a new Phase covering subsequent improvements to the Software following a Milestone Release's Conversion Event. Each Phase is independently governed by its own Phase Manifest, Initial Target, degeneration policy, and Target Ledger. Nothing in a later Phase's Phase Manifest may be construed to reduce or withdraw rights already granted under Section 5 for an earlier Phase's Milestone Release.
## 7. Term and Termination
**7.1 Term.** This License applies to the Software for the duration of the applicable Phase, and, for the Milestone Release, indefinitely following that Phase's Conversion Event under the Future License.
**7.2 Termination for breach.** If You breach Section 3 (Commercial Use) or Section 2(c) (redistribution notice requirement), the Licensor may terminate this License as to You. Before such termination becomes effective, the Licensor shall provide You written notice of the breach; if You cure the breach within thirty (30) days of that notice, this License continues in effect. A second breach of the same provision within twelve (12) months may be terminated immediately without a further cure opportunity.
**7.3 Effect of termination.** Termination under this Section 7 affects only Your rights under Sections 2 and 3 for the Phase in which the breach occurred. It does not affect any rights already vested under Section 5 (Automatic Conversion) for a Milestone Release whose Conversion Event has already occurred, per Section 5.2.
**7.4 Public record of breach and resolution.** The Licensor shall cause the Trust Service to publish, as part of the public record for the affected Phase, notice of: (a) any breach notice issued under Section 7.2, stating the general nature of the breach and the date of notice; (b) whether the breach was cured within the applicable cure period, and the date of cure; and (c) any termination determination made under this Section 7, including its effective date and scope. This public record exists to give the ecosystem a transparent, verifiable conformity signal for the Phase, distinct from and in addition to the Development Credit and Remission Credit facts already published under Section 5.4 and the Target Ledger Specification.
A breach that You dispute, and that has not been finally determined, shall be recorded as **alleged**; it shall be recorded as **determined** only once the cure period has run without cure, or the dispute has been resolved against You under the applicable Commercial Use Agreement's dispute process, if any. The Trust Service shall update the record promptly upon resolution in either direction. Recording an alleged or determined breach under this Section 7.4 is a ministerial act of publishing the Licensor's determination (or a dispute process's outcome); it does not give the Trust Service discretionary authority to decide whether a breach occurred, consistent with Section 5.4's evidence-not-cause principle.
Whether, and under what conditions, the public record identifies a Commercial Entitlement holder by name is governed exclusively by the applicable Commercial Use Agreement, which the Licensor and that Commercial Entitlement holder negotiate and agree to directly. This License does not itself set a naming default. Where no Commercial Use Agreement addresses the question, or where the affected party has no Commercial Use Agreement at all (for example, a Section 2(c) breach by a Noncommercial Use licensee), the public record states the Phase and breach category only, without naming the party.
## 8. Disclaimer of Warranty
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. THE LICENSOR DOES NOT WARRANT THAT THE SOFTWARE WILL BE ERROR-FREE OR THAT ANY PHASE WILL REACH ITS CONVERSION EVENT.
## 9. Limitation of Liability
IN NO EVENT SHALL THE LICENSOR OR ANY CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE, EXCEPT TO THE EXTENT SUCH LIMITATION IS PROHIBITED BY APPLICABLE LAW.
## 10. Trademarks
This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary attribution.
## 11. General Provisions
**11.1 Governing law and venue.** Adopted for alpha/beta 2026-07-29: disputes arising under this License shall be resolved by binding arbitration, seated at a neutral, arbitration-mature venue (Singapore or London are the two candidates concretely supported by current research), rather than by litigation in a national court. The specific arbitral institution and substantive governing law remain a per-deployment blank pending final selection; they are not fixed by this candidate. See the canonical repository's `history/260729-TRSL-Jurisdiction-Synthesis.md` §2.
**11.2 Severability.** If any provision of this License is held unenforceable, the remaining provisions remain in full force, and the unenforceable provision shall be reformed to the minimum extent necessary to make it enforceable.
**11.3 No waiver.** Failure to enforce any provision of this License is not a waiver of future enforcement of that or any other provision.
**11.4 Entire agreement (as to licensing).** This License, together with the applicable Phase Manifest and, where applicable, the Commercial Use Agreement, constitutes the entire agreement between You and the Licensor regarding the Software's licensing terms. Operations, service, and consulting arrangements are governed by separate agreements, if any, and are not part of this License.
**11.5 Definitions control.** Marketing materials, documentation, or other non-normative communications about the Software must not describe pre-Conversion-Event Software as "Open Source," "free software," or "open core." Pre-conversion Noncommercial Use is **source-available**; pre-conversion Commercial Use requires a **Commercial Entitlement**; only post-conversion Software may be described as Open Source, under the Future License.
---
**No Phase is currently declared for this repository under this License.** Until a Phase Manifest is published and registered with the Trust Service for a Milestone Release in this repository, Sections 2–7 above have no operative subject matter here — this License establishes the governing framework in advance of that declaration, consistent with the org-wide rollout decision recorded in `target-revenue`'s `workplans/TREV-WP-0008-governance-and-pilot-rollout.md`.
MIT License
Copyright (c) 2026 Railiance
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -29,15 +29,7 @@ Those concerns stay with `railiance-infra`, `railiance-cluster`,
## Current Status
This repo now owns the wave-1 grouped home-reef boundary for Railiance.
The rail and rApp binding projections were reconciled against their owning
family declarations on 2026-08-21. Live evidence still shows one Ready member
carrying the Kubernetes control-plane and etcd roles, so the Qonto binding
remains verified and private rather than production-approved.
The retained S1 compatibility path while reef localization is still in flight
is documented in `docs/retained-s1-handoff.md`.
This repo is in first-wave bootstrap.
The boundary and source material come from:
@ -51,5 +43,4 @@ The boundary and source material come from:
- `substrate/` — grouped substrate identity and topology facts
- `bindings/` — rail and `rapp` binding surfaces for this reef
- `docs/` — wave-1 contract and source import plan
- `docs/retained-s1-handoff.md` — migration-window split with `railiance-infra`
- `workplans/` — repo-local execution work

View file

@ -61,12 +61,11 @@ or one-host naming into the reef model.
## Current State
- Status: bootstrapped first-wave grouped reef home
- Implementation: declaration, grouped substrate files, retained-S1
compatibility handoff, and checked rail/rApp binding projections are present
- Stability: evolving, with the migration-window split now explicit
- Usage: wave-1 home reef for the Railiance server group; Qonto production
admission remains blocked on an independent failure domain
- Status: active bootstrap
- Implementation: declaration, initial grouped substrate files, and first
repo-local workplan are present
- Stability: evolving
- Usage: wave-1 home reef for the Railiance server group
---

View file

@ -1,36 +0,0 @@
# Work Records — reef-railiance
> Generated by `statehub fix-consistency` (CUST-WP-0061-T04, work-record
> stage 3). Do not edit by hand — edit the source file/block listed for
> each record and re-run fix-consistency to refresh this index. Archived
> workplans are omitted; closed decisions/intakes/engagements stay listed
> so recently-resolved work is still visible. [auto]
| Kind | ID | Status | Lane | Source |
| --- | --- | --- | --- | --- |
| workplan | REEF-RAILIANCE-WP-ADHOC-2026-09-12 | finished | — | workplans/ADHOC-2026-09-12.md |
| workplan | REEF-RAILIANCE-WP-0001 | finished | — | workplans/REEF-RAILIANCE-WP-0001-bootstrap-and-wave1-import.md |
| workplan | REEF-RAILIANCE-WP-0002 | finished | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| workplan | REEF-RAILIANCE-WP-0003 | blocked | — | workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md |
| workplan | REEF-RAILIANCE-WP-0004 | finished | — | workplans/REEF-RAILIANCE-WP-0004-exposure-grants.md |
| workplan | REEF-RAILIANCE-WP-0005 | finished | — | workplans/REEF-RAILIANCE-WP-0005-binding-and-evidence-reconciliation.md |
| task | REEF-RAILIANCE-WP-ADHOC-2026-09-12-T01 | done | — | workplans/ADHOC-2026-09-12.md |
| task | REEF-RAILIANCE-WP-0001-T01 | done | — | workplans/REEF-RAILIANCE-WP-0001-bootstrap-and-wave1-import.md |
| task | REEF-RAILIANCE-WP-0001-T02 | done | — | workplans/REEF-RAILIANCE-WP-0001-bootstrap-and-wave1-import.md |
| task | REEF-RAILIANCE-WP-0001-T03 | done | — | workplans/REEF-RAILIANCE-WP-0001-bootstrap-and-wave1-import.md |
| task | REEF-RAILIANCE-WP-0001-T04 | done | — | workplans/REEF-RAILIANCE-WP-0001-bootstrap-and-wave1-import.md |
| task | REEF-RAILIANCE-WP-0002-T01 | done | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0002-T02 | done | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0002-T03 | done | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0002-T04 | cancel | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0002-T05 | done | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0002-T06 | done | — | workplans/REEF-RAILIANCE-WP-0002-knative-and-qonto-production-admission.md |
| task | REEF-RAILIANCE-WP-0003-T01 | done | — | workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md |
| task | REEF-RAILIANCE-WP-0003-T02 | done | — | workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md |
| task | REEF-RAILIANCE-WP-0003-T03 | done | — | workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md |
| task | REEF-RAILIANCE-WP-0003-T04 | wait | — | workplans/REEF-RAILIANCE-WP-0003-rapp-qonto-production-gates.md |
| task | REEF-RAILIANCE-WP-0004-T01 | done | — | workplans/REEF-RAILIANCE-WP-0004-exposure-grants.md |
| task | REEF-RAILIANCE-WP-0004-T02 | done | — | workplans/REEF-RAILIANCE-WP-0004-exposure-grants.md |
| task | REEF-RAILIANCE-WP-0005-T01 | done | — | workplans/REEF-RAILIANCE-WP-0005-binding-and-evidence-reconciliation.md |
| task | REEF-RAILIANCE-WP-0005-T02 | done | — | workplans/REEF-RAILIANCE-WP-0005-binding-and-evidence-reconciliation.md |
| task | REEF-RAILIANCE-WP-0005-T03 | done | — | workplans/REEF-RAILIANCE-WP-0005-binding-and-evidence-reconciliation.md |

View file

@ -2,18 +2,5 @@ reef_id: reef-railiance
hosted_rails:
- rail_id: rail-kubernetes
role: primary
readiness_state: verified
contract_version: 1.0.0
evidence:
- evidence/admission/rail-kubernetes-baseline.json
- evidence/verification/rail-runtime-2026-08-21.json
notes: First-wave default execution rail; live verification still records one Ready control-plane and etcd node.
- rail_id: rail-knative
role: derived
readiness_state: verified
contract_version: 1.0.0
base_rail: rail-kubernetes
evidence:
- evidence/admission/rail-knative-baseline.json
- evidence/verification/rail-runtime-2026-08-21.json
notes: Installed and verified for private operation; production approval remains blocked by the single-node failure domain.
status: active
notes: First-wave default execution rail for the grouped Railiance home reef.

View file

@ -1,55 +1,5 @@
reef_id: reef-railiance
bound_rapps:
- rapp_id: rapp-issue-core
rail_id: rail-kubernetes
package_readiness_state: verified
readiness_state: verified
evidence:
- ../rapp-issue-core/declarations/rapp.yaml
- ../rapp-issue-core/evidence/live/2026-08-19-railiance01.json
- rapp_id: rapp-openbao
rail_id: rail-kubernetes
package_readiness_state: verified
readiness_state: verified
evidence:
- ../rapp-openbao/declarations/rapp.yaml
- ../railiance-platform/docs/rapp-openbao-boundary.md
- ../railiance-platform/docs/openbao.md
- rapp_id: rapp-qonto
rail_id: rail-knative
package_readiness_state: verified
readiness_state: verified
evidence:
- ../rapp-qonto/docs/security-and-reliability-gates.md
- ../rapp-qonto/evidence/live/2026-07-29-railiance01.json
- rapp_id: rapp-policy-nexus
rail_id: rail-kubernetes
package_readiness_state: verified
readiness_state: production-approved
evidence:
- ../rapp-policy-nexus/declarations/rapp.yaml
- ../rapp-policy-nexus/docs/runtime-contract.md
- ../rapp-policy-nexus/bindings/reef-railiance.yaml
- ../rapp-policy-nexus/evidence/live/2026-08-18-railiance01.json
- ../rapp-policy-nexus/evidence/live/2026-08-18-railiance01-release2-rollback.json
- rapp_id: rapp-postgres
rail_id: rail-kubernetes
package_readiness_state: verified
readiness_state: verified
evidence:
- ../rapp-postgres/declarations/rapp.yaml
- ../rapp-postgres/docs/evidence/node-reboot-2026-08-16.md
- ../rapp-postgres/docs/evidence/backup-restore-2026-08-13.md
- rapp_id: rapp-user-engine
rail_id: rail-kubernetes
package_readiness_state: verified
readiness_state: declared
evidence:
- ../rapp-user-engine/declarations/rapp.yaml
- ../rapp-user-engine/bindings/reef-railiance.yaml
bound_rapps: []
notes:
- Membership is the derived projection of rApp declarations whose bound_reefs includes reef-railiance; package_readiness_state is not reef binding admission.
- The Qonto binding is verified for non-production operation; production approval remains separate.
- The policy-nexus release-2 binding is deployed and verified; rollback to release 1 and forward restoration to release 2 were exercised successfully on 2026-08-18.
- User Engine remains declared at the reef binding even though its package readiness is verified.
- Add or promote bindings only when the substrate decision is explicit and source-backed.
- No grouped home-reef workload bindings are declared yet.
- Add `rapp` bindings here only when the substrate decision is explicit and source-backed.

View file

@ -8,7 +8,7 @@ criticality: high
primary_rail: rail-kubernetes
hosted_rails:
- rail-kubernetes
- rail-knative
bound_rapps: []
current_members:
- Railiance01
source_documents:
@ -22,40 +22,3 @@ compatibility_notes:
- Railiance01 is the first current member of the grouped home reef.
- Additional Railiance home servers should join this reef when they share the same substrate boundary.
- Split the grouped reef later if member lifecycle, access, or workload-placement policy diverges.
exposure:
posture: public
grants:
- port: 80
reason: Public HTTP ingress, ACME challenges, and HTTPS redirects for approved application hostnames
approved_on: "2026-08-15"
residual_risk_owner: railiance-infra
- port: 443
reason: Public TLS ingress for approved application hostnames
approved_on: "2026-08-15"
residual_risk_owner: railiance-infra
- port: 2224
reason: HostEurope Nydus provider agent required by the platform
approved_on: "2026-08-15"
residual_risk_owner: railiance-infra
- hostname: forgejo.coulomb.social
reason: Canonical git forge, OCI registry, and npm registry for the estate
approved_on: "2026-08-15"
residual_risk_owner: railiance-infra
- hostname: app.coulomb.social
reason: Public Coulomb Social web application on Railiance01
approved_on: "2026-08-15"
residual_risk_owner: railiance-apps
- hostname: reuse.coulomb.social
reason: Public federation and reuse landing surface on Railiance01
approved_on: "2026-08-15"
residual_risk_owner: railiance-apps
- hostname: vergabe-teilnahme.coulomb.social
reason: Invited Vergabe pilot with isolated demo-company path; user selected hostname
and added DNS
approved_on: '2026-09-12'
residual_risk_owner: railiance-apps
- hostname: users.coulomb.social
reason: Canonical User Engine tenant administration and onboarding portal; user
added DNS
approved_on: '2026-09-12'
residual_risk_owner: rapp-user-engine

View file

@ -3,4 +3,3 @@
- `wave-1-contract.md` — current grouped home-reef contract and boundary summary
- `source-backed-substrate-facts.md` — source-backed first-wave facts imported from S1
- `source-import-plan.md` — source material and migration direction from existing repos
- `retained-s1-handoff.md` — migration-window split between grouped reef ownership and retained S1 authority

View file

@ -1,58 +0,0 @@
# Retained S1 Handoff
## Purpose
Define the migration-window handoff between `reef-railiance` and
`railiance-infra` while grouped reef localization is still in flight.
Wave 1 makes `reef-railiance` the durable owner of the grouped Railiance
home-reef identity, topology, hosted-rail statement, and future `rapp`
bindings. `railiance-infra` remains the canonical S1 owner of raw inventory,
provisioning, hardening, and source-backed host facts that have not yet been
localized into the reef repo.
## Canonical Reef Surface
Use `reef-railiance` as the canonical home for:
- `declarations/reef.yaml`
- `substrate/identity.yaml`
- `substrate/topology.yaml`
- `bindings/rails.yaml`
- `bindings/rapps.yaml`
- repo-local grouped-boundary docs, questions, and future reef-local runbooks
New grouped-reef behavior, membership interpretation, hosted-rail stance, and
future `rapp` binding decisions should land here first.
## Retained S1 Surface
Still owned by `railiance-infra`:
- `inventory/servers.yaml` as the raw server identity source
- Terraform/cloud-init/Ansible provisioning and convergence logic
- generic OS hardening and substrate verification
- canonical S1 docs such as `docs/reef-first-wave-source-map.md`
- source-backed host facts that are still broader than the grouped home-reef
boundary
## Current Compatibility Path
Current operators do not need a flag day:
1. Continue using `railiance-infra` for server provisioning, inventory edits,
SSH/bootstrap mechanics, and raw host-fact maintenance.
2. Use `reef-railiance` for grouped home-reef identity, topology, hosted-rail
stance, and reef-local `rapp` binding decisions.
3. When a raw server fact changes, update `railiance-infra` first, then refresh
the reef-local projection only where that fact affects the grouped reef
boundary.
4. Keep unresolved grouped-membership or split criteria explicit in this repo
rather than forcing one permanent repo per server.
## Exit Condition
The migration window can end once the reef-specific interpretation no longer
depends on broader S1 docs for routine operator understanding, and the
remaining source-backed member facts needed by the grouped reef have been
localized cleanly.

View file

@ -34,19 +34,6 @@ Do not import these into `reef-railiance` as part of wave 1:
- generic Kubernetes runtime behavior
- workload packaging or platform governance
## Current Migration-Window Compatibility
During wave 1:
- `reef-railiance` is the canonical home for grouped home-reef identity,
topology, hosted-rail stance, and future `rapp` bindings
- `railiance-infra` remains the canonical owner of raw inventory, provisioning,
and broader S1 source-backed host facts
- raw host-fact changes should be made in `railiance-infra` first and then
projected here when they affect the grouped reef boundary
See `docs/retained-s1-handoff.md` for the active handoff contract.
## Rule
Imports into this repo should preserve the grouped home-reef boundary already

View file

@ -52,9 +52,6 @@ Wave 1 `reef-railiance` must not assume:
Until the extraction is complete, `railiance-infra` remains the canonical S1
source of truth.
The active migration-window compatibility rules live in
`docs/retained-s1-handoff.md`.
`reef-railiance` should become the durable grouped substrate home first. Only
then should additional bindings, runbooks, and substrate-local overlays move
here in a migration-safe sequence.

View file

@ -1,71 +0,0 @@
{
"contract_version": "1.0.0",
"reef_id": "reef-railiance",
"subject": "rail-knative",
"readiness_state": "verified",
"checked_at": "2026-08-20T23:55:06Z",
"checks": {
"compatibility": {
"status": "pass",
"evidence": [
"../rail-knative/declarations/rail.yaml",
"../rail-kubernetes/declarations/rail.yaml",
"../verification/rail-runtime-2026-08-21.json"
],
"notes": "Knative 1.22 minimum Kubernetes 1.34; observed Kubernetes 1.35.1."
},
"capacity": {
"status": "pass",
"evidence": ["../verification/rail-runtime-2026-08-21.json"],
"notes": "All Knative control-plane deployments are available; 4 CPU remains below the generic 6 CPU recommendation."
},
"ingress": {
"status": "pass",
"evidence": [
"../verification/rail-knative-v1.22.0-2026-07-26.json",
"../verification/rail-runtime-2026-08-21.json"
],
"notes": "Kourier remains ClusterIP-only; public exposure is disabled."
},
"network": {
"status": "pass",
"evidence": [
"../verification/rail-knative-v1.22.0-2026-07-26.json",
"../verification/rail-runtime-2026-08-21.json",
"../../../rapp-qonto/evidence/live/2026-07-29-railiance01.json"
]
},
"identity_and_secrets": {
"status": "pass",
"evidence": ["../../../rapp-qonto/evidence/live/2026-07-29-railiance01.json"]
},
"observability": {
"status": "pass",
"evidence": [
"../verification/rail-knative-v1.22.0-2026-07-26.json",
"../verification/rail-runtime-2026-08-21.json"
],
"notes": "Control-plane availability and lifecycle observations are recorded."
},
"recovery": {
"status": "pass",
"evidence": [
"../verification/rail-knative-v1.22.0-2026-07-26.json",
"../../../rapp-qonto/evidence/live/2026-07-29-railiance01.json"
]
},
"failure_domain": {
"status": "fail",
"evidence": ["../verification/rail-runtime-2026-08-21.json"],
"notes": "Production approval is rejected while Knative shares the single-member control plane."
}
},
"residual_risks": [
{
"risk": "Single server and shared control plane for a critical bank-connected workload",
"status": "open",
"owner": "railiance-infra",
"decision": "Not accepted for production; verified non-production rail operation may continue."
}
]
}

View file

@ -1,51 +0,0 @@
{
"contract_version": "1.0.0",
"reef_id": "reef-railiance",
"subject": "rail-kubernetes",
"readiness_state": "verified",
"checked_at": "2026-08-20T23:55:06Z",
"checks": {
"compatibility": {
"status": "pass",
"evidence": [
"declarations/reef.yaml",
"bindings/rails.yaml",
"../rail-kubernetes/declarations/rail.yaml",
"../verification/rail-runtime-2026-08-21.json"
]
},
"capacity": {
"status": "pass",
"evidence": ["../verification/rail-runtime-2026-08-21.json"],
"notes": "The only node is Ready with 4 CPU and 16377028Ki allocatable memory; production failure-domain risk remains open."
},
"ingress": {
"status": "pass",
"evidence": ["../verification/rail-runtime-2026-08-21.json"],
"notes": "Traefik is the observed ingress class."
},
"network": {
"status": "pass",
"evidence": [
"../verification/rail-runtime-2026-08-21.json",
"../../../rapp-qonto/evidence/live/2026-07-29-railiance01.json"
],
"notes": "NetworkPolicy objects are present and the Qonto binding has workload-level restricted-egress evidence."
},
"identity_and_secrets": {"status": "unknown", "evidence": []},
"observability": {"status": "unknown", "evidence": []},
"recovery": {"status": "unknown", "evidence": []},
"failure_domain": {
"status": "fail",
"evidence": ["../verification/rail-runtime-2026-08-21.json"],
"notes": "Current grouped reef has one Ready member carrying control-plane and etcd roles."
}
},
"residual_risks": [
{
"risk": "Single declared server and shared Kubernetes control plane",
"status": "open",
"owner": "railiance-infra"
}
]
}

View file

@ -1,14 +0,0 @@
{
"schema_version": "railiance.knative-preflight/v1",
"collected_at": "2026-07-26T16:30:00Z",
"status": "passed_with_risk",
"kubernetes_server_version": "v1.35.1+k3s1",
"nodes": {"total": 1, "ready": 1, "allocatable_cpu": "4", "allocatable_memory": "16377056Ki", "observed_cpu": "452m", "observed_memory": "4619Mi"},
"disk": {"size": "193G", "available": "147G", "used_percent": 25},
"ingress_classes": ["traefik"],
"storage_classes": ["local-path"],
"knative_crd_count_before_install": 0,
"secret_values_collected": false,
"risks": ["single node and shared control plane", "4 CPU is below the upstream generic one-node 6 CPU recommendation"],
"admission_effect": "allow_installation_block_production_approval"
}

View file

@ -1,12 +0,0 @@
{
"schema_version": "railiance.knative-preflight/v1",
"collected_at": "2026-07-26T11:50:08Z",
"collector": "manual invocation of railiance-cluster/tools/knative-preflight.sh precursor",
"context": "default",
"status": "unreachable",
"api_endpoint": "92.205.62.239:6443",
"error_class": "network_timeout",
"facts_collected": false,
"secret_values_collected": false,
"admission_effect": "block_installation"
}

View file

@ -1,21 +0,0 @@
{
"schema_version": "railiance.rail-verification/v1",
"collected_at": "2026-07-26T17:42:50Z",
"rail_id": "rail-knative",
"state": "verified",
"serving_version": "1.22.0",
"networking": {"implementation": "net-kourier", "version": "1.22.0", "gateway_service_type": "ClusterIP", "public_exposure": false},
"compatibility": {"kubernetes": "v1.35.1+k3s1", "knative_minimum_kubernetes": "1.34", "result": "passed"},
"checks": {
"control_plane_available": "passed",
"private_service_ready": "passed",
"scale_to_zero": {"result": "passed", "observed_seconds": 50},
"cold_activation": {"result": "passed", "observed_milliseconds": 6276},
"second_revision_ready": "passed",
"previous_revision_rollback": "passed",
"smoke_namespace_cleanup": "passed"
},
"production_approval": "blocked",
"remaining_gates": ["single-node residual-risk decision", "public ingress DNS and TLS if requested", "restricted Qonto FQDN egress", "workload identity and OpenBao delivery", "Qonto-specific failure and audit probes"],
"secret_values_collected": false
}

View file

@ -1,76 +0,0 @@
{
"schema_version": "reef-railiance.rail-runtime-evidence/v1",
"collected_at": "2026-08-20T23:55:06Z",
"collector": "reef-railiance/tools/collect_rail_runtime_evidence.sh",
"executor": "operator-ssh",
"context": "default",
"kubernetes": {
"server_version": "v1.35.1+k3s1",
"nodes": {
"total": 1,
"ready": 1,
"members": [
{
"name": "239.62.205.92.host.secureserver.net",
"roles": ["control-plane", "etcd"],
"kubelet_version": "v1.35.1+k3s1",
"allocatable": {"cpu": "4", "memory": "16377028Ki", "pods": "110"}
}
]
},
"ingress_classes": ["traefik"],
"storage_classes": ["local-path"],
"network_policy_count": 79
},
"knative": {
"deployments": [
{
"name": "activator",
"desired": 1,
"available": 1,
"images": ["gcr.io/knative-releases/knative.dev/serving/cmd/activator@sha256:8f7e9df2642a8ba715ebc55b62abee17b0984b6b6af0c6ec00dabaadf5f8cccb"]
},
{
"name": "autoscaler",
"desired": 1,
"available": 1,
"images": ["gcr.io/knative-releases/knative.dev/serving/cmd/autoscaler@sha256:ec66d97244395b57a67923d4a8c5a95f0264805f1fdb2ee0cdb49ec0f3bd7855"]
},
{
"name": "controller",
"desired": 1,
"available": 1,
"images": ["gcr.io/knative-releases/knative.dev/serving/cmd/controller@sha256:6833f2c83e9f356c274ddb2de40e5471ad2b1c08882c9bd11f5afa240e86d574"]
},
{
"name": "net-kourier-controller",
"desired": 1,
"available": 1,
"images": ["gcr.io/knative-releases/knative.dev/net-kourier/cmd/kourier@sha256:a2e8f568a4bf68ef6391bc3afea956d11a8698f6a22c4be50844b1da4f8bcc74"]
},
{
"name": "webhook",
"desired": 1,
"available": 1,
"images": ["gcr.io/knative-releases/knative.dev/serving/cmd/webhook@sha256:c505888f7ee34ccadc1b9a6877d6d49691f633ea28cf8cbe03fcfa6d3afcd584"]
}
],
"all_deployments_available": true,
"ingress": {
"implementation": "net-kourier",
"service_type": "ClusterIP",
"cluster_ip": "10.43.29.12"
},
"services": [
{
"namespace": "rapp-qonto",
"name": "rapp-qonto",
"latest_created_revision": "rapp-qonto-00008",
"latest_ready_revision": "rapp-qonto-00008",
"ready": true
}
]
},
"failure_domain": {"independent_members_observed": 1, "result": "fail-single-node"},
"secret_values_collected": false
}

View file

@ -1,91 +0,0 @@
---
id: capability.railiance.substrate-bindings
owner: reef-railiance
status: draft
domain: infotech
maturity:
discovery:
current: D3
target: D5
confidence: medium
rationale: Owner scope, neighboring responsibilities, concrete use cases and limitations
are documented; no exhaustive or generalized maturity claim.
availability:
current: A0
target: A0
confidence: medium
rationale: 'Source interface assessed 2026-10-14: Grouped home-reef identity,
topology and placement declarations. Availability describes the delivery form,
not production acceptance. Declarations are not automatic placement or authorization.'
external_evidence:
completeness:
level: C1
confidence: low
basis: Source artifacts establish a bounded capability; no independent consumer-completeness
assessment in this review.
reliability:
level: R0
confidence: low
basis: No longitudinal consumer reliability measurement established by this review.
name: Substrate topology and bindings
summary: Grouped home-reef identity, topology and placement declarations.
tags:
- security
- netkingdom
- framework-reuse
discovery:
intent: Grouped home-reef identity, topology and placement declarations
includes:
- Grouped home-reef identity, topology and placement declarations
excludes:
- Declarations are not automatic placement or authorization
use_cases:
- 'U13: Platform owner deploys and rolls back a workload with explicit substrate
and custody bindings'
- 'U14: Framework adopter validates and reuses selected contracts, tools and reference
compositions'
availability:
current_level: A0
target_level: A0
current_artifacts:
- SCOPE.md
consumption_modes:
- informational
relations:
related_to:
- capability.security.iam-tooling-suite
evidence:
documentation:
- SCOPE.md
consumer_guidance:
recommended_for:
- Platform owner deploys and rolls back a workload with explicit substrate and custody
bindings
- Framework adopter validates and reuses selected contracts, tools and reference
compositions
not_recommended_for:
- Declarations are not automatic placement or authorization
known_limitations:
- Declarations are not automatic placement or authorization
- 2026-10-14 architecture review estimates operational maturity separately; a registry
entry does not authorize execution or establish deployment.
---
# Substrate topology and bindings
Grouped home-reef identity, topology and placement declarations.
## Reuse boundary
Declarations are not automatic placement or authorization.
## Supported use cases
- U13: Platform owner deploys and rolls back a workload with explicit substrate and custody bindings
- U14: Framework adopter validates and reuses selected contracts, tools and reference compositions
## Evidence and integration
- [SCOPE.md](../../SCOPE.md)
Assessment: CUST-WP-0081, 2026-10-14. Relations identify interfaces to compose; they do not certify native integration. Existing external evidence levels are retained where present. New entries use conservative C1/R0 until consumer assessment exists.

View file

@ -1,18 +0,0 @@
version: 1
domain: infotech
capabilities:
- id: capability.railiance.substrate-bindings
name: Substrate topology and bindings
summary: Grouped home-reef identity, topology and placement declarations.
domain: infotech
status: draft
owner: reef-railiance
tags:
- security
- netkingdom
- framework-reuse
vector: D3 / A0 / C1 / R0
path: registry/capabilities/capability.railiance.substrate-bindings.md
consumption_modes:
- informational
updated: '2026-10-14'

View file

@ -1,59 +0,0 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://railiance.dev/schemas/reef-admission-evidence-v1.schema.json",
"type": "object",
"additionalProperties": false,
"required": [
"contract_version",
"reef_id",
"subject",
"readiness_state",
"checked_at",
"checks",
"residual_risks"
],
"properties": {
"contract_version": {"const": "1.0.0"},
"reef_id": {"const": "reef-railiance"},
"subject": {"type": "string", "pattern": "^(rail|rapp)-[a-z0-9-]+$"},
"readiness_state": {
"enum": ["declared", "installed", "verified", "production-approved", "deprecated"]
},
"checked_at": {"type": "string", "format": "date-time"},
"checks": {
"type": "object",
"additionalProperties": {
"type": "object",
"required": ["status", "evidence"],
"properties": {
"status": {"enum": ["pass", "fail", "unknown", "not-applicable"]},
"evidence": {"type": "array", "items": {"type": "string"}},
"notes": {"type": "string"}
}
},
"required": [
"compatibility",
"capacity",
"ingress",
"network",
"identity_and_secrets",
"observability",
"recovery",
"failure_domain"
]
},
"residual_risks": {
"type": "array",
"items": {
"type": "object",
"required": ["risk", "status", "owner"],
"properties": {
"risk": {"type": "string"},
"status": {"enum": ["open", "mitigated", "accepted"]},
"owner": {"type": "string"},
"decision": {"type": "string"}
}
}
}
}
}

View file

@ -1,33 +0,0 @@
import datetime as dt
import importlib.util
from pathlib import Path
MODULE = Path(__file__).parents[1] / "tools/check_admission_freshness.py"
spec = importlib.util.spec_from_file_location("freshness", MODULE)
freshness = importlib.util.module_from_spec(spec)
spec.loader.exec_module(freshness)
def record(state="verified", status="pass", risk="open"):
return {
"checked_at": "2026-07-26T18:00:00Z",
"readiness_state": state,
"checks": {"compatibility": {"status": status}},
"residual_risks": [{"risk": "single node", "status": risk}],
}
def test_verified_may_retain_explicit_open_risk():
now = dt.datetime(2026, 7, 26, 19, tzinfo=dt.timezone.utc)
assert freshness.assess(record(), now, 24) == []
def test_production_approval_fails_closed():
now = dt.datetime(2026, 7, 26, 19, tzinfo=dt.timezone.utc)
failures = freshness.assess(record("production-approved", "unknown"), now, 24)
assert len(failures) == 2
def test_stale_evidence_fails():
now = dt.datetime(2026, 7, 28, 19, tzinfo=dt.timezone.utc)
assert "evidence is stale" in freshness.assess(record(), now, 24)

View file

@ -1,65 +0,0 @@
import importlib.util
from pathlib import Path
import yaml
MODULE = Path(__file__).parents[1] / "tools/check_binding_projection.py"
SPEC = importlib.util.spec_from_file_location("binding_projection", MODULE)
binding_projection = importlib.util.module_from_spec(SPEC)
SPEC.loader.exec_module(binding_projection)
def write_yaml(path: Path, value: dict) -> None:
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(yaml.safe_dump(value, sort_keys=False), encoding="utf-8")
def test_matching_projection_passes(tmp_path):
repo = tmp_path / "reef-example"
write_yaml(
repo / "declarations/reef.yaml",
{"reef_id": "reef-example", "hosted_rails": ["rail-kubernetes"]},
)
write_yaml(
repo / "bindings/rails.yaml",
{"hosted_rails": [{"rail_id": "rail-kubernetes"}]},
)
write_yaml(
repo / "bindings/rapps.yaml",
{"bound_rapps": [{"rapp_id": "rapp-example"}]},
)
write_yaml(
tmp_path / "rail-kubernetes/declarations/rail.yaml",
{"rail_id": "rail-kubernetes"},
)
write_yaml(
tmp_path / "rapp-example/declarations/rapp.yaml",
{"rapp_id": "rapp-example", "bound_reefs": ["reef-example"]},
)
assert binding_projection.assess(repo, tmp_path) == []
def test_stale_rapp_projection_fails(tmp_path):
repo = tmp_path / "reef-example"
write_yaml(
repo / "declarations/reef.yaml",
{"reef_id": "reef-example", "hosted_rails": ["rail-kubernetes"]},
)
write_yaml(
repo / "bindings/rails.yaml",
{"hosted_rails": [{"rail_id": "rail-kubernetes"}]},
)
write_yaml(repo / "bindings/rapps.yaml", {"bound_rapps": []})
write_yaml(
tmp_path / "rail-kubernetes/declarations/rail.yaml",
{"rail_id": "rail-kubernetes"},
)
write_yaml(
tmp_path / "rapp-example/declarations/rapp.yaml",
{"rapp_id": "rapp-example", "bound_reefs": ["reef-example"]},
)
failures = binding_projection.assess(repo, tmp_path)
assert failures and "rapp projection differs" in failures[0]

View file

@ -1,45 +0,0 @@
#!/usr/bin/env python3
"""Fail closed when reef admission evidence is stale or over-promoted."""
import argparse
import datetime as dt
import json
from pathlib import Path
def assess(record: dict, now: dt.datetime, max_age_hours: int) -> list[str]:
failures = []
checked = dt.datetime.fromisoformat(record["checked_at"].replace("Z", "+00:00"))
if now - checked > dt.timedelta(hours=max_age_hours):
failures.append("evidence is stale")
if checked > now + dt.timedelta(minutes=5):
failures.append("checked_at is in the future")
if record["readiness_state"] == "production-approved":
bad = [
name
for name, check in record["checks"].items()
if check["status"] != "pass"
]
if bad:
failures.append("production approval has non-passing checks: " + ", ".join(bad))
open_risks = [
risk["risk"] for risk in record["residual_risks"] if risk["status"] == "open"
]
if open_risks:
failures.append("production approval has open residual risks")
return failures
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("evidence", type=Path)
parser.add_argument("--max-age-hours", type=int, default=24)
args = parser.parse_args()
record = json.loads(args.evidence.read_text())
failures = assess(record, dt.datetime.now(dt.timezone.utc), args.max_age_hours)
print(json.dumps({"evidence": str(args.evidence), "pass": not failures, "failures": failures}))
return bool(failures)
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -1,86 +0,0 @@
#!/usr/bin/env python3
"""Check reef binding files against authoritative sibling declarations."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import yaml
def load_yaml(path: Path) -> dict:
value = yaml.safe_load(path.read_text(encoding="utf-8"))
if not isinstance(value, dict):
raise ValueError(f"{path}: expected a YAML mapping")
return value
def ids(items: object, key: str) -> set[str]:
if not isinstance(items, list):
return set()
return {
item[key]
for item in items
if isinstance(item, dict) and isinstance(item.get(key), str)
}
def expected_rapps(parent: Path, reef_id: str) -> set[str]:
result: set[str] = set()
for declaration_path in sorted(parent.glob("rapp-*/declarations/rapp.yaml")):
declaration = load_yaml(declaration_path)
if reef_id in declaration.get("bound_reefs", []):
result.add(str(declaration["rapp_id"]))
return result
def expected_rails(parent: Path, declared: list[str]) -> set[str]:
result: set[str] = set()
for rail_id in declared:
declaration_path = parent / rail_id / "declarations" / "rail.yaml"
declaration = load_yaml(declaration_path)
result.add(str(declaration["rail_id"]))
return result
def assess(repo: Path, parent: Path) -> list[str]:
reef = load_yaml(repo / "declarations" / "reef.yaml")
reef_id = str(reef["reef_id"])
rapp_bindings = load_yaml(repo / "bindings" / "rapps.yaml")
rail_bindings = load_yaml(repo / "bindings" / "rails.yaml")
actual_rapps = ids(rapp_bindings.get("bound_rapps"), "rapp_id")
derived_rapps = expected_rapps(parent, reef_id)
actual_rails = ids(rail_bindings.get("hosted_rails"), "rail_id")
derived_rails = expected_rails(parent, list(reef.get("hosted_rails", [])))
failures: list[str] = []
if actual_rapps != derived_rapps:
failures.append(
f"rapp projection differs: binding={sorted(actual_rapps)}, "
f"derived={sorted(derived_rapps)}"
)
if actual_rails != derived_rails:
failures.append(
f"rail projection differs: binding={sorted(actual_rails)}, "
f"declared={sorted(derived_rails)}"
)
return failures
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--repo", type=Path, default=Path(__file__).parents[1])
parser.add_argument("--parent", type=Path)
args = parser.parse_args()
repo = args.repo.resolve()
parent = (args.parent or repo.parent).resolve()
failures = assess(repo, parent)
print(json.dumps({"pass": not failures, "failures": failures}))
return bool(failures)
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -1,85 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
# Read-only, secret-free evidence collector for the rails hosted by this reef.
# The cluster API is intentionally reached through the operator SSH path; 6443
# remains non-public. Override only when the approved executor name changes.
remote_host="${RAIL_RUNTIME_HOST:-railiance01}"
ssh -o BatchMode=yes "$remote_host" 'bash -s' <<'REMOTE'
set -euo pipefail
context="$(kubectl config current-context)"
server_version="$(kubectl version -o json | jq -r '.serverVersion.gitVersion')"
nodes="$(kubectl get nodes -o json)"
knative_deployments="$(kubectl -n knative-serving get deployments -o json)"
kourier_service="$(kubectl -n kourier-system get service kourier -o json)"
knative_services="$(kubectl get ksvc -A -o json)"
ingress_classes="$(kubectl get ingressclass -o json)"
storage_classes="$(kubectl get storageclass -o json)"
network_policy_count="$(kubectl get networkpolicy -A -o json | jq '.items | length')"
jq -n \
--arg context "$context" \
--arg server_version "$server_version" \
--argjson nodes "$nodes" \
--argjson deployments "$knative_deployments" \
--argjson kourier "$kourier_service" \
--argjson services "$knative_services" \
--argjson ingress_classes "$ingress_classes" \
--argjson storage_classes "$storage_classes" \
--argjson network_policy_count "$network_policy_count" \
'{
schema_version: "reef-railiance.rail-runtime-evidence/v1",
collected_at: (now | todateiso8601),
collector: "reef-railiance/tools/collect_rail_runtime_evidence.sh",
executor: "operator-ssh",
context: $context,
kubernetes: {
server_version: $server_version,
nodes: {
total: ($nodes.items | length),
ready: ([$nodes.items[] | select(any(.status.conditions[]; .type == "Ready" and .status == "True"))] | length),
members: [$nodes.items[] | {
name: .metadata.name,
roles: ([.metadata.labels | keys[] | select(startswith("node-role.kubernetes.io/")) | split("/")[1]] | sort),
kubelet_version: .status.nodeInfo.kubeletVersion,
allocatable: {
cpu: .status.allocatable.cpu,
memory: .status.allocatable.memory,
pods: .status.allocatable.pods
}
}]
},
ingress_classes: [$ingress_classes.items[].metadata.name] | sort,
storage_classes: [$storage_classes.items[].metadata.name] | sort,
network_policy_count: $network_policy_count
},
knative: {
deployments: [$deployments.items[] | {
name: .metadata.name,
desired: (.spec.replicas // 0),
available: (.status.availableReplicas // 0),
images: [.spec.template.spec.containers[].image]
}] | sort_by(.name),
all_deployments_available: (all($deployments.items[]; (.status.availableReplicas // 0) >= (.spec.replicas // 0))),
ingress: {
implementation: "net-kourier",
service_type: $kourier.spec.type,
cluster_ip: $kourier.spec.clusterIP
},
services: [$services.items[] | {
namespace: .metadata.namespace,
name: .metadata.name,
latest_created_revision: .status.latestCreatedRevisionName,
latest_ready_revision: .status.latestReadyRevisionName,
ready: (any(.status.conditions[]?; .type == "Ready" and .status == "True"))
}] | sort_by(.namespace, .name)
},
failure_domain: {
independent_members_observed: ($nodes.items | length),
result: (if ($nodes.items | length) > 1 then "requires-source-backed-review" else "fail-single-node" end)
},
secret_values_collected: false
}'
REMOTE

View file

@ -1,30 +0,0 @@
---
id: REEF-RAILIANCE-WP-ADHOC-2026-09-12
type: workplan
title: "Record the admitted demo and portal hostnames"
domain: financials
repo: reef-railiance
status: finished
owner: the-custodian
topic_slug: railiance
created: "2026-09-12"
updated: "2026-09-12"
state_hub_workstream_id: "2572b6c8-64c5-588d-b0df-7344c7a55582"
---
## Record the two operator-selected application exposure grants
```task
id: REEF-RAILIANCE-WP-ADHOC-2026-09-12-T01
status: done
priority: medium
state_hub_task_id: "d0a26193-10ed-5c73-b4a9-41c660949f16"
```
The operator added A records for vergabe-teilnahme.coulomb.social and
users.coulomb.social to 92.205.62.239. Authoritative and recursive DNS agree;
both exact certificates are Ready. Record hostname grants under the existing
public 80/443 substrate admission, with railiance-apps and rapp-user-engine as
application owners. No new substrate ports or firewall grants are introduced.
RAPPS-WP-0014, RAPP-USER-ENGINE-WP-0002 and VERGABE-WP-0019 retain runtime,
operator verification and product welcome/identity/recovery work.

View file

@ -4,16 +4,11 @@ type: workplan
title: "Bootstrap reef-railiance and import the wave-1 grouped substrate surface"
domain: financials
repo: reef-railiance
status: finished
status: active
owner: codex
topic_slug: railiance
created: "2026-07-26"
updated: "2026-08-21"
quality_dod: DoD-Ok
quality_dod_at: "2026-08-21"
quality_dod_by: codex
quality_dod_note: "Retrospective assessment: all four tasks are done, the grouped boundary and handoff remain current, and repository checks pass."
state_hub_workstream_id: "da64c718-68bf-4719-aa42-fcf26687ab23"
updated: "2026-07-26"
---
# REEF-RAILIANCE-WP-0001 - Bootstrap reef-railiance and import the wave-1 grouped substrate surface
@ -41,7 +36,6 @@ It must not:
id: REEF-RAILIANCE-WP-0001-T01
status: done
priority: high
state_hub_task_id: "c7f85080-527c-48ec-bffc-0bb045b08a62"
```
Create the baseline repo files, the initial reef declaration, and the first
@ -62,7 +56,6 @@ wave-1 contract summary.
id: REEF-RAILIANCE-WP-0001-T02
status: done
priority: high
state_hub_task_id: "acb010ad-a430-414c-8f63-06b13cdc00f7"
```
Bring the reviewed first grouped-substrate fact set into this repo in a
@ -83,9 +76,8 @@ and the operational substrate evidence from ADR-004.
```task
id: REEF-RAILIANCE-WP-0001-T03
status: done
status: wait
priority: medium
state_hub_task_id: "c6365200-9e2b-4299-9464-0620d94aad2a"
```
Define the thin compatibility path that keeps current operators functional
@ -97,21 +89,12 @@ Acceptance:
- current operators do not need a flag day
- the retained S1 surface stays narrow and temporary
2026-07-26: Added `docs/retained-s1-handoff.md` to define the migration-window
split with `railiance-infra`. `reef-railiance` is now the canonical home for
the grouped home-reef identity, topology, hosted-rail stance, and future
`rapp` bindings, while `railiance-infra` retains raw inventory, provisioning,
and broader S1 source-backed host facts. `README.md`, `docs/README.md`,
`docs/wave-1-contract.md`, `docs/source-import-plan.md`, and `SCOPE.md` now
point operators at the explicit no-flag-day handoff.
## T04 - Register `reef-railiance` in State Hub and Fabric
```task
id: REEF-RAILIANCE-WP-0001-T04
status: done
status: wait
priority: medium
state_hub_task_id: "21b7e7e9-1cb5-412b-88f1-f8e1a4689576"
```
Register the repo from classification and add it to the Fabric repository
@ -122,14 +105,3 @@ Acceptance:
- State Hub recognizes the repo and its workplan
- Fabric recognizes the repo as `repo_family: reef`
- ownership, primary-rail, and substrate-kind metadata are visible
2026-07-26: Registered `reef-railiance` in State Hub from
`.repo-classification.yaml`, generated `.custodian-brief.md` and
`WORK-RECORDS.md`, reconciled the local grouped-reef bootstrap with the
existing remote `main`, and pushed the clean history to
`forgejo-remote:coulomb/reef-railiance.git`. Added the repo to
`railiance-fabric/registry/railiance-repos.yaml` and ran a targeted live
registry sync against `http://127.0.0.1:8765`. Fabric now stores
`reef-railiance` as a registered repo with `repo_family: reef`,
`ownership_repo: railiance-infra`, `primary_rail: rail-kubernetes`,
`substrate_kind: server-group`, and snapshot `id: 97`.

View file

@ -1,133 +0,0 @@
---
id: REEF-RAILIANCE-WP-0002
type: workplan
title: "Admit rail-knative and rapp-qonto with production evidence"
domain: financials
repo: reef-railiance
status: finished
owner: codex
topic_slug: railiance
created: "2026-07-26"
updated: "2026-08-21"
quality_dod: DoD-Ok
quality_dod_at: "2026-08-21"
quality_dod_by: codex
quality_dod_note: "Retrospective assessment: completed and cancelled work is explicit, Qonto residual work transferred to WP-0003, and rail evidence checks pass."
state_hub_workstream_id: "5b31c13e-ddc9-495f-8325-88fa770982c5"
---
# REEF-RAILIANCE-WP-0002 - Knative and Qonto production admission
## Goal
Host a derived `rail-knative` slice while keeping `rail-kubernetes` primary,
and bind `rapp-qonto` only through explicit readiness evidence.
## T01 - Publish the admission schema and baseline
```task
id: REEF-RAILIANCE-WP-0002-T01
status: done
priority: high
state_hub_task_id: "a20cc59f-bb93-4d1b-bf46-0d67c2270b98"
```
Add declared, installed, verified, production-approved, and deprecated states
plus source-linked evidence requirements.
2026-07-26: Added the admission schema and a baseline record for the existing
Kubernetes rail. The baseline intentionally records unresolved capacity,
recovery, and failure-domain evidence rather than inferring it from topology.
## T02 - Collect the Knative substrate baseline
```task
id: REEF-RAILIANCE-WP-0002-T02
status: done
priority: high
state_hub_task_id: "833f6246-23bc-43ac-802d-7595b18f77a2"
```
Collect Kubernetes version, capacity/headroom, ingress, DNS/TLS, network,
identity/secret delivery, observability, backup/restore, and maintenance
evidence before installation.
2026-07-26: The first read-only probe reached the configured context but the
API endpoint timed out. Recorded machine-readable failure evidence and kept
installation blocked. `railiance-cluster` now owns a reusable preflight probe
and the access/install workplan.
2026-07-26: Server-side preflight passed after the upgrade. Kubernetes is
v1.35.1 and the Ready node has 4 CPU/16 GiB. The below-recommendation CPU count
and single-node topology remain explicit production risks.
## T03 - Install and verify the derived rail
```task
id: REEF-RAILIANCE-WP-0002-T03
status: done
priority: high
state_hub_task_id: "ff070df6-8ffa-40e6-bbaa-2dcff20f64f2"
```
Install only after the baseline matches the derived rail prerequisites. Record
versioned smoke and rollback evidence.
Blocked by failed API reachability preflight; no install was attempted.
2026-07-26: Installed and verified checksum-locked Serving and Kourier
v1.22.0. Scale-to-zero, cold activation, revision creation, private routing,
and previous-revision rollback passed. Public exposure remains disabled.
## T04 - Bind and verify rapp-qonto
```task
id: REEF-RAILIANCE-WP-0002-T04
status: cancel
priority: high
state_hub_task_id: "485e757b-6519-4f2e-a678-d66ef14206f5"
```
Add the binding at `declared`, then promote it only from machine-readable
identity, egress, cold-start, audit, revocation, rollback, and dependency
failure evidence.
2026-07-26: Added topology-only declared bindings for `rail-knative` and
`rapp-qonto`. Baseline evidence keeps unmeasured runtime checks `unknown`; no
installed, verified, or production-approved state is claimed.
2026-07-26: The declared binding is retained without false promotion. Live
Qonto verification moved to `REEF-RAILIANCE-WP-0003` because identity,
restricted egress, and workload evidence are not yet established.
## T05 - Decide production residual risk
```task
id: REEF-RAILIANCE-WP-0002-T05
status: done
priority: high
state_hub_task_id: "f1ac627d-1ec8-445b-acd9-a65eeb068d3c"
```
Reserve human interaction for explicit acceptance or mitigation of the
single-server/shared-control-plane failure domain. Automated evidence must be
complete first.
Decision: do not accept the current failure domain for production. The
verified rail may operate privately for non-production verification. Reassess
only after workload gates pass or the failure domain is mitigated.
## T06 - Automate evidence freshness and drift
```task
id: REEF-RAILIANCE-WP-0002-T06
status: done
priority: medium
state_hub_task_id: "82685f27-575e-4956-8c46-433a2ab2b9ea"
```
Make probes idempotent and suitable for scheduled reconciliation. Expired or
failed evidence must prevent false production-ready state.
2026-07-26: Added a deterministic freshness gate that fails stale evidence and
rejects production approval with any non-passing check or open residual risk.

View file

@ -1,161 +0,0 @@
---
id: REEF-RAILIANCE-WP-0003
type: workplan
title: "Complete rapp-qonto production gates"
domain: financials
repo: reef-railiance
status: blocked
flavor: implementation
owner: codex
topic_slug: railiance
created: "2026-07-26"
updated: "2026-10-03"
related:
- RCLUSTER-WP-0007
- RMASTER-WP-0023
- ADR-0006
- ADR-0008
state_hub_workstream_id: "8ac413ad-2f57-53e6-b586-c5bec9cfbd1f"
---
# REEF-RAILIANCE-WP-0003 - rapp-qonto production gates
This reef records the `rapp-qonto` binding and refuses
`production-approved` without ADR-0006 evidence. It does not implement
HA (`RCLUSTER-WP-0007`), Knative packaging (`rapp-qonto`), or public
listeners. Production approval does not make Qonto public (ADR-0008).
New binds stay `private`. Exposure grants for already-public surfaces
are `REEF-RAILIANCE-WP-0004`, not this file.
## T01 - Verify workload identity and secret delivery
```task
id: REEF-RAILIANCE-WP-0003-T01
status: done
priority: high
state_hub_task_id: "de8a8e05-93f9-4082-bbb0-5b522179421d"
```
Establish the `rapp-qonto` identity and OpenBao-backed ExternalSecret lane
without exposing credential values.
2026-07-27: Live topology invalidated the original Kubernetes-auth design:
Coulombcore OpenBao cannot validate railiance01 service-account tokens. The
failed objects were removed. The revised, explicitly approved ops-mason plan
`rapp-qonto-openbao-approle-bridge` reuses the existing exact-scope Qonto
policy and establishes a transitional AppRole bridge with 15-minute tokens,
30-minute maximum TTL, eight uses, and a revocable bootstrap identity held by
ESO. Live metadata-only verification reports
`ClusterSecretStore/openbao-rapp-qonto` `Valid`,
`ExternalSecret/rapp-qonto` `SecretSynced`, and exactly two keys in the
derived Secret. No credential value was exposed. Same-cluster Kubernetes auth
remains the migration target.
## T02 - Enforce restricted Qonto egress
```task
id: REEF-RAILIANCE-WP-0003-T02
status: done
priority: high
state_hub_task_id: "2a6742f1-6fcf-4164-b885-a7a9ea39521d"
```
Implement and verify FQDN-aware policy or a controlled egress proxy. Do not
substitute unrestricted HTTPS.
2026-07-27: Implemented a pinned Canonical Squid controlled-proxy candidate
that permits `CONNECT` only to exact host `thirdparty.qonto.com:443`, with
private-address exclusions and namespace/pod isolation policies. Repository
tests and Kubernetes server-side validation passed. Live probes did not:
allowlisted proxy access returned `000`, non-allowlisted access returned
`000`, and direct Qonto HTTPS unexpectedly succeeded despite namespace
default-deny. The candidate was removed from the live cluster and is not
included by the runtime Kustomization. T02 remains `progress` until
railiance01 NetworkPolicy enforcement is repaired and the three-way probe
proves allowlisted success, other-host denial, and direct-bypass denial.
2026-07-27 follow-up: Host firewall-chain tracing showed NetworkPolicy does
enforce after kube-router creates the per-pod chain; the failed immediate
probe exposed an asynchronous startup window rather than a disabled
controller. The runtime now uses an immutable curl init container as a
fail-closed startup gate. It retries until its own pod proves Qonto proxy
access (`CONNECT 200`), other-host proxy denial (`CONNECT 403`), and direct
Qonto denial. Knative init-container support is enabled and source-controlled
in `railiance-cluster`. Live disposable-pod evidence reported `gate=passed`
before `application=admitted`. The proxy bundle is now part of the active
runtime Kustomization and T02 is complete.
## T03 - Deploy and verify rapp-qonto
```task
id: REEF-RAILIANCE-WP-0003-T03
status: done
priority: high
state_hub_task_id: "ddf25c7b-23b0-4e67-8881-5d29fa71e9ad"
```
After T01 and T02, verify cold start, audit, revocation, dependency failure,
idempotency, and previous-revision rollback using machine-readable evidence.
2026-07-27: The first application revision is live and ready as
`rapp-qonto-00004`; its egress admission gate completed and `/v1/health`
passed through the cluster-local Knative service. Full failure, revocation,
idempotency, timing, and rollback evidence is still required before T03 can
close.
2026-07-29: The reversible `rapp-qonto/tools/verify_live.sh` gate produced
machine-readable, secret-free evidence for scale-to-zero, 7.384443-second cold
activation, repeat health, ExternalSecret readiness, fail-closed dependency
loss, recovery, missing-secret denial, secret restoration, previous-revision
rollback, and latest-traffic restoration. The `qonto-assistant` owner suite
passes 80 tests covering domain-level audit, idempotency, authorization, and
redaction behavior. The reef binding is now `verified`, not
`production-approved`.
## T04 - Reassess production failure-domain risk
```task
id: REEF-RAILIANCE-WP-0003-T04
status: wait
needs_human: true
decision_id: 2fd5849c-240e-4d0a-bf07-5ebf8dfce3fd
blocking_reason: "Production approval requires mitigation or explicit acceptance of the single-node/shared-control-plane risk."
priority: high
state_hub_task_id: "9d792070-5f2b-5b3d-ba52-92c8b0d4a6b8"
```
Production approval requires mitigation or explicit acceptance of the
single-node/shared-control-plane risk after all automated workload gates pass.
2026-07-30 reassessment: the reef still exposes exactly one Ready Kubernetes
node (`239.62.205.92.host.secureserver.net`). All workload-level gates are
green, but no node or control-plane failure domain has been added. This is a
real infrastructure availability risk, not stale task bookkeeping. The
workplan is therefore `blocked` until either a second independent failure
domain is implemented and drilled or the founder explicitly accepts
single-node production availability risk for Qonto. The current binding
remains accurately `verified`, not `production-approved`.
2026-08-08 alignment: live inspection still reports one Ready node, which also
owns the control-plane and etcd roles. `railiance-cluster/RCLUSTER-WP-0007` now
owns the required three-server embedded-etcd topology, source-backed
node-to-reef failure-domain map, and machine-readable one-server-loss S2
drill. `state-hub/CUST-WP-0038` is a downstream stateful consumer and does not
substitute for the Qonto gate. After the S2 drill passes, T04 closes only when
the Qonto live verification is rerun with fresh evidence while Railiance01 is
absent, proving the service path, restricted egress, identity/secret delivery,
dependency behavior, and restoration on the surviving cluster. The alternate
closure remains explicit founder acceptance of the single-node production
availability risk.
2026-08-21 evidence refresh: the read-only reef collector still observes one
Ready Kubernetes node carrying both control-plane and etcd roles. All five
Knative control-plane deployments and `rapp-qonto-00008` are Ready, and Kourier
remains ClusterIP-only. `RCLUSTER-WP-0007` is still backlog, so this is fresh
evidence for retaining the block, not grounds for production promotion.
This repo only updates `bindings/rapps.yaml` when those conditions hold.
Do not implement the three-node topology here. Do not add an exposure
grant for Qonto as a side effect of `production-approved`.
2026-10-03: human gate routed to hub decision 2fd5849c-240e-4d0a-bf07-5ebf8dfce3fd (D5: Production risk acceptance and live-host authorizations) by CUST-WP-0075; resolving that decision raises C-40 here.

View file

@ -1,94 +0,0 @@
---
id: REEF-RAILIANCE-WP-0004
type: workplan
title: "File exposure grants; keep new binds private"
domain: financials
repo: reef-railiance
status: finished
owner: codex
topic_slug: railiance
created: "2026-08-15"
updated: "2026-08-21"
quality_dod: DoD-Ok
quality_dod_at: "2026-08-21"
quality_dod_by: codex
quality_dod_note: "Both tasks are done; declaration validation, tests, owner routing, and State Hub reconciliation passed."
related:
- RMASTER-WP-0023
- ADR-0008
- REEF-RAILIANCE-WP-0003
state_hub_workstream_id: "dff82d6f-11d5-466e-93ce-c9503ec43838"
---
# REEF-RAILIANCE-WP-0004 — exposure grants
Intake from `RMASTER-WP-0023-T05`. Snapshot:
`railiance-master/docs/evidence/reef-railiance-exposure-snapshot-2026-08-15.md`.
## Goal
First live admission of the family rule. New binds stay `private` (or
`operator` only for a named admin path). Existing public surfaces get
named grants. Do not take down Forgejo, Coulomb Social, reuse-surface,
or Nydus. Do not re-public `6443`. Qonto stays private even if WP-0003
later writes `production-approved`.
## T01 — Add reef exposure grants
```task
id: REEF-RAILIANCE-WP-0004-T01
status: done
priority: high
state_hub_task_id: "52d14311-b1be-4d11-aa75-86042b8ba72b"
```
Add `exposure` to `declarations/reef.yaml` with substrate grants for the
80/443 DNS/Ingress surface and Nydus `2224`. Residual-risk owners as in
the snapshot.
**Done when:** the declaration validates and names those surfaces.
Completed 2026-08-18. `declarations/reef.yaml` now records the already-live
80/443 ingress surface and the Nydus 2224 exception with dated grants and
residual-risk ownership. The stale hand-maintained `bound_rapps` projection was
removed; the family validator derives it from rApp declarations.
## T02 — Route rapp grants
```task
id: REEF-RAILIANCE-WP-0004-T02
status: done
priority: medium
state_hub_task_id: "02dadeaf-8d51-4199-9f54-5d704555b20d"
```
File or request grants on the owning declarations for
`forgejo.coulomb.social`, `app.coulomb.social`, and
`reuse.coulomb.social`. Layer repos may hold residual-risk ownership
until the rapps exist.
**Done when:** each snapshot hostname has a grant home.
Completed 2026-08-21. The three pre-existing snapshot hostnames now have exact,
dated grants in `declarations/reef.yaml`, which is their living substrate and
public-DNS grant home while their family rApps do not yet exist. Residual-risk
ownership remains with `railiance-infra` for `forgejo.coulomb.social` and with
`railiance-apps` for `app.coulomb.social` and `reuse.coulomb.social`, matching
the source snapshot. When those workloads gain `rapp-*` declarations, each
public rApp must also carry its own binding grant before the reef-level grants
can be treated as sufficient for that family declaration.
The handoff is routed to `railiance-infra` in State Hub message
`2438f29d-f9e0-4e58-bbbe-cd8445a7ae14` and to `railiance-apps` in message
`85f0a3c7-306c-4a58-ab3b-9c847d3b11b1`.
The separately approved `policy.coulomb.social` grant already has its family
home in `rapp-policy-nexus`, and its production binding is recorded in
`bindings/rapps.yaml`.
## Outcome
Finished 2026-08-21. Every public surface in the 2026-08-15 snapshot now has a
living, source-backed grant: ports 80, 443, and 2224 plus the exact Forgejo,
Coulomb Social, and reuse hostnames. New bindings remain private by default,
and no grant was added for port 6443 or Qonto.

View file

@ -1,90 +0,0 @@
---
id: REEF-RAILIANCE-WP-0005
type: workplan
title: "Reconcile reef bindings and refresh rail evidence"
domain: financials
repo: reef-railiance
status: finished
owner: codex
topic_slug: railiance
created: "2026-08-21"
updated: "2026-08-21"
quality_dod: DoD-Ok
quality_dod_at: "2026-08-21"
quality_dod_by: codex
quality_dod_note: "Binding projections match family declarations, live rail evidence is fresh, tests pass, and the Qonto production block remains explicit."
related:
- REEF-RAILIANCE-WP-0002
- REEF-RAILIANCE-WP-0003
- ADR-0006
- ADR-0007
state_hub_workstream_id: "99e8e93b-99a0-4ef6-91d7-e4f155fa7ee9"
---
# REEF-RAILIANCE-WP-0005 — binding and evidence reconciliation
## Goal
Remove drift between the reef-local binding surfaces, family declarations,
and current secret-free runtime evidence without promoting any workload beyond
its proven reef admission state.
## T01 — Refresh hosted-rail evidence
```task
id: REEF-RAILIANCE-WP-0005-T01
status: done
priority: high
state_hub_task_id: "bebf85e7-db0a-41f1-9ad3-a7e184a6249c"
```
Add a repeatable operator-SSH collector, capture fresh Kubernetes and Knative
runtime evidence, and reconcile both hosted rails to `verified`.
Completed 2026-08-21. The collector observed Kubernetes v1.35.1+k3s1, one of
one nodes Ready, all five Knative control-plane deployments available, Kourier
as ClusterIP, and the Qonto Knative Service Ready. No Secret resources or
values were read. The one-node control-plane/etcd failure-domain check remains
failed, so neither the rail nor Qonto gained production approval.
## T02 — Reconcile the rApp binding projection
```task
id: REEF-RAILIANCE-WP-0005-T02
status: done
priority: high
state_hub_task_id: "88fb7abe-6b85-4cae-bd0b-d6d7c4a5deaa"
```
Project every family rApp whose declaration names `reef-railiance`, while
keeping package readiness distinct from reef binding admission. Add a check
that fails when the local relation files diverge from sibling declarations.
Completed 2026-08-21. `bindings/rapps.yaml` now covers `rapp-issue-core`,
`rapp-openbao`, `rapp-policy-nexus`, `rapp-postgres`, `rapp-qonto`, and
`rapp-user-engine`. Only Policy Nexus is `production-approved`; Qonto remains
`verified`, and User Engine remains `declared` at the reef binding.
## T03 — Close documentation and quality drift
```task
id: REEF-RAILIANCE-WP-0005-T03
status: done
priority: medium
state_hub_task_id: "923647a0-1010-4023-8f2f-9e69c9f0b8e1"
```
Correct the renamed ThreePhoenix dependency, state the current blocker in the
orientation docs, and retrospectively assess the completed WP-0001 and WP-0002
records against the current workplan Definition of Done.
Completed 2026-08-21. References now use `RCLUSTER-WP-0007`; the README and
scope state the fresh single-node result; WP-0001 and WP-0002 are DoD-Ok.
## Outcome
The reef-local relationship files are current and mechanically checked. Rail
evidence is fresh and secret-free. `REEF-RAILIANCE-WP-0003` remains correctly
blocked until ThreePhoenix produces independent-failure-domain evidence and
Qonto is reverified during loss of Railiance01, or the founder explicitly
accepts the single-node availability risk.