audit-core/tests
tegwick de9e3abe5f AUDIT-WP-0009 T02/T10 — schedule attestation, and make the §5 check total
T02. deploy/attest-cronjob.yaml: daily at 03:17 UTC against the 168h window,
its own ServiceAccount, and a Role reaching exactly one named ConfigMap —
get/update/patch, no create, no list. audit_core/attest_publish.py does the
publish in stdlib; the image carries no kubectl, and adding one to an audit
receiver's image to write a single file is the worse trade.

Three refusals, all deliberate:

  The producer is not the receiver. A receiver that could rewrite its own
  attestation could forge it. audit-core-egress is now scoped to
  component: receiver and a separate audit-core-attest-egress carries the 6443
  rule, so the receiver never gains API-server reach. Asserted by test.

  It refuses to publish over a broken chain. A fresh head written over a break
  replaces an honest chain_break with a fresh-looking attestation. Stale
  degrades the claim visibly; false does not.

  Mounted as a directory, not subPath. Found while writing the manifest: a
  subPath ConfigMap mount is resolved once at pod start and never updates, so
  the daily attestation would land in the ConfigMap and never reach the running
  receiver — tamper_evidence would age out to false while the job reported
  success every night, silent in both directions.

The offsite copy stays an operator step. audit-core holds no Nextcloud
credential and should not acquire one to publish a hash, so docs/integrity.md
states the bound plainly: until that copy exists the delivered control defends
against a database owner, not a cluster owner, and no stronger claim may be
made from it.

T10. layer.yaml lists four infrastructure contacts — platform-pg, state-hub,
kube-apiserver, the container registry — each with its role and whether another
layer reads it. tooling_contacts stays [], which is true under §5 as written;
the companion's totality request is met by the uncatalogued list rather than by
inventing a Tooling row. tests/test_layer_conformance.py derives the egress
destinations from the manifests and the registry from the pinned digests, so a
new contact appearing in deploy/ without a row fails the test rather than
waiting for a reviewer to notice.

Applying the manifests remains an operator action; nothing here was applied.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nb7Q6ZmXppNDkTWytfYqfv

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 2069992@bnt-lap001
Assistant-Session: 167dd7f8-2a25-4be1-aa46-3b6f1a5f94c6
2026-09-10 16:39:20 +02:00
..
test_approval_validity_prohibition.py AUDIT-WP-0009-T08 — assert the approval-validity prohibition by test 2026-09-06 20:35:41 +02:00
test_attest_publish.py AUDIT-WP-0009 T02/T10 — schedule attestation, and make the §5 check total 2026-09-10 16:39:20 +02:00
test_backend_conformance.py Implement AUDIT-WP-0007 hash-chain integrity. 2026-08-16 01:18:30 +02:00
test_capability_case.py Close AUDIT-WP-0007 after live chain attestation. 2026-08-16 01:23:54 +02:00
test_cli.py Implement AUDIT-WP-0007 hash-chain integrity. 2026-08-16 01:18:30 +02:00
test_credentials.py Read mounted DB credentials from a Kubernetes snapshot 2026-08-13 12:25:32 +02:00
test_ingestion.py feat(AUDIT-WP-0008): enforce temporary sender expiry 2026-08-22 11:59:26 +02:00
test_integrity.py AUDIT-WP-0009-T01 — derive tamper_evidence from live attestation state 2026-09-06 20:34:22 +02:00
test_interface.py Implement AUDIT-WP-0006 honest operational custody. 2026-08-16 00:24:33 +02:00
test_layer_conformance.py AUDIT-WP-0009 T02/T10 — schedule attestation, and make the §5 check total 2026-09-10 16:39:20 +02:00
test_migrate_store.py Establish pre-production record disposition and add the migration tool 2026-08-10 17:31:18 +02:00
test_mock_file_backend.py Add mock file audit backend 2026-06-01 23:44:03 +02:00
test_networkpolicies.py AUDIT-WP-0010 T01/T03/T04 — admit tenant-engine, and the envelope does not match 2026-09-10 16:34:45 +02:00
test_senders.py AUDIT-WP-0010 T01/T03/T04 — admit tenant-engine, and the envelope does not match 2026-09-10 16:34:45 +02:00
test_t02_synthetic_load_driver.py test(AUDIT-WP-0008): exercise T02 driver over HTTP 2026-08-22 16:55:37 +02:00
test_tenant_engine_envelope.py AUDIT-WP-0010 T01/T03/T04 — admit tenant-engine, and the envelope does not match 2026-09-10 16:34:45 +02:00