audit-core/docs/interface-card.yaml
tegwick a2d84bdd9b
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Declare the tenancy posture vector (AUDIT-WP-0008-T01).
Written against draft-7, which landed after the task was drafted and moved the
target. Decision 5.4 fixes the location at tenancy.yaml in the repo root rather
than docs/, and fixes the schema: current, target, reviewed, gap,
placement_exceptions, service_class, per-path detail, provider block.

Declares I1 A2 E1 P1 R1. E is quoted at 1 although T04 put the E2 mechanism on
both paths, because §13.2 states a passing CI run is not E2 evidence -- the
artifact is adversarial, compares separate tenant contexts and carries a review
date. Our cross-tenant tests are mechanical, so under §13.1 the level is not
claimable until T05. The mechanism is recorded in paths.E and the reason in
gap.E. Claiming E2 off unit tests would be the overclaim §6 prohibits, and
refusing that reasoning is what found the read-path defect.

R stays at 1: R2 needs backupRetentionDays in rapp-postgres's consumer file,
requested in T02 and not ours to declare.

Two additions draft-7 forced. A credentials gap under Decision 9.2 -- our own
finding, adopted as a rule, and it binds us: ingest credentials are static
long-lived bearer tokens, declared as a stated gap rather than a silent
exclusion. And a provides block under Decision 5.5, declaring what a sender can
reach through this service: E2 now, E3 pending ADR-0003, E4 and R4 unreachable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 22:55:31 +02:00

109 lines
4 KiB
YAML

schema: info-tech-canon.interface-card.v1
id: audit-core/interface-card
title: audit-core Canon Interface Card
consumer: audit-core
consumer_profile:
repo: audit-core
domain: infotech
owner: audit-core
intent: >
Provide durable, tenant-aware operational custody for audit events so
senders can treat a 202 as evidence-in-store, not a log-forwarding hint.
scope:
- audit event ingestion
- append-only operational custody
- sender binding
- recovery bound to platform backup
purposes:
- id: audit-core/operational-custody
use_case: Accept normalized events from registered senders and retain them in an append-only store.
consumer_need: A joinable operations.audit provision with an honest recovery claim.
demand_signals:
- user-engine delivers platform and tenant events over POST /v1/events
- neighbours already require data.backup in ITC-CAP terms
canon_surfaces:
- model/capability
- model/governance
- model/data
- model/security
surfaces:
implemented_profiles: []
consumed_artifacts:
- model/capability
- model/governance
- model/data
- model/security
owned_concepts: []
produced_concepts:
- Evidence
- AuditRecord
consumed_concepts:
- Evidence
- EvidenceBasis
- CapabilityProvision
- RetentionRuleReference
mappings:
- from: stored event
to: Evidence / AuditRecord
note: This service stores evidence. It is not an independent Audit-as-assessment.
- from: capability.audit.event-retain
to: operations.audit
note: data/capability/audit-core-operational.json
validation_expectations:
commands:
- PYTHONPATH=src python3 -m info_tech_canon capability-review /home/worsch/audit-core/data/capability/audit-core-operational.json
evidence_required:
- data/capability/audit-core-operational.json
- docs/operator-runbook.md Restore section
- docs/evidence/restore-walk-20260813T121200Z.json
known_gaps:
- id: data.archive-unprovided
owner: audit-core
disposition: unmet requirement recorded on the ITC-CAP case; do not build the sink in AUDIT-WP-0006
- id: tamper-evidence-false
owner: audit-core
disposition: closed by AUDIT-WP-0007; proof bound is in docs/integrity.md
- id: no-hash-chain
owner: audit-core
disposition: INTENT residual, not this workplan
- id: single-sender
owner: audit-core
disposition: NetworkPolicy admits user-engine only; other sources remain adapters
- id: no-rapp-yaml
owner: railiance-master
disposition: schema requires rapp-*; extraction is a first-wave family decision
- id: historic-archive-overclaim
owner: audit-core
disposition: closed by AUDIT-WP-0006-T01; /readyz reports operational
purpose_fit:
state: partial
matched_capabilities:
- operations.audit
scope_pressure: >
INTENT describes a control plane, object archive, hot search, and export.
The live service is a single-sender operational custody receiver.
recommended_disposition: keep the operational provision honest; do not inflate to data.archive
consumer_needs:
current:
- Honest custody_class and recoverable window on /readyz
- Joinable operations.audit provision
requested_extensions:
- data.archive sink if events must survive past the 30-day backup window
feedback: []
tenancy_posture:
declared_at: tenancy.yaml
framework: net-kingdom/canon/standards/tenancy-posture_v0.1.md (draft-7)
current: I1 A2 E1 P1 R1
target: I1 A2 E3 P1 R2
provides_reachable:
E2: now
E3: not yet — needs rapp-postgres ADR-0003 GUC contract; target 2027-03-31
E4: unreachable — one database, one runtime credential, no per-tenant substrate
R4: unreachable by design — see Decision 4.5.3 and docs/erasure-and-audit.md
known_deviations:
- no data.archive sink
- tamper_evidence is a hash chain plus external head, not WORM
- no hash-chain
- single sender user-engine
- no rapp.yaml (not a rapp-* repo)
- /readyz historically overclaimed archive (closed by T01)