specsmith 0.15.3.dev573__tar.gz → 0.15.3.dev585__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 (321) hide show
  1. {specsmith-0.15.3.dev573/src/specsmith.egg-info → specsmith-0.15.3.dev585}/PKG-INFO +43 -6
  2. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/README.md +42 -5
  3. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/pyproject.toml +1 -1
  4. specsmith-0.15.3.dev585/src/specsmith/approvals.py +124 -0
  5. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/auditor.py +75 -0
  6. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/cli.py +314 -18
  7. specsmith-0.15.3.dev585/src/specsmith/commands/issues_policy.py +241 -0
  8. specsmith-0.15.3.dev585/src/specsmith/commands/reporting.py +891 -0
  9. specsmith-0.15.3.dev585/src/specsmith/dashboard.py +125 -0
  10. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/esdb/__init__.py +2 -1
  11. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/esdb/sqlite_store.py +107 -2
  12. specsmith-0.15.3.dev585/src/specsmith/governed_pr.py +76 -0
  13. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/ledger.py +22 -0
  14. specsmith-0.15.3.dev585/src/specsmith/plugins.py +179 -0
  15. specsmith-0.15.3.dev585/src/specsmith/policy.py +125 -0
  16. specsmith-0.15.3.dev585/src/specsmith/recover.py +69 -0
  17. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/requirements.py +2 -1
  18. specsmith-0.15.3.dev585/src/specsmith/risk.py +148 -0
  19. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/sync.py +14 -4
  20. specsmith-0.15.3.dev585/src/specsmith/transcripts.py +140 -0
  21. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/wi_store.py +16 -0
  22. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585/src/specsmith.egg-info}/PKG-INFO +43 -6
  23. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith.egg-info/SOURCES.txt +17 -0
  24. specsmith-0.15.3.dev585/tests/test_architecture.py +56 -0
  25. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_esdb_sqlite.py +37 -0
  26. specsmith-0.15.3.dev585/tests/test_esdb_verify_chain_cli.py +35 -0
  27. specsmith-0.15.3.dev585/tests/test_golden_path.py +53 -0
  28. specsmith-0.15.3.dev585/tests/test_init_modes.py +114 -0
  29. specsmith-0.15.3.dev585/tests/test_issue_policy_features.py +170 -0
  30. specsmith-0.15.3.dev585/tests/test_reporting_commands.py +197 -0
  31. specsmith-0.15.3.dev585/tests/test_schema_migrations.py +66 -0
  32. specsmith-0.15.3.dev585/tests/test_typing_guardrails.py +16 -0
  33. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_warp_parity_followup.py +1 -0
  34. specsmith-0.15.3.dev573/src/specsmith/plugins.py +0 -78
  35. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/LICENSE +0 -0
  36. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/setup.cfg +0 -0
  37. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/__init__.py +0 -0
  38. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/belief.py +0 -0
  39. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/certainty.py +0 -0
  40. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/failure_graph.py +0 -0
  41. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/py.typed +0 -0
  42. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/recovery.py +0 -0
  43. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/session.py +0 -0
  44. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/stress_tester.py +0 -0
  45. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/epistemic/trace.py +0 -0
  46. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/__init__.py +0 -0
  47. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/__main__.py +0 -0
  48. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/__init__.py +0 -0
  49. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/broker.py +0 -0
  50. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/chat_runner.py +0 -0
  51. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/cleanup.py +0 -0
  52. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/context_seed.py +0 -0
  53. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/core.py +0 -0
  54. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/__init__.py +0 -0
  55. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/_status.py +0 -0
  56. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/dag.py +0 -0
  57. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  58. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/events.py +0 -0
  59. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/dispatch/result.py +0 -0
  60. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/endpoints.py +0 -0
  61. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/events.py +0 -0
  62. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/execution_profiles.py +0 -0
  63. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/fallback.py +0 -0
  64. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/hf_leaderboard.py +0 -0
  65. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/hf_sync.py +0 -0
  66. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/indexer.py +0 -0
  67. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/llm_client.py +0 -0
  68. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/mcp.py +0 -0
  69. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/memory.py +0 -0
  70. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/model_intelligence.py +0 -0
  71. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/model_profiles.py +0 -0
  72. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/orchestrator.py +0 -0
  73. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/permissions.py +0 -0
  74. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/profiles.py +0 -0
  75. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/provider_registry.py +0 -0
  76. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/repl.py +0 -0
  77. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/router.py +0 -0
  78. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/rules.py +0 -0
  79. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/runner.py +0 -0
  80. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/safety.py +0 -0
  81. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/spawner.py +0 -0
  82. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/suggester.py +0 -0
  83. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/teams.py +0 -0
  84. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/tools.py +0 -0
  85. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/verifier.py +0 -0
  86. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/agent/voice.py +0 -0
  87. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/architect.py +0 -0
  88. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/auth.py +0 -0
  89. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/block_export.py +0 -0
  90. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/channel.py +0 -0
  91. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/ci_manager.py +0 -0
  92. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/commands/__init__.py +0 -0
  93. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/commands/intelligence.py +0 -0
  94. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/__init__.py +0 -0
  95. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/_compat.py +0 -0
  96. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/checker.py +0 -0
  97. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/evidence.py +0 -0
  98. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/regulations.py +0 -0
  99. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compliance/reporter.py +0 -0
  100. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/compressor.py +0 -0
  101. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/config.py +0 -0
  102. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/console_utils.py +0 -0
  103. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/context_orchestrator.py +0 -0
  104. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/context_window.py +0 -0
  105. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/credit_analyzer.py +0 -0
  106. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/credits.py +0 -0
  107. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/__init__.py +0 -0
  108. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/base.py +0 -0
  109. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/citations.py +0 -0
  110. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/fpd.py +0 -0
  111. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/odp.py +0 -0
  112. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/patentsview.py +0 -0
  113. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/pfw.py +0 -0
  114. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/ppubs.py +0 -0
  115. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/datasources/ptab.py +0 -0
  116. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/differ.py +0 -0
  117. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/doctor.py +0 -0
  118. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/drive.py +0 -0
  119. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/editor.py +0 -0
  120. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/__init__.py +0 -0
  121. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/belief.py +0 -0
  122. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/certainty.py +0 -0
  123. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/failure_graph.py +0 -0
  124. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/recovery.py +0 -0
  125. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/epistemic/stress_tester.py +0 -0
  126. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/esdb/_license.py +0 -0
  127. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/esdb/bridge.py +0 -0
  128. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/eval/__init__.py +0 -0
  129. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/eval/builtins.py +0 -0
  130. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/eval/runner.py +0 -0
  131. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/executor.py +0 -0
  132. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/exporter.py +0 -0
  133. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/governance_logic.py +0 -0
  134. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/governance_store.py +0 -0
  135. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/governance_yaml.py +0 -0
  136. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/__init__.py +0 -0
  137. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/app.py +0 -0
  138. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/main_window.py +0 -0
  139. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/session_tab.py +0 -0
  140. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/theme.py +0 -0
  141. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/__init__.py +0 -0
  142. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/chat_view.py +0 -0
  143. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/input_bar.py +0 -0
  144. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  145. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/token_meter.py +0 -0
  146. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  147. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/widgets/update_checker.py +0 -0
  148. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/gui/worker.py +0 -0
  149. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/history_search.py +0 -0
  150. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/importer.py +0 -0
  151. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/instinct.py +0 -0
  152. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/__init__.py +0 -0
  153. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/agent_skill.py +0 -0
  154. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/aider.py +0 -0
  155. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/base.py +0 -0
  156. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/claude_code.py +0 -0
  157. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/codity.py +0 -0
  158. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/copilot.py +0 -0
  159. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/cursor.py +0 -0
  160. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/gemini.py +0 -0
  161. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/integrations/windsurf.py +0 -0
  162. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/issue_reporter.py +0 -0
  163. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/languages.py +0 -0
  164. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/mcp_generator.py +0 -0
  165. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/mcp_server.py +0 -0
  166. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/__init__.py +0 -0
  167. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  168. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  169. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  170. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  171. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  172. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/m006_session_governance.py +0 -0
  173. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/migrations/runner.py +0 -0
  174. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/ollama_cmds.py +0 -0
  175. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/patent.py +0 -0
  176. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/paths.py +0 -0
  177. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/phase.py +0 -0
  178. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/profiles.py +0 -0
  179. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/rate_limits.py +0 -0
  180. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/releaser.py +0 -0
  181. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/requirements_parser.py +0 -0
  182. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/retrieval.py +0 -0
  183. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/safe_write.py +0 -0
  184. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/scaffolder.py +0 -0
  185. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/serve.py +0 -0
  186. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/session.py +0 -0
  187. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/session_init.py +0 -0
  188. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/session_store.py +0 -0
  189. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/__init__.py +0 -0
  190. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/ai_agents.py +0 -0
  191. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/cloud.py +0 -0
  192. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/corporate.py +0 -0
  193. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/cross_platform.py +0 -0
  194. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/data_engineering.py +0 -0
  195. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/devops.py +0 -0
  196. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/docs.py +0 -0
  197. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/embedded.py +0 -0
  198. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/governance.py +0 -0
  199. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/hardware.py +0 -0
  200. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/mobile.py +0 -0
  201. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/platform_engineering.py +0 -0
  202. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/productivity.py +0 -0
  203. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/software_engineering.py +0 -0
  204. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/specsmith_skills.py +0 -0
  205. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/ssh.py +0 -0
  206. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills/web_backend.py +0 -0
  207. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/skills_builder.py +0 -0
  208. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/agents.md.j2 +0 -0
  209. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  210. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  211. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  212. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  213. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  214. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  215. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  216. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/community/security.md.j2 +0 -0
  217. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  218. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  219. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  220. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  221. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  222. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/editorconfig.j2 +0 -0
  223. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/gitattributes.j2 +0 -0
  224. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/gitignore.j2 +0 -0
  225. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/go/go.mod.j2 +0 -0
  226. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/go/main.go.j2 +0 -0
  227. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  228. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  229. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  230. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  231. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  232. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  233. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  234. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  235. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  236. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  237. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  238. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/js/package.json.j2 +0 -0
  239. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/ledger.md.j2 +0 -0
  240. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/python/cli.py.j2 +0 -0
  241. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/python/init.py.j2 +0 -0
  242. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  243. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/readme.md.j2 +0 -0
  244. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  245. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  246. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  247. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  248. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  249. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  250. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  251. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  252. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  253. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/tool_installer.py +0 -0
  254. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/toolrules.py +0 -0
  255. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/tools.py +0 -0
  256. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/trace.py +0 -0
  257. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/updater.py +0 -0
  258. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/upgrader.py +0 -0
  259. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/validator.py +0 -0
  260. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs/__init__.py +0 -0
  261. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs/base.py +0 -0
  262. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs/bitbucket.py +0 -0
  263. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs/github.py +0 -0
  264. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs/gitlab.py +0 -0
  265. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/vcs_commands.py +0 -0
  266. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/wireframes.py +0 -0
  267. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith/workspace.py +0 -0
  268. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith.egg-info/dependency_links.txt +0 -0
  269. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith.egg-info/entry_points.txt +0 -0
  270. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith.egg-info/requires.txt +0 -0
  271. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/src/specsmith.egg-info/top_level.txt +0 -0
  272. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_CMD_001.py +0 -0
  273. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_agent_profiles.py +0 -0
  274. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_agent_run_feedback.py +0 -0
  275. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_agent_runner_ready.py +0 -0
  276. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_ai_client.py +0 -0
  277. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_ai_intelligence.py +0 -0
  278. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_auditor.py +0 -0
  279. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_channel.py +0 -0
  280. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_chat_diff_decision.py +0 -0
  281. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_chat_runner_openai_compat.py +0 -0
  282. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_chat_stdin_protocol.py +0 -0
  283. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_cli.py +0 -0
  284. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_cli_regressions.py +0 -0
  285. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_cli_workflows_history_drive.py +0 -0
  286. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_compliance.py +0 -0
  287. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_compliance_governance.py +0 -0
  288. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_compressor.py +0 -0
  289. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_dispatch.py +0 -0
  290. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_e2e_nexus.py +0 -0
  291. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_endpoints_cli.py +0 -0
  292. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_endpoints_store.py +0 -0
  293. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_epistemic.py +0 -0
  294. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_esdb_enforcement.py +0 -0
  295. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_esdb_license.py +0 -0
  296. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_fallback_chain.py +0 -0
  297. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_importer.py +0 -0
  298. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_integrations.py +0 -0
  299. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_integrations_codity.py +0 -0
  300. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_intelligence.py +0 -0
  301. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_issue_reporter.py +0 -0
  302. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_mcp_client.py +0 -0
  303. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_mcp_server.py +0 -0
  304. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_new_modules.py +0 -0
  305. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_nexus.py +0 -0
  306. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_permissions.py +0 -0
  307. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_phase1_4_new.py +0 -0
  308. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_phase34_completion.py +0 -0
  309. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_rate_limits.py +0 -0
  310. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_req_248_262.py +0 -0
  311. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_req_358_359.py +0 -0
  312. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_scaffolder.py +0 -0
  313. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_skill_marketplace.py +0 -0
  314. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_skills_mcp.py +0 -0
  315. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_smoke.py +0 -0
  316. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_suggester.py +0 -0
  317. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_tools.py +0 -0
  318. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_validator.py +0 -0
  319. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_vcs.py +0 -0
  320. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_warp_parity.py +0 -0
  321. {specsmith-0.15.3.dev573 → specsmith-0.15.3.dev585}/tests/test_wi_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.15.3.dev573
