codevira 2.0.0rc1__tar.gz → 2.1.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 (246) hide show
  1. {codevira-2.0.0rc1 → codevira-2.1.2}/CHANGELOG.md +372 -1
  2. {codevira-2.0.0rc1/codevira.egg-info → codevira-2.1.2}/PKG-INFO +174 -53
  3. {codevira-2.0.0rc1 → codevira-2.1.2}/README.md +163 -50
  4. {codevira-2.0.0rc1 → codevira-2.1.2/codevira.egg-info}/PKG-INFO +174 -53
  5. {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/SOURCES.txt +14 -1
  6. {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/requires.txt +9 -0
  7. codevira-2.1.2/docs/foolproof-product-charter.md +197 -0
  8. codevira-2.1.2/docs/internal/competitive-landscape.md +239 -0
  9. codevira-2.1.2/docs/plans/v2.1.2.md +1342 -0
  10. codevira-2.1.2/docs/release-process.md +335 -0
  11. codevira-2.1.2/docs/troubleshooting/antigravity.md +131 -0
  12. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/chunker.py +264 -71
  13. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/global_db.py +78 -21
  14. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/index_codebase.py +661 -101
  15. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/rule_learner.py +178 -28
  16. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/sqlite_graph.py +469 -168
  17. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/treesitter_parser.py +118 -65
  18. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/__init__.py +1 -1
  19. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_prompts.py +47 -0
  20. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/agents_md.py +33 -27
  21. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli.py +1266 -176
  22. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_agents.py +33 -21
  23. codevira-2.1.2/mcp_server/cli_calibrate.py +140 -0
  24. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_configure.py +153 -31
  25. codevira-2.1.2/mcp_server/cli_export.py +318 -0
  26. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_projects.py +62 -14
  27. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/crash_logger.py +119 -11
  28. codevira-2.1.2/mcp_server/data/rules/coding-standards-generic.md +60 -0
  29. codevira-2.1.2/mcp_server/data/rules/coding-standards-go.md +63 -0
  30. codevira-2.1.2/mcp_server/data/rules/coding-standards-typescript.md +56 -0
  31. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/detect.py +264 -66
  32. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/__init__.py +18 -9
  33. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/cross_session.py +280 -52
  34. codevira-2.1.2/mcp_server/engine/policies/post_edit_refresh.py +91 -0
  35. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/runner.py +17 -10
  36. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/token_meter.py +15 -6
  37. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/ide_inject.py +161 -33
  38. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/prompts.py +12 -3
  39. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/server.py +524 -75
  40. codevira-2.1.2/mcp_server/tools/_decision_embeddings.py +694 -0
  41. codevira-2.1.2/mcp_server/tools/check_conflict.py +175 -0
  42. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/code_reader.py +24 -18
  43. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/graph.py +285 -108
  44. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/learning.py +449 -40
  45. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/playbook.py +53 -11
  46. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/roadmap.py +297 -22
  47. codevira-2.1.2/mcp_server/tools/search.py +897 -0
  48. {codevira-2.0.0rc1 → codevira-2.1.2}/pyproject.toml +25 -3
  49. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_chunker.py +141 -17
  50. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli.py +396 -228
  51. codevira-2.1.2/tests/test_decision_embeddings.py +253 -0
  52. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_detect.py +141 -15
  53. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_global_db.py +96 -19
  54. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_ide_inject.py +369 -119
  55. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_index_codebase.py +851 -165
  56. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_server.py +533 -286
  57. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_sqlite_graph.py +530 -181
  58. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_graph.py +235 -53
  59. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_learning.py +332 -124
  60. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_roadmap.py +128 -51
  61. codevira-2.0.0rc1/mcp_server/data/__pycache__/__init__.cpython-313.pyc +0 -0
  62. codevira-2.0.0rc1/mcp_server/tools/search.py +0 -449
  63. {codevira-2.0.0rc1 → codevira-2.1.2}/LICENSE +0 -0
  64. {codevira-2.0.0rc1 → codevira-2.1.2}/MANIFEST.in +0 -0
  65. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/builder.md +0 -0
  66. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/developer.md +0 -0
  67. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/documenter.md +0 -0
  68. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/orchestrator.md +0 -0
  69. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/planner.md +0 -0
  70. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/01-code-review.md +0 -0
  71. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/02-adversarial-fix-review.md +0 -0
  72. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/03-cross-module-impact.md +0 -0
  73. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/06-doc-drift.md +0 -0
  74. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/07-security-audit.md +0 -0
  75. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/12-llm-redteam.md +0 -0
  76. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/13-multi-ide-schema.md +0 -0
  77. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/22-competitor-benchmark.md +0 -0
  78. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/README.md +0 -0
  79. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/tier2-scripts.md +0 -0
  80. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/qa/tier3-manual.md +0 -0
  81. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/reviewer.md +0 -0
  82. {codevira-2.0.0rc1 → codevira-2.1.2}/agents/tester.md +0 -0
  83. {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/dependency_links.txt +0 -0
  84. {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/entry_points.txt +0 -0
  85. {codevira-2.0.0rc1 → codevira-2.1.2}/codevira.egg-info/top_level.txt +0 -0
  86. {codevira-2.0.0rc1 → codevira-2.1.2}/config.example.yaml +0 -0
  87. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/alpha-tester-invites.md +0 -0
  88. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/demo/README.md +0 -0
  89. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/00-engine.md +0 -0
  90. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/01-decision-lock.md +0 -0
  91. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/02-anti-regression.md +0 -0
  92. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/03-scope-contract.md +0 -0
  93. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/04-blast-radius.md +0 -0
  94. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/05-cross-session.md +0 -0
  95. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/06-token-budget.md +0 -0
  96. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/07-live-style.md +0 -0
  97. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/08-decision-replay.md +0 -0
  98. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/09-intent-inference.md +0 -0
  99. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/10-ai-promotion.md +0 -0
  100. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/README.md +0 -0
  101. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/heroes/pillar-1-setup.md +0 -0
  102. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/hn-launch-day.md +0 -0
  103. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/how-i-built-persistent-memory-for-ai-agents.md +0 -0
  104. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/linkedin-article-ai-agent-memory.md +0 -0
  105. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/linkedin-post-ai-agent-memory.md +0 -0
  106. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/local-pypi-https.md +0 -0
  107. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/medium-your-ai-coding-agent-has-amnesia.md +0 -0
  108. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/qa-playbook.md +0 -0
  109. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/roadmap.md +0 -0
  110. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-completion-plan.md +0 -0
  111. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-execution-log.md +0 -0
  112. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/v2-master-plan.md +0 -0
  113. {codevira-2.0.0rc1 → codevira-2.1.2}/docs/vs-other-memory-tools.md +0 -0
  114. {codevira-2.0.0rc1 → codevira-2.1.2}/graph/_schema.yaml +0 -0
  115. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/__init__.py +0 -0
  116. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_dedupe_migration.py +0 -0
  117. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_fork_safety.py +0 -0
  118. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/_sqlite_util.py +0 -0
  119. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/fix_history.py +0 -0
  120. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/graph_generator.py +0 -0
  121. {codevira-2.0.0rc1 → codevira-2.1.2}/indexer/outcome_tracker.py +0 -0
  122. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/__main__.py +0 -0
  123. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_ghost_check.py +0 -0
  124. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_project_inventory.py +0 -0
  125. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_repair_init.py +0 -0
  126. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/_safe_crash.py +0 -0
  127. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/auto_init.py +0 -0
  128. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_budget.py +0 -0
  129. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_hooks_admin.py +0 -0
  130. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_insights.py +0 -0
  131. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/cli_replay.py +0 -0
  132. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/__init__.py +0 -0
  133. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/builder.md +0 -0
  134. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/developer.md +0 -0
  135. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/documenter.md +0 -0
  136. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/orchestrator.md +0 -0
  137. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/planner.md +0 -0
  138. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/reviewer.md +0 -0
  139. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/agents/tester.md +0 -0
  140. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/config.example.yaml +0 -0
  141. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/post_tool_use.sh +0 -0
  142. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/pre_tool_use.sh +0 -0
  143. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/session_start.sh +0 -0
  144. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/stop.sh +0 -0
  145. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/hooks/user_prompt_submit.sh +0 -0
  146. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/coding-standards.md +0 -0
  147. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/engineering-excellence.md +0 -0
  148. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/git-cicd-governance.md +0 -0
  149. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/git_commits.md +0 -0
  150. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/incremental-updates.md +0 -0
  151. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/master_rule.md +0 -0
  152. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/multi-language.md +0 -0
  153. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/persistence.md +0 -0
  154. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/resilience-observability.md +0 -0
  155. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/smoke-testing.md +0 -0
  156. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/rules/testing-standards.md +0 -0
  157. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/agents_md.tmpl +0 -0
  158. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/canonical_block.md +0 -0
  159. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/claude_md.tmpl +0 -0
  160. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/copilot_instructions.tmpl +0 -0
  161. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/cursor_rules.mdc.tmpl +0 -0
  162. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/gemini_md.tmpl +0 -0
  163. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/data/templates/windsurfrules.tmpl +0 -0
  164. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/decision_replay.py +0 -0
  165. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/doctor.py +0 -0
  166. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/demo_policy.py +0 -0
  167. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/events.py +0 -0
  168. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/intent_classifier.py +0 -0
  169. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/__init__.py +0 -0
  170. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/_signature_detect.py +0 -0
  171. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/ai_promotion.py +0 -0
  172. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/anti_regression.py +0 -0
  173. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/blast_radius.py +0 -0
  174. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/decision_lock.py +0 -0
  175. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/intent_inference.py +0 -0
  176. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/live_style.py +0 -0
  177. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/scope_contract.py +0 -0
  178. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policies/token_budget.py +0 -0
  179. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/policy.py +0 -0
  180. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/promotion_score.py +0 -0
  181. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/scope_contract.py +0 -0
  182. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/signals.py +0 -0
  183. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/__init__.py +0 -0
  184. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/claude_code_hooks.py +0 -0
  185. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/engine/wiring/mcp_dispatch.py +0 -0
  186. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/gitignore.py +0 -0
  187. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/global_sync.py +0 -0
  188. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/http_server.py +0 -0
  189. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/launchd.py +0 -0
  190. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/log_retention.py +0 -0
  191. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/migrate.py +0 -0
  192. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/paths.py +0 -0
  193. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/roadmap_drift.py +0 -0
  194. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/setup_wizard.py +0 -0
  195. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/__init__.py +0 -0
  196. {codevira-2.0.0rc1 → codevira-2.1.2}/mcp_server/tools/changesets.py +0 -0
  197. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/coding-standards.md +0 -0
  198. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/engineering-excellence.md +0 -0
  199. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/git-cicd-governance.md +0 -0
  200. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/git_commits.md +0 -0
  201. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/incremental-updates.md +0 -0
  202. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/master_rule.md +0 -0
  203. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/persistence.md +0 -0
  204. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/resilience-observability.md +0 -0
  205. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/smoke-testing.md +0 -0
  206. {codevira-2.0.0rc1 → codevira-2.1.2}/rules/testing-standards.md +0 -0
  207. {codevira-2.0.0rc1 → codevira-2.1.2}/setup.cfg +0 -0
  208. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test__prompts.py +0 -0
  209. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_auto_init.py +0 -0
  210. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_call_edge_fk_safety.py +0 -0
  211. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_agents.py +0 -0
  212. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_configure.py +0 -0
  213. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_insights.py +0 -0
  214. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_projects.py +0 -0
  215. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_replay.py +0 -0
  216. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_cli_version.py +0 -0
  217. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_crash_logger.py +0 -0
  218. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_dedupe_migration.py +0 -0
  219. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_doctor.py +0 -0
  220. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_fk_safety_extended.py +0 -0
  221. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_fork_safety.py +0 -0
  222. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_ghost_check.py +0 -0
  223. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_gitignore.py +0 -0
  224. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_global_sync.py +0 -0
  225. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_graph_generator.py +0 -0
  226. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_hook_resilience.py +0 -0
  227. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_http_server.py +0 -0
  228. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_launchd.py +0 -0
  229. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_log_retention.py +0 -0
  230. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_migrate.py +0 -0
  231. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_outcome_tracker.py +0 -0
  232. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_paths.py +0 -0
  233. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_prompts.py +0 -0
  234. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_record_decision.py +0 -0
  235. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_repair_init.py +0 -0
  236. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_retire_rule.py +0 -0
  237. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_roadmap_drift.py +0 -0
  238. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_rule_learner.py +0 -0
  239. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_setup_wizard.py +0 -0
  240. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_sqlite_util.py +0 -0
  241. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_changesets.py +0 -0
  242. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_code_reader.py +0 -0
  243. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_playbook.py +0 -0
  244. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_tools_search.py +0 -0
  245. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_treesitter_parser.py +0 -0
  246. {codevira-2.0.0rc1 → codevira-2.1.2}/tests/test_watcher_circuit.py +0 -0
@@ -11,7 +11,378 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
- ### Planned for v1.9
14
+ ## [2.1.2] 2026-05-19 — Trust recovery + QoL
15
+
16
+ Trust-recovery release based on **four independent field-test reports** that
17
+ converged on "trust" as the gap (not capability). Full plan:
18
+ [docs/plans/v2.1.2.md](docs/plans/v2.1.2.md).
19
+
20
+ ### Added — Smart similarity threshold (Item 1)
21
+
22
+ - `search_decisions` now applies a per-project, self-calibrating similarity
23
+ threshold before RRF fusion. Gibberish queries (`"zzzzzz xqzv9"`,
24
+ `"how to make a cake"`, `""`) return zero results with
25
+ `retrieval: "semantic-no-results-above-threshold"` instead of the
26
+ v2.1.1 regression where they surfaced the "least bad" matches.
27
+ - New `codevira calibrate` CLI command for manual threshold re-fit.
28
+ Auto-recalibration runs in a daemon thread every ~10 decisions added.
29
+ - Per-project `<data_dir>/calibration.json` (search threshold + hook
30
+ threshold + positive-sample count + ISO timestamp).
31
+ - Cross-session hook injection (`CrossSessionConsistency`) applies the
32
+ stricter `hook` threshold (search − 0.10). Commit-message-shaped
33
+ prompts (`feat(api):` / `fix:` / etc.) skipped entirely.
34
+
35
+ ### Added — Honest cleanup (Item 3)
36
+
37
+ - `codevira reset --vectors / --graph / --all` — destructive operations
38
+ split out of `codevira heal` (whose name implied fix-in-place).
39
+ - Auto-export of decisions + outcomes + preferences + learned_rules to
40
+ `<data_dir>/exports/<ts>-pre-<target>.json` BEFORE any wipe of `graph/`.
41
+ Pass `--no-backup` to skip.
42
+ - Typed confirmation: user must type `reset` / `graph` / `vectors` /
43
+ `all` (not just `y`) to proceed. `--yes` skips for scripts.
44
+ - `codevira heal --vectors / --graph / --all` deprecation cycle:
45
+ forwards to `cmd_reset` with a one-time warning. Removal planned v2.2.
46
+ - New `codevira export decisions [--format json|sql] [--out PATH]`
47
+ standalone backup command. Closes Report 1 §7 gap.
48
+ - New `confirm_typed(...)` helper in `_prompts.py`.
49
+
50
+ ### Added — Proactive correctness
51
+
52
+ - **Item 20**: `check_conflict(decision_text, file_path?)` MCP tool detects
53
+ duplicates and conflicts vs `do_not_revert=True` decisions. Uses Item 1's
54
+ calibrated threshold. `record_decision` runs it automatically pre-write
55
+ and surfaces `_conflict_warning` in the response (suppressible with
56
+ `force=True`).
57
+ - **Item 26**: `supersede_decision(old_id, new_decision, reason)` retires
58
+ a prior decision with auditable history. Schema auto-migrates with
59
+ `is_superseded INTEGER + superseded_by INTEGER`. `list_decisions` filters
60
+ superseded rows by default; `include_superseded=True` opts back in.
61
+
62
+ ### Added — Enumeration + filtering
63
+
64
+ - **Item 11**: `list_decisions(limit, since_date, file_pattern,
65
+ protected_only, session_id, tags, include_superseded, full)` MCP tool.
66
+ Closes Report 3 "remembers but can't list" gap.
67
+ - **Item 27 (partial)**: `tags=[...]` on `record_decision`; `list_tags()`
68
+ MCP tool; tag filter on `list_decisions`. `decision_tags` table
69
+ auto-migrated.
70
+ - **Item 25**: `since="YYYY-MM-DD"` (or ISO 8601) filter on
71
+ `search_decisions`, `get_history`, `get_session_context`. SQL-layer
72
+ for BM25, post-filter for semantic results.
73
+
74
+ ### Added — Batch APIs (Items 23 + 24)
75
+
76
+ - `record_decisions([...])` and `write_session_logs([...])` cut
77
+ memory-dump sessions from ~26 separate round trips to 1. Returns
78
+ `{count, recorded:[ids], errors:[{idx, error}]}` with per-item
79
+ partial-failure surfacing.
80
+
81
+ ### Added — Trust + correctness fixes
82
+
83
+ - **Item 2**: `get_node` / `get_impact` / `query_graph` / `update_node`
84
+ return `not_indexed: True` + null counts instead of misleading 0 for
85
+ un-indexed paths.
86
+ - **Item 4**: New `PostEditGraphRefresh` policy refreshes graph nodes in
87
+ a daemon thread after Edit/Write/MultiEdit so subsequent
88
+ `get_node` / `get_impact` calls see fresh data.
89
+ - **Item 9**: `global_db.get_rules()` strict-language match by default
90
+ (was `language = ? OR language IS NULL`). Prevents Go-project rules
91
+ with NULL language from leaking into Python projects. Pass
92
+ `strict_language=False` for legacy behavior.
93
+ - **Item 17**: Rule extractor noise filter — stopword filter + minimum
94
+ content-density gate + substring suppression in `_find_common_phrases`.
95
+ Pre-code projects (0 indexed source files) skip
96
+ `_infer_decision_pattern_rules` entirely.
97
+ - **Item 18**: `add_phase()` silently replaces the bootstrap
98
+ "Getting Started" placeholder when called with the SAME number (and
99
+ the placeholder is pristine — status=pending, no changesets, default
100
+ description).
101
+ - **Item 19**: Regression test for `file_path` serialization round-trip
102
+ through `get_session_context`'s `recent_decisions`.
103
+ - **Item 22**: `write_session_log` / `log_session` auto-suffix
104
+ `session_id` on content collision (was: silent `INSERT OR REPLACE`).
105
+ Same id + same summary remains idempotent; different summary returns
106
+ the new suffixed id with `collision_resolved: True`.
107
+ - **Item 33**: Hook commit-message pre-filter suppresses injection on
108
+ prompts matching `^(feat|fix|chore|docs|refactor|test|style|perf|build|ci|revert)(\(.*\))?:`.
109
+
110
+ ### Added — Roadmap workflow
111
+
112
+ - **Item 10**: `complete_phase(backfill=True, completed_at='YYYY-MM-DD')`
113
+ for retroactive phase completion (current / upcoming / synthetic
114
+ cases).
115
+ - **Item 12**: `complete_phase(git_ref="...")` links a commit sha or PR
116
+ reference to the completion entry.
117
+ - **Item 29**: `bulk_import_phases([...])` for adopting codevira on a
118
+ project that already shipped N phases in git. Idempotent.
119
+
120
+ ### Added — QoL
121
+
122
+ - **Item 5**: `do_not_revert` int→bool coercion at SQLite read boundary
123
+ (`search_decisions`, missing-rows fetch path). API contract now
124
+ matches schema.
125
+ - **Item 6**: Smart truncation in `top_signals.rules` (word-boundary +
126
+ path-aware, 160-char limit).
127
+ - **Item 7**: `summary` derived from first 80 chars of decision text
128
+ instead of `"ad-hoc record_decision"` placeholder.
129
+ - **Item 8**: `get_session_context` returns `confidence_note` instead of
130
+ `confidence=null` on fresh projects.
131
+ - **Item 28**: `summary_only=True` mode on `search_decisions` returns
132
+ id + summary + score + do_not_revert only — ~70% smaller payload for
133
+ AI triage queries.
134
+ - **Item 30**: `record_decision` input-coerced echo — when
135
+ `do_not_revert` is passed as a non-bool (int 1, string "true"),
136
+ response carries `_input_coerced_warning`.
137
+ - **Item 31**: Bundled non-Python playbooks (TypeScript / Go / generic)
138
+ in `mcp_server/data/rules/coding-standards-<lang>.md`. Auto-selected
139
+ by detected project language. Closes Report 1 §3.5.
140
+ - **Items 13 + 14**: `clean --orphans` catches bare global.db rows (no
141
+ data dir + path missing on disk). `clean --ghosts` catches truly-
142
+ empty data dirs (<10 KB, status='stale').
143
+
144
+ ### Added — Plan + governance (Item 16)
145
+
146
+ - `docs/plans/v2.1.2.md` mirrors the master plan (33 items + 4 deferred
147
+ v2.2-class items). Establishes release-planning discipline: every
148
+ vX.Y.Z release with 3+ items gets its own `docs/plans/` doc.
149
+ - `ROADMAP.md` v2.1.2 section.
150
+ - `CONTRIBUTING.md` Release planning + Documentation discipline.
151
+
152
+ ### Fixed
153
+
154
+ - **Item 21**: Multi-language `get_signature` / `get_code` confirmed
155
+ working in v2.1.1 (15+ languages via tree-sitter-language-pack). No
156
+ new code needed; doc fix only.
157
+ - **Item 32**: All 42 pre-existing mypy errors cleared via real fixes
158
+ (type narrowing, missing imports, `Counter` / `dict[str, Any]`
159
+ annotations, AST isinstance gating) and targeted
160
+ `# type: ignore[code]` for invariant pre-existing patterns. mypy is
161
+ now a hard pre-commit gate.
162
+
163
+ ### Late additions (caught by post-tag smoke testing)
164
+
165
+ These three patches landed AFTER the initial v2.1.2 release commit but
166
+ BEFORE shipping the wheel. They're all part of the v2.1.2 line:
167
+
168
+ - **bulk_import_phases placeholder fix**: importing `phase=1` on a
169
+ fresh project was silently SKIPPING phase 1 because the bootstrap
170
+ "Getting Started" placeholder occupies that number. Adopters
171
+ migrating multi-phase git history (Report 3 #5 — the exact use case
172
+ Item 29 exists for) would hit this. Fixed by applying Item 18's
173
+ placeholder-recognition logic to bulk_import too.
174
+ - **calibrate doc range fix**: `codevira calibrate --help` said
175
+ "Clamped to [0.20, 0.55]" but actual code clamps to [0.35, 0.80]
176
+ (the empirically-tuned values from Item 1 after measuring
177
+ all-MiniLM-L6-v2's distance distribution on real query/decision
178
+ pairs). Doc string corrected.
179
+ - **Issue #10 — Antigravity sandbox + torch dlopen**: graceful
180
+ degradation across 3 tiers. (1) Removed `prewarm_embedding_model()`
181
+ from MCP server startup — torch loads lazily on first
182
+ `search_codebase` / `search_decisions` call. MCP `initialize` and
183
+ `tools/list` complete instantly without touching torch. All
184
+ non-search tools work in Antigravity. (2) `_decisions_collection_or_none()`
185
+ traps `OSError` (macOS dlopen errors arrive as OSError, not
186
+ ImportError) and surfaces `_semantic_warning` in `search_decisions`
187
+ responses with a clear explanation + issue link.
188
+ (3) `docs/troubleshooting/antigravity.md` documents the root cause
189
+ and four user-side workarounds. Closes
190
+ [#10](https://github.com/sachinshelke/codevira/issues/10).
191
+
192
+ ### Tests
193
+
194
+ - 2401/2401 unit tests pass + 4/4 e2e cross-tool universality.
195
+ - Replaced: `test_log_session_replaces_on_duplicate` → idempotent +
196
+ auto-suffix variants (Item 22).
197
+ - Renamed: `test_8_evaluation_under_5ms_p95` → `_50ms_p95` (semantic
198
+ gate is inherently slower than BM25-only).
199
+ - Updated: all `test_default_heroes_*` / `test_*_default_policies_*`
200
+ acceptance tests to expect `post_edit_graph_refresh` in the default
201
+ set; `test_dispatch_complete_phase` (×2) + `test_dispatch_get_history`
202
+ for new kwarg defaults.
203
+ - New positive tests: `test_get_node_not_indexed`,
204
+ `test_get_impact_not_indexed`,
205
+ `test_gibberish_query_returns_zero_above_threshold`,
206
+ `test_session_context_recent_decisions_preserve_file_path`,
207
+ `test_add_phase_replaces_pristine_placeholder`,
208
+ `test_log_session_idempotent_on_same_content`,
209
+ `test_log_session_auto_suffixes_on_different_content`,
210
+ `test_language_filter_strict_excludes_null_language`,
211
+ `test_language_filter_loose_includes_null_language`.
212
+
213
+ ### Deferred to v2.1.3 / v2.2
214
+
215
+ - Full README rewrite with animated 60-second demo GIF (Item 15) — pair
216
+ with v2.2 launch / benchmark publishing once benchmark suite ships.
217
+ - Bundled `coding-standards-<lang>.md` for Rust / Java / etc. — extend
218
+ the per-language playbook system as adopters request.
219
+
220
+ ## [2.1.1] — 2026-05-17 — Hybrid decision search
221
+
222
+ ### Added
223
+ - **Hybrid search for `search_decisions`** (BM25 + ChromaDB semantic + RRF fusion).
224
+ Closes the UDAP-benchmark gap: queries like `"DDD architecture layer"` or
225
+ `"codevira backfill"` that returned 0 hits in v2.0/v2.1.0 now surface the
226
+ right decisions via semantic recall. Response includes a `retrieval` field
227
+ indicating which path contributed (hybrid / keyword / semantic).
228
+ - **`codevira heal --decisions`** — non-destructive backfill embedding all
229
+ existing decisions into the semantic index. Run once after upgrading from
230
+ v2.0/v2.1.0 to pick up hybrid recall on pre-existing decision history.
231
+ Idempotent (upsert pattern).
232
+ - **`mcp_server/tools/_decision_embeddings.py`** — new helper module:
233
+ embed_decision, semantic_search_decisions, rrf_merge, backfill_all_decisions.
234
+ P9 graceful degradation throughout — chromadb failures never block SQL
235
+ writes or BM25 reads.
236
+
237
+ ### Tests
238
+ - `tests/test_decision_embeddings.py` — 15 new regression tests covering
239
+ RRF math, graceful-degradation paths, and the explicit benchmark queries.
240
+
241
+ ## [2.1.0] — 2026-05-17 — Reliability hardening + Pillar 3 discipline scaffold
242
+
243
+ ### Added — Pillar 3: AI development discipline scaffold (2026-05-16)
244
+
245
+ The codevira repo now ships its own discipline scaffold — the same
246
+ pattern that will be exposed as `codevira discipline install` in
247
+ v2.2. This is the reference implementation, eaten as dog food.
248
+
249
+ - **`.claude/skills/`** — 4 SKILL.md files: `development-discipline`,
250
+ `open-source-quality`, `release-readiness`, `epistemic-honesty`.
251
+ - **`.claude/hooks/pre-release-block.sh`** — PreToolUse hard wall.
252
+ Refuses `twine upload`, `gh release ... --draft=false`,
253
+ `pipx publish`, etc. unless `.release-evidence/<version>.json`
254
+ shows G1–G5 pass. Bypass via `CODEVIRA_RELEASE_OVERRIDE=1`.
255
+ - **`Makefile`** — 12 targets including `release-verify-version`,
256
+ `release-gauntlet`, `release-build`, `release-dry-run`,
257
+ `release-publish`, `release-smoke`, `release-full`.
258
+ - **`.pre-commit-config.yaml`** — ruff lint+format, mypy, hygiene.
259
+ - **`tests/e2e/test_first_contact.py`** + 4 fixtures (docs_only,
260
+ code_only_python, polyglot, monorepo). G2 gate.
261
+ - **`.github/workflows/{ci,release-gate}.yml`** — CI hard wall.
262
+ - **`codevira.discipline.yaml`** — central scaffold config.
263
+ - **`scripts/check_real_ide_smoke.sh`** — G3 stub.
264
+ - **`docs/release-process.md`** — step-by-step foolproof release.
265
+
266
+ ### Planned for v2.1
267
+
268
+ See [ROADMAP.md](ROADMAP.md#-v21--new-user-first-contact--reliability-hardening).
269
+
270
+ - **Reliability hardening (23 bugs A–O)** — silent-failure elimination
271
+ surfaced by the discipline-scaffold e2e fixtures.
272
+ - **Hybrid search (BM25 + semantic + rerank)** — natural-language
273
+ decision search.
274
+ - **Decision deduplication** (ADD/UPDATE/NOOP) + audit trail.
275
+ - **Conditional hook injection** — kill the always-on token tax.
276
+ - **Multi-language `get_signature` / `get_code`** — wire tree-sitter.
277
+ - **`record_decisions_batch` API** — compress protocol overhead.
278
+ - **CLI naming clarity** — `init` / `setup` / `register` / `configure`
279
+ canonical hierarchy.
280
+
281
+ ---
282
+
283
+ ## [2.0.0] — 2026-05-14 — First public 2.0 release
284
+
285
+ The 2.0 release moves codevira from "memory layer for one developer in one IDE" to
286
+ "active guardian for every AI coding tool you use, on every project, on your local
287
+ machine." Five internal iterations (rc1..rc5 in dev tags) plus a same-day public
288
+ release-candidate cycle (`2.0.0rc1`) of dogfood + audit + product-credibility
289
+ work consolidate into 2.0.0. **Full changelog: [RELEASE_NOTES.md](RELEASE_NOTES.md).**
290
+
291
+ ### Added
292
+
293
+ - **All 10 hero policies** — active guardian engine intercepts every AI tool
294
+ call (Edit, Write, prompt submit, session start) and routes through
295
+ registered policies (Decision Lock, Anti-Regression, Scope Contract,
296
+ Blast-Radius Veto, Cross-Session Consistency, Token Budget, Live Style
297
+ Enforcement, Decision Replay, Proactive Intent Inference, AI Promotion
298
+ Score).
299
+ - **`codevira setup`** — one-prompt installer that detects every AI tool
300
+ on the machine (Claude Code, Cursor, Windsurf, Antigravity, OpenAI Codex,
301
+ GitHub Copilot, Continue.dev, Aider) and configures all of them at once.
302
+ - **`codevira projects`** — canonical inventory with `tracked / ghost /
303
+ orphan / stale` classification (`--json` for scripting; `--ghosts-only`
304
+ pairs with `clean --ghosts`).
305
+ - **`codevira hooks list / uninstall`** — admin commands for Claude Code
306
+ lifecycle hooks; surgical install + clean removal.
307
+ - **`codevira clean --ghosts`** — surgical removal of incomplete project
308
+ data dirs without touching tracked projects.
309
+ - **`codevira init --single-language`** — opt-out flag for the new
310
+ index-everything default.
311
+ - **`codevira engine` subcommand** — internal hook dispatcher; surfaces in
312
+ `--help` so the lifecycle hooks can call it.
313
+ - **4 new doctor checks** — `claude_mcp_visibility`, `codeindex_freshness`,
314
+ `semantic_search_health`, `ghost_projects` (total 14 per run).
315
+ - **Per-project config opt-out for cross-session injection** —
316
+ `.codevira/config.yaml: project: { cross_session_mode: off }` disables
317
+ the per-prompt context block without touching env vars.
318
+
319
+ ### Changed
320
+
321
+ - **`codevira init` default** — indexes every common source/config/docs
322
+ extension (~75 total: `.py`, `.ts`, `.go`, `.yaml`, `.toml`, `.md`,
323
+ `.html`, `.sql`, `.proto`, …) instead of narrowing to one language.
324
+ - **`codevira agents` default** — renders nudge files for **detected** IDEs
325
+ only; `--ide=all` opt-in for the legacy "render for every supported IDE"
326
+ behavior.
327
+ - **`codevira doctor`** — now genuinely read-only; snapshots the projects
328
+ dir at entry and removes any new dirs at exit.
329
+ - **`search_codebase`** — graceful structural fallback (filename + symbol
330
+ substring) when the semantic index is unavailable, with the correct
331
+ `fix_command` instead of a misleading "reinstall codevira" hint.
332
+ - **`get_node` / `get_impact` / `query_graph`** — three-case error
333
+ differentiation: "no graph DB" / "graph empty" / "file not in populated
334
+ graph", each with its own `fix_command`.
335
+ - **`get_decision_confidence`** — exposes `decisions_in_db_total` and
336
+ `decisions_eligible_for_outcomes` plus a four-state interpretation so
337
+ users understand WHY their `total_decisions` may be zero. Outcome
338
+ tracker also classifies file-less decisions via mention-extraction.
339
+ - **Playbooks** — project-scoped first
340
+ (`<data_dir>/playbooks/` or `<project>/.codevira/playbooks/`); bundled
341
+ Python defaults are skipped with a clear warning when project language
342
+ ≠ Python.
343
+ - **`register_project`** uses `ON CONFLICT … COALESCE(excluded.git_remote,
344
+ projects.git_remote)` — subsequent registrations can't silently clear
345
+ the `git_remote` column.
346
+ - **Auto-init self-heal** runs SYNCHRONOUSLY in the calling thread of every
347
+ CLI invocation — daemon thread death no longer leaves ghost data dirs.
348
+ - **Default install** includes ChromaDB + sentence-transformers (no
349
+ `[search]` extra needed for semantic search).
350
+ - **README "92% reduction" claim** qualified with honest scope, per-prompt
351
+ cost, and amortization curve.
352
+ - **`register` deprecation** now names the removal version (v2.1).
353
+
354
+ ### Fixed
355
+
356
+ - macOS Apple Silicon **fork-safety segfault on first `codevira index`**
357
+ (auto-applied at indexer import).
358
+ - **Setup interactive prompt** silent-fail on unexpected input — replaced
359
+ with a shared `_prompts.confirm` helper that retries, flushes stdout,
360
+ and handles `KeyboardInterrupt` cleanly.
361
+ - Three **`status --global` UI typos** that always rendered 0/0/0
362
+ regardless of actual `global.db` state.
363
+ - Four **FK race conditions** in the watcher pipeline.
364
+ - **Python `None` leaked into argparse choices** for `agents --ide` and
365
+ `budget` positional.
366
+ - Several **silent argument clamps** in `replay --since`, `insights --since`,
367
+ and `insights --top` now print visible warnings.
368
+
369
+ ### Tests
370
+
371
+ - 2395 / 2395 passing (deterministic).
372
+ - ~1091 net new tests since v1.8.0 (mostly from the v2.0 hero policies +
373
+ audit-driven regression coverage).
374
+
375
+ ### Note on internal v1.8.1 + 2.0.0rc1
376
+
377
+ A v1.8.1 production hotfix existed in dev tags but was never published to
378
+ PyPI; its fixes are folded into 2.0.0. A `2.0.0rc1` was briefly published
379
+ on PyPI (2026-05-14) as a same-day public release candidate; the code is
380
+ identical to 2.0.0. Anyone who installed `codevira==2.0.0rc1` can
381
+ `pipx install --upgrade codevira` to move to 2.0.0 final.
382
+
383
+ ---
384
+
385
+ ## [Original v1.9 plan, deferred]
15
386
 
16
387
  - **Interactive checkbox UI for `codevira configure`**. The current
17
388
  prompt asks users to type comma-separated indices ("1,3,5") into a