RISK-WP-0005-T01: read the fix records, and two findings moved

fix_tracker.py resolves fix_tracking against the owning repo's workplan
file — the ADR-001 source of truth — and uses the file's last commit date
as the honest answer to 'has this moved', independent of whether the
register looked. Archived workplans are searched too, so a finished fix
that was filed away does not read as missing.

First run, three findings it should have known about:

RISK-F-0005 — AUDIT-WP-0008-T04 has read done since 2026-08-18. The fix
this finding asked for has landed and the register spent three days not
knowing. Now mitigated, embargo lifted, disclosure public. Not fixed:
that needs a probe, and T05's adversarial evidence artifact still reads
wait.

RISK-F-0002 — both tracked records were closed before the finding was
filed: WARDEN-WP-0007 archived 2026-07-08, FLEX-WP-0007 finished
2026-06-29, against a finding of 2026-08-18 that names FLEX-WP-0007 as
the blocker. Routed as a question, not a conclusion.

Four findings carry no fix tracking at all, which the report now says out
loud rather than leaving as an empty field.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-21 08:29:38 +02:00
parent 0ff87c22d8
commit ba3b3f686d
7 changed files with 217 additions and 13 deletions

View file

@ -29,8 +29,8 @@ embargo_review: "2026-11-17"
escalation: withdrawn
escalation_trigger: 6
escalation_status: withdrawn-hazard-window-closed
last_checked: "2026-08-20T10:02:41Z"
next_check: "2026-08-20T10:02:41Z"
last_checked: "2026-08-21T06:29:10Z"
next_check: "2026-08-21T06:29:10Z"
cadence: instant
clean_streak: 0
waiting_on:
@ -274,3 +274,53 @@ reason than the one this finding was filed for. That is the second time in two
days that this finding's blocker turned out to be a claim about the world at a
date.
- **2026-08-20** — not clean: RISK-V-0001 found the flex-auth-ops-warden policy admits no ingress; the live question is now availability, not attestation. Cadence instant → instant; checked again immediately.
## Check — 2026-08-21: both tracked records were already closed when this was filed
`RISK-WP-0005-T01` made this register read the fix records it had been writing
down without reading. The first run answered a question nobody had asked:
| Tracked | State | Last changed |
| --- | --- | --- |
| `WARDEN-WP-0007` | **archived** | 2026-07-08 |
| `FLEX-WP-0007` | **finished** | 2026-06-29 |
This finding was filed on **2026-08-18** and states that the gate is "blocked
on `FLEX-WP-0007`". That workplan had read `finished` for seven weeks by then.
`flex-auth` restated the same blocker to this register on 2026-08-19 —
"`policy.enabled` remains off (`FLEX-WP-0007`)" — while their own authoritative
record said it was done.
**The register is not concluding that the blocker is gone.** Three readings
fit and only the owners can say which: the deployment finished and was later
reverted or never applied; "finished" means something narrower than the
sentence implies; or the blocker is genuinely stale and two repos have been
repeating it.
What can be said without either owner's help is that **the stated blocker has
not matched the stated record since June**, and nothing would have caught that
before this register started reading fix state.
### This is the third time on the same finding
`RISK-F-0002` argued, when it was filed, that a blocker is a claim about the
world at a date, and that its own had been invalidated in a day with nothing
re-checking it. Since then:
1. `RISK-F-0001` was fixed hours after this register graded the ordering hazard;
2. `RISK-V-0001` found a NetworkPolicy that may make enabling the gate fail
closed for an entirely different reason;
3. and now both tracked records turn out to have been closed before the finding
was written.
The finding was right about the estate and right about itself. Severity is
unchanged at `medium` — none of this changes what the gate does today — but
what is *blocking* it has been wrong in the record for two months.
### The ask, sharpened
Previously: probe whether the flex-auth pin admits ingress. Now, additionally:
**what actually blocks `policy.enabled` today?** If the answer is "nothing
except the ingress question", that is a much shorter path than the one both
repos have been describing.
- **2026-08-21** — not clean: Fix tracking read for the first time: WARDEN-WP-0007 archived 2026-07-08, FLEX-WP-0007 finished 2026-06-29 — both closed before the finding was filed. Cadence instant → instant; checked again immediately.

View file

@ -2,7 +2,7 @@
id: RISK-F-0005
type: finding
title: "audit-core read path applies no tenant filter; the bound is deployment, not code"
status: open
status: mitigated
reported_by: audit-core
reported_via: flex-auth
routed_by: risk-nexus
@ -20,15 +20,16 @@ impact: I3
likelihood: L2
fidelity_modifier: false
production_rescore: true
disclosure: embargoed
embargo_condition: "AUDIT-WP-0008-T04 lands a tenant filter in the read path"
disclosure: public
publication: pending-handover
embargo_condition: "met 2026-08-18 — AUDIT-WP-0008-T04 reads done in audit-core's workplan"
embargo_since: "2026-08-19"
embargo_review: "2026-11-17"
escalation: none
last_checked: "2026-08-20T10:02:42Z"
next_check: "2026-08-20T11:02:42Z"
cadence: 1h
clean_streak: 1
last_checked: "2026-08-21T06:29:38Z"
next_check: "2026-08-21T06:29:38Z"
cadence: instant
clean_streak: 0
waiting_on:
- who: audit-core
what: "is may_read false on every production credential, or only on the sender"
@ -85,3 +86,40 @@ No escalation. Known, owned, tracked, moving.
Open at review: has `AUDIT-WP-0008-T04` moved; is `may_read: false` still
true of every production credential, not only the sender.
- **2026-08-20** — clean check: checked against the inbox and the owner's record; nothing moved. Cadence instant → 1h (1 clean in a row); next check 2026-08-20 11:02Z.
## Check — 2026-08-21: the fix landed three days ago and nobody here knew
`RISK-WP-0005-T01`'s first run read `AUDIT-WP-0008-T04` in `audit-core`'s own
workplan file: **`status: done`**, last changed 2026-08-18.
The task text is the fix this finding asked for — bind the read path to
permitted tenants, `permits_tenant` governing read as it governs write at the
same choke point, tenant-scoping `/v1/events`, `/v1/events/<id>`,
`/v1/dead-letters` and `/v1/secret-findings`, with tests for cross-tenant read
refusal.
**Three days sat between the fix landing and this register knowing.** Nothing
was wrong with `audit-core`'s conduct — they did the work and recorded it in
the authoritative place. The register was carrying a string it never read,
which is exactly the gap `RISK-WP-0005-T01` exists to close, found on the run
that closed it.
**`mitigated`, not `fixed`.** The live gap is closed on the owner's record; the
finding is not, for two reasons:
1. This register has read a workplan status, not a probe. The standard for
`fixed` in `docs/method/review.md` is something concrete about the running
system, and `audit-core` is the one who can supply it.
2. `AUDIT-WP-0008-T05` — the adversarial `E2` evidence artifact, an identity
bound to tenant A demonstrably unable to read tenant B — reads `wait`. The
control exists; the demonstration that it holds does not.
**The embargo lifts.** Its condition was `AUDIT-WP-0008-T04` landing a tenant
filter, and that is met. The finding describes a read path that no longer
applies no filter, so publishing it no longer shortens anyone's path.
`disclosure: public`, handover pending with the others.
The `may_read` question — is it false on every production credential, or only
on the sender — stays open and matters less now that the bound is in code
rather than in a flag.
- **2026-08-21** — not clean: AUDIT-WP-0008-T04 reads done in audit-core's workplan since 2026-08-18; embargo condition met, status mitigated. Cadence 1h → instant; checked again immediately.