@opengsd/gsd-path 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/FULL.md +2 -2
- package/QUICK.md +1 -1
- package/README.md +9 -9
- package/WORKFLOW.md +2 -2
- package/package.json +1 -1
- package/scripts/dispatch_driver.py +5 -0
- package/scripts/isolation.py +20 -16
- package/skills/gsd-path/BUILD.md +3 -2
- package/skills/gsd-path/PLAN.md +3 -3
- package/skills/gsd-path/references/build-native.md +8 -4
- package/skills/gsd-path/references/planner.md +4 -3
- package/skills/gsd-path/references/reviewer-wave.md +10 -5
- package/skills/gsd-path/references/reviewer.md +13 -2
- package/skills/gsd-path/scripts/dispatch_driver.py +5 -0
- package/skills/gsd-path/scripts/isolation.py +20 -16
- package/skills/gsd-path/templates/plan.md +3 -2
- package/skills/gsd-path-build/SKILL.md +3 -2
- package/skills/gsd-path-build/references/build-native.md +8 -4
- package/skills/gsd-path-build/references/reviewer-wave.md +10 -5
- package/skills/gsd-path-build/references/reviewer.md +13 -2
- package/skills/gsd-path-build/scripts/dispatch_driver.py +5 -0
- package/skills/gsd-path-build/scripts/isolation.py +20 -16
- package/skills/gsd-path-decide/scripts/isolation.py +20 -16
- package/skills/gsd-path-define/scripts/isolation.py +20 -16
- package/skills/gsd-path-docs-audit/scripts/isolation.py +20 -16
- package/skills/gsd-path-inspect/scripts/isolation.py +20 -16
- package/skills/gsd-path-plan/SKILL.md +3 -3
- package/skills/gsd-path-plan/references/planner.md +4 -3
- package/skills/gsd-path-plan/scripts/isolation.py +20 -16
- package/skills/gsd-path-plan/templates/plan.md +3 -2
- package/skills/gsd-path-research/scripts/isolation.py +20 -16
- package/skills/gsd-path-roadmap/scripts/isolation.py +20 -16
- package/skills/gsd-path-ship/references/reviewer-wave.md +10 -5
- package/skills/gsd-path-ship/references/reviewer.md +13 -2
- package/skills/gsd-path-ship/scripts/isolation.py +20 -16
- package/skills/path/BUILD.md +3 -2
- package/skills/path/PLAN.md +3 -3
- package/skills/path/references/build-native.md +8 -4
- package/skills/path/references/planner.md +4 -3
- package/skills/path/references/reviewer-wave.md +10 -5
- package/skills/path/references/reviewer.md +13 -2
- package/skills/path/scripts/dispatch_driver.py +5 -0
- package/skills/path/scripts/isolation.py +20 -16
- package/skills/path/templates/plan.md +3 -2
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -155,9 +155,9 @@ as stated in Lookahead mode.
|
|
|
155
155
|
- Require a `Review depth` value (`full`, `deep`, or `verify-only`) on
|
|
156
156
|
every wave. Wave 1 and any wave touching authentication, authorization,
|
|
157
157
|
payments, data migration, or concurrency requires `full` or `deep`;
|
|
158
|
-
this includes quick-lane single waves.
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
this includes quick-lane single waves. Use `full` unless INTENT.md
|
|
159
|
+
records an explicit user request for adversarial review; risk alone
|
|
160
|
+
does not authorize `deep`.
|
|
161
161
|
- When INTENT.md `Surfaces:` is not `none`, require a PLAN.md
|
|
162
162
|
`## Surface contract` block per named surface with its Criteria, Entry,
|
|
163
163
|
States, Walkthrough, and the task that delivers it. Those criteria must be
|
|
@@ -33,9 +33,10 @@ the how.
|
|
|
33
33
|
parallelism or isolates a risk.
|
|
34
34
|
5. Assign each wave `Review depth: full`, `deep`, or `verify-only`. Wave 1
|
|
35
35
|
and any wave touching authentication, authorization, payments, data
|
|
36
|
-
migration, or concurrency requires `full` or `deep`.
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
migration, or concurrency requires `full` or `deep`. Use `full` unless
|
|
37
|
+
the user explicitly requested adversarial review and that request is
|
|
38
|
+
recorded in INTENT.md; only then may you assign `deep`. Risk alone
|
|
39
|
+
does not authorize adversarial review; `verify-only` suits polish and low-risk feature waves
|
|
39
40
|
whose Verify commands meaningfully cover the criteria.
|
|
40
41
|
|
|
41
42
|
Every dependency must be in an earlier wave or in the same wave. Same-wave
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -35,8 +35,9 @@ Project verify: `<command that installs dependencies, builds + tests the whole p
|
|
|
35
35
|
Goal: <what this wave proves; if it fails, what changes>
|
|
36
36
|
Review depth: full <!-- full | deep | verify-only. Wave 1 and auth/payments/
|
|
37
37
|
data migration/concurrency waves must be full or
|
|
38
|
-
deep.
|
|
39
|
-
|
|
38
|
+
deep. Use full unless the user explicitly requested
|
|
39
|
+
adversarial review, recorded in INTENT.md. Risk alone
|
|
40
|
+
does not authorize deep. -->
|
|
40
41
|
|
|
41
42
|
<!-- No task table. Task id, title, deps, and files live only in each
|
|
42
43
|
`tasks/T###-slug.md` frontmatter; `wave: N` there assigns it here. -->
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
|
@@ -80,8 +80,9 @@ or Verify commands that cannot fail unless either defeats a criterion. Set the
|
|
|
80
80
|
wave verdict to `pass` only when every task passes and every owned INTENT
|
|
81
81
|
success criterion for the wave passes.
|
|
82
82
|
|
|
83
|
-
For cycle greater than 1, read the previous review, re-check
|
|
84
|
-
and regression-check affected passes.
|
|
83
|
+
For cycle greater than 1, read the previous review, re-check repaired failures,
|
|
84
|
+
and regression-check affected passes only. Reuse settled evidence for unaffected
|
|
85
|
+
criteria; do not start a fresh search for improvements. State when the same criterion fails for
|
|
85
86
|
a different reason. Use only the wave-review template.
|
|
86
87
|
|
|
87
88
|
### Review file format
|
|
@@ -153,6 +154,8 @@ runtime checks freshness and derives the final view from these records.
|
|
|
153
154
|
|
|
154
155
|
## Deep review lenses
|
|
155
156
|
|
|
157
|
+
Use `deep` only when the user explicitly requested adversarial review and that
|
|
158
|
+
request is recorded in INTENT.md. Risk alone does not authorize it.
|
|
156
159
|
A `deep` wave spawns two independent reviewers in parallel, each with a fresh
|
|
157
160
|
context and its own isolated workspace at the recorded review base (a verify
|
|
158
161
|
sidecar in reconstructed mode, or the supplied combined checkout in immutable
|
|
@@ -166,9 +169,11 @@ mode). Every Wave mode rule above applies to both lenses.
|
|
|
166
169
|
contract`.
|
|
167
170
|
- **Adversarial** — logical task name
|
|
168
171
|
`review_wave_<wave>_cycle_<cycle>_adversarial`; stages
|
|
169
|
-
`.project/review/wave-N.cycleC.adversarial.md`.
|
|
170
|
-
|
|
171
|
-
|
|
172
|
+
`.project/review/wave-N.cycleC.adversarial.md`. Exercise failure paths within
|
|
173
|
+
the agreed contract, including its required security, data-loss, concurrency,
|
|
174
|
+
and error-handling behavior. Every blocking finding still needs a named
|
|
175
|
+
requirement and checked failure or missing required proof. Do not invent
|
|
176
|
+
additional requirements. Record `Lens: adversarial`.
|
|
172
177
|
|
|
173
178
|
The wave passes only when both lenses return `pass`; any `blocked` lens
|
|
174
179
|
blocks the wave.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Reviewer role
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Validate that the agreed work functions. Block contract failures or missing
|
|
4
|
+
required evidence. Never search for improvements or fix code.
|
|
4
5
|
|
|
5
6
|
## Brief contract
|
|
6
7
|
|
|
@@ -36,7 +37,17 @@ Resolve sibling links against this role file's directory.
|
|
|
36
37
|
|
|
37
38
|
- When `GSD_PATH_JEV=1`, wave and final reviewers follow the optional
|
|
38
39
|
[Jev evidence screening procedure](jev-review.md) for uncovered criteria.
|
|
39
|
-
-
|
|
40
|
+
- Use the written acceptance, interface, success, edge, prohibition, and
|
|
41
|
+
surface contracts as the complete review scope. Block only on a named
|
|
42
|
+
unmet requirement with checked evidence, or the specific missing evidence
|
|
43
|
+
needed to prove it. Passing tests alone do not prove a required walkthrough.
|
|
44
|
+
- Do not search for improvements, alternate designs, speculative hardening,
|
|
45
|
+
or unrelated edge cases. Do not turn these into findings or fix tasks.
|
|
46
|
+
A clean pass is a complete result; no finding quota applies.
|
|
47
|
+
- On re-review, check repaired failures and passes affected by the repair.
|
|
48
|
+
Reuse settled evidence for unaffected criteria; do not reopen them or
|
|
49
|
+
introduce new requirements. An observed regression against the unchanged
|
|
50
|
+
contract still blocks. Stop when every applicable claim is proven.
|
|
40
51
|
- Treat an Interface contract violation as a failed criterion, citing the
|
|
41
52
|
contract line and the offending diff hunk.
|
|
42
53
|
- Require checked evidence for every verdict.
|
|
@@ -5372,16 +5372,6 @@ def _committed_ship_active(repo: Path) -> bool:
|
|
|
5372
5372
|
return fields.get("phase") == "ship" and fields.get("status") == "active"
|
|
5373
5373
|
|
|
5374
5374
|
|
|
5375
|
-
# The STATE Log tail that sanctions a build checkpoint past a HEAD that is
|
|
5376
|
-
# still ship/active: the blocked final review went through the patch plan
|
|
5377
|
-
# (reopened, then approved) and build started again (#526).
|
|
5378
|
-
_PATCH_REENTRY_LOG = (
|
|
5379
|
-
("plan", "patch plan reopened"),
|
|
5380
|
-
("plan", "patch plan approved"),
|
|
5381
|
-
("build", "build started"),
|
|
5382
|
-
)
|
|
5383
|
-
|
|
5384
|
-
|
|
5385
5375
|
def _patch_reentry_build_active(repo: Path) -> bool:
|
|
5386
5376
|
"""True when the worktree STATE is the sanctioned patch-re-entry build.
|
|
5387
5377
|
|
|
@@ -5389,8 +5379,12 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5389
5379
|
(ship/active) on purpose: the patch plan runs uncommitted and the patch
|
|
5390
5380
|
build's own checkpoint commits the artifacts (SHIP.md). This reads the
|
|
5391
5381
|
worktree STATE the checkpoint is about to commit and accepts only the
|
|
5392
|
-
documented
|
|
5393
|
-
|
|
5382
|
+
documented shape: the Log ends with the build restart, the event before
|
|
5383
|
+
it closes the plan stay with the patch approval, and that stay opened
|
|
5384
|
+
with `patch plan reopened` — a resumed planner logs `patch planning
|
|
5385
|
+
blocked` and `planning resumed` inside the same stay (#531). A
|
|
5386
|
+
hand-flipped build/active during final review carries no such Log tail
|
|
5387
|
+
and stays refused (#429, #526).
|
|
5394
5388
|
"""
|
|
5395
5389
|
|
|
5396
5390
|
state = repo / ".project" / "STATE.md"
|
|
@@ -5410,10 +5404,20 @@ def _patch_reentry_build_active(repo: Path) -> bool:
|
|
|
5410
5404
|
match = re.fullmatch(r"- \d{4}-\d{2}-\d{2} — (\S+) — (.+)", line)
|
|
5411
5405
|
if match:
|
|
5412
5406
|
events.append((match.group(1), match.group(2)))
|
|
5413
|
-
# The
|
|
5414
|
-
#
|
|
5415
|
-
|
|
5416
|
-
|
|
5407
|
+
# The final event must be the build restart, the event before it must
|
|
5408
|
+
# close the plan stay with the patch approval, and that stay must open
|
|
5409
|
+
# with the reopen; every plan event between them (a blocked, resumed
|
|
5410
|
+
# planner) stays inside the run (#531).
|
|
5411
|
+
if len(events) < 2 or events[-1] != ("build", "build started"):
|
|
5412
|
+
return False
|
|
5413
|
+
if events[-2] != ("plan", "patch plan approved"):
|
|
5414
|
+
return False
|
|
5415
|
+
stay = 0
|
|
5416
|
+
for phase, _event in reversed(events[:-1]):
|
|
5417
|
+
if phase != "plan":
|
|
5418
|
+
break
|
|
5419
|
+
stay += 1
|
|
5420
|
+
return events[-(stay + 1)] == ("plan", "patch plan reopened")
|
|
5417
5421
|
|
|
5418
5422
|
|
|
5419
5423
|
def checkpoint(
|
package/skills/path/BUILD.md
CHANGED
|
@@ -133,8 +133,9 @@ that same brief into `.project/archive/`; build adds fix tasks and repairs
|
|
|
133
133
|
briefs, it never replans. It also refuses a `build:` checkpoint while the
|
|
134
134
|
committed STATE is `ship/active`: final-review outputs stay uncommitted until
|
|
135
135
|
the ship commit. The one exception is the patch re-entry checkpoint: the
|
|
136
|
-
worktree STATE is `build/active
|
|
137
|
-
`
|
|
136
|
+
worktree STATE is `build/active`, its Log ends with `patch plan approved`
|
|
137
|
+
then `build started`, and the plan stay holding that approval opened with
|
|
138
|
+
`patch plan reopened` (a blocked, resumed planner may log events inside it).
|
|
138
139
|
|
|
139
140
|
## Execute from runtime receipts
|
|
140
141
|
|
package/skills/path/PLAN.md
CHANGED
|
@@ -155,9 +155,9 @@ as stated in Lookahead mode.
|
|
|
155
155
|
- Require a `Review depth` value (`full`, `deep`, or `verify-only`) on
|
|
156
156
|
every wave. Wave 1 and any wave touching authentication, authorization,
|
|
157
157
|
payments, data migration, or concurrency requires `full` or `deep`;
|
|
158
|
-
this includes quick-lane single waves.
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
this includes quick-lane single waves. Use `full` unless INTENT.md
|
|
159
|
+
records an explicit user request for adversarial review; risk alone
|
|
160
|
+
does not authorize `deep`.
|
|
161
161
|
- When INTENT.md `Surfaces:` is not `none`, require a PLAN.md
|
|
162
162
|
`## Surface contract` block per named surface with its Criteria, Entry,
|
|
163
163
|
States, Walkthrough, and the task that delivers it. Those criteria must be
|
|
@@ -415,7 +415,10 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
415
415
|
stages `.project/review/wave-N.cycleC.md` there; the
|
|
416
416
|
orchestrator validates it, atomically copies it to the primary canonical
|
|
417
417
|
path, and only then retires that sidecar with `retire`.
|
|
418
|
-
- `deep`:
|
|
418
|
+
- `deep`: require an explicit user request for adversarial review recorded
|
|
419
|
+
in INTENT.md. Risk alone does not authorize it; without the request,
|
|
420
|
+
return the plan to its owner for `full` review selection before dispatch.
|
|
421
|
+
Spawn two independent reviewers in parallel, each with a fresh
|
|
419
422
|
isolated context and its own verify sidecar from `isolate-verify` at the
|
|
420
423
|
recorded review base (`--name wave-<N>-cycle-<C>-contract` and
|
|
421
424
|
`wave-<N>-cycle-<C>-adversarial`). Supply both every task path, its
|
|
@@ -427,9 +430,10 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
427
430
|
check every acceptance criterion,
|
|
428
431
|
owned INTENT success criterion, and interface contract. The adversarial
|
|
429
432
|
lens — logical task name
|
|
430
|
-
`review_wave_<wave>_cycle_<cycle>_adversarial` —
|
|
431
|
-
|
|
432
|
-
|
|
433
|
+
`review_wave_<wave>_cycle_<cycle>_adversarial` — exercises failure paths
|
|
434
|
+
required by the agreed contract. Every blocker needs a named unmet
|
|
435
|
+
requirement with checked evidence or missing required proof. Neither
|
|
436
|
+
lens searches for improvements or expands the contract. Each stages its own file
|
|
433
437
|
in its own worktree — `.project/review/wave-N.cycleC.contract.md` and
|
|
434
438
|
`.project/review/wave-N.cycleC.adversarial.md`; the orchestrator validates
|
|
435
439
|
each, atomically copies both to their primary canonical paths, and only
|