specsmith 0.16.1.dev605__tar.gz → 0.16.2__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 (320) hide show
  1. {specsmith-0.16.1.dev605/src/specsmith.egg-info → specsmith-0.16.2}/PKG-INFO +4 -2
  2. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/README.md +3 -1
  3. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/pyproject.toml +1 -1
  4. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/__init__.py +1 -1
  5. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/auditor.py +13 -3
  6. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/sync.py +5 -2
  7. {specsmith-0.16.1.dev605 → specsmith-0.16.2/src/specsmith.egg-info}/PKG-INFO +4 -2
  8. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_auditor.py +49 -0
  9. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/LICENSE +0 -0
  10. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/setup.cfg +0 -0
  11. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/__init__.py +0 -0
  12. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/belief.py +0 -0
  13. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/certainty.py +0 -0
  14. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/failure_graph.py +0 -0
  15. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/py.typed +0 -0
  16. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/recovery.py +0 -0
  17. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/session.py +0 -0
  18. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/stress_tester.py +0 -0
  19. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/epistemic/trace.py +0 -0
  20. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/__main__.py +0 -0
  21. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/__init__.py +0 -0
  22. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/broker.py +0 -0
  23. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/chat_runner.py +0 -0
  24. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/cleanup.py +0 -0
  25. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/context_seed.py +0 -0
  26. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/core.py +0 -0
  27. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/__init__.py +0 -0
  28. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/_status.py +0 -0
  29. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/dag.py +0 -0
  30. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  31. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/events.py +0 -0
  32. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/dispatch/result.py +0 -0
  33. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/endpoints.py +0 -0
  34. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/events.py +0 -0
  35. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/execution_profiles.py +0 -0
  36. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/fallback.py +0 -0
  37. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/hf_leaderboard.py +0 -0
  38. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/hf_sync.py +0 -0
  39. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/indexer.py +0 -0
  40. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/llm_client.py +0 -0
  41. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/mcp.py +0 -0
  42. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/memory.py +0 -0
  43. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/model_intelligence.py +0 -0
  44. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/model_profiles.py +0 -0
  45. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/orchestrator.py +0 -0
  46. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/permissions.py +0 -0
  47. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/profiles.py +0 -0
  48. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/provider_registry.py +0 -0
  49. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/repl.py +0 -0
  50. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/router.py +0 -0
  51. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/rules.py +0 -0
  52. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/runner.py +0 -0
  53. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/safety.py +0 -0
  54. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/spawner.py +0 -0
  55. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/suggester.py +0 -0
  56. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/teams.py +0 -0
  57. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/tools.py +0 -0
  58. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/verifier.py +0 -0
  59. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/agent/voice.py +0 -0
  60. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/approvals.py +0 -0
  61. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/architect.py +0 -0
  62. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/auth.py +0 -0
  63. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/block_export.py +0 -0
  64. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/channel.py +0 -0
  65. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/ci_manager.py +0 -0
  66. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/cli.py +0 -0
  67. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/commands/__init__.py +0 -0
  68. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/commands/intelligence.py +0 -0
  69. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/commands/issues_policy.py +0 -0
  70. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/commands/reporting.py +0 -0
  71. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/__init__.py +0 -0
  72. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/_compat.py +0 -0
  73. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/checker.py +0 -0
  74. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/evidence.py +0 -0
  75. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/regulations.py +0 -0
  76. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compliance/reporter.py +0 -0
  77. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/compressor.py +0 -0
  78. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/config.py +0 -0
  79. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/console_utils.py +0 -0
  80. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/context_orchestrator.py +0 -0
  81. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/context_window.py +0 -0
  82. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/credit_analyzer.py +0 -0
  83. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/credits.py +0 -0
  84. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/dashboard.py +0 -0
  85. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/__init__.py +0 -0
  86. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/base.py +0 -0
  87. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/citations.py +0 -0
  88. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/fpd.py +0 -0
  89. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/odp.py +0 -0
  90. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/patentsview.py +0 -0
  91. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/pfw.py +0 -0
  92. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/ppubs.py +0 -0
  93. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/datasources/ptab.py +0 -0
  94. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/differ.py +0 -0
  95. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/doctor.py +0 -0
  96. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/drive.py +0 -0
  97. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/editor.py +0 -0
  98. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/__init__.py +0 -0
  99. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/belief.py +0 -0
  100. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/certainty.py +0 -0
  101. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/failure_graph.py +0 -0
  102. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/recovery.py +0 -0
  103. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/epistemic/stress_tester.py +0 -0
  104. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/esdb/__init__.py +0 -0
  105. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/esdb/_license.py +0 -0
  106. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/esdb/bridge.py +0 -0
  107. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/esdb/sqlite_store.py +0 -0
  108. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/eval/__init__.py +0 -0
  109. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/eval/builtins.py +0 -0
  110. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/eval/runner.py +0 -0
  111. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/executor.py +0 -0
  112. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/exporter.py +0 -0
  113. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/governance_logic.py +0 -0
  114. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/governance_store.py +0 -0
  115. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/governance_yaml.py +0 -0
  116. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/governed_pr.py +0 -0
  117. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/__init__.py +0 -0
  118. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/app.py +0 -0
  119. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/main_window.py +0 -0
  120. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/session_tab.py +0 -0
  121. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/theme.py +0 -0
  122. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/__init__.py +0 -0
  123. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/chat_view.py +0 -0
  124. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/input_bar.py +0 -0
  125. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  126. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/token_meter.py +0 -0
  127. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  128. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/widgets/update_checker.py +0 -0
  129. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/gui/worker.py +0 -0
  130. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/history_search.py +0 -0
  131. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/importer.py +0 -0
  132. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/instinct.py +0 -0
  133. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/__init__.py +0 -0
  134. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/agent_skill.py +0 -0
  135. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/aider.py +0 -0
  136. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/base.py +0 -0
  137. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/claude_code.py +0 -0
  138. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/codity.py +0 -0
  139. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/copilot.py +0 -0
  140. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/cursor.py +0 -0
  141. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/gemini.py +0 -0
  142. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/integrations/windsurf.py +0 -0
  143. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/issue_reporter.py +0 -0
  144. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/languages.py +0 -0
  145. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/ledger.py +0 -0
  146. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/mcp_generator.py +0 -0
  147. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/mcp_server.py +0 -0
  148. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/__init__.py +0 -0
  149. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  150. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  151. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  152. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  153. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  154. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/m006_session_governance.py +0 -0
  155. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/migrations/runner.py +0 -0
  156. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/ollama_cmds.py +0 -0
  157. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/patent.py +0 -0
  158. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/paths.py +0 -0
  159. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/phase.py +0 -0
  160. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/plugins.py +0 -0
  161. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/policy.py +0 -0
  162. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/profiles.py +0 -0
  163. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/rate_limits.py +0 -0
  164. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/recover.py +0 -0
  165. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/releaser.py +0 -0
  166. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/requirements.py +0 -0
  167. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/requirements_parser.py +0 -0
  168. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/retrieval.py +0 -0
  169. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/risk.py +0 -0
  170. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/safe_write.py +0 -0
  171. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/scaffolder.py +0 -0
  172. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/serve.py +0 -0
  173. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/session.py +0 -0
  174. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/session_init.py +0 -0
  175. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/session_store.py +0 -0
  176. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/__init__.py +0 -0
  177. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/ai_agents.py +0 -0
  178. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/cloud.py +0 -0
  179. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/corporate.py +0 -0
  180. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/cross_platform.py +0 -0
  181. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/data_engineering.py +0 -0
  182. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/devops.py +0 -0
  183. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/docs.py +0 -0
  184. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/embedded.py +0 -0
  185. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/governance.py +0 -0
  186. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/hardware.py +0 -0
  187. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/mobile.py +0 -0
  188. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/platform_engineering.py +0 -0
  189. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/productivity.py +0 -0
  190. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/software_engineering.py +0 -0
  191. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/specsmith_skills.py +0 -0
  192. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/ssh.py +0 -0
  193. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills/web_backend.py +0 -0
  194. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/skills_builder.py +0 -0
  195. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/agents.md.j2 +0 -0
  196. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  197. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  198. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  199. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  200. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  201. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  202. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  203. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/community/security.md.j2 +0 -0
  204. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  205. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  206. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  207. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  208. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  209. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/editorconfig.j2 +0 -0
  210. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/gitattributes.j2 +0 -0
  211. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/gitignore.j2 +0 -0
  212. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/go/go.mod.j2 +0 -0
  213. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/go/main.go.j2 +0 -0
  214. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  215. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  216. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  217. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  218. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  219. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  220. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  221. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  222. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  223. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  224. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  225. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/js/package.json.j2 +0 -0
  226. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/ledger.md.j2 +0 -0
  227. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/python/cli.py.j2 +0 -0
  228. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/python/init.py.j2 +0 -0
  229. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  230. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/readme.md.j2 +0 -0
  231. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  232. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  233. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  234. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  235. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  236. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  237. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  238. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  239. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  240. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/tool_installer.py +0 -0
  241. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/toolrules.py +0 -0
  242. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/tools.py +0 -0
  243. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/trace.py +0 -0
  244. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/transcripts.py +0 -0
  245. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/updater.py +0 -0
  246. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/upgrader.py +0 -0
  247. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/validator.py +0 -0
  248. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs/__init__.py +0 -0
  249. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs/base.py +0 -0
  250. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs/bitbucket.py +0 -0
  251. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs/github.py +0 -0
  252. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs/gitlab.py +0 -0
  253. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/vcs_commands.py +0 -0
  254. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/wi_store.py +0 -0
  255. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/wireframes.py +0 -0
  256. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith/workspace.py +0 -0
  257. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith.egg-info/SOURCES.txt +0 -0
  258. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith.egg-info/dependency_links.txt +0 -0
  259. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith.egg-info/entry_points.txt +0 -0
  260. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith.egg-info/requires.txt +0 -0
  261. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/src/specsmith.egg-info/top_level.txt +0 -0
  262. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_CMD_001.py +0 -0
  263. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_agent_profiles.py +0 -0
  264. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_agent_run_feedback.py +0 -0
  265. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_agent_runner_ready.py +0 -0
  266. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_ai_client.py +0 -0
  267. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_ai_intelligence.py +0 -0
  268. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_architecture.py +0 -0
  269. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_channel.py +0 -0
  270. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_chat_diff_decision.py +0 -0
  271. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_chat_runner_openai_compat.py +0 -0
  272. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_chat_stdin_protocol.py +0 -0
  273. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_cli.py +0 -0
  274. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_cli_regressions.py +0 -0
  275. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_cli_workflows_history_drive.py +0 -0
  276. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_compliance.py +0 -0
  277. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_compliance_governance.py +0 -0
  278. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_compressor.py +0 -0
  279. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_dispatch.py +0 -0
  280. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_e2e_nexus.py +0 -0
  281. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_endpoints_cli.py +0 -0
  282. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_endpoints_store.py +0 -0
  283. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_epistemic.py +0 -0
  284. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_esdb_enforcement.py +0 -0
  285. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_esdb_license.py +0 -0
  286. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_esdb_sqlite.py +0 -0
  287. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_esdb_verify_chain_cli.py +0 -0
  288. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_fallback_chain.py +0 -0
  289. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_golden_path.py +0 -0
  290. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_importer.py +0 -0
  291. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_init_modes.py +0 -0
  292. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_integrations.py +0 -0
  293. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_integrations_codity.py +0 -0
  294. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_intelligence.py +0 -0
  295. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_issue_policy_features.py +0 -0
  296. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_issue_reporter.py +0 -0
  297. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_mcp_client.py +0 -0
  298. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_mcp_server.py +0 -0
  299. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_new_modules.py +0 -0
  300. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_nexus.py +0 -0
  301. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_permissions.py +0 -0
  302. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_phase1_4_new.py +0 -0
  303. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_phase34_completion.py +0 -0
  304. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_rate_limits.py +0 -0
  305. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_reporting_commands.py +0 -0
  306. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_req_248_262.py +0 -0
  307. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_req_358_359.py +0 -0
  308. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_scaffolder.py +0 -0
  309. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_schema_migrations.py +0 -0
  310. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_skill_marketplace.py +0 -0
  311. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_skills_mcp.py +0 -0
  312. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_smoke.py +0 -0
  313. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_suggester.py +0 -0
  314. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_tools.py +0 -0
  315. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_typing_guardrails.py +0 -0
  316. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_validator.py +0 -0
  317. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_vcs.py +0 -0
  318. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_warp_parity.py +0 -0
  319. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_warp_parity_followup.py +0 -0
  320. {specsmith-0.16.1.dev605 → specsmith-0.16.2}/tests/test_wi_lifecycle.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.16.1.dev605
