specsmith 0.22.2__tar.gz → 0.22.3__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 (396) hide show
  1. {specsmith-0.22.2/src/specsmith.egg-info → specsmith-0.22.3}/PKG-INFO +1 -1
  2. {specsmith-0.22.2 → specsmith-0.22.3}/pyproject.toml +1 -1
  3. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/__init__.py +1 -1
  4. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/cli.py +12 -10
  5. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/config.py +1 -1
  6. {specsmith-0.22.2 → specsmith-0.22.3/src/specsmith.egg-info}/PKG-INFO +1 -1
  7. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/SOURCES.txt +1 -0
  8. specsmith-0.22.3/tests/test_issue_305.py +78 -0
  9. {specsmith-0.22.2 → specsmith-0.22.3}/LICENSE +0 -0
  10. {specsmith-0.22.2 → specsmith-0.22.3}/README.md +0 -0
  11. {specsmith-0.22.2 → specsmith-0.22.3}/setup.cfg +0 -0
  12. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/__init__.py +0 -0
  13. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/belief.py +0 -0
  14. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/certainty.py +0 -0
  15. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/failure_graph.py +0 -0
  16. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/py.typed +0 -0
  17. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/recovery.py +0 -0
  18. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/session.py +0 -0
  19. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/stress_tester.py +0 -0
  20. {specsmith-0.22.2 → specsmith-0.22.3}/src/epistemic/trace.py +0 -0
  21. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/__main__.py +0 -0
  22. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/advanced_code_analysis.py +0 -0
  23. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/__init__.py +0 -0
  24. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/broker.py +0 -0
  25. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/chat_runner.py +0 -0
  26. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/cleanup.py +0 -0
  27. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/context_seed.py +0 -0
  28. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/core.py +0 -0
  29. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/__init__.py +0 -0
  30. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/_status.py +0 -0
  31. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/dag.py +0 -0
  32. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  33. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/events.py +0 -0
  34. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/dispatch/result.py +0 -0
  35. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/endpoints.py +0 -0
  36. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/events.py +0 -0
  37. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/execution_profiles.py +0 -0
  38. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/fallback.py +0 -0
  39. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/hf_leaderboard.py +0 -0
  40. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/hf_sync.py +0 -0
  41. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/indexer.py +0 -0
  42. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/llm_client.py +0 -0
  43. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/mcp.py +0 -0
  44. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/memory.py +0 -0
  45. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_intelligence.py +0 -0
  46. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_profiles.py +0 -0
  47. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/model_router.py +0 -0
  48. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/orchestrator.py +0 -0
  49. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/permissions.py +0 -0
  50. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/profiles.py +0 -0
  51. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/provider_registry.py +0 -0
  52. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/repl.py +0 -0
  53. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/router.py +0 -0
  54. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/rules.py +0 -0
  55. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/runner.py +0 -0
  56. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/safety.py +0 -0
  57. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/spawner.py +0 -0
  58. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/suggester.py +0 -0
  59. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/teams.py +0 -0
  60. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/terminal_env.py +0 -0
  61. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/token_pricing.py +0 -0
  62. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/tools.py +0 -0
  63. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/verifier.py +0 -0
  64. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/agent/voice.py +0 -0
  65. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/approvals.py +0 -0
  66. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/architect.py +0 -0
  67. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/auditor.py +0 -0
  68. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/auth.py +0 -0
  69. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/block_export.py +0 -0
  70. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/channel.py +0 -0
  71. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/chat_handoff.py +0 -0
  72. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ci_manager.py +0 -0
  73. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/code_analysis.py +0 -0
  74. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/__init__.py +0 -0
  75. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/intelligence.py +0 -0
  76. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/issues_policy.py +0 -0
  77. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/reporting.py +0 -0
  78. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/commands/zoo_code.py +0 -0
  79. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/__init__.py +0 -0
  80. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/_compat.py +0 -0
  81. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/checker.py +0 -0
  82. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/evidence.py +0 -0
  83. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/regulations.py +0 -0
  84. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compliance/reporter.py +0 -0
  85. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/compressor.py +0 -0
  86. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/console_utils.py +0 -0
  87. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/context_orchestrator.py +0 -0
  88. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/context_window.py +0 -0
  89. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/credit_analyzer.py +0 -0
  90. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/credits.py +0 -0
  91. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/dashboard.py +0 -0
  92. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/__init__.py +0 -0
  93. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/base.py +0 -0
  94. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/citations.py +0 -0
  95. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/fpd.py +0 -0
  96. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/odp.py +0 -0
  97. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/patentsview.py +0 -0
  98. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/pfw.py +0 -0
  99. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/ppubs.py +0 -0
  100. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/datasources/ptab.py +0 -0
  101. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/differ.py +0 -0
  102. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/doctor.py +0 -0
  103. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/drive.py +0 -0
  104. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/editor.py +0 -0
  105. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/efficiency.py +0 -0
  106. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/__init__.py +0 -0
  107. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/belief.py +0 -0
  108. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/certainty.py +0 -0
  109. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/failure_graph.py +0 -0
  110. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/recovery.py +0 -0
  111. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/epistemic/stress_tester.py +0 -0
  112. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/__init__.py +0 -0
  113. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/_license.py +0 -0
  114. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/bridge.py +0 -0
  115. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb/sqlite_store.py +0 -0
  116. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb_sweep.py +0 -0
  117. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/esdb_writer.py +0 -0
  118. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/__init__.py +0 -0
  119. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/builtins.py +0 -0
  120. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/eval/runner.py +0 -0
  121. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/executor.py +0 -0
  122. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/exporter.py +0 -0
  123. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_logic.py +0 -0
  124. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_store.py +0 -0
  125. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governance_yaml.py +0 -0
  126. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/governed_pr.py +0 -0
  127. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/__init__.py +0 -0
  128. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/app.py +0 -0
  129. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/main_window.py +0 -0
  130. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/session_tab.py +0 -0
  131. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/theme.py +0 -0
  132. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/__init__.py +0 -0
  133. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/chat_view.py +0 -0
  134. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/input_bar.py +0 -0
  135. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  136. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/token_meter.py +0 -0
  137. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  138. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/widgets/update_checker.py +0 -0
  139. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/gui/worker.py +0 -0
  140. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/history_search.py +0 -0
  141. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/importer.py +0 -0
  142. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/improvement_tracker.py +0 -0
  143. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/instinct.py +0 -0
  144. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/__init__.py +0 -0
  145. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/agent_skill.py +0 -0
  146. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/aider.py +0 -0
  147. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/base.py +0 -0
  148. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/claude_code.py +0 -0
  149. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/codity.py +0 -0
  150. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/copilot.py +0 -0
  151. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/cursor.py +0 -0
  152. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/gemini.py +0 -0
  153. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/warp.py +0 -0
  154. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/integrations/windsurf.py +0 -0
  155. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/issue_reporter.py +0 -0
  156. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/languages.py +0 -0
  157. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ledger.py +0 -0
  158. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/local_model.py +0 -0
  159. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/mcp_generator.py +0 -0
  160. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/mcp_server.py +0 -0
  161. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/__init__.py +0 -0
  162. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  163. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  164. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  165. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  166. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  167. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m006_session_governance.py +0 -0
  168. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  169. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
  170. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m009_esdb_first.py +0 -0
  171. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
  172. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m011_windows_skill_shell.py +0 -0
  173. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/m012_normalize_skill_shell.py +0 -0
  174. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/migrations/runner.py +0 -0
  175. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/model_optimizer.py +0 -0
  176. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/model_registry.py +0 -0
  177. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/ollama_cmds.py +0 -0
  178. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/patent.py +0 -0
  179. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/paths.py +0 -0
  180. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/phase.py +0 -0
  181. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/plugins.py +0 -0
  182. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/policy.py +0 -0
  183. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/profiles.py +0 -0
  184. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/project_metrics.py +0 -0
  185. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/quality_report.py +0 -0
  186. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/rate_limits.py +0 -0
  187. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/recover.py +0 -0
  188. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/release_guard.py +0 -0
  189. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/releaser.py +0 -0
  190. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/requirements.py +0 -0
  191. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/requirements_parser.py +0 -0
  192. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/retrieval.py +0 -0
  193. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/risk.py +0 -0
  194. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/safe_write.py +0 -0
  195. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/scaffolder.py +0 -0
  196. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/serve.py +0 -0
  197. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session.py +0 -0
  198. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session_init.py +0 -0
  199. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/session_store.py +0 -0
  200. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/__init__.py +0 -0
  201. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/ai_agents.py +0 -0
  202. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/cloud.py +0 -0
  203. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/corporate.py +0 -0
  204. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/cross_platform.py +0 -0
  205. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/data_engineering.py +0 -0
  206. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/devops.py +0 -0
  207. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/docs.py +0 -0
  208. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/embedded.py +0 -0
  209. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/governance.py +0 -0
  210. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/hardware.py +0 -0
  211. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/mobile.py +0 -0
  212. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/platform_engineering.py +0 -0
  213. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/productivity.py +0 -0
  214. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/software_engineering.py +0 -0
  215. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_core_commands.py +0 -0
  216. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_operations.py +0 -0
  217. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/specsmith_skills.py +0 -0
  218. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/ssh.py +0 -0
  219. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills/web_backend.py +0 -0
  220. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/skills_builder.py +0 -0
  221. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/sync.py +0 -0
  222. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/agents.md.j2 +0 -0
  223. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  224. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  225. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  226. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  227. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  228. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  229. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  230. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/community/security.md.j2 +0 -0
  231. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  232. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  233. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  234. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  235. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  236. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/editorconfig.j2 +0 -0
  237. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/gitattributes.j2 +0 -0
  238. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/gitignore.j2 +0 -0
  239. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/go/go.mod.j2 +0 -0
  240. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/go/main.go.j2 +0 -0
  241. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  242. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  243. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  244. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  245. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  246. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  247. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  248. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  249. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  250. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  251. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  252. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/js/package.json.j2 +0 -0
  253. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/ledger.md.j2 +0 -0
  254. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/cli.py.j2 +0 -0
  255. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/init.py.j2 +0 -0
  256. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  257. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/readme.md.j2 +0 -0
  258. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  259. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  260. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  261. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  262. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  263. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  264. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  265. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  266. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  267. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/tool_installer.py +0 -0
  268. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/toolrules.py +0 -0
  269. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/tools.py +0 -0
  270. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/trace.py +0 -0
  271. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/transcripts.py +0 -0
  272. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/updater.py +0 -0
  273. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/upgrader.py +0 -0
  274. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/validator.py +0 -0
  275. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/__init__.py +0 -0
  276. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/base.py +0 -0
  277. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/bitbucket.py +0 -0
  278. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/github.py +0 -0
  279. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs/gitlab.py +0 -0
  280. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/vcs_commands.py +0 -0
  281. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/wi_store.py +0 -0
  282. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/wireframes.py +0 -0
  283. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith/workspace.py +0 -0
  284. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/dependency_links.txt +0 -0
  285. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/entry_points.txt +0 -0
  286. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/requires.txt +0 -0
  287. {specsmith-0.22.2 → specsmith-0.22.3}/src/specsmith.egg-info/top_level.txt +0 -0
  288. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_CMD_001.py +0 -0
  289. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_profiles.py +0 -0
  290. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_run_feedback.py +0 -0
  291. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_agent_runner_ready.py +0 -0
  292. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_ai_client.py +0 -0
  293. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_ai_intelligence.py +0 -0
  294. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architect_interview.py +0 -0
  295. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architect_v2.py +0 -0
  296. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_architecture.py +0 -0
  297. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_audit_governance.py +0 -0
  298. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_auditor.py +0 -0
  299. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_benchmark_harness.py +0 -0
  300. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_branch_workflow.py +0 -0
  301. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_broker_scope.py +0 -0
  302. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_channel.py +0 -0
  303. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_diff_decision.py +0 -0
  304. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_handoff.py +0 -0
  305. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_runner_openai_compat.py +0 -0
  306. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_chat_stdin_protocol.py +0 -0
  307. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cleanup_cmd.py +0 -0
  308. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli.py +0 -0
  309. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli_regressions.py +0 -0
  310. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_cli_workflows_history_drive.py +0 -0
  311. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compliance.py +0 -0
  312. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compliance_governance.py +0 -0
  313. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_compressor.py +0 -0
  314. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_deprecation_registry.py +0 -0
  315. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_dispatch.py +0 -0
  316. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_docs_artifacts.py +0 -0
  317. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_dual_write.py +0 -0
  318. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_e2e_nexus.py +0 -0
  319. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_efficiency.py +0 -0
  320. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_endpoints_cli.py +0 -0
  321. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_endpoints_store.py +0 -0
  322. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_epistemic.py +0 -0
  323. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_backend_switch.py +0 -0
  324. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_enforcement.py +0 -0
  325. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_integration.py +0 -0
  326. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_license.py +0 -0
  327. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_migrate_wal_repair.py +0 -0
  328. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_sqlite.py +0 -0
  329. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_status_integrity.py +0 -0
  330. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_status_output.py +0 -0
  331. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_sweep.py +0 -0
  332. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_verify_chain_cli.py +0 -0
  333. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_esdb_writer.py +0 -0
  334. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_fallback_chain.py +0 -0
  335. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_golden_path.py +0 -0
  336. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_importer.py +0 -0
  337. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_improvement_tracker.py +0 -0
  338. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_init_modes.py +0 -0
  339. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations.py +0 -0
  340. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations_codity.py +0 -0
  341. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_integrations_warp.py +0 -0
  342. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_intelligence.py +0 -0
  343. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issue_policy_features.py +0 -0
  344. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issue_reporter.py +0 -0
  345. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_issues_263_264.py +0 -0
  346. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_local_model.py +0 -0
  347. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_markdown_deprecation.py +0 -0
  348. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_mcp_client.py +0 -0
  349. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_mcp_server.py +0 -0
  350. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_metrics_flush.py +0 -0
  351. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_migration_direction.py +0 -0
  352. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_migrations_skill_shell.py +0 -0
  353. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_model_registry.py +0 -0
  354. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_model_router.py +0 -0
  355. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_new_modules.py +0 -0
  356. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_nexus.py +0 -0
  357. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_parallel_agents.py +0 -0
  358. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_permissions.py +0 -0
  359. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_phase1_4_new.py +0 -0
  360. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_phase34_completion.py +0 -0
  361. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_project_metrics.py +0 -0
  362. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_quality_report.py +0 -0
  363. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_rate_limits.py +0 -0
  364. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_release_guard.py +0 -0
  365. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_release_version_contract.py +0 -0
  366. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_releaser.py +0 -0
  367. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_repl.py +0 -0
  368. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_repl_extended.py +0 -0
  369. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_reporting_commands.py +0 -0
  370. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_req_248_262.py +0 -0
  371. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_req_358_359.py +0 -0
  372. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_resume_command.py +0 -0
  373. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_rtd_deploy_workflow.py +0 -0
  374. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_scaffolder.py +0 -0
  375. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_schema_migrations.py +0 -0
  376. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_session_events.py +0 -0
  377. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_skill_marketplace.py +0 -0
  378. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_skills_mcp.py +0 -0
  379. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_smoke.py +0 -0
  380. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_sqlite_parity.py +0 -0
  381. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_suggester.py +0 -0
  382. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_sync_reconcile.py +0 -0
  383. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_terminal_env.py +0 -0
  384. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_token_cost.py +0 -0
  385. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_tools.py +0 -0
  386. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_trace_vault_esdb.py +0 -0
  387. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_typing_guardrails.py +0 -0
  388. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_updater.py +0 -0
  389. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_validator.py +0 -0
  390. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_vcs.py +0 -0
  391. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_vcs_commands.py +0 -0
  392. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_warp_parity.py +0 -0
  393. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_warp_parity_followup.py +0 -0
  394. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_wi_lifecycle.py +0 -0
  395. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_wi_lifecycle_extended.py +0 -0
  396. {specsmith-0.22.2 → specsmith-0.22.3}/tests/test_windows_launcher.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.22.2
3
+ Version: 0.22.3
4
4
  Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
5
5
  Author: Layer1Labs Silicon, Inc.
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.22.2"
7
+ version = "0.22.3"
8
8
  description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
8
8
  try:
9
9
  __version__: str = _pkg_version("specsmith")
10
10
  except PackageNotFoundError: # running from source without install
11
- __version__ = "0.22.2" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.22.3" # fallback: keep in sync with pyproject.toml
@@ -3373,6 +3373,17 @@ def save_cmd(project_dir: str, message: str, no_push: bool, force: bool, as_json
3373
3373
  except Exception as exc: # noqa: BLE001
3374
3374
  steps.append({"step": "esdb_backup", "ok": False, "error": str(exc)})
3375
3375
 
3376
+ # Persist the save metric before committing. ChronoStore appends this
3377
+ # dual-write to its tracked WAL, so writing it after the commit leaves the
3378
+ # worktree dirty even when save otherwise reports success.
3379
+ try:
3380
+ from specsmith.project_metrics import MetricsRecord, MetricsStore
3381
+
3382
+ pre_commit_ok = all(step["ok"] for step in steps)
3383
+ MetricsStore(root).append(MetricsRecord.new(command="save", passed=pre_commit_ok))
3384
+ except Exception: # noqa: BLE001 # metrics remain best-effort
3385
+ pass
3386
+
3376
3387
  # 2. Commit
3377
3388
  if not has_uncommitted_changes(root):
3378
3389
  steps.append({"step": "commit", "ok": True, "note": "Nothing to commit"})
@@ -3436,15 +3447,6 @@ def save_cmd(project_dir: str, message: str, no_push: bool, force: bool, as_json
3436
3447
  note = step.get("message") or step.get("note") or step.get("error") or ""
3437
3448
  console.print(f" [{color}]{icon}[/{color}] {step['step']}: {note}")
3438
3449
 
3439
- # Auto-record a minimal metrics row for lifetime tracking
3440
- try:
3441
- from specsmith.project_metrics import MetricsRecord, MetricsStore
3442
-
3443
- _store = MetricsStore(root)
3444
- _store.append(MetricsRecord.new(command="save", passed=ok))
3445
- except Exception: # noqa: BLE001 # intentional: metrics are best-effort; never block save
3446
- pass
3447
-
3448
3450
  if not ok:
3449
3451
  raise SystemExit(1)
3450
3452
 
@@ -3855,7 +3857,7 @@ def channel_set_cmd(channel: str) -> None:
3855
3857
  if channel == "stable" and is_prerelease_version(__version__):
3856
3858
  raise click.UsageError(
3857
3859
  "Cannot select stable while a prerelease is installed. "
3858
- f"Install a stable build first: {version_mismatch_remediation('0.22.2')}"
3860
+ f"Install a stable build first: {version_mismatch_remediation('0.22.3')}"
3859
3861
  )
3860
3862
 
3861
3863
  set_persisted_channel(channel)
@@ -140,7 +140,7 @@ class ProjectConfig(BaseModel):
140
140
  ),
141
141
  )
