solo-sdd 0.2.0__tar.gz

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.
Files changed (305) hide show
  1. solo_sdd-0.2.0/.gitattributes +1 -0
  2. solo_sdd-0.2.0/.github/workflows/release.yml +162 -0
  3. solo_sdd-0.2.0/.github/workflows/test.yml +54 -0
  4. solo_sdd-0.2.0/.gitignore +43 -0
  5. solo_sdd-0.2.0/AGENTS.md +115 -0
  6. solo_sdd-0.2.0/ALGORITHM.md +211 -0
  7. solo_sdd-0.2.0/CHANGELOG.md +97 -0
  8. solo_sdd-0.2.0/CLAUDE.md +1 -0
  9. solo_sdd-0.2.0/LESSONS.md +58 -0
  10. solo_sdd-0.2.0/LICENSE +21 -0
  11. solo_sdd-0.2.0/PKG-INFO +496 -0
  12. solo_sdd-0.2.0/README.md +474 -0
  13. solo_sdd-0.2.0/SOURCES.md +23 -0
  14. solo_sdd-0.2.0/bin/solo-sdd.js +36 -0
  15. solo_sdd-0.2.0/docs/layout.md +28 -0
  16. solo_sdd-0.2.0/docs/release.md +66 -0
  17. solo_sdd-0.2.0/examples/demo/AGENTS.md +36 -0
  18. solo_sdd-0.2.0/examples/demo/WALKTHROUGH.md +63 -0
  19. solo_sdd-0.2.0/examples/demo/solo-sdd/analyze.md +7 -0
  20. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/archive/2026-11-10-tip-calc/proposal.md +33 -0
  21. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/archive/2026-11-10-tip-calc/specs/tip/spec.md +23 -0
  22. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/archive/2026-11-10-tip-calc/tasks.md +8 -0
  23. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/archive/2026-11-10-tip-calc/verification.md +27 -0
  24. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/split-bill/proposal.md +34 -0
  25. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/split-bill/specs/tip/spec.md +16 -0
  26. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/split-bill/tasks.md +9 -0
  27. solo_sdd-0.2.0/examples/demo/solo-sdd/changes/split-bill/verification.md +27 -0
  28. solo_sdd-0.2.0/examples/demo/solo-sdd/config +4 -0
  29. solo_sdd-0.2.0/examples/demo/solo-sdd/project.md +13 -0
  30. solo_sdd-0.2.0/examples/demo/solo-sdd/specs/tip/spec.md +24 -0
  31. solo_sdd-0.2.0/examples/demo/tests/test_tip.py +36 -0
  32. solo_sdd-0.2.0/examples/demo/tip.py +38 -0
  33. solo_sdd-0.2.0/global/AGENTS.md +132 -0
  34. solo_sdd-0.2.0/global/model-policy.json +14 -0
  35. solo_sdd-0.2.0/global/process-guard.py +294 -0
  36. solo_sdd-0.2.0/global/sdd_dispatch.py +524 -0
  37. solo_sdd-0.2.0/global/sdd_dispatch_plan.py +650 -0
  38. solo_sdd-0.2.0/global/sdd_eval.py +1001 -0
  39. solo_sdd-0.2.0/global/sdd_pr.py +956 -0
  40. solo_sdd-0.2.0/global/sdd_worktree.py +846 -0
  41. solo_sdd-0.2.0/global/work_hooks.py +2536 -0
  42. solo_sdd-0.2.0/global/work_hooks_settings.py +7 -0
  43. solo_sdd-0.2.0/integrations/antislop/LICENSE +21 -0
  44. solo_sdd-0.2.0/integrations/antislop/README.md +11 -0
  45. solo_sdd-0.2.0/integrations/antislop/VERSION +2 -0
  46. solo_sdd-0.2.0/integrations/antislop/antislop.md +745 -0
  47. solo_sdd-0.2.0/integrations/antislop/integration +6 -0
  48. solo_sdd-0.2.0/integrations/antislop/skills/antislop-copywriting/SKILL.md +372 -0
  49. solo_sdd-0.2.0/integrations/antislop/skills/antislop-human/LICENSE-web-quality-skills +21 -0
  50. solo_sdd-0.2.0/integrations/antislop/skills/antislop-human/SKILL.md +204 -0
  51. solo_sdd-0.2.0/integrations/antislop/skills/antislop-human/contrast-check.py +168 -0
  52. solo_sdd-0.2.0/integrations/antislop/skills/antislop-human/references/A11Y-PATTERNS.md +249 -0
  53. solo_sdd-0.2.0/integrations/antislop/skills/antislop-human/references/WCAG.md +127 -0
  54. solo_sdd-0.2.0/integrations/antislop/skills/antislop-layoutmobile/SKILL.md +170 -0
  55. solo_sdd-0.2.0/integrations/antislop/skills/antislop-ui/LICENSE-web-quality-skills +21 -0
  56. solo_sdd-0.2.0/integrations/antislop/skills/antislop-ui/SKILL.md +344 -0
  57. solo_sdd-0.2.0/integrations/antislop/skills/antislop-ui/references/CORE-WEB-VITALS.md +181 -0
  58. solo_sdd-0.2.0/integrations/antislop/skills/antislop-ui/references/WEB-BASELINE.md +28 -0
  59. solo_sdd-0.2.0/integrations/security-audit/LICENSE +21 -0
  60. solo_sdd-0.2.0/integrations/security-audit/README.md +106 -0
  61. solo_sdd-0.2.0/integrations/security-audit/VERSION +21 -0
  62. solo_sdd-0.2.0/integrations/security-audit/integration +6 -0
  63. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/AI-AND-LLM.md +83 -0
  64. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/ATTACK-CLASSES.md +130 -0
  65. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/CLIENT-SIDE.md +83 -0
  66. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/CLOUD-AND-DEPLOYMENT.md +86 -0
  67. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/DATA-ISOLATION-AND-LIFECYCLE.md +84 -0
  68. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/DESKTOP-MOBILE-AND-LOCAL-IPC.md +89 -0
  69. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/HUNTING.md +251 -0
  70. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/MEMORY-SAFETY-AND-BINARY.md +101 -0
  71. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/PROTOCOLS-RPC-AND-MESSAGING.md +81 -0
  72. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/RECONNAISSANCE.md +156 -0
  73. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/RESOURCE-EXHAUSTION-AND-AVAILABILITY.md +78 -0
  74. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/SKILL.md +192 -0
  75. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/SUPPLY-CHAIN-AND-RELEASE.md +73 -0
  76. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/VALIDATION-AND-REPORTING.md +186 -0
  77. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/WEB-PROTOCOL-AND-AUTH.md +105 -0
  78. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/report-schema.json +461 -0
  79. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/validate-coverage-ledger.cjs +872 -0
  80. solo_sdd-0.2.0/integrations/security-audit/skills/security-audit/validate-findings.cjs +773 -0
  81. solo_sdd-0.2.0/package.json +43 -0
  82. solo_sdd-0.2.0/pyproject.toml +51 -0
  83. solo_sdd-0.2.0/scripts/pre-push-guard.sh +22 -0
  84. solo_sdd-0.2.0/scripts/publish-first.sh +141 -0
  85. solo_sdd-0.2.0/scripts/release_check.py +233 -0
  86. solo_sdd-0.2.0/scripts/sync_blocks.py +138 -0
  87. solo_sdd-0.2.0/skills/agent-quality/SKILL.md +52 -0
  88. solo_sdd-0.2.0/skills/blockers/SKILL.md +29 -0
  89. solo_sdd-0.2.0/skills/changes/SKILL.md +31 -0
  90. solo_sdd-0.2.0/skills/codex-orchestration/SKILL.md +161 -0
  91. solo_sdd-0.2.0/skills/context-resume/SKILL.md +50 -0
  92. solo_sdd-0.2.0/skills/copy-check/SKILL.md +109 -0
  93. solo_sdd-0.2.0/skills/debug-profile/SKILL.md +73 -0
  94. solo_sdd-0.2.0/skills/evidence-research/SKILL.md +43 -0
  95. solo_sdd-0.2.0/skills/health/SKILL.md +38 -0
  96. solo_sdd-0.2.0/skills/project-init/SKILL.md +96 -0
  97. solo_sdd-0.2.0/skills/relay/SKILL.md +31 -0
  98. solo_sdd-0.2.0/skills/report/SKILL.md +30 -0
  99. solo_sdd-0.2.0/skills/ship/SKILL.md +55 -0
  100. solo_sdd-0.2.0/skills/spec-analyze/SKILL.md +116 -0
  101. solo_sdd-0.2.0/skills/spec-audit/SKILL.md +53 -0
  102. solo_sdd-0.2.0/skills/spec-dispatch/SKILL.md +239 -0
  103. solo_sdd-0.2.0/skills/spec-next/SKILL.md +118 -0
  104. solo_sdd-0.2.0/skills/spec-plan/SKILL.md +149 -0
  105. solo_sdd-0.2.0/skills/ui-check/SKILL.md +106 -0
  106. solo_sdd-0.2.0/skills/work-status/SKILL.md +26 -0
  107. solo_sdd-0.2.0/solo_sdd/__init__.py +1 -0
  108. solo_sdd-0.2.0/solo_sdd/__main__.py +5 -0
  109. solo_sdd-0.2.0/solo_sdd/cli.py +204 -0
  110. solo_sdd-0.2.0/solo_sdd/doctor.py +338 -0
  111. solo_sdd-0.2.0/solo_sdd/hooks.py +297 -0
  112. solo_sdd-0.2.0/solo_sdd/import_openspec.py +164 -0
  113. solo_sdd-0.2.0/solo_sdd/init.py +293 -0
  114. solo_sdd-0.2.0/solo_sdd/integration_run.py +532 -0
  115. solo_sdd-0.2.0/solo_sdd/integrations.py +351 -0
  116. solo_sdd-0.2.0/solo_sdd/keywords.py +65 -0
  117. solo_sdd-0.2.0/solo_sdd/layout.py +820 -0
  118. solo_sdd-0.2.0/solo_sdd/process_cli.py +378 -0
  119. solo_sdd-0.2.0/solo_sdd/process_format.py +444 -0
  120. solo_sdd-0.2.0/solo_sdd/providers.py +116 -0
  121. solo_sdd-0.2.0/solo_sdd/resources.py +6 -0
  122. solo_sdd-0.2.0/solo_sdd/rules_block.py +56 -0
  123. solo_sdd-0.2.0/solo_sdd/settings.py +248 -0
  124. solo_sdd-0.2.0/solo_sdd/setup_detect.py +71 -0
  125. solo_sdd-0.2.0/sync.py +9 -0
  126. solo_sdd-0.2.0/targets.json +66 -0
  127. solo_sdd-0.2.0/templates/DESIGN.md +21 -0
  128. solo_sdd-0.2.0/templates/docs/waiting.md +7 -0
  129. solo_sdd-0.2.0/templates/solo-sdd/analyze.md +21 -0
  130. solo_sdd-0.2.0/templates/solo-sdd/change/proposal.md +33 -0
  131. solo_sdd-0.2.0/templates/solo-sdd/change/spec.md +17 -0
  132. solo_sdd-0.2.0/templates/solo-sdd/change/tasks.md +8 -0
  133. solo_sdd-0.2.0/templates/solo-sdd/change/verification.md +23 -0
  134. solo_sdd-0.2.0/templates/solo-sdd/project.md +12 -0
  135. solo_sdd-0.2.0/tests/affected.json +353 -0
  136. solo_sdd-0.2.0/tests/eval/README.md +66 -0
  137. solo_sdd-0.2.0/tests/eval/configs/baseline.json +1 -0
  138. solo_sdd-0.2.0/tests/eval/configs/orchestrator-solo.json +1 -0
  139. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-implement.jsonl +5 -0
  140. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-implement.meta.json +1 -0
  141. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-orchestrator.jsonl +5 -0
  142. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-orchestrator.meta.json +1 -0
  143. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-review.jsonl +5 -0
  144. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session/subagents/agent-review.meta.json +1 -0
  145. solo_sdd-0.2.0/tests/eval/fixtures/fixture-session.jsonl +16 -0
  146. solo_sdd-0.2.0/tests/eval/prices.json +6 -0
  147. solo_sdd-0.2.0/tests/marks.py +29 -0
  148. solo_sdd-0.2.0/tests/run.py +195 -0
  149. solo_sdd-0.2.0/tests/shared_repo.py +75 -0
  150. solo_sdd-0.2.0/tests/stands/accept-live-whitespace.py +36 -0
  151. solo_sdd-0.2.0/tests/stands/acceptance-evidence.py +89 -0
  152. solo_sdd-0.2.0/tests/stands/adaptive-init.py +153 -0
  153. solo_sdd-0.2.0/tests/stands/archive-gates.py +99 -0
  154. solo_sdd-0.2.0/tests/stands/archive-run-words.py +55 -0
  155. solo_sdd-0.2.0/tests/stands/archive-unpublished.py +233 -0
  156. solo_sdd-0.2.0/tests/stands/artifacts-tracked.sh +39 -0
  157. solo_sdd-0.2.0/tests/stands/change-cli.py +137 -0
  158. solo_sdd-0.2.0/tests/stands/change-format.py +119 -0
  159. solo_sdd-0.2.0/tests/stands/ci-cost.py +88 -0
  160. solo_sdd-0.2.0/tests/stands/command-guards.py +96 -0
  161. solo_sdd-0.2.0/tests/stands/copy-stand/EXPECTED.md +68 -0
  162. solo_sdd-0.2.0/tests/stands/copy-stand/README.md +9 -0
  163. solo_sdd-0.2.0/tests/stands/copy-stand/en.json +6 -0
  164. solo_sdd-0.2.0/tests/stands/delivery-branches.py +202 -0
  165. solo_sdd-0.2.0/tests/stands/dispatch-stand.sh +1245 -0
  166. solo_sdd-0.2.0/tests/stands/drop-openspec.py +114 -0
  167. solo_sdd-0.2.0/tests/stands/english-keywords.py +112 -0
  168. solo_sdd-0.2.0/tests/stands/eval-replay.py +165 -0
  169. solo_sdd-0.2.0/tests/stands/hook-failure-signal.py +90 -0
  170. solo_sdd-0.2.0/tests/stands/hook-tool-names.py +126 -0
  171. solo_sdd-0.2.0/tests/stands/hooks-replay.py +321 -0
  172. solo_sdd-0.2.0/tests/stands/hooks-test-unittest.py +187 -0
  173. solo_sdd-0.2.0/tests/stands/init-ci-detect.py +75 -0
  174. solo_sdd-0.2.0/tests/stands/integration-contract.py +100 -0
  175. solo_sdd-0.2.0/tests/stands/integration-doctor.py +108 -0
  176. solo_sdd-0.2.0/tests/stands/integration-points.py +156 -0
  177. solo_sdd-0.2.0/tests/stands/integration-rules.py +134 -0
  178. solo_sdd-0.2.0/tests/stands/integration-run.py +126 -0
  179. solo_sdd-0.2.0/tests/stands/integration-skills.py +106 -0
  180. solo_sdd-0.2.0/tests/stands/layout-safety.py +96 -0
  181. solo_sdd-0.2.0/tests/stands/lesson-routing.py +50 -0
  182. solo_sdd-0.2.0/tests/stands/lesson-stand/AGENTS.full.md +50 -0
  183. solo_sdd-0.2.0/tests/stands/lesson-stand/AGENTS.md +27 -0
  184. solo_sdd-0.2.0/tests/stands/lesson-stand/README.md +28 -0
  185. solo_sdd-0.2.0/tests/stands/lesson-stand/check.sh +15 -0
  186. solo_sdd-0.2.0/tests/stands/lesson-stand/handlers.py +27 -0
  187. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/archive/.gitkeep +0 -0
  188. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/fix-second-handler/.openspec.yaml +2 -0
  189. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/fix-second-handler/proposal.md +32 -0
  190. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/fix-second-handler/specs/handlers/spec.md +12 -0
  191. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/fix-second-handler/tasks.md +8 -0
  192. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/changes/fix-second-handler/verification.md +21 -0
  193. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/config.yaml +6 -0
  194. solo_sdd-0.2.0/tests/stands/lesson-stand/openspec/specs/handlers/spec.md +14 -0
  195. solo_sdd-0.2.0/tests/stands/lesson-stand/test_handlers.py +15 -0
  196. solo_sdd-0.2.0/tests/stands/light-path.py +119 -0
  197. solo_sdd-0.2.0/tests/stands/live-one-command.py +40 -0
  198. solo_sdd-0.2.0/tests/stands/loopback-probe.sh +70 -0
  199. solo_sdd-0.2.0/tests/stands/map-stand/check.py +80 -0
  200. solo_sdd-0.2.0/tests/stands/map-stand/stand.py +97 -0
  201. solo_sdd-0.2.0/tests/stands/merge-by-human.py +159 -0
  202. solo_sdd-0.2.0/tests/stands/message-expansion.py +53 -0
  203. solo_sdd-0.2.0/tests/stands/openspec-import.py +114 -0
  204. solo_sdd-0.2.0/tests/stands/own-debugging.py +116 -0
  205. solo_sdd-0.2.0/tests/stands/owner-paths.py +233 -0
  206. solo_sdd-0.2.0/tests/stands/owner-traces-in-rules.py +123 -0
  207. solo_sdd-0.2.0/tests/stands/owner-traces.py +91 -0
  208. solo_sdd-0.2.0/tests/stands/path-checklists.py +204 -0
  209. solo_sdd-0.2.0/tests/stands/plan-map-stand.py +130 -0
  210. solo_sdd-0.2.0/tests/stands/plan-stale-claim.sh +49 -0
  211. solo_sdd-0.2.0/tests/stands/project-config.py +112 -0
  212. solo_sdd-0.2.0/tests/stands/provider-adapters.py +98 -0
  213. solo_sdd-0.2.0/tests/stands/provider-cursor.py +60 -0
  214. solo_sdd-0.2.0/tests/stands/provider-probe.py +119 -0
  215. solo_sdd-0.2.0/tests/stands/publish-first.sh +130 -0
  216. solo_sdd-0.2.0/tests/stands/purge-keeps-integrations.py +60 -0
  217. solo_sdd-0.2.0/tests/stands/readme-quickstart.py +61 -0
  218. solo_sdd-0.2.0/tests/stands/red-after-merge.py +225 -0
  219. solo_sdd-0.2.0/tests/stands/release-ci.py +142 -0
  220. solo_sdd-0.2.0/tests/stands/repo-own-format.py +70 -0
  221. solo_sdd-0.2.0/tests/stands/required-checks.py +90 -0
  222. solo_sdd-0.2.0/tests/stands/rules-audit.py +85 -0
  223. solo_sdd-0.2.0/tests/stands/rules-opt-in.py +139 -0
  224. solo_sdd-0.2.0/tests/stands/rules-size.py +74 -0
  225. solo_sdd-0.2.0/tests/stands/scripts-own-tree.py +134 -0
  226. solo_sdd-0.2.0/tests/stands/secret-guard.py +72 -0
  227. solo_sdd-0.2.0/tests/stands/secret-sandbox-read.py +72 -0
  228. solo_sdd-0.2.0/tests/stands/security-pass/EXPECTED.md +44 -0
  229. solo_sdd-0.2.0/tests/stands/security-pass/README.md +5 -0
  230. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/changes/add-project-delete/.openspec.yaml +2 -0
  231. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/changes/add-project-delete/proposal.md +32 -0
  232. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/changes/add-project-delete/specs/projects/spec.md +8 -0
  233. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/changes/add-project-delete/tasks.md +8 -0
  234. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/changes/add-project-delete/verification.md +17 -0
  235. solo_sdd-0.2.0/tests/stands/security-pass/analyze/openspec/specs/projects/spec.md +14 -0
  236. solo_sdd-0.2.0/tests/stands/security-pass/bad/.python-version +1 -0
  237. solo_sdd-0.2.0/tests/stands/security-pass/bad/SPEC.md +11 -0
  238. solo_sdd-0.2.0/tests/stands/security-pass/bad/bin/check-archive +0 -0
  239. solo_sdd-0.2.0/tests/stands/security-pass/bad/notes.py +42 -0
  240. solo_sdd-0.2.0/tests/stands/security-pass/good/.python-version +1 -0
  241. solo_sdd-0.2.0/tests/stands/security-pass/good/SPEC.md +10 -0
  242. solo_sdd-0.2.0/tests/stands/security-pass/good/notes.py +47 -0
  243. solo_sdd-0.2.0/tests/stands/security-pass.py +73 -0
  244. solo_sdd-0.2.0/tests/stands/shared-blocks.py +82 -0
  245. solo_sdd-0.2.0/tests/stands/ship-land.py +230 -0
  246. solo_sdd-0.2.0/tests/stands/ship-merge-gates.py +144 -0
  247. solo_sdd-0.2.0/tests/stands/skills-own-cli.py +124 -0
  248. solo_sdd-0.2.0/tests/stands/slow-tests-cost.py +197 -0
  249. solo_sdd-0.2.0/tests/stands/test-growth-brake.py +105 -0
  250. solo_sdd-0.2.0/tests/stands/test-marks.py +145 -0
  251. solo_sdd-0.2.0/tests/stands/test-run-budget.py +108 -0
  252. solo_sdd-0.2.0/tests/stands/test-runner.py +80 -0
  253. solo_sdd-0.2.0/tests/stands/ui-gate-stand/DESIGN-step3.md +15 -0
  254. solo_sdd-0.2.0/tests/stands/ui-gate-stand/EXPECTED.md +71 -0
  255. solo_sdd-0.2.0/tests/stands/ui-gate-stand/README.md +45 -0
  256. solo_sdd-0.2.0/tests/stands/ui-gate-stand/index.html +77 -0
  257. solo_sdd-0.2.0/tests/stands/ui-gate-stand/stand-form/proposal.md +7 -0
  258. solo_sdd-0.2.0/tests/stands/ui-gate-stand/stand-form/specs/feedback-form/spec.md +8 -0
  259. solo_sdd-0.2.0/tests/stands/ui-gate-stand/stand-form/tasks.md +3 -0
  260. solo_sdd-0.2.0/tests/stands/ui-gate-stand/stand-form.patch +19 -0
  261. solo_sdd-0.2.0/tests/stands/ui-gate-stand/tests/keep.txt +1 -0
  262. solo_sdd-0.2.0/tests/stands/vendor-targets.py +89 -0
  263. solo_sdd-0.2.0/tests/stands/vendor-to-integrations.py +197 -0
  264. solo_sdd-0.2.0/tests/stands/worktree-auto-ignored.sh +61 -0
  265. solo_sdd-0.2.0/tests/stands/worktree-guard-words.py +80 -0
  266. solo_sdd-0.2.0/tests/stands/worktree-native.py +65 -0
  267. solo_sdd-0.2.0/tests/stands/zsh-substitution.py +62 -0
  268. solo_sdd-0.2.0/tests/targets-before.json +66 -0
  269. solo_sdd-0.2.0/tests/test_cli.py +1932 -0
  270. solo_sdd-0.2.0/tests/test_demo.py +120 -0
  271. solo_sdd-0.2.0/tests/test_import_openspec.py +319 -0
  272. solo_sdd-0.2.0/tests/test_init.py +591 -0
  273. solo_sdd-0.2.0/tests/test_integration_doctor.py +222 -0
  274. solo_sdd-0.2.0/tests/test_integration_points.py +173 -0
  275. solo_sdd-0.2.0/tests/test_integration_rules.py +406 -0
  276. solo_sdd-0.2.0/tests/test_integration_run.py +514 -0
  277. solo_sdd-0.2.0/tests/test_integration_skills.py +363 -0
  278. solo_sdd-0.2.0/tests/test_integrations.py +803 -0
  279. solo_sdd-0.2.0/tests/test_map_check.py +125 -0
  280. solo_sdd-0.2.0/tests/test_npm_package.py +163 -0
  281. solo_sdd-0.2.0/tests/test_pre_push_guard.py +113 -0
  282. solo_sdd-0.2.0/tests/test_process_cli.py +461 -0
  283. solo_sdd-0.2.0/tests/test_process_format.py +497 -0
  284. solo_sdd-0.2.0/tests/test_process_guard.py +355 -0
  285. solo_sdd-0.2.0/tests/test_providers.py +332 -0
  286. solo_sdd-0.2.0/tests/test_public_tree.py +407 -0
  287. solo_sdd-0.2.0/tests/test_publish_first.py +388 -0
  288. solo_sdd-0.2.0/tests/test_readme.py +270 -0
  289. solo_sdd-0.2.0/tests/test_release.py +636 -0
  290. solo_sdd-0.2.0/tests/test_repo_language.py +50 -0
  291. solo_sdd-0.2.0/tests/test_runner.py +560 -0
  292. solo_sdd-0.2.0/tests/test_sdd_dispatch.py +899 -0
  293. solo_sdd-0.2.0/tests/test_sdd_dispatch_plan.py +1141 -0
  294. solo_sdd-0.2.0/tests/test_sdd_eval.py +1412 -0
  295. solo_sdd-0.2.0/tests/test_sdd_pr.py +1820 -0
  296. solo_sdd-0.2.0/tests/test_sdd_worktree.py +1231 -0
  297. solo_sdd-0.2.0/tests/test_settings.py +352 -0
  298. solo_sdd-0.2.0/tests/test_setup_detect.py +153 -0
  299. solo_sdd-0.2.0/tests/test_shared_repo.py +252 -0
  300. solo_sdd-0.2.0/tests/test_skill_commands.py +242 -0
  301. solo_sdd-0.2.0/tests/test_sync.py +635 -0
  302. solo_sdd-0.2.0/tests/test_sync_blocks.py +290 -0
  303. solo_sdd-0.2.0/tests/test_vendor_antislop.py +163 -0
  304. solo_sdd-0.2.0/tests/test_vendor_security_audit.py +110 -0
  305. solo_sdd-0.2.0/tests/test_work_hooks.py +2138 -0
@@ -0,0 +1 @@
1
+ docs/waiting.md merge=union
@@ -0,0 +1,162 @@
1
+ name: release
2
+
3
+ # A pushed tag v<version> on a main commit: the tests, the release check, then the same dist/ files to PyPI and npm
4
+ # through trusted publishing, then a GitHub release whose text is the CHANGELOG.md section of the version.
5
+ # The one-time registry setup: docs/release.md.
6
+
7
+ on:
8
+ push:
9
+ tags: ["v*"]
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: release-${{ github.ref }}
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ check:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ # actions/checkout v4.4.0
23
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
24
+ with:
25
+ fetch-depth: 0
26
+ - name: Public repository
27
+ # npm provenance and the README links on the registry pages need a public repository.
28
+ run: |
29
+ if [ "${{ github.event.repository.private }}" = "true" ]; then
30
+ echo "fail repository $GITHUB_REPOSITORY is private: make it public before a release (docs/release.md)"
31
+ exit 1
32
+ fi
33
+ - name: Tag on main
34
+ run: |
35
+ if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
36
+ echo "fail tag $GITHUB_REF_NAME: commit $GITHUB_SHA is not on main"
37
+ exit 1
38
+ fi
39
+ # actions/setup-node v4.4.0
40
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
41
+ with:
42
+ node-version: "22"
43
+ - name: Install build tools
44
+ run: /usr/bin/python3 -m pip install --user --break-system-packages build twine hypothesis
45
+ - name: Run tests
46
+ run: |
47
+ /usr/bin/python3 tests/run.py --tier release < /dev/null
48
+ - name: Validate the process tree
49
+ run: |
50
+ if [ -d solo-sdd ]; then /usr/bin/python3 -m solo_sdd validate --all < /dev/null; else echo "no solo-sdd/: nothing to check"; fi
51
+ - name: Release check
52
+ run: /usr/bin/python3 scripts/release_check.py "$GITHUB_REF_NAME"
53
+ - name: Registry metadata
54
+ run: /usr/bin/python3 -m twine check --strict dist/*.tar.gz dist/*.whl
55
+ - name: Release text
56
+ run: |
57
+ mkdir -p "$RUNNER_TEMP/notes"
58
+ /usr/bin/python3 scripts/release_check.py --notes "$GITHUB_REF_NAME" > "$RUNNER_TEMP/notes/notes.md"
59
+ # actions/upload-artifact v4.6.2
60
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
61
+ with:
62
+ name: dist
63
+ path: dist/
64
+ if-no-files-found: error
65
+ overwrite: true
66
+ # actions/upload-artifact v4.6.2
67
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
68
+ with:
69
+ name: notes
70
+ path: ${{ runner.temp }}/notes/
71
+ if-no-files-found: error
72
+ overwrite: true
73
+
74
+ pypi:
75
+ needs: check
76
+ runs-on: ubuntu-latest
77
+ environment:
78
+ name: pypi
79
+ url: https://pypi.org/project/solo-sdd/
80
+ permissions:
81
+ id-token: write
82
+ steps:
83
+ # actions/download-artifact v4.3.0
84
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
85
+ with:
86
+ name: dist
87
+ path: dist
88
+ - name: Already published
89
+ run: |
90
+ v="${GITHUB_REF_NAME#v}"
91
+ code=$(curl -s -o /dev/null -w '%{http_code}' "https://pypi.org/pypi/solo-sdd/$v/json")
92
+ if [ "$code" = 200 ]; then
93
+ echo "solo-sdd $v is already published on PyPI: only missing files are uploaded"
94
+ else
95
+ echo "solo-sdd $v is not on PyPI yet (HTTP $code)"
96
+ fi
97
+ rm -f dist/*.tgz
98
+ # Runs even when the version is there: skip-existing uploads only the files PyPI lacks (a run that stopped halfway).
99
+ # pypa/gh-action-pypi-publish v1.14.3, the head of release/v1 on 2026-11-10
100
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086
101
+ with:
102
+ packages-dir: dist/
103
+ skip-existing: true
104
+
105
+ npm:
106
+ needs: check
107
+ runs-on: ubuntu-latest
108
+ environment:
109
+ name: npm
110
+ url: https://www.npmjs.com/package/solo-sdd
111
+ permissions:
112
+ id-token: write
113
+ steps:
114
+ # actions/download-artifact v4.3.0
115
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
116
+ with:
117
+ name: dist
118
+ path: dist
119
+ # actions/setup-node v4.4.0
120
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020
121
+ with:
122
+ node-version: "24"
123
+ - name: npm with trusted publishing
124
+ run: npm install -g npm@^11.5.1 && npm --version
125
+ - name: Publish
126
+ env:
127
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
128
+ run: |
129
+ v="${GITHUB_REF_NAME#v}"
130
+ if npm view "solo-sdd@$v" version > /dev/null 2>&1; then
131
+ echo "solo-sdd $v is already published on npm"
132
+ exit 0
133
+ fi
134
+ # NPM_TOKEN only for the first publish, before the trusted publisher exists (docs/release.md).
135
+ if [ -n "$NPM_TOKEN" ]; then npm config set //registry.npmjs.org/:_authToken "$NPM_TOKEN"; fi
136
+ npm publish "./dist/solo-sdd-$v.tgz" --provenance --access public
137
+
138
+ github-release:
139
+ needs: [pypi, npm]
140
+ runs-on: ubuntu-latest
141
+ permissions:
142
+ contents: write
143
+ steps:
144
+ # actions/download-artifact v4.3.0
145
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
146
+ with:
147
+ name: dist
148
+ path: dist
149
+ # actions/download-artifact v4.3.0
150
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
151
+ with:
152
+ name: notes
153
+ path: notes
154
+ - name: Release with the three files and the CHANGELOG section
155
+ env:
156
+ GH_TOKEN: ${{ github.token }}
157
+ run: |
158
+ if gh release view "$GITHUB_REF_NAME" -R "$GITHUB_REPOSITORY" > /dev/null 2>&1; then
159
+ gh release upload "$GITHUB_REF_NAME" dist/* --clobber -R "$GITHUB_REPOSITORY"
160
+ else
161
+ gh release create "$GITHUB_REF_NAME" dist/* --notes-file notes/notes.md --verify-tag -R "$GITHUB_REPOSITORY"
162
+ fi
@@ -0,0 +1,54 @@
1
+ name: test
2
+
3
+ # Ubuntu on a push to main and on a PR; macOS, whose minutes cost more, only on a v* tag; both on a manual run.
4
+ on:
5
+ push:
6
+ branches: [main]
7
+ tags: ["v*"]
8
+ pull_request:
9
+ branches: [main]
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+
15
+ concurrency:
16
+ group: ${{ github.workflow }}-${{ github.ref }}
17
+ cancel-in-progress: true
18
+
19
+ jobs:
20
+ test:
21
+ strategy:
22
+ fail-fast: false
23
+ matrix:
24
+ os: ${{ fromJSON(github.event_name == 'workflow_dispatch' && '["ubuntu-latest", "macos-latest"]' || startsWith(github.ref, 'refs/tags/') && '["macos-latest"]' || '["ubuntu-latest"]') }}
25
+ runs-on: ${{ matrix.os }}
26
+ steps:
27
+ # actions/checkout v4.4.0
28
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262
29
+ - name: Install Hypothesis, build and pyflakes
30
+ run: /usr/bin/python3 -m pip install --user --break-system-packages hypothesis build pyflakes==3.4.0 || /usr/bin/python3 -m pip install --user hypothesis build pyflakes==3.4.0
31
+ - name: Lint
32
+ run: /usr/bin/python3 -m pyflakes solo_sdd global scripts sync.py
33
+ - name: Run tests
34
+ if: ${{ !startsWith(github.ref, 'refs/tags/') && github.event_name != 'workflow_dispatch' }}
35
+ run: |
36
+ /usr/bin/python3 tests/run.py --tier slow < /dev/null
37
+ - name: Run tests, release tier
38
+ if: ${{ startsWith(github.ref, 'refs/tags/') || github.event_name == 'workflow_dispatch' }}
39
+ run: |
40
+ /usr/bin/python3 tests/run.py --tier release < /dev/null
41
+ - name: Validate the process tree
42
+ run: |
43
+ if [ -d solo-sdd ]; then /usr/bin/python3 -m solo_sdd validate --all < /dev/null; else echo "no solo-sdd/: nothing to check"; fi
44
+ - name: Wheel install smoke
45
+ run: |
46
+ /usr/bin/python3 -m pip wheel . --no-deps -w dist
47
+ /usr/bin/python3 -m venv "$RUNNER_TEMP/wheelenv"
48
+ "$RUNNER_TEMP/wheelenv/bin/pip" install dist/solo_sdd-*.whl
49
+ "$RUNNER_TEMP/wheelenv/bin/solo-sdd" --version
50
+ - name: npm tarball smoke
51
+ run: |
52
+ npm pack --pack-destination "$RUNNER_TEMP"
53
+ npm i -g --prefix "$RUNNER_TEMP/npm" "$RUNNER_TEMP"/solo-sdd-*.tgz
54
+ "$RUNNER_TEMP/npm/bin/solo-sdd" --version
@@ -0,0 +1,43 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .DS_Store
4
+ .hypothesis/
5
+
6
+ # local agent settings
7
+ .claude/
8
+ .codex/
9
+
10
+ # secrets
11
+ .env
12
+ .env.*
13
+ !.env.example
14
+
15
+ # environment (no /: in a worktree these are links)
16
+ .venv
17
+ node_modules
18
+
19
+ # release files built by scripts/release_check.py
20
+ dist/
21
+
22
+ # the failed files of the last tests/run.py
23
+ tests/.last-failed
24
+
25
+ # logs
26
+ *.log
27
+
28
+ # the change archive: kept only in the working folder, not published
29
+ solo-sdd/changes/archive/
30
+
31
+ # single owner, not part of solo-sdd development
32
+ docs/debug-profile.md
33
+ docs/process-safety-verification.md
34
+ docs/rules-audit.md
35
+ docs/waiting.md
36
+ global/claude-gui.py
37
+ global/claude-process-safety-settings.json
38
+ global/claude-safe.py
39
+ tests/eval/sets/
40
+ tests/probe_claude_development.py
41
+ tests/probe_claude_process_safety.py
42
+ tests/test_claude_gui.py
43
+ tests/test_claude_safe.py
@@ -0,0 +1,115 @@
1
+ # solo-sdd
2
+
3
+ ## Purpose and mode
4
+
5
+ Own spec-driven development process for one person or a team, with any coding agent, independent of other spec tools: the algorithm, skills, global agent rules, Claude Code hooks and project templates. The repository is the source of truth; `sync.py push` puts the files in place.
6
+ Mode: prod. Prod here is the agent folders on this computer (`~/.claude`, `~/.codex`, `~/.agents`, `~/.local/bin`): after `sync.py push` an edit takes effect in all sessions at once.
7
+
8
+ ## Sources of truth
9
+
10
+ - Behaviour contract: `solo-sdd/specs/`; active work: `solo-sdd/changes/`; the project intent: `solo-sdd/project.md`.
11
+ - Algorithm: `ALGORITHM.md`; the lessons the rules grew from: `LESSONS.md`.
12
+ - `README.md`: what lies where and how it is deployed. `targets.json`: the deployment map.
13
+ - Files copied into agent folders are not a source: an edit in place is pulled with `sync.py pull`.
14
+ - `solo-sdd/specs/` and the open changes of `solo-sdd/changes/` are kept in git. The change archive `solo-sdd/changes/archive/` and `docs/waiting.md` are not in git, they live only in the working folder: the archive is not published.
15
+
16
+ ## Working with specs
17
+
18
+ - One change per session, up to the archive.
19
+ - No clarifying questions: a reasoned decision, recorded in the report.
20
+ - Work outside the current spec becomes a new change.
21
+ - After `tasks.md` is closed, an independent live test before reporting readiness.
22
+
23
+ ## Commands
24
+
25
+ | What | Command |
26
+ |---|---|
27
+ | Install | Python 3 from the system; for tests and lint, `python3 -m pip install --user hypothesis pyflakes==3.4.0` |
28
+ | Tests | `python3 tests/run.py --jobs 5 --tier slow` before delivery; a round: `python3 tests/run.py --jobs 5 --tier fast`, then `python3 tests/run.py --jobs 5 --affected <path>...`; before a release tag: `python3 tests/run.py --jobs 5 --tier release` |
29
+ | Tests (one) | `python3 tests/<file>.py`; one test: `python3 -m unittest <module>.<Class>.<test>` from `tests/` |
30
+ | Lint | `python3 -m pyflakes solo_sdd global scripts sync.py` |
31
+ | CLI | `python3 -m solo_sdd --version` |
32
+ | What is deployed and where it differs | `python3 sync.py status` |
33
+ | Deployment | `python3 sync.py push` |
34
+ | Specs | `python3 -m solo_sdd validate --all` |
35
+
36
+ ## Project map
37
+
38
+ | Path | Role |
39
+ |---|---|
40
+ | `skills/<name>/SKILL.md` | Algorithm skills and manual commands; deployed by `targets.json` |
41
+ | `solo_sdd/` | Package and the `solo-sdd` command; deployment logic in `layout.py`, `sync.py` is a wrapper; the `solo-sdd/` tree rules and `validate` in `process_format.py`; `import openspec` in `import_openspec.py`; `init` in `init.py` |
42
+ | `pyproject.toml` | Package description |
43
+ | `package.json`, `bin/solo-sdd.js` | npm package: a wrapper that runs `python -m solo_sdd` |
44
+ | `global/AGENTS.md` | Global rules of both agents |
45
+ | `global/work_hooks.py`, `global/model-policy.json` | Claude Code workflow hooks and the model policy |
46
+ | `global/work_hooks_settings.py` | One-off connection of the hooks in `~/.claude/settings.json` |
47
+ | `global/process-guard.py` | Hook that forbids stopping processes directly |
48
+ | `global/sdd_dispatch.py` | Status acceptance and `local` mode merge for `spec-dispatch` |
49
+ | `global/sdd_eval.py` | Change replay and comparison of dispatcher configurations |
50
+ | `tests/eval/` | Sets, configurations, prices, fixtures |
51
+ | `templates/` | Templates for new projects |
52
+ | `examples/demo/` | Demo project with its `solo-sdd/` tree and `WALKTHROUGH.md`; kept valid by `tests/test_demo.py` |
53
+ | `integrations/antislop/` | Bundled integration `antislop`: pinned copy of the anti-slop rules for `ui-check` and `copy-check` with its `integration` description; deployed by `targets.json`, updated only by replacing the copy |
54
+ | `integrations/security-audit/` | Bundled integration `security-audit`: pinned copy of `cloudflare/security-audit-skill` for the security pass of `spec-audit` with its `integration` description; deployed by `targets.json`, updated only by replacing the copy |
55
+ | `solo-sdd/` | Specs, changes and the archive of this repository; the archive lives only in the working folder |
56
+ | `scripts/publish-first.sh` | First publication: a new `main` without history and without `solo-sdd/`, one-off |
57
+ | `scripts/pre-push-guard.sh` | `pre-push` hook the publication step of `docs/release.md` installs: refuses a pushed commit that shares history with `history-local` or `history-private`, and a ref not to a commit |
58
+ | `scripts/release_check.py` | Release check: tag against versions, sdist, wheel from the sdist and npm tarball into `dist/`, packed files against `git ls-files`, `--version` smoke, the `CHANGELOG.md` section; `--notes <tag>` prints that section |
59
+ | `CHANGELOG.md` | The changes each version archived; its section of the current version is the GitHub release text |
60
+ | `.github/workflows/release.yml` | Release on a pushed tag `v<version>`: tests, release check, PyPI and npm through trusted publishing, GitHub release |
61
+ | `docs/release.md` | One-time registry setup and the release steps |
62
+ | `.github/workflows/test.yml` | CI: lint, `tests/run.py` and `solo-sdd validate --all`; the `slow` tier on Ubuntu for a push or PR, the `release` tier on macOS for a `v*` tag and on both for a manual run; a newer run of a ref cancels the older one |
63
+ | `tests/` | Tests and probes; `tests/run.py` runs every `tests/test_*.py` in parallel, failed first (`--failed`, named files, `--affected <path>` by `tests/affected.json`); `tests/stands/` holds live scenario stands |
64
+
65
+ ## Working copy
66
+
67
+ - Paths: `docs/waiting.md`, `docs/debug-profile.md`, `docs/rules-audit.md`, `docs/process-safety-verification.md`, `global/claude-gui.py`, `global/claude-process-safety-settings.json`, `global/claude-safe.py`, `tests/eval/sets/`, `tests/probe_claude_development.py`, `tests/probe_claude_process_safety.py`, `tests/test_claude_gui.py`, `tests/test_claude_safe.py`
68
+
69
+ ## Boundaries and invariants
70
+
71
+ - Edits only here, then `sync.py push`. Files in agent folders are not edited by hand.
72
+ - `sync.py push` does not overwrite a copy edited in place (`drift`); before overwriting it saves the previous text to `~/.local/share/solo-sdd/backup/`.
73
+ - Hooks are fail-open: an internal error lets the action through and is written to `~/.claude/hook-state/errors.log`.
74
+ - All repository text is in English, with no Cyrillic letter (`tests/test_repo_language.py`).
75
+
76
+ ## Checks
77
+
78
+ Before "done": the `Tests` row, the lint from the table without output, `python3 -m solo_sdd validate --all`, `python3 sync.py status` without unexpected `drift`, the change's live scenario.
79
+
80
+ ## Delivery
81
+
82
+ - Mode: pr
83
+ - Merge: squash
84
+ - PR title: the change name
85
+ - Deploy: no; deployment to agent folders is done separately (`sync.py push`).
86
+ - No CI: while GitHub Actions starts no jobs (the spending limit, since 2026-11-08), `sdd-pr.py wait <url>` prints `PR #<n> <url> CI: infra` with no log line and exits with code 4 (probed on PR #79 on 2026-11-12). Then the full local run before delivery, `python3 tests/run.py --tier slow`, is the only suite check, and the PR waits for the owner: an agent never merges around a red or missing check (`docs/release.md`).
87
+
88
+ ## Security
89
+
90
+ - Paid model calls in tests: only the cheapest (`global/model-policy.json`).
91
+ - `sync.py push` changes the agents' working folders on this computer: this is a prod action, check `sync.py status` after it.
92
+ - There are no secrets in the repository and there must be none.
93
+
94
+ ## Lessons
95
+
96
+ - A stand runs what it means to test: a container stand gets the repository files and its downloads through stdin from the host (a container here has no network of its own and a bind mount sees only folders under the home folder), and a stand that runs a Python package with `-m` against a copy of the repository runs from outside the copy, since the working folder comes first on the import path; a stand that compares with the tree before its change pins that commit by hash, since the fork point from main and a lookup by the change's own commits move once the branch merges; a test that runs a copy of a project file copies every project module that file imports, so a new import does not break the copy.
97
+ - Detection of an installed agent or any other environment fact looks only inside the passed home and PATH, never at a machine-wide folder, and a test of such code pins what is detected, so it gives the same result on every machine; a setting proposed from detected facts requires every fact the command that uses it depends on, not only the one that makes it possible; a test fixture names every git default it relies on (the initial branch of each `init`, bare ones included), since the system git config differs between machines, and turns off git's detached auto maintenance in a repository it copies, which otherwise writes in it during the copy.
98
+ - A claim about how a tool behaves or what it outputs, taken from its changelog, its binary or another agent's report, is written into a skill, document, change or a command's own output only after running that tool here on a probe (with no run possible it is worded as expected and unconfirmed, never as a state), and a record of which files a change edited, or of which tests a source path affects, only after checking it against its source before the commit: the diff for the first, and for the second every way a test reaches the path (an import, a script another script starts, a copy it compares, a build run in the tree); text with escapes of non-ASCII characters is read back in the written file before the commit, since the writing tool may decode the escapes; a timing or cost measured on another machine or load is measured again here, base and branch under the same load, before a pass bar or a plan rests on it; a path given to a command that also takes a name or a shorthand in that place (`npm publish`, `npm install`) starts with `./`, and a publishing step runs once as the registry's dry run before the first tag.
99
+ - An unnamed "our product" in a request means solo-sdd itself: the owner's other products are neither the subject of the work nor a source of its facts unless the owner names them.
100
+ - Markup that hides text (HTML comments) is removed once, in the reader, after code blocks and code spans are recognised, and no later consumer applies it again; a command that reads a format another program reads (a document `validate` checks, a shell command line) reads it with that program's own rules or a copy of its reader, never a regex of allowed prefixes, and accepts exactly what it accepts or refuses it, and a command that copies a tree and then advises deleting the source refuses on any entry it cannot list, follow or decode, and a gate or report over a document counts every line outside the part it exempts and keeps the readable entries of a file it cannot fully parse: a line or entry skipped silently is lost; a command that refuses a broken input checks it before its first side effect, also in the steps that run before its main one, and one that writes several files checks every target it can (readable, writable) before the first write, whichever order it writes in; in a fail-open handler an exception ends every later step, so a step that must always run comes before the steps that can raise, and each check loads a shared input (a policy file) through its own guarded read, so a broken input drops only the checks that need it.
101
+ - A session capability the agents depend on (loopback sockets, network, subagent depth) is probed once before they are launched; its absence stops the launch with the fix named only when the project declares that it needs the capability, otherwise the launch goes on with the fix as a warning.
102
+ - A check of a command's printed output finds a line by its prefix, not by its position, a check of a document reads a step or item whole up to the next one, not one physical line, and both collapse whitespace in both sides before comparing with a stated text: a new output line or a reflowed paragraph must not break old checks, and tools align output with runs of spaces.
103
+ - A stand that grades a judgement call expects one answer only for an input where every correct reading gives it; otherwise it grades what all correct answers share.
104
+ - A deployment gate is worded for the whole repository, not for one change: a push after any later merge deploys the whole tree, and a deployment the process starts for itself never takes a source that holds merged work not yet cleared for deployment; a publication step that hands a name others resolve to a new target (a repository renamed and its old name taken by a new one) first guards and repoints every clone that uses the name, and checks a push it forbids with a dry run, never with the push itself.
105
+ - A cleanup of copies an earlier version or a gone source deployed skips every path the current deployment map still lays out, names its candidates instead of matching all unmapped state entries, and takes a source as gone only when it is missing, never when it cannot be read for lack of permission (a folder that can be listed but not entered included); a removal in a folder the owner also writes to deletes only the entries its own sources name (the map, the state, its caches), keeps and names every other entry, and silences only the one error it expects (a folder not empty).
106
+ - A value that falls back to a built-in default is reported with its source, so a reader can tell "nothing set" from a choice, and a reader that switches on a listing tells a refusal (a FAIL line, a non-zero exit) from an empty answer, so a broken input never reads as the thing being off; every reader of a setting, the command a person runs included, takes its chain of sources from one shared definition, never from a fallback only one reader knows; and a choice inferred from older records is stored explicitly once made, so records a later step keeps never infer it back; a rule that says which of several values (two command rows, two settings) its readers take is written at every reader that a change finds by searching for the value's name, not only where the values are defined; a gate that asks for a command's run selects what it asks about with that command's own selection (the same function, both sides normalized the same way), so every request it makes is one a run can clear.
107
+ - A bulk wording replacement in instructions keeps quoted program output verbatim and is reread line by line for a shift of meaning.
108
+ - A script that moves or rewrites a branch decides from the commits themselves, never from a setting that other readers resolve from more sources than it does.
109
+ - An input check covers the edge forms of its input: a whole-number or name check accepts only ASCII digits and the whole string (`str.isdigit` passes digits that `int()` rejects, a regex `\d` with `$` passes other scripts' digits and a trailing newline), a check whether input comes from a terminal treats a closed stdin (no stream at all) as no terminal, and a comparison that decides whether to rewrite a stored value normalizes both sides the same way, line endings included; a write made atomic through a new file and a rename keeps every refusal of the write it replaces, checking the target's own write permission, since a rename needs only the folder's; text a reader takes from foreign input (a folder name, a line of a file) reaches its output only escaped, and a reader of a foreign tree refuses a link leading out of it before it prints anything read through the link; a stored result read back is checked against what the step that wrote it can produce, and printed exactly as stored, never cleaned a second way; a foreign command's process group is killed only while a process the caller has not yet reaped holds the group id; every reader of a file in a folder foreign input can reach opens it without blocking and parses only a regular file, and a result stored beside others in one record carries its own time, since the record's write dates every result it keeps; a check that tells a missing path from an unreadable one stats the path and catches only the not-found errors, never a library predicate (`Path.is_file`, `exists`) whose error handling changes between Python versions.
110
+ - Before a stand or test of a removed requirement is deleted, every check it holds for a requirement that stays moves into a kept test.
111
+ - A new outcome or exemption of a step is written where the rule it changes is read: before that step in the order, and as its exit in every state list the process keeps where that list's exit rule is written; otherwise the run takes the old path or waits for an event that never comes; a new ban is checked against every rule that requires what it bans, and names that rule's case as its exception.
112
+ - A scenario of a change that adds a behaviour names what only the new code produces, and an example project's own checks are ones its shipped open change already meets: otherwise a test written first passes on the old code, or the agent rewrites the example before code.
113
+ - A gate that a person's marks open counts the expected items from its own source and takes the person's confirmation from a record the agent's account cannot produce (a review the platform refuses the author), never from the marks alone or from parsing the agent's commands; evidence the agent writes itself (a LIVE command, a review field) is matched whole against a source written before the work, and the bypass flag of such a gate is the owner's alone.
114
+ - A guard that exempts part of a shell command (a message, a pattern, a path) reads it by the shell's grammar and each program's option grammar (clustered and abbreviated options, `$'…'`, a `#` comment, a `cd`, a wrapper that runs a word) and refuses every form it cannot read the same way: an exemption is kept as narrow as the forms it is proven on, and the fallback that drops it names the forms the reader can read (an allowlist), not every occurrence of a feared token; a check whether a pattern (a glob) reaches a protected name tests it against that name's own rule and the files that exist, never against a sample list of names; a reader of a nested part (a substitution, a `-c` string) takes it from the original text, never from a copy another reader rewrote (requoted, cut), and applies the same exemptions as at the top level; a guard that recognises a run behind wrappers and runners tries every later word instead of stopping at the first word it does not know, since that word may wrap the run: a false refusal is recorded as a known limit, a missed run is not; a form one rule learns to read stays unreadable for every other rule that refuses it for its own reason (a `${` computes a file name for the secret guard), so a scenario that expects a guard to pass is checked against every requirement of that guard on the same form; a fix that narrows or widens such a match is replayed against the forms the previous version decided, so no refused form starts passing and no command of another program starts being refused.
115
+ - A path that becomes git-ignored is checked through every step that merges, resets, aborts or mirrors the tree for a deletion of its copy on disk: git treats an ignored file as expendable and overwrites or removes it, a transfer of ignored files carries their removal, and an undo that runs after a reset deletes files git tracks again; a temporary copy of a git index keeps the index's own time, since git rereads only a file no older than the index it loads and a fresh copy hides an edit made in that second.
@@ -0,0 +1,211 @@
1
+ # Solo SDD: the algorithm
2
+
3
+ Spec-driven development for one person or a team, with any coding agent (Claude Code and Codex today). The user sets the goal and accepts the result. The agents run the work themselves: from the plan to code merged into main, without questions along the way. The base is solo-sdd's own process tree `solo-sdd/` and its commands (`solo-sdd new`, `validate`, `list`, `archive`); the skills from `skills/` work on top of them. A project still on `openspec/` moves with `solo-sdd import openspec`.
4
+
5
+ How the repository is organised and how to deploy it is in [README.md](README.md). The third-party files the repository ships are listed in [SOURCES.md](SOURCES.md). Why the rules are worded the way they are is in [LESSONS.md](LESSONS.md).
6
+
7
+ ## Principles
8
+
9
+ 1. **The specification is the source of truth.** Behaviour changes together with the spec, in one change. Code that diverges from the spec counts as a defect, even if the tests are green.
10
+ 2. **A small change.** One result the user can check themselves, one area of code, at most 10 tasks. If it comes out bigger, it is several changes linked through `Depends On`.
11
+ 3. **A property, not a method.** The spec says what must be true ("git history does not change"), not how to check it ("look for the substring push"). The implementer chooses the method.
12
+ 4. **Proof, not a report.** Readiness is confirmed by observations: a test that fails on the previous code, and a live scenario in what a person sees. Green tests, a report by the author or a subagent, "the function was called" do not count as proof.
13
+ 5. **No questions along the way.** The agent resolves an ambiguity itself and records the decision. Asking is allowed only before three things: a paid call, deleting or overwriting data, an action on prod. The question names what will happen, how many calls and what amount.
14
+ 6. **A blocker does not stop the work.** First look for a workaround: mocks, old data, `.env`, a neighbouring service. No workaround: what is unchecked goes into `verification.md` and `docs/waiting.md`, the rest gets closed.
15
+ 7. **Code is written by whoever holds the plan.** Every handoff between agents loses precision, so the lead agent writes the code itself. Subagents are for independent acceptance and heavy reading. Review is done by an agent that did not write this code.
16
+ 8. **Nothing is invented.** Values the source knows (CLI, API, database) are asked from the source. An honest "could not determine" is better than a plausible value.
17
+ 9. **Cheap where a mistake is easy to notice.** Search, reading logs and test output run on cheap models; code, review and acceptance on the main one. First the effort changes (medium by default, low for mechanics, higher if stuck), the model only when effort did not help. Paid calls to the product model in tests and runs go to the cheapest models and with consent. Heavy reading goes to a search subagent (Explore), so the lead's context does not get compacted.
18
+ 10. **"Done" = archived, checked live, merged.** If any of the three is missing, the status is "not done" with what is missing.
19
+
20
+ ## Cycle
21
+
22
+ ```
23
+ 0 project-init ─► 1 context-resume ─► 2 evidence-research (when needed)
24
+ │
25
+ 9 spec-audit ◄─ 8 ship ◄─ 7 closing ◄─ 6 proof ◄─ 5 spec-next ◄─ 4 spec-analyze ◄─ 3 spec-plan
26
+ (every 5 archives) ▲
27
+ debug-profile, ui-check, agent-quality
28
+ ```
29
+
30
+ Cross-cutting skills at any stage: `work-status` (five lines about the state), `context-resume` (after a pause, a context compaction or an agent switch).
31
+
32
+ ### 0. The project is ready for agents: `project-init`
33
+
34
+ Once per project. It creates `AGENTS.md` (project rules: commands, map, boundaries and invariants, checks), `CLAUDE.md` with the line `@AGENTS.md`, the process tree `solo-sdd/` by `solo-sdd init` with `solo-sdd/project.md` (language, mode and an "Intent"), `.env.example`, README.
35
+
36
+ In a repository that already has code it also writes the codebase map `docs/codebase/` (`STACK.md`, `ARCHITECTURE.md`, `CONVENTIONS.md`, `CONCERNS.md`): four cheap subagents, every statement names a path, each file stamped with the commit; the `CONCERNS.md` items are candidates for `spec-plan`. `/project-init map` refreshes it.
37
+
38
+ **Gate G0:** `solo-sdd validate --all` passes; every command from the `AGENTS.md` table actually runs; the project comes up by the README in a clean shell.
39
+
40
+ ### 1. Context: `context-resume`
41
+
42
+ When returning to a project, after a context compaction or on an agent switch. It reads the project rules, `handoff.md`, `verification.md` of open changes, `git status` and the history by the words of the task. The output is a map: the goal, the source of truth, the last confirmed state, the user's decisions, blockers, the next step. A fact from history is checked against files and the service. If they diverge, the current state counts as right.
43
+
44
+ ### 2. Research and decision: `evidence-research`
45
+
46
+ Only when the plan cannot be written without it: choosing a technology, a service or an approach. `evidence-research` gives a table of options by the user's constraints, every fact with a source and a date. A disputed decision goes the same way: the options side by side on checked facts, the choice and its reason. The result goes into `spec-plan` as input.
47
+
48
+ ### Light path: no change
49
+
50
+ A code edit takes the light path when it changes no behaviour a main spec describes, adds no dependency, touches no data, migration or deploy, and changes at most `process.light-path.max-files` files (default 3); `process.light-path: off` forbids it. The edit, the project's tests, a live check of the edited place and one commit `light: <the request>` are the whole record; `spec-plan` coverage names such an item with its commit, `work-status` and `report` count these commits apart from changes. Anything outside the bounds, and a bug in behaviour a spec describes, goes through a change.
51
+
52
+ ### 3. Plan: `spec-plan`
53
+
54
+ Input: a plan, a bug list, the result of a discussion. Output: a queue of small changes. No code is written, except the light path items, after the plan commit.
55
+
56
+ - A unit fits if it has one checkable result, one area of code, at most 10 tasks and a live check scenario. Bugs are grouped by a common cause, not "one bug, one change".
57
+ - A unit that leads away from the "Intent" of `solo-sdd/project.md` does not become a change and goes into the report.
58
+ - `solo-sdd new <id>` lays out the change; the artifacts are written in the order proposal → specs → verification → tasks by the "Writing rules" of `spec-plan` (see "Change artifacts").
59
+ - Whatever waits for a person, access or paid consent does not become a task. It is `Needs` in `verification.md`. A change made up entirely of such conditions gets a `WAITING` file.
60
+ - Every input item is matched with a change or the light path. Any other item without a change counts as an error.
61
+ - A bug with a found cause takes the short track (the "Bug fix" section in `spec-plan`): the reproduction and the place of the cause in the proposal, the bug scenario is added to the spec, the first task is a failing test for this scenario, at most 5 tasks, side edits in Out of Scope. Cause not found: `debug-profile` first.
62
+ - A UI change starts What Changes with a Design Read line from `DESIGN.md` (no `Dial` line with three numbers means dials 1/1/1 and "draft without direction"); the Live Scenario is a list "element → action → result"; the user's business facts (numbers, reviews, customers) are placeholders `[data needed: …]`.
63
+
64
+ **Gate G1:** `solo-sdd validate --all`; then `spec-analyze` on every created change (stage 4); full coverage of the input.
65
+
66
+ After G1 the folders of created and changed changes go in one commit `change: <id>, …`, without other edits. If `solo-sdd/changes` is ignored, there is no commit, and the report says "plan outside git".
67
+
68
+ ### 4. Check before code: `spec-analyze`
69
+
70
+ Before the first task of every change. The spec is checked against itself while there is no code: a hole in `tasks.md` costs one line, after implementation a rework.
71
+
72
+ Passes:
73
+
74
+ | # | Pass | What it looks for |
75
+ |---|---|---|
76
+ | 1 | Coverage | A requirement or scenario without a task and a test; a task without a requirement |
77
+ | 2 | Solo frame | An empty Out of Scope; an unarchived Depends On; a retelling instead of a quote in Source; more than 10 tasks; waiting for a person in tasks; a Live Scenario that does not reach what the user sees |
78
+ | 3 | Checkability | A task without an observable criterion |
79
+ | 3a | Executable properties | An invariant, round trip or idempotence checked only by examples |
80
+ | 4 | Consumer | A new field, module or value that nobody reads |
81
+ | 5 | Ambiguities | Empty, erroneous and partial cases; "no data" versus "not read"; a repeat; what the user sees in each outcome; term drift; `TBD` |
82
+ | 6 | Wording | A method instead of a property; line numbers instead of structure; hard-coded values; words without a measure |
83
+ | 7 | Consistency | A contradiction with the main spec; a decision in design without a task; a task uses what appears later; drifting from the intent |
84
+ | 7a | Requirement compatibility | Requirements that are true one by one and unsatisfiable together; incompatible constraints; an undescribed combination of conditions; a hidden assumption |
85
+
86
+ Checks derived from the defects of a specific project live in its `solo-sdd/analyze.md` (laid out by `solo-sdd init`). The skill picks them up itself.
87
+
88
+ The agent fixes CRITICAL and HIGH findings in the artifacts and writes the decisions into `Decisions Without Owner`. Code does not change in this pass.
89
+
90
+ **Gate G2:** no open CRITICAL and HIGH; everything from `Depends On` is archived. Otherwise the change is not ready, and `spec-next` takes another.
91
+
92
+ ### 5. Implementation: `spec-next`
93
+
94
+ One run closes one change, from selection to archive.
95
+
96
+ 1. Step 0: a project with `openspec/` and no `solo-sdd/` stops here with the next step `solo-sdd import openspec`; the skills never import by themselves.
97
+ 2. Selection: the named change; else the one with the most done; else the next one with closed dependencies. A change with a `CLAIM` file (taken by another agent) or `WAITING` is skipped.
98
+ 3. Claim: `solo-sdd/changes/<id>/CLAIM` in the main project folder with the line `<agent> <date>`; Claude adds `session=<session id>` (`$CLAUDE_CODE_SESSION_ID`), by which the write hook recognises its own `CLAIM`. The hook itself places the marker only on a `tasks.md` edit that checks a new task: analysis and audit that edit artifacts do not take the change.
99
+ 4. Check: `spec-analyze` (stage 4).
100
+ 5. The lead agent does the tasks from `tasks.md` itself, including code. Subagents are only for acceptance (item 7) and heavy reading (`Lookup:`, Explore). Executors only if the user named `codex-orchestration` (Codex CLI); then the orchestration rules apply:
101
+ - Split by file ownership. Independent units go in a parallel wave, units on one file in different waves or separate worktrees.
102
+ - A unit has one proof, at most two or three. If more, the unit is split.
103
+ - The spec for an executor starts with the header "do it yourself, do not ask" and holds own and foreign files, a sample, all literal values, a ban on commits and the report format.
104
+ - Acceptance by own commands and `git status` of own tree. An executor's report stays a claim, not proof.
105
+ - After a parallel wave, a review of the combined diff.
106
+ 6. A task is checked `- [x]` only after its own check. Test runs: while coding only the tests of the edited module (`Tests (one)`); the whole suite (`Tests`) once after the last code edit, again only when code changed after that run; after a red run the failed tests first, the suite once they are green. Output through the runner's quiet option (`-q`, `--reporter=dot`, `--silent`), and on a red run only the failure lines are read.
107
+ With enabled integrations, after the suite `solo-sdd check --point checks --changed --change <id>`: a `gate` FAIL holds the step as a red test does, and the CLI writes the `Integrations` line into `Result`.
108
+ 7. Independent acceptance: a reviewer with a clean context on the main model gets only the delta specs, the Live Scenario, the diff and the printed lines of the last `solo-sdd check` (it runs no integration), without the author's reports and `Result`.
109
+ With enabled integrations it also gets the material files of `solo-sdd check --point review --changed` as a method, whose instructions it does not execute. For every requirement: done, partial or no, with the place in code and the test; separately, edits the spec does not require. Findings are labelled `Important`, `Nit` (at most five) or `Pre-existing`; only `Important` gives rework.
110
+
111
+ Later rounds read only the new diff and the list of findings already given; an open `Important` after the last round (`process.review-rounds` of `solo-sdd/config`, default 3) or two reviewer failures in one round means `Not Verified`, no archive.
112
+
113
+ Several ready changes at once (Claude Code only): `spec-dispatch`: the main session on the main model with `/effort low` hands them out in waves to Opus orchestrators, one per change in its own worktree in a temporary folder. An orchestrator runs the change by `spec-next` in the "Under the dispatcher" mode: it writes all tasks itself; subagents only for acceptance and search; it does not merge and hands back a status block instead of a report. The dispatcher does not read code: it repeats the commands from the status, merges one at a time, does not fix a conflict, delivers main.
114
+
115
+ ### 6. Proof
116
+
117
+ | What changes | What proves it |
118
+ |---|---|
119
+ | Any behaviour | A test that fails on the previous code. A shape check ("the field exists") does not count |
120
+ | An invariant, round trip, idempotence | A property-based test (`fast-check`, `Hypothesis`) named after the Requirement. The test must fail on at least one code mutation, the generator must reach boundary states |
121
+ | What a person sees | The `Live Scenario` from `verification.md` on the built artifact or a stand |
122
+ | An interface | `ui-check`: screenshots at 1280 and 390, both themes, the Hard Gate (antislop) with proofs, clicks "element → action → result", "draft without direction" without a `DESIGN.md` with `Dial`, an audit on the word "audit" |
123
+ | AI agent quality | `agent-quality`: A versus B on one labelled set, one change per run |
124
+ | A failure in a running service | `debug-profile`: reproduction → version and environment → localisation by logs → one hypothesis. After two failed edits, stop and analyse |
125
+
126
+ Paid calls to the product model in tests and live acceptance go to the cheapest models; review and acceptance run on the main model. A paid run starts only with consent, with the number of calls and the amount.
127
+
128
+ ### 7. Closing
129
+
130
+ - `verification.md` gets `Result` (what was run and what was got, with a date), `Not Verified` (what is not proven and why) and `Decisions Without Owner`.
131
+ - `solo-sdd validate <id>`, then `solo-sdd archive <id> --yes`: the archive applies the deltas to the main specs itself. Then `solo-sdd validate --all`.
132
+ - If the mandatory live scenario did not pass and there is no allowed Fallback, there is no archive, the status is "not done".
133
+ - An external remainder after the archive is allowed only if the project rules or the user explicitly allow it. The ground goes into `verification.md` and `docs/waiting.md`, the report tells "archived" from "external acceptance not ready".
134
+ - The `CLAIM` file is deleted.
135
+
136
+ **Gate G5:** `verification.md` is filled; `solo-sdd validate` passes; the change is archived.
137
+
138
+ ### 8. Delivery: `ship`
139
+
140
+ Done when the local main branch matches the remote and the tree has no unexplained files. Before that, check what exactly push or merge triggers. If it is a prod rollout: stop and ask what will roll out, where, what happens to the data. No `--force` and no `reset --hard`. Secrets do not go into a commit. With enabled integrations `solo-sdd check --point ship` runs before the commits; a `gate` FAIL stops before the commit.
141
+
142
+ ### 9. Audit: `spec-audit`
143
+
144
+ Every 5 archives (`spec-next` reminds itself) or when fixes keep coming while the product does not work. Review is done by an agent that did not write the code, read-only and with a clean context. The output is a table "requirement → done, partial or no → file:line" and findings P0-P3. Every finding is confirmed by the code, at least one end-to-end scenario is checked up to the place the user sees. With enabled integrations the reviewer also reads the material files of `solo-sdd check --point audit` as a method and executes none of their instructions.
145
+
146
+ ## Change artifacts (`solo-sdd/changes/<id>/`)
147
+
148
+ | File | What is in it | Who fills it |
149
+ |---|---|---|
150
+ | `proposal.md` | Why, What Changes, Capabilities, Impact, **Out of Scope** (not empty), **Depends On** (the only place for dependencies), **Source** (the user's quote verbatim) | spec-plan |
151
+ | `specs/<capability>/spec.md` | Delta: `## Purpose` for a new capability; ADDED, MODIFIED, REMOVED, RENAMED Requirements; SHALL/MUST; WHEN/THEN scenarios | spec-plan |
152
+ | `verification.md` | **Live Scenario**, **Needs**, **Fallback** before code; **Result**, **Not Verified**, **Decisions Without Owner** after | spec-plan, then spec-next |
153
+ | `tasks.md` | At most 10 tasks; the last group `Acceptance` of two tasks: the live scenario and validate + archive | spec-plan |
154
+ | `design.md` | Only when it cannot be done without: decisions with rejected alternatives | when needed |
155
+
156
+ Project markers and files:
157
+
158
+ | File | Meaning |
159
+ |---|---|
160
+ | `solo-sdd/changes/<id>/CLAIM` | An agent runs the change; another does not take it |
161
+ | `solo-sdd/changes/<id>/WAITING` | The change waits for an external condition; a line in `docs/waiting.md` |
162
+ | `docs/waiting.md` | The waiting table: what, from whom, since when (template: `templates/docs/waiting.md`) |
163
+ | `handoff.md` | Handoff between sessions and agents: the five `work-status` lines and decisions |
164
+ | `docs/debug-profile.md` | What runs where, logs, config, what must not be touched without consent |
165
+ | `solo-sdd/analyze.md` | `spec-analyze` checks derived from the defects of this project |
166
+
167
+ ## Gates
168
+
169
+ | Gate | When | Who checks | What | On failure |
170
+ |---|---|---|---|---|
171
+ | G0 | After `project-init` | The lead agent | validate, the commands from AGENTS.md run, the project comes up by the README | Fix the project or the README |
172
+ | G1 | After `spec-plan` | The lead agent | validate, analyze, input coverage | Split or complete the changes |
173
+ | G2 | Before code | `spec-analyze` | No CRITICAL and HIGH, dependencies archived | Fix the artifacts; the change is not taken |
174
+ | G3 | After every task | The lead agent, by own commands | The diff, the task's checks, `git status` of own tree | Rework until the checks are green |
175
+ | G4 | Before closing | The lead agent and an independent reviewer | The test failed on the previous code; the property test catches a mutation; the Live Scenario passed; the reviewer has no open `Important` | "Not done", Not Verified |
176
+ | G5 | Closing | The lead agent | verification.md, `solo-sdd validate`, archive | Do not archive |
177
+ | G6 | Delivery | `ship` | main = origin/main; deploy only with consent | Stop before the deploy |
178
+ | G7 | Every 5 archives | An agent that did not write the code | Requirement ↔ code, an end-to-end scenario | P0 and P1 are fixed if the task allows the fix; otherwise a report to the user, who can pass it to `spec-plan` |
179
+
180
+ ## Roles
181
+
182
+ | Role | Does | Does not |
183
+ |---|---|---|
184
+ | User | Gives the goal, Source and Intent; accepts the result; agrees to money, deletion and prod | Does not carry context between agents, does not answer technical questions along the way |
185
+ | Lead agent | Plans, writes code, keeps the artifacts, closes the change | Does not accept own work; does not trust reports |
186
+ | Executor (Codex, by the user's choice) | Does one unit in its own files and reports in the given form | Does not touch foreign files, does not commit, does not invent values |
187
+ | Reviewer | Reads code and spec with a clean context, read-only | Does not edit what it found |
188
+ | Search (Explore) | Reads many files and returns a digest | Does not edit and does not make decisions |
189
+
190
+ Claude Code and Codex are equal: both work by the same rules (`~/AGENTS.md` = `~/.codex/AGENTS.md` = `~/.claude/CLAUDE.md`) and the same skills. They differ only in the tool for subagents and orchestration.
191
+
192
+ ## When to run what
193
+
194
+ | Situation | Skill |
195
+ |---|---|
196
+ | A new folder or a repository without rules | `project-init` |
197
+ | "Let's continue", after a pause or an agent switch | `context-resume` |
198
+ | "What to choose", comparing technologies or services | `evidence-research` |
199
+ | A disputed decision between options | `evidence-research` |
200
+ | A plan, a bug list, the result of a discussion → into work | `spec-plan` |
201
+ | A bug with a found cause | `spec-plan`, the "Bug fix" section; cause not found: `debug-profile` first |
202
+ | Before the code of a change | `spec-analyze` |
203
+ | "Implement the next spec", "finish the change" | `spec-next` |
204
+ | Several ready changes, "hand them to orchestrators", the main session only accepts statuses (Claude Code) | `spec-dispatch` |
205
+ | The interface changed | `ui-check` |
206
+ | Text for people in the product | `copy-check` |
207
+ | A prompt, model or retrieval of an AI agent changes | `agent-quality` |
208
+ | A service does not work, the cause is not obvious | `debug-profile` |
209
+ | Commit, push, PR, merge | `ship` |
210
+ | "Status?" | `work-status` |
211
+ | Review, audit, "why does nothing work" | `spec-audit` |