approval ledger: the evidence that earns and revokes autonomy - #75
Open
localrivet wants to merge 1 commit into
Open
localrivet wants to merge 1 commit into
localrivet wants to merge 1 commit into
Conversation
Approvals resolved and disappeared — the suspension row is deleted on
approve/deny, so 'remove gates one class at a time once a workflow has
proven itself' had no evidence to stand on. Every gated-operation decision
is now appended to approval_ledger at resolution time, and the graduation
question is answered by measurement:
- clean_streak: consecutive approvals since the last denial, edit, or
rollback. Anything negative resets it to zero.
- streak_assets / streak_sessions: spread requirements. Thirty approvals on
one friendly asset in one sitting is one experiment repeated thirty
times, not thirty pieces of evidence.
GET /agents/{id}/approvals returns the evidence per action class.
POST /agents/{id}/approvals/rollback records that an approved (or
autonomous) action turned out bad — the strongest negative signal — and
DEMOTES the operation from Always back to ask-first if it had graduated.
Without demotion, graduation is a one-way door and the only way back is
somebody noticing.
Also gates two operations the catalog was missing:
- cms.page.create / cms.page.update — for a local-search portfolio the city
landing PAGE is the asset's surface; leaving pages ungated while posts
were gated meant the higher-stakes publish was the unguarded one.
- gbp.location.update — Google Business Profile substance edits are
suspension-class risk and never run ungated. Identity-level fields stay
unbound entirely: those are human, full stop.
The streak semantics live in a free function with tests — the rules ARE the
autonomy policy, and they should be testable without a database.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GG7uWL4QX84jpSVCVY3sdG
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.
The keystone of the progressive-autonomy model (and the first build item of the Interkey engagement).
The gap
Approvals resolved and disappeared — the suspension row is deleted on approve/deny, so remove gates one class at a time once a workflow has proven itself had no evidence to stand on.
What this adds
Every gated-operation decision is appended to
approval_ledgerat resolution time (append-only; a decision is a historical fact). The graduation question becomes a measurement:GET /agents/{id}/approvals— evidence per action class.POST /agents/{id}/approvals/rollback— records the strongest negative signal and demotes the operation from Always back to ask-first if it had graduated. Without demotion, graduation is a one-way door.Catalog additions
cms.page.create/cms.page.update— for local-search portfolios the city landing page is the asset's surface; pages were the higher-stakes publish and the unguarded onegbp.location.update— GBP substance edits are suspension-class risk; identity fields stay unbound (human, full stop)Companion commit in repos/plugins binds gohighlevel/wordpress/gbp write commands to these operations (with one landmine defused: the generated
social-media-posting create-postscommand is actually bulk delete — the real publish iscreate-posts-2, verified against descriptions).Streak semantics are a free function with tests — the rules ARE the autonomy policy and are testable without a database. All suites green (nebo-tools 312, nebo-db, nebo-server).
🤖 Generated with Claude Code
https://claude.ai/code/session_01GG7uWL4QX84jpSVCVY3sdG