# 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." 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."