@opengsd/gsd-path 1.4.0 → 1.5.0
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 +325 -344
- package/DOCS.md +12 -2
- package/FULL.md +3 -2
- package/HOOKS.md +95 -8
- package/QUICK.md +1 -1
- package/README.md +78 -110
- package/RUNTIME.md +1 -1
- package/UPDATE.md +4 -3
- package/WORKFLOW.md +22 -1
- package/package.json +5 -2
- package/platforms/shared-agents/dispatch.md +13 -0
- package/scripts/_common.py +149 -1
- package/scripts/archive_milestone.py +14 -13
- package/scripts/build_recovery.py +96 -31
- package/scripts/build_state.py +79 -3
- package/scripts/check_docs_audit.py +77 -4
- package/scripts/check_handoffs.py +546 -30
- package/scripts/check_task_briefs.py +279 -23
- package/scripts/detect_project.py +243 -18
- package/scripts/discussion_validate.py +86 -29
- package/scripts/dispatch_driver.py +392 -22
- package/scripts/git_guard.py +3 -3
- package/scripts/guard_hook.py +1416 -165
- package/scripts/install.mjs +23 -8
- package/scripts/install.py +49 -9
- package/scripts/integration.py +146 -1
- package/scripts/isolation.py +392 -60
- package/scripts/loop_run.py +16 -4
- package/scripts/members.py +11 -9
- package/scripts/path_config.py +3 -3
- package/scripts/pipeline_git.py +63 -12
- package/scripts/pipeline_state.py +111 -33
- package/scripts/pipeline_undo.py +101 -8
- package/scripts/runtime_store.py +20 -2
- package/scripts/skill-resources.json +9 -2
- package/scripts/state_checkpoint.py +9 -27
- package/scripts/status_runtime.py +22 -4
- package/scripts/task_context.py +12 -3
- package/scripts/wizard.mjs +1 -0
- package/scripts/workflow_run.py +5 -2
- package/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path/DEFINE.md +28 -3
- package/skills/gsd-path/PLAN.md +11 -3
- package/skills/gsd-path/RESEARCH.md +11 -0
- package/skills/gsd-path/SHIP.md +6 -1
- package/skills/gsd-path/references/build-native.md +16 -1
- package/skills/gsd-path/references/dispatch.md +13 -0
- package/skills/gsd-path/references/docs-auditor.md +5 -0
- package/skills/gsd-path/references/planner.md +14 -4
- package/skills/gsd-path/references/reviewer-final.md +20 -2
- package/skills/gsd-path/references/reviewer-wave.md +15 -4
- package/skills/gsd-path/references/reviewer.md +3 -1
- package/skills/gsd-path/references/spec-probes.md +150 -0
- package/skills/gsd-path/scripts/_common.py +149 -1
- package/skills/gsd-path/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path/scripts/build_recovery.py +96 -31
- package/skills/gsd-path/scripts/build_state.py +79 -3
- package/skills/gsd-path/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path/scripts/detect_project.py +243 -18
- package/skills/gsd-path/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path/scripts/dispatch_driver.py +392 -22
- package/skills/gsd-path/scripts/git_guard.py +3 -3
- package/skills/gsd-path/scripts/integration.py +146 -1
- package/skills/gsd-path/scripts/isolation.py +392 -60
- package/skills/gsd-path/scripts/loop_run.py +16 -4
- package/skills/gsd-path/scripts/members.py +11 -9
- package/skills/gsd-path/scripts/path_config.py +3 -3
- package/skills/gsd-path/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path/scripts/status_runtime.py +22 -4
- package/skills/gsd-path/scripts/task_context.py +12 -3
- package/skills/gsd-path/scripts/workflow_run.py +5 -2
- package/skills/gsd-path/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path/templates/docs-audit.md +5 -1
- package/skills/gsd-path/templates/final-review.md +11 -2
- package/skills/gsd-path/templates/intent.md +30 -0
- package/skills/gsd-path/templates/patch-findings.md +3 -3
- package/skills/gsd-path/templates/plan.md +17 -2
- package/skills/gsd-path/templates/research-handoff.md +14 -3
- package/skills/gsd-path/templates/state.md +1 -1
- package/skills/gsd-path/templates/wave-review.md +16 -6
- package/skills/gsd-path-build/references/build-native.md +16 -1
- package/skills/gsd-path-build/references/dispatch.md +13 -0
- package/skills/gsd-path-build/references/reviewer-final.md +20 -2
- package/skills/gsd-path-build/references/reviewer-wave.md +15 -4
- package/skills/gsd-path-build/references/reviewer.md +3 -1
- package/skills/gsd-path-build/references/spec-probes.md +150 -0
- package/skills/gsd-path-build/scripts/_common.py +149 -1
- package/skills/gsd-path-build/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-build/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-build/scripts/build_state.py +79 -3
- package/skills/gsd-path-build/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-build/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-build/scripts/detect_project.py +243 -18
- package/skills/gsd-path-build/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-build/scripts/dispatch_driver.py +392 -22
- package/skills/gsd-path-build/scripts/integration.py +146 -1
- package/skills/gsd-path-build/scripts/isolation.py +392 -60
- package/skills/gsd-path-build/scripts/loop_run.py +16 -4
- package/skills/gsd-path-build/scripts/members.py +11 -9
- package/skills/gsd-path-build/scripts/path_config.py +3 -3
- package/skills/gsd-path-build/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-build/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-build/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-build/scripts/task_context.py +12 -3
- package/skills/gsd-path-build/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-build/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-build/templates/wave-review.md +16 -6
- package/skills/gsd-path-decide/references/dispatch.md +13 -0
- package/skills/gsd-path-decide/scripts/_common.py +149 -1
- package/skills/gsd-path-decide/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-decide/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-decide/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-decide/scripts/detect_project.py +243 -18
- package/skills/gsd-path-decide/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-decide/scripts/integration.py +146 -1
- package/skills/gsd-path-decide/scripts/isolation.py +392 -60
- package/skills/gsd-path-decide/scripts/loop_run.py +16 -4
- package/skills/gsd-path-decide/scripts/members.py +11 -9
- package/skills/gsd-path-decide/scripts/path_config.py +3 -3
- package/skills/gsd-path-decide/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-decide/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-decide/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-define/SKILL.md +28 -3
- package/skills/gsd-path-define/references/spec-probes.md +150 -0
- package/skills/gsd-path-define/scripts/_common.py +149 -1
- package/skills/gsd-path-define/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-define/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-define/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-define/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-define/scripts/detect_project.py +243 -18
- package/skills/gsd-path-define/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-define/scripts/integration.py +146 -1
- package/skills/gsd-path-define/scripts/isolation.py +392 -60
- package/skills/gsd-path-define/scripts/loop_run.py +16 -4
- package/skills/gsd-path-define/scripts/members.py +11 -9
- package/skills/gsd-path-define/scripts/path_config.py +3 -3
- package/skills/gsd-path-define/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-define/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-define/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-define/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-define/templates/intent.md +30 -0
- package/skills/gsd-path-define/templates/state.md +1 -1
- package/skills/gsd-path-discuss/scripts/_common.py +149 -1
- package/skills/gsd-path-discuss/scripts/loop_run.py +16 -4
- package/skills/gsd-path-discuss/scripts/path_config.py +3 -3
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +5 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +149 -1
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +243 -18
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-docs-audit/scripts/integration.py +146 -1
- package/skills/gsd-path-docs-audit/scripts/isolation.py +392 -60
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +16 -4
- package/skills/gsd-path-docs-audit/scripts/members.py +11 -9
- package/skills/gsd-path-docs-audit/scripts/path_config.py +3 -3
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +5 -1
- package/skills/gsd-path-forensics/scripts/_common.py +149 -1
- package/skills/gsd-path-forensics/scripts/loop_run.py +16 -4
- package/skills/gsd-path-forensics/scripts/path_config.py +3 -3
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +101 -8
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-inspect/references/dispatch.md +13 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +5 -0
- package/skills/gsd-path-inspect/scripts/_common.py +149 -1
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-inspect/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +77 -4
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-inspect/scripts/detect_project.py +243 -18
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-inspect/scripts/integration.py +146 -1
- package/skills/gsd-path-inspect/scripts/isolation.py +392 -60
- package/skills/gsd-path-inspect/scripts/loop_run.py +16 -4
- package/skills/gsd-path-inspect/scripts/members.py +11 -9
- package/skills/gsd-path-inspect/scripts/path_config.py +3 -3
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-inspect/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-inspect/templates/docs-audit.md +5 -1
- package/skills/gsd-path-inspect/templates/state.md +1 -1
- package/skills/gsd-path-loop/scripts/_common.py +149 -1
- package/skills/gsd-path-loop/scripts/loop_run.py +16 -4
- package/skills/gsd-path-loop/scripts/path_config.py +3 -3
- package/skills/gsd-path-loop/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-migrate/scripts/_common.py +149 -1
- package/skills/gsd-path-migrate/scripts/loop_run.py +16 -4
- package/skills/gsd-path-migrate/scripts/path_config.py +3 -3
- package/skills/gsd-path-plan/SKILL.md +11 -3
- package/skills/gsd-path-plan/references/dispatch.md +13 -0
- package/skills/gsd-path-plan/references/planner.md +14 -4
- package/skills/gsd-path-plan/references/spec-probes.md +150 -0
- package/skills/gsd-path-plan/scripts/_common.py +149 -1
- package/skills/gsd-path-plan/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-plan/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-plan/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-plan/scripts/detect_project.py +243 -18
- package/skills/gsd-path-plan/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-plan/scripts/integration.py +146 -1
- package/skills/gsd-path-plan/scripts/isolation.py +392 -60
- package/skills/gsd-path-plan/scripts/loop_run.py +16 -4
- package/skills/gsd-path-plan/scripts/members.py +11 -9
- package/skills/gsd-path-plan/scripts/path_config.py +3 -3
- package/skills/gsd-path-plan/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-plan/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-plan/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-plan/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-plan/templates/patch-findings.md +3 -3
- package/skills/gsd-path-plan/templates/plan.md +17 -2
- package/skills/gsd-path-research/SKILL.md +11 -0
- package/skills/gsd-path-research/references/dispatch.md +13 -0
- package/skills/gsd-path-research/scripts/_common.py +149 -1
- package/skills/gsd-path-research/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-research/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-research/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-research/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-research/scripts/detect_project.py +243 -18
- package/skills/gsd-path-research/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-research/scripts/integration.py +146 -1
- package/skills/gsd-path-research/scripts/isolation.py +392 -60
- package/skills/gsd-path-research/scripts/loop_run.py +16 -4
- package/skills/gsd-path-research/scripts/members.py +11 -9
- package/skills/gsd-path-research/scripts/path_config.py +3 -3
- package/skills/gsd-path-research/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-research/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-research/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-research/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-research/templates/research-handoff.md +14 -3
- package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +149 -1
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-roadmap/scripts/detect_project.py +243 -18
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-roadmap/scripts/integration.py +146 -1
- package/skills/gsd-path-roadmap/scripts/isolation.py +392 -60
- package/skills/gsd-path-roadmap/scripts/loop_run.py +16 -4
- package/skills/gsd-path-roadmap/scripts/members.py +11 -9
- package/skills/gsd-path-roadmap/scripts/path_config.py +3 -3
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-ship/SKILL.md +6 -1
- package/skills/gsd-path-ship/references/dispatch.md +13 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
- package/skills/gsd-path-ship/references/reviewer-wave.md +15 -4
- package/skills/gsd-path-ship/references/reviewer.md +3 -1
- package/skills/gsd-path-ship/references/spec-probes.md +150 -0
- package/skills/gsd-path-ship/scripts/_common.py +149 -1
- package/skills/gsd-path-ship/scripts/archive_milestone.py +14 -13
- package/skills/gsd-path-ship/scripts/build_recovery.py +96 -31
- package/skills/gsd-path-ship/scripts/build_state.py +79 -3
- package/skills/gsd-path-ship/scripts/check_handoffs.py +546 -30
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +279 -23
- package/skills/gsd-path-ship/scripts/detect_project.py +243 -18
- package/skills/gsd-path-ship/scripts/discussion_validate.py +86 -29
- package/skills/gsd-path-ship/scripts/integration.py +146 -1
- package/skills/gsd-path-ship/scripts/isolation.py +392 -60
- package/skills/gsd-path-ship/scripts/loop_run.py +16 -4
- package/skills/gsd-path-ship/scripts/members.py +11 -9
- package/skills/gsd-path-ship/scripts/path_config.py +3 -3
- package/skills/gsd-path-ship/scripts/pipeline_git.py +63 -12
- package/skills/gsd-path-ship/scripts/pipeline_state.py +111 -33
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +9 -27
- package/skills/gsd-path-ship/scripts/workflow_run.py +5 -2
- package/skills/gsd-path-ship/scripts/worktree_paths.py +54 -2
- package/skills/gsd-path-ship/templates/final-review.md +11 -2
- package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
- package/skills/gsd-path-ship/templates/wave-review.md +16 -6
- package/skills/gsd-path-undo/scripts/_common.py +149 -1
- package/skills/gsd-path-undo/scripts/loop_run.py +16 -4
- package/skills/gsd-path-undo/scripts/path_config.py +3 -3
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +101 -8
- package/skills/gsd-path-undo/scripts/worktree_paths.py +54 -2
- package/skills/path/DEFINE.md +28 -3
- package/skills/path/PLAN.md +11 -3
- package/skills/path/RESEARCH.md +11 -0
- package/skills/path/SHIP.md +6 -1
- package/skills/path/references/build-native.md +16 -1
- package/skills/path/references/dispatch.md +13 -0
- package/skills/path/references/docs-auditor.md +5 -0
- package/skills/path/references/planner.md +14 -4
- package/skills/path/references/reviewer-final.md +20 -2
- package/skills/path/references/reviewer-wave.md +15 -4
- package/skills/path/references/reviewer.md +3 -1
- package/skills/path/references/spec-probes.md +150 -0
- package/skills/path/scripts/_common.py +149 -1
- package/skills/path/scripts/archive_milestone.py +14 -13
- package/skills/path/scripts/build_recovery.py +96 -31
- package/skills/path/scripts/build_state.py +79 -3
- package/skills/path/scripts/check_docs_audit.py +77 -4
- package/skills/path/scripts/check_handoffs.py +546 -30
- package/skills/path/scripts/check_task_briefs.py +279 -23
- package/skills/path/scripts/detect_project.py +243 -18
- package/skills/path/scripts/discussion_validate.py +86 -29
- package/skills/path/scripts/dispatch_driver.py +392 -22
- package/skills/path/scripts/git_guard.py +3 -3
- package/skills/path/scripts/integration.py +146 -1
- package/skills/path/scripts/isolation.py +392 -60
- package/skills/path/scripts/loop_run.py +16 -4
- package/skills/path/scripts/members.py +11 -9
- package/skills/path/scripts/path_config.py +3 -3
- package/skills/path/scripts/pipeline_git.py +63 -12
- package/skills/path/scripts/pipeline_state.py +111 -33
- package/skills/path/scripts/state_checkpoint.py +9 -27
- package/skills/path/scripts/status_runtime.py +22 -4
- package/skills/path/scripts/task_context.py +12 -3
- package/skills/path/scripts/workflow_run.py +5 -2
- package/skills/path/scripts/worktree_paths.py +54 -2
- package/skills/path/templates/docs-audit.md +5 -1
- package/skills/path/templates/final-review.md +11 -2
- package/skills/path/templates/intent.md +30 -0
- package/skills/path/templates/patch-findings.md +3 -3
- package/skills/path/templates/plan.md +17 -2
- package/skills/path/templates/research-handoff.md +14 -3
- package/skills/path/templates/state.md +1 -1
- package/skills/path/templates/wave-review.md +16 -6
- package/skills/gsd-path/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-build/scripts/__pycache__/check_handoffs.cpython-312.pyc +0 -0
- package/skills/gsd-path-inspect/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-plan/scripts/__pycache__/_common.cpython-312.pyc +0 -0
- package/skills/gsd-path-ship/scripts/__pycache__/_common.cpython-312.pyc +0 -0
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"cursor": {"local_root": ".cursor/skills", "guard_tier": "native-fail-closed", "child_apis": ["Task"]},
|
|
11
11
|
"zed": {"local_root": ".agents/skills", "guard_tier": "git-only", "invocation_prefix": "/", "child_apis": ["spawn_agent"]},
|
|
12
12
|
"kiro": {"local_root": ".kiro/skills", "guard_tier": "git-only", "child_apis": ["invoke_sub_agent"]},
|
|
13
|
-
"kimi": {"local_root": ".kimi-code/skills", "guard_tier": "git-only", "child_apis": ["Agent"]}
|
|
13
|
+
"kimi": {"local_root": ".kimi-code/skills", "guard_tier": "git-only", "child_apis": ["Agent"]},
|
|
14
|
+
"muse": {"local_root": ".agents/skills", "guard_tier": "git-only", "invocation_prefix": "/", "child_apis": ["muse.subagent_spawn"]}
|
|
14
15
|
},
|
|
15
16
|
"skills": [
|
|
16
17
|
"gsd-path",
|
|
@@ -96,7 +97,9 @@
|
|
|
96
97
|
"skills/",
|
|
97
98
|
"platforms/",
|
|
98
99
|
"AGENTS.md",
|
|
99
|
-
"WORKFLOW.md"
|
|
100
|
+
"WORKFLOW.md",
|
|
101
|
+
"!**/__pycache__/**",
|
|
102
|
+
"!**/*.pyc"
|
|
100
103
|
],
|
|
101
104
|
"phase_resources": {
|
|
102
105
|
"gsd-path-build": [
|
|
@@ -114,6 +117,7 @@
|
|
|
114
117
|
"references/reviewer-skeptic.md",
|
|
115
118
|
"references/reviewer-final.md",
|
|
116
119
|
"references/reviewer-panel.md",
|
|
120
|
+
"references/spec-probes.md",
|
|
117
121
|
|
|
118
122
|
"templates/task.md",
|
|
119
123
|
"templates/wave-review.md",
|
|
@@ -138,6 +142,7 @@
|
|
|
138
142
|
"references/runtime-selection.md",
|
|
139
143
|
"references/operating-rules.md",
|
|
140
144
|
"references/build-recovery.md",
|
|
145
|
+
"references/spec-probes.md",
|
|
141
146
|
"templates/charter.md",
|
|
142
147
|
"templates/intent.md",
|
|
143
148
|
"templates/state.md"
|
|
@@ -173,6 +178,7 @@
|
|
|
173
178
|
"references/dispatch.md",
|
|
174
179
|
"references/model-policy.md",
|
|
175
180
|
"references/planner.md",
|
|
181
|
+
"references/spec-probes.md",
|
|
176
182
|
"templates/patch-findings.md",
|
|
177
183
|
"templates/plan.md",
|
|
178
184
|
"templates/plan-panel.md",
|
|
@@ -206,6 +212,7 @@
|
|
|
206
212
|
"references/reviewer-skeptic.md",
|
|
207
213
|
"references/reviewer-final.md",
|
|
208
214
|
"references/reviewer-panel.md",
|
|
215
|
+
"references/spec-probes.md",
|
|
209
216
|
|
|
210
217
|
"templates/archive-manifest.md",
|
|
211
218
|
"templates/final-review.md",
|
|
@@ -18,14 +18,14 @@ from pathlib import Path, PurePosixPath
|
|
|
18
18
|
from typing import Mapping, Optional, Sequence
|
|
19
19
|
|
|
20
20
|
if __package__:
|
|
21
|
-
from .isolation import IsolationError, checkpoint as isolation_checkpoint,
|
|
21
|
+
from .isolation import IsolationError, checkpoint as isolation_checkpoint, PROJECT_ENTRIES
|
|
22
22
|
else:
|
|
23
23
|
try:
|
|
24
|
-
from isolation import IsolationError, checkpoint as isolation_checkpoint,
|
|
24
|
+
from isolation import IsolationError, checkpoint as isolation_checkpoint, PROJECT_ENTRIES
|
|
25
25
|
except ModuleNotFoundError as error: # pragma: no cover - package imports used by tests
|
|
26
26
|
if error.name != "isolation":
|
|
27
27
|
raise
|
|
28
|
-
from scripts.isolation import IsolationError, checkpoint as isolation_checkpoint,
|
|
28
|
+
from scripts.isolation import IsolationError, checkpoint as isolation_checkpoint, PROJECT_ENTRIES
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
if __package__:
|
|
@@ -444,14 +444,14 @@ def _validate_plan_briefs(repo: Path, kind: str, project_dir: str) -> None:
|
|
|
444
444
|
# Pre-Git approval defers base-dependent checks to build.
|
|
445
445
|
return
|
|
446
446
|
if __package__:
|
|
447
|
-
from .check_task_briefs import BriefError, _member_bases, validate_task_briefs
|
|
447
|
+
from .check_task_briefs import BriefError, _member_bases, plan_validation_bases, validate_task_briefs
|
|
448
448
|
else:
|
|
449
449
|
try:
|
|
450
|
-
from check_task_briefs import BriefError, _member_bases, validate_task_briefs
|
|
450
|
+
from check_task_briefs import BriefError, _member_bases, plan_validation_bases, validate_task_briefs
|
|
451
451
|
except ModuleNotFoundError as error: # pragma: no cover - package imports
|
|
452
452
|
if error.name != "check_task_briefs":
|
|
453
453
|
raise
|
|
454
|
-
from scripts.check_task_briefs import BriefError, _member_bases, validate_task_briefs
|
|
454
|
+
from scripts.check_task_briefs import BriefError, _member_bases, plan_validation_bases, validate_task_briefs
|
|
455
455
|
if __package__:
|
|
456
456
|
from . import check_handoffs
|
|
457
457
|
else:
|
|
@@ -462,28 +462,10 @@ def _validate_plan_briefs(repo: Path, kind: str, project_dir: str) -> None:
|
|
|
462
462
|
raise
|
|
463
463
|
from scripts import check_handoffs
|
|
464
464
|
try:
|
|
465
|
-
tasks, dependency_files = check_handoffs.plan_brief_inputs(repo, project_dir)
|
|
466
|
-
landed_bases = {}
|
|
467
465
|
member_base = _member_bases(repo)
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
agent = check_handoffs._task_scalar(text, task_id, "agent")
|
|
472
|
-
if agent in {"", "null"}:
|
|
473
|
-
raise BriefError(f"{task_id} landed task has no recorded agent")
|
|
474
|
-
member = check_handoffs._strict_frontmatter(text, task_id).get("repo")
|
|
475
|
-
base_repo = repo
|
|
476
|
-
if member is not None:
|
|
477
|
-
located = member_base(member) if isinstance(member, str) and member else None
|
|
478
|
-
if located is None:
|
|
479
|
-
raise BriefError(f"repo: names no member in MEMBERS.md: {member}")
|
|
480
|
-
base_repo = located[0]
|
|
481
|
-
recorded_base = check_handoffs._task_scalar(text, task_id, "base")
|
|
482
|
-
try:
|
|
483
|
-
landed_bases[task_id] = require_commit(base_repo, require_full_sha(recorded_base))
|
|
484
|
-
except IsolationError as error:
|
|
485
|
-
raise BriefError(f"{task_id} landed task has invalid historical base: {error}") from error
|
|
486
|
-
dependency_files[task_id] = set()
|
|
466
|
+
tasks, dependency_files, landed_bases = plan_validation_bases(
|
|
467
|
+
repo, project_dir, member_base, initial=True
|
|
468
|
+
)
|
|
487
469
|
validate_task_briefs(
|
|
488
470
|
repo, head.stdout.strip(), f"{project_dir}/tasks",
|
|
489
471
|
dependency_files=dependency_files, landed_bases=landed_bases,
|
|
@@ -6,6 +6,7 @@ import hashlib
|
|
|
6
6
|
import errno
|
|
7
7
|
import json
|
|
8
8
|
import os
|
|
9
|
+
import stat
|
|
9
10
|
import subprocess
|
|
10
11
|
import sys
|
|
11
12
|
import time
|
|
@@ -151,7 +152,17 @@ def validate_runtime(data: dict) -> Path:
|
|
|
151
152
|
path = root / name
|
|
152
153
|
if path.is_symlink() or hashlib.sha256(path.read_bytes()).hexdigest() != expected:
|
|
153
154
|
raise ValueError(f"runtime file changed: {name}")
|
|
154
|
-
|
|
155
|
+
runtime_entries = set()
|
|
156
|
+
for path in root.iterdir():
|
|
157
|
+
if path.name == "__pycache__":
|
|
158
|
+
if not stat.S_ISDIR(path.lstat().st_mode):
|
|
159
|
+
raise ValueError("unexpected runtime files")
|
|
160
|
+
for cached in path.iterdir():
|
|
161
|
+
if cached.suffix != ".pyc" or not stat.S_ISREG(cached.lstat().st_mode):
|
|
162
|
+
raise ValueError("unexpected runtime files")
|
|
163
|
+
continue
|
|
164
|
+
runtime_entries.add(path.name)
|
|
165
|
+
if runtime_entries != set(files) | {"manifest.json"}:
|
|
155
166
|
raise ValueError("unexpected runtime files")
|
|
156
167
|
except (OSError, ValueError, TypeError) as error:
|
|
157
168
|
raise ValueError(hint + f" ({error})") from error
|
|
@@ -167,8 +178,13 @@ def run_guard(repo: Path, name: str) -> None:
|
|
|
167
178
|
root = resolve_runtime(repo)
|
|
168
179
|
sys.dont_write_bytecode = True
|
|
169
180
|
sys.path.insert(0, str(root))
|
|
170
|
-
|
|
171
|
-
|
|
181
|
+
previous_pycache_prefix = sys.pycache_prefix
|
|
182
|
+
sys.pycache_prefix = str(root / "manifest.json")
|
|
183
|
+
try:
|
|
184
|
+
code = compile((root / name).read_bytes(), str(root / name), "exec")
|
|
185
|
+
exec(code, {"__name__": "__main__", "__file__": str(repo / ".gsd-path" / name)})
|
|
186
|
+
finally:
|
|
187
|
+
sys.pycache_prefix = previous_pycache_prefix
|
|
172
188
|
|
|
173
189
|
|
|
174
190
|
def launch(repo: Path) -> int:
|
|
@@ -179,7 +195,9 @@ def launch(repo: Path) -> int:
|
|
|
179
195
|
except (OSError, ValueError) as error:
|
|
180
196
|
print(str(error), file=sys.stderr)
|
|
181
197
|
return 2
|
|
182
|
-
return subprocess.call([sys.executable, "-B",
|
|
198
|
+
return subprocess.call([sys.executable, "-B", "-X",
|
|
199
|
+
f"pycache_prefix={runtime.parent / 'manifest.json'}",
|
|
200
|
+
str(runtime), "status", "--repo", str(repo)],
|
|
183
201
|
env={**os.environ, "GIT_OPTIONAL_LOCKS": "0"})
|
|
184
202
|
runtime = parent / "runtime" / "pipeline_state.py"
|
|
185
203
|
lock = repo / ".gsd-path-install-lock"
|
package/scripts/task_context.py
CHANGED
|
@@ -9,15 +9,17 @@ from pathlib import Path
|
|
|
9
9
|
|
|
10
10
|
try:
|
|
11
11
|
from scripts import check_handoffs as contracts
|
|
12
|
+
from scripts import _common
|
|
12
13
|
except ImportError:
|
|
13
14
|
import check_handoffs as contracts
|
|
15
|
+
import _common
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
def render(repo: Path, task: Path) -> str:
|
|
17
19
|
intent_path = repo.resolve() / '.project/intent/INTENT.md'
|
|
18
20
|
task = task.resolve()
|
|
19
|
-
intent =
|
|
20
|
-
task_text =
|
|
21
|
+
intent = _common.read_user_text(intent_path)
|
|
22
|
+
task_text = _common.read_user_text(task)
|
|
21
23
|
owned = contracts._owned_criteria(task_text, task.stem)
|
|
22
24
|
criteria = contracts._success_criteria(intent)
|
|
23
25
|
unknown = set(owned) - set(criteria)
|
|
@@ -40,7 +42,14 @@ def render(repo: Path, task: Path) -> str:
|
|
|
40
42
|
if simple:
|
|
41
43
|
before, after = intent[:section.start('body')], intent[section.end('body'):]
|
|
42
44
|
# Corrections and task interfaces can explicitly refer to another SC.
|
|
43
|
-
|
|
45
|
+
# The spec-probe tables name every SC by design, so they select nothing.
|
|
46
|
+
scanned = re.sub(r'(?ms)^## (?:Edge coverage|Prohibitions)[ \t]*\n.*?(?=^## |\Z)', '',
|
|
47
|
+
before + after)
|
|
48
|
+
required = set(owned) | set(re.findall(r'\bSC\d+\b', scanned + task_text))
|
|
49
|
+
# An owned criterion's edge or prohibition ruled into another SC needs that SC's text.
|
|
50
|
+
for rows in (contracts.edge_coverage(intent, criteria), contracts.prohibitions(intent, criteria)):
|
|
51
|
+
required |= {row['target'] for row in (rows or {}).values()
|
|
52
|
+
if row['target'] and row['criterion'] in owned}
|
|
44
53
|
selected = ''.join(chunk for item, chunk in zip(items, chunks) if f'SC{item[1]}' in required)
|
|
45
54
|
projected = before + '\n' + (selected or '- No criteria assigned.\n\n') + after
|
|
46
55
|
mode = 'owned-criteria'
|
package/scripts/wizard.mjs
CHANGED
package/scripts/workflow_run.py
CHANGED
|
@@ -77,7 +77,7 @@ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str =
|
|
|
77
77
|
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
78
78
|
cwd=repo, capture_output=True, encoding="utf-8", errors="replace", check=True).stdout.strip()
|
|
79
79
|
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
80
|
-
"--tasks-dir", f"{project_dir}/tasks")
|
|
80
|
+
"--tasks-dir", f"{project_dir}/tasks", "--project-dir", project_dir)
|
|
81
81
|
panel = ["validate-plan", "--plan", str(repo / project_dir / "plan/PLAN.md"),
|
|
82
82
|
"--intent", str(repo / project_dir / "intent/INTENT.md")]
|
|
83
83
|
charter = repo / ".project/CHARTER.md"
|
|
@@ -199,7 +199,7 @@ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str =
|
|
|
199
199
|
head = subprocess.run(["git", "rev-parse", "--verify", "HEAD"],
|
|
200
200
|
cwd=repo, capture_output=True, encoding="utf-8", errors="replace", check=True).stdout.strip()
|
|
201
201
|
step("check_task_briefs.py", "--repo", str(repo), "--base", head,
|
|
202
|
-
"--tasks-dir", f"{project_dir}/tasks")
|
|
202
|
+
"--tasks-dir", f"{project_dir}/tasks", "--project-dir", project_dir)
|
|
203
203
|
step("check_handoffs.py", "plan", *common)
|
|
204
204
|
elif action == "prepare-task" and _task_member(repo, project_dir, task_id):
|
|
205
205
|
# A member task works in a sidecar of its member; its Verify runs there at finish.
|
|
@@ -257,6 +257,9 @@ def run_workflow(repo: Path, action: str, project_dir: str, expected_head: str =
|
|
|
257
257
|
ruled.add(row[0])
|
|
258
258
|
if any(len(row) == 6 and row[4] == "NEEDS-USER" and row[0] not in ruled for row in queue):
|
|
259
259
|
raise StepFailed("DOCS-AUDIT.md has NEEDS-USER rows without a user ruling")
|
|
260
|
+
if kind == "intent":
|
|
261
|
+
# Malformed or incomplete spec-probe tables are not a pre-approvable draft.
|
|
262
|
+
step("check_handoffs.py", "intent", *common)
|
|
260
263
|
if kind == "plan":
|
|
261
264
|
if gate_plan()["mode"] != "off":
|
|
262
265
|
raise StepFailed("pre-approval requires review_panel off")
|
|
@@ -22,6 +22,27 @@ else:
|
|
|
22
22
|
from scripts import _common
|
|
23
23
|
|
|
24
24
|
|
|
25
|
+
def _worktree_list_porcelain(primary: Path) -> tuple[str, bool]:
|
|
26
|
+
try:
|
|
27
|
+
if __package__:
|
|
28
|
+
from . import pipeline_git as pg
|
|
29
|
+
else:
|
|
30
|
+
from scripts import pipeline_git as pg
|
|
31
|
+
except ImportError:
|
|
32
|
+
try:
|
|
33
|
+
import pipeline_git as pg
|
|
34
|
+
except ImportError:
|
|
35
|
+
pg = None
|
|
36
|
+
if pg is not None:
|
|
37
|
+
return pg.worktree_list_porcelain(primary)
|
|
38
|
+
try:
|
|
39
|
+
output = _git(primary, "worktree", "list", "--porcelain", "-z")
|
|
40
|
+
return output, True
|
|
41
|
+
except ValueError:
|
|
42
|
+
output = _git(primary, "worktree", "list", "--porcelain")
|
|
43
|
+
return output, False
|
|
44
|
+
|
|
45
|
+
|
|
25
46
|
def _git(primary: Path, *args: str) -> str:
|
|
26
47
|
result = _common.run_git(primary, *args)
|
|
27
48
|
if result.returncode:
|
|
@@ -82,6 +103,33 @@ def _workspace(primary: Path, pin: bool) -> Path:
|
|
|
82
103
|
return workspace
|
|
83
104
|
|
|
84
105
|
|
|
106
|
+
def release_workspace(primary: Path) -> bool:
|
|
107
|
+
"""Forget the pinned placement receipt once no linked worktrees remain.
|
|
108
|
+
|
|
109
|
+
Lets GSD_PATH_WORKTREE_ROOT (or a new default) apply again at the next
|
|
110
|
+
milestone's first allocation. Returns True when a receipt was removed;
|
|
111
|
+
any remaining linked worktree (including one only still registered) keeps
|
|
112
|
+
the pin.
|
|
113
|
+
"""
|
|
114
|
+
primary = primary.resolve()
|
|
115
|
+
common = Path(_git(primary, "rev-parse", "--git-common-dir"))
|
|
116
|
+
common = (primary / common).resolve()
|
|
117
|
+
receipt = common / "gsd-path" / "workspaces" / f"{_identity(primary)}.json"
|
|
118
|
+
if not receipt.is_file():
|
|
119
|
+
return False
|
|
120
|
+
output, nul_separated = _worktree_list_porcelain(primary)
|
|
121
|
+
records = output.split("\0\0") if nul_separated else [
|
|
122
|
+
block for block in output.strip().split("\n\n") if block.strip()
|
|
123
|
+
]
|
|
124
|
+
for record in records:
|
|
125
|
+
fields = record.split("\0") if nul_separated else record.splitlines()
|
|
126
|
+
for field in fields:
|
|
127
|
+
if field.startswith("worktree ") and Path(field[len("worktree "):]).resolve() != primary:
|
|
128
|
+
return False
|
|
129
|
+
receipt.unlink()
|
|
130
|
+
return True
|
|
131
|
+
|
|
132
|
+
|
|
85
133
|
def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) -> Path:
|
|
86
134
|
primary = primary.resolve()
|
|
87
135
|
if kind not in {"task", "verify", "integrate", "bound"} or not name or Path(name).name != name or name in {".", ".."}:
|
|
@@ -91,9 +139,13 @@ def worktree_path(primary: Path, kind: str, name: str, *, pin: bool = False) ->
|
|
|
91
139
|
legacy = (primary.parent / f".{primary.name}-gsd-path-integrate-{name}"
|
|
92
140
|
if kind == "integrate" else primary.parent / f"{primary.name}.gsd-path" / kind / name)
|
|
93
141
|
branch = f"refs/heads/gsd-path-{kind}/{name}"
|
|
94
|
-
|
|
142
|
+
output, nul_separated = _worktree_list_porcelain(primary)
|
|
143
|
+
if nul_separated:
|
|
144
|
+
records = output.split("\0\0")
|
|
145
|
+
else:
|
|
146
|
+
records = [block for block in output.strip().split("\n\n") if block.strip()]
|
|
95
147
|
for record in records:
|
|
96
|
-
fields = record.split("\0")
|
|
148
|
+
fields = record.split("\0") if nul_separated else record.splitlines()
|
|
97
149
|
# Compare as paths: git prints forward slashes on Windows.
|
|
98
150
|
worktrees = [Path(field[len("worktree "):]) for field in fields if field.startswith("worktree ")]
|
|
99
151
|
if legacy in worktrees and f"branch {branch}" in fields:
|
|
@@ -100,6 +100,10 @@ Obtain a confident answer in every area before finishing:
|
|
|
100
100
|
give every named surface at least one success criterion observable
|
|
101
101
|
there. A criterion satisfied by a passing test alone does not cover a
|
|
102
102
|
surface.
|
|
103
|
+
9. **Edges and prohibitions** — once the success criteria are drafted, run
|
|
104
|
+
the [spec-reach probes](references/spec-probes.md): every applicable edge
|
|
105
|
+
and every kept prohibition gets the user's ruling in INTENT.md
|
|
106
|
+
`## Edge coverage` and `## Prohibitions`.
|
|
103
107
|
|
|
104
108
|
## Program mode
|
|
105
109
|
|
|
@@ -149,7 +153,10 @@ State ownership. There is no re-interview of charter or roadmap scope:
|
|
|
149
153
|
`Lane: milestone`, `Surfaces:` copied verbatim from the entry, and
|
|
150
154
|
`Review panel:` copied from CHARTER.md (default
|
|
151
155
|
the configured preference when CHARTER omits it). The confirmation may override the copied
|
|
152
|
-
panel value; do not invent `detected` or a named list.
|
|
156
|
+
panel value; do not invent `detected` or a named list. Run the
|
|
157
|
+
[spec-reach probes](references/spec-probes.md) over the derived criteria
|
|
158
|
+
and draft `## Edge coverage` and `## Prohibitions` with recommended
|
|
159
|
+
rulings. When brownfield,
|
|
153
160
|
fill `## Current state` from the map, record doc-vs-code rulings as in
|
|
154
161
|
Brownfield mode, and add protected existing behavior under Scope out.
|
|
155
162
|
Write Ground truth paths from the track root: `.project` normally, or
|
|
@@ -157,7 +164,9 @@ State ownership. There is no re-interview of charter or roadmap scope:
|
|
|
157
164
|
active `research/` paths.
|
|
158
165
|
3. Present one confirmation, not an interview: playback the derivation (and
|
|
159
166
|
brownfield ground truth when present), link the resolved absolute INTENT.md
|
|
160
|
-
path, and ask approve or adjust.
|
|
167
|
+
path, and ask approve or adjust. The confirmation lists each proposed edge
|
|
168
|
+
and prohibition ruling for the user to accept or change; it never rules on
|
|
169
|
+
them silently. A requested change that contradicts the
|
|
161
170
|
charter or the resolved roadmap entry is a scope change — this phase never
|
|
162
171
|
edits the roadmap; surface it to the user for a `$gsd-path-roadmap` re-slice
|
|
163
172
|
at the next milestone boundary.
|
|
@@ -254,7 +263,15 @@ question. The rules change for every primary mode:
|
|
|
254
263
|
the brownfield map already established. Milestone mode skips this step.
|
|
255
264
|
5. Stop when coverage is complete or the user says `enough`. Record remaining
|
|
256
265
|
uncertainty under `## Open questions` with `RESEARCH` or `NEEDS-USER`.
|
|
257
|
-
|
|
266
|
+
`enough` does not skip the next step.
|
|
267
|
+
6. In standard mode, run the [spec-reach probes](references/spec-probes.md)
|
|
268
|
+
over the drafted success criteria: one question round for edges, then one
|
|
269
|
+
for kept prohibitions, each with a recommended ruling first. A ruling
|
|
270
|
+
observable where the user sees the work becomes or amends a success
|
|
271
|
+
criterion; write every ruling into `## Edge coverage` and
|
|
272
|
+
`## Prohibitions`. Program mode skips this step (each milestone runs it
|
|
273
|
+
in milestone mode); milestone mode runs it inside its confirmation.
|
|
274
|
+
7. Classify the proposed milestone lane before writing the approval draft.
|
|
258
275
|
Milestone mode keeps `Lane: milestone` and skips this classification.
|
|
259
276
|
Program mode writes CHARTER.md instead of INTENT.md. Otherwise choose
|
|
260
277
|
`quick` when scope fits at most two deliverable-sized tasks (project
|
|
@@ -275,6 +292,11 @@ question. The rules change for every primary mode:
|
|
|
275
292
|
## Output contract
|
|
276
293
|
|
|
277
294
|
At approval, retain the already reviewed `Lane:` value and its one-line reason.
|
|
295
|
+
Before every approval question on INTENT.md, run the bundled `python3
|
|
296
|
+
<absolute-bundled-script> intent --repo <absolute-root>` helper
|
|
297
|
+
(`scripts/check_handoffs.py`, plus `--project-dir .project/next` in
|
|
298
|
+
lookahead). It checks the success criteria, Surfaces, and both probe tables;
|
|
299
|
+
fix a failure in the draft before asking. It approves nothing.
|
|
278
300
|
Before presenting an approval draft without a CHARTER or explicit panel choice,
|
|
279
301
|
read `settings.review_panel.value` from the selected runtime's `path_config.py
|
|
280
302
|
show --repo <absolute-root>` (bundle for legacy projects; off for older selected
|
|
@@ -302,5 +324,8 @@ Use the executable phase handoff in AGENTS.md for the next action.
|
|
|
302
324
|
- In brownfield mode, state mapped facts for correction; never re-ask them.
|
|
303
325
|
- Treat solution-shaped problems as hypotheses and uncover the underlying pain.
|
|
304
326
|
- Preserve vetoes and corrections verbatim.
|
|
327
|
+
- Never rule on an edge's behavior or a prohibition yourself; recommend,
|
|
328
|
+
then record the user's ruling. An edge the user has not ruled on is a
|
|
329
|
+
required answer, including under pre-approval.
|
|
305
330
|
- Wrap up when every coverage-checklist area is answered or the user signals
|
|
306
331
|
done, and tag remaining gaps.
|
package/skills/gsd-path/PLAN.md
CHANGED
|
@@ -115,9 +115,10 @@ as stated in Lookahead mode.
|
|
|
115
115
|
In patch mode, tasks already `done` keep their landed metadata; only
|
|
116
116
|
the appended patch tasks must start clean.
|
|
117
117
|
- Require every dependency id to exist, forbid later-wave dependencies,
|
|
118
|
-
detect cycles, and forbid file overlap between planned tasks
|
|
119
|
-
wave. Same-wave
|
|
120
|
-
|
|
118
|
+
detect cycles, and forbid unordered file overlap between planned tasks
|
|
119
|
+
in the same wave. Same-wave tasks may share files only when one
|
|
120
|
+
transitively depends on the other through `deps`; the build executes
|
|
121
|
+
them in dependency layers.
|
|
121
122
|
- Reject a declared dependency that carries neither data nor a prerequisite
|
|
122
123
|
effect. A `deps` edge is valid only when the dependent consumes a symbol,
|
|
123
124
|
signature, schema, endpoint, file format, or path named in that
|
|
@@ -157,6 +158,13 @@ as stated in Lookahead mode.
|
|
|
157
158
|
command's output — not an internal unit test.
|
|
158
159
|
Require the surface to land in the same wave as the capability behind
|
|
159
160
|
it, never in a later polish wave.
|
|
161
|
+
- When INTENT.md has `## Edge coverage`, require a PLAN.md
|
|
162
|
+
`## Held-out checks` row for every `held-out` edge and for no other
|
|
163
|
+
edge. The named test is in that task's `files`, the task's Verify runs
|
|
164
|
+
it, and the task's Acceptance criteria state the edge id and its ruling
|
|
165
|
+
(see [spec-reach probes](references/spec-probes.md)). An edge or
|
|
166
|
+
prohibition ruled `criterion SCn` needs no extra row; it is covered as
|
|
167
|
+
SCn. Put each `judgment` prohibition in its owning task's Approach.
|
|
160
168
|
- Prove every intent constraint and synthesis decision is covered, that no
|
|
161
169
|
scope-out veto appears in a task, and that `Project verify` is a real,
|
|
162
170
|
non-placeholder command in PLAN.md. Every Verify — task and project —
|
|
@@ -84,6 +84,17 @@ settled brownfield input.
|
|
|
84
84
|
template before dispatch. Record every standard dimension exactly once as
|
|
85
85
|
`dispatched` or `skipped` with a reason, and assign every research question
|
|
86
86
|
to at least one dispatched dimension. No question may remain unassigned.
|
|
87
|
+
Copy each question to exactly one `Question assignments` row. Assign one or
|
|
88
|
+
more dispatched dimension slugs there, each in its own code span and
|
|
89
|
+
separated by commas, as in:
|
|
90
|
+
|
|
91
|
+
```md
|
|
92
|
+
- `[RESEARCH] Which approach is viable?` → `stack`, `pitfalls`
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
List a dimension only once per row. Every dispatched dimension must own at
|
|
96
|
+
least one question, and its evidence file must answer every question
|
|
97
|
+
assigned to it. Use `- none` only when there are no research questions.
|
|
87
98
|
2. Decide which standard dimensions have work: dispatch a dimension only when
|
|
88
99
|
it has at least one assigned `RESEARCH` question from INTENT.md or
|
|
89
100
|
CHARTER.md. Unsettled choices and risks need that source question before
|
package/skills/gsd-path/SHIP.md
CHANGED
|
@@ -159,7 +159,12 @@ so the position is unchanged. Then:
|
|
|
159
159
|
then stop and do not invent a patch finding. A `not-met`,
|
|
160
160
|
`unverifiable`, or blocked gap with valid evidence sets `ship/blocked`,
|
|
161
161
|
writes `.project/review/PATCH-FINDINGS.md` from the patch-findings template,
|
|
162
|
-
|
|
162
|
+
copying the full `Risk: ...` line into each gap finding's Locator, its
|
|
163
|
+
`Found` field into Evidence, and its `Fix direction` field verbatim. For a
|
|
164
|
+
`FINAL.md` finding, use its `SC<n>` id as Locator and copy its `Finding` and
|
|
165
|
+
`Fix direction` fields verbatim. The patch validator requires these source
|
|
166
|
+
field values to match exactly; do not shorten or paraphrase them. Run
|
|
167
|
+
`python3 <absolute check_handoffs.py> patch --repo <absolute repo
|
|
163
168
|
root>`. Present the blocked outcome, link the resolved absolute
|
|
164
169
|
PATCH-FINDINGS.md path, and state that patch planning is next. The manifest
|
|
165
170
|
contains exactly those FINAL.md and gap rows. When routed by an active
|
|
@@ -24,6 +24,14 @@ python3 <absolute dispatch_driver.py> round --repo <absolute primary> --wave <N>
|
|
|
24
24
|
[--child-timeout <owner seconds>]
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
+
Use the absolute `dispatch_driver.py` from the active installed
|
|
28
|
+
`gsd-path-build` skill when orchestrating a consuming project's build; that
|
|
29
|
+
copy resolves role briefs and templates from its own skill bundle. The
|
|
30
|
+
repository or npm package also supports the top-level `scripts/dispatch_driver.py`:
|
|
31
|
+
when a default is not beside that script, it resolves from the shipped
|
|
32
|
+
`skills/gsd-path` bundle. Explicit `--role-brief`, `--task-template`, and
|
|
33
|
+
`--template` paths override those defaults and must name existing files.
|
|
34
|
+
|
|
27
35
|
`round` owns the entry transition described in Preconditions and branch
|
|
28
36
|
binding, checkpointed as `build: start milestone`, and sets `build/blocked`
|
|
29
37
|
on a dependency deadlock or a blocked
|
|
@@ -136,6 +144,13 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
136
144
|
even while unrelated tasks still run, so rerun `ready` after each landing.
|
|
137
145
|
A `NEEDS-ORCHESTRATOR` block stays unselectable until its `Orchestrator
|
|
138
146
|
answer` is recorded in the task Log and the task is back to `pending`.
|
|
147
|
+
An all-done wave whose latest canonical review cycle has any blocked lens
|
|
148
|
+
gates later waves: `ready` selects unfinished later tasks with a `## Review
|
|
149
|
+
findings` section that depend on it, sets `current_wave` to the earliest
|
|
150
|
+
repair wave, and adds `repair_for_wave` with the source wave. When no such
|
|
151
|
+
repair remains, `ready` returns no tasks and adds `blocked_review` (`wave`,
|
|
152
|
+
`cycle`, `waiting_waves`); a later passing canonical review cycle releases
|
|
153
|
+
the waiting waves.
|
|
139
154
|
Its typed errors are the recovery rule:
|
|
140
155
|
- `task-recovery-required`: for each listed failed or blocked task run
|
|
141
156
|
`python3 <absolute build_state.py> reconcile --repo <absolute primary>
|
|
@@ -196,7 +211,7 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
196
211
|
a later round unlocked by fresh landings records the later HEAD — and
|
|
197
212
|
lint every ready task's brief with the bundled
|
|
198
213
|
`scripts/check_task_briefs.py --repo <absolute repo root> --base <recorded
|
|
199
|
-
base>` and re-check Intent coverage with
|
|
214
|
+
base> --project-dir <routed project dir>` and re-check Intent coverage with
|
|
200
215
|
`python3 <absolute check_handoffs.py> plan --repo <absolute repo root>`
|
|
201
216
|
before creating any worktree; a lint or coverage failure is a documented plan
|
|
202
217
|
defect — repair it against INTENT.md and SYNTHESIS.md, then re-establish
|
|
@@ -44,6 +44,19 @@ use exactly one matching branch:
|
|
|
44
44
|
create another worktree. Encode task dependencies explicitly; launch
|
|
45
45
|
independent children concurrently up to the host's advertised
|
|
46
46
|
concurrent-subagent capacity.
|
|
47
|
+
- A `muse.subagent_spawn` tool (with `muse.subagent_wait`,
|
|
48
|
+
`muse.subagent_read_result`, and `muse.subagent_send_message` siblings) is
|
|
49
|
+
Muse Code. Omit `subagent_type` (general-purpose, full capability), pass the
|
|
50
|
+
logical task name as `task_name` and `role`, and the complete brief as
|
|
51
|
+
`objective`. Never set `worktree_isolation`. Keep the returned
|
|
52
|
+
`subagent_id`; send a correction to a still-live child with
|
|
53
|
+
`muse.subagent_send_message` mode `followup` and the complete new prompt,
|
|
54
|
+
otherwise start a fresh child. Collect with `muse.subagent_wait`
|
|
55
|
+
(`wait_for: task_terminal`) then `muse.subagent_read_result`; on
|
|
56
|
+
`root_capacity_exhausted`, wait for a child to finish and retry. Spawn has no
|
|
57
|
+
model or effort argument, so record no such capability. If only
|
|
58
|
+
`muse.workflow` is exposed (untrusted workspace), do not script or inline
|
|
59
|
+
the work; stop and report that the workspace must be trusted.
|
|
47
60
|
|
|
48
61
|
For every branch:
|
|
49
62
|
|
|
@@ -59,6 +59,11 @@ actually does. Read-only: change nothing outside your single output file.
|
|
|
59
59
|
5. **Classify remediation** for every non-verified claim: `fix-doc`,
|
|
60
60
|
`fix-code`, or `NEEDS-USER` when the right side of the conflict is not
|
|
61
61
|
yours to decide.
|
|
62
|
+
Number queue rows with unique, strictly increasing positive integers; they
|
|
63
|
+
need not be contiguous. A row that persists from the prior audit keeps its
|
|
64
|
+
number. A new row takes a number greater than every prior queue number and
|
|
65
|
+
every `## User rulings` Queue #. Never reuse a retired number: a ruling
|
|
66
|
+
stays bound to the item it was made for.
|
|
62
67
|
|
|
63
68
|
## Rules
|
|
64
69
|
|
|
@@ -38,8 +38,9 @@ the how.
|
|
|
38
38
|
security-critical; `verify-only` suits polish and low-risk feature waves
|
|
39
39
|
whose Verify commands meaningfully cover the criteria.
|
|
40
40
|
|
|
41
|
-
Every dependency must be in an earlier wave or in the same wave
|
|
42
|
-
|
|
41
|
+
Every dependency must be in an earlier wave or in the same wave. Same-wave
|
|
42
|
+
tasks may share files only when one transitively depends on the other. Produce
|
|
43
|
+
an acyclic graph; same-wave chains execute in layers.
|
|
43
44
|
|
|
44
45
|
Declare a dependency only when something real crosses it: data — the dependent
|
|
45
46
|
consumes a symbol, signature, schema, endpoint, file format, or path named in
|
|
@@ -72,8 +73,17 @@ plan order above, which still keeps plan-invalidating risk in wave 1.
|
|
|
72
73
|
criterion may appear in only one surface block. Put the surface in the same
|
|
73
74
|
wave as the capability behind it. A milestone with a surface is not done
|
|
74
75
|
when only its internals run.
|
|
76
|
+
- When INTENT.md carries `## Edge coverage` or `## Prohibitions` (read the
|
|
77
|
+
supplied [spec-reach probes](spec-probes.md)), treat every ruling as a hard
|
|
78
|
+
limit on its criterion. For each `held-out` edge, write one PLAN.md
|
|
79
|
+
`## Held-out checks` row: a test file in the owning task's `files`, a
|
|
80
|
+
Verify that runs it, and an Acceptance criterion that names the edge id
|
|
81
|
+
and states its ruling from Detail. Omit the section when no edge is
|
|
82
|
+
held-out. Put each `judgment` prohibition's Must not and Detail in the
|
|
83
|
+
owning task's Approach.
|
|
75
84
|
- Make `files` exhaustive, including imports, routes, generated artifacts,
|
|
76
|
-
tests, and wiring. Require disjoint files for same-wave tasks
|
|
85
|
+
tests, and wiring. Require disjoint files for same-wave tasks that are not
|
|
86
|
+
dependency-ordered.
|
|
77
87
|
- Write an Interface contract in every task: `None` for independent tasks;
|
|
78
88
|
for any tasks that exchange a symbol, signature, schema, endpoint, file
|
|
79
89
|
format, or path, the exact shapes both sides code against — identical text
|
|
@@ -105,7 +115,7 @@ family list. Copy `Finding skeptics:` from INTENT.md into PLAN.md Config as
|
|
|
105
115
|
invent `on`. Quick-lane plans always write both values as `off`.
|
|
106
116
|
|
|
107
117
|
Before returning, check veto exclusion, decision coverage, Intent coverage,
|
|
108
|
-
the Surface contract, dependencies, file overlap, task size, criteria, and
|
|
118
|
+
the Surface contract, Held-out checks, dependencies, file overlap, task size, criteria, and
|
|
109
119
|
Verify commands.
|
|
110
120
|
|
|
111
121
|
Return a brief structured summary: wave count, task count, and the wave-1
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
## Final integration mode
|
|
2
2
|
|
|
3
3
|
Use only final-review.md. Treat INTENT.md success criteria as the rubric.
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
Each `### SCn —` heading must match the criterion text as
|
|
5
|
+
`check_handoffs._success_criteria` stores it from INTENT.md `## Success
|
|
6
|
+
criteria`: indented continuation lines join with a single space and keep
|
|
7
|
+
their `- ` list markers; the gate compares titles with `_normalize_ws`
|
|
8
|
+
only. Exercise the running system and record `met`, `not-met`, or
|
|
9
|
+
`unverifiable` with checked command output or a precise file reference.
|
|
10
|
+
When PLAN.md carries
|
|
6
11
|
a `## Surface contract`, every criterion it lists under a surface is checked
|
|
7
12
|
by performing that surface's Walkthrough from its Entry in the supplied
|
|
8
13
|
sidecar: `Surface` names that surface, Check names what was performed,
|
|
@@ -14,6 +19,19 @@ re-run PLAN.md's project Verify; cite the orchestrator's recorded
|
|
|
14
19
|
project-verify sidecar output. `pass`
|
|
15
20
|
requires every criterion to be `met`.
|
|
16
21
|
|
|
22
|
+
When INTENT.md `## Edge coverage` or `## Prohibitions` tags a criterion with a
|
|
23
|
+
`held-out` edge or a `judgment` prohibition, grade that criterion on cited
|
|
24
|
+
evidence for every tag (see the [spec-reach probes](spec-probes.md)). Name
|
|
25
|
+
each id in Check, Observed, or Reference with its evidence: the held-out
|
|
26
|
+
test's recorded passing output from the PLAN.md `## Held-out checks` test, or
|
|
27
|
+
the observed behavior judged against the prohibition's Detail. When a tag's
|
|
28
|
+
evidence is missing, did not run, or cannot be judged, record `unverifiable`
|
|
29
|
+
with `Finding: insufficient spec evidence: <id> <what is missing>` and a Fix
|
|
30
|
+
direction naming the check to add or run. Never mark such a criterion `met`
|
|
31
|
+
on inference or on code that merely looks right; the ship gate refuses a
|
|
32
|
+
`met` verdict that does not cite every tag. Grade untagged criteria as usual:
|
|
33
|
+
the trigger is the INTENT.md tag, never your own doubt.
|
|
34
|
+
|
|
17
35
|
## Final gap mode
|
|
18
36
|
|
|
19
37
|
Use only gap-review.md. Check the one cross-wave risk in the brief against the
|