3
+ Version: 0.16.2
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
@@ -126,6 +126,8 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
126
126
 
127
127
  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
128
 
129
+ **v0.16.2** — bugfix release: resolved all 6 open CodeQL alerts (Protocol stub `py/ineffectual-statement`, dead-init `py/multiple-definition`; benchmark demo project excluded from scan); fixed `audit industrial_artifacts` false positive on Windows when `canopen_eds` entries are plain strings instead of dicts (closes #257).
130
+
129
131
  **v0.16.1** — governance efficiency benchmark suite (12 conditions, 3 tasks, gpt-4o-mini + gpt-5.5 comparison); cross-model comparison report; real OpenAI agent harness; CI matrix job. Also includes the v0.16.0 stabilisation milestone: 20+ CLI commands, ESDB SQLite backend, chronomemory 0.2.0, Python 3.10–3.13 × Ubuntu + Windows green, 1 607 tests passing.
130
132
 
131
133
  specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689) and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed, every AI-generated output is disclosed, context windows are GPU-aware, and compliance settings are configurable per-session and per-project.
@@ -475,7 +477,7 @@ Every preflight response includes a mandatory `ai_disclosure` block:
475
477
  "governance_gated": true,
476
478
  "provider": "ollama",
477
479
  "model": "qwen2.5:14b",
478
- "spec_version": "0.16.1"
480
+ "spec_version": "0.16.2"
479
481
  }
480
482
  }
481
483
  ```
@@ -48,6 +48,8 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
48
48
 
49
49
  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
50
 
51
+ **v0.16.2** — bugfix release: resolved all 6 open CodeQL alerts (Protocol stub `py/ineffectual-statement`, dead-init `py/multiple-definition`; benchmark demo project excluded from scan); fixed `audit industrial_artifacts` false positive on Windows when `canopen_eds` entries are plain strings instead of dicts (closes #257).
52
+
51
53
  **v0.16.1** — governance efficiency benchmark suite (12 conditions, 3 tasks, gpt-4o-mini + gpt-5.5 comparison); cross-model comparison report; real OpenAI agent harness; CI matrix job. Also includes the v0.16.0 stabilisation milestone: 20+ CLI commands, ESDB SQLite backend, chronomemory 0.2.0, Python 3.10–3.13 × Ubuntu + Windows green, 1 607 tests passing.
52
54
 
53
55
  specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689) and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed, every AI-generated output is disclosed, context windows are GPU-aware, and compliance settings are configurable per-session and per-project.
@@ -397,7 +399,7 @@ Every preflight response includes a mandatory `ai_disclosure` block:
397
399
  "governance_gated": true,
398
400
  "provider": "ollama",
399
401
  "model": "qwen2.5:14b",
400
- "spec_version": "0.16.1"
402
+ "spec_version": "0.16.2"
401
403
  }
402
404
  }
403
405
  ```
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.16.1.dev605"
7
+ version = "0.16.2"
8
8
  description = "AEE governance toolkit for AI-assisted development — session preflight gates, multi-agent dispatch, requirements↔test traceability, ESDB persistence, MCP server, and skills for Warp, Cursor, Claude Code, Copilot, Windsurf, and Aider."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
