specsmith 0.21.0.dev787__tar.gz → 0.22.1__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 (393) hide show
  1. {specsmith-0.21.0.dev787/src/specsmith.egg-info → specsmith-0.22.1}/PKG-INFO +50 -16
  2. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/README.md +48 -12
  3. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/pyproject.toml +5 -5
  4. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/__init__.py +1 -1
  5. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/advanced_code_analysis.py +1 -1
  6. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/cleanup.py +2 -2
  7. specsmith-0.22.1/src/specsmith/chat_handoff.py +107 -0
  8. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/cli.py +145 -7
  9. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/zoo_code.py +19 -0
  10. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/config.py +7 -4
  11. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/context_orchestrator.py +5 -4
  12. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/importer.py +3 -1
  13. specsmith-0.22.1/src/specsmith/improvement_tracker.py +186 -0
  14. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/warp.py +1 -1
  15. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/__init__.py +4 -0
  16. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m006_session_governance.py +1 -1
  17. specsmith-0.22.1/src/specsmith/migrations/m011_windows_skill_shell.py +64 -0
  18. specsmith-0.22.1/src/specsmith/migrations/m012_normalize_skill_shell.py +56 -0
  19. specsmith-0.22.1/src/specsmith/model_optimizer.py +182 -0
  20. specsmith-0.22.1/src/specsmith/model_registry.py +970 -0
  21. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/quality_report.py +5 -2
  22. specsmith-0.22.1/src/specsmith/release_guard.py +36 -0
  23. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session_store.py +82 -0
  24. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/__init__.py +55 -59
  25. specsmith-0.22.1/src/specsmith/skills/governance.py +523 -0
  26. specsmith-0.22.1/src/specsmith/skills/specsmith_core_commands.py +355 -0
  27. specsmith-0.22.1/src/specsmith/skills/specsmith_operations.py +67 -0
  28. specsmith-0.22.1/src/specsmith/skills/specsmith_skills.py +110 -0
  29. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/sync.py +34 -11
  30. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/agents.md.j2 +1 -1
  31. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/contributing.md.j2 +16 -1
  32. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/gitignore.j2 +5 -1
  33. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/updater.py +24 -2
  34. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs_commands.py +33 -14
  35. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/wi_store.py +9 -2
  36. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/workspace.py +1 -1
  37. {specsmith-0.21.0.dev787 → specsmith-0.22.1/src/specsmith.egg-info}/PKG-INFO +50 -16
  38. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/SOURCES.txt +20 -1
  39. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/requires.txt +1 -3
  40. specsmith-0.22.1/tests/test_branch_workflow.py +88 -0
  41. specsmith-0.22.1/tests/test_chat_handoff.py +80 -0
  42. specsmith-0.22.1/tests/test_docs_artifacts.py +19 -0
  43. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_enforcement.py +101 -2
  44. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_license.py +12 -0
  45. specsmith-0.22.1/tests/test_improvement_tracker.py +242 -0
  46. specsmith-0.22.1/tests/test_migrations_skill_shell.py +58 -0
  47. specsmith-0.22.1/tests/test_model_registry.py +260 -0
  48. specsmith-0.22.1/tests/test_release_guard.py +41 -0
  49. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_scaffolder.py +3 -1
  50. specsmith-0.22.1/tests/test_session_events.py +53 -0
  51. specsmith-0.22.1/tests/test_updater.py +16 -0
  52. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_warp_parity_followup.py +25 -1
  53. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_wi_lifecycle.py +14 -0
  54. specsmith-0.22.1/tests/test_windows_launcher.py +40 -0
  55. specsmith-0.21.0.dev787/src/specsmith/skills/governance.py +0 -1370
  56. specsmith-0.21.0.dev787/src/specsmith/skills/specsmith_skills.py +0 -29
  57. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/LICENSE +0 -0
  58. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/setup.cfg +0 -0
  59. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/__init__.py +0 -0
  60. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/belief.py +0 -0
  61. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/certainty.py +0 -0
  62. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/failure_graph.py +0 -0
  63. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/py.typed +0 -0
  64. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/recovery.py +0 -0
  65. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/session.py +0 -0
  66. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/stress_tester.py +0 -0
  67. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/epistemic/trace.py +0 -0
  68. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/__main__.py +0 -0
  69. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/__init__.py +0 -0
  70. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/broker.py +0 -0
  71. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/chat_runner.py +0 -0
  72. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/context_seed.py +0 -0
  73. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/core.py +0 -0
  74. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/__init__.py +0 -0
  75. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/_status.py +0 -0
  76. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/dag.py +0 -0
  77. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  78. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/events.py +0 -0
  79. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/dispatch/result.py +0 -0
  80. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/endpoints.py +0 -0
  81. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/events.py +0 -0
  82. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/execution_profiles.py +0 -0
  83. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/fallback.py +0 -0
  84. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/hf_leaderboard.py +0 -0
  85. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/hf_sync.py +0 -0
  86. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/indexer.py +0 -0
  87. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/llm_client.py +0 -0
  88. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/mcp.py +0 -0
  89. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/memory.py +0 -0
  90. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_intelligence.py +0 -0
  91. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_profiles.py +0 -0
  92. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/model_router.py +0 -0
  93. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/orchestrator.py +0 -0
  94. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/permissions.py +0 -0
  95. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/profiles.py +0 -0
  96. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/provider_registry.py +0 -0
  97. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/repl.py +0 -0
  98. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/router.py +0 -0
  99. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/rules.py +0 -0
  100. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/runner.py +0 -0
  101. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/safety.py +0 -0
  102. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/spawner.py +0 -0
  103. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/suggester.py +0 -0
  104. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/teams.py +0 -0
  105. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/terminal_env.py +0 -0
  106. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/token_pricing.py +0 -0
  107. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/tools.py +0 -0
  108. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/verifier.py +0 -0
  109. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/agent/voice.py +0 -0
  110. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/approvals.py +0 -0
  111. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/architect.py +0 -0
  112. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/auditor.py +0 -0
  113. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/auth.py +0 -0
  114. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/block_export.py +0 -0
  115. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/channel.py +0 -0
  116. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ci_manager.py +0 -0
  117. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/code_analysis.py +0 -0
  118. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/__init__.py +0 -0
  119. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/intelligence.py +0 -0
  120. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/issues_policy.py +0 -0
  121. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/commands/reporting.py +0 -0
  122. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/__init__.py +0 -0
  123. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/_compat.py +0 -0
  124. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/checker.py +0 -0
  125. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/evidence.py +0 -0
  126. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/regulations.py +0 -0
  127. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compliance/reporter.py +0 -0
  128. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/compressor.py +0 -0
  129. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/console_utils.py +0 -0
  130. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/context_window.py +0 -0
  131. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/credit_analyzer.py +0 -0
  132. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/credits.py +0 -0
  133. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/dashboard.py +0 -0
  134. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/__init__.py +0 -0
  135. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/base.py +0 -0
  136. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/citations.py +0 -0
  137. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/fpd.py +0 -0
  138. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/odp.py +0 -0
  139. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/patentsview.py +0 -0
  140. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/pfw.py +0 -0
  141. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/ppubs.py +0 -0
  142. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/datasources/ptab.py +0 -0
  143. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/differ.py +0 -0
  144. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/doctor.py +0 -0
  145. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/drive.py +0 -0
  146. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/editor.py +0 -0
  147. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/efficiency.py +0 -0
  148. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/__init__.py +0 -0
  149. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/belief.py +0 -0
  150. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/certainty.py +0 -0
  151. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/failure_graph.py +0 -0
  152. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/recovery.py +0 -0
  153. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/epistemic/stress_tester.py +0 -0
  154. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/__init__.py +0 -0
  155. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/_license.py +0 -0
  156. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/bridge.py +0 -0
  157. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb/sqlite_store.py +0 -0
  158. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb_sweep.py +0 -0
  159. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/esdb_writer.py +0 -0
  160. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/__init__.py +0 -0
  161. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/builtins.py +0 -0
  162. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/eval/runner.py +0 -0
  163. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/executor.py +0 -0
  164. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/exporter.py +0 -0
  165. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_logic.py +0 -0
  166. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_store.py +0 -0
  167. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governance_yaml.py +0 -0
  168. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/governed_pr.py +0 -0
  169. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/__init__.py +0 -0
  170. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/app.py +0 -0
  171. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/main_window.py +0 -0
  172. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/session_tab.py +0 -0
  173. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/theme.py +0 -0
  174. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/__init__.py +0 -0
  175. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/chat_view.py +0 -0
  176. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/input_bar.py +0 -0
  177. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  178. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/token_meter.py +0 -0
  179. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  180. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/widgets/update_checker.py +0 -0
  181. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/gui/worker.py +0 -0
  182. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/history_search.py +0 -0
  183. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/instinct.py +0 -0
  184. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/__init__.py +0 -0
  185. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/agent_skill.py +0 -0
  186. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/aider.py +0 -0
  187. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/base.py +0 -0
  188. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/claude_code.py +0 -0
  189. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/codity.py +0 -0
  190. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/copilot.py +0 -0
  191. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/cursor.py +0 -0
  192. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/gemini.py +0 -0
  193. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/integrations/windsurf.py +0 -0
  194. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/issue_reporter.py +0 -0
  195. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/languages.py +0 -0
  196. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ledger.py +0 -0
  197. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/local_model.py +0 -0
  198. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/mcp_generator.py +0 -0
  199. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/mcp_server.py +0 -0
  200. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  201. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  202. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  203. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  204. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  205. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m007_yaml_first.py +0 -0
  206. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m008_esdb_full_coverage.py +0 -0
  207. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m009_esdb_first.py +0 -0
  208. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/m010_post_esdb_cleanup.py +0 -0
  209. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/migrations/runner.py +0 -0
  210. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/ollama_cmds.py +0 -0
  211. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/patent.py +0 -0
  212. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/paths.py +0 -0
  213. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/phase.py +0 -0
  214. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/plugins.py +0 -0
  215. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/policy.py +0 -0
  216. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/profiles.py +0 -0
  217. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/project_metrics.py +0 -0
  218. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/rate_limits.py +0 -0
  219. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/recover.py +0 -0
  220. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/releaser.py +0 -0
  221. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/requirements.py +0 -0
  222. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/requirements_parser.py +0 -0
  223. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/retrieval.py +0 -0
  224. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/risk.py +0 -0
  225. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/safe_write.py +0 -0
  226. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/scaffolder.py +0 -0
  227. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/serve.py +0 -0
  228. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session.py +0 -0
  229. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/session_init.py +0 -0
  230. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/ai_agents.py +0 -0
  231. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/cloud.py +0 -0
  232. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/corporate.py +0 -0
  233. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/cross_platform.py +0 -0
  234. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/data_engineering.py +0 -0
  235. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/devops.py +0 -0
  236. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/docs.py +0 -0
  237. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/embedded.py +0 -0
  238. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/hardware.py +0 -0
  239. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/mobile.py +0 -0
  240. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/platform_engineering.py +0 -0
  241. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/productivity.py +0 -0
  242. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/software_engineering.py +0 -0
  243. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/ssh.py +0 -0
  244. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills/web_backend.py +0 -0
  245. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/skills_builder.py +0 -0
  246. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  247. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  248. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  249. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  250. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  251. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  252. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/community/security.md.j2 +0 -0
  253. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  254. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  255. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  256. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  257. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  258. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/editorconfig.j2 +0 -0
  259. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/gitattributes.j2 +0 -0
  260. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/go/go.mod.j2 +0 -0
  261. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/go/main.go.j2 +0 -0
  262. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  263. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  264. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  265. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  266. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  267. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  268. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  269. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  270. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  271. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  272. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  273. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/js/package.json.j2 +0 -0
  274. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/ledger.md.j2 +0 -0
  275. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/cli.py.j2 +0 -0
  276. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/init.py.j2 +0 -0
  277. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  278. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/readme.md.j2 +0 -0
  279. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  280. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  281. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  282. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  283. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  284. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  285. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  286. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  287. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  288. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/tool_installer.py +0 -0
  289. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/toolrules.py +0 -0
  290. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/tools.py +0 -0
  291. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/trace.py +0 -0
  292. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/transcripts.py +0 -0
  293. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/upgrader.py +0 -0
  294. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/validator.py +0 -0
  295. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/__init__.py +0 -0
  296. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/base.py +0 -0
  297. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/bitbucket.py +0 -0
  298. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/github.py +0 -0
  299. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/vcs/gitlab.py +0 -0
  300. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith/wireframes.py +0 -0
  301. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/dependency_links.txt +0 -0
  302. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/entry_points.txt +0 -0
  303. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/src/specsmith.egg-info/top_level.txt +0 -0
  304. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_CMD_001.py +0 -0
  305. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_profiles.py +0 -0
  306. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_run_feedback.py +0 -0
  307. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_agent_runner_ready.py +0 -0
  308. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_ai_client.py +0 -0
  309. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_ai_intelligence.py +0 -0
  310. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architect_interview.py +0 -0
  311. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architect_v2.py +0 -0
  312. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_architecture.py +0 -0
  313. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_audit_governance.py +0 -0
  314. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_auditor.py +0 -0
  315. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_benchmark_harness.py +0 -0
  316. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_broker_scope.py +0 -0
  317. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_channel.py +0 -0
  318. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_diff_decision.py +0 -0
  319. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_runner_openai_compat.py +0 -0
  320. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_chat_stdin_protocol.py +0 -0
  321. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cleanup_cmd.py +0 -0
  322. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli.py +0 -0
  323. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli_regressions.py +0 -0
  324. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_cli_workflows_history_drive.py +0 -0
  325. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compliance.py +0 -0
  326. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compliance_governance.py +0 -0
  327. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_compressor.py +0 -0
  328. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_deprecation_registry.py +0 -0
  329. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_dispatch.py +0 -0
  330. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_dual_write.py +0 -0
  331. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_e2e_nexus.py +0 -0
  332. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_efficiency.py +0 -0
  333. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_endpoints_cli.py +0 -0
  334. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_endpoints_store.py +0 -0
  335. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_epistemic.py +0 -0
  336. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_backend_switch.py +0 -0
  337. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_integration.py +0 -0
  338. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_sqlite.py +0 -0
  339. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_status_integrity.py +0 -0
  340. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_status_output.py +0 -0
  341. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_sweep.py +0 -0
  342. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_verify_chain_cli.py +0 -0
  343. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_esdb_writer.py +0 -0
  344. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_fallback_chain.py +0 -0
  345. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_golden_path.py +0 -0
  346. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_importer.py +0 -0
  347. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_init_modes.py +0 -0
  348. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations.py +0 -0
  349. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations_codity.py +0 -0
  350. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_integrations_warp.py +0 -0
  351. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_intelligence.py +0 -0
  352. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issue_policy_features.py +0 -0
  353. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issue_reporter.py +0 -0
  354. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_issues_263_264.py +0 -0
  355. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_local_model.py +0 -0
  356. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_markdown_deprecation.py +0 -0
  357. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_mcp_client.py +0 -0
  358. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_mcp_server.py +0 -0
  359. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_metrics_flush.py +0 -0
  360. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_migration_direction.py +0 -0
  361. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_model_router.py +0 -0
  362. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_new_modules.py +0 -0
  363. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_nexus.py +0 -0
  364. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_parallel_agents.py +0 -0
  365. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_permissions.py +0 -0
  366. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_phase1_4_new.py +0 -0
  367. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_phase34_completion.py +0 -0
  368. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_project_metrics.py +0 -0
  369. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_quality_report.py +0 -0
  370. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_rate_limits.py +0 -0
  371. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_releaser.py +0 -0
  372. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_repl.py +0 -0
  373. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_repl_extended.py +0 -0
  374. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_reporting_commands.py +0 -0
  375. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_req_248_262.py +0 -0
  376. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_req_358_359.py +0 -0
  377. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_resume_command.py +0 -0
  378. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_schema_migrations.py +0 -0
  379. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_skill_marketplace.py +0 -0
  380. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_skills_mcp.py +0 -0
  381. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_smoke.py +0 -0
  382. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_sqlite_parity.py +0 -0
  383. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_suggester.py +0 -0
  384. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_sync_reconcile.py +0 -0
  385. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_terminal_env.py +0 -0
  386. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_token_cost.py +0 -0
  387. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_tools.py +0 -0
  388. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_trace_vault_esdb.py +0 -0
  389. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_typing_guardrails.py +0 -0
  390. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_validator.py +0 -0
  391. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_vcs.py +0 -0
  392. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_warp_parity.py +0 -0
  393. {specsmith-0.21.0.dev787 → specsmith-0.22.1}/tests/test_wi_lifecycle_extended.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.21.0.dev787
3
+ Version: 0.22.1
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
@@ -27,6 +27,7 @@ Requires-Python: >=3.10
27
27
  Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
29
29
  Requires-Dist: click>=8.1
30
+ Requires-Dist: cryptography>=42.0
30
31
  Requires-Dist: jinja2>=3.1
31
32
  Requires-Dist: pyyaml>=6.0
32
33
  Requires-Dist: pydantic>=2.0
@@ -38,10 +39,8 @@ Requires-Dist: ruff>=0.4; extra == "dev"
38
39
  Requires-Dist: mypy>=1.10; extra == "dev"
39
40
  Requires-Dist: pre-commit>=3.0; extra == "dev"
40
41
  Requires-Dist: types-pyyaml>=6.0; extra == "dev"
41
- Requires-Dist: cryptography>=42.0; extra == "dev"
42
42
  Provides-Extra: esdb
43
43
  Requires-Dist: chronomemory>=0.2.7; extra == "esdb"
44
- Requires-Dist: cryptography>=42.0; extra == "esdb"
45
44
  Provides-Extra: docs
46
45
  Requires-Dist: mkdocs>=1.6; extra == "docs"
47
46
  Requires-Dist: mkdocs-material>=9.5; extra == "docs"
@@ -73,7 +72,6 @@ Requires-Dist: pytest-cov>=4.0; extra == "all"
73
72
  Requires-Dist: ruff>=0.4; extra == "all"
74
73
  Requires-Dist: mypy>=1.10; extra == "all"
75
74
  Provides-Extra: license-verify
76
- Requires-Dist: cryptography>=42.0; extra == "license-verify"
77
75
  Dynamic: license-file
78
76
 
79
77
  # specsmith
@@ -102,6 +100,8 @@ AI Agents / IDE Clients
102
100
  ## When to use / when not to use
103
101
 
104
102
  - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
103
+ - Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
104
+ - Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
105
105
  - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
106
106
 
107
107
  ## Comparison summary
@@ -124,8 +124,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
124
124
 
125
125
  **Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
126
126
 
127
+ ## Current Stats
128
+
129
+ - **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
130
+ - **127 canonical skills** available across all domains
131
+ - **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
132
+ - **Development mode** with improvement tracking and session analysis
133
+
134
+ See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
135
+
136
+ ### Development Mode Features
137
+
138
+ When enabled in project configuration, development mode provides:
139
+
140
+ - **Enhanced logging** for all agent interactions and decision-making processes
141
+ - **Session analysis** that tracks what worked, what didn't, and improvement suggestions
142
+ - **Cost-per-correct-solution metrics** to measure efficiency
143
+ - **Automated improvement tracking** to identify patterns and areas for optimization
144
+ - **Session reports** that can be generated for review and analysis
145
+
146
+ To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
147
+
127
148
  See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
128
149
 
150
+ **v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
151
+ other agents, while a mergeable JSONL session-event log keeps collaboration state
152
+ reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
153
+ stable-release validation before PyPI publishing.
154
+
129
155
  **v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
130
156
 
131
157
  **v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
@@ -148,6 +174,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
148
174
  specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
149
175
  specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
150
176
  specsmith export # generate full compliance report
177
+ specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
151
178
 
152
179
  # Update channels
153
180
  specsmith channel set stable # pin to stable releases
@@ -215,17 +242,6 @@ specsmith phase list # list all phases
215
242
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
216
243
  of file/command criteria, recommended commands, and a readiness percentage.
217
244
 
218
- ## 1.0 release criteria status
219
-
220
- | Criterion | Status | Source |
221
- |---|---|---|
222
- | Stable CLI core contract documented | In progress | `docs/stability.md` |
223
- | Stable generated file schemas documented | In progress | `docs/stability.md` |
224
- | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
225
- | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
226
- | Security threat model documented | In progress | `docs/security-threat-model.md` |
227
- | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
228
- | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
229
245
 
230
246
  ---
231
247
 
@@ -299,6 +315,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
299
315
  pip install "specsmith[esdb]" # installs chronomemory from PyPI
300
316
  # or if using pipx:
301
317
  pipx inject specsmith "chronomemory>=0.2.0" # inject into the specsmith pipx venv
318
+ # The license verifier is included in base specsmith; no cryptography injection is needed.
302
319
 
303
320
  # Step 2 — activate your license key
304
321
  specsmith esdb enable --key-file /path/to/your.esdb.key
@@ -353,6 +370,14 @@ specsmith phase # current phase + readiness %
353
370
  specsmith audit # full governance health check
354
371
  ```
355
372
 
373
+ > **Session Bootstrap**: For a more streamlined session start, you can also use:
374
+ > ```bash
375
+ > specsmith load # run migrate, audit, sync, and checkpoint in sequence
376
+ > ```
377
+ > This command combines the essential bootstrap steps for a clean session start.
378
+ >
379
+ > **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
380
+
356
381
  > **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
357
382
  > Every utterance is preflighted automatically. Use `/why` to see the governance trace.
358
383
  > For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
@@ -1130,6 +1155,16 @@ specsmith skill install specsmith-audit
1130
1155
 
1131
1156
  Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
1132
1157
 
1158
+ ### Skill Policy
1159
+
1160
+ If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
1161
+
1162
+ If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
1163
+
1164
+ If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
1165
+
1166
+ Do not hand-edit `.agents/skills/` as a canonical source.
1167
+
1133
1168
  ### Skill domains
1134
1169
 
1135
1170
  | Domain | Count | Coverage |
@@ -1388,7 +1423,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
1388
1423
  - [PyPI](https://pypi.org/project/specsmith/)
1389
1424
  - [Documentation](https://specsmith.readthedocs.io)
1390
1425
  - [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
1391
- - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
1392
1426
  - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
1393
1427
  - [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
1394
1428
  - [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
@@ -24,6 +24,8 @@ AI Agents / IDE Clients
24
24
  ## When to use / when not to use
25
25
 
26
26
  - Use when you need governed AI development, auditable decision trails, and requirement-to-test linkage.
27
+ - Use especially for larger projects where governance reduces token costs by 2-6x compared to ungoverned approaches (as demonstrated in our efficiency benchmarks)
28
+ - Use with local LLMs like LMStudio, vLLM, or llama.cpp for maximum cost control and privacy
27
29
  - Avoid when rapid local prototyping is the only goal and formal governance is unnecessary.
28
30
 
29
31
  ## Comparison summary
@@ -46,8 +48,34 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
46
48
 
47
49
  **Key findings:** specsmith FULL is the only condition to achieve 100% pass rate on the feature-addition task (T1). It uses 2.6× fewer tokens than ungoverned and produces a cost-of-pass 3.2× lower than the next-best alternative. With gpt-5.5, governance reduces cost-of-pass by **6.3×** ($0.028 vs $0.179).
48
50
 
51
+ ## Current Stats
52
+
53
+ - **52+ model profiles** in registry (including Qwen3.6-35B-A3B)
54
+ - **127 canonical skills** available across all domains
55
+ - **10 governance skills** (including improvement-reporter, agent-flow-controller, model-runtime-optimizer)
56
+ - **Development mode** with improvement tracking and session analysis
57
+
58
+ See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
59
+
60
+ ### Development Mode Features
61
+
62
+ When enabled in project configuration, development mode provides:
63
+
64
+ - **Enhanced logging** for all agent interactions and decision-making processes
65
+ - **Session analysis** that tracks what worked, what didn't, and improvement suggestions
66
+ - **Cost-per-correct-solution metrics** to measure efficiency
67
+ - **Automated improvement tracking** to identify patterns and areas for optimization
68
+ - **Session reports** that can be generated for review and analysis
69
+
70
+ To enable development mode, set `enable_development_mode: true` in your project's `.specsmith/config.yml` file.
71
+
49
72
  See the [full benchmark report](https://specsmith.readthedocs.io/en/stable/efficiency-benchmark/) and [model comparison (gpt-4o-mini vs gpt-5.5)](https://specsmith.readthedocs.io/en/stable/model-comparison/).
50
73
 
74
+ **v0.22.0** - Epistemic chat handoffs preserve source provenance for Zoo-Code and
75
+ other agents, while a mergeable JSONL session-event log keeps collaboration state
76
+ reviewable. This release also adds CPU-safe local-model fallback (REQ-445) and
77
+ stable-release validation before PyPI publishing.
78
+
51
79
  **v0.20.0** — Native Warp integration: `specsmith integrate warp` scaffolds `.warp/` MCP + launch configs and a Warp-aware `specsmith run` banner (REQ-444). Plus VRAM-aware local model recommendations: `specsmith local-model recommend` prints a per-role lineup (default / fast / harder pass / general) with a `fits`/`tight`/`spills` fit assessment (REQ-445).
52
80
 
53
81
  **v0.19.x** — `specsmith wi link-test`, the governance-YAML content auditor and sync markdown-reconcile warnings, and a HuggingFace provider + 15-model multi-provider benchmark matrix for GovernanceBench.
@@ -70,6 +98,7 @@ specsmith ollama gpu # detect GPU VRAM, recommend context
70
98
  specsmith local-model recommend # VRAM-aware model lineup (fits/tight/spills)
71
99
  specsmith integrate warp # scaffold Warp-native governance (MCP + launch config)
72
100
  specsmith export # generate full compliance report
101
+ specsmith endpoints add lmstudio # add LMStudio endpoint for BYOE support
73
102
 
74
103
  # Update channels
75
104
  specsmith channel set stable # pin to stable releases
@@ -137,17 +166,6 @@ specsmith phase list # list all phases
137
166
  The current phase is persisted in `scaffold.yml` as `aee_phase`. Each phase has a checklist
138
167
  of file/command criteria, recommended commands, and a readiness percentage.
139
168
 
140
- ## 1.0 release criteria status
141
-
142
- | Criterion | Status | Source |
143
- |---|---|---|
144
- | Stable CLI core contract documented | In progress | `docs/stability.md` |
145
- | Stable generated file schemas documented | In progress | `docs/stability.md` |
146
- | Stable MCP tool schemas documented | In progress | `docs/stability.md` |
147
- | Migration tests linked (#218) | In progress | `docs/roadmap/1.0-criteria.md` |
148
- | Security threat model documented | In progress | `docs/security-threat-model.md` |
149
- | Docs/tutorial/glossary baseline complete | In progress | `docs/roadmap/1.0-criteria.md` |
150
- | Upgrade path and changelog criteria defined | In progress | `docs/roadmap/1.0-criteria.md` |
151
169
 
152
170
  ---
153
171
 
@@ -221,6 +239,7 @@ If you hold a chronomemory ESDB license, activate the commercial backend:
221
239
  pip install "specsmith[esdb]" # installs chronomemory from PyPI
222
240
  # or if using pipx:
223
241
  pipx inject specsmith "chronomemory>=0.2.0" # inject into the specsmith pipx venv
242
+ # The license verifier is included in base specsmith; no cryptography injection is needed.
224
243
 
225
244
  # Step 2 — activate your license key
226
245
  specsmith esdb enable --key-file /path/to/your.esdb.key
@@ -275,6 +294,14 @@ specsmith phase # current phase + readiness %
275
294
  specsmith audit # full governance health check
276
295
  ```
277
296
 
297
+ > **Session Bootstrap**: For a more streamlined session start, you can also use:
298
+ > ```bash
299
+ > specsmith load # run migrate, audit, sync, and checkpoint in sequence
300
+ > ```
301
+ > This command combines the essential bootstrap steps for a clean session start.
302
+ >
303
+ > **Note**: The `specsmith load` command is particularly useful for quickly setting up a new session with all governance checks in place.
304
+
278
305
  > **Agentic REPL:** run `specsmith run` to start the Nexus governance-gated LLM REPL.
279
306
  > Every utterance is preflighted automatically. Use `/why` to see the governance trace.
280
307
  > For the multi-agent DAG dispatcher, see `specsmith dispatch run "<task>"`.
@@ -1052,6 +1079,16 @@ specsmith skill install specsmith-audit
1052
1079
 
1053
1080
  Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
1054
1081
 
1082
+ ### Skill Policy
1083
+
1084
+ If a skill is reusable across projects, it belongs in `src/specsmith/skills/<domain>.py`.
1085
+
1086
+ If a skill is project-specific, generated by the user, or experimental, it belongs in `.specsmith/skills/<skill-id>/`.
1087
+
1088
+ If a skill needs to be read by Claude Code, Warp, Cursor, Aider, etc., it is exported/materialized into `.agents/skills/<slug>/SKILL.md`.
1089
+
1090
+ Do not hand-edit `.agents/skills/` as a canonical source.
1091
+
1055
1092
  ### Skill domains
1056
1093
 
1057
1094
  | Domain | Count | Coverage |
@@ -1310,7 +1347,6 @@ command reference, project types, tool registry, governance model, ESDB, skills
1310
1347
  - [PyPI](https://pypi.org/project/specsmith/)
1311
1348
  - [Documentation](https://specsmith.readthedocs.io)
1312
1349
  - [Stability Contract](https://github.com/layer1labs/specsmith/blob/develop/docs/stability.md)
1313
- - [1.0 Release Criteria](https://github.com/layer1labs/specsmith/blob/develop/docs/roadmap/1.0-criteria.md)
1314
1350
  - [Editions Matrix](https://github.com/layer1labs/specsmith/blob/develop/docs/editions.md)
1315
1351
  - [Changelog](https://github.com/layer1labs/specsmith/blob/develop/CHANGELOG.md)
1316
1352
  - [Contributing](https://github.com/layer1labs/specsmith/blob/develop/CONTRIBUTING.md)
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.21.0.dev787"
7
+ version = "0.22.1"
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"
@@ -37,6 +37,8 @@ classifiers = [
37
37
 
38
38
  dependencies = [
39
39
  "click>=8.1",
40
+ # `specsmith esdb enable` verifies Ed25519 license signatures in every install.
41
+ "cryptography>=42.0",
40
42
  "jinja2>=3.1",
41
43
  "pyyaml>=6.0",
42
44
  "pydantic>=2.0",
@@ -54,7 +56,6 @@ dev = [
54
56
  "mypy>=1.10",
55
57
  "pre-commit>=3.0",
56
58
  "types-pyyaml>=6.0",
57
- "cryptography>=42.0", # needed for test_esdb_license.py signing helpers
58
59
  ]
59
60
  # ESDB commercial backend — requires a valid license from licensing@layer1labs.ai
60
61
  # Install: pip install specsmith[esdb]
@@ -62,7 +63,6 @@ dev = [
62
63
  # Terms: https://github.com/layer1labs/specsmith/blob/develop/COMMERCIAL-LICENSE.md
63
64
  esdb = [
64
65
  "chronomemory>=0.2.7", # proprietary commercial — ChronoMemory terms only (not SQLite free tier)
65
- "cryptography>=42.0",
66
66
  ]
67
67
  docs = [
68
68
  "mkdocs>=1.6",
@@ -95,8 +95,8 @@ all = [
95
95
  "ruff>=0.4",
96
96
  "mypy>=1.10",
97
97
  ]
98
- # cryptography for license verification (usable without full esdb extra)
99
- license-verify = ["cryptography>=42.0"]
98
+ # Compatibility extra: cryptography is now part of every supported installation.
99
+ license-verify = []
100
100
 
101
101
  [project.scripts]
102
102
  specsmith = "specsmith.cli:main"
@@ -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.20.1" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.22.1" # fallback: keep in sync with pyproject.toml
@@ -174,7 +174,7 @@ class AdvancedCodeAnalyzer:
174
174
  ),
175
175
  )
176
176
  )
177
- except Exception:
177
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget analysis; log is written above
178
178
  pass
179
179
 
180
180
  return reports
@@ -249,7 +249,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
249
249
  reqs_yaml_dir = root / "docs" / "requirements"
250
250
  reqs_yaml_dir.mkdir(parents=True, exist_ok=True)
251
251
  consolidated.append("Consolidated requirements to YAML structure")
252
- except Exception:
252
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
253
253
  pass
254
254
 
255
255
  if tests_dir.exists() and tests_dir.is_dir():
@@ -258,7 +258,7 @@ def _consolidate_governance_files(root: Path) -> list[str]:
258
258
  tests_yaml_dir = root / "docs" / "tests"
259
259
  tests_yaml_dir.mkdir(parents=True, exist_ok=True)
260
260
  consolidated.append("Consolidated tests to YAML structure")
261
- except Exception:
261
+ except Exception: # noqa: BLE001 # intentional: fire-and-forget cleanup; log is written above
262
262
  pass
263
263
 
264
264
  return consolidated
@@ -0,0 +1,107 @@
1
+ # SPDX-License-Identifier: MIT
2
+ # Copyright (c) 2026 Layer1Labs Silicon, Inc. All rights reserved.
3
+ """Evidence-preserving chat compaction and portable agent handoffs (REQ-446)."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import hashlib
8
+ import json
9
+ from datetime import datetime, timezone
10
+ from typing import Any
11
+
12
+ SCHEMA_VERSION = 1
13
+ _MAX_EXCERPT = 280
14
+
15
+
16
+ def build_handoff(
17
+ history: list[dict[str, Any]],
18
+ *,
19
+ work_item_ids: list[str] | None = None,
20
+ ) -> dict[str, Any]:
21
+ """Build an extractive, provenance-preserving envelope from chat turns.
22
+
23
+ This deliberately does not ask an LLM to invent a prose summary. Each
24
+ compacted claim remains a bounded excerpt linked to a deterministic turn ID,
25
+ allowing another agent to inspect the original history before relying on it.
26
+ """
27
+ turns: list[dict[str, str]] = []
28
+ for index, turn in enumerate(history):
29
+ role = turn.get("role")
30
+ content = turn.get("content")
31
+ if not isinstance(role, str) or not isinstance(content, str) or not content.strip():
32
+ continue
33
+ canonical = json.dumps(
34
+ {"role": role, "content": content}, sort_keys=True, ensure_ascii=False
35
+ )
36
+ source_id = f"turn:{hashlib.sha256(canonical.encode('utf-8')).hexdigest()[:16]}"
37
+ turns.append(
38
+ {
39
+ "source_id": source_id,
40
+ "role": role,
41
+ "excerpt": content.strip()[:_MAX_EXCERPT],
42
+ "position": str(index),
43
+ },
44
+ )
45
+
46
+ payload = {
47
+ "schema_version": SCHEMA_VERSION,
48
+ "kind": "epistemic_chat_handoff",
49
+ "created_at": datetime.now(timezone.utc).isoformat(),
50
+ "confidence": 1.0,
51
+ "uncertainty": "Extractive envelope; excerpts are not inferred claims.",
52
+ "work_item_ids": sorted(set(work_item_ids or [])),
53
+ "turns": turns,
54
+ }
55
+ fingerprint = json.dumps(payload, sort_keys=True, ensure_ascii=False)
56
+ digest = hashlib.sha256(fingerprint.encode("utf-8")).hexdigest()[:16].upper()
57
+ payload["id"] = f"HANDOFF-{digest}"
58
+ validate_handoff(payload)
59
+ return payload
60
+
61
+
62
+ def validate_handoff(payload: dict[str, Any]) -> None:
63
+ """Reject malformed or unsupported handoff claims before persistence/import."""
64
+ if (
65
+ payload.get("schema_version") != SCHEMA_VERSION
66
+ or payload.get("kind") != "epistemic_chat_handoff"
67
+ ):
68
+ raise ValueError("unsupported handoff schema")
69
+ if not isinstance(payload.get("id"), str) or not payload["id"].startswith("HANDOFF-"):
70
+ raise ValueError("handoff must have a stable ID")
71
+ if payload.get("confidence") != 1.0:
72
+ raise ValueError("extractive handoffs must retain confidence 1.0")
73
+ for turn in payload.get("turns", []):
74
+ if not isinstance(turn, dict) or not isinstance(turn.get("source_id"), str):
75
+ raise ValueError("handoff turn is missing provenance")
76
+ if not isinstance(turn.get("excerpt"), str) or len(turn["excerpt"]) > _MAX_EXCERPT:
77
+ raise ValueError("handoff excerpt is invalid")
78
+
79
+
80
+ def render_handoff_context(payload: dict[str, Any]) -> str:
81
+ """Render a bounded context entry that tells agents how to verify it."""
82
+ validate_handoff(payload)
83
+ excerpts = "\n".join(
84
+ f"- [{turn['source_id']}] {turn['role']}: {turn['excerpt']}" for turn in payload["turns"]
85
+ )
86
+ return (
87
+ f"[Epistemic handoff {payload['id']} | {len(payload['turns'])} extractive turns | "
88
+ "verify source IDs before treating excerpts as decisions]\n"
89
+ f"{excerpts}"
90
+ )
91
+
92
+
93
+ def store_handoff(root: Any, payload: dict[str, Any]) -> None:
94
+ """Persist a validated handoff in the active ESDB backend."""
95
+ validate_handoff(payload)
96
+ from specsmith.esdb import SqliteRecord, open_default_store
97
+
98
+ with open_default_store(root) as store:
99
+ store.upsert(
100
+ SqliteRecord(
101
+ id=payload["id"],
102
+ kind="chat_handoff",
103
+ label="Epistemic chat handoff",
104
+ confidence=1.0,
105
+ data=payload,
106
+ ),
107
+ )