gm-continue
gm-continue
This is the only allowed next step when a gm walk reaches phase=COMPLETE AND prd_pending_count=0. Never end that turn with prose alone -- dispatch this skill instead, every time, no exceptions for "it looks finished."
This skill itself has exactly two allowed ways to end, and no others. (1) Dispatch Skill(skill="gm") with the remaining PRD rows (found reachable work, or reopened an external/out-of-reach row, or this is the first confirming pass this session) -- gm then runs and, when it reaches COMPLETE again, calls back into this same skill. (2) Confirm there are no remaining PRD rows and none can be added -- a real, witnessed check (steps 2-4 below actually run, not assumed), not a feeling of "probably done." There is no third path: no prose-only stop that isn't outcome (2), no deferring to the user to decide whether to continue, no partial confirmation. Every dispatch of this skill lands in exactly one of these two states before the turn ends.
What this skill does
- Read
.gm/exec-spool/.turn-summary.jsonfor the currentphase,prd_pending, and how many times this repo has already round-tripped throughgm-continuethis session (track via a counter file, see below). - Read
.gm/prd.ymland.gm/mutables.ymldirectly for any row markedblockedBy: [external]/[out-of-reach]or otherwise deferred. A priorexternal/out-of-reachmarking is not a closed door -- it is remaining work by definition. Re-examine each one now: is the blocker still genuinely unreachable this turn, or was it marked that way under time/scope pressure when it was actually solvable? Anything reachable now goes back into scope, re-prd-add'd (re-scope the existing id, never delete-and-re-add) as work to actually solve, not left marked external. - Fan out
codesearch+recallagainst the ORIGINAL request's full closure, not against memory of what was already done -- a fresh look, same discipline asgm's own PLAN orient. 3a. Re-read the user's literal words from this turn, then exercise the live system now to check the shipped behavior against them. No test file, prior PRDwitnessedmark, or recollection of the fix counts as evidence --prd_pending_count=0only proves no row is open, not that closed rows match what was actually asked, and a row resolved in the same pass as its own check can share that check's misreading. Run the real path the user would use and read the real output. Any mismatch is remaining work,prd-add'd fresh. - If
.gm/prd.ymlhas ANY items at all (pending, or reopenedexternalrows from step 2), that alone is remaining work -- skip straight to the dispatch below, no further search needed. - Two outcomes, decided by what steps 2-4 actually find:
- Real remaining work found (any PRD item at all, a reopened external/out-of-reach row, an unaddressed noun from the request, an edge case never exercised, a residual never triaged, a sibling repo never checked): dispatch
Skill(skill="gm")and instruct it explicitly to finish ALL remaining tasks in.gm/prd.ymland fix any issues that arise while doing so -- not a narrow slice, not "just the reopened ones." Tell it plainly what was found so it lands directly in PLAN with real rows, not a blind re-orient. - Nothing found, but this is the first
gm-continuedispatch this session: dispatchSkill(skill="gm")anyway, once, to let a full independent PLAN pass confirm it from insidegm's own discipline (freshcodesearch/recall,prd_pending_count=0reached with nothing new added). That confirming turn insidegmis the actual stopping point -- prose-only is earned there, not here. - Nothing found, and
gm-continuealready ran that confirming pass this session (counter >= 1): the loop is closed. Prose-only summary is authorized. Do not dispatch anything further.
- Real remaining work found (any PRD item at all, a reopened external/out-of-reach row, an unaddressed noun from the request, an edge case never exercised, a residual never triaged, a sibling repo never checked): dispatch