8
8
  try:
9
9
  __version__: str = _pkg_version("specsmith")
10
10
  except PackageNotFoundError: # running from source without install
11
- __version__ = "0.16.1" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.16.2" # fallback: keep in sync with pyproject.toml
@@ -1132,9 +1132,19 @@ def check_industrial_artifacts(root: Path) -> list[AuditResult]:
1132
1132
  declared_eds = declared.get("canopen_eds", []) or []
1133
1133
  # Normalise declared paths to forward slashes and lowercase so they match
1134
1134
  # on Windows where YAML uses '/' but Path.relative_to() returns '\\' (#251).
1135
- declared_paths = {
1136
- e.get("path", "").replace("\\", "/").lower() for e in declared_eds if isinstance(e, dict)
1137
- }
1135
+ # canopen_eds entries may be plain strings ("path/to/file.eds") or dicts
1136
+ # ({path: "path/to/file.eds", device: "..."}). Handle both to avoid false
1137
+ # positives when users use the simpler string form (#257).
1138
+ declared_paths: set[str] = set()
1139
+ for e in declared_eds:
1140
+ if isinstance(e, dict):
1141
+ _p = e.get("path", "")
1142
+ elif isinstance(e, str):
1143
+ _p = e
1144
+ else:
1145
+ _p = str(e)
1146
+ if _p:
1147
+ declared_paths.add(_p.replace("\\", "/").lower())
1138
1148
 
1139
1149
  # Scan for .eds and .xdd files — respect scan_exclude_dirs and
1140
1150
  # scan_exclude_patterns from scaffold.yml (#175).
@@ -602,8 +602,11 @@ def auto_migrate_if_needed(root: Path) -> dict[str, int]:
602
602
  return {}
603
603
 
604
604
  class _MigratableStore(Protocol):
605
- def record_count(self) -> int: ...
606
- def migrate_from_json(self, specsmith_dir: Path) -> dict[str, int] | Any: ...
605
+ def record_count(self) -> int:
606
+ pass # noqa: E704
607
+
608
+ def migrate_from_json(self, specsmith_dir: Path) -> dict[str, int] | Any:
609
+ pass # noqa: E704
607
610
 
608
611
  try:
609
612
  with open_default_store(root, warn=False) as store:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.16.1.dev605
3
+ Version: 0.16.2
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
@@ -126,6 +126,8 @@ We ran a [multi-condition benchmark](https://specsmith.readthedocs.io/en/stable/
126
126
 
127
127
  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
128
 
129
+ **v0.16.2** — bugfix release: resolved all 6 open CodeQL alerts (Protocol stub `py/ineffectual-statement`, dead-init `py/multiple-definition`; benchmark demo project excluded from scan); fixed `audit industrial_artifacts` false positive on Windows when `canopen_eds` entries are plain strings instead of dicts (closes #257).
130
+
129
131
  **v0.16.1** — governance efficiency benchmark suite (12 conditions, 3 tasks, gpt-4o-mini + gpt-5.5 comparison); cross-model comparison report; real OpenAI agent harness; CI matrix job. Also includes the v0.16.0 stabilisation milestone: 20+ CLI commands, ESDB SQLite backend, chronomemory 0.2.0, Python 3.10–3.13 × Ubuntu + Windows green, 1 607 tests passing.
130
132
 
131
133
  specsmith ships a full compliance and auditability layer aligned to the EU AI Act (2024/1689) and the NIST AI Risk Management Framework 1.0. Every agent action is cryptographically sealed, every AI-generated output is disclosed, context windows are GPU-aware, and compliance settings are configurable per-session and per-project.
@@ -475,7 +477,7 @@ Every preflight response includes a mandatory `ai_disclosure` block:
475
477
  "governance_gated": true,
476
478
  "provider": "ollama",
477
479
  "model": "qwen2.5:14b",
478
- "spec_version": "0.16.1"
480
+ "spec_version": "0.16.2"
479
481
  }
480
482
  }
481
483
  ```
@@ -90,6 +90,10 @@ class TestAuditDetectsIssues:
90
90
 
91
91
 
92
92
  def test_industrial_artifacts_normalizes_windows_declared_paths(tmp_path: Path) -> None:
93
+ # Simulate a Windows user who put a single backslash path in scaffold.yml.
94
+ # YAML plain scalars treat backslash as literal, so the parsed value is
95
+ # "hardware\device.eds" (one backslash) which must normalise to the posix
96
+ # found path "hardware/device.eds".
93
97
  (tmp_path / "scaffold.yml").write_text(
94
98
  "name: test\n"
95
99
  "type: cli-python\n"
@@ -106,6 +110,51 @@ def test_industrial_artifacts_normalizes_windows_declared_paths(tmp_path: Path)
106
110
  assert any(r.name == "industrial-artifacts" and r.passed for r in results)
107
111
 
108
112
 
113
+ def test_industrial_artifacts_plain_string_entries_no_false_positive(tmp_path: Path) -> None:
114
+ """Regression test for #257: plain string canopen_eds entries must not be
115
+ treated as undeclared even though they pass isinstance(e, dict) == False."""
116
+ (tmp_path / "scaffold.yml").write_text(
117
+ "name: test\n"
118
+ "type: cli-python\n"
119
+ "industrial_artifacts:\n"
120
+ " canopen_eds:\n"
121
+ " - application/canopen/device.eds\n"
122
+ " - application/canopen/device.xdd\n",
123
+ encoding="utf-8",
124
+ )
125
+ can_dir = tmp_path / "application" / "canopen"
126
+ can_dir.mkdir(parents=True)
127
+ (can_dir / "device.eds").write_text("EDS", encoding="utf-8")
128
+ (can_dir / "device.xdd").write_text("XDD", encoding="utf-8")
129
+
130
+ results = check_industrial_artifacts(tmp_path)
131
+ assert results
132
+ assert any(r.name == "industrial-artifacts" and r.passed for r in results), (
133
+ f"Expected pass but got: {[r.message for r in results]}"
134
+ )
135
+
136
+
137
+ def test_industrial_artifacts_mixed_string_and_dict_entries(tmp_path: Path) -> None:
138
+ """Mixed plain-string and dict entries should both be recognised (#257)."""
139
+ (tmp_path / "scaffold.yml").write_text(
140
+ "name: test\n"
141
+ "type: cli-python\n"
142
+ "industrial_artifacts:\n"
143
+ " canopen_eds:\n"
144
+ " - application/canopen/a.eds\n"
145
+ " - path: application/canopen/b.eds\n"
146
+ " device: MyDevice\n",
147
+ encoding="utf-8",
148
+ )
149
+ can_dir = tmp_path / "application" / "canopen"
150
+ can_dir.mkdir(parents=True)
151
+ (can_dir / "a.eds").write_text("EDS", encoding="utf-8")
152
+ (can_dir / "b.eds").write_text("EDS", encoding="utf-8")
153
+
154
+ results = check_industrial_artifacts(tmp_path)
155
+ assert any(r.name == "industrial-artifacts" and r.passed for r in results)
156
+
157
+
109
158
  # ---------------------------------------------------------------------------
110
159
  # Regression: issue #183 — letter-suffix TEST IDs in req trace
111
160
  # ---------------------------------------------------------------------------
File without changes
File without changes