M2.8: switch over to the new loop
nisse-dev now runs only the conversational loop. The gated state machine it was built alongside is gone: - Removed control.py, planner.py, executor.py, approvals.py, gates.py (command_form moves to loop/reader.py), publish.py and poller.py, the old assembly in agent.py (its shared helpers move to loop/build.py), the store's state-machine view (get_state, transition), their tests, the old end-to-end and live planning/milestone/gate tests, and specs/orchestrator.qnt with its scenarios. - Roles are driver, helper, expert and classifier; driver is required. loop:, roles.planner, roles.executor and tuning.executor are refused with what to use instead; tuning.driver takes the turn cap and failure limit. - The benchmark and the capability matrix measure the driver: the loop's own system prompt and tools, the task's plan as the agreed restatement. Task plans end with finish_milestone, so earlier runs show as (old); stored runs' executor tuning reads as the driver's. - A delegation on the loop records what its helper's alias resolved to (L9), as the old path's did. - The dump shows a work item's revision and what it waits for. - Behaviour the old tests covered and the loop shares stays covered: driver runs that fail on a model call, stop mid-turn, reset the failure count; go-aheads ignoring case and punctuation; a request too big to fit is never sent; the assembly tests, now on build_loop_agent. 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
09232dcbdd
commit
6ae2375194
89 files changed
+951
-8592
No files matched your search
@@ -197,10 +197,7 @@ def test_intent_without_a_branch_is_unverifiable() -> None:
|
||||
assert pull_request_reconciler(client(handler), "o/r")(blank) is None
|
||||
|
||||
|
||||
def test_closing_comments_first_then_closes_issue_and_pr() -> None:
|
||||
from nisse_dev.approvals import PlanBoard
|
||||
from nisse_dev.publish import MilestonePublisher
|
||||
|
||||
def test_closing_an_issue_and_a_pr() -> None:
|
||||
seen: list[tuple[str, str, dict]] = []
|
||||
|
||||
def handler(request: httpx.Request) -> httpx.Response:
|
||||
@@ -213,15 +210,10 @@ def test_closing_comments_first_then_closes_issue_and_pr() -> None:
|
||||
return httpx.Response(201, json={})
|
||||
|
||||
gitea = client(handler)
|
||||
PlanBoard(gitea, "o/r").close(10, "abandoned by don")
|
||||
publisher = MilestonePublisher(
|
||||
None, # type: ignore[arg-type] -- closing touches neither store nor git
|
||||
gitea,
|
||||
"o/r",
|
||||
None, # type: ignore[arg-type]
|
||||
remote_url="ssh://git@gitea.test/o/r.git",
|
||||
)
|
||||
publisher.close_pull_request(20, "abandoned by don")
|
||||
gitea.post_comment("o/r", 10, "abandoned by don")
|
||||
gitea.close_issue("o/r", 10)
|
||||
gitea.post_comment("o/r", 20, "abandoned by don")
|
||||
gitea.close_pull_request("o/r", 20)
|
||||
|
||||
assert seen == [
|
||||
("POST", "/api/v1/repos/o/r/issues/10/comments", {"body": "abandoned by don"}),
|
||||
|
||||
Reference in new issue
Block a user