142
142
  language: str = Field(default="python", description="Primary language/runtime")
143
- spec_version: str = Field(default="0.22.2", description="Spec version to scaffold from")
143
+ spec_version: str = Field(default="0.22.3", description="Spec version to scaffold from")
144
144
  description: str = Field(default="", description="Short project description")
145
145
 
146
146
  # Options
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.22.2
3
+ Version: 0.22.3
4
4
  Summary: AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider.
5
5
  Author: Layer1Labs Silicon, Inc.
6
6
  License-Expression: MIT
@@ -337,6 +337,7 @@ tests/test_integrations.py
337
337
  tests/test_integrations_codity.py
338
338
  tests/test_integrations_warp.py
339
339
  tests/test_intelligence.py
340
+ tests/test_issue_305.py
340
341
  tests/test_issue_policy_features.py
341
342
  tests/test_issue_reporter.py
342
343
  tests/test_issues_263_264.py
@@ -0,0 +1,78 @@
1
+ # Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
2
+ """Regression coverage for issue #305 (TEST-480)."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import json
7
+ import subprocess
8
+ from pathlib import Path
9
+
10
+ from click.testing import CliRunner
11
+
12
+ from specsmith.cli import main
13
+
14
+
15
+ def _git(root: Path, *args: str) -> str:
16
+ result = subprocess.run(
17
+ ["git", *args],
18
+ cwd=root,
19
+ check=True,
20
+ capture_output=True,
21
+ text=True,
22
+ )
23
+ return result.stdout
24
+
25
+
26
+ def _init_git_repo(root: Path) -> None:
27
+ _git(root, "init")
28
+ _git(root, "config", "user.name", "SpecSmith Test")
29
+ _git(root, "config", "user.email", "specsmith-test@example.invalid")
30
+ (root / ".gitignore").write_text(
31
+ ".chronomemory/*\n!.chronomemory/events.wal\n.specsmith/*.sqlite3\n",
32
+ encoding="utf-8",
33
+ )
34
+ wal = root / ".chronomemory" / "events.wal"
35
+ wal.parent.mkdir()
36
+ wal.write_text("", encoding="utf-8")
37
+ (root / "README.md").write_text("fixture\n", encoding="utf-8")
38
+ (root / ".specsmith").mkdir()
39
+ _git(root, "add", "-A")
40
+ _git(root, "commit", "-m", "test: initialize fixture")
41
+
42
+
43
+ def test_save_commits_chronomemory_metric_wal_before_reporting_success(
44
+ tmp_path: Path, monkeypatch
45
+ ) -> None: # type: ignore[no-untyped-def]
46
+ """A successful save must not leave its own tracked ChronoMemory WAL dirty."""
47
+ _init_git_repo(tmp_path)
48
+
49
+ class _Store:
50
+ def __enter__(self) -> _Store:
51
+ return self
52
+
53
+ def __exit__(self, *_args: object) -> None:
54
+ return None
55
+
56
+ def backup(self) -> Path:
57
+ backup = tmp_path / ".chronomemory" / "backup" / "save.wal"
58
+ backup.parent.mkdir(exist_ok=True)
59
+ backup.write_text("backup\n", encoding="utf-8")
60
+ return backup
61
+
62
+ def _append_metric(self, _record: object) -> None: # type: ignore[no-untyped-def]
63
+ wal = self._root / ".chronomemory" / "events.wal"
64
+ with wal.open("a", encoding="utf-8") as stream:
65
+ stream.write('{"kind":"session_metric","command":"save"}\n')
66
+
67
+ monkeypatch.setattr("specsmith.esdb.ESDB_BACKEND", "chronomemory")
68
+ monkeypatch.setattr("specsmith.esdb.open_default_store", lambda *_args, **_kwargs: _Store())
69
+ monkeypatch.setattr("specsmith.project_metrics.MetricsStore.append", _append_metric)
70
+
71
+ result = CliRunner().invoke(
72
+ main, ["save", "--project-dir", str(tmp_path), "--no-push", "--json"]
73
+ )
74
+
75
+ assert result.exit_code == 0, result.output
76
+ assert json.loads(result.output)["ok"] is True
77
+ assert _git(tmp_path, "status", "--short") == ""
78
+ assert ".chronomemory/events.wal" in _git(tmp_path, "show", "--format=", "--name-only", "HEAD")
File without changes
File without changes
File without changes