feat(posture): add deterministic feedback proposals
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a02929-244b-7391-b933-c04010e8eedb
This commit is contained in:
tegwick 2026-08-23 13:16:34 +02:00
parent dc8da422f8
commit cfc9e7d0cb
19 changed files with 1428 additions and 16 deletions

View file

@ -8,7 +8,7 @@ version: "0.1"
created: "2026-08-17"
updated: "2026-08-23"
scope: multi-tenancy-security-framework
revision: "draft-13"
revision: "draft-14"
owner: net-kingdom
last_reviewed: "2026-08-23"
review_interval: 6m
@ -87,6 +87,11 @@ and the tenant-engine boundary contract, not in the work-factory canon.
required by §13.2. The claim remains explicitly bounded and freshness-dated:
the attempted cross-tenant attacks did not work; this is not a universal
isolation proof.
- **draft-14** makes evidence freshness and remediation ownership declarable.
Adversarial evidence may now carry its observation and expiry timestamps,
bounded scope, responsible repository, and replacement action. A separate
proposal-only evaluator treats absent authoritative owner or freshness as
`unknown`; it does not infer either or mutate the declared posture.
**Reviewed by all six. The score:** six repos found three live defects in their
own code by reading the ladders — `tenant-engine`'s unfiltered
@ -826,6 +831,11 @@ declaration but do not replace it. The schema carries `current`, `implemented`,
`target`, `reviewed`, `review_due`, `gap`, `placement_exceptions`,
`service_class` (§8.3), per-path detail (§5.2), and provider reachability
(§5.5), plus the workload identity prerequisite for zone membership (§5.6.2).
It also permits `responsible_repo` for authoritative posture routing and
`evidence_freshness` for machine-readable evidence observation, expiry, scope,
owner, and remediation metadata. Their absence remains valid declaration
syntax; feedback resolution must report `unknown`, never infer them from a
directory, service name, or previous owner.
From the `net-kingdom` repo, owners validate one or more declarations
with `uv run tools/tenancy-posture/validate.py <path>...`; the validator applies
the JSON Schema and the evidence, date, implemented/current and provider-range
@ -1129,6 +1139,22 @@ rather than a green build. Cross-tenant findings are the category external
testing practice identifies as needing human review. **A passing CI run is not
E2 evidence.**
**Decision 13.5 — freshness and ownership are explicit inputs.** A declaration
may attach `evidence_freshness.<level>` to an evidence key. An adversarial entry
requires `observed_at`, `valid_until`, `responsible_repo`, `scope`, and
`remediation`; a mechanical entry may omit `valid_until` when the artifact is
continuously re-established by the referenced revision or CI control. The
timestamps use RFC 3339 and the responsible repository is the authority for
replacement evidence.
The feedback evaluator does not parse prose for dates, infer ownership from a
file path, or silently extend a validity window. A current adversarial claim
without freshness metadata resolves to **freshness `unknown`**. An expired
artifact resolves to **freshness `expired`**. Neither automatically rewrites the
declared level: the evaluator emits a deterministic owner-routed remediation
proposal so review remains observable and controlled. The proposal contract is
`posture-feedback_v0.1`; it performs no State Hub write or policy mutation.
| Level | Evidence | Kind |
|---|---|---|
| **I2** | Identifiers validated against the vocabulary; rejection test for a malformed id; binding shown to come from a verified token | Mechanical |