specsmith 0.3.6.dev179__tar.gz → 0.3.6.dev181__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 (167) hide show
  1. {specsmith-0.3.6.dev179/src/specsmith.egg-info → specsmith-0.3.6.dev181}/PKG-INFO +21 -11
  2. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/README.md +20 -10
  3. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/pyproject.toml +1 -1
  4. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/auditor.py +44 -4
  5. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/cli.py +30 -7
  6. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/differ.py +15 -1
  7. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/exporter.py +2 -1
  8. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/importer.py +30 -7
  9. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/phase.py +6 -6
  10. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/scaffolder.py +13 -2
  11. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/agents.md.j2 +237 -230
  12. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/context-budget.md.j2 +2 -1
  13. specsmith-0.3.6.dev181/src/specsmith/templates/governance/lifecycle.md.j2 +44 -0
  14. specsmith-0.3.6.dev179/src/specsmith/templates/governance/workflow.md.j2 → specsmith-0.3.6.dev181/src/specsmith/templates/governance/session-protocol.md.j2 +1 -1
  15. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/readme.md.j2 +1 -1
  16. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/upgrader.py +27 -5
  17. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181/src/specsmith.egg-info}/PKG-INFO +21 -11
  18. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/SOURCES.txt +2 -2
  19. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_auditor.py +2 -1
  20. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_scaffolder.py +2 -1
  21. specsmith-0.3.6.dev179/src/specsmith/templates/docs/workflow.md.j2 +0 -15
  22. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/LICENSE +0 -0
  23. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/setup.cfg +0 -0
  24. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/__init__.py +0 -0
  25. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/belief.py +0 -0
  26. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/certainty.py +0 -0
  27. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/failure_graph.py +0 -0
  28. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/py.typed +0 -0
  29. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/recovery.py +0 -0
  30. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/session.py +0 -0
  31. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/stress_tester.py +0 -0
  32. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/epistemic/trace.py +0 -0
  33. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/__init__.py +0 -0
  34. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/__main__.py +0 -0
  35. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/__init__.py +0 -0
  36. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/core.py +0 -0
  37. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/hooks.py +0 -0
  38. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/optimizer.py +0 -0
  39. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
  40. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/planner.md +0 -0
  41. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/profiles/verifier.md +0 -0
  42. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/__init__.py +0 -0
  43. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/anthropic.py +0 -0
  44. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/gemini.py +0 -0
  45. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/mistral.py +0 -0
  46. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/ollama.py +0 -0
  47. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/providers/openai.py +0 -0
  48. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/runner.py +0 -0
  49. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/skills.py +0 -0
  50. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/agent/tools.py +0 -0
  51. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/architect.py +0 -0
  52. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/auth.py +0 -0
  53. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/commands/__init__.py +0 -0
  54. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/compressor.py +0 -0
  55. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/config.py +0 -0
  56. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/credit_analyzer.py +0 -0
  57. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/credits.py +0 -0
  58. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/doctor.py +0 -0
  59. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/__init__.py +0 -0
  60. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/belief.py +0 -0
  61. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/certainty.py +0 -0
  62. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/failure_graph.py +0 -0
  63. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/recovery.py +0 -0
  64. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/epistemic/stress_tester.py +0 -0
  65. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/executor.py +0 -0
  66. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/__init__.py +0 -0
  67. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/app.py +0 -0
  68. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/main_window.py +0 -0
  69. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/session_tab.py +0 -0
  70. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/theme.py +0 -0
  71. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/__init__.py +0 -0
  72. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/chat_view.py +0 -0
  73. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/input_bar.py +0 -0
  74. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  75. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/token_meter.py +0 -0
  76. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  77. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/widgets/update_checker.py +0 -0
  78. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/gui/worker.py +0 -0
  79. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/__init__.py +0 -0
  80. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/aider.py +0 -0
  81. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/base.py +0 -0
  82. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/claude_code.py +0 -0
  83. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/copilot.py +0 -0
  84. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/cursor.py +0 -0
  85. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/gemini.py +0 -0
  86. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/warp.py +0 -0
  87. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/integrations/windsurf.py +0 -0
  88. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/languages.py +0 -0
  89. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/ledger.py +0 -0
  90. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/ollama_cmds.py +0 -0
  91. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/patent.py +0 -0
  92. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/plugins.py +0 -0
  93. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/profiles.py +0 -0
  94. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/rate_limits.py +0 -0
  95. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/releaser.py +0 -0
  96. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/requirements.py +0 -0
  97. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/retrieval.py +0 -0
  98. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/session.py +0 -0
  99. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  100. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  101. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  102. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  103. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  104. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  105. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  106. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/community/security.md.j2 +0 -0
  107. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  108. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  109. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  110. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  111. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  112. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/editorconfig.j2 +0 -0
  113. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/gitattributes.j2 +0 -0
  114. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/gitignore.j2 +0 -0
  115. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/go/go.mod.j2 +0 -0
  116. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/go/main.go.j2 +0 -0
  117. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  118. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  119. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  120. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  121. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  122. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  123. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  124. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  125. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/js/package.json.j2 +0 -0
  126. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/ledger.md.j2 +0 -0
  127. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/cli.py.j2 +0 -0
  128. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/init.py.j2 +0 -0
  129. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  130. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  131. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  132. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  133. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  134. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  135. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  136. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  137. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  138. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  139. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/tool_installer.py +0 -0
  140. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/toolrules.py +0 -0
  141. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/tools.py +0 -0
  142. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/trace.py +0 -0
  143. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/updater.py +0 -0
  144. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/validator.py +0 -0
  145. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/__init__.py +0 -0
  146. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/base.py +0 -0
  147. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/bitbucket.py +0 -0
  148. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/github.py +0 -0
  149. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs/gitlab.py +0 -0
  150. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/vcs_commands.py +0 -0
  151. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/wireframes.py +0 -0
  152. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith/workspace.py +0 -0
  153. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/dependency_links.txt +0 -0
  154. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/entry_points.txt +0 -0
  155. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/requires.txt +0 -0
  156. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/src/specsmith.egg-info/top_level.txt +0 -0
  157. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_cli.py +0 -0
  158. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_compressor.py +0 -0
  159. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_epistemic.py +0 -0
  160. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_importer.py +0 -0
  161. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_integrations.py +0 -0
  162. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_optimizer.py +0 -0
  163. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_rate_limits.py +0 -0
  164. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_smoke.py +0 -0
  165. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_tools.py +0 -0
  166. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_validator.py +0 -0
  167. {specsmith-0.3.6.dev179 → specsmith-0.3.6.dev181}/tests/test_vcs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.3.6.dev179
3
+ Version: 0.3.6.dev181
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
6
6
  License-Expression: MIT
@@ -130,7 +130,15 @@ and a readiness percentage.
130
130
 
131
131
  ## Install
132
132
 
133
- **Recommended — global install via [pipx](https://pipx.pypa.io):**
133
+ **Recommended — via the VS Code extension (creates a project-isolated environment):**
134
+
135
+ 1. Install the [specsmith AEE Workbench](https://github.com/BitConcepts/specsmith-vscode) VS Code extension
136
+ 2. Open `Ctrl+Shift+,` (⚙ specsmith Settings)
137
+ 3. Click **🔒 Create Environment** — creates `~/.specsmith/venv/` with specsmith + your provider packages
138
+
139
+ The extension uses this environment for all agent sessions and terminal commands.
140
+
141
+ **Or via pipx (system-wide):**
134
142
 
135
143
  ```bash
136
144
  pipx install specsmith # core CLI + epistemic library
@@ -189,24 +197,26 @@ specsmith phase --project-dir ./my-project
189
197
  The **specsmith AEE Workbench** VS Code extension is the flagship client:
190
198
 
191
199
  ```
192
- # Install specsmith first, then:
193
200
  # VS Code: Ctrl+Shift+P → specsmith: New Agent Session
194
- # Settings Panel: Ctrl+Shift+G
201
+ # Settings: Ctrl+Shift+, (⚙ specsmith Settings — global)
202
+ # Project Settings: Ctrl+Shift+G (⚙ Project Settings — per-project)
195
203
  ```
196
204
 
197
205
  **Key features:**
198
- - **6-tab Settings panel** — Project / Tools / Files / Updates / Actions / Execution
199
- - **Execution profiles** — safe (read-only) / standard / open / admin; custom allow/block command lists stored in `scaffold.yml`
200
- - **AEE phase indicator** — shows current phase with readiness %, Next Phase button, and phase selector
206
+ - **Dual-panel architecture** — **⚙ specsmith Settings** (global: venv, version, Ollama, system)
207
+ and **⚙ Project Settings** (per-project: scaffold, tools, files, actions, execution)
208
+ - **Global environment management** — `~/.specsmith/venv/` with Create / Update / Rebuild / Delete;
209
+ persistent restart banner; Remove System Installs cleanup button
210
+ - **VCS context at session start** — git status + recent commits shown in chat and in system prompt
211
+ - **Execution profiles** — safe / standard / open / admin; custom allow/block command lists
212
+ - **AEE phase indicator** — shows current phase with readiness %, Next Phase button, phase selector
201
213
  - **AI agent sessions** — independent process per project, JSONL bridge, chat with file injection
202
214
  - **Live model listing** — Anthropic, OpenAI, Gemini, Mistral, local Ollama (GPU-aware)
203
- - **Ollama integration** — browse curated catalog, download models with progress, task-based suggestions
215
+ - **Ollama integration** — model manager (update/remove/update-all), version check, upgrade
204
216
  - **FPGA/HDL tool support** — vivado, gtkwave, vsg, ghdl, verilator, yosys, nextpnr, and 15 more
205
217
  - **Tool installer** — scan installed tools; one-click install via winget/brew/apt for missing tools
206
- - **Tool rules** — curated AI context rules for 20+ tools (VSG, GHDL, Verilator, ruff, mypy, etc.) auto-injected into agent system prompt
207
218
  - **API key management** — stored in OS credential store (Windows Credential Manager / macOS Keychain)
208
- - **Update checker** — PyPI version check, Install Update button, release channel selector (stable / pre-release)
209
- - **Auto-open** — Settings panel always opens alongside every new session; never a blank pane
219
+ - **Update checker** — PyPI version check, auto-checks on panel open, release channel selector
210
220
 
211
221
  **[→ specsmith-vscode on GitHub](https://github.com/BitConcepts/specsmith-vscode)**
212
222
 
@@ -65,7 +65,15 @@ and a readiness percentage.
65
65
 
66
66
  ## Install
67
67
 
68
- **Recommended — global install via [pipx](https://pipx.pypa.io):**
68
+ **Recommended — via the VS Code extension (creates a project-isolated environment):**
69
+
70
+ 1. Install the [specsmith AEE Workbench](https://github.com/BitConcepts/specsmith-vscode) VS Code extension
71
+ 2. Open `Ctrl+Shift+,` (⚙ specsmith Settings)
72
+ 3. Click **🔒 Create Environment** — creates `~/.specsmith/venv/` with specsmith + your provider packages
73
+
74
+ The extension uses this environment for all agent sessions and terminal commands.
75
+
76
+ **Or via pipx (system-wide):**
69
77
 
70
78
  ```bash
71
79
  pipx install specsmith # core CLI + epistemic library
@@ -124,24 +132,26 @@ specsmith phase --project-dir ./my-project
124
132
  The **specsmith AEE Workbench** VS Code extension is the flagship client:
125
133
 
126
134
  ```
127
- # Install specsmith first, then:
128
135
  # VS Code: Ctrl+Shift+P → specsmith: New Agent Session
129
- # Settings Panel: Ctrl+Shift+G
136
+ # Settings: Ctrl+Shift+, (⚙ specsmith Settings — global)
137
+ # Project Settings: Ctrl+Shift+G (⚙ Project Settings — per-project)
130
138
  ```
131
139
 
132
140
  **Key features:**
133
- - **6-tab Settings panel** — Project / Tools / Files / Updates / Actions / Execution
134
- - **Execution profiles** — safe (read-only) / standard / open / admin; custom allow/block command lists stored in `scaffold.yml`
135
- - **AEE phase indicator** — shows current phase with readiness %, Next Phase button, and phase selector
141
+ - **Dual-panel architecture** — **⚙ specsmith Settings** (global: venv, version, Ollama, system)
142
+ and **⚙ Project Settings** (per-project: scaffold, tools, files, actions, execution)
143
+ - **Global environment management** — `~/.specsmith/venv/` with Create / Update / Rebuild / Delete;
144
+ persistent restart banner; Remove System Installs cleanup button
145
+ - **VCS context at session start** — git status + recent commits shown in chat and in system prompt
146
+ - **Execution profiles** — safe / standard / open / admin; custom allow/block command lists
147
+ - **AEE phase indicator** — shows current phase with readiness %, Next Phase button, phase selector
136
148
  - **AI agent sessions** — independent process per project, JSONL bridge, chat with file injection
137
149
  - **Live model listing** — Anthropic, OpenAI, Gemini, Mistral, local Ollama (GPU-aware)
138
- - **Ollama integration** — browse curated catalog, download models with progress, task-based suggestions
150
+ - **Ollama integration** — model manager (update/remove/update-all), version check, upgrade
139
151
  - **FPGA/HDL tool support** — vivado, gtkwave, vsg, ghdl, verilator, yosys, nextpnr, and 15 more
140
152
  - **Tool installer** — scan installed tools; one-click install via winget/brew/apt for missing tools
141
- - **Tool rules** — curated AI context rules for 20+ tools (VSG, GHDL, Verilator, ruff, mypy, etc.) auto-injected into agent system prompt
142
153
  - **API key management** — stored in OS credential store (Windows Credential Manager / macOS Keychain)
143
- - **Update checker** — PyPI version check, Install Update button, release channel selector (stable / pre-release)
144
- - **Auto-open** — Settings panel always opens alongside every new session; never a blank pane
154
+ - **Update checker** — PyPI version check, auto-checks on panel open, release channel selector
145
155
 
146
156
  **[→ specsmith-vscode on GitHub](https://github.com/BitConcepts/specsmith-vscode)**
147
157
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.3.6.dev179"
7
+ version = "0.3.6.dev181"
8
8
  description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -57,7 +57,8 @@ REQUIRED_FILES = [
57
57
 
58
58
  GOVERNANCE_FILES = [
59
59
  "docs/governance/RULES.md",
60
- "docs/governance/WORKFLOW.md",
60
+ "docs/governance/SESSION-PROTOCOL.md",
61
+ "docs/governance/LIFECYCLE.md",
61
62
  "docs/governance/ROLES.md",
62
63
  "docs/governance/CONTEXT-BUDGET.md",
63
64
  "docs/governance/VERIFICATION.md",
@@ -331,7 +332,8 @@ def check_ledger_health(root: Path) -> list[AuditResult]:
331
332
  _DEFAULT_THRESHOLDS: dict[str, int] = {
332
333
  "AGENTS.md": 200,
333
334
  "docs/governance/RULES.md": 800,
334
- "docs/governance/WORKFLOW.md": 400,
335
+ "docs/governance/SESSION-PROTOCOL.md": 400,
336
+ "docs/governance/LIFECYCLE.md": 200,
335
337
  "docs/governance/ROLES.md": 300,
336
338
  "docs/governance/CONTEXT-BUDGET.md": 300,
337
339
  "docs/governance/VERIFICATION.md": 400,
@@ -342,12 +344,12 @@ _DEFAULT_THRESHOLDS: dict[str, int] = {
342
344
  _TYPE_THRESHOLD_OVERRIDES: dict[str, dict[str, int]] = {
343
345
  "fpga-rtl": {
344
346
  "docs/governance/RULES.md": 1000,
345
- "docs/governance/WORKFLOW.md": 500,
347
+ "docs/governance/SESSION-PROTOCOL.md": 500,
346
348
  "docs/governance/VERIFICATION.md": 600,
347
349
  },
348
350
  "yocto-bsp": {
349
351
  "docs/governance/RULES.md": 1000,
350
- "docs/governance/WORKFLOW.md": 500,
352
+ "docs/governance/SESSION-PROTOCOL.md": 500,
351
353
  "docs/governance/VERIFICATION.md": 500,
352
354
  },
353
355
  "embedded-hardware": {
@@ -579,6 +581,43 @@ def check_trace_chain_integrity(root: Path) -> list[AuditResult]:
579
581
  return []
580
582
 
581
583
 
584
+ def check_phase_readiness(root: Path) -> list[AuditResult]:
585
+ """Check AEE phase readiness (advisory — failed checks are warnings)."""
586
+ results: list[AuditResult] = []
587
+ scaffold_path = root / "scaffold.yml"
588
+ if not scaffold_path.exists():
589
+ return results
590
+
591
+ from specsmith.phase import PHASE_MAP, evaluate_phase, read_phase
592
+
593
+ phase_key = read_phase(root)
594
+ phase = PHASE_MAP.get(phase_key)
595
+ if not phase:
596
+ return results
597
+
598
+ passed, failed = evaluate_phase(phase, root)
599
+ pct = int(len(passed) / len(phase.checks) * 100) if phase.checks else 100
600
+
601
+ if failed:
602
+ results.append(
603
+ AuditResult(
604
+ name="phase-readiness",
605
+ passed=True, # advisory — don't fail the audit
606
+ message=(
607
+ f"Phase {phase.emoji} {phase.label}: {pct}% ready "
608
+ f"({len(failed)} check(s) remaining: {', '.join(failed[:3])})"
609
+ ),
610
+ )
611
+ )
612
+ else:
613
+ msg = f"Phase {phase.emoji} {phase.label}: 100% ready"
614
+ if phase.next_phase:
615
+ msg += f" — run `specsmith phase next` to advance to {phase.next_phase}"
616
+ results.append(AuditResult(name="phase-readiness", passed=True, message=msg))
617
+
618
+ return results
619
+
620
+
582
621
  def run_audit(root: Path) -> AuditReport:
583
622
  """Run all audit checks and return a report."""
584
623
  report = AuditReport()
@@ -589,6 +628,7 @@ def run_audit(root: Path) -> AuditReport:
589
628
  report.results.extend(check_tool_configuration(root))
590
629
  report.results.extend(check_type_mismatch(root))
591
630
  report.results.extend(check_trace_chain_integrity(root))
631
+ report.results.extend(check_phase_readiness(root))
592
632
  return report
593
633
 
594
634
 
@@ -184,6 +184,11 @@ def init(config_path: str | None, output_dir: str, no_git: bool, guided: bool) -
184
184
  with open(config_out, "w") as fh:
185
185
  yaml.dump(cfg.model_dump(mode="json"), fh, default_flow_style=False, sort_keys=False)
186
186
 
187
+ # Ensure AEE phase is set (write_phase appends to scaffold.yml)
188
+ from specsmith.phase import write_phase
189
+
190
+ write_phase(target, "inception")
191
+
187
192
 
188
193
  def _load_config_with_inheritance(config_path: str) -> dict[str, object]:
189
194
  """Load scaffold.yml, merging parent config if `extends` is set."""
@@ -641,7 +646,8 @@ def import_project(
641
646
  "docs/ARCHITECTURE.md",
642
647
  "scaffold.yml",
643
648
  "docs/governance/RULES.md",
644
- "docs/governance/WORKFLOW.md",
649
+ "docs/governance/SESSION-PROTOCOL.md",
650
+ "docs/governance/LIFECYCLE.md",
645
651
  "docs/governance/ROLES.md",
646
652
  "docs/governance/CONTEXT-BUDGET.md",
647
653
  "docs/governance/VERIFICATION.md",
@@ -682,6 +688,11 @@ def import_project(
682
688
  yaml.dump(config.model_dump(mode="json"), fh, default_flow_style=False, sort_keys=False)
683
689
  console.print(" [green]\u2713[/green] scaffold.yml")
684
690
 
691
+ # Ensure AEE phase is set
692
+ from specsmith.phase import write_phase
693
+
694
+ write_phase(root, "inception")
695
+
685
696
  # Guided architecture definition after import
686
697
  if guided:
687
698
  guided_files = _run_guided_architecture(config, root)
@@ -3442,14 +3453,26 @@ def phase_status(project_dir: str) -> None:
3442
3453
 
3443
3454
 
3444
3455
  @phase_group.command(name="list")
3445
- def phase_list() -> None:
3446
- """List all AEE workflow phases in order."""
3447
- from specsmith.phase import PHASES
3456
+ @click.option("--project-dir", type=click.Path(exists=True), default=".")
3457
+ def phase_list(project_dir: str) -> None:
3458
+ """List all AEE lifecycle phases with current position highlighted."""
3459
+ from specsmith.phase import PHASES, read_phase
3448
3460
 
3449
- console.print("[bold]AEE Workflow Phases[/bold]\n")
3461
+ root = Path(project_dir).resolve()
3462
+ current = read_phase(root)
3463
+
3464
+ console.print("[bold]AEE Project Lifecycle[/bold]\n")
3465
+ console.print(
3466
+ " inception \u2192 architecture \u2192 requirements \u2192 test_spec "
3467
+ "\u2192 implementation \u2192 verification \u2192 release\n"
3468
+ )
3450
3469
  for i, p in enumerate(PHASES, 1):
3451
- arrow = " " if i < len(PHASES) else ""
3452
- console.print(f" {i}. {p.emoji} [bold]{p.label}[/bold] {p.description}{arrow}")
3470
+ marker = "[bold cyan]\u25b6[/bold cyan]" if p.key == current else " "
3471
+ style = "bold cyan" if p.key == current else ""
3472
+ console.print(
3473
+ f" {marker} {i}. {p.emoji} [{style}]{p.label:<20s}[/{style}] {p.description}"
3474
+ )
3475
+ console.print(f"\n Current: [bold]{current}[/bold]")
3453
3476
 
3454
3477
 
3455
3478
  main.add_command(phase_group)
@@ -14,7 +14,8 @@ from specsmith.config import ProjectConfig
14
14
 
15
15
  _GOVERNANCE_FILES: list[tuple[str, str]] = [
16
16
  ("governance/rules.md.j2", "docs/governance/RULES.md"),
17
- ("governance/workflow.md.j2", "docs/governance/WORKFLOW.md"),
17
+ ("governance/session-protocol.md.j2", "docs/governance/SESSION-PROTOCOL.md"),
18
+ ("governance/lifecycle.md.j2", "docs/governance/LIFECYCLE.md"),
18
19
  ("governance/roles.md.j2", "docs/governance/ROLES.md"),
19
20
  ("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
20
21
  ("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
@@ -47,13 +48,19 @@ def run_diff(root: Path) -> list[tuple[str, str]]:
47
48
  lstrip_blocks=True,
48
49
  )
49
50
 
51
+ from specsmith.phase import PHASE_MAP, read_phase
50
52
  from specsmith.tools import get_tools
51
53
 
54
+ phase_key = read_phase(root)
55
+ phase_obj = PHASE_MAP.get(phase_key, PHASE_MAP["inception"])
52
56
  ctx = {
53
57
  "project": config,
54
58
  "today": date.today().isoformat(),
55
59
  "package_name": config.package_name,
56
60
  "tools": get_tools(config),
61
+ "aee_phase": phase_key,
62
+ "aee_phase_label": phase_obj.label,
63
+ "aee_phase_emoji": phase_obj.emoji,
57
64
  }
58
65
 
59
66
  results: list[tuple[str, str]] = []
@@ -101,11 +108,18 @@ def run_diff_html(root: Path) -> str:
101
108
  trim_blocks=True,
102
109
  lstrip_blocks=True,
103
110
  )
111
+ from specsmith.phase import PHASE_MAP, read_phase
112
+
113
+ phase_key = read_phase(root)
114
+ phase_obj = PHASE_MAP.get(phase_key, PHASE_MAP["inception"])
104
115
  ctx = {
105
116
  "project": config,
106
117
  "today": date.today().isoformat(),
107
118
  "package_name": config.package_name,
108
119
  "tools": get_tools(config),
120
+ "aee_phase": phase_key,
121
+ "aee_phase_label": phase_obj.label,
122
+ "aee_phase_emoji": phase_obj.emoji,
109
123
  }
110
124
 
111
125
  differ = difflib.HtmlDiff(wrapcolumn=80)
@@ -138,7 +138,8 @@ def run_export(root: Path) -> str:
138
138
  "docs/TEST_SPEC.md",
139
139
  "docs/ARCHITECTURE.md",
140
140
  "docs/governance/RULES.md",
141
- "docs/governance/WORKFLOW.md",
141
+ "docs/governance/SESSION-PROTOCOL.md",
142
+ "docs/governance/LIFECYCLE.md",
142
143
  "docs/governance/ROLES.md",
143
144
  "docs/governance/VERIFICATION.md",
144
145
  ]
@@ -877,8 +877,8 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
877
877
  "H2: All proposals require human approval.\n"
878
878
  "H3: The ledger is append-only.\n"
879
879
  ),
880
- "workflow": (
881
- "# Workflow\n\n"
880
+ "session-protocol": (
881
+ "# Session Protocol\n\n"
882
882
  "1. Propose changes\n2. Get approval\n"
883
883
  "3. Execute\n4. Verify\n5. Record in ledger\n"
884
884
  ),
@@ -935,7 +935,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
935
935
  # Classify each section into a governance category
936
936
  category_map: list[tuple[str, list[str]]] = [
937
937
  ("rules", _RULES_KW),
938
- ("workflow", _WORKFLOW_KW),
938
+ ("session-protocol", _WORKFLOW_KW),
939
939
  ("roles", _ROLES_KW),
940
940
  ("context-budget", _CTX_KW),
941
941
  ("verification", _VERIFY_KW),
@@ -944,7 +944,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
944
944
 
945
945
  buckets: dict[str, list[tuple[str, str]]] = {
946
946
  "rules": [],
947
- "workflow": [],
947
+ "session-protocol": [],
948
948
  "roles": [],
949
949
  "context-budget": [],
950
950
  "verification": [],
@@ -1007,7 +1007,7 @@ def _extract_governance_sections(root: Path) -> dict[str, str]:
1007
1007
  # Build output
1008
1008
  titles = {
1009
1009
  "rules": "# Rules",
1010
- "workflow": "# Workflow",
1010
+ "session-protocol": "# Session Protocol",
1011
1011
  "roles": "# Roles",
1012
1012
  "context-budget": "# Context Budget",
1013
1013
  "verification": "# Verification",
@@ -1279,12 +1279,33 @@ def generate_overlay(
1279
1279
  # Otherwise use generic stubs.
1280
1280
  gov = _extract_governance_sections(target)
1281
1281
  _write("docs/governance/RULES.md", gov["rules"])
1282
- _write("docs/governance/WORKFLOW.md", gov["workflow"])
1282
+ _write("docs/governance/SESSION-PROTOCOL.md", gov["session-protocol"])
1283
+ _write(
1284
+ "docs/governance/LIFECYCLE.md",
1285
+ "# Project Lifecycle\n\n"
1286
+ "See `specsmith phase show` for current phase readiness.\n"
1287
+ "See `specsmith phase list` for the full AEE lifecycle.\n",
1288
+ )
1283
1289
  _write("docs/governance/ROLES.md", gov["roles"])
1284
1290
  _write("docs/governance/CONTEXT-BUDGET.md", gov["context-budget"])
1285
1291
  _write("docs/governance/VERIFICATION.md", gov["verification"])
1286
1292
  _write("docs/governance/DRIFT-METRICS.md", gov["drift-metrics"])
1287
1293
 
1294
+ # Migrate old WORKFLOW.md files if found
1295
+ import shutil as _shutil
1296
+
1297
+ old_gov_wf = target / "docs" / "governance" / "WORKFLOW.md"
1298
+ new_sp = target / "docs" / "governance" / "SESSION-PROTOCOL.md"
1299
+ if old_gov_wf.exists() and not new_sp.exists():
1300
+ _shutil.move(str(old_gov_wf), str(new_sp))
1301
+ created.append(new_sp)
1302
+ elif old_gov_wf.exists():
1303
+ old_gov_wf.unlink() # new file already exists, remove old one
1304
+
1305
+ old_doc_wf = target / "docs" / "WORKFLOW.md"
1306
+ if old_doc_wf.exists():
1307
+ old_doc_wf.unlink() # replaced by LIFECYCLE.md + phase system
1308
+
1288
1309
  # If existing AGENTS.md is oversized, back it up and replace with a hub.
1289
1310
  agents_path = target / "AGENTS.md"
1290
1311
  if agents_path.exists():
@@ -1306,8 +1327,10 @@ def generate_overlay(
1306
1327
  "| ---- | ------- | ----------- |\n"
1307
1328
  "| `docs/governance/RULES.md` | Hard rules, stop conditions, "
1308
1329
  "project-specific rules | Every session start |\n"
1309
- "| `docs/governance/WORKFLOW.md` | Session lifecycle, "
1330
+ "| `docs/governance/SESSION-PROTOCOL.md` | Session lifecycle, "
1310
1331
  "save/push protocol | Every session start |\n"
1332
+ "| `docs/governance/LIFECYCLE.md` | AEE phase lifecycle, "
1333
+ "readiness gates | Every session start |\n"
1311
1334
  "| `docs/governance/ROLES.md` | Agent role boundaries | "
1312
1335
  "Every session start |\n"
1313
1336
  "| `docs/governance/CONTEXT-BUDGET.md` | Context management | "
@@ -184,7 +184,7 @@ PHASES: list[Phase] = [
184
184
  "ARCHITECTURE.md has content",
185
185
  _file_min_lines("docs/ARCHITECTURE.md", 20),
186
186
  ),
187
- PhaseCheck("AGENTS.md references architecture", _file_exists("AGENTS.md")),
187
+ PhaseCheck("AGENTS.md has substantial content", _file_min_lines("AGENTS.md", 30)),
188
188
  PhaseCheck("Trace vault has at least 1 seal", _trace_vault_exists()),
189
189
  ],
190
190
  commands=[
@@ -207,7 +207,7 @@ PHASES: list[Phase] = [
207
207
  PhaseCheck("At least 5 requirements defined", _req_count(5)),
208
208
  PhaseCheck("TEST_SPEC.md exists", _file_exists("docs/TEST_SPEC.md")),
209
209
  PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
210
- PhaseCheck("Audit passes", _file_exists("AGENTS.md")),
210
+ PhaseCheck("REQUIREMENTS.md has content", _file_min_lines("REQUIREMENTS.md", 10)),
211
211
  ],
212
212
  commands=[
213
213
  "specsmith stress-test",
@@ -230,7 +230,7 @@ PHASES: list[Phase] = [
230
230
  ),
231
231
  PhaseCheck("TEST coverage ≥ 80 %", _test_spec_covers_reqs(80)),
232
232
  PhaseCheck("REQUIREMENTS.md has ≥ 5 REQs", _req_count(5)),
233
- PhaseCheck("Audit passes", _file_exists("AGENTS.md")),
233
+ PhaseCheck("LEDGER.md exists", _file_exists("LEDGER.md")),
234
234
  ],
235
235
  commands=[
236
236
  "specsmith validate",
@@ -267,7 +267,7 @@ PHASES: list[Phase] = [
267
267
  PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
268
268
  PhaseCheck("TEST coverage ≥ 80 %", _test_spec_covers_reqs(80)),
269
269
  PhaseCheck("Trace vault has seals", _trace_vault_exists()),
270
- PhaseCheck("Audit passes", _file_exists("AGENTS.md")),
270
+ PhaseCheck("Trace vault has ≥ 2 seals", _trace_vault_exists()),
271
271
  PhaseCheck("LEDGER.md has content", _file_min_lines("LEDGER.md", 10)),
272
272
  ],
273
273
  commands=[
@@ -286,8 +286,8 @@ PHASES: list[Phase] = [
286
286
  checks=[
287
287
  PhaseCheck("CHANGELOG.md has version entry", _changelog_has_version()),
288
288
  PhaseCheck("Trace vault has seals", _trace_vault_exists()),
289
- PhaseCheck("Export report clean", _file_exists("docs/ARCHITECTURE.md")),
290
- PhaseCheck("Audit passes", _file_exists("AGENTS.md")),
289
+ PhaseCheck("CHANGELOG.md exists", _file_exists("CHANGELOG.md")),
290
+ PhaseCheck("ARCHITECTURE.md exists", _file_exists("docs/ARCHITECTURE.md")),
291
291
  ],
292
292
  commands=[
293
293
  "specsmith export --output docs/COMPLIANCE.md",
@@ -11,6 +11,7 @@ from pathlib import Path
11
11
  from jinja2 import Environment, PackageLoader, select_autoescape
12
12
 
13
13
  from specsmith.config import ProjectConfig, ProjectType
14
+ from specsmith.phase import PHASE_MAP
14
15
 
15
16
 
16
17
  def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
@@ -29,11 +30,16 @@ def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
29
30
  from specsmith.tools import get_tools
30
31
 
31
32
  tools = get_tools(config)
33
+ phase_key = "inception" # new projects always start at inception
34
+ phase_obj = PHASE_MAP[phase_key]
32
35
  ctx = {
33
36
  "project": config,
34
37
  "today": date.today().isoformat(),
35
38
  "package_name": config.package_name,
36
39
  "tools": tools,
40
+ "aee_phase": phase_key,
41
+ "aee_phase_label": phase_obj.label,
42
+ "aee_phase_emoji": phase_obj.emoji,
37
43
  }
38
44
 
39
45
  created: list[Path] = []
@@ -86,6 +92,11 @@ def scaffold_project(config: ProjectConfig, target: Path) -> list[Path]:
86
92
  save_budget(target, CreditBudget()) # unlimited by default
87
93
  created.append(target / ".specsmith" / "credit-budget.json")
88
94
 
95
+ # Set initial AEE phase in scaffold.yml
96
+ from specsmith.phase import write_phase
97
+
98
+ write_phase(target, "inception")
99
+
89
100
  # Git init
90
101
  if config.git_init:
91
102
  subprocess.run( # noqa: S603
@@ -109,14 +120,14 @@ def _build_file_map(config: ProjectConfig) -> list[tuple[str, str]]:
109
120
  ("editorconfig.j2", ".editorconfig"),
110
121
  # Modular governance
111
122
  ("governance/rules.md.j2", "docs/governance/RULES.md"),
112
- ("governance/workflow.md.j2", "docs/governance/WORKFLOW.md"),
123
+ ("governance/session-protocol.md.j2", "docs/governance/SESSION-PROTOCOL.md"),
124
+ ("governance/lifecycle.md.j2", "docs/governance/LIFECYCLE.md"),
113
125
  ("governance/roles.md.j2", "docs/governance/ROLES.md"),
114
126
  ("governance/context-budget.md.j2", "docs/governance/CONTEXT-BUDGET.md"),
115
127
  ("governance/verification.md.j2", "docs/governance/VERIFICATION.md"),
116
128
  ("governance/drift-metrics.md.j2", "docs/governance/DRIFT-METRICS.md"),
117
129
  # Project docs
118
130
  ("docs/architecture.md.j2", "docs/ARCHITECTURE.md"),
119
- ("docs/workflow.md.j2", "docs/WORKFLOW.md"),
120
131
  ("docs/requirements.md.j2", "docs/REQUIREMENTS.md"),
121
132
  ("docs/test-spec.md.j2", "docs/TEST_SPEC.md"),
122
133
  # Scripts