Define Qonto Knative runtime handoff
This commit is contained in:
parent
632966eaea
commit
a8a3f7dc25
3 changed files with 173 additions and 30 deletions
|
|
@ -36,6 +36,7 @@
|
||||||
| task | QONTO-WP-0004-T02 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T02 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
| task | QONTO-WP-0004-T03 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T03 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
| task | QONTO-WP-0004-T04 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T04 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
| task | QONTO-WP-0004-T05 | todo | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T05 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
| task | QONTO-WP-0004-T06 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T06 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
| task | QONTO-WP-0004-T07 | todo | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
| task | QONTO-WP-0004-T07 | todo | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
|
| task | QONTO-WP-0004-T08 | done | — | workplans/QONTO-WP-0004-security-hardening-and-scale-to-zero.md |
|
||||||
|
|
|
||||||
78
docs/knative-runtime-and-rapp-handoff.md
Normal file
78
docs/knative-runtime-and-rapp-handoff.md
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
# Knative Runtime And `rapp-qonto` Handoff
|
||||||
|
|
||||||
|
Date: 2026-07-26
|
||||||
|
|
||||||
|
## Ownership Boundary
|
||||||
|
|
||||||
|
`qonto-assistant` keeps:
|
||||||
|
|
||||||
|
- Qonto API domain behavior
|
||||||
|
- default-deny, no-spend/no-volume-cost policy
|
||||||
|
- tenant and actor authorization integration
|
||||||
|
- application audit events and deny-escalation behavior
|
||||||
|
- request idempotency behavior for financial operations
|
||||||
|
- application health semantics
|
||||||
|
|
||||||
|
`rapp-qonto` receives:
|
||||||
|
|
||||||
|
- runtime image and configuration binding
|
||||||
|
- Knative Service and rail-binding manifests
|
||||||
|
- service account and secret references
|
||||||
|
- workload-specific network policy
|
||||||
|
- rollout, smoke, rollback, and revocation checks
|
||||||
|
- measured cold-start and scale-down evidence
|
||||||
|
|
||||||
|
`rail-knative` owns:
|
||||||
|
|
||||||
|
- request activation and buffering
|
||||||
|
- Knative revisions and traffic routing
|
||||||
|
- scale-to-zero, minimum scale, concurrency, and autoscaling semantics
|
||||||
|
- bounded cold-start behavior
|
||||||
|
- rail-specific revision rollback
|
||||||
|
|
||||||
|
The current `deploy/k8s/qonto-assistant/` tree and `railiance/app.toml` are
|
||||||
|
migration input. They must not continue growing as an unreviewed parallel
|
||||||
|
production target.
|
||||||
|
|
||||||
|
## Application-Side Runtime Contract
|
||||||
|
|
||||||
|
- Caller authentication and coarse authorization happen before activation
|
||||||
|
whenever the entry architecture permits it.
|
||||||
|
- The raw application port is never publicly exposed.
|
||||||
|
- Workload readiness must include policy and dependency readiness, not merely a
|
||||||
|
listening socket.
|
||||||
|
- The runtime fails closed when identity, authorization, or the OpenBao
|
||||||
|
credential lane is unavailable.
|
||||||
|
- Financial requests carry an idempotency key across cold start, retry, and
|
||||||
|
reconnect.
|
||||||
|
- A caller timeout does not assert that an upstream financial operation was
|
||||||
|
never attempted.
|
||||||
|
- Application audit context survives activation and upstream failure.
|
||||||
|
|
||||||
|
## Identity And Credential Boundary
|
||||||
|
|
||||||
|
Steady-state names target the package:
|
||||||
|
|
||||||
|
- service account and workload principal: `rapp-qonto`
|
||||||
|
- OpenBao workload role: `rapp-qonto`
|
||||||
|
- caller client: `rapp-qonto-client`
|
||||||
|
- bank credential reference: `tenants/binky/qonto-api`
|
||||||
|
|
||||||
|
Any role named for `qonto-assistant` is a time-bounded migration bridge.
|
||||||
|
Secret values never appear in manifests, workplans, logs, State Hub, or agent
|
||||||
|
output. Credential planning uses `warden plan`; use uses sanctioned execution,
|
||||||
|
file-output, or wrapped transports.
|
||||||
|
|
||||||
|
## Evidence Required Before Production Approval
|
||||||
|
|
||||||
|
- measured cold start, request timeout, concurrency, and idle scale-down
|
||||||
|
- unauthenticated, wrong-tenant, and denied-capability negative tests
|
||||||
|
- retry/idempotency test across activation
|
||||||
|
- positive and negative OpenBao access
|
||||||
|
- Qonto-only egress enforcement or a recorded compensating exception
|
||||||
|
- audit delivery and credential revocation
|
||||||
|
- previous-revision rollback
|
||||||
|
- failure behavior for identity, authorization, OpenBao, and Qonto outages
|
||||||
|
|
||||||
|
Direct Kubernetes deployment is an exceptional, expiring fallback rather than
|
||||||
|
a parallel steady state.
|
||||||
|
|
@ -1,24 +1,33 @@
|
||||||
---
|
---
|
||||||
id: QONTO-WP-0004
|
id: QONTO-WP-0004
|
||||||
type: workplan
|
type: workplan
|
||||||
title: "Security hardening and scale-to-zero facade for internet exposure"
|
title: "Security hardening and Knative runtime path for internet exposure"
|
||||||
domain: infotech
|
domain: infotech
|
||||||
repo: qonto-assistant
|
repo: qonto-assistant
|
||||||
status: active
|
status: active
|
||||||
owner: claude
|
owner: claude
|
||||||
topic_slug: the-custodian
|
topic_slug: the-custodian
|
||||||
created: "2026-07-23"
|
created: "2026-07-23"
|
||||||
updated: "2026-07-23"
|
updated: "2026-07-26"
|
||||||
state_hub_workstream_id: "81a476ac-06d5-4e98-a2ed-1518b16863aa"
|
state_hub_workstream_id: "81a476ac-06d5-4e98-a2ed-1518b16863aa"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Security hardening and scale-to-zero facade for internet exposure
|
# Security hardening and Knative runtime path for internet exposure
|
||||||
|
|
||||||
Implements `docs/SecurityPractice.md`, written ahead of deploying
|
Implements `docs/SecurityPractice.md`, written ahead of deploying
|
||||||
`qonto-assistant` to `railiance01`. This is the first fleet service that
|
`qonto-assistant` to the Railiance runtime fleet. This is the first fleet
|
||||||
must be reachable by clients outside the cluster (laptop-based agent
|
service that must be reachable by clients outside the cluster
|
||||||
harness sessions) while holding a real company bank credential — a risk
|
(laptop-based agent harness sessions) while holding a real company bank
|
||||||
class above every other agent-facing service shipped so far.
|
credential — a risk class above every other agent-facing service shipped so
|
||||||
|
far.
|
||||||
|
|
||||||
|
The intended runtime direction is now explicit: use `reef-railiance`,
|
||||||
|
establish a new `rail-knative`, and dynamically run a future `rapp-qonto`
|
||||||
|
package on that rail. This repo remains the current ownership home for the
|
||||||
|
Qonto domain code and the place where the security contract is first made
|
||||||
|
concrete, but the remaining deployment-oriented work in this plan should
|
||||||
|
feed that repo-family path rather than extend a permanent direct
|
||||||
|
`qonto-assistant` deployment target.
|
||||||
|
|
||||||
Some of this workplan's scope depends on systems this repo does not own
|
Some of this workplan's scope depends on systems this repo does not own
|
||||||
(`key-cape`, `flex-auth`, `tenant-engine`, Railiance placement). Those
|
(`key-cape`, `flex-auth`, `tenant-engine`, Railiance placement). Those
|
||||||
|
|
@ -26,6 +35,13 @@ dependencies are tracked explicitly per task rather than assumed away; the
|
||||||
`kings-guard`-owned portion is tracked as a separate intake against
|
`kings-guard`-owned portion is tracked as a separate intake against
|
||||||
`KG-WP-0002`, not duplicated here.
|
`KG-WP-0002`, not duplicated here.
|
||||||
|
|
||||||
|
As of Sunday, July 26, 2026, the cross-repo framework direction for that path
|
||||||
|
is tracked in
|
||||||
|
`railiance-master/workplans/RAILIANCE-WP-0019-knative-qonto-runtime-on-reef-railiance.md`.
|
||||||
|
Tasks already marked `done` below remain valid as ownership-repo hardening and
|
||||||
|
migration input; the remaining open tasks are now about handing the runtime
|
||||||
|
path into `reef-railiance`, `rail-knative`, and `rapp-qonto`.
|
||||||
|
|
||||||
## Task: Security Genome record and audit-stream review
|
## Task: Security Genome record and audit-stream review
|
||||||
|
|
||||||
```task
|
```task
|
||||||
|
|
@ -136,36 +152,45 @@ pass) and a real `tenant-engine` instance seeded with a `VEN` grant for
|
||||||
both live processes over real HTTP — `allow` for the correct tenant,
|
both live processes over real HTTP — `allow` for the correct tenant,
|
||||||
`live_authz_denied` for a mismatched one. 28 new unit tests.
|
`live_authz_denied` for a mismatched one. 28 new unit tests.
|
||||||
|
|
||||||
## Task: Facade / scale-to-zero activator — design and reference implementation
|
## Task: Define the `rail-knative` internet-facing runtime contract
|
||||||
|
|
||||||
```task
|
```task
|
||||||
id: QONTO-WP-0004-T05
|
id: QONTO-WP-0004-T05
|
||||||
status: todo
|
status: done
|
||||||
priority: high
|
priority: high
|
||||||
state_hub_task_id: "e8a87292-488d-4871-be3e-59a5b6a38694"
|
state_hub_task_id: "e8a87292-488d-4871-be3e-59a5b6a38694"
|
||||||
```
|
```
|
||||||
|
|
||||||
Per `docs/SecurityPractice.md` §2/§6: a thin, always-on facade is the only
|
Per `docs/SecurityPractice.md` §2/§6, the internet-facing wake path must
|
||||||
internet-facing component. It authenticates (key-cape) and authorizes
|
authenticate and authorize *before* waking the real service, and the backend
|
||||||
(flex-auth pre-check) *before* waking the real service, then scales the
|
must still scale back to zero when idle. Under the new framework direction,
|
||||||
backend `Deployment` 0→1, waits on `/v1/health`, proxies through, and scales
|
this repo should no longer assume a custom in-repo facade or a permanent direct
|
||||||
back to 0 after an idle timeout. `qonto-assistant`'s raw REST/MCP port must
|
`Deployment` target. The default plan is now a new `rail-knative` hosted by
|
||||||
never be bound to a publicly-reachable address in any deployment.
|
`reef-railiance`, with this repo describing the app-side contract that rail
|
||||||
|
must satisfy.
|
||||||
|
|
||||||
Check whether the target `railiance01` cluster already runs Knative Serving
|
This task should define, from `qonto-assistant`'s point of view:
|
||||||
before building a custom activator — if it does, this task becomes
|
|
||||||
integration (Knative Service manifest + autoscaling annotations) rather
|
|
||||||
than new code. If not, scope a minimal reference implementation (one
|
|
||||||
Service, one Deployment, one wake/idle controller) sized to this repo's
|
|
||||||
narrow surface, not a general-purpose PaaS.
|
|
||||||
|
|
||||||
**Depends on:** a decision on where this component lives (this repo,
|
- the pre-wake authn/authz behavior the rail must guarantee
|
||||||
Railiance, or a new dedicated repo) and Railiance cluster capabilities
|
- the cold-start and idle-scale semantics the package path depends on
|
||||||
(Knative or not) — flag both as open questions rather than assuming.
|
- which behavior belongs in `rail-knative` versus the future `rapp-qonto`
|
||||||
|
package versus this ownership repo
|
||||||
|
- which parts of `docs/SecurityPractice.md` need rewriting now that the target
|
||||||
|
runtime path is explicit
|
||||||
|
|
||||||
Done when: an unauthenticated request never triggers a backend wake; an
|
**Depends on:** `RAILIANCE-WP-0019` defining the cross-repo architecture
|
||||||
authenticated+authorized request gets proxied through after a bounded
|
boundary, plus the future `rail-knative` bootstrap work that will follow from
|
||||||
cold-start; the backend scales back to 0 after the configured idle window.
|
it.
|
||||||
|
|
||||||
|
Done when: the required runtime contract is written clearly enough that future
|
||||||
|
`rail-knative` and `rapp-qonto` implementation work can start without
|
||||||
|
reopening the security model, and no new direct-deployment assumption is left
|
||||||
|
as the default target.
|
||||||
|
|
||||||
|
**2026-07-26:** Added `docs/knative-runtime-and-rapp-handoff.md`. It defines
|
||||||
|
pre-wake controls, cold-start/idempotency/failure behavior, raw-port exposure,
|
||||||
|
identity and credential boundaries, and the evidence required before
|
||||||
|
production approval.
|
||||||
|
|
||||||
## Task: Isolation placement request to Railiance
|
## Task: Isolation placement request to Railiance
|
||||||
|
|
||||||
|
|
@ -202,6 +227,44 @@ tier (I1 vs I2) is Railiance's scheduling call once the manifests are
|
||||||
reviewed; whether the facade (T05) co-locates in this namespace is assumed
|
reviewed; whether the facade (T05) co-locates in this namespace is assumed
|
||||||
in `networkpolicy.yaml` but not yet decided.
|
in `networkpolicy.yaml` but not yet decided.
|
||||||
|
|
||||||
|
**2026-07-26 direction update:** this direct Kubernetes placement package now
|
||||||
|
serves as migration input and isolation evidence rather than the intended final
|
||||||
|
runtime topology. Future implementation should treat these manifests, the CCR,
|
||||||
|
and the staged-promotion contract as baseline material to be re-homed into the
|
||||||
|
`reef-railiance` + `rail-knative` + `rapp-qonto` path, not as the long-term
|
||||||
|
deployment target of this repo.
|
||||||
|
|
||||||
|
## Task: Plan the `rapp-qonto` extraction and runtime handoff
|
||||||
|
|
||||||
|
```task
|
||||||
|
id: QONTO-WP-0004-T08
|
||||||
|
status: done
|
||||||
|
priority: high
|
||||||
|
state_hub_task_id: "e265cce1-df09-48ca-a0fd-f38897c44b4c"
|
||||||
|
```
|
||||||
|
|
||||||
|
Define how the current `qonto-assistant` deployment-oriented material hands off
|
||||||
|
into a future `rapp-qonto` package repo while preserving this repo as the
|
||||||
|
ownership home for the Qonto domain logic.
|
||||||
|
|
||||||
|
At minimum, this task must name:
|
||||||
|
|
||||||
|
- what stays in `qonto-assistant`
|
||||||
|
- what becomes package/runtime content in `rapp-qonto`
|
||||||
|
- how `KEY-WP-0004`'s workload-identity lane and the OpenBao secret lane bind
|
||||||
|
to the future runtime principal
|
||||||
|
- which current files are migration input only and must stop growing in place
|
||||||
|
|
||||||
|
Done when: the extraction and handoff boundary is written; the dependency on
|
||||||
|
`RAILIANCE-WP-0019` is explicit; and no new direct
|
||||||
|
`deploy/k8s/qonto-assistant` implementation starts without an explicit
|
||||||
|
exception note.
|
||||||
|
|
||||||
|
**2026-07-26:** The handoff document now assigns domain behavior and application
|
||||||
|
policy to this repo, package/runtime assets to `rapp-qonto`, and generic
|
||||||
|
activation/revision behavior to `rail-knative`. Existing direct Kubernetes
|
||||||
|
assets are explicitly migration input.
|
||||||
|
|
||||||
## Task: Closure review
|
## Task: Closure review
|
||||||
|
|
||||||
```task
|
```task
|
||||||
|
|
@ -211,6 +274,7 @@ priority: low
|
||||||
state_hub_task_id: "2a2da206-d182-4a72-aea4-56e58ae74c76"
|
state_hub_task_id: "2a2da206-d182-4a72-aea4-56e58ae74c76"
|
||||||
```
|
```
|
||||||
|
|
||||||
Close when T03–T06 land or are explicitly deferred with a recorded reason.
|
Close when T03–T06 and T08 land or are explicitly deferred with a recorded
|
||||||
T01/T02 already shipped without waiting on external dependencies. Run
|
reason. T01/T02 already shipped without waiting on external dependencies, and
|
||||||
|
T06 now counts as migration input rather than the final runtime shape. Run
|
||||||
`statehub fix-consistency`.
|
`statehub fix-consistency`.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue