Refine AUDIT-WP-0008 open tasks against draft-8.
The framework moved from draft-5 to draft-8 while this workplan ran. No finding was reversed, but three things changed underneath it: R moved to 2 once rapp-postgres declared the window, a sixth axis V (availability) appeared, and the implemented-versus-evidenced distinction became a schema field. T03 reduces: the confirmation-oracle finding landed as Decision 4.5.3 and question 11 is marked framework-resolved, so no amendment remains -- only our own position document. The legal question routes to risk-nexus rather than the-custodian, per §19.11 and policy-nexus INTENT. T06 reduces to confirmation: all five findings were adopted and the two stale status lines it was going to flag are already fixed. T07 is new. V1 needs critical dependencies enumerated, restart recovery exercised and recovery time measured. The 2026-08-16 reboot walk observed ~40s of unreadiness but is not an exercise and does not enumerate the dependency set. T08 is new and covers two defects in our own declaration. provider.R.available quotes a 30-day horizon we do not solely control -- at P1 the horizon is the instance maximum across co-residents. And under Decision 6.1, user-engine was never told what we declared, which makes the declaration drift rather than a completed change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
0511801f67
commit
4d5d989344
5 changed files with 150 additions and 60 deletions
93
tenancy.yaml
93
tenancy.yaml
|
|
@ -1,22 +1,29 @@
|
|||
# audit-core tenancy posture
|
||||
#
|
||||
# Declared per NetKingdom Tenancy Posture v0.1 (draft-7),
|
||||
# Declared per NetKingdom Tenancy Posture v0.1 (draft-8),
|
||||
# net-kingdom/canon/standards/tenancy-posture_v0.1.md.
|
||||
# Location and schema per Decision 5.4; per-path detail per Decision 5.2;
|
||||
# provider block per Decision 5.5.
|
||||
#
|
||||
# Conformance is accuracy, not altitude (§6). Nothing here is claimed above
|
||||
# what this repo can evidence today, and two rungs are deliberately declared
|
||||
# lower than the mechanism in place — see `gap.E` and `gap.R`.
|
||||
# what this repo can evidence today. E is deliberately declared lower than the
|
||||
# mechanism in place because the adversarial artifact is still absent.
|
||||
|
||||
schema_version: "0.1"
|
||||
framework: netkingdom-tenancy-posture
|
||||
service: audit-core
|
||||
role: tenant-audit-service
|
||||
|
||||
tenancy:
|
||||
reviewed: "2026-08-17"
|
||||
review_due: "2027-02-17"
|
||||
service_class: batch # §8.3.2. Co-resident with latency-critical
|
||||
# tenant-engine on platform-pg; the mixture is
|
||||
# reported by the platform, not hidden.
|
||||
|
||||
current: { I: 1, A: 2, E: 1, P: 1, R: 1 }
|
||||
target: { I: 1, A: 2, E: 3, P: 1, R: 2 }
|
||||
current: { I: 1, A: 2, E: 1, P: 1, R: 2, V: 0 }
|
||||
implemented: { E: 2 }
|
||||
target: { I: 1, A: 2, E: 3, P: 1, R: 2, V: 1 }
|
||||
|
||||
# §5.2 — declare per path, quote the minimum. The quoted E above is the
|
||||
# minimum across paths. As of AUDIT-WP-0008-T04 both paths carry the same
|
||||
|
|
@ -70,14 +77,6 @@ tenancy:
|
|||
functional indexes built on non-leakproof functions. E4 is unreachable at
|
||||
P1 by the §3.2 coupling and is not a target.
|
||||
|
||||
R: >-
|
||||
R1 today: the platform default 30-day window applies and audit-core has
|
||||
declared nothing above it. R2 is requested and in flight — audit-core has
|
||||
asked rapp-postgres to add `backupRetentionDays: 30` to
|
||||
consumers/audit-core.yaml, making the window declared rather than
|
||||
inherited. That file is rapp-postgres's, so R2 is not audit-core's to
|
||||
declare unilaterally. The erasure horizon is published on /readyz as
|
||||
recoverable_days.
|
||||
R_ceiling: >-
|
||||
R4 is unreachable under the current design and is not a target. Per
|
||||
Decision 4.5.3 — which this repo found — the hash chain commits to a
|
||||
|
|
@ -104,30 +103,46 @@ tenancy:
|
|||
data.archive provision is procured by then, audit-core reopens placement
|
||||
under the §4.5 retention trigger, with P2 as the fallback — a worse answer
|
||||
than archive, named now so it is not improvised later.
|
||||
V: >-
|
||||
No exercise establishes restart recovery for the complete audit path.
|
||||
V1 is the target; replica count or Kubernetes restart policy is not
|
||||
treated as evidence.
|
||||
|
||||
# §5.5 — audit-core provisions operations.audit to senders, so it declares
|
||||
# what it makes reachable for a consumer's audit trail, not only where it
|
||||
# sits. A sender's tenant separation inside the trail is audit-core's to
|
||||
# enforce; the sender cannot reach a level this service does not offer.
|
||||
provides:
|
||||
capability: operations.audit
|
||||
profile: administrative
|
||||
reachable:
|
||||
E2: >-
|
||||
Reachable now. A sender credential is bound to the tenants it may write
|
||||
for and, if it may read, to the tenants it may read back.
|
||||
E3: >-
|
||||
Not reachable yet. Requires rapp-postgres's ADR-0003 GUC contract
|
||||
applied to the audit_core schema. Targeted 2027-03-31.
|
||||
E4: >-
|
||||
Unreachable. One database, one runtime credential, no per-tenant
|
||||
credential and no per-tenant substrate. A sender needing a structural
|
||||
guarantee that another tenant cannot reach its audit records cannot get
|
||||
it here, and should be told so rather than sold E2 in E4's language
|
||||
(§11.4).
|
||||
R2: >-
|
||||
Reachable once the declared window lands; the horizon is already
|
||||
published on /readyz.
|
||||
R4: >-
|
||||
Unreachable by design, per R_ceiling above. A consumer with a verified
|
||||
erasure obligation over its audit trail cannot discharge it here.
|
||||
provider:
|
||||
capability: operations.audit
|
||||
profile: administrative
|
||||
axes:
|
||||
E:
|
||||
available: 2
|
||||
maximum: 3
|
||||
conditions:
|
||||
- "E3 requires rapp-postgres ADR-0003 applied to audit_core and its EXPLAIN probe."
|
||||
- "E4 is unreachable at P1 with one runtime credential."
|
||||
evidence:
|
||||
- "audit_core/ingestion.py"
|
||||
- "tests/test_ingestion.py"
|
||||
R:
|
||||
available: 2
|
||||
maximum: 2
|
||||
conditions:
|
||||
- "R4 is unreachable while the integrity chain commits to cleartext hashes."
|
||||
evidence:
|
||||
- "rapp-postgres/consumers/audit-core.yaml"
|
||||
- "audit_core/interface.py"
|
||||
V:
|
||||
available: 0
|
||||
maximum: 1
|
||||
conditions:
|
||||
- "Exercise restart recovery across audit-core, platform-pg and OpenBao."
|
||||
|
||||
evidence:
|
||||
A2:
|
||||
- "audit_core/ingestion.py"
|
||||
- "tests/test_ingestion.py"
|
||||
E1:
|
||||
- "audit_core/postgres_backend.py"
|
||||
- "tests/test_backend_conformance.py"
|
||||
P1: "rapp-postgres/docs/evidence/isolation-2026-08-10.md"
|
||||
R2:
|
||||
- "rapp-postgres/consumers/audit-core.yaml"
|
||||
- "tests/test_interface.py"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue