feat(org): submit — accept a supervisor, the one safe self-signed terms change - #276
feat(org): submit — accept a supervisor, the one safe self-signed terms change#276itsHabib wants to merge 2 commits into
Conversation
…ms change `checkTakeover` admits a displacement only from a role the charter names in Terms.Supervisors. Every lane in the live tenant names only the operator, so the operator is the sole actor able to clear a seat held by a dead session — which is exactly the page a supervisor lane exists to avoid. Granting that authority is a terms change, and FOLLOWUPS explains why there is no verb for one: a general recharter was written and withdrawn from #272 because `checkRecharter` verifies only min_reader monotonicity while `checkWriter` accepts the holder's own incarnation, so a role could widen its scope, lift its ceilings, add effect classes, or drop the supervisors that may take it over — all self-signed. That is still true, and this does not change it. `submit` is admissible under that entry's own criteria rather than in spite of them. It names supervisors as one of three attenuations a kernel can verify ("no shrink"), and adding one is monotone in the accountability direction: it strictly grows the set of roles that may displace you and cannot widen your own authority, so none of the five self-signed widenings are reachable. The guard is total, not partial — every other term is carried through byte-identical, including Tier, which is inert since #275 but still projected into every digest. Who writes it carries as much weight as what it says. Recharter is admitted only from Held or Active under the writer's own incarnation, so a role submits to oversight while sitting in its own seat. Consent, not imposition: nothing can be made supervisable from outside, which is the property keeping this from becoming the parent-authority mechanism the kernel still lacks. Tests pin the property rather than the happy path: the whole of Terms survives a submit byte-identical, takeover is refused with not_supervisor before and admitted after, and re-submitting an existing supervisor writes no record. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Claude finished @itsHabib's task in 2m 38s —— View job Review of PR #276 —
|
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4133990d54
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…on retry The new terms are derived from the loaded snapshot, so the append now carries ExpectTip: two concurrent submits would otherwise each write "old supervisors + mine" and the second to land would silently drop the first's party. An idempotent retry under -json prints the same no-op receipt shape transfer uses instead of an empty stdout. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Why
checkTakeoveradmits a displacement only from a role the charter names inTerms.Supervisors. Every lane in the live tenant names onlyhuman:mh, sothe operator is the only party who can clear a seat held by a dead session —
which is precisely the page a supervisor lane exists to prevent. Tonight a
desktop crash left two seats held by a stopped session and the only available
move was to ask the operator.
Why not a general
recharterFOLLOWUPS already answers this, and I hit it mid-build: a general verb was
written and withdrawn from #272.
checkRecharterverifies only thatmin_readeris monotone andcheckWriteraccepts the holder's ownincarnation, so exposing the whole kind would let a role widen its scope, lift
its ceilings, add effect classes, or drop the supervisors that may take it
over — all self-signed. Unchanged, and this PR does not touch it.
Why this slice is admissible
Under that entry's own criteria, not in spite of them. It names supervisors
as one of three attenuations a kernel can verify ("no shrink"), and adding
one is monotone in the accountability direction: it strictly grows the set of
roles that may displace you and cannot widen your own authority. None of the
five self-signed widenings the entry lists are reachable through it.
The guard is total rather than partial — every other term is carried through
byte-identical, including
Tier, which is inert since #275 but still projectedinto every digest.
And who writes it matters as much as what it says: recharter is admitted only
from
HeldorActiveunder the writer's own incarnation, so a role submitsto oversight while sitting in its own seat. Consent, not imposition. Nothing
can be made supervisable from outside, which is the property that keeps this
from quietly becoming the parent-authority mechanism the kernel still lacks.
Validation
go build ./...,go vet,gofmtclean;go test ./cmd/org/... ./contracts/org/...all pass.Termssurvives a submit byte-identical (scope, effectclasses, ceilings, retire) — a general recharter would have reset them to
flag defaults;
takeoveris refused withnot_supervisorbefore submit and admittedafter — the actual reason the verb exists;
cmd/org/CLAUDE.mdandAGENTS.mdupdated and verified byte-identical forthe CI pair check; FOLLOWUPS records the narrowing and notes that refactor(org): drop the charter tier from the interface #275 made
the tier half of its second gap moot.
🤖 Generated with Claude Code