@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
|
@@ -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
|
|
@@ -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.
|
|
@@ -1461,6 +1461,9 @@ def review_brief(state: Dict[str, object], options: argparse.Namespace, primary:
|
|
|
1461
1461
|
f"You are the reviewer for GSD Path wave {wave}, cycle {cycle}; logical task name "
|
|
1462
1462
|
f"{state['task_id']}. Mode: wave" + (f"; lens: {lens}." if lens else "."),
|
|
1463
1463
|
f"Read the reviewer role brief first and follow it exactly: {options.role_brief}",
|
|
1464
|
+
"Validate the agreed acceptance contract. "
|
|
1465
|
+
"Block only on a named unmet requirement or missing required evidence. "
|
|
1466
|
+
"Do not search for improvements or expand the agreed contract.",
|
|
1464
1467
|
f"Template (use only this): {options.template}",
|
|
1465
1468
|
f"AGENTS.md: {agents if agents.exists() else 'absent'}",
|
|
1466
1469
|
f"Repository root, read-only: {primary}",
|
|
@@ -1478,6 +1481,8 @@ def review_brief(state: Dict[str, object], options: argparse.Namespace, primary:
|
|
|
1478
1481
|
f"landing commit {task['commit']}")
|
|
1479
1482
|
if previous is not None:
|
|
1480
1483
|
lines.append(f"Previous cycle review to re-check: {previous}")
|
|
1484
|
+
lines.append("Re-check repaired failures and affected passes only. "
|
|
1485
|
+
"Reuse settled evidence for unaffected criteria.")
|
|
1481
1486
|
if options.repair_evidence:
|
|
1482
1487
|
lines.append(f"Repair evidence receipt (re-review after a proven repair): {options.repair_evidence}")
|
|
1483
1488
|
if final_scope:
|
|
@@ -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. -->
|