railiance-platform/tenancy.yaml
codex 913c03d6ec
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Fix apps-pg tenancy evidence declaration
Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a02e56-e4ad-71a2-b3e2-b6193e0d8093
2026-08-23 13:21:42 +02:00

132 lines
5 KiB
YAML

# Canonical vector set for services owned or held in custody here.
# Human reasoning remains in docs/tenancy-posture.md.
schema_version: "0.1"
framework: netkingdom-tenancy-posture
services:
- service: apps-pg
role: relational-storage-provider
tenancy:
current: { I: 0, A: 0, E: 0, P: "n/a", R: 2, V: 1 }
target: { I: 0, A: 0, E: 0, P: "n/a", R: 2, V: 1 }
reviewed: "2026-08-20"
review_due: "2027-02-17"
service_class: interactive
permanent: [I, A, E, P]
reason:
I: "The storage provider receives credentials, not tenant claims."
A: "No tenant context is bound at the database provider."
E: "Tenant enforcement belongs to each consuming application."
P: "apps-pg provides P1; a substrate is not itself at a P level."
R: "Continuous WAL and a completed base backup use the governed
30-day object-store path; a scratch restore recovered both
consumer databases on 2026-08-20."
V: "A separate scratch Cluster restored Ready in 56 seconds; this is
single-node recovery evidence, not HA or failover."
evidence:
R2:
- "docs/evidence/RPF-WP-0019-backup-restore-2026-08-20.md"
V1:
- "docs/evidence/RPF-WP-0019-backup-restore-2026-08-20.md"
provider:
capability: data.relational
profile: s5-application-databases
axes:
E:
available: 2
maximum: 3
conditions:
- "E2 is entirely consumer-side."
- "E3 requires adoption of the rapp-postgres GUC contract."
- "E4 is unreachable on a shared cluster without per-tenant credentials."
P:
available: 1
maximum: 2
conditions:
- "P2 requires a new dedicated cluster for the consumer."
evidence:
- "docs/evidence/RPF-WP-0019-isolation-2026-08-20.md"
R:
available: 2
maximum: 2
evidence:
- "docs/evidence/RPF-WP-0019-backup-restore-2026-08-20.md"
V:
available: 1
maximum: 1
conditions:
- "V1 is single-node recovery only; no HA or failover is claimed."
evidence:
- "docs/evidence/RPF-WP-0019-backup-restore-2026-08-20.md"
- service: forgejo-db
role: relational-storage-provider
tenancy:
current: { I: 0, A: 0, E: 0, P: "n/a", R: 0, V: 0 }
target: { I: 0, A: 0, E: 0, P: "n/a", R: 2, V: 1 }
reviewed: "2026-08-17"
review_due: "2027-02-17"
service_class: interactive
permanent: [I, A, E, P]
reason:
I: "The database receives a Forgejo credential, not tenant claims."
A: "No NetKingdom tenant context is bound at this provider."
E: "Tenant enforcement, if any, belongs to Forgejo."
P: "forgejo-db provides P2 to Forgejo; it is not itself at P2."
R: "A backup procedure exists, but no declared retention or erasure horizon does."
V: "No exercised recovery objective or failover evidence exists."
gap:
R: "Declare the backup window and publish the effective erasure horizon."
V: "Exercise recovery and record the interruption."
provider:
capability: data.relational
profile: dedicated-forgejo-database
axes:
P:
available: 2
maximum: 2
R:
available: 0
maximum: 2
conditions:
- "Declare and evidence retention on the existing backup path."
V:
available: 0
maximum: 1
conditions:
- "Single-node recovery must be exercised."
- service: openbao
role: credential-provider
tenancy:
current: { I: 0, A: 0, E: 0, P: 0, R: 0, V: 0 }
target: { I: 0, A: 0, E: 0, P: 0, R: 1, V: 1 }
reviewed: "2026-08-17"
review_due: "2027-02-17"
service_class: latency-critical
permanent: [I, A, E, P]
reason:
I: "OpenBao authenticates workloads and does not resolve NetKingdom tenants."
A: "No tenant context is carried or bound."
E: "OpenBao holds workload secrets, not tenant-keyed records."
P: "One instance is shared by every credential consumer."
R: "No retention position covers audit output or KV version history."
V: "Node recovery requires operator unseal; no recovery objective is evidenced."
gap:
R: "Declare the platform default for audit output and KV history."
V: "Exercise the complete restart and unseal path against a recovery objective."
provider:
capability: credential.vending
axes:
E:
available: 0
maximum: 4
conditions:
- "Per-tenant paths, roles and credentials are required for tenant-level E4."
- "Current evidence proves consumer-boundary scoping, not tenant-boundary scoping."
evidence:
- "scripts/openbao-verify-token-grants.py"
V:
available: 0
maximum: 1
conditions:
- "Single-node restart and unseal recovery must be exercised."