specsmith 0.3.0a1.dev8__tar.gz → 0.3.0.dev16__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 (142) hide show
  1. {specsmith-0.3.0a1.dev8/src/specsmith.egg-info → specsmith-0.3.0.dev16}/PKG-INFO +2 -3
  2. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/README.md +1 -2
  3. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/pyproject.toml +1 -1
  4. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/__init__.py +1 -1
  5. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/auditor.py +53 -11
  6. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/config.py +1 -1
  7. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/doctor.py +22 -4
  8. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/importer.py +26 -4
  9. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/validator.py +27 -4
  10. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16/src/specsmith.egg-info}/PKG-INFO +2 -3
  11. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/LICENSE +0 -0
  12. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/setup.cfg +0 -0
  13. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/belief.py +0 -0
  14. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/certainty.py +0 -0
  15. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/failure_graph.py +0 -0
  16. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/py.typed +0 -0
  17. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/recovery.py +0 -0
  18. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/session.py +0 -0
  19. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/stress_tester.py +0 -0
  20. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/epistemic/trace.py +0 -0
  21. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/__init__.py +0 -0
  22. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/__main__.py +0 -0
  23. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/__init__.py +0 -0
  24. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/core.py +0 -0
  25. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/hooks.py +0 -0
  26. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/epistemic-auditor.md +0 -0
  27. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/planner.md +0 -0
  28. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/profiles/verifier.md +0 -0
  29. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/__init__.py +0 -0
  30. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/anthropic.py +0 -0
  31. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/gemini.py +0 -0
  32. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/ollama.py +0 -0
  33. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/providers/openai.py +0 -0
  34. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/runner.py +0 -0
  35. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/skills.py +0 -0
  36. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/agent/tools.py +0 -0
  37. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/architect.py +0 -0
  38. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/auth.py +0 -0
  39. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/cli.py +0 -0
  40. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/commands/__init__.py +0 -0
  41. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/compressor.py +0 -0
  42. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/credit_analyzer.py +0 -0
  43. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/credits.py +0 -0
  44. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/differ.py +0 -0
  45. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/__init__.py +0 -0
  46. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/belief.py +0 -0
  47. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/certainty.py +0 -0
  48. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/failure_graph.py +0 -0
  49. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/recovery.py +0 -0
  50. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/epistemic/stress_tester.py +0 -0
  51. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/executor.py +0 -0
  52. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/exporter.py +0 -0
  53. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/__init__.py +0 -0
  54. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/aider.py +0 -0
  55. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/base.py +0 -0
  56. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/claude_code.py +0 -0
  57. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/copilot.py +0 -0
  58. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/cursor.py +0 -0
  59. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/gemini.py +0 -0
  60. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/warp.py +0 -0
  61. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/integrations/windsurf.py +0 -0
  62. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/ledger.py +0 -0
  63. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/patent.py +0 -0
  64. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/plugins.py +0 -0
  65. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/rate_limits.py +0 -0
  66. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/releaser.py +0 -0
  67. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/requirements.py +0 -0
  68. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/scaffolder.py +0 -0
  69. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/session.py +0 -0
  70. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/agents.md.j2 +0 -0
  71. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  72. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  73. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  74. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  75. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  76. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  77. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  78. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/community/security.md.j2 +0 -0
  79. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  80. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  81. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  82. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  83. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  84. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/docs/workflow.md.j2 +0 -0
  85. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/editorconfig.j2 +0 -0
  86. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/gitattributes.j2 +0 -0
  87. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/gitignore.j2 +0 -0
  88. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/go/go.mod.j2 +0 -0
  89. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/go/main.go.j2 +0 -0
  90. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  91. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  92. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  93. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  94. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  95. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  96. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  97. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  98. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  99. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/governance/workflow.md.j2 +0 -0
  100. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/js/package.json.j2 +0 -0
  101. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/ledger.md.j2 +0 -0
  102. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/cli.py.j2 +0 -0
  103. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/init.py.j2 +0 -0
  104. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  105. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/readme.md.j2 +0 -0
  106. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  107. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  108. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  109. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  110. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  111. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  112. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  113. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  114. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  115. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/tools.py +0 -0
  116. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/trace.py +0 -0
  117. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/updater.py +0 -0
  118. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/upgrader.py +0 -0
  119. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/__init__.py +0 -0
  120. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/base.py +0 -0
  121. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/bitbucket.py +0 -0
  122. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/github.py +0 -0
  123. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs/gitlab.py +0 -0
  124. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/vcs_commands.py +0 -0
  125. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith/workspace.py +0 -0
  126. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/SOURCES.txt +0 -0
  127. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/dependency_links.txt +0 -0
  128. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/entry_points.txt +0 -0
  129. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/requires.txt +0 -0
  130. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/src/specsmith.egg-info/top_level.txt +0 -0
  131. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_auditor.py +0 -0
  132. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_cli.py +0 -0
  133. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_compressor.py +0 -0
  134. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_epistemic.py +0 -0
  135. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_importer.py +0 -0
  136. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_integrations.py +0 -0
  137. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_rate_limits.py +0 -0
  138. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_scaffolder.py +0 -0
  139. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_smoke.py +0 -0
  140. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_tools.py +0 -0
  141. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_validator.py +0 -0
  142. {specsmith-0.3.0a1.dev8 → specsmith-0.3.0.dev16}/tests/test_vcs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.3.0a1.dev8
3
+ Version: 0.3.0.dev16
4
4
  Summary: Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines.
5
5
  Author: BitConcepts
6
6
  License: MIT
@@ -64,8 +64,7 @@ Dynamic: license-file
64
64
 
65
65
  [![CI](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml/badge.svg)](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
66
66
  [![Docs](https://readthedocs.org/projects/specsmith/badge/?version=stable)](https://specsmith.readthedocs.io/en/stable/)
67
- [![PyPI Stable](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
68
- [![PyPI Dev](https://img.shields.io/pypi/v/specsmith?include_prereleases=true&label=dev&style=flat&color=orange&cacheSeconds=60)](https://pypi.org/project/specsmith/#history)
67
+ [![PyPI](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
69
68
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
70
69
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
71
70
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml/badge.svg)](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
4
4
  [![Docs](https://readthedocs.org/projects/specsmith/badge/?version=stable)](https://specsmith.readthedocs.io/en/stable/)
5
- [![PyPI Stable](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
6
- [![PyPI Dev](https://img.shields.io/pypi/v/specsmith?include_prereleases=true&label=dev&style=flat&color=orange&cacheSeconds=60)](https://pypi.org/project/specsmith/#history)
5
+ [![PyPI](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
7
6
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
8
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
9
8
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.3.0a1.dev8"
7
+ version = "0.3.0.dev16"
8
8
  description = "Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines."
9
9
  readme = "README.md"
10
10
  license = {text = "MIT"}
@@ -143,7 +143,7 @@ from epistemic.recovery import RecoveryOperator, RecoveryProposal, RecoveryStrat
143
143
  from epistemic.session import AEEResult, AEESession
144
144
  from epistemic.stress_tester import StressTester, StressTestResult
145
145
 
146
- __version__ = "0.3.0a1"
146
+ __version__ = "0.3.0"
147
147
 
148
148
  __all__ = [
149
149
  # Session facade (primary entry point)
@@ -182,7 +182,17 @@ def check_req_test_consistency(root: Path) -> list[AuditResult]:
182
182
  req_text = req_path.read_text(encoding="utf-8")
183
183
  test_text = test_path.read_text(encoding="utf-8")
184
184
 
185
- req_ids = set(_REQ_PATTERN.findall(req_text))
185
+ # Only check coverage for non-Draft requirements.
186
+ # Draft requirements are stubs (e.g. auto-generated by import) and don't
187
+ # need tests yet — checking them would produce noise on freshly imported projects.
188
+ all_req_ids = set(_REQ_PATTERN.findall(req_text))
189
+ draft_req_ids: set[str] = set()
190
+ for block in re.split(r"(?=^## REQ-)", req_text, flags=re.MULTILINE):
191
+ ids_in_block = set(_REQ_PATTERN.findall(block))
192
+ if ids_in_block and re.search(r"\*\*Status\*\*:\s*[Dd]raft", block):
193
+ draft_req_ids |= ids_in_block
194
+ # Requirements that need coverage = all REQs minus those explicitly marked Draft
195
+ req_ids = all_req_ids - draft_req_ids
186
196
 
187
197
  # Find which REQs are covered by tests
188
198
  covered_reqs: set[str] = set()
@@ -201,12 +211,23 @@ def check_req_test_consistency(root: Path) -> list[AuditResult]:
201
211
  ),
202
212
  )
203
213
  )
214
+ elif draft_req_ids and not req_ids:
215
+ # All requirements are Draft — coverage is not yet required
216
+ results.append(
217
+ AuditResult(
218
+ name="req-test-coverage",
219
+ passed=True,
220
+ message=(
221
+ f"{len(all_req_ids)} REQ(s) are Draft (coverage not required until accepted)"
222
+ ),
223
+ )
224
+ )
204
225
  else:
205
226
  results.append(
206
227
  AuditResult(
207
228
  name="req-test-coverage",
208
229
  passed=True,
209
- message=f"All {len(req_ids)} REQ(s) have test coverage",
230
+ message=f"All {len(req_ids)} accepted REQ(s) have test coverage",
210
231
  )
211
232
  )
212
233
 
@@ -430,23 +451,44 @@ def check_tool_configuration(root: Path) -> list[AuditResult]:
430
451
  )
431
452
  return results
432
453
 
433
- missing: list[str] = []
434
- # Check that at least the primary lint and test tools appear in CI
435
- for cmd in tools.lint[:1]:
436
- tool_name = cmd.split()[0] # e.g. "ruff" from "ruff check"
437
- if tool_name not in ci_content:
438
- missing.append(f"lint:{tool_name}")
454
+ lint_missing: list[str] = []
455
+ test_missing: list[str] = []
456
+
457
+ # Check primary test tool (critical hard fail if absent)
439
458
  for cmd in tools.test[:1]:
440
459
  tool_name = cmd.split()[0]
441
460
  if tool_name not in ci_content:
442
- missing.append(f"test:{tool_name}")
461
+ test_missing.append(f"test:{tool_name}")
462
+
463
+ # Check primary lint tool (advisory — projects may use a different linter
464
+ # or none at all, especially when imported with existing CI)
465
+ for cmd in tools.lint[:1]:
466
+ tool_name = cmd.split()[0]
467
+ if tool_name not in ci_content:
468
+ lint_missing.append(f"lint:{tool_name}")
443
469
 
444
- if missing:
470
+ all_missing = test_missing + lint_missing
471
+
472
+ if test_missing:
473
+ # Test tool missing — hard failure (tests are non-negotiable)
445
474
  results.append(
446
475
  AuditResult(
447
476
  name="tool-ci-config",
448
477
  passed=False,
449
- message=f"CI config missing expected tools: {', '.join(missing)}",
478
+ message=f"CI config missing expected tools: {', '.join(all_missing)}",
479
+ )
480
+ )
481
+ elif lint_missing:
482
+ # Only lint missing — fixable warning (test tool is present; lint is advisory)
483
+ results.append(
484
+ AuditResult(
485
+ name="tool-ci-config",
486
+ passed=True, # Pass — test tool is there; lint is a recommendation
487
+ message=(
488
+ f"CI config missing lint tool ({', '.join(lint_missing)}); "
489
+ f"test tool is present. Consider adding {lint_missing[0].split(':')[1]}."
490
+ ),
491
+ fixable=True,
450
492
  )
451
493
  )
452
494
  else:
@@ -85,7 +85,7 @@ class ProjectConfig(BaseModel):
85
85
  description="Target platforms",
86
86
  )
87
87
  language: str = Field(default="python", description="Primary language/runtime")
88
- spec_version: str = Field(default="0.1.3", description="Spec version to scaffold from")
88
+ spec_version: str = Field(default="0.3.0", description="Spec version to scaffold from")
89
89
  description: str = Field(default="", description="Short project description")
90
90
 
91
91
  # Options
@@ -68,14 +68,15 @@ def run_doctor(root: Path) -> DoctorReport:
68
68
  ]:
69
69
  for cmd in cmds:
70
70
  tool_name = cmd.split()[0]
71
- check = _check_tool(tool_name, category)
71
+ # Pass root so doctor can find tools in the project's .venv
72
+ check = _check_tool(tool_name, category, root=root)
72
73
  report.checks.append(check)
73
74
 
74
75
  return report
75
76
 
76
77
 
77
- def _check_tool(name: str, category: str) -> ToolCheck:
78
- """Check if a tool is available on PATH."""
78
+ def _check_tool(name: str, category: str, root: Path | None = None) -> ToolCheck:
79
+ """Check if a tool is available on PATH or in the project's .venv."""
79
80
  # Handle compound tool names (cargo clippy → cargo)
80
81
  exe = name.split()[0] if " " in name else name
81
82
 
@@ -85,7 +86,24 @@ def _check_tool(name: str, category: str) -> ToolCheck:
85
86
  elif exe in ("golangci-lint",):
86
87
  pass # Already the executable name
87
88
 
89
+ # 1. Check system PATH
88
90
  path = shutil.which(exe)
91
+
92
+ # 2. Fall back to project's .venv (projects often don't install tools globally)
93
+ if not path and root is not None:
94
+ for venv_dir in (".venv", "venv", ".env"):
95
+ # POSIX layout: .venv/bin/<exe>
96
+ posix_path = root / venv_dir / "bin" / exe
97
+ # Windows layout: .venv\Scripts\<exe>.exe
98
+ win_path = root / venv_dir / "Scripts" / (exe + ".exe")
99
+ win_path_no_ext = root / venv_dir / "Scripts" / exe
100
+ for candidate in (posix_path, win_path, win_path_no_ext):
101
+ if candidate.exists():
102
+ path = str(candidate)
103
+ break
104
+ if path:
105
+ break
106
+
89
107
  if not path:
90
108
  return ToolCheck(name=name, category=category, installed=False)
91
109
 
@@ -93,7 +111,7 @@ def _check_tool(name: str, category: str) -> ToolCheck:
93
111
  version = ""
94
112
  try:
95
113
  result = subprocess.run(
96
- [exe, "--version"],
114
+ [path, "--version"],
97
115
  capture_output=True,
98
116
  text=True,
99
117
  timeout=5,
@@ -941,12 +941,18 @@ def _infer_type(result: DetectionResult) -> ProjectType:
941
941
 
942
942
  def generate_import_config(result: DetectionResult) -> ProjectConfig:
943
943
  """Generate a ProjectConfig from detection results."""
944
+ # Prefer README summary; fall back to generic description
945
+ description = (
946
+ result.readme_summary[:120]
947
+ if result.readme_summary
948
+ else f"Imported {result.primary_language or 'project'} library"
949
+ )
944
950
  return ProjectConfig(
945
951
  name=result.root.name,
946
952
  type=result.inferred_type or ProjectType.CLI_PYTHON,
947
953
  platforms=[Platform.WINDOWS, Platform.LINUX, Platform.MACOS],
948
954
  language=result.primary_language or "python",
949
- description=f"Imported project ({result.file_count} files detected)",
955
+ description=description,
950
956
  git_init=False, # Already has git
951
957
  vcs_platform=result.vcs_platform,
952
958
  detected_build_system=result.build_system,
@@ -1043,9 +1049,20 @@ def generate_overlay(
1043
1049
  tests += f"## TEST-{i:03d}\n- **File**: {test_file}\n- **Status**: Detected\n"
1044
1050
  for module in result.modules:
1045
1051
  if module in test_file:
1046
- tests += f"- **Requirement**: REQ-{module.upper()}-001\n"
1052
+ # Use 'Covers:' matches the audit's _TEST_COVERS_PATTERN
1053
+ tests += f" Covers: REQ-{module.upper().replace('-', '_')}-001\n"
1047
1054
  break
1048
1055
  tests += "\n"
1056
+ # Add an explicit build test so REQ-BUILD-001 has coverage
1057
+ if result.build_system:
1058
+ n = len(result.test_files[:20]) + 1
1059
+ tests += (
1060
+ f"## TEST-{n:03d}\n"
1061
+ "- **Type**: integration\n"
1062
+ f"- **Description**: Project installs and {result.test_framework or 'runs'} successfully\n" # noqa: E501
1063
+ " Covers: REQ-BUILD-001\n"
1064
+ "- **Status**: Detected\n\n"
1065
+ )
1049
1066
  _write("docs/TEST_SPEC.md", tests)
1050
1067
 
1051
1068
  # docs/architecture.md — skip if project has architecture doc anywhere under docs/
@@ -1054,7 +1071,7 @@ def generate_overlay(
1054
1071
  )
1055
1072
  if not (existing_arch and not force):
1056
1073
  arch = (
1057
- f"# Architecture {name}\n\n"
1074
+ f"# Architecture \u2014 {name}\n\n"
1058
1075
  "Architecture auto-generated from project detection.\n\n"
1059
1076
  "## Overview\n"
1060
1077
  f"- **Languages**: {lang_display}\n"
@@ -1064,7 +1081,9 @@ def generate_overlay(
1064
1081
  if result.modules:
1065
1082
  arch += "## Modules\n"
1066
1083
  for module in result.modules:
1067
- arch += f"- **{module}**: [Describe module purpose]\n"
1084
+ mu = module.upper().replace("-", "_")
1085
+ # Reference the auto-generated requirement so validate passes
1086
+ arch += f"- **{module}**: [Describe module purpose] (see REQ-{mu}-001)\n"
1068
1087
  arch += "\n"
1069
1088
  if result.entry_points:
1070
1089
  arch += "## Entry Points\n"
@@ -1075,6 +1094,9 @@ def generate_overlay(
1075
1094
  arch += "## Language Distribution\n"
1076
1095
  for lang_name, count in sorted(result.languages.items(), key=lambda x: -x[1]):
1077
1096
  arch += f"- {lang_name}: {count} files\n"
1097
+ if result.build_system:
1098
+ arch += "\n## Build\n"
1099
+ arch += f"- Build system: {result.build_system} (see REQ-BUILD-001)\n"
1078
1100
  _write("docs/ARCHITECTURE.md", arch)
1079
1101
 
1080
1102
  # --- Modular governance files ---
@@ -198,10 +198,19 @@ def _check_req_ids_unique(root: Path) -> list[ValidationResult]:
198
198
  def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
199
199
  """Check that architecture.md references requirements."""
200
200
  results: list[ValidationResult] = []
201
- arch_path = root / "docs" / "architecture.md"
201
+
202
+ # Accept both ARCHITECTURE.md and architecture.md
203
+ arch_path = next(
204
+ (
205
+ root / "docs" / f
206
+ for f in ("ARCHITECTURE.md", "architecture.md")
207
+ if (root / "docs" / f).exists()
208
+ ),
209
+ None,
210
+ )
202
211
  req_path = root / "docs" / "REQUIREMENTS.md"
203
212
 
204
- if not arch_path.exists() or not req_path.exists():
213
+ if arch_path is None or not req_path.exists():
205
214
  return results
206
215
 
207
216
  req_text = req_path.read_text(encoding="utf-8")
@@ -210,7 +219,16 @@ def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
210
219
  req_ids = set(_REQ_PATTERN.findall(req_text))
211
220
  arch_refs = set(_REQ_PATTERN.findall(arch_text))
212
221
 
213
- if req_ids and not arch_refs:
222
+ # If all requirements are Draft stubs (e.g. auto-generated by import),
223
+ # don't require architecture to reference them yet — they haven't been
224
+ # accepted or enriched. The check is only meaningful for accepted requirements.
225
+ all_draft = (
226
+ bool(req_ids)
227
+ and bool(re.search(r"\*\*Status\*\*:\s*[Dd]raft", req_text))
228
+ and not re.search(r"\*\*Status\*\*:\s*(?!Draft|draft)[A-Za-z]", req_text)
229
+ )
230
+
231
+ if req_ids and not arch_refs and not all_draft:
214
232
  results.append(
215
233
  ValidationResult(
216
234
  name="arch-req-refs",
@@ -221,11 +239,16 @@ def _check_architecture_reqs(root: Path) -> list[ValidationResult]:
221
239
  )
222
240
  )
223
241
  else:
242
+ msg = (
243
+ f"architecture.md references {len(arch_refs)} REQ IDs"
244
+ if arch_refs
245
+ else f"REQs are all Draft \u2014 architecture linkage not yet required ({len(req_ids)} REQs)" # noqa: E501
246
+ )
224
247
  results.append(
225
248
  ValidationResult(
226
249
  name="arch-req-refs",
227
250
  passed=True,
228
- message=f"architecture.md references {len(arch_refs)} REQ IDs",
251
+ message=msg,
229
252
  )
230
253
  )
231
254
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.3.0a1.dev8
3
+ Version: 0.3.0.dev16
4
4
  Summary: Applied Epistemic Engineering toolkit — forge epistemically-governed scaffolds, stress-test belief systems, and run AEE pipelines.
5
5
  Author: BitConcepts
6
6
  License: MIT
@@ -64,8 +64,7 @@ Dynamic: license-file
64
64
 
65
65
  [![CI](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml/badge.svg)](https://github.com/BitConcepts/specsmith/actions/workflows/ci.yml)
66
66
  [![Docs](https://readthedocs.org/projects/specsmith/badge/?version=stable)](https://specsmith.readthedocs.io/en/stable/)
67
- [![PyPI Stable](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
68
- [![PyPI Dev](https://img.shields.io/pypi/v/specsmith?include_prereleases=true&label=dev&style=flat&color=orange&cacheSeconds=60)](https://pypi.org/project/specsmith/#history)
67
+ [![PyPI](https://img.shields.io/pypi/v/specsmith?label=stable&style=flat&color=blue&cacheSeconds=60)](https://pypi.org/project/specsmith/)
69
68
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/downloads/)
70
69
  [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
71
70