3
+ Version: 0.15.3.dev585
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
@@ -85,13 +85,30 @@ Dynamic: license-file
85
85
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
86
86
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/layer1labs/specsmith/blob/main/LICENSE)
87
87
 
88
- **Applied Epistemic Engineering toolkit for AI-assisted development.**
88
+ SpecSmith is the governance layer for AI-assisted development: it sits between agents and your repo, enforces preflight decisions, and records requirement/test traceability with auditable evidence. It is **not** an IDE, autonomous coding agent, CI runner, or legal-compliance certifier. Use SpecSmith when changes need repeatable controls, work-item lineage, and review-ready artifacts; do not use it for throwaway prototyping where governance overhead is unnecessary. Compared with GitHub Spec Kit, OpenSpec, and BMAD, SpecSmith adds execution-time policy gates and trace chains. Compared with Aider, Claude Code, and Cursor, SpecSmith governs those clients instead of replacing them. Compared with LangGraph and AutoGen, SpecSmith prioritizes software-governance outcomes and evidence quality over general-purpose multi-agent orchestration.
89
89
 
90
- > Intelligence proposes. Constraints decide. The ledger remembers.
90
+ ## Architecture at a glance
91
91
 
92
- specsmith treats belief systems like code: codable, testable, and deployable. It scaffolds
93
- epistemically-governed projects, stress-tests requirements as BeliefArtifacts, runs
94
- cryptographically-sealed trace vaults, and orchestrates AI agents under formal AEE governance.
92
+ ```mermaid
93
+ flowchart LR
94
+ A[AI Agents / IDE Clients] --> B[SpecSmith Governance Layer]
95
+ B --> C[Repository Files]
96
+ B --> D[Requirements and Tests]
97
+ B --> E[ESDB / Audit Ledger]
98
+ E --> F[CI and MCP Integrations]
99
+ D --> F
100
+ ```
101
+
102
+ ## When to use / when not to use
103
+
104
+ - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
105
+ - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
106
+
107
+ ## Comparison summary
108
+
109
+ - **GitHub Spec Kit / OpenSpec / BMAD:** strong specification practices; SpecSmith adds execution-time governance, work-item lifecycle control, and trace-chain evidence.
110
+ - **Aider / Claude Code / Cursor:** agentic coding interfaces; SpecSmith is the policy and evidence layer around these clients.
111
+ - **LangGraph / AutoGen:** orchestration frameworks; SpecSmith is a governance-first development layer with compliance-oriented traceability.
95
112
 
96
113
  **v0.15.2 — PyPI-safe README links, RTD nav coverage, updated security policy, and expanded embedded skill catalog (Zephyr 4.4→3.x, FreeRTOS, bare-metal C).**
97
114
  specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
@@ -180,6 +197,18 @@ specsmith phase list # list all phases
180
197
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
181
198
  of file/command criteria, recommended commands, and a readiness percentage.
182
199
 
200
+ ## 1.0 release criteria status
201
+
202
+ | Criterion | Status | Source |
203
+ |---|---|---|
204
+ | Stable CLI core contract documented | In progress | `docs/stability.md` |
205
+ | Stable generated file schemas documented | In progress | `docs/stability.md` |
206
+ | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
207
+ | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
208
+ | Security threat model documented | In progress | `docs/security-threat-model.md` |
209
+ | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
210
+ | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
211
+
183
212
  ---
184
213
 
185
214
  ## Install
@@ -224,6 +253,8 @@ in your own application without managing a pipx environment.
224
253
  | **Default** | `specsmith` (built-in) | MIT, free | SQLite backend — requirements, test cases, confidence filtering |
225
254
  | **Commercial** | `chronomemory` via `specsmith[esdb]` | Proprietary — license required | ChronoStore: tamper-evident SHA-256 WAL, OEA anti-hallucination fields, Rust acceleration, epistemic rollback |
226
255
 
256
+ See `docs/editions.md` for the full OSS vs commercial feature matrix.
257
+
227
258
  `pip install specsmith` always installs the **free SQLite backend** automatically.
228
259
  No additional packages, no license key, no configuration — it works out of the box.
229
260
 
@@ -1187,8 +1218,14 @@ command reference, project types, tool registry, governance model, ESDB, skills
1187
1218
 
1188
1219
  - [PyPI](https://pypi.org/project/specsmith/)
1189
1220
  - [Documentation](https://specsmith.readthedocs.io)
1221
+ - [Stability Contract](https://github.com/layer1labs/specsmith/blob/main/docs/stability.md)
1222
+ - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/main/docs/roadmap/1.0-criteria.md)
1223
+ - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/editions.md)
1190
1224
  - [Changelog](https://github.com/layer1labs/specsmith/blob/main/CHANGELOG.md)
1191
1225
  - [Contributing](https://github.com/layer1labs/specsmith/blob/main/CONTRIBUTING.md)
1226
+ - [Roadmap](https://github.com/layer1labs/specsmith/blob/main/ROADMAP.md)
1227
+ - [Compatibility Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/site/compatibility.md)
1228
+ - [Product Principles](https://github.com/layer1labs/specsmith/blob/main/docs/product-principles.md)
1192
1229
  - [Security](https://github.com/layer1labs/specsmith/blob/main/SECURITY.md)
1193
1230
 
1194
1231
  ## License
@@ -7,13 +7,30 @@
7
7
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
8
8
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/layer1labs/specsmith/blob/main/LICENSE)
9
9
 
10
- **Applied Epistemic Engineering toolkit for AI-assisted development.**
10
+ SpecSmith is the governance layer for AI-assisted development: it sits between agents and your repo, enforces preflight decisions, and records requirement/test traceability with auditable evidence. It is **not** an IDE, autonomous coding agent, CI runner, or legal-compliance certifier. Use SpecSmith when changes need repeatable controls, work-item lineage, and review-ready artifacts; do not use it for throwaway prototyping where governance overhead is unnecessary. Compared with GitHub Spec Kit, OpenSpec, and BMAD, SpecSmith adds execution-time policy gates and trace chains. Compared with Aider, Claude Code, and Cursor, SpecSmith governs those clients instead of replacing them. Compared with LangGraph and AutoGen, SpecSmith prioritizes software-governance outcomes and evidence quality over general-purpose multi-agent orchestration.
11
+
12
+ ## Architecture at a glance
13
+
14
+ ```mermaid
15
+ flowchart LR
16
+ A[AI Agents / IDE Clients] --> B[SpecSmith Governance Layer]
17
+ B --> C[Repository Files]
18
+ B --> D[Requirements and Tests]
19
+ B --> E[ESDB / Audit Ledger]
20
+ E --> F[CI and MCP Integrations]
21
+ D --> F
22
+ ```
23
+
24
+ ## When to use / when not to use
11
25
 
12
- > Intelligence proposes. Constraints decide. The ledger remembers.
26
+ - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
27
+ - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
13
28
 
14
- specsmith treats belief systems like code: codable, testable, and deployable. It scaffolds
15
- epistemically-governed projects, stress-tests requirements as BeliefArtifacts, runs
16
- cryptographically-sealed trace vaults, and orchestrates AI agents under formal AEE governance.
29
+ ## Comparison summary
30
+
31
+ - **GitHub Spec Kit / OpenSpec / BMAD:** strong specification practices; SpecSmith adds execution-time governance, work-item lifecycle control, and trace-chain evidence.
32
+ - **Aider / Claude Code / Cursor:** agentic coding interfaces; SpecSmith is the policy and evidence layer around these clients.
33
+ - **LangGraph / AutoGen:** orchestration frameworks; SpecSmith is a governance-first development layer with compliance-oriented traceability.
17
34
 
18
35
  **v0.15.2 — PyPI-safe README links, RTD nav coverage, updated security policy, and expanded embedded skill catalog (Zephyr 4.4→3.x, FreeRTOS, bare-metal C).**
19
36
  specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689)
@@ -102,6 +119,18 @@ specsmith phase list # list all phases
102
119
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
103
120
  of file/command criteria, recommended commands, and a readiness percentage.
104
121
 
122
+ ## 1.0 release criteria status
123
+
124
+ | Criterion | Status | Source |
125
+ |---|---|---|
126
+ | Stable CLI core contract documented | In progress | `docs/stability.md` |
127
+ | Stable generated file schemas documented | In progress | `docs/stability.md` |
128
+ | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
129
+ | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
130
+ | Security threat model documented | In progress | `docs/security-threat-model.md` |
131
+ | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
132
+ | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
133
+
105
134
  ---
106
135
 
107
136
  ## Install
@@ -146,6 +175,8 @@ in your own application without managing a pipx environment.
146
175
  | **Default** | `specsmith` (built-in) | MIT, free | SQLite backend — requirements, test cases, confidence filtering |
147
176
  | **Commercial** | `chronomemory` via `specsmith[esdb]` | Proprietary — license required | ChronoStore: tamper-evident SHA-256 WAL, OEA anti-hallucination fields, Rust acceleration, epistemic rollback |
148
177
 
178
+ See `docs/editions.md` for the full OSS vs commercial feature matrix.
179
+
149
180
  `pip install specsmith` always installs the **free SQLite backend** automatically.
150
181
  No additional packages, no license key, no configuration — it works out of the box.
151
182
 
@@ -1109,8 +1140,14 @@ command reference, project types, tool registry, governance model, ESDB, skills
1109
1140
 
1110
1141
  - [PyPI](https://pypi.org/project/specsmith/)
1111
1142
  - [Documentation](https://specsmith.readthedocs.io)
1143
+ - [Stability Contract](https://github.com/layer1labs/specsmith/blob/main/docs/stability.md)
1144
+ - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/main/docs/roadmap/1.0-criteria.md)
1145
+ - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/editions.md)
1112
1146
  - [Changelog](https://github.com/layer1labs/specsmith/blob/main/CHANGELOG.md)
1113
1147
  - [Contributing](https://github.com/layer1labs/specsmith/blob/main/CONTRIBUTING.md)
1148
+ - [Roadmap](https://github.com/layer1labs/specsmith/blob/main/ROADMAP.md)
1149
+ - [Compatibility Matrix](https://github.com/layer1labs/specsmith/blob/main/docs/site/compatibility.md)
1150
+ - [Product Principles](https://github.com/layer1labs/specsmith/blob/main/docs/product-principles.md)
1114
1151
  - [Security](https://github.com/layer1labs/specsmith/blob/main/SECURITY.md)
1115
1152
 
1116
1153
  ## License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.15.3.dev573"
7
+ version = "0.15.3.dev585"
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"
@@ -0,0 +1,124 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import subprocess
5
+ import time
6
+ from dataclasses import asdict, dataclass
7
+ from pathlib import Path
8
+ from typing import Any
9
+
10
+ APPROVAL_TYPES = ("requirement", "plan", "implementation", "verification", "release")
11
+
12
+
13
+ @dataclass
14
+ class ApprovalRecord:
15
+ approval_type: str
16
+ work_item_id: str
17
+ approver: str
18
+ timestamp: str
19
+ scope: str
20
+ rationale: str
21
+ requirement_ids: list[str]
22
+
23
+ def to_dict(self) -> dict[str, Any]:
24
+ return asdict(self)
25
+
26
+
27
+ def _now_iso() -> str:
28
+ return time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
29
+
30
+
31
+ def _approvals_path(root: Path) -> Path:
32
+ return root / ".specsmith" / "approvals.json"
33
+
34
+
35
+ def load_approvals(root: Path) -> list[ApprovalRecord]:
36
+ path = _approvals_path(root)
37
+ if not path.is_file():
38
+ return []
39
+ try:
40
+ raw = json.loads(path.read_text(encoding="utf-8"))
41
+ except (OSError, ValueError):
42
+ return []
43
+ if not isinstance(raw, list):
44
+ return []
45
+ out: list[ApprovalRecord] = []
46
+ for row in raw:
47
+ if isinstance(row, dict):
48
+ out.append(
49
+ ApprovalRecord(
50
+ approval_type=str(row.get("approval_type", "")),
51
+ work_item_id=str(row.get("work_item_id", "")),
52
+ approver=str(row.get("approver", "")),
53
+ timestamp=str(row.get("timestamp", "")),
54
+ scope=str(row.get("scope", "")),
55
+ rationale=str(row.get("rationale", "")),
56
+ requirement_ids=list(row.get("requirement_ids", []) or []),
57
+ )
58
+ )
59
+ return out
60
+
61
+
62
+ def save_approvals(root: Path, approvals: list[ApprovalRecord]) -> None:
63
+ path = _approvals_path(root)
64
+ path.parent.mkdir(parents=True, exist_ok=True)
65
+ path.write_text(
66
+ json.dumps([a.to_dict() for a in approvals], indent=2, ensure_ascii=False),
67
+ encoding="utf-8",
68
+ )
69
+
70
+
71
+ def detect_approver(root: Path) -> str:
72
+ def _git_config(key: str) -> str:
73
+ try:
74
+ proc = subprocess.run(
75
+ ["git", "-C", str(root), "config", "--get", key],
76
+ check=False,
77
+ capture_output=True,
78
+ text=True,
79
+ timeout=5,
80
+ )
81
+ except Exception: # noqa: BLE001
82
+ return ""
83
+ return (proc.stdout or "").strip()
84
+
85
+ name = _git_config("user.name")
86
+ email = _git_config("user.email")
87
+ if name and email:
88
+ return f"{name} <{email}>"
89
+ if name:
90
+ return name
91
+ if email:
92
+ return email
93
+ return "unknown-approver"
94
+
95
+
96
+ def record_approval(
97
+ root: Path,
98
+ approval_type: str,
99
+ work_item_id: str,
100
+ rationale: str,
101
+ *,
102
+ scope: str = "",
103
+ requirement_ids: list[str] | None = None,
104
+ ) -> ApprovalRecord:
105
+ if approval_type not in APPROVAL_TYPES:
106
+ msg = f"approval_type must be one of {APPROVAL_TYPES}"
107
+ raise ValueError(msg)
108
+ approvals = load_approvals(root)
109
+ record = ApprovalRecord(
110
+ approval_type=approval_type,
111
+ work_item_id=work_item_id,
112
+ approver=detect_approver(root),
113
+ timestamp=_now_iso(),
114
+ scope=scope or work_item_id,
115
+ rationale=rationale.strip(),
116
+ requirement_ids=list(requirement_ids or []),
117
+ )
118
+ approvals.append(record)
119
+ save_approvals(root, approvals)
120
+ return record
121
+
122
+
123
+ def approvals_by_work_item(root: Path, work_item_id: str) -> list[ApprovalRecord]:
124
+ return [a for a in load_approvals(root) if a.work_item_id == work_item_id]
@@ -1281,6 +1281,79 @@ def check_cross_repo_dependencies(root: Path) -> list[AuditResult]:
1281
1281
  return results
1282
1282
 
1283
1283
 
1284
+ def check_policy_validation(root: Path) -> list[AuditResult]:
1285
+ results: list[AuditResult] = []
1286
+ from specsmith.policy import load_policy
1287
+
1288
+ policy, errors = load_policy(root)
1289
+ if errors:
1290
+ for err in errors:
1291
+ results.append(
1292
+ AuditResult(
1293
+ name="policy-validation",
1294
+ passed=False,
1295
+ message=f"policy.yml invalid: {err}",
1296
+ )
1297
+ )
1298
+ return results
1299
+ if (root / ".specsmith" / "policy.yml").is_file():
1300
+ results.append(
1301
+ AuditResult(
1302
+ name="policy-validation",
1303
+ passed=True,
1304
+ message=f"policy.yml valid (risk_threshold={policy.risk_threshold})",
1305
+ )
1306
+ )
1307
+ return results
1308
+
1309
+
1310
+ def check_work_item_risk_gates(root: Path) -> list[AuditResult]:
1311
+ results: list[AuditResult] = []
1312
+ from specsmith.approvals import approvals_by_work_item
1313
+ from specsmith.risk import assess_all_work_items
1314
+ from specsmith.wi_store import WorkItemStore
1315
+
1316
+ store = WorkItemStore(root)
1317
+ items = {item.id: item for item in store.load()}
1318
+ if not items:
1319
+ return results
1320
+ for wi_id, risk in assess_all_work_items(root):
1321
+ item = items.get(wi_id)
1322
+ if item is None:
1323
+ continue
1324
+ approvals = {a.approval_type for a in approvals_by_work_item(root, wi_id)}
1325
+ missing_gates: list[str] = []
1326
+ if (
1327
+ "human_approval:implementation" in risk.required_gates
1328
+ and "implementation" not in approvals
1329
+ ):
1330
+ missing_gates.append("implementation approval")
1331
+ if "human_approval:verification" in risk.required_gates and "verification" not in approvals:
1332
+ missing_gates.append("verification approval")
1333
+ if "tests_required" in risk.required_gates and not item.test_case_ids:
1334
+ missing_gates.append("linked tests")
1335
+ if missing_gates:
1336
+ results.append(
1337
+ AuditResult(
1338
+ name=f"risk-gates:{wi_id}",
1339
+ passed=False,
1340
+ message=(
1341
+ f"{wi_id} risk={risk.level} missing gates: {', '.join(missing_gates)}"
1342
+ + (f" (override: {risk.override_reason})" if risk.overridden else "")
1343
+ ),
1344
+ )
1345
+ )
1346
+ else:
1347
+ results.append(
1348
+ AuditResult(
1349
+ name=f"risk-gates:{wi_id}",
1350
+ passed=True,
1351
+ message=f"{wi_id} risk={risk.level} gates satisfied",
1352
+ )
1353
+ )
1354
+ return results
1355
+
1356
+
1284
1357
  def run_audit(root: Path) -> AuditReport:
1285
1358
  """Run all audit checks and return a report."""
1286
1359
  report = AuditReport()
@@ -1298,6 +1371,8 @@ def run_audit(root: Path) -> AuditReport:
1298
1371
  report.results.extend(check_industrial_artifacts(root))
1299
1372
  report.results.extend(check_derived_artifacts(root))
1300
1373
  report.results.extend(check_cross_repo_dependencies(root))
1374
+ report.results.extend(check_policy_validation(root))
1375
+ report.results.extend(check_work_item_risk_gates(root))
1301
1376
 
1302
1377
  # Apply accepted_warnings / audit_suppressions from scaffold.yml (REQ-357)
1303
1378
  raw = _read_scaffold_raw(root)