railiance-master/workplans/RMASTER-WP-0019-knative-qonto-runtime-on-reef-railiance.md
codex 4864b7852d chore: use RMASTER-WP prefix for master workplans
Rename RAILIANCE-WP-0017..0021 to RMASTER-WP-* so railiance-master
IDs no longer collide with railiance-platform's RAILIANCE-WP series.
Hub UUIDs are unchanged.
2026-08-14 14:29:18 +02:00

472 lines
18 KiB
Markdown

---
id: RMASTER-WP-0019
type: workplan
title: "Knative Qonto Runtime on reef-railiance"
domain: financials
repo: railiance-master
status: finished
owner: codex
topic_slug: railiance
planning_priority: high
planning_order: 19
created: "2026-07-26"
updated: "2026-07-29"
related_repos:
- railiance-master
- qonto-assistant
- key-cape
- rail-kubernetes
- reef-railiance
- railiance-platform
- railiance-fabric
state_hub_workstream_id: "d2b082db-ecc3-4322-8be3-22aa00a2af5c"
---
# RMASTER-WP-0019 - Knative Qonto Runtime on reef-railiance
## Goal
Turn the Qonto internet-runtime direction into an explicit second-wave
Railiance repo-family plan: `reef-railiance` hosts a new `rail-knative`, and
that rail dynamically runs a new `rapp-qonto` package extracted from the
current `qonto-assistant` deployment path.
This workplan exists to replace the remaining "custom activator or maybe
Knative" ambiguity with a concrete cross-repo architecture path before new
runtime implementation starts.
The second-wave design also establishes a general rule for reliable and
cost-efficient operation: deterministic work should progress from attended
human operation, to agent-executable interaction, to idempotent functional
automation as its contract stabilizes. Human interaction remains appropriate
for irreducible policy acceptance and privileged authority, not for repeated
evidence collection or routine reconciliation.
## Why This Exists
`RMASTER-WP-0018` finished the first wave:
- `rail-kubernetes` exists as the default base rail
- `reef-railiance` exists as the grouped home reef for the Railiance servers
- `rapp-openbao` proved the first managed package split
- Fabric can now project `governed_by`, `supports_rail`, `hosts_rail`, and
`binds_rapp`
The next concrete runtime pressure comes from `QONTO-WP-0004`. That workload
needs internet reachability, bounded cold-start behavior, strong identity, and
strict secret custody. Those are exactly the conditions that justify a second
rail instead of extending the direct `rail-kubernetes` path indefinitely.
At the same time, `KEY-WP-0004` is provisioning the first tenant and workload
identity lane for Binky Hedgehog GmbH. That lane should target the future
runtime package and not harden a permanent direct deployment shape that the
framework now intends to replace.
## Current Starting Point
The current ecosystem state is:
- `reef-railiance` is the grouped reef for the Railiance server fleet
- `rail-kubernetes` owns the current baseline deployment and lifecycle contract
- `qonto-assistant` already contains the Qonto domain code, hardening work, and
an initial direct Kubernetes placement request
- `key-cape` has `KEY-WP-0004` open for the Binky tenant and qonto workload
identity lane
- no `rail-knative` repo exists yet
- no `rapp-qonto` repo exists yet
## Target Outcome
When this workplan is complete:
1. The boundary between `rail-kubernetes` and a new derived `rail-knative` is
written and approved.
2. The boundary between `qonto-assistant` and a future `rapp-qonto` is written
and approved.
3. `reef-railiance` is confirmed as the first host reef for this runtime path,
including the rail/reef binding assumptions.
4. Identity, secret, and routing lanes are aligned to the future
`rapp-qonto` runtime instead of a permanent direct `qonto-assistant`
deployment.
5. Repo-local follow-up workplans can launch `rail-knative` and `rapp-qonto`
without reopening the architecture question.
6. Reef admission, contract compatibility, credential routing, and operational
evidence have automation-ready contracts before production implementation.
## Boundaries
This workplan may define architecture, sequencing, and repo-boundary contracts
across Railiance, `qonto-assistant`, and `key-cape`.
It must not:
- bootstrap `rail-knative` yet
- bootstrap `rapp-qonto` yet
- move code or manifests between repos
- implement runtime changes in `reef-railiance`, `rail-kubernetes`,
`qonto-assistant`, or `key-cape`
Implementation starts only after the follow-up workplans opened from this plan
are reviewed and accepted.
## Tasks
## T01 - Define the `rail-knative` boundary against `rail-kubernetes`
```task
id: RMASTER-WP-0019-T01
status: done
priority: high
state_hub_task_id: "336cb298-9107-4519-ad64-5b23853c84fa"
```
Write the contract for what `rail-knative` must own versus what remains owned
by `rail-kubernetes`.
At minimum this boundary must decide ownership for:
- scale-to-zero and cold-start semantics
- service activation / ingress entry behavior
- Knative Serving primitives versus generic Railiance lifecycle semantics
- compatibility expectations for `reef-railiance`
- what stays reusable from the base Kubernetes rail instead of being forked
Acceptance:
- one written boundary contract exists
- the contract names explicit non-goals for `rail-knative`
- the split does not duplicate the generic lifecycle contract already owned by
`rail-kubernetes`
2026-07-26: Added `docs/rail-composition-contract.md` and
`docs/adr/ADR-0005-derived-rail-composition.md`. `rail-knative` is now a
derived rail with a versioned `rail-kubernetes` base contract. The contract
defines inheritance, overrides, non-goals, readiness states, and a rail-neutral
workload/binding model.
## T02 - Define the `rapp-qonto` extraction boundary from `qonto-assistant`
```task
id: RMASTER-WP-0019-T02
status: done
priority: high
state_hub_task_id: "54fcea7d-3c4e-444f-b184-f18f3c4b3a7c"
```
Write the contract for what moves into `rapp-qonto` and what stays in
`qonto-assistant`.
This task must keep `qonto-assistant` as the ownership home for the Qonto
domain logic while using `rapp-qonto` as the managed runtime/package boundary.
At minimum the contract must decide ownership for:
- deployment packaging and runtime manifests
- runtime configuration and secret references
- smoke, rollout, rollback, and promotion expectations
- how the current direct Kubernetes material becomes migration input rather
than a permanent target shape
Acceptance:
- one written boundary contract exists
- `qonto-assistant` remains the ownership repo in the contract
- `rapp-qonto` is justified as a managed package repo and not as a new
ownership mirror
2026-07-26: Added the ownership and request-flow boundary in
`docs/qonto-knative-runtime-contract.md`. `qonto-assistant` retains domain
logic, financial policy, authorization integration, and application audit
events. `rapp-qonto` owns packaging, rail bindings, runtime configuration,
secret references, and workload-specific rollout evidence.
## T03 - Define the `reef-railiance` hosting model for the qonto runtime
```task
id: RMASTER-WP-0019-T03
status: done
priority: high
state_hub_task_id: "b0233f06-3dee-4cac-bae4-d8add5ac29c8"
```
Confirm how `reef-railiance` hosts the first `rail-knative` runtime slice and
what that means for ingress, isolation, and criticality.
This task must decide:
- whether the qonto path lives entirely on `reef-railiance` in wave 2
- how `rail-knative` is declared as a hosted rail there
- whether a primary-rail versus mixed-rail statement needs revision
- what existing S1/S2 approvals or substrate notes must be updated before
runtime work starts
Acceptance:
- the hosting assumption is written
- the reef/rail relation update path is named
- unresolved substrate risks are listed instead of buried in repo-local work
2026-07-26: Added `docs/reef-production-readiness-contract.md` and
`docs/adr/ADR-0006-reef-production-admission.md`. `reef-railiance` may host
`rail-knative` during wave 2 while keeping `rail-kubernetes` primary, but
topology no longer implies readiness. Critical Qonto admission requires
capacity, ingress, identity, isolation, observability, recovery, and explicit
single-server/shared-control-plane risk evidence.
## T04 - Align identity and secret custody to the future runtime path
```task
id: RMASTER-WP-0019-T04
status: done
priority: high
state_hub_task_id: "0086eb68-a852-4fe7-834c-4a19dd763b77"
```
Align `KEY-WP-0004`, the OpenBao lane, and the ops-warden routing lane so the
credential path terminates at the future `rapp-qonto` runtime on
`rail-knative`, while still allowing a clearly temporary migration bridge from
the current `qonto-assistant` repo.
Acceptance:
- the future runtime principal and lane names are defined
- the transitional use of any current `qonto-assistant` runtime role is
explicitly marked temporary
- no workplan still assumes a permanent direct deployment target for the lane
2026-07-26: `docs/qonto-knative-runtime-contract.md` defines steady identifiers
for `rapp-qonto`, its service account, OpenBao role, and caller client while
making any `qonto-assistant` role a time-bounded bridge. Credential values must
use sanctioned custody and execution transports; only route and conformance
metadata may enter workplans, Git, chat, or State Hub.
## T05 - Define second-wave bootstrap and Fabric registration sequence
```task
id: RMASTER-WP-0019-T05
status: done
priority: medium
state_hub_task_id: "8905d447-dee9-460d-bbfe-3f0c8e42c7c6"
```
Define the repo-creation and registration sequence for `rail-knative` and
`rapp-qonto`, using the first-wave bootstrap contract already proven by
`RMASTER-WP-0018`.
Acceptance:
- the bootstrap order is named
- the minimum declaration files are named for both future repos
- the expected Fabric relations (`supports_rail`, `hosts_rail`, `binds_rapp`,
`governed_by`) are named before repo creation starts
Bootstrap order:
1. publish the common contract/schema additions in `rail-kubernetes`
2. add readiness and compatibility support in Fabric
3. open the `reef-railiance` admission work and collect baseline evidence
4. bootstrap `rail-knative` with a derived-rail declaration
5. bootstrap `rapp-qonto` with common and Knative binding declarations
6. register `governed_by`, `base_rail`, `supports_rail`, `hosts_rail`, and
`binds_rapp` relations
7. promote relations through `declared`, `installed`, `verified`, and
`production-approved` only as evidence lands
The minimum declaration files remain `declarations/rail.yaml`,
`declarations/rapp.yaml`, and `declarations/reef.yaml`. Rail-neutral workload
and rail-binding schemas must be source-controlled before repo creation is
treated as implementation completion.
## T06 - Open the repo-local follow-up workplans for implementation
```task
id: RMASTER-WP-0019-T06
status: done
priority: medium
state_hub_task_id: "18fe6f04-f8c5-451b-8e3f-38c19f05f682"
```
Once the boundary and sequencing documents exist, open or update the concrete
repo-local implementation workplans that will execute them.
At minimum, this should cover:
- `qonto-assistant`
- `key-cape`
- `reef-railiance`
- the future `rail-knative` repo at bootstrap time
- the future `rapp-qonto` repo at bootstrap time
Acceptance:
- each implementation-owning repo has a concrete follow-up workplan
- no implementation starts from an unwritten architecture assumption
- this framework workplan can later close with repo-local execution delegated
2026-07-26: Architecture is ready for repo-local workplan creation. Workplans
must separate source-repo, package, derived-rail, reef admission, Fabric
compatibility, identity/custody, and S2 runtime installation responsibilities.
2026-07-26: Opened and State Hub registered repo-local execution work in
`rail-kubernetes`, `rail-knative`, `rapp-qonto`, `reef-railiance`,
`railiance-fabric`, `qonto-assistant`, and `key-cape`. The two new repos were
reconciled with their existing Forgejo bootstrap commits and pushed.
## T07 - Version the rail-neutral workload and compatibility contract
```task
id: RMASTER-WP-0019-T07
status: done
priority: high
state_hub_task_id: "5b5f2d41-2860-44ee-a8b6-8b9e1d32854f"
```
Turn the composition decision into source-controlled schemas and conformance
checks.
Acceptance:
- workload declarations separate common facts from rail bindings
- base and derived rails declare contract versions and compatibility
- validation rejects missing owners, incompatible base rails, and unsupported
substrate capabilities
- Kubernetes remains the default binding for platform workloads
2026-07-26: `rail-kubernetes` now publishes base contract `1.0.0`, common
workload, rail-binding, and derived-rail schemas, a Kubernetes-default example,
and an offline validator. `rail-knative` and `rapp-qonto` pass that validator.
## T08 - Establish reef admission evidence and mixed-rail split triggers
```task
id: RMASTER-WP-0019-T08
status: done
priority: high
state_hub_task_id: "663a319e-2a05-4a35-90a2-4f6b7b5afa22"
```
Implement the production-readiness states and evidence model in
`reef-railiance` and Fabric.
Acceptance:
- topology is distinct from installed, verified, and production-approved state
- capacity, ingress, network, identity, observability, recovery, and failure
domain evidence have machine-readable locations
- Qonto's single-server/shared-control-plane residual risk is explicit
- mixed-rail split triggers are represented
2026-07-26: Added a reusable, secret-free substrate preflight in
`railiance-cluster` and recorded the failed API reachability result as reef
evidence with `block_installation`. Declared topology was not promoted.
2026-07-26: After the server upgrade, the server-side preflight and complete
Knative lifecycle verification passed. Reef evidence now distinguishes the
verified rail from blocked production approval and retains capacity and
single-node split triggers.
## T09 - Establish Qonto SLO, threat, rollback, and fallback evidence
```task
id: RMASTER-WP-0019-T09
status: done
priority: high
state_hub_task_id: "6cc2d3a7-33b6-47a7-b59d-04be9318c861"
```
Turn `docs/qonto-knative-runtime-contract.md` into executable package and
source-repo verification.
Acceptance:
- cold start, request timeout, buffering, concurrency, and scale-down values
are measured before production approval
- retry and idempotency behavior is explicit for financial operations
- public ingress and raw service exposure boundaries are testable
- egress is narrower than unrestricted HTTPS or has an approved exception
- rollback prefers a verified Knative revision; direct Kubernetes fallback is
time-bounded and exceptional
2026-07-26: `rapp-qonto` now has offline-validated, cluster-local,
digest-pinned, bounded Knative packaging with scale-to-zero, default-deny
networking, ExternalSecret references, and an explicit unverified FQDN egress
gate. Live SLO, identity, failure, and rollback evidence remains outstanding.
2026-07-27: Deployed digest-addressed revision `rapp-qonto-00004` on
rail-knative. The fail-closed proxy gate and cluster-local health smoke pass.
Full cold-start timing, audit/idempotency, revocation, dependency-failure, and
previous-revision rollback evidence remains before T09 completion.
2026-07-29: `rapp-qonto/tools/verify_live.sh` now records reversible,
machine-readable live evidence. The successful railiance01 run measured a
7.384443-second cold activation from zero and proved bounded repeat requests,
metadata-only secret delivery, fail-closed proxy loss, recovery,
missing-secret denial and restoration, previous-revision rollback, and return
to latest traffic. The owner repository's 80-test suite supplies the
domain-level audit, idempotency, authorization, and redaction evidence.
## T10 - Automate routing, conformance, reconciliation, and evidence
```task
id: RMASTER-WP-0019-T10
status: done
priority: high
state_hub_task_id: "1b75308f-f968-4443-aefe-af37550545a1"
```
Move repeatable operation toward reliable functional automation while
preserving least privilege and explicit risk authority.
Acceptance:
- `warden plan` and route lookup cover implementation credential needs before
any founder interaction is proposed
- agents use sanctioned `--exec`, `--out`, or wrapped transports rather than
reading secret values
- conformance checks are idempotent and suitable for CI or scheduled execution
- Fabric/State Hub reconciliation consumes source declarations and evidence
- human steps are limited to named authority or residual-risk decisions and
have an automation follow-up path
2026-07-26: Generic Knative and Qonto conformance is executable offline. The
cluster preflight is idempotent and read-only. Credential routing was attempted
first; its unrelated Forgejo match is tracked as a catalog-quality gap rather
than used for Kubernetes access.
2026-07-26: The cluster now has checksum-locked, idempotent Serving/Kourier
installation and live verification automation. The configured SSH lane
provides agent execution while direct public API access remains unnecessary.
2026-07-27: KeyCape client credentials are live, their OpenBao custody and
rotation route is published as `rapp-qonto-keycape-client`, and the M3/prod
posture manifest passes. Public `kc.coulomb.social` DNS still targets the
older CoulombCore endpoint; railiance01 verification currently uses direct
TLS-preserving resolution pending routing convergence.
2026-07-29: Credential needs are routed before access, installation and
verification use sanctioned SSH execution without secret output, and the live
gate is idempotent, reversible, and emits secret-free JSON suitable for CI or
scheduled reconciliation. Source declarations and reef bindings now consume
the verified evidence. The only remaining human authority is the explicitly
separate production acceptance or mitigation of single-node failure-domain
risk.
## Exit Criteria
- [x] `rail-knative` has a written boundary against `rail-kubernetes`
- [x] `rapp-qonto` has a written boundary against `qonto-assistant`
- [x] `reef-railiance` is explicitly named as the first host reef
- [x] identity and secret custody point at the future runtime path
- [x] derived-rail composition and non-duplication are decided
- [x] reef readiness and mixed-rail split rules are decided
- [x] Qonto end-to-end failure, rollback, and security boundaries are written
- [x] common and rail-binding schemas are implemented
- [x] repo-local implementation workplans are registered and active
- [x] conformance and credential-routing paths are agent-executable
- [x] second-wave repo bootstrap order is defined
- [x] repo-local implementation workplans exist before implementation begins
## Notes
This is a second-wave framework plan. It should stay at the planning and
coordination layer until the relevant repo-local workplans are in place.