feat(boatstack): actor-typed next steps — turns end only at the operator frontier - #234
Merged
Conversation
…tor frontier
Every prescribed next step is typed by who performs it (next_actor:
agent/operator/none). Operator steps are exactly those owing operator
knowledge or authority; evidence the agent produces by doing the work
never crosses the frontier. The renderer marks agent-owned steps
("This step is mine to do") and offers the one-key delegation reply g,
so a read-only status query stays side-effect free while the operator's
next action is always known. Working responses may no longer end by
describing the agent's own pending work; a repeated prescription
without progress is a stall and hands the turn to the operator.
Fail-closed: unclassifiable steps stay operator-owned.
control-law: turn-ends-only-at-the-operator-frontier
Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit
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.
Problem
The response contract renders one
### Next step, but nothing types who performs it. When the step is the coding agent's own work ("amend and reactivate the plan, then implement and run the test"), the turn still ends — so the operator gets handed the agent's to-do list and has to re-prompt ("ok is it done?", "what's next") just to return control. The operator frontier already exists implicitly in theruncoordinator (pause fora, a material product answer,o/u), butnextmode and the contract don't carry it.Control law:
turn-ends-only-at-the-operator-frontierEvery prescribed next step is typed by actor:
a), publish (o/u), cleanup (c/k), a feature choice, a source-plan path, correction facts (--message/--source-stage/--classification),--mutation,--preview-fingerprint.--status --evidence, the review protocol). Owing evidence never crosses the frontier.A working response may end only at the operator frontier. The read-only
nextstatus query is the one exception (a status question must not mutate): an agent-owned step renders as a one-key delegation — "This step is mine to do. Replygand I will do it now, then continue to your next decision." — so the operator's next action is always a single key, even when the work is the agent's. Liveness guard: a prescription repeated without progress is a stall and hands the turn to the operator. Fail-closed: anything unclassifiable is operator-owned, i.e. today's prescribe-and-stop.Changes
flow_control.go:NextActortype,operatorOwedFlags(knowledge/authority vs work-derivable evidence),classifyNextActor,FlowNext.Actor(next_actorinflow next --json), actor line inFormatFlowNext.next_response.go: agent-owned prescribed steps carry the delegation marker +greply.references/workflow.md: new The operator frontier subsection in the response contract;nexttable row names thegdelegation.export.go: theboatstack-nextinstruction carries the frontier rule (delegation reply, continue-until-operator loop, no-progress stall guard) while staying strictly read-only per invocation.next_actor_conformance_test.go: per-stage classification through real resolution, fail-closed boundary cases, render-marker parity, exported-instruction bypass guarantee.test_product_loop.pyexport assertions.Verification
go test ./...green (full lab suite, 110s).python -m unittest discover -s testsgreen (23 tests).release_notes.py preflightPASS.