Roles, capability profiles and help on the new loop (M2.6)
- roles.driver (unset: the planner's model) and roles.classifier (unset: the expert's); the mapping is pinned when an item opens, and the driver and the go-ahead reader run on the item's own (L9). - profiles: in configuration (tools, strengths, weaknesses), used in briefings: the driver's instructions say what its helper and expert are good at, the helper's brief who reads its handback; never a model name. - delegate(task) and ask_expert(question) for the driver. A helper works on a branch off the milestone's; on a handback its work comes back as uncommitted changes, otherwise it is discarded, so harness branches never hold commits only the clone has. ask_expert keeps its budget. - Triggers: failure_limit failed commands in a row (Driver's new "stuck" outcome) or the turn cap, mid-milestone, call a helper in once per milestone; if it fails too, the item waits on the operator. A delegation cut off by a crash is discarded at boot. - Evaluation capture: delegations and ask_expert as before, and the reader's verdicts as classifier pairs. Tests: help tests (merge-back, discard, needs a milestone, the stuck trigger and its once-per-milestone limit, the expert and its budget, pinning, briefings by profile, boot discarding a cut-off delegation), config tests for roles and profiles, and the walk delegating with a scripted helper that sometimes fails, with a delegations_settle property. The walk found helper commits stranded on a merged PR's branch, fixed by returning a helper's work uncommitted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
This commit is contained in:
1 parent
04c352b30c
commit
59fd00ce8c
19 files changed
+890
-38
No files matched your search
@@ -54,8 +54,8 @@ Stay inside the sub-task you were given. It comes from a plan a human already
|
||||
approved; widening it is not yours to do. If the sub-task turns out to be
|
||||
wrong or impossible, say so in the handback rather than substituting your own.
|
||||
|
||||
When you are done, call hand_back exactly once. Write it for a materially
|
||||
weaker model that cannot see your reasoning and will act on your note alone:
|
||||
When you are done, call hand_back exactly once. Write it for {reader},
|
||||
which cannot see your reasoning and will act on your note alone:
|
||||
|
||||
- what changed
|
||||
- what is now true that was not before
|
||||
@@ -172,10 +172,14 @@ class Delegation:
|
||||
caps: Caps | None = None,
|
||||
now: Callable[[], float] = time.monotonic,
|
||||
cancel: Cancel | None = None,
|
||||
reader: str = "",
|
||||
) -> None:
|
||||
self._client = client
|
||||
self._store = store
|
||||
self._workspace = workspace
|
||||
# Who acts on the handback, from its capability profile (L9): never
|
||||
# a model's name.
|
||||
self._reader = reader or "a materially weaker model"
|
||||
self._git = git_repo
|
||||
self._model = model
|
||||
self._backing_model = backing_model
|
||||
@@ -323,7 +327,8 @@ class Delegation:
|
||||
self, transcript: Transcript, brief: str, branch: str, started_at: float
|
||||
) -> DelegationResult:
|
||||
system = (
|
||||
f"{SYSTEM_PROMPT}\n\n{self._workspace.describe()}"
|
||||
f"{SYSTEM_PROMPT.format(reader=self._reader)}\n\n"
|
||||
f"{self._workspace.describe()}"
|
||||
f"\n\nYour sub-task:\n{brief}"
|
||||
)
|
||||
touched: set[str] = set()
|
||||
|
||||
Reference in new issue
Block a user