@opengsd/gsd-path 1.3.1 → 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/AGENTS.md +2 -207
- package/CHANGELOG.md +331 -69
- package/DOCS.md +25 -9
- package/FULL.md +12 -5
- package/GUIDE.md +1 -1
- package/HOOKS.md +104 -14
- package/QUICK.md +5 -2
- package/README.md +131 -111
- package/RUNTIME.md +2 -2
- package/UPDATE.md +61 -11
- package/WORKFLOW.md +44 -7
- package/package.json +13 -9
- package/platforms/shared-agents/dispatch.md +13 -0
- package/scripts/_common.py +619 -18
- package/scripts/archive_milestone.py +160 -86
- package/scripts/bootstrap_repository.py +8 -5
- package/scripts/build_recovery.py +100 -32
- package/scripts/build_state.py +143 -24
- package/scripts/check_docs_audit.py +91 -7
- package/scripts/check_handoffs.py +662 -50
- package/scripts/check_task_briefs.py +338 -30
- package/scripts/check_update.py +2 -2
- package/scripts/core_hook_gate.py +10 -1
- package/scripts/core_hook_settings.py +11 -4
- package/scripts/detect_project.py +587 -32
- package/scripts/discussion_records.py +19 -13
- package/scripts/discussion_validate.py +152 -50
- package/scripts/dispatch_driver.py +501 -46
- package/scripts/git_guard.py +118 -31
- package/scripts/guard_hook.py +1567 -194
- package/scripts/install.mjs +77 -46
- package/scripts/install.py +611 -50
- package/scripts/integration.py +580 -25
- package/scripts/isolation.py +1438 -57
- package/scripts/lean_verification.py +99 -19
- package/scripts/loop_run.py +31 -29
- package/scripts/members.py +706 -0
- package/scripts/migrate_core.py +2 -2
- package/scripts/path_config.py +5 -5
- package/scripts/pipeline_diagnose.py +82 -31
- package/scripts/pipeline_git.py +124 -34
- package/scripts/pipeline_state.py +287 -87
- package/scripts/pipeline_undo.py +218 -30
- package/scripts/promote_lookahead.py +1 -1
- package/scripts/review_panel.py +1 -1
- package/scripts/runtime_store.py +55 -11
- package/scripts/skill-resources.json +37 -5
- package/scripts/state_checkpoint.py +135 -44
- package/scripts/state_promote.py +2 -0
- package/scripts/status_runtime.py +58 -10
- package/scripts/sync_skill_resources.py +8 -7
- package/scripts/task_context.py +12 -3
- package/scripts/token_budget.py +12 -8
- package/scripts/wizard.mjs +1 -0
- package/scripts/workflow_run.py +107 -30
- package/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path/BUILD.md +7 -1
- package/skills/gsd-path/DECIDE.md +11 -4
- package/skills/gsd-path/DEFINE.md +36 -4
- package/skills/gsd-path/DOCS-AUDIT.md +6 -4
- package/skills/gsd-path/INSPECT.md +5 -4
- package/skills/gsd-path/PLAN.md +18 -4
- package/skills/gsd-path/RESEARCH.md +13 -1
- package/skills/gsd-path/ROADMAP.md +2 -1
- package/skills/gsd-path/SHIP.md +33 -11
- package/skills/gsd-path/SKILL.md +45 -1
- package/skills/gsd-path/references/build-native.md +63 -15
- package/skills/gsd-path/references/codebase-mapper.md +2 -1
- package/skills/gsd-path/references/dispatch.md +13 -0
- package/skills/gsd-path/references/docs-auditor.md +7 -1
- package/skills/gsd-path/references/operating-rules.md +214 -0
- package/skills/gsd-path/references/planner.md +22 -4
- package/skills/gsd-path/references/reviewer-final.md +20 -2
- package/skills/gsd-path/references/reviewer-wave.md +18 -5
- 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 +619 -18
- package/skills/gsd-path/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path/scripts/bootstrap_repository.py +8 -5
- package/skills/gsd-path/scripts/build_recovery.py +100 -32
- package/skills/gsd-path/scripts/build_state.py +143 -24
- package/skills/gsd-path/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path/scripts/check_update.py +2 -2
- package/skills/gsd-path/scripts/detect_project.py +587 -32
- package/skills/gsd-path/scripts/discussion_records.py +19 -13
- package/skills/gsd-path/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path/scripts/dispatch_driver.py +501 -46
- package/skills/gsd-path/scripts/git_guard.py +118 -31
- package/skills/gsd-path/scripts/integration.py +580 -25
- package/skills/gsd-path/scripts/isolation.py +1438 -57
- package/skills/gsd-path/scripts/lean_verification.py +99 -19
- package/skills/gsd-path/scripts/loop_run.py +31 -29
- package/skills/gsd-path/scripts/members.py +706 -0
- package/skills/gsd-path/scripts/path_config.py +5 -5
- package/skills/gsd-path/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path/scripts/review_panel.py +1 -1
- package/skills/gsd-path/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path/scripts/state_promote.py +2 -0
- package/skills/gsd-path/scripts/status_runtime.py +58 -10
- package/skills/gsd-path/scripts/task_context.py +12 -3
- package/skills/gsd-path/scripts/token_budget.py +12 -8
- package/skills/gsd-path/scripts/workflow_run.py +107 -30
- package/skills/gsd-path/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path/templates/codebase.md +1 -1
- package/skills/gsd-path/templates/docs-audit.md +6 -2
- package/skills/gsd-path/templates/final-review.md +16 -4
- package/skills/gsd-path/templates/gap-review.md +2 -1
- 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/task.md +1 -0
- package/skills/gsd-path/templates/wave-review.md +16 -4
- package/skills/gsd-path-build/SKILL.md +7 -1
- package/skills/gsd-path-build/references/build-native.md +63 -15
- package/skills/gsd-path-build/references/dispatch.md +13 -0
- package/skills/gsd-path-build/references/operating-rules.md +214 -0
- package/skills/gsd-path-build/references/reviewer-final.md +20 -2
- package/skills/gsd-path-build/references/reviewer-wave.md +18 -5
- 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 +619 -18
- package/skills/gsd-path-build/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-build/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-build/scripts/build_state.py +143 -24
- package/skills/gsd-path-build/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-build/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-build/scripts/detect_project.py +587 -32
- package/skills/gsd-path-build/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-build/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-build/scripts/dispatch_driver.py +501 -46
- package/skills/gsd-path-build/scripts/integration.py +580 -25
- package/skills/gsd-path-build/scripts/isolation.py +1438 -57
- package/skills/gsd-path-build/scripts/loop_run.py +31 -29
- package/skills/gsd-path-build/scripts/members.py +706 -0
- package/skills/gsd-path-build/scripts/path_config.py +5 -5
- package/skills/gsd-path-build/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-build/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-build/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-build/scripts/review_panel.py +1 -1
- package/skills/gsd-path-build/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-build/scripts/state_promote.py +2 -0
- package/skills/gsd-path-build/scripts/task_context.py +12 -3
- package/skills/gsd-path-build/scripts/token_budget.py +12 -8
- package/skills/gsd-path-build/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-build/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-build/templates/task.md +1 -0
- package/skills/gsd-path-build/templates/wave-review.md +16 -4
- package/skills/gsd-path-decide/SKILL.md +11 -4
- package/skills/gsd-path-decide/references/dispatch.md +13 -0
- package/skills/gsd-path-decide/references/operating-rules.md +214 -0
- package/skills/gsd-path-decide/scripts/_common.py +619 -18
- package/skills/gsd-path-decide/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-decide/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-decide/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-decide/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-decide/scripts/detect_project.py +587 -32
- package/skills/gsd-path-decide/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-decide/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-decide/scripts/integration.py +580 -25
- package/skills/gsd-path-decide/scripts/isolation.py +1438 -57
- package/skills/gsd-path-decide/scripts/loop_run.py +31 -29
- package/skills/gsd-path-decide/scripts/members.py +706 -0
- package/skills/gsd-path-decide/scripts/path_config.py +5 -5
- package/skills/gsd-path-decide/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-decide/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-decide/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-decide/scripts/review_panel.py +1 -1
- package/skills/gsd-path-decide/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-decide/scripts/state_promote.py +2 -0
- package/skills/gsd-path-decide/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-define/SKILL.md +36 -4
- package/skills/gsd-path-define/references/operating-rules.md +214 -0
- package/skills/gsd-path-define/references/spec-probes.md +150 -0
- package/skills/gsd-path-define/scripts/_common.py +619 -18
- package/skills/gsd-path-define/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-define/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-define/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-define/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-define/scripts/detect_project.py +587 -32
- package/skills/gsd-path-define/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-define/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-define/scripts/integration.py +580 -25
- package/skills/gsd-path-define/scripts/isolation.py +1438 -57
- package/skills/gsd-path-define/scripts/loop_run.py +31 -29
- package/skills/gsd-path-define/scripts/members.py +706 -0
- package/skills/gsd-path-define/scripts/path_config.py +5 -5
- package/skills/gsd-path-define/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-define/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-define/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-define/scripts/review_panel.py +1 -1
- package/skills/gsd-path-define/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-define/scripts/state_promote.py +2 -0
- package/skills/gsd-path-define/scripts/worktree_paths.py +72 -10
- 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/SKILL.md +2 -1
- package/skills/gsd-path-discuss/references/operating-rules.md +214 -0
- package/skills/gsd-path-discuss/scripts/_common.py +619 -18
- package/skills/gsd-path-discuss/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-discuss/scripts/loop_run.py +31 -29
- package/skills/gsd-path-discuss/scripts/path_config.py +5 -5
- package/skills/gsd-path-discuss/scripts/review_panel.py +1 -1
- package/skills/gsd-path-discuss/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-docs-audit/SKILL.md +6 -4
- package/skills/gsd-path-docs-audit/references/dispatch.md +13 -0
- package/skills/gsd-path-docs-audit/references/docs-auditor.md +7 -1
- package/skills/gsd-path-docs-audit/references/operating-rules.md +214 -0
- package/skills/gsd-path-docs-audit/scripts/_common.py +619 -18
- package/skills/gsd-path-docs-audit/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-docs-audit/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-docs-audit/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path-docs-audit/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-docs-audit/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-docs-audit/scripts/detect_project.py +587 -32
- package/skills/gsd-path-docs-audit/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-docs-audit/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-docs-audit/scripts/integration.py +580 -25
- package/skills/gsd-path-docs-audit/scripts/isolation.py +1438 -57
- package/skills/gsd-path-docs-audit/scripts/loop_run.py +31 -29
- package/skills/gsd-path-docs-audit/scripts/members.py +706 -0
- package/skills/gsd-path-docs-audit/scripts/path_config.py +5 -5
- package/skills/gsd-path-docs-audit/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-docs-audit/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-docs-audit/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/review_panel.py +1 -1
- package/skills/gsd-path-docs-audit/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-docs-audit/scripts/state_promote.py +2 -0
- package/skills/gsd-path-docs-audit/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-docs-audit/templates/docs-audit.md +6 -2
- package/skills/gsd-path-forensics/SKILL.md +2 -1
- package/skills/gsd-path-forensics/references/operating-rules.md +214 -0
- package/skills/gsd-path-forensics/scripts/_common.py +619 -18
- package/skills/gsd-path-forensics/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-forensics/scripts/loop_run.py +31 -29
- package/skills/gsd-path-forensics/scripts/path_config.py +5 -5
- package/skills/gsd-path-forensics/scripts/pipeline_diagnose.py +82 -31
- package/skills/gsd-path-forensics/scripts/pipeline_undo.py +218 -30
- package/skills/gsd-path-forensics/scripts/review_panel.py +1 -1
- package/skills/gsd-path-forensics/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-inspect/SKILL.md +5 -4
- package/skills/gsd-path-inspect/references/codebase-mapper.md +2 -1
- package/skills/gsd-path-inspect/references/dispatch.md +13 -0
- package/skills/gsd-path-inspect/references/docs-auditor.md +7 -1
- package/skills/gsd-path-inspect/references/operating-rules.md +214 -0
- package/skills/gsd-path-inspect/scripts/_common.py +619 -18
- package/skills/gsd-path-inspect/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-inspect/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-inspect/scripts/check_docs_audit.py +91 -7
- package/skills/gsd-path-inspect/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-inspect/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-inspect/scripts/detect_project.py +587 -32
- package/skills/gsd-path-inspect/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-inspect/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-inspect/scripts/integration.py +580 -25
- package/skills/gsd-path-inspect/scripts/isolation.py +1438 -57
- package/skills/gsd-path-inspect/scripts/loop_run.py +31 -29
- package/skills/gsd-path-inspect/scripts/members.py +706 -0
- package/skills/gsd-path-inspect/scripts/path_config.py +5 -5
- package/skills/gsd-path-inspect/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-inspect/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-inspect/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-inspect/scripts/review_panel.py +1 -1
- package/skills/gsd-path-inspect/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-inspect/scripts/state_promote.py +2 -0
- package/skills/gsd-path-inspect/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-inspect/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-inspect/templates/codebase.md +1 -1
- package/skills/gsd-path-inspect/templates/docs-audit.md +6 -2
- package/skills/gsd-path-inspect/templates/state.md +1 -1
- package/skills/gsd-path-loop/SKILL.md +2 -1
- package/skills/gsd-path-loop/references/operating-rules.md +214 -0
- package/skills/gsd-path-loop/scripts/_common.py +619 -18
- package/skills/gsd-path-loop/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-loop/scripts/loop_run.py +31 -29
- package/skills/gsd-path-loop/scripts/path_config.py +5 -5
- package/skills/gsd-path-loop/scripts/review_panel.py +1 -1
- package/skills/gsd-path-loop/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-migrate/SKILL.md +2 -1
- package/skills/gsd-path-migrate/references/operating-rules.md +214 -0
- package/skills/gsd-path-migrate/scripts/_common.py +619 -18
- package/skills/gsd-path-migrate/scripts/core_hook_gate.py +10 -1
- package/skills/gsd-path-migrate/scripts/core_hook_settings.py +11 -4
- package/skills/gsd-path-migrate/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-migrate/scripts/loop_run.py +31 -29
- package/skills/gsd-path-migrate/scripts/migrate_core.py +2 -2
- package/skills/gsd-path-migrate/scripts/path_config.py +5 -5
- package/skills/gsd-path-migrate/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/SKILL.md +18 -4
- package/skills/gsd-path-plan/references/dispatch.md +13 -0
- package/skills/gsd-path-plan/references/operating-rules.md +214 -0
- package/skills/gsd-path-plan/references/planner.md +22 -4
- package/skills/gsd-path-plan/references/spec-probes.md +150 -0
- package/skills/gsd-path-plan/scripts/_common.py +619 -18
- package/skills/gsd-path-plan/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-plan/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-plan/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-plan/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-plan/scripts/detect_project.py +587 -32
- package/skills/gsd-path-plan/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-plan/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-plan/scripts/integration.py +580 -25
- package/skills/gsd-path-plan/scripts/isolation.py +1438 -57
- package/skills/gsd-path-plan/scripts/loop_run.py +31 -29
- package/skills/gsd-path-plan/scripts/members.py +706 -0
- package/skills/gsd-path-plan/scripts/path_config.py +5 -5
- package/skills/gsd-path-plan/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-plan/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-plan/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-plan/scripts/review_panel.py +1 -1
- package/skills/gsd-path-plan/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-plan/scripts/state_promote.py +2 -0
- package/skills/gsd-path-plan/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-plan/scripts/worktree_paths.py +72 -10
- 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-plan/templates/task.md +1 -0
- package/skills/gsd-path-research/SKILL.md +13 -1
- package/skills/gsd-path-research/references/dispatch.md +13 -0
- package/skills/gsd-path-research/references/operating-rules.md +214 -0
- package/skills/gsd-path-research/scripts/_common.py +619 -18
- package/skills/gsd-path-research/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-research/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-research/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-research/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-research/scripts/detect_project.py +587 -32
- package/skills/gsd-path-research/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-research/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-research/scripts/integration.py +580 -25
- package/skills/gsd-path-research/scripts/isolation.py +1438 -57
- package/skills/gsd-path-research/scripts/loop_run.py +31 -29
- package/skills/gsd-path-research/scripts/members.py +706 -0
- package/skills/gsd-path-research/scripts/path_config.py +5 -5
- package/skills/gsd-path-research/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-research/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-research/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-research/scripts/review_panel.py +1 -1
- package/skills/gsd-path-research/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-research/scripts/state_promote.py +2 -0
- package/skills/gsd-path-research/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-research/templates/research-handoff.md +14 -3
- package/skills/gsd-path-roadmap/SKILL.md +2 -1
- package/skills/gsd-path-roadmap/references/dispatch.md +13 -0
- package/skills/gsd-path-roadmap/references/operating-rules.md +214 -0
- package/skills/gsd-path-roadmap/scripts/_common.py +619 -18
- package/skills/gsd-path-roadmap/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-roadmap/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-roadmap/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-roadmap/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-roadmap/scripts/detect_project.py +587 -32
- package/skills/gsd-path-roadmap/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-roadmap/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-roadmap/scripts/integration.py +580 -25
- package/skills/gsd-path-roadmap/scripts/isolation.py +1438 -57
- package/skills/gsd-path-roadmap/scripts/loop_run.py +31 -29
- package/skills/gsd-path-roadmap/scripts/members.py +706 -0
- package/skills/gsd-path-roadmap/scripts/path_config.py +5 -5
- package/skills/gsd-path-roadmap/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-roadmap/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-roadmap/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-roadmap/scripts/review_panel.py +1 -1
- package/skills/gsd-path-roadmap/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-roadmap/scripts/state_promote.py +2 -0
- package/skills/gsd-path-roadmap/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-ship/SKILL.md +33 -11
- package/skills/gsd-path-ship/references/dispatch.md +13 -0
- package/skills/gsd-path-ship/references/operating-rules.md +214 -0
- package/skills/gsd-path-ship/references/reviewer-final.md +20 -2
- package/skills/gsd-path-ship/references/reviewer-wave.md +18 -5
- 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 +619 -18
- package/skills/gsd-path-ship/scripts/archive_milestone.py +160 -86
- package/skills/gsd-path-ship/scripts/build_recovery.py +100 -32
- package/skills/gsd-path-ship/scripts/build_state.py +143 -24
- package/skills/gsd-path-ship/scripts/check_handoffs.py +662 -50
- package/skills/gsd-path-ship/scripts/check_task_briefs.py +338 -30
- package/skills/gsd-path-ship/scripts/detect_project.py +587 -32
- package/skills/gsd-path-ship/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-ship/scripts/discussion_validate.py +152 -50
- package/skills/gsd-path-ship/scripts/integration.py +580 -25
- package/skills/gsd-path-ship/scripts/isolation.py +1438 -57
- package/skills/gsd-path-ship/scripts/lean_verification.py +99 -19
- package/skills/gsd-path-ship/scripts/loop_run.py +31 -29
- package/skills/gsd-path-ship/scripts/members.py +706 -0
- package/skills/gsd-path-ship/scripts/path_config.py +5 -5
- package/skills/gsd-path-ship/scripts/pipeline_git.py +124 -34
- package/skills/gsd-path-ship/scripts/pipeline_state.py +287 -87
- package/skills/gsd-path-ship/scripts/promote_lookahead.py +1 -1
- package/skills/gsd-path-ship/scripts/review_panel.py +1 -1
- package/skills/gsd-path-ship/scripts/state_checkpoint.py +135 -44
- package/skills/gsd-path-ship/scripts/state_promote.py +2 -0
- package/skills/gsd-path-ship/scripts/workflow_run.py +107 -30
- package/skills/gsd-path-ship/scripts/worktree_paths.py +72 -10
- package/skills/gsd-path-ship/templates/final-review.md +16 -4
- package/skills/gsd-path-ship/templates/gap-review.md +2 -1
- package/skills/gsd-path-ship/templates/patch-findings.md +3 -3
- package/skills/gsd-path-ship/templates/wave-review.md +16 -4
- package/skills/gsd-path-undo/SKILL.md +2 -1
- package/skills/gsd-path-undo/references/operating-rules.md +214 -0
- package/skills/gsd-path-undo/scripts/_common.py +619 -18
- package/skills/gsd-path-undo/scripts/discussion_records.py +19 -13
- package/skills/gsd-path-undo/scripts/loop_run.py +31 -29
- package/skills/gsd-path-undo/scripts/path_config.py +5 -5
- package/skills/gsd-path-undo/scripts/pipeline_undo.py +218 -30
- package/skills/gsd-path-undo/scripts/review_panel.py +1 -1
- package/skills/gsd-path-undo/scripts/worktree_paths.py +72 -10
- package/skills/path/BUILD.md +7 -1
- package/skills/path/DECIDE.md +11 -4
- package/skills/path/DEFINE.md +36 -4
- package/skills/path/DOCS-AUDIT.md +6 -4
- package/skills/path/INSPECT.md +5 -4
- package/skills/path/PLAN.md +18 -4
- package/skills/path/RESEARCH.md +13 -1
- package/skills/path/ROADMAP.md +2 -1
- package/skills/path/SHIP.md +33 -11
- package/skills/path/SKILL.md +45 -1
- package/skills/path/references/build-native.md +63 -15
- package/skills/path/references/codebase-mapper.md +2 -1
- package/skills/path/references/dispatch.md +13 -0
- package/skills/path/references/docs-auditor.md +7 -1
- package/skills/path/references/operating-rules.md +214 -0
- package/skills/path/references/planner.md +22 -4
- package/skills/path/references/reviewer-final.md +20 -2
- package/skills/path/references/reviewer-wave.md +18 -5
- package/skills/path/references/reviewer.md +3 -1
- package/skills/path/references/spec-probes.md +150 -0
- package/skills/path/scripts/_common.py +619 -18
- package/skills/path/scripts/archive_milestone.py +160 -86
- package/skills/path/scripts/bootstrap_repository.py +8 -5
- package/skills/path/scripts/build_recovery.py +100 -32
- package/skills/path/scripts/build_state.py +143 -24
- package/skills/path/scripts/check_docs_audit.py +91 -7
- package/skills/path/scripts/check_handoffs.py +662 -50
- package/skills/path/scripts/check_task_briefs.py +338 -30
- package/skills/path/scripts/check_update.py +2 -2
- package/skills/path/scripts/detect_project.py +587 -32
- package/skills/path/scripts/discussion_records.py +19 -13
- package/skills/path/scripts/discussion_validate.py +152 -50
- package/skills/path/scripts/dispatch_driver.py +501 -46
- package/skills/path/scripts/git_guard.py +118 -31
- package/skills/path/scripts/integration.py +580 -25
- package/skills/path/scripts/isolation.py +1438 -57
- package/skills/path/scripts/lean_verification.py +99 -19
- package/skills/path/scripts/loop_run.py +31 -29
- package/skills/path/scripts/members.py +706 -0
- package/skills/path/scripts/path_config.py +5 -5
- package/skills/path/scripts/pipeline_git.py +124 -34
- package/skills/path/scripts/pipeline_state.py +287 -87
- package/skills/path/scripts/promote_lookahead.py +1 -1
- package/skills/path/scripts/review_panel.py +1 -1
- package/skills/path/scripts/state_checkpoint.py +135 -44
- package/skills/path/scripts/state_promote.py +2 -0
- package/skills/path/scripts/status_runtime.py +58 -10
- package/skills/path/scripts/task_context.py +12 -3
- package/skills/path/scripts/token_budget.py +12 -8
- package/skills/path/scripts/workflow_run.py +107 -30
- package/skills/path/scripts/worktree_paths.py +72 -10
- package/skills/path/templates/codebase.md +1 -1
- package/skills/path/templates/docs-audit.md +6 -2
- package/skills/path/templates/final-review.md +16 -4
- package/skills/path/templates/gap-review.md +2 -1
- 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/task.md +1 -0
- package/skills/path/templates/wave-review.md +16 -4
- 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
|
@@ -3,7 +3,8 @@ name: gsd-path-build
|
|
|
3
3
|
description: Execute or resume an approved GSD Path plan with isolated task worktrees, deterministic commits, and independent wave review. Use only when the user explicitly invokes $gsd-path-build or an active $gsd-path router explicitly routes to this phase.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Before executing project helpers, read [runtime selection](references/runtime-selection.md)
|
|
6
|
+
Before executing project helpers, read [runtime selection](references/runtime-selection.md)
|
|
7
|
+
and [operating rules](references/operating-rules.md).
|
|
7
8
|
|
|
8
9
|
# GSD Path Build Orchestrator
|
|
9
10
|
|
|
@@ -100,6 +101,11 @@ rule; never invoke an explicit-only sibling skill yourself.
|
|
|
100
101
|
checkpoint `.project/` records uses this helper. Record the exact full HEAD
|
|
101
102
|
before the first metadata change in that checkpoint, then run:
|
|
102
103
|
|
|
104
|
+
Before dispatch, also checkpoint a pre-existing `.project/build/verify-ledger.jsonl`
|
|
105
|
+
when it is an ignored regular file absent from HEAD, even if Git reports no
|
|
106
|
+
other pending paths. The `build:` checkpoint validates and force-adds only
|
|
107
|
+
that ledger; a malformed ledger blocks the checkpoint.
|
|
108
|
+
|
|
103
109
|
Explicit configuration edits in `.project/config.json` and
|
|
104
110
|
`.project/model-policy.json` are expected bookkeeping. Include them in the next
|
|
105
111
|
normal checkpoint before a clean dispatch base; they may remain pending while
|
|
@@ -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
|
|
@@ -82,9 +90,12 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
82
90
|
- `recovered`: the task is landed (`land` already stamped `status: done`
|
|
83
91
|
and `base`). Retire a still-present task worktree with `isolation.py
|
|
84
92
|
retire` only when the report shows it present, clean, and on the task
|
|
85
|
-
branch. If
|
|
86
|
-
retirement with `retire --branch
|
|
87
|
-
<commit
|
|
93
|
+
branch. If the checkout directory is absent and `task_branch` remains,
|
|
94
|
+
finish its proven interrupted retirement with `retire --branch
|
|
95
|
+
<task_branch> --force --landed-commit <commit>`. This also clears a stale
|
|
96
|
+
registration at that task's sidecar path after the landing proof passes;
|
|
97
|
+
a locked registration fails without deleting the branch. Both absent is
|
|
98
|
+
valid.
|
|
88
99
|
- `resume`: continue from the returned `base`, `task_branch`, and worktree
|
|
89
100
|
(the primary itself when no task branch exists); when the report shows
|
|
90
101
|
the worktree absent, return the task to `pending` only when ownership is
|
|
@@ -133,6 +144,13 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
133
144
|
even while unrelated tasks still run, so rerun `ready` after each landing.
|
|
134
145
|
A `NEEDS-ORCHESTRATOR` block stays unselectable until its `Orchestrator
|
|
135
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.
|
|
136
154
|
Its typed errors are the recovery rule:
|
|
137
155
|
- `task-recovery-required`: for each listed failed or blocked task run
|
|
138
156
|
`python3 <absolute build_state.py> reconcile --repo <absolute primary>
|
|
@@ -171,7 +189,17 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
171
189
|
then create the retry. If retirement was interrupted after removing the
|
|
172
190
|
worktree, rerun the same command; the recorded failed or blocked task and
|
|
173
191
|
its exact base prove the remaining branch before deletion. Create the retry
|
|
174
|
-
from the new clean primary HEAD.
|
|
192
|
+
from the new clean primary HEAD. A member task (`repo: <member>`) stays
|
|
193
|
+
`pending` in the coordinator; its rejected attempt lives in the member
|
|
194
|
+
sidecar. Copy the live copy's Log delta into the coordinator task file,
|
|
195
|
+
checkpoint it, then retire the sidecar with `python3 <absolute isolation.py>
|
|
196
|
+
retire-member-task --repo <absolute primary> --member <member> --task-id
|
|
197
|
+
<id> --task-file <task path> --force`. It refuses until the committed task
|
|
198
|
+
file holds that delta, and a rerun finishes an interrupted retirement. A
|
|
199
|
+
copy that fails the append-only check holds no trusted delta: record your
|
|
200
|
+
own rejection evidence in the coordinator task Log and checkpoint it, as for
|
|
201
|
+
a coordinator diff rejection; retirement then reports `copy_rejected`. The
|
|
202
|
+
next `prepare-task` creates the retry sidecar at the member bound tip. After
|
|
175
203
|
resolving a recoverable `build/blocked` condition, use
|
|
176
204
|
`pipeline_state.py transition` with the blocked state and bound branch as
|
|
177
205
|
expected fields to set `build/active` and log the resolution. Checkpoint it
|
|
@@ -183,19 +211,21 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
183
211
|
a later round unlocked by fresh landings records the later HEAD — and
|
|
184
212
|
lint every ready task's brief with the bundled
|
|
185
213
|
`scripts/check_task_briefs.py --repo <absolute repo root> --base <recorded
|
|
186
|
-
base>` and re-check Intent coverage with
|
|
214
|
+
base> --project-dir <routed project dir>` and re-check Intent coverage with
|
|
187
215
|
`python3 <absolute check_handoffs.py> plan --repo <absolute repo root>`
|
|
188
216
|
before creating any worktree; a lint or coverage failure is a documented plan
|
|
189
217
|
defect — repair it against INTENT.md and SYNTHESIS.md, then re-establish
|
|
190
218
|
the base. Then isolate each ready task with
|
|
191
219
|
`python3 <absolute workflow_run.py> prepare-task --repo <absolute primary>
|
|
192
220
|
--expected-head <recorded base> --task-id <id> --round-size <N>` where N is the
|
|
193
|
-
number of tasks in this dispatch round.
|
|
194
|
-
worktree and `task_branch: null` — the coder
|
|
221
|
+
number of tasks in this dispatch round. For a coordinator task, serial
|
|
222
|
+
(`N=1`) returns the primary worktree and `task_branch: null` — the coder
|
|
223
|
+
works on the bound branch.
|
|
195
224
|
The runner also creates a named verification sidecar at this clean base
|
|
196
225
|
before dispatch. Retain both helper results in the dispatch evidence.
|
|
197
|
-
|
|
198
|
-
worktree at that base; never a
|
|
226
|
+
For a coordinator task, parallel (`N>=2`) creates a named
|
|
227
|
+
`gsd-path-task/<id>` branch and linked worktree at that base; never a
|
|
228
|
+
detached HEAD. Record dispatch through
|
|
199
229
|
`python3 <absolute isolation.py> activate-task --repo <returned worktree>
|
|
200
230
|
--base <recorded base> --task-id <id> --agent build_<id> --task-file
|
|
201
231
|
<exact selected task-file path> [--task-branch <returned task_branch>]`.
|
|
@@ -207,14 +237,26 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
207
237
|
round. Do not append a dispatch Log entry: the isolated task later appends
|
|
208
238
|
at that location, and two parallel appends make the cherry-pick ambiguous. Reuse a retained worktree only when
|
|
209
239
|
its recorded base, branch, and task agree exactly.
|
|
240
|
+
A member task (`repo: <member>`) returns `mode: member` from
|
|
241
|
+
`prepare-task`: a member sidecar at the member bound tip, with no
|
|
242
|
+
coordinator verify sidecar. Record its dispatch with `python3 <absolute
|
|
243
|
+
isolation.py> activate-member-task --repo <absolute primary> --member
|
|
244
|
+
<member> --task-id <id> --agent build_<id> --task-file <exact task-file
|
|
245
|
+
path> --base <recorded base>`. It writes the live task copy (returned as
|
|
246
|
+
`copy`) inside the member sidecar; the coordinator task file stays
|
|
247
|
+
unchanged. Brief the coder with the member sidecar root and that live copy
|
|
248
|
+
as its task file, plus the coordinator's INTENT.md. Step 5's `finish` lands
|
|
249
|
+
it in the member and records it in the coordinator.
|
|
210
250
|
|
|
211
251
|
4. **Dispatch the round.** Following the local runtime dispatch contract,
|
|
212
252
|
spawn one implementation-capable child per task with deterministic logical
|
|
213
253
|
task name `build_<task_id>`.
|
|
214
254
|
Its brief contains the absolute isolated-worktree root, coder role, task
|
|
215
|
-
file, task template, and the absolute INTENT.md path in
|
|
255
|
+
file, task template, and the absolute INTENT.md path in the coordinator for
|
|
256
|
+
member tasks or in that worktree for coordinator tasks.
|
|
216
257
|
Generate the coder's intent view with `python3 <absolute task_context.py>
|
|
217
|
-
--repo <absolute
|
|
258
|
+
--repo <absolute coordinator root for member tasks, otherwise isolated-worktree>
|
|
259
|
+
--task <absolute live task copy for member tasks, otherwise isolated task file>` and include
|
|
218
260
|
its output in the brief. The helper preserves all global rules and falls
|
|
219
261
|
back to full intent when projection is ambiguous. Never summarize it by hand.
|
|
220
262
|
Add no hidden implementation context; repair a
|
|
@@ -233,10 +275,15 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
233
275
|
completion when it lands — never wait for slower in-flight tasks first;
|
|
234
276
|
when several results wait, land them in task-id order.
|
|
235
277
|
|
|
236
|
-
- For `ready
|
|
237
|
-
declared `files` plus append-only Log changes in that
|
|
238
|
-
additions, deletions, renames, and binary changes; an
|
|
239
|
-
blocks before any product commit.
|
|
278
|
+
- For a `ready` coordinator task, compare the complete worktree diff to
|
|
279
|
+
`base`. Permit only declared `files` plus append-only Log changes in that
|
|
280
|
+
task file. Include additions, deletions, renames, and binary changes; an
|
|
281
|
+
unexpected path blocks before any product commit.
|
|
282
|
+
- For a `ready` member task, compare the complete member sidecar diff to the
|
|
283
|
+
returned `member_base`. Permit only declared `files`, including additions,
|
|
284
|
+
deletions, renames, and binary changes. Separately check the returned live
|
|
285
|
+
task `copy` against the coordinator task contract for an append-only Log.
|
|
286
|
+
An unexpected path or Log change blocks before any product commit.
|
|
240
287
|
- For a returned `ready` coder, run `python3 <absolute dispatch_driver.py>
|
|
241
288
|
finish --repo <absolute primary> --task-id <id>`. This action works with
|
|
242
289
|
native child tools; no child command is needed. It reproduces serial work
|
|
@@ -276,6 +323,7 @@ dispatch contract and perform steps 1–5 by hand.
|
|
|
276
323
|
task to `blocked` or `failed`, revoke a parallel isolate's active dispatch
|
|
277
324
|
with `python3 <absolute isolation.py> deactivate-task
|
|
278
325
|
--repo <isolated worktree> --task-id <id> --task-branch <task_branch>`.
|
|
326
|
+
A member task keeps `pending` instead; follow the member retry in step 2.
|
|
279
327
|
Then update and checkpoint the bookkeeping and apply the recovery
|
|
280
328
|
rule. Preserve the isolated worktree unless and until the explicit clean
|
|
281
329
|
retry-retirement procedure in step 2 owns and removes it.
|
|
@@ -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
|
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Operating rules for phase work
|
|
2
|
+
|
|
3
|
+
These rules extend the project `AGENTS.md` block. Every GSD Path skill
|
|
4
|
+
bundles this file; spawned agents follow their role brief instead.
|
|
5
|
+
|
|
6
|
+
## Files and state
|
|
7
|
+
|
|
8
|
+
- `.project/discuss/DIALOGUE.md` and `.project/discuss/ANSWERS.md` are the
|
|
9
|
+
append-only memory for any-phase discussion. Read them before continuing an
|
|
10
|
+
existing thread; never treat chat history alone as durable context.
|
|
11
|
+
- The discussion skill never commits. Every phase orchestrator treats only
|
|
12
|
+
complete append-only discussion records as expected bookkeeping and includes
|
|
13
|
+
them in its next normal `.project/` checkpoint; build does so before its next
|
|
14
|
+
clean layer base, and ship includes them in its transaction.
|
|
15
|
+
- Write every output to the handoff path in WORKFLOW.md, using the absolute
|
|
16
|
+
bundled template path supplied by the active phase skill. An output that
|
|
17
|
+
needs verbal explanation is defective.
|
|
18
|
+
- With no `.project/STATE.md`, route through the bundled
|
|
19
|
+
`scripts/detect_project.py initialize --repo <absolute-root> --template
|
|
20
|
+
<absolute-state-template> --require-git` helper; `route: setup-repository`
|
|
21
|
+
leaves the invocation folder unchanged and routes to repository setup before
|
|
22
|
+
state creation or branch binding. Never delete the invocation folder or its
|
|
23
|
+
state to satisfy bootstrap path checks. Do not classify from a directory listing
|
|
24
|
+
or conversation. Follow its JSON `verdict` and `route`. Reserve `classify`
|
|
25
|
+
for read-only inspection; do not use it as a state-initialization preflight.
|
|
26
|
+
- `.project/STATE.md` tracks phase position. Parse and validate it only with
|
|
27
|
+
the bundled `scripts/pipeline_state.py validate` command, route with its
|
|
28
|
+
`route` command, and make ordinary phase transitions only with its
|
|
29
|
+
expected-state `transition`. A journaled transaction helper may write only
|
|
30
|
+
the state fields its contract explicitly owns. Never reproduce these
|
|
31
|
+
deterministic operations in model reasoning. The
|
|
32
|
+
orchestrator alone owns task frontmatter base, isolated worktree/branch,
|
|
33
|
+
status, and agent; the landing commit is proven from git by `isolation.py
|
|
34
|
+
recover`, never recorded. Require `pipeline: gsd-path/v2`; never
|
|
35
|
+
consume an ambiguous or differently owned state file. Artifacts outrank
|
|
36
|
+
summaries; reconcile STATE.md when it disagrees with task frontmatter.
|
|
37
|
+
During a program build, `.project/next/STATE.md` may hold
|
|
38
|
+
the lookahead planning track for the next milestone; it follows the same
|
|
39
|
+
marker rule, owns no task frontmatter, and never binds a branch.
|
|
40
|
+
- STATE.integration_default is the project closeout choice and
|
|
41
|
+
STATE.integration is the current milestone choice. Both are `direct` or
|
|
42
|
+
`pull-request`; STATE.integration_source is `default` or `milestone` and
|
|
43
|
+
preserves explicit override provenance. Older v2 state defaults to `direct`,
|
|
44
|
+
and modes may be changed only through `pipeline_state.py
|
|
45
|
+
configure-integration` before build. A next milestone resets its current
|
|
46
|
+
choice from the project default.
|
|
47
|
+
- Spawned agents have isolated context. Follow the installed runtime dispatch
|
|
48
|
+
contract and brief them with exact input and output paths, constraints, a
|
|
49
|
+
deterministic logical task name, and a bounded responsibility. Independent
|
|
50
|
+
briefs may run in parallel up to available child capacity; a dependent
|
|
51
|
+
brief runs as soon as its dependencies complete.
|
|
52
|
+
|
|
53
|
+
## Stay in role
|
|
54
|
+
|
|
55
|
+
- The codebase mapper and docs auditor observe and verify; they are strictly
|
|
56
|
+
read-only, report observations rather than judgments, and never resolve a
|
|
57
|
+
doc-vs-code conflict — that ruling belongs to the user.
|
|
58
|
+
- Build, test, lint, and help commands are not presumed read-safe. Read-only
|
|
59
|
+
roles run project commands only in orchestrator-created disposable worktrees
|
|
60
|
+
at a recorded revision; otherwise they use static evidence or mark the check
|
|
61
|
+
unverifiable. They never create worktrees or run commands in the source tree.
|
|
62
|
+
- Researchers gather evidence; they do not decide. A dimension is researched
|
|
63
|
+
only when it has open questions; the research phase records dispatched and
|
|
64
|
+
skipped dimensions. Brownfield adds `evidence-codebase.md` as settled input.
|
|
65
|
+
- The decider works from existing evidence; it does not re-research. An
|
|
66
|
+
unresolved or uncited required decision fails the synthesis gate.
|
|
67
|
+
- The planner reads both INTENT.md and SYNTHESIS.md and specs
|
|
68
|
+
deliverable-sized outcomes and constraints; every INTENT success criterion
|
|
69
|
+
maps to a task AC and Verify in PLAN.md Intent coverage. Coders own
|
|
70
|
+
implementation decisions inside those bounds.
|
|
71
|
+
- Coders implement only their full task contract, including owned INTENT
|
|
72
|
+
success criteria read from INTENT.md, and append their result to the
|
|
73
|
+
task Log. They never change task state, review acceptance, stage, commit, or
|
|
74
|
+
freelance outside declared files.
|
|
75
|
+
- The orchestrator dispatches, arbitrates, and creates task isolation and
|
|
76
|
+
verify sidecars through the bundled `scripts/isolation.py` helper — named
|
|
77
|
+
branches only, never a detached HEAD — lands task work serially, and
|
|
78
|
+
records each clean base in task frontmatter; `land` stamps the landed
|
|
79
|
+
state into the task's own commit, so a task has exactly one commit. It
|
|
80
|
+
writes no product code. When a done task's work already sits on the bound
|
|
81
|
+
branch without a landing commit, only an explicit owner ruling through
|
|
82
|
+
`isolation.py attest` may stand in for it: one `.project/`-only commit that
|
|
83
|
+
names the base, the attested HEAD, the declared files that changed, the
|
|
84
|
+
task Verify recorded as passing at that HEAD, and the ruling verbatim.
|
|
85
|
+
`recover` reports it as `attested`, never as a proven landing.
|
|
86
|
+
- All pipeline work for a milestone lives on `gsd-path/M00N` (M001, M002,
|
|
87
|
+
…) bound in STATE.branch. The next milestone binds a new unused
|
|
88
|
+
`gsd-path/M00N` at the remote default after the previous ship integrates.
|
|
89
|
+
Integration at ship is the only path from the bound branch to the default
|
|
90
|
+
branch — either Path's direct merge or a Path-owned PR merged by the user.
|
|
91
|
+
The bound branch never receives merges or back-merges and is never the
|
|
92
|
+
GitHub default.
|
|
93
|
+
- After initialization writes STATE.md, and before entering the first pipeline
|
|
94
|
+
phase in an existing Git repository, the router calls
|
|
95
|
+
`scripts/pipeline_git.py bind-initial` with the selected M00N and exact
|
|
96
|
+
fetched `origin/main` SHA. The helper alone checks worktree identity and
|
|
97
|
+
cleanliness, exact base, and every local, remote, and other-worktree
|
|
98
|
+
collision before creating or adopting the branch. The sole cleanliness
|
|
99
|
+
exception is untracked `.project/STATE.md`: validated v2 state in active
|
|
100
|
+
inspect or define, with null milestone, branch, and archive, in a real
|
|
101
|
+
directory containing only that regular file with no hard links. The helper
|
|
102
|
+
checks its identity and bytes across binding. Do not commit initialization
|
|
103
|
+
before binding. The router persists its
|
|
104
|
+
typed result in the new state. Build has no branch-creation authority.
|
|
105
|
+
- After `validate-integrated` passes and before any next-milestone file
|
|
106
|
+
changes, the router calls the bundled `scripts/pipeline_git.py bind-next`
|
|
107
|
+
helper with the previous bound branch, exact ship SHA, and exact current
|
|
108
|
+
`origin/main` SHA. The helper moves the clean primary worktree to the new
|
|
109
|
+
unused `gsd-path/M00N` branch at that SHA without moving the previous
|
|
110
|
+
branch or entering the default checkout, then retires the integrated
|
|
111
|
+
previous branch — deleted locally and on origin; the ship commit stays
|
|
112
|
+
reachable from the integration merge and its annotated tag. The router
|
|
113
|
+
persists the new branch in STATE; a wrong-SHA or colliding branch blocks.
|
|
114
|
+
After validated PR integration, `bind-next --allow-missing-previous` may
|
|
115
|
+
retire only the local previous branch when GitHub already auto-deleted its
|
|
116
|
+
remote branch.
|
|
117
|
+
`bind-initial`, this handoff, and the approved new-repository bootstrap are
|
|
118
|
+
the only bound-branch creation authorities, and the handoff's retirement
|
|
119
|
+
push is the router's only bound-branch deletion authority. When a lookahead
|
|
120
|
+
track exists, the router then calls `scripts/pipeline_state.py promote-next`;
|
|
121
|
+
only that journaled helper moves the track, updates state and roadmap,
|
|
122
|
+
classifies plan drift, and writes the router promotion commit.
|
|
123
|
+
- Build adopts the branch recorded in STATE.branch, never whatever is current
|
|
124
|
+
when a recorded branch exists. A new-GitHub REPOSITORY.md proves the
|
|
125
|
+
default checkout and first bound branch; later milestones may rebind
|
|
126
|
+
`gsd-path/M00N` without rewriting that artifact. Build ignores older
|
|
127
|
+
milestone ship and integrate commits inherited through main. A ship commit
|
|
128
|
+
for the current STATE.branch milestone must be an ancestor of origin/main;
|
|
129
|
+
if it is not, that milestone's integration is incomplete and control routes
|
|
130
|
+
to ship, not build. Direct mode requires the matching canonical `integrate:`
|
|
131
|
+
commit; PR mode requires tag metadata and a two-parent merge whose second
|
|
132
|
+
parent is the ship commit. A null branch returns
|
|
133
|
+
to the router; build never creates, selects, switches, or rebinds it.
|
|
134
|
+
- The ship phase makes exactly one commit on the bound branch — the
|
|
135
|
+
`.project/`-only ship commit recording
|
|
136
|
+
STATE.md, the final-review artifacts, and the archive — and additionally
|
|
137
|
+
owns the integration leg. Direct mode creates and pushes one `--no-ff` merge
|
|
138
|
+
onto `main` with subject
|
|
139
|
+
`integrate: M00N — merge gsd-path/M00N into main`. Pull-request mode creates
|
|
140
|
+
or reuses one GitHub.com PR and waits for the user to merge it with a merge
|
|
141
|
+
commit; it never auto-merges. Both modes create one annotated
|
|
142
|
+
`milestone/<NNN>-<slug>` tag after merge validation.
|
|
143
|
+
The roadmap and
|
|
144
|
+
plan phases each make exactly one approval checkpoint commit
|
|
145
|
+
(`.project/`-only, deferred to the build transition commit during a
|
|
146
|
+
new-repository transaction or before Git exists). Their bundled
|
|
147
|
+
`pipeline_state.py approve` command journals before changing STATE or
|
|
148
|
+
ROADMAP.md and owns that canonical checkpoint; a routed
|
|
149
|
+
`resume-checkpoint` must finish before phase work. The router makes one
|
|
150
|
+
bookkeeping commit through `pipeline_state.py promote-next` when promoting a
|
|
151
|
+
lookahead track at a milestone boundary. Every other commit belongs to the
|
|
152
|
+
orchestrator.
|
|
153
|
+
- Reviewers verify and block; they never fix. A block names the criterion,
|
|
154
|
+
observed result, evidence location, and concrete fix direction. An optional
|
|
155
|
+
review panel is advisory: the canonical reviewer remains the only wave
|
|
156
|
+
pass/fail, and panel findings never average or auto-replan. Same-model
|
|
157
|
+
agreement is not independent verification: matching verdicts from one
|
|
158
|
+
model family count as a single evidence path. Independence comes from
|
|
159
|
+
re-run commands, reconstructed patches, different sources, or a
|
|
160
|
+
different model family. Resolve panel
|
|
161
|
+
membership with the bundled `scripts/review_panel.py` helper; do not invent
|
|
162
|
+
model families or slugs. Create task isolation and verify sidecars with the
|
|
163
|
+
bundled `scripts/isolation.py` helper; do not invent `git worktree add` or
|
|
164
|
+
`--detach`. Undo unpublished pipeline work with `scripts/pipeline_undo.py`;
|
|
165
|
+
do not invent `git reset`. Diagnose a stuck pipeline with
|
|
166
|
+
`scripts/pipeline_diagnose.py`.
|
|
167
|
+
- A bundled helper that exits non-zero stops the current step. Print its
|
|
168
|
+
stderr verbatim, run `scripts/pipeline_diagnose.py diagnose --repo
|
|
169
|
+
<absolute-root>` (bundled with `$gsd-path-forensics`), and report both.
|
|
170
|
+
Do not rerun the same command unchanged unless the helper's own contract
|
|
171
|
+
names that exact rerun as its interruption recovery. Never repair state or
|
|
172
|
+
Git by hand instead.
|
|
173
|
+
- The discussion sidecar may run during any non-shipped phase. It grounds
|
|
174
|
+
answers in code and phase artifacts, may perform focused research when
|
|
175
|
+
needed, and writes only its discussion artifacts; it never changes phase
|
|
176
|
+
state or bypasses a phase gate.
|
|
177
|
+
- During an uncommitted archive transaction, discussion writes a complete
|
|
178
|
+
active copy that extends the archived pair. The ship phase reruns `prepare`;
|
|
179
|
+
the helper validates the prefix and atomically reconciles both files.
|
|
180
|
+
Discussion never edits an archive directly or writes after shipment.
|
|
181
|
+
- The loop runner wraps explicit skills in a bounded check → verify → fix →
|
|
182
|
+
verify pass driven by a LOOP.md spec. It never advances a phase gate
|
|
183
|
+
itself and never commits or pushes.
|
|
184
|
+
- Fix tasks use the complete task template, not an abbreviated finding.
|
|
185
|
+
|
|
186
|
+
## New GitHub repositories
|
|
187
|
+
|
|
188
|
+
- Create a GitHub repository only from an explicit user request followed by an
|
|
189
|
+
approval of the exact owner/name, visibility, default-checkout path,
|
|
190
|
+
`gsd-path/M001` branch, and linked primary-worktree path. Before the
|
|
191
|
+
external action produces an artifact, present those proposed targets as the
|
|
192
|
+
inline **Review** surface using the active router's preview contract.
|
|
193
|
+
Do not write a
|
|
194
|
+
preview file into the invocation directory or another repository. Run the
|
|
195
|
+
bundled bootstrap helper's read-only `preview` command for this evidence.
|
|
196
|
+
- After approval, the bootstrap helper persists the exact targets under the
|
|
197
|
+
approved workspace before the first external mutation. Its `create` command
|
|
198
|
+
creates or verifies the remote, checkout, branch, and linked worktree one
|
|
199
|
+
stage at a time. A matching journal permits explicit resume and adoption; a
|
|
200
|
+
collision without that journal blocks. The helper removes the journal only
|
|
201
|
+
after writing owned STATE.md and fixed-format `.project/REPOSITORY.md` in the
|
|
202
|
+
linked worktree.
|
|
203
|
+
- During an approved new-repository transaction, the router may create the
|
|
204
|
+
first GSD Path branch and linked primary worktree at the verified
|
|
205
|
+
remote-default SHA and persist that branch in STATE.md and REPOSITORY.md.
|
|
206
|
+
Build must verify and adopt that exact binding from REPOSITORY.md, never a
|
|
207
|
+
free-form log. Task branches and task worktrees remain exclusively
|
|
208
|
+
build-orchestrator owned.
|
|
209
|
+
- Keep the cloned default checkout clean on the remote default branch. Run the
|
|
210
|
+
pipeline from the linked GSD Path worktree; never initialize `.project/` in
|
|
211
|
+
the default checkout, reuse an existing branch or path (except an explicitly
|
|
212
|
+
approved empty linked-worktree folder via `--reuse-empty-worktree`), move an existing
|
|
213
|
+
repository, or recover a partial GitHub creation without the exact approved
|
|
214
|
+
journal and re-verification.
|
|
@@ -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
|
|
@@ -23,10 +23,18 @@ tasks in this wave as the rubric. For each task:
|
|
|
23
23
|
concrete fix direction for each failure.
|
|
24
24
|
|
|
25
25
|
Then check each INTENT.md success criterion owned by a task in this wave
|
|
26
|
-
against that same isolated product.
|
|
27
|
-
|
|
26
|
+
against that same isolated product. In each `### SCn —` heading, copy the
|
|
27
|
+
criterion text exactly as `check_handoffs._success_criteria` stores it from
|
|
28
|
+
INTENT.md `## Success criteria`: indented continuation lines are joined
|
|
29
|
+
with a single space and keep their `- ` list markers in the compared text;
|
|
30
|
+
only whitespace is normalized at the gate. Do not paraphrase or drop
|
|
31
|
+
sub-bullets. Mark `pass` or `fail` with evidence; a failed owned SC blocks
|
|
28
32
|
the wave. Omit the Intent coverage section when no task in the wave owns
|
|
29
|
-
an SC.
|
|
33
|
+
an SC. When INTENT.md `## Edge coverage` or `## Prohibitions` has rows for
|
|
34
|
+
an owned SC, judge it against those rulings too: cite each `held-out` edge
|
|
35
|
+
id with its held-out test's recorded output and each `judgment` prohibition
|
|
36
|
+
id with what you observed. A missing held-out result or a violated ruling
|
|
37
|
+
fails the SC.
|
|
30
38
|
|
|
31
39
|
Allow changed paths only in the task's `files` plus its assigned task file.
|
|
32
40
|
Within the task file, allow orchestrator-owned `base`, `worktree`,
|
|
@@ -62,8 +70,13 @@ When explicitly briefed with final scope, record `Review scope: final` and the
|
|
|
62
70
|
full supplied review HEAD in the wave artifact. Check all INTENT success criteria
|
|
63
71
|
and PLAN's Surface contract against the completed isolated product. Each surface
|
|
64
72
|
criterion's Intent coverage block includes `- **Surface**:`, `- **Check**:`, and
|
|
65
|
-
`- **Observed**:` with the walked states and actual result.
|
|
66
|
-
|
|
73
|
+
`- **Observed**:` with the walked states and actual result. `Surface` holds
|
|
74
|
+
exactly the surface name from PLAN's Surface contract; walkthrough detail belongs
|
|
75
|
+
in Check and Observed. Reuse recorded task
|
|
76
|
+
output if it proves that exact walkthrough; run only a missing check. Cite
|
|
77
|
+
every `held-out` edge and `judgment` prohibition id of each criterion in its
|
|
78
|
+
evidence; shipping derives FINAL.md from these records, and an uncited id
|
|
79
|
+
sends the milestone to a dispatched final review instead. Final-scope
|
|
67
80
|
coverage shares this wave artifact; do not write a second report. Shipping's
|
|
68
81
|
runtime checks freshness and derives the final view from these records.
|
|
69
82
|
|
|
@@ -46,7 +46,9 @@ Resolve sibling links against this role file's directory.
|
|
|
46
46
|
from the same model family is one evidence path; independence comes
|
|
47
47
|
from re-run evidence, different sources, or a different model family.
|
|
48
48
|
- Pass any reasonable satisfied reading of an ambiguous wave criterion and
|
|
49
|
-
warn that it needs tightening.
|
|
49
|
+
warn that it needs tightening, unless INTENT.md `## Edge coverage` or
|
|
50
|
+
`## Prohibitions` rules on that reading: a ruling there binds, and a
|
|
51
|
+
reading that contradicts it fails.
|
|
50
52
|
- Do not edit code, tasks, plans, or implementation state.
|
|
51
53
|
|
|
52
54
|
Return verdicts and the review output path without extra prose.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Spec-reach probes
|
|
2
|
+
|
|
3
|
+
Define runs two probes over the success criteria before approval: the edge
|
|
4
|
+
probe (what each criterion must do at its edges) and the prohibition probe
|
|
5
|
+
(what each criterion must never silently become). Both leave a table in
|
|
6
|
+
INTENT.md. Plan, build review, and final review read those tables; the
|
|
7
|
+
`check_handoffs.py intent`, `plan`, and `final` gates enforce them.
|
|
8
|
+
|
|
9
|
+
## Why define owns this
|
|
10
|
+
|
|
11
|
+
A reviewer can only check what the intent states. An edge nobody wrote down
|
|
12
|
+
is never checked: final review covers exactly the INTENT success criteria,
|
|
13
|
+
and a reviewer passes any reasonable reading of an ambiguous one. Model
|
|
14
|
+
reviewers are also confidently wrong on exactly these gaps. On three tasks
|
|
15
|
+
whose correct behavior the spec left unstated, LLM verifier verdicts caught
|
|
16
|
+
the defect 0 times in 12 while a held-out test caught all three; in a larger
|
|
17
|
+
replication, stating the surfaced edge in the spec raised the verifier's
|
|
18
|
+
catch rate to 98% ([Verifier Reach Is Spec Reach](https://github.com/davesienkowski/verifier-reach-is-spec-reach)).
|
|
19
|
+
A smarter reviewer does not close that gap; a wider intent does. The user is
|
|
20
|
+
present at define, so define is where the edge gets its ruling.
|
|
21
|
+
|
|
22
|
+
## Edge probe
|
|
23
|
+
|
|
24
|
+
Walk every success criterion:
|
|
25
|
+
|
|
26
|
+
1. Name the data shapes the criterion handles, then raise only the
|
|
27
|
+
categories those shapes reach:
|
|
28
|
+
|
|
29
|
+
| Shape | Categories |
|
|
30
|
+
|-------|------------|
|
|
31
|
+
| numeric range, dates, money, counts | boundary, precision |
|
|
32
|
+
| list, set, rows, intervals | adjacency, empty, ordering |
|
|
33
|
+
| text, names, identifiers | empty, encoding |
|
|
34
|
+
| state that persists or repeats | idempotency, concurrency |
|
|
35
|
+
| files, network, processes | concurrency |
|
|
36
|
+
|
|
37
|
+
2. For each raised category, write one concrete candidate edge and the
|
|
38
|
+
ruling you recommend:
|
|
39
|
+
|
|
40
|
+
| Category | Probe question |
|
|
41
|
+
|----------|----------------|
|
|
42
|
+
| boundary | What happens exactly at each minimum, maximum, or threshold, and one step either side? |
|
|
43
|
+
| adjacency | When two items are equal or just touch, do they merge, collide, or stay separate? |
|
|
44
|
+
| empty | What is the result for empty, single-item, or missing input? |
|
|
45
|
+
| encoding | Whose length or equality applies: bytes, code points, grapheme clusters, normalized form, case? |
|
|
46
|
+
| ordering | When items compare equal, is output order specified and stable? |
|
|
47
|
+
| precision | Where can rounding, overflow, or truncation happen, and which rule applies? |
|
|
48
|
+
| idempotency | What happens when this runs twice on the same input? |
|
|
49
|
+
| concurrency | If interrupted or run in parallel, what is guaranteed? |
|
|
50
|
+
|
|
51
|
+
3. Ask the user in one small round, all criteria together, recommended
|
|
52
|
+
ruling first. Never rule on an edge's behavior yourself: the correct
|
|
53
|
+
answer is exactly what the criteria did not say, so a guess here is the
|
|
54
|
+
defect this probe exists to prevent. Under pre-approval, an edge whose
|
|
55
|
+
behavior the user has not stated is still a required answer: stop and
|
|
56
|
+
ask instead of ruling.
|
|
57
|
+
|
|
58
|
+
4. Record each ruling as one row:
|
|
59
|
+
- `criterion SCn` when the answer is observable where the user sees the
|
|
60
|
+
work. Add or amend that success criterion (define owns criteria), then
|
|
61
|
+
point the row at it. An existing criterion that already states the
|
|
62
|
+
edge may be named directly.
|
|
63
|
+
- `held-out` when the answer is a precise rule or a set of examples that
|
|
64
|
+
belongs in a test rather than a user-facing criterion (a normalization
|
|
65
|
+
form, a rounding rule, an inclusive bound on an internal API). Write the
|
|
66
|
+
ruling or the user's examples verbatim in Detail. The plan must schedule
|
|
67
|
+
a named test that pins it.
|
|
68
|
+
- `dismissed` when the edge cannot occur for this criterion. Detail says
|
|
69
|
+
why ("input is a closed enum"). "Not important" is not a reason.
|
|
70
|
+
|
|
71
|
+
Every criterion gets at least one row. A criterion with no data shape gets
|
|
72
|
+
one row with category `none`, dismissed with its reason.
|
|
73
|
+
|
|
74
|
+
## Prohibition probe
|
|
75
|
+
|
|
76
|
+
Walk every success criterion with one adversarial question: what could this
|
|
77
|
+
silently become that the user would not want, although nothing in INTENT.md
|
|
78
|
+
forbids it? Generate candidates privately, then keep only values, safety,
|
|
79
|
+
privacy, fairness, and transparency items: "must not email unsubscribed
|
|
80
|
+
users", "must not store raw card numbers in logs", "must not use guilt
|
|
81
|
+
wording". Drop routine engineering items (mutating input, throwing on empty
|
|
82
|
+
input, leaking handles); those are edges or ordinary review. Do not mint
|
|
83
|
+
generic security or compliance canon (injection, path traversal, data
|
|
84
|
+
retention law); record a real compliance need under Constraints instead.
|
|
85
|
+
Expect two or three kept items for work people touch, and often none for
|
|
86
|
+
internals.
|
|
87
|
+
|
|
88
|
+
Present the kept items with a recommended ruling and record each as a row:
|
|
89
|
+
|
|
90
|
+
- `criterion SCn` when a test or command can check it. State it as a
|
|
91
|
+
success criterion and point the row at it.
|
|
92
|
+
- `judgment` when it is real but not mechanically checkable. Detail says
|
|
93
|
+
what the final reviewer looks for.
|
|
94
|
+
- `dismissed` when the user rules it out. Detail records the reason.
|
|
95
|
+
|
|
96
|
+
Work that affects no person directly records a single row instead, and no
|
|
97
|
+
other: `| N1 | all | none | dismissed | <why no person is affected> |`.
|
|
98
|
+
|
|
99
|
+
## INTENT.md tables
|
|
100
|
+
|
|
101
|
+
```markdown
|
|
102
|
+
## Edge coverage
|
|
103
|
+
|
|
104
|
+
| Edge | Criterion | Category | Disposition | Detail |
|
|
105
|
+
|------|-----------|----------|-------------|--------|
|
|
106
|
+
| E1 | SC1 | boundary | criterion SC4 | |
|
|
107
|
+
| E2 | SC1 | empty | dismissed | the command always receives at least one file |
|
|
108
|
+
| E3 | SC2 | encoding | held-out | names compare by NFC code points, case-sensitive |
|
|
109
|
+
|
|
110
|
+
## Prohibitions
|
|
111
|
+
|
|
112
|
+
| Prohibition | Criterion | Must not | Disposition | Detail |
|
|
113
|
+
|-------------|-----------|----------|-------------|--------|
|
|
114
|
+
| N1 | SC2 | send a reminder to an unsubscribed user | criterion SC5 | |
|
|
115
|
+
| N2 | SC2 | use guilt or shame wording | judgment | reminder copy is neutral and states only the due item |
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Ids are contiguous from `E1` and `N1`. Detail is required for every row that
|
|
119
|
+
is not `criterion SCn`. The headings are exact: `## Edge coverage` and
|
|
120
|
+
`## Prohibitions`. An INTENT.md without them predates the probes and is not
|
|
121
|
+
rechecked; a near-miss heading fails the gate rather than switching it off.
|
|
122
|
+
|
|
123
|
+
## Downstream
|
|
124
|
+
|
|
125
|
+
- **Plan.** Every `held-out` edge gets one PLAN.md `## Held-out checks` row
|
|
126
|
+
naming the task that owns the edge's criterion and the test file (a
|
|
127
|
+
`path::test_name` node id is fine). That file is listed in the task's
|
|
128
|
+
`files`, the task's Verify runs it, and the task's Acceptance criteria
|
|
129
|
+
state the edge id and its ruling. A `criterion SCn` row needs nothing extra: SCn is
|
|
130
|
+
already covered like any criterion. A `judgment` prohibition belongs in
|
|
131
|
+
the owning task's Approach so the coder knows the line.
|
|
132
|
+
- **Review.** A row pins the reading of its criterion. A reviewer does not
|
|
133
|
+
pass a reading that contradicts a ruling in either table, and cites each
|
|
134
|
+
held-out edge and judgment prohibition id with its evidence.
|
|
135
|
+
- **Final review.** A criterion that carries a held-out edge or a judgment
|
|
136
|
+
prohibition is `met` only when its Check, Observed, or Reference cites
|
|
137
|
+
every such id with the evidence: the held-out test's recorded passing
|
|
138
|
+
output, or the observed behavior judged against Detail. When that
|
|
139
|
+
evidence is missing, did not run, or cannot be judged, record
|
|
140
|
+
`unverifiable` with `Finding: insufficient spec evidence: <id> ...`;
|
|
141
|
+
never `met` on inference. The trigger is the tag, not reviewer doubt:
|
|
142
|
+
criteria without a tag are graded as usual and never abstained.
|
|
143
|
+
|
|
144
|
+
## What the gates can and cannot prove
|
|
145
|
+
|
|
146
|
+
`check_handoffs.py intent` (before approval and again when define records
|
|
147
|
+
approval), `plan`, and `final` prove the tables are complete, every held-out
|
|
148
|
+
edge has a scheduled test, and every tagged `met` cites its tags. They cannot
|
|
149
|
+
prove who made a ruling or that a cited result says what the verdict claims.
|
|
150
|
+
Those stay with the define conversation and the reviewer's recorded evidence.
|