specsmith 0.11.3.dev432__tar.gz → 0.11.3.dev435__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 (281) hide show
  1. {specsmith-0.11.3.dev432/src/specsmith.egg-info → specsmith-0.11.3.dev435}/PKG-INFO +1 -1
  2. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/pyproject.toml +1 -1
  3. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/config.py +65 -0
  4. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/phase.py +147 -0
  5. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/devops.py +194 -2
  6. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/governance.py +140 -0
  7. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/tools.py +8 -0
  8. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435/src/specsmith.egg-info}/PKG-INFO +1 -1
  9. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/LICENSE +0 -0
  10. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/README.md +0 -0
  11. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/setup.cfg +0 -0
  12. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/__init__.py +0 -0
  13. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/belief.py +0 -0
  14. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/certainty.py +0 -0
  15. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/failure_graph.py +0 -0
  16. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/py.typed +0 -0
  17. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/recovery.py +0 -0
  18. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/session.py +0 -0
  19. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/stress_tester.py +0 -0
  20. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/epistemic/trace.py +0 -0
  21. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/__init__.py +0 -0
  22. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/__main__.py +0 -0
  23. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/__init__.py +0 -0
  24. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/broker.py +0 -0
  25. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/chat_runner.py +0 -0
  26. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/cleanup.py +0 -0
  27. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/context_seed.py +0 -0
  28. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/core.py +0 -0
  29. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/__init__.py +0 -0
  30. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/_status.py +0 -0
  31. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/dag.py +0 -0
  32. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  33. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/events.py +0 -0
  34. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/dispatch/result.py +0 -0
  35. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/endpoints.py +0 -0
  36. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/events.py +0 -0
  37. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/execution_profiles.py +0 -0
  38. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/fallback.py +0 -0
  39. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/hf_leaderboard.py +0 -0
  40. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/hf_sync.py +0 -0
  41. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/indexer.py +0 -0
  42. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/llm_client.py +0 -0
  43. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/mcp.py +0 -0
  44. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/memory.py +0 -0
  45. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/model_intelligence.py +0 -0
  46. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/model_profiles.py +0 -0
  47. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/orchestrator.py +0 -0
  48. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/permissions.py +0 -0
  49. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/profiles.py +0 -0
  50. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/provider_registry.py +0 -0
  51. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/repl.py +0 -0
  52. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/router.py +0 -0
  53. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/rules.py +0 -0
  54. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/runner.py +0 -0
  55. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/safety.py +0 -0
  56. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/spawner.py +0 -0
  57. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/suggester.py +0 -0
  58. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/teams.py +0 -0
  59. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/tools.py +0 -0
  60. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/verifier.py +0 -0
  61. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/agent/voice.py +0 -0
  62. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/architect.py +0 -0
  63. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/auditor.py +0 -0
  64. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/auth.py +0 -0
  65. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/block_export.py +0 -0
  66. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/channel.py +0 -0
  67. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/ci_manager.py +0 -0
  68. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/cli.py +0 -0
  69. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/commands/__init__.py +0 -0
  70. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/commands/intelligence.py +0 -0
  71. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/__init__.py +0 -0
  72. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/_compat.py +0 -0
  73. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/checker.py +0 -0
  74. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/evidence.py +0 -0
  75. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/regulations.py +0 -0
  76. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compliance/reporter.py +0 -0
  77. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/compressor.py +0 -0
  78. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/console_utils.py +0 -0
  79. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/context_orchestrator.py +0 -0
  80. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/context_window.py +0 -0
  81. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/credit_analyzer.py +0 -0
  82. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/credits.py +0 -0
  83. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/__init__.py +0 -0
  84. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/base.py +0 -0
  85. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/citations.py +0 -0
  86. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/fpd.py +0 -0
  87. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/odp.py +0 -0
  88. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/patentsview.py +0 -0
  89. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/pfw.py +0 -0
  90. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/ppubs.py +0 -0
  91. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/datasources/ptab.py +0 -0
  92. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/differ.py +0 -0
  93. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/doctor.py +0 -0
  94. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/drive.py +0 -0
  95. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/editor.py +0 -0
  96. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/__init__.py +0 -0
  97. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/belief.py +0 -0
  98. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/certainty.py +0 -0
  99. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/failure_graph.py +0 -0
  100. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/recovery.py +0 -0
  101. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/epistemic/stress_tester.py +0 -0
  102. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/esdb/__init__.py +0 -0
  103. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/esdb/bridge.py +0 -0
  104. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/eval/__init__.py +0 -0
  105. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/eval/builtins.py +0 -0
  106. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/eval/runner.py +0 -0
  107. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/executor.py +0 -0
  108. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/exporter.py +0 -0
  109. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/governance_logic.py +0 -0
  110. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/governance_store.py +0 -0
  111. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/governance_yaml.py +0 -0
  112. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/__init__.py +0 -0
  113. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/app.py +0 -0
  114. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/main_window.py +0 -0
  115. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/session_tab.py +0 -0
  116. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/theme.py +0 -0
  117. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/__init__.py +0 -0
  118. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/chat_view.py +0 -0
  119. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/input_bar.py +0 -0
  120. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  121. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/token_meter.py +0 -0
  122. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  123. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/widgets/update_checker.py +0 -0
  124. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/gui/worker.py +0 -0
  125. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/history_search.py +0 -0
  126. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/importer.py +0 -0
  127. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/instinct.py +0 -0
  128. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/__init__.py +0 -0
  129. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/agent_skill.py +0 -0
  130. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/aider.py +0 -0
  131. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/base.py +0 -0
  132. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/claude_code.py +0 -0
  133. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/copilot.py +0 -0
  134. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/cursor.py +0 -0
  135. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/gemini.py +0 -0
  136. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/integrations/windsurf.py +0 -0
  137. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/issue_reporter.py +0 -0
  138. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/languages.py +0 -0
  139. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/ledger.py +0 -0
  140. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/mcp_generator.py +0 -0
  141. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/__init__.py +0 -0
  142. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  143. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  144. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  145. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  146. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  147. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/migrations/runner.py +0 -0
  148. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/ollama_cmds.py +0 -0
  149. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/patent.py +0 -0
  150. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/paths.py +0 -0
  151. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/plugins.py +0 -0
  152. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/profiles.py +0 -0
  153. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/rate_limits.py +0 -0
  154. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/releaser.py +0 -0
  155. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/requirements.py +0 -0
  156. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/requirements_parser.py +0 -0
  157. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/retrieval.py +0 -0
  158. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/safe_write.py +0 -0
  159. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/scaffolder.py +0 -0
  160. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/serve.py +0 -0
  161. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/session.py +0 -0
  162. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/session_init.py +0 -0
  163. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/session_store.py +0 -0
  164. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/__init__.py +0 -0
  165. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/cloud.py +0 -0
  166. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/corporate.py +0 -0
  167. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/cross_platform.py +0 -0
  168. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/docs.py +0 -0
  169. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/embedded.py +0 -0
  170. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/hardware.py +0 -0
  171. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/mobile.py +0 -0
  172. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/productivity.py +0 -0
  173. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills/ssh.py +0 -0
  174. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/skills_builder.py +0 -0
  175. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/sync.py +0 -0
  176. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/agents.md.j2 +0 -0
  177. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  178. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  179. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  180. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  181. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  182. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  183. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  184. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/community/security.md.j2 +0 -0
  185. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  186. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  187. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  188. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  189. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  190. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/editorconfig.j2 +0 -0
  191. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/gitattributes.j2 +0 -0
  192. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/gitignore.j2 +0 -0
  193. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/go/go.mod.j2 +0 -0
  194. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/go/main.go.j2 +0 -0
  195. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  196. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  197. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  198. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  199. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  200. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  201. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  202. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  203. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  204. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  205. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  206. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/js/package.json.j2 +0 -0
  207. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/ledger.md.j2 +0 -0
  208. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/cli.py.j2 +0 -0
  209. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/init.py.j2 +0 -0
  210. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  211. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/readme.md.j2 +0 -0
  212. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  213. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  214. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  215. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  216. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  217. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  218. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  219. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  220. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  221. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/tool_installer.py +0 -0
  222. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/toolrules.py +0 -0
  223. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/trace.py +0 -0
  224. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/updater.py +0 -0
  225. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/upgrader.py +0 -0
  226. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/validator.py +0 -0
  227. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs/__init__.py +0 -0
  228. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs/base.py +0 -0
  229. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs/bitbucket.py +0 -0
  230. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs/github.py +0 -0
  231. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs/gitlab.py +0 -0
  232. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/vcs_commands.py +0 -0
  233. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/wireframes.py +0 -0
  234. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith/workspace.py +0 -0
  235. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/SOURCES.txt +0 -0
  236. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/dependency_links.txt +0 -0
  237. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/entry_points.txt +0 -0
  238. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/requires.txt +0 -0
  239. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/src/specsmith.egg-info/top_level.txt +0 -0
  240. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_CMD_001.py +0 -0
  241. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_agent_profiles.py +0 -0
  242. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_agent_runner_ready.py +0 -0
  243. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_ai_client.py +0 -0
  244. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_ai_intelligence.py +0 -0
  245. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_auditor.py +0 -0
  246. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_channel.py +0 -0
  247. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_chat_diff_decision.py +0 -0
  248. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_chat_runner_openai_compat.py +0 -0
  249. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_chat_stdin_protocol.py +0 -0
  250. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_cli.py +0 -0
  251. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_cli_workflows_history_drive.py +0 -0
  252. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_compliance.py +0 -0
  253. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_compressor.py +0 -0
  254. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_dispatch.py +0 -0
  255. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_e2e_nexus.py +0 -0
  256. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_endpoints_cli.py +0 -0
  257. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_endpoints_store.py +0 -0
  258. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_epistemic.py +0 -0
  259. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_fallback_chain.py +0 -0
  260. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_importer.py +0 -0
  261. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_integrations.py +0 -0
  262. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_intelligence.py +0 -0
  263. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_issue_reporter.py +0 -0
  264. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_mcp_client.py +0 -0
  265. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_new_modules.py +0 -0
  266. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_nexus.py +0 -0
  267. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_permissions.py +0 -0
  268. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_phase1_4_new.py +0 -0
  269. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_phase34_completion.py +0 -0
  270. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_rate_limits.py +0 -0
  271. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_req_248_262.py +0 -0
  272. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_scaffolder.py +0 -0
  273. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_skill_marketplace.py +0 -0
  274. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_skills_mcp.py +0 -0
  275. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_smoke.py +0 -0
  276. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_suggester.py +0 -0
  277. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_tools.py +0 -0
  278. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_validator.py +0 -0
  279. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_vcs.py +0 -0
  280. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_warp_parity.py +0 -0
  281. {specsmith-0.11.3.dev432 → specsmith-0.11.3.dev435}/tests/test_warp_parity_followup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.11.3.dev432
3
+ Version: 0.11.3.dev435
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.11.3.dev432"
7
+ version = "0.11.3.dev435"
8
8
  description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -66,6 +66,8 @@ class ProjectType(str, Enum):
66
66
  EMBEDDED_PYTHON_HMI = "embedded-python-hmi" # #109: hardware-interfacing kiosk/HMI
67
67
  RESEARCH_PYTHON = "research-python" # #153: experiment/research packages (no CLI)
68
68
  SAFETY_CRITICAL = "safety-critical" # #129: IEC 60204-1/62061/61508 safety-critical
69
+ # IP / Patent
70
+ PATENT_PROSECUTION = "patent-prosecution" # #177: IP prosecution with USPTO MCP lifecycle
69
71
 
70
72
 
71
73
  class Platform(str, Enum):
@@ -194,6 +196,67 @@ class ProjectConfig(BaseModel):
194
196
  ),
195
197
  )
196
198
 
199
+ # Fallback type — used when this project type is not yet supported
200
+ # by the installed specsmith version. specsmith silently falls back to
201
+ # this type for scaffolding purposes while still recording the intended type.
202
+ fallback_type: str = Field(
203
+ default="",
204
+ description=(
205
+ "Fallback project type for scaffold generation when `type` is not yet "
206
+ "supported by the installed specsmith version (e.g. 'spec-document' as "
207
+ "fallback for 'patent-prosecution')."
208
+ ),
209
+ )
210
+
211
+ # IP prosecution fields (used when type == 'patent-prosecution')
212
+ provisional_app_number: str = Field(
213
+ default="", description="USPTO provisional application number (e.g. '63/980,251')"
214
+ )
215
+ provisional_filed_date: str = Field(
216
+ default="", description="Date the provisional was filed (YYYY-MM-DD)"
217
+ )
218
+ non_provisional_deadline: str = Field(
219
+ default="",
220
+ description="12-month non-provisional conversion deadline (YYYY-MM-DD)",
221
+ )
222
+ entity_status: str = Field(default="", description="USPTO entity status: small, micro, large")
223
+ assignee: str = Field(default="", description="Patent assignee / rights holder")
224
+ counsel: str = Field(default="", description="Patent counsel firm name")
225
+ inventors: list[dict[str, str]] = Field(
226
+ default_factory=list,
227
+ description="List of inventors with name and role keys",
228
+ )
229
+ ip_families: list[dict[str, Any]] = Field(
230
+ default_factory=list,
231
+ description=(
232
+ "IP patent families. Each entry: {id, name, phase, provisional, themes, "
233
+ "anchor_spec, ...}."
234
+ ),
235
+ )
236
+ claim_themes: list[dict[str, Any]] = Field(
237
+ default_factory=list,
238
+ description=(
239
+ "Claim themes for the primary IP family. Each entry: {id, name, description, "
240
+ "risk, primary_comparator, last_par_run}."
241
+ ),
242
+ )
243
+ specs_dir: str = Field(
244
+ default="docs/ip/specs",
245
+ description="Normative specification directory for IP repos",
246
+ )
247
+ prosecution_dir: str = Field(
248
+ default="docs/ip/prosecution",
249
+ description="Prior-art protocol and prosecution planning directory",
250
+ )
251
+ strategy_dir: str = Field(
252
+ default="docs/ip/strategy",
253
+ description="IP strategy documents directory",
254
+ )
255
+ filings_dir: str = Field(
256
+ default="docs/ip/filings",
257
+ description="Immutable filed artifacts directory",
258
+ )
259
+
197
260
  # FPGA-specific
198
261
  fpga_vendor: str = Field(
199
262
  default="",
@@ -471,6 +534,8 @@ _TYPE_LABELS: dict[str, str] = {
471
534
  ProjectType.EMBEDDED_PYTHON_HMI: "Embedded Python HMI / kiosk (hardware-interfacing)",
472
535
  ProjectType.RESEARCH_PYTHON: "Research Python (experiments, no CLI distribution)",
473
536
  ProjectType.SAFETY_CRITICAL: "Safety-critical embedded (IEC 60204-1/62061/61508)",
537
+ # IP / Patent
538
+ ProjectType.PATENT_PROSECUTION: "Patent prosecution repository (USPTO IP lifecycle)",
474
539
  }
475
540
 
476
541
  _SECTION_REFS: dict[str, str] = {
@@ -398,6 +398,153 @@ PHASES: list[Phase] = [
398
398
  PHASE_MAP: dict[str, Phase] = {p.key: p for p in PHASES}
399
399
  PHASE_ORDER: list[str] = [p.key for p in PHASES]
400
400
 
401
+ # ---------------------------------------------------------------------------
402
+ # IP Prosecution phases (patent-prosecution project type — issue #177)
403
+ # ---------------------------------------------------------------------------
404
+
405
+ PROSECUTION_PHASES: list[Phase] = [
406
+ Phase(
407
+ key="provisional-draft",
408
+ label="Provisional Draft",
409
+ emoji="\U0001f4dd",
410
+ description="Invention disclosure and provisional specification being written.",
411
+ checks=[
412
+ PhaseCheck("AGENTS.md exists", _file_exists("AGENTS.md")),
413
+ PhaseCheck("docs/ip/specs/ exists", _file_exists("docs/ip/specs")),
414
+ PhaseCheck("scaffold.yml has ip_families field", _scaffold_field("ip_families")),
415
+ ],
416
+ commands=["specsmith audit", 'specsmith ledger add "Provisional draft in progress"'],
417
+ next_phase="filing",
418
+ ),
419
+ Phase(
420
+ key="filing",
421
+ label="Filing",
422
+ emoji="\U0001f4e8",
423
+ description="Provisional application prepared and submitted to USPTO.",
424
+ checks=[
425
+ PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
426
+ PhaseCheck(
427
+ "scaffold.yml has provisional_app_number",
428
+ _scaffold_field("provisional_app_number"),
429
+ ),
430
+ PhaseCheck(
431
+ "scaffold.yml has provisional_filed_date",
432
+ _scaffold_field("provisional_filed_date"),
433
+ ),
434
+ ],
435
+ commands=[
436
+ 'specsmith ledger add "Provisional filed at USPTO — App. <number>"',
437
+ 'specsmith trace seal milestone "Provisional filed"',
438
+ ],
439
+ next_phase="prior-art-search",
440
+ ),
441
+ Phase(
442
+ key="prior-art-search",
443
+ label="Prior-Art Search",
444
+ emoji="\U0001f50e",
445
+ description="Systematic prior-art protocol executed across all claim themes.",
446
+ checks=[
447
+ PhaseCheck(
448
+ "scaffold.yml has provisional_app_number",
449
+ _scaffold_field("provisional_app_number"),
450
+ ),
451
+ PhaseCheck(
452
+ "LEDGER.md has PAR run entry",
453
+ lambda root: any(
454
+ "PAR-" in (root / c).read_text(encoding="utf-8", errors="ignore")
455
+ for c in ["docs/LEDGER.md", "LEDGER.md"]
456
+ if (root / c).exists()
457
+ ),
458
+ ),
459
+ PhaseCheck("docs/ip/prosecution/ exists", _file_exists("docs/ip/prosecution")),
460
+ ],
461
+ commands=[
462
+ "prior-art protocol: start Themes A-H (USPTO MCP)",
463
+ 'specsmith ledger add "PAR-YYYY-MM-DD-001 complete — Themes A-H"',
464
+ ],
465
+ next_phase="claim-hardening",
466
+ ),
467
+ Phase(
468
+ key="claim-hardening",
469
+ label="Claim Hardening",
470
+ emoji="\U0001f527",
471
+ description="Claim language refined based on prior-art findings; §101/§102/§103 addressed.",
472
+ checks=[
473
+ PhaseCheck(
474
+ "LEDGER.md has PAR run entry",
475
+ lambda root: any(
476
+ "PAR-" in (root / c).read_text(encoding="utf-8", errors="ignore")
477
+ for c in ["docs/LEDGER.md", "LEDGER.md"]
478
+ if (root / c).exists()
479
+ ),
480
+ ),
481
+ PhaseCheck("docs/ip/specs/ has content", _file_min_lines("docs/ip/specs", 1)),
482
+ PhaseCheck("docs/ip/strategy/ exists", _file_exists("docs/ip/strategy")),
483
+ ],
484
+ commands=[
485
+ 'specsmith ledger add "Claim hardening session — Theme <X> hardened"',
486
+ 'specsmith trace seal decision "Claim strategy approved by counsel"',
487
+ ],
488
+ next_phase="non-provisional-draft",
489
+ ),
490
+ Phase(
491
+ key="non-provisional-draft",
492
+ label="Non-Provisional Draft",
493
+ emoji="\U0001f4c4",
494
+ description="Anchor non-provisional and continuation drafts being prepared by counsel.",
495
+ checks=[
496
+ PhaseCheck(
497
+ "scaffold.yml has non_provisional_deadline",
498
+ _scaffold_field("non_provisional_deadline"),
499
+ ),
500
+ PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
501
+ PhaseCheck("docs/ip/strategy/ exists", _file_exists("docs/ip/strategy")),
502
+ ],
503
+ commands=[
504
+ 'specsmith ledger add "Non-provisional draft v<N> submitted to counsel"',
505
+ ],
506
+ next_phase="examination",
507
+ ),
508
+ Phase(
509
+ key="examination",
510
+ label="Examination",
511
+ emoji="\U0001f50d",
512
+ description="Application under examination at USPTO. Responding to office actions.",
513
+ checks=[
514
+ PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
515
+ PhaseCheck(
516
+ "scaffold.yml has provisional_app_number",
517
+ _scaffold_field("provisional_app_number"),
518
+ ),
519
+ ],
520
+ commands=[
521
+ 'specsmith ledger add "OA response filed — <date>"',
522
+ 'specsmith trace seal milestone "Office action response submitted"',
523
+ ],
524
+ next_phase="allowance",
525
+ ),
526
+ Phase(
527
+ key="allowance",
528
+ label="Allowance",
529
+ emoji="\u2705",
530
+ description="Patent allowed or continuation strategy in execution.",
531
+ checks=[
532
+ PhaseCheck("docs/ip/filings/ exists", _file_exists("docs/ip/filings")),
533
+ PhaseCheck("Trace vault has seals", _trace_vault_exists()),
534
+ ],
535
+ commands=[
536
+ 'specsmith ledger add "NOA received — patent allowed"',
537
+ 'specsmith trace seal milestone "Patent allowed"',
538
+ ],
539
+ next_phase=None,
540
+ ),
541
+ ]
542
+
543
+ # Merge prosecution phases into PHASE_MAP so read_phase() can find them.
544
+ # Prosecution phases are intentionally NOT in PHASE_ORDER (the AEE sequence).
545
+ PROSECUTION_PHASE_MAP: dict[str, Phase] = {p.key: p for p in PROSECUTION_PHASES}
546
+ PHASE_MAP.update(PROSECUTION_PHASE_MAP)
547
+
401
548
 
402
549
  # ---------------------------------------------------------------------------
403
550
  # scaffold.yml I/O
@@ -4,6 +4,192 @@
4
4
  from specsmith.skills import SkillDomain, SkillEntry
5
5
 
6
6
  SKILLS: list[SkillEntry] = [
7
+ SkillEntry(
8
+ slug="github-health-check",
9
+ name="GitHub Health Check — CI/PR/security/code-quality triage",
10
+ description=(
11
+ "Systematic triage playbook for GitHub repository health: CI failures, "
12
+ "open PRs and review status, CodeQL security alerts, Dependabot alerts, "
13
+ "and code quality issues. Uses gh CLI and gh api exclusively."
14
+ ),
15
+ domain=SkillDomain.DEVOPS,
16
+ tags=[
17
+ "ci",
18
+ "github",
19
+ "security",
20
+ "codeql",
21
+ "dependabot",
22
+ "pr",
23
+ "triage",
24
+ "alerts",
25
+ "code-quality",
26
+ "gh",
27
+ ],
28
+ platforms=["linux", "windows", "macos"],
29
+ prerequisites=["gh"],
30
+ body="""\
31
+ # GitHub Health Check Skill
32
+
33
+ ## Triage order (always run in this sequence)
34
+ 1. **CI status** — are the latest runs passing?
35
+ 2. **Open PRs** — any blocked, unreviewed, or failing PRs?
36
+ 3. **CodeQL / security alerts** — any open code-scanning alerts?
37
+ 4. **Dependabot alerts** — any vulnerable dependencies?
38
+ 5. **Code quality / policy violations** — any rule violations?
39
+
40
+ ---
41
+
42
+ ## 1. CI status
43
+ ```bash
44
+ # Latest runs on a branch (all workflows)
45
+ gh run list --repo <owner>/<repo> --branch <branch> --limit 5
46
+
47
+ # Check conclusion of the single latest run
48
+ gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json conclusion,status,name,databaseId
49
+
50
+ # View failure logs for the latest failed run
51
+ gh run view --repo <owner>/<repo> --log-failed \
52
+ $(gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId --jq '.[0].databaseId')
53
+
54
+ # Wait for a specific run (never use sleep)
55
+ gh run watch --repo <owner>/<repo> <run-id>
56
+ ```
57
+ ```pwsh
58
+ # PowerShell
59
+ $runId = (gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId | ConvertFrom-Json).databaseId
60
+ gh run watch --repo <owner>/<repo> $runId
61
+ ```
62
+
63
+ **Reading status:**
64
+ - `conclusion: success` — green
65
+ - `conclusion: failure` — red; use `--log-failed` to triage
66
+ - `conclusion: null` + `status: in_progress` — still running; use `gh run watch`
67
+ - `conclusion: cancelled` — was aborted; re-run if stale
68
+
69
+ ---
70
+
71
+ ## 2. Open PRs and review status
72
+ ```bash
73
+ # List all open PRs with review state
74
+ gh pr list --repo <owner>/<repo> --state open --json number,title,reviewDecision,statusCheckRollup,author
75
+
76
+ # PRs with failed CI
77
+ gh pr list --repo <owner>/<repo> --state open --json number,title,statusCheckRollup \
78
+ --jq '[.[] | select(.statusCheckRollup[] | .conclusion == "FAILURE")]'
79
+
80
+ # PRs awaiting review (no decision yet)
81
+ gh pr list --repo <owner>/<repo> --state open --json number,title,reviewDecision \
82
+ --jq '[.[] | select(.reviewDecision == null or .reviewDecision == "REVIEW_REQUIRED")]'
83
+
84
+ # Full PR detail
85
+ gh pr view <number> --repo <owner>/<repo>
86
+ gh pr checks <number> --repo <owner>/<repo> # all CI check results for a PR
87
+ ```
88
+
89
+ **Review decision values:**
90
+ - `APPROVED` — at least one approval, no blockers
91
+ - `CHANGES_REQUESTED` — blocked by reviewer
92
+ - `REVIEW_REQUIRED` — no reviews yet
93
+ - `null` — no review policy configured
94
+
95
+ ---
96
+
97
+ ## 3. CodeQL / code-scanning alerts
98
+ ```bash
99
+ # All open code-scanning (CodeQL) alerts
100
+ gh api /repos/<owner>/<repo>/code-scanning/alerts?state=open --paginate \
101
+ --jq '.[] | {number: .number, rule: .rule.id, severity: .rule.severity, file: .most_recent_instance.location.path}'
102
+
103
+ # High/critical only
104
+ gh api "/repos/<owner>/<repo>/code-scanning/alerts?state=open&severity=high" --paginate
105
+ gh api "/repos/<owner>/<repo>/code-scanning/alerts?state=open&severity=critical" --paginate
106
+
107
+ # Dismiss a false-positive alert (requires security_events permission)
108
+ gh api --method PATCH /repos/<owner>/<repo>/code-scanning/alerts/<number> \
109
+ -f dismissed_reason='false positive' \
110
+ -f dismissed_comment='CodeQL does not track custom sanitizer <function_name>'
111
+
112
+ # Alert count summary
113
+ gh api /repos/<owner>/<repo>/code-scanning/alerts?state=open --paginate --jq 'length'
114
+ ```
115
+
116
+ **Severity triage order:** `critical` → `high` → `error` → `warning` → `note`
117
+
118
+ ---
119
+
120
+ ## 4. Dependabot alerts
121
+ ```bash
122
+ # All open Dependabot vulnerability alerts
123
+ gh api /repos/<owner>/<repo>/dependabot/alerts?state=open --paginate \
124
+ --jq '.[] | {number: .number, severity: .security_advisory.severity, package: .dependency.package.name, cve: .security_advisory.cve_id}'
125
+
126
+ # Critical/high only
127
+ gh api "/repos/<owner>/<repo>/dependabot/alerts?state=open&severity=critical" --paginate
128
+ gh api "/repos/<owner>/<repo>/dependabot/alerts?state=open&severity=high" --paginate
129
+
130
+ # Check for auto-generated Dependabot PRs
131
+ gh pr list --repo <owner>/<repo> --author 'dependabot[bot]' --state open
132
+
133
+ # Dismiss an alert (requires correct permission)
134
+ gh api --method PATCH /repos/<owner>/<repo>/dependabot/alerts/<number> \
135
+ -f state=dismissed \
136
+ -f dismissed_reason='tolerable_risk' \
137
+ -f dismissed_comment='Not reachable in production'
138
+ ```
139
+
140
+ **Severity triage order:** `critical` → `high` → `medium` → `low`
141
+
142
+ ---
143
+
144
+ ## 5. Code quality / policy violations
145
+ ```bash
146
+ # Repository rule violations (branch protection)
147
+ gh api /repos/<owner>/<repo>/rules/branches/<branch> 2>/dev/null | \
148
+ jq '.rules[] | {type: .type, enforcement: .enforcement}'
149
+
150
+ # Recent workflow runs with bypass violations
151
+ gh run list --repo <owner>/<repo> --limit 20 --json event,conclusion,displayTitle \
152
+ --jq '[.[] | select(.conclusion == "failure")]'
153
+
154
+ # Check branch protection status
155
+ gh api /repos/<owner>/<repo>/branches/<branch>/protection 2>/dev/null
156
+
157
+ # Secret scanning alerts (requires advanced security)
158
+ gh api /repos/<owner>/<repo>/secret-scanning/alerts?state=open 2>/dev/null --paginate
159
+ ```
160
+
161
+ ---
162
+
163
+ ## Full health snapshot (one-shot)
164
+ ```bash
165
+ #!/usr/bin/env bash
166
+ REPO="<owner>/<repo>"
167
+ BRANCH="<branch>"
168
+
169
+ echo "=== CI (latest 3 runs) ==="
170
+ gh run list --repo $REPO --branch $BRANCH --limit 3
171
+
172
+ echo "=== Open PRs ==="
173
+ gh pr list --repo $REPO --state open --json number,title,reviewDecision,author \
174
+ --jq '.[] | "#\\(.number) \\(.title) [\\(.reviewDecision // "NO_REVIEW")] by \\(.author.login)"'
175
+
176
+ echo "=== CodeQL alerts (open) ==="
177
+ gh api /repos/$REPO/code-scanning/alerts?state=open --paginate --jq 'length'
178
+
179
+ echo "=== Dependabot alerts (open) ==="
180
+ gh api /repos/$REPO/dependabot/alerts?state=open --paginate --jq 'length' 2>/dev/null || echo "N/A"
181
+ ```
182
+
183
+ ---
184
+
185
+ ## Key rules
186
+ - **Always triage in order**: CI → PRs → CodeQL → Dependabot → policy.
187
+ - Never dismiss a CodeQL alert as false positive without a specific comment explaining why.
188
+ - Dependabot `tolerable_risk` dismissals require a comment with the CVE and reachability rationale.
189
+ - `gh api` requires the `repo` or `security_events` scope depending on alert type.
190
+ - Check `gh auth status` first if any API calls return 401/403.
191
+ """,
192
+ ),
7
193
  SkillEntry(
8
194
  slug="github-actions-ci",
9
195
  name="GitHub Actions CI — Layer1Labs pattern (zero-trust, parallel, coverage-gated)",
@@ -40,7 +226,9 @@ Reference implementation: `chronomemory/.github/workflows/ci.yml`
40
226
  - `permissions: contents: read` on each individual job — grant minimum needed.
41
227
  - All jobs run **in parallel** — no `needs:` dependency chain unless truly required.
42
228
  - Full Python matrix: **3.10, 3.11, 3.12, 3.13** × ubuntu-latest, windows-latest.
43
- - Coverage gate: `--cov-fail-under=85`.
229
+ - Coverage gate: `--cov-fail-under=85` when the project can sustain it.
230
+ Omit or lower the threshold for large codebases with integration-heavy code
231
+ (e.g. CLI drivers, HTTP servers) that are structurally hard to unit-test.
44
232
  - Named jobs (`name:` field) for readable GitHub UI.
45
233
  - `fail-fast: false` on the test matrix so all combinations are reported.
46
234
 
@@ -108,6 +296,8 @@ jobs:
108
296
  cache: pip
109
297
  - run: pip install -e ".[dev]"
110
298
  - run: pytest --cov=<package> --cov-report=term-missing --cov-fail-under=85
299
+ # Note: omit --cov-fail-under when coverage is below 85% structurally
300
+ # (large CLIs/servers with hard-to-unit-test paths).
111
301
 
112
302
  security:
113
303
  name: Security audit (pip-audit)
@@ -129,7 +319,9 @@ jobs:
129
319
  - Do NOT set `permissions: contents: read` at workflow level — use `permissions: {}` + per-job grants.
130
320
  - Do NOT use `needs: [lint, typecheck]` to gate the test job — run all in parallel.
131
321
  - Do NOT omit Python 3.11 from the matrix.
132
- - Do NOT skip `--cov-fail-under` the 85% gate is non-negotiable.
322
+ - Do NOT skip `--cov-fail-under` when unit coverage can sustain 85%.
323
+ For large codebases with structural coverage limits, omit it rather than
324
+ carrying a perpetually-failing gate.
133
325
  - Do NOT use `cancel-in-progress: true` (concurrency block) unless there is a
134
326
  specific reason — chronomemory pattern omits it.
135
327
  - Do NOT use `macos-latest` in the matrix unless macOS-specific behavior must be
@@ -390,6 +390,146 @@ gh run list --repo <owner>/<repo> --branch <branch> --limit 1 --json databaseId,
390
390
  """
391
391
  ),
392
392
  ),
393
+ SkillEntry(
394
+ slug="patent-prosecution-workflow",
395
+ name="Patent Prosecution Workflow — prior-art protocol, USPTO MCP, claim themes",
396
+ description=(
397
+ "IP prosecution workflow for patent-prosecution type projects: prior-art protocol "
398
+ "execution, USPTO MCP server selection, PPUBS\u2192PatentsView fallback, PAR ID "
399
+ "assignment, claim theme tracking, and ledger entry format."
400
+ ),
401
+ domain=SkillDomain.GOVERNANCE,
402
+ tags=[
403
+ "patent",
404
+ "patent-prosecution",
405
+ "prior-art",
406
+ "uspto",
407
+ "mcp",
408
+ "ppubs",
409
+ "patentsview",
410
+ "claim-themes",
411
+ "ip",
412
+ "par",
413
+ ],
414
+ prerequisites=[],
415
+ body="""\
416
+ # Patent Prosecution Workflow Skill
417
+
418
+ For use with `type: patent-prosecution` projects (e.g. cpsc-core).
419
+ All MCP tool outputs are INFORMATIONAL. Never alter normative specifications
420
+ based on MCP output. No legal conclusions from tool output.
421
+
422
+ ## Prior-art protocol trigger
423
+
424
+ When a user issues a command beginning with `prior-art protocol:`, follow
425
+ this sequence:
426
+
427
+ 1. Re-read the current protocol text from `docs/ip/prosecution/` and `docs/ip/strategy/`.
428
+ 2. Identify which themes/claims are covered and which MCP sources are available.
429
+ 3. Execute the relevant portions using the appropriate MCP servers (see selection below).
430
+ 4. Assign a Run ID: `PAR-YYYY-MM-DD-NNN` (e.g. `PAR-2026-05-19-001`).
431
+ 5. Append a ledger entry (see format below).
432
+
433
+ Recognised command patterns (not a closed list):
434
+ ```
435
+ prior-art protocol: start Themes A-H (PPUBS only)
436
+ prior-art protocol: start Themes A-H (PTAB+PFW+CitA only)
437
+ prior-art protocol: status (USPTO MCP)
438
+ prior-art protocol: rerun since <reason> (USPTO MCP)
439
+ ```
440
+
441
+ ## MCP server selection matrix
442
+
443
+ | Need | Server |
444
+ |---|---|
445
+ | Front-door full-text patent search | `patents` (PPUBS / PatentsView) |
446
+ | PatentsView landscape query (CPC) | `patents` (`patentsview_search_by_cpc`) |
447
+ | PTAB trial / appeal research | `uspto_ptab` |
448
+ | File-wrapper, claim evolution, NOAs, office actions, examiner citations | `uspto_pfw` |
449
+ | Final petition decisions | `uspto_fpd` |
450
+ | Enriched citation analysis | `uspto_enriched_citations` |
451
+
452
+ For theme-based prior-art protocols: treat `uspto_ptab`, `uspto_pfw`, `uspto_fpd`,
453
+ `uspto_enriched_citations` as **primary** structured sources. Treat `patents`
454
+ (PPUBS/PatentsView) as **complementary** front-door search.
455
+
456
+ ## PPUBS → PatentsView fallback
457
+
458
+ When `patents` MCP returns HTTP 500 `INTERNAL_SERVER_ERROR` with
459
+ `"Unable to Process"` developer message:
460
+
461
+ 1. This is an **upstream PPUBS service issue** — not a misconfiguration.
462
+ 2. Immediately fall back to `patentsview_search_patents` (or `patentsview_search_by_cpc`).
463
+ 3. Continue the protocol using PatentsView + USPTO v3 MCP servers.
464
+ 4. Note explicitly in the response: *PPUBS 500 — results based on PatentsView / USPTO MCP*.
465
+
466
+ PPUBS 500s MUST NOT block prior-art protocol execution.
467
+
468
+ ## Claim theme tracking
469
+
470
+ Themes are defined in `scaffold.yml` under `claim_themes`. Each theme has:
471
+ - `id` — letter (A, B, C...)
472
+ - `name` — human description
473
+ - `risk` — `101-alice`, `103-low`, `103-moderate-high`, `none`, etc.
474
+ - `primary_comparator` — US patent number or null
475
+ - `last_par_run` — PAR ID of the most recent covering run
476
+
477
+ Before running a protocol, check which themes have stale `last_par_run`
478
+ values (run predates the most recent spec update).
479
+
480
+ ## PAR ID format
481
+
482
+ ```
483
+ PAR-YYYY-MM-DD-NNN
484
+ PAR-2026-05-19-001 # first run on 2026-05-19
485
+ PAR-2026-05-19-002 # second run same day
486
+ ```
487
+
488
+ Increment NNN by scanning existing PAR entries in `docs/LEDGER.md`.
489
+
490
+ ## Ledger entry format (append to docs/LEDGER.md)
491
+
492
+ ```markdown
493
+ ## PAR-YYYY-MM-DD-NNN — Prior-Art Run
494
+
495
+ - **Date**: YYYY-MM-DD
496
+ - **Trigger**: <user command or reason>
497
+ - **Themes**: A, B, C (or ALL)
498
+ - **MCP sources**: PPUBS, PatentsView, uspto_ptab, uspto_pfw, uspto_fpd, uspto_enriched_citations
499
+ - **Risk levels**: Theme A: 101-alice — Theme B: 103-moderate-high — ...
500
+ - **Conclusion summary**: <1-3 sentence summary of findings>
501
+ - **Stale themes post-run**: <list any themes needing re-run or NONE>
502
+ ```
503
+
504
+ ## Prosecution phases (patent-prosecution lifecycle)
505
+
506
+ | Phase | Key milestone |
507
+ |---|---|
508
+ | `provisional-draft` | Invention disclosure written; at least one embodiment documented |
509
+ | `filing` | Filed PDF in `docs/ip/filings/`; SHA-256 recorded in LEDGER.md |
510
+ | `prior-art-search` | All themes searched; each has ≥1 PAR run; risk levels assigned |
511
+ | `claim-hardening` | PAR findings applied to draft claims; counsel reviewed |
512
+ | `non-provisional-draft` | Draft complete; figures rendered; claim set approved by counsel |
513
+ | `examination` | Filed non-provisional; examiner assigned; responding to OAs |
514
+ | `allowance` | NOA received OR continuation filed |
515
+
516
+ ## Roles (agents in IP repos)
517
+
518
+ | Role | What they may do |
519
+ |---|---|
520
+ | **Spec Drafter** | Draft spec text; NOT finalize |
521
+ | **Reviewer** | Analyze, comment; NOT modify normative text |
522
+ | **Example Generator** | Non-normative folders only |
523
+ | **Implementation Assistant** | Cannot modify specs |
524
+
525
+ ## Invariants (NEVER violate)
526
+ - No legal conclusions from MCP tool output.
527
+ - No new semantics introduced without inventor approval.
528
+ - Filed artifacts in `docs/ip/filings/` are immutable.
529
+ - Normative content lives under `docs/ip/specs/` only.
530
+ - Experiment data belongs in `cpsc-engine-rtl`, not cpsc-core.
531
+ """,
532
+ ),
393
533
  SkillEntry(
394
534
  slug="issue-triage",
395
535
  name="Issue Triage — classify and prioritise GitHub issues",
@@ -311,6 +311,14 @@ _TOOL_REGISTRY: dict[ProjectType, ToolSet] = {
311
311
  build=["vivado -mode batch"],
312
312
  format=["ruff format"],
313
313
  ),
314
+ # --- IP / Patent prosecution ---
315
+ ProjectType.PATENT_PROSECUTION: ToolSet(
316
+ lint=["vale", "cspell"],
317
+ format=["prettier"],
318
+ build=["pandoc"],
319
+ compliance=["specsmith trace verify", "claim-ref-check"],
320
+ test=["markdown-link-check"],
321
+ ),
314
322
  # --- AEE / Epistemic project types ---
315
323
  ProjectType.EPISTEMIC_PIPELINE: ToolSet(
316
324
  lint=["ruff check", "specsmith stress-test"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.11.3.dev432
3
+ Version: 0.11.3.dev435
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
6
6
  License-Expression: MIT