Skip to content

approval ledger: the evidence that earns and revokes autonomy - #75

Open
localrivet wants to merge 1 commit into
mainfrom
feat/interkey-gated-ops
Open

localrivet wants to merge 1 commit into
mainfrom
feat/interkey-gated-ops

Conversation

@localrivet

Copy link
Copy Markdown
Contributor

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_ledger at resolution time (append-only; a decision is a historical fact). The graduation question becomes a measurement:

  • clean_streak — consecutive approvals since the last denial, edit, or rollback; anything negative resets to zero
  • streak_assets / streak_sessions — spread requirements: 30 approvals on one friendly asset in one sitting is one experiment repeated thirty times, not thirty pieces of evidence

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 one
  • gbp.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-posts command is actually bulk delete — the real publish is create-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

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant