CI / checks (push) Skipped
CI / checks (pull_request) Successful in 1m48s
A work item starts from a fresh workspace: fetch, set aside (never discard) leftover changes, branches and unpushed commits, a clean default branch, and a branch of its own (D3, #62). start_milestone cuts the milestone's branch; finish_milestone commits only the work, pushes and opens a PR that closes the issue, under an intent, adopting an open PR and treating a closed one as the operator's answer (D4). Between runs the loop watches each item's PR: operator comments and inline review notes (#69) reach the item, a merge or close hands back to the driver. A review fix is checked after it's pushed and goes out as a new PR if the PR merged first (D5). At boot an interrupted publish is settled against Gitea (L8). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPQ14L3LikyefCMFBqEbKE
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
"""Control tools (L13): handled in the harness, acting only on the agent's
|
|
own state, conversation and records. A *waiting* tool ends the driver's run:
|
|
the item then waits on the operator."""
|
|
|
|
from typing import Any
|
|
|
|
|
|
def _tool(tool: str, description: str, /, **params: str) -> dict[str, Any]:
|
|
return {
|
|
"type": "function",
|
|
"function": {
|
|
"name": tool,
|
|
"description": description,
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {
|
|
p: {"type": "string", "description": d} for p, d in params.items()
|
|
},
|
|
"required": list(params),
|
|
},
|
|
},
|
|
}
|
|
|
|
|
|
RESTATE = _tool(
|
|
"restate",
|
|
"Put your understanding of the request to the operator, in their item's "
|
|
"thread: what you take it to mean, how it fits the project, and your "
|
|
"first step. Ends your turn; work starts when they agree.",
|
|
text="Your restatement, in plain language.",
|
|
)
|
|
ASK_HUMAN = _tool(
|
|
"ask_human",
|
|
"Ask the operator a question in the item's thread. Ends your turn; you "
|
|
"continue when they answer.",
|
|
question="The question.",
|
|
)
|
|
CLOSE_ITEM = _tool(
|
|
"close_item",
|
|
"The work is done: close the work item with a summary of what was done, "
|
|
"what was verified, and what is left open.",
|
|
summary="What was done, verified, and left open.",
|
|
)
|
|
|
|
START_MILESTONE = _tool(
|
|
"start_milestone",
|
|
"Start a milestone before changing code: the harness cuts its branch. "
|
|
"Never create or switch branches yourself.",
|
|
name="A short name for the milestone.",
|
|
)
|
|
FINISH_MILESTONE = _tool(
|
|
"finish_milestone",
|
|
"The milestone's work is done and its tests pass: the harness commits "
|
|
"the work, pushes it and opens a PR, or, after review comments, pushes "
|
|
"your fix to the PR. Ends your turn; you continue when the PR is "
|
|
"reviewed or merged.",
|
|
summary="What the milestone did and how it was verified, for the PR.",
|
|
)
|
|
|
|
WAITING = frozenset({"restate", "ask_human", "close_item", "finish_milestone"})
|
|
|
|
|
|
def names(tools: list[dict[str, Any]]) -> set[str]:
|
|
return {tool["function"]["name"] for tool in tools}
|