posts: part 3 — the policy is the part that moves (closes #443) - #484
Merged
Conversation
… during operation
|
❌ Link Validation Results
View Full ReportLink Validation ReportGenerated: 2026-08-19 03:50:37 Executive Summary
Issue Breakdown
Top Affected Domains
Repair Statistics
Files with Most Issues
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part 3 of the agent-controls series, closing #443. Implementation first: the
code was written and proving before a word of the post was drafted, which is the
series' standing promise and — after a ninety-post audit of claims that outran
their evidence — not a promise I wanted to break on the way out.
Backed by
oscal-agent-controls#1.The thesis
Parts 1 and 2 assume the policy is fixed. Part 2's proof quantifies over every
tool call and quietly holds the policy constant — which is exactly the variable
that moves for an actor whose trustworthiness changes while it runs.
What was verified before writing
I fetched all four IETF drafts rather than trusting the issue's summary, which
warned that its own readings were second-hand. Both load-bearing claims hold:
The
policy_iddefect is real. The draft defines it as "a string thatserves as an OPA policy reference and MUST match a registered policy in the AS"
— quoted verbatim in the post. Every integrity mention in the document is a JWS
signature over the token or the confirmation record. Nothing covers the policy
body the identifier resolves to. OSCAL's
implemented-requirementhas the sameshape, and the parallel is what bridges this post back to part 1.
Demotion genuinely does not exist.
revoke/revocationoccur 13 timesacross the four drafts — 10 in one, 3 in another, zero in the remaining two.
demote,downgrade,step-down: zero, in all four.Two corrections to the issue as filed: it says six drafts were read but lists
four, so the post claims four. And its "every draft models grant and revoke" is
too weak — two of the four do not model revocation either.
What now runs
verify/Authority.dfy— authority modes, digest-bound grants, demotionverify/authority.rego+ tests — independent twingate/monitor.py—Authority,demote(),decide_bound(),policy_digest()verify/difftest/authority.py— 324 cases, three implementations, all agreeSix lemmas discharged, including
DemotionCannotWidenandGrantBoundToPolicyBody.Gate status: 26 Dafny obligations, 12 OPA tests, 13 pytest, both difftests green.
The best paragraph is a failure
DemotionTakesEffectImmediatelydid not verify on the first attempt. Theproperty was over-claimed — it needed a digest-match precondition, because when
the policy body has also rotated the call denies for a different reason.
Every test I would have written holds the policy constant and varies the mode,
which is precisely the case where my wrong claim is true. The post leads its
proof section with that rather than with the five lemmas that passed, because it
is the honest argument for the method: the prover objects when your model of
your own system is slightly wrong, at the moment you are most confident it isn't.
Two things I corrected in my own draft
Dated
2026-08-25initially. That is a week in the future, which is the sameimpossible-date defect the archive audit spent weeks removing. Re-dated to today.
Wrote "eleven times" for the revocation count, which came from
grep -c—lines containing a match, not occurrences. The real figure is 13. Corrected, and
the post now states what was actually measured.
Voice check clean, no banned words. Part 2 links forward.