Implements I2 of docs/session-capability-invariants.md — a privileged capability is exercised on a schedule, not only when needed. Currently graded Aspirational: nothing does this.
The evidence
registry-graph.yml reported success on every weekly scheduled run for over a month. The App identity it uses, bounded-systems-front-desk[bot], has never once successfully pushed to this repo.
Both statements are true because the job early-exits:
[ -z "$(git status --porcelain)" ] && { echo "in sync"; exit 0; }
Success meant "the registry hadn't changed". The proof is the absence of any branch either job would have left behind:
$ git ls-remote --heads origin | grep -E 'bootstrap-pin/bump|registry-graph/'
(no output)
Merging #84 was simply the first time anything needed that push, and it 403'd (#87). registry-graph.yml carries the identical latent failure and is not red today only because it has had no work to do — it will fail the first time the registry actually changes.
Why a scheduled probe rather than better assertions
#87 adds a preflight that would catch the missing scope at mint time — but only on a run that reaches the mint step with work to do. A capability nothing exercises stays unverified however good the assertions around it are. The gap here is temporal, not logical.
Shape
One scheduled workflow per privileged identity. Mint the token, push a no-op branch, delete it, fail loudly on any non-200. Report the identity and the operation in the failure so the log names what is missing.
This is the ticket-window pattern (board-parity.yml #58, claim-ticket.yml #61) turned on the org's own plumbing rather than on the board — the same argument, one layer in.
Worth considering: emit the last-successful-exercise timestamp somewhere durable, so "N days since this identity last worked" is a readable number rather than something reconstructed from run history and git ls-remote, which is how it was found today.
Done when
- Each privileged identity has a probe that fails if its grant were removed.
- The probe's failure names the identity and the operation, not a bare 403.
- Removing a grant in a test installation turns the probe red within one cycle.
Blocked
Cannot go green until #87 grants contents: write. That is a feature — a probe that passes today would be lying. Land it red, or land it alongside the fix.
Implements I2 of
docs/session-capability-invariants.md— a privileged capability is exercised on a schedule, not only when needed. Currently graded Aspirational: nothing does this.The evidence
registry-graph.ymlreported success on every weekly scheduled run for over a month. The App identity it uses,bounded-systems-front-desk[bot], has never once successfully pushed to this repo.Both statements are true because the job early-exits:
Success meant "the registry hadn't changed". The proof is the absence of any branch either job would have left behind:
Merging #84 was simply the first time anything needed that push, and it 403'd (#87).
registry-graph.ymlcarries the identical latent failure and is not red today only because it has had no work to do — it will fail the first time the registry actually changes.Why a scheduled probe rather than better assertions
#87 adds a preflight that would catch the missing scope at mint time — but only on a run that reaches the mint step with work to do. A capability nothing exercises stays unverified however good the assertions around it are. The gap here is temporal, not logical.
Shape
One scheduled workflow per privileged identity. Mint the token, push a no-op branch, delete it, fail loudly on any non-200. Report the identity and the operation in the failure so the log names what is missing.
This is the ticket-window pattern (
board-parity.yml#58,claim-ticket.yml#61) turned on the org's own plumbing rather than on the board — the same argument, one layer in.Worth considering: emit the last-successful-exercise timestamp somewhere durable, so "N days since this identity last worked" is a readable number rather than something reconstructed from run history and
git ls-remote, which is how it was found today.Done when
Blocked
Cannot go green until #87 grants
contents: write. That is a feature — a probe that passes today would be lying. Land it red, or land it alongside the fix.