From 30f9c42c28d69da4746b55f62500fcd5110683ff Mon Sep 17 00:00:00 2001 From: Pierre Mardon Date: Sat, 3 Oct 2026 22:21:13 +0200 Subject: [PATCH] A hand over that says the cut and the gates once, and does not restate the blueprint The hand over of `/surface-plan` is played again after every amendment, and each time it said how the body of the blueprint is cut and which gates the loop will run. Sessions also restated what the blueprint and the plan hold, right after sending the developer to read the blueprint. In the first campaign of the evaluations the judge scored this as noise on every case (#67). Refs #67 --- skills/surface-plan/SKILL.md | 2 +- tests/prompts/test_surface_plan.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/skills/surface-plan/SKILL.md b/skills/surface-plan/SKILL.md index 58d351e..07a5b04 100644 --- a/skills/surface-plan/SKILL.md +++ b/skills/surface-plan/SKILL.md @@ -85,7 +85,7 @@ The conversation is the developer's, the plan folder is the repository's. 8. Cross-check. Launch a fresh `surface-checker` with the report path `checks/rev-NN-MM.md` and wait for its return. Check that the report exists and opens with the count returned, then `surface-status record check-done --report checks/rev-NN-MM.md --omissions --json`. 9. Omissions. None: step 10. Otherwise, when `passes.planning` of `show` is more than `passes.ceiling`, stop at the ceiling (see "The agents"). Else read the report and choose: the blueprint must show more, then step 7 with the report's path; or the plan does more than the need, then take that out of `plan.md` yourself and step 7. Then step 8 again. A pass is a cross-check with omissions, which sends the blueprint or the plan back for rework; a clean check costs none. So the blueprint or the plan is reworked `passes.ceiling` times, and the check after them hands back. 10. Draft. `surface-status record plan-drafted --json`, then "Commit, push and pull request". Refused with the code `gate-list`: `plan.md` lacks its gates block or holds a malformed one; correct it, then step 8. -11. Hand over. Tell the developer where to read the blueprint: its path, and its link in the pull request. Say in one line how the body of the blueprint is cut, and why, as the extractor returned it. Name the gates the loop will run, `gates` of `show`, or say that the plan names none and the loop then has no objective check. Then stay in the conversation and ask: amend, or approve by launching `/surface-execute`, whose launch alone approves this revision. +11. Hand over. Tell the developer where to read the blueprint: its path, and its link in the pull request. At the first hand over of the plan, when `journal.jsonl` holds a single `plan-drafted` line, say in one line how the body of the blueprint is cut, and why, as the extractor returned it, and name the gates the loop will run, `gates` of `show`, or say that the plan names none and the loop then has no objective check. At a later one, say in one line which amendment or decision of `interview.md` the revision carries, and the cut or the gates again only when the revision changed them. The developer is about to read the blueprint: restate neither what it holds nor the plan. Then stay in the conversation and ask: amend, or approve by launching `/surface-execute`, whose launch alone approves this revision. - A reply that asks for a change is an amendment: take it as "Taking an amendment" says, which writes it first, records it, draws and cross-checks the next revision, commits and pushes it. Then ask the same question again. - A question, about the plan or the blueprint, is answered from the files, and nothing is recorded. - In doubt, ask whether the reply is an amendment. diff --git a/tests/prompts/test_surface_plan.py b/tests/prompts/test_surface_plan.py index 8c7acd5..3e680b7 100644 --- a/tests/prompts/test_surface_plan.py +++ b/tests/prompts/test_surface_plan.py @@ -440,7 +440,19 @@ def _hand_over() -> str: def test_the_hand_over_stays_in_the_conversation_and_asks_amend_or_approve() -> None: hand_over = _hand_over() assert "Then stop" not in hand_over - assert "Say in one line how the body of the blueprint is cut, and why" in hand_over + # The cut and the gates are said once, and again only when a revision changed them. + first, later, pointer = _positions( + hand_over, + [ + "At the first hand over of the plan, when `journal.jsonl` holds a single", + "At a later one, say in one line which amendment or decision of `interview.md`", + "restate neither what it holds nor the plan", + ], + ) + assert first < later < pointer + assert "say in one line how the body of the blueprint is cut, and why" in hand_over + assert "and the cut or the gates again only when the revision changed them" in hand_over + assert "name the gates the loop will run, `gates` of `show`" in hand_over assert ( "stay in the conversation and ask: amend, or approve by launching `/surface-execute`, whose" " launch alone approves this revision" in hand_over