codevira 3.0.0__tar.gz → 3.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. {codevira-3.0.0 → codevira-3.1.1}/CHANGELOG.md +423 -0
  2. {codevira-3.0.0/codevira.egg-info → codevira-3.1.1}/PKG-INFO +23 -1
  3. {codevira-3.0.0 → codevira-3.1.1}/README.md +22 -0
  4. {codevira-3.0.0 → codevira-3.1.1/codevira.egg-info}/PKG-INFO +23 -1
  5. {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/SOURCES.txt +31 -0
  6. codevira-3.1.1/docs/release-notes/v3.1.1.md +200 -0
  7. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/__init__.py +1 -1
  8. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli.py +160 -1
  9. codevira-3.1.1/mcp_server/cli_consensus.py +55 -0
  10. codevira-3.1.1/mcp_server/cli_graph.py +476 -0
  11. codevira-3.1.1/mcp_server/cli_induce.py +328 -0
  12. codevira-3.1.1/mcp_server/cli_reflect.py +170 -0
  13. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_sync.py +28 -0
  14. codevira-3.1.1/mcp_server/cli_working.py +89 -0
  15. codevira-3.1.1/mcp_server/data/affordances.yaml +44 -0
  16. codevira-3.1.1/mcp_server/data/prompts/reflection_v1.md +40 -0
  17. codevira-3.1.1/mcp_server/engine/memory_fanout.py +242 -0
  18. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/relevance_inject.py +12 -1
  19. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/mcp_dispatch.py +23 -2
  20. codevira-3.1.1/mcp_server/graph/template.html +2172 -0
  21. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/ide_inject.py +125 -14
  22. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/server.py +715 -0
  23. codevira-3.1.1/mcp_server/storage/activity_store.py +274 -0
  24. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/agents_md_generator.py +14 -6
  25. codevira-3.1.1/mcp_server/storage/config.py +64 -0
  26. codevira-3.1.1/mcp_server/storage/consensus_store.py +625 -0
  27. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/decisions_store.py +105 -33
  28. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/fts5_index.py +190 -0
  29. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/jsonl_store.py +185 -1
  30. codevira-3.1.1/mcp_server/storage/origin.py +130 -0
  31. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/outcomes_writer.py +47 -0
  32. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/paths.py +125 -0
  33. codevira-3.1.1/mcp_server/storage/reflections_store.py +342 -0
  34. codevira-3.1.1/mcp_server/storage/sanitize.py +44 -0
  35. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/sessions_store.py +43 -8
  36. codevira-3.1.1/mcp_server/storage/skills_store.py +747 -0
  37. codevira-3.1.1/mcp_server/storage/working_store.py +434 -0
  38. codevira-3.1.1/mcp_server/tools/__init__.py +0 -0
  39. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/check_conflict.py +4 -0
  40. codevira-3.1.1/mcp_server/tools/consensus.py +138 -0
  41. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/learning.py +75 -2
  42. codevira-3.1.1/mcp_server/tools/reflections.py +125 -0
  43. codevira-3.1.1/mcp_server/tools/skills.py +411 -0
  44. codevira-3.1.1/mcp_server/tools/spatial.py +521 -0
  45. codevira-3.1.1/mcp_server/tools/working.py +349 -0
  46. {codevira-3.0.0 → codevira-3.1.1}/pyproject.toml +2 -2
  47. {codevira-3.0.0 → codevira-3.1.1}/tests/test_check_conflict.py +69 -0
  48. codevira-3.1.1/tests/test_cli_consensus.py +426 -0
  49. codevira-3.1.1/tests/test_cli_graph.py +852 -0
  50. codevira-3.1.1/tests/test_cli_induce.py +859 -0
  51. codevira-3.1.1/tests/test_cli_working.py +109 -0
  52. codevira-3.1.1/tests/test_consensus_handshake.py +585 -0
  53. {codevira-3.0.0 → codevira-3.1.1}/tests/test_ide_inject.py +391 -0
  54. codevira-3.1.1/tests/test_reflections.py +764 -0
  55. {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_learning.py +65 -0
  56. codevira-3.1.1/tests/test_tools_skills.py +359 -0
  57. codevira-3.1.1/tests/test_tools_spatial.py +608 -0
  58. codevira-3.1.1/tests/test_tools_working.py +306 -0
  59. codevira-3.0.0/mcp_server/cli_graph.py +0 -447
  60. codevira-3.0.0/tests/test_cli_graph.py +0 -162
  61. {codevira-3.0.0 → codevira-3.1.1}/LICENSE +0 -0
  62. {codevira-3.0.0 → codevira-3.1.1}/MANIFEST.in +0 -0
  63. {codevira-3.0.0 → codevira-3.1.1}/agents/builder.md +0 -0
  64. {codevira-3.0.0 → codevira-3.1.1}/agents/developer.md +0 -0
  65. {codevira-3.0.0 → codevira-3.1.1}/agents/documenter.md +0 -0
  66. {codevira-3.0.0 → codevira-3.1.1}/agents/orchestrator.md +0 -0
  67. {codevira-3.0.0 → codevira-3.1.1}/agents/planner.md +0 -0
  68. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/01-code-review.md +0 -0
  69. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/02-adversarial-fix-review.md +0 -0
  70. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/03-cross-module-impact.md +0 -0
  71. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/06-doc-drift.md +0 -0
  72. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/07-security-audit.md +0 -0
  73. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/12-llm-redteam.md +0 -0
  74. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/13-multi-ide-schema.md +0 -0
  75. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/22-competitor-benchmark.md +0 -0
  76. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/README.md +0 -0
  77. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/tier2-scripts.md +0 -0
  78. {codevira-3.0.0 → codevira-3.1.1}/agents/qa/tier3-manual.md +0 -0
  79. {codevira-3.0.0 → codevira-3.1.1}/agents/reviewer.md +0 -0
  80. {codevira-3.0.0 → codevira-3.1.1}/agents/tester.md +0 -0
  81. {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/dependency_links.txt +0 -0
  82. {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/entry_points.txt +0 -0
  83. {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/requires.txt +0 -0
  84. {codevira-3.0.0 → codevira-3.1.1}/codevira.egg-info/top_level.txt +0 -0
  85. {codevira-3.0.0 → codevira-3.1.1}/config.example.yaml +0 -0
  86. {codevira-3.0.0 → codevira-3.1.1}/docs/alpha-tester-invites.md +0 -0
  87. {codevira-3.0.0 → codevira-3.1.1}/docs/architecture.md +0 -0
  88. {codevira-3.0.0 → codevira-3.1.1}/docs/audit-2026-05-22.md +0 -0
  89. {codevira-3.0.0 → codevira-3.1.1}/docs/demo/README.md +0 -0
  90. {codevira-3.0.0 → codevira-3.1.1}/docs/foolproof-product-charter.md +0 -0
  91. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/00-engine.md +0 -0
  92. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/01-decision-lock.md +0 -0
  93. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/02-anti-regression.md +0 -0
  94. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/03-scope-contract.md +0 -0
  95. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/04-blast-radius.md +0 -0
  96. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/05-cross-session.md +0 -0
  97. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/06-token-budget.md +0 -0
  98. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/07-live-style.md +0 -0
  99. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/08-decision-replay.md +0 -0
  100. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/09-intent-inference.md +0 -0
  101. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/10-ai-promotion.md +0 -0
  102. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/README.md +0 -0
  103. {codevira-3.0.0 → codevira-3.1.1}/docs/heroes/pillar-1-setup.md +0 -0
  104. {codevira-3.0.0 → codevira-3.1.1}/docs/hn-launch-day.md +0 -0
  105. {codevira-3.0.0 → codevira-3.1.1}/docs/how-i-built-persistent-memory-for-ai-agents.md +0 -0
  106. {codevira-3.0.0 → codevira-3.1.1}/docs/internal/competitive-landscape.md +0 -0
  107. {codevira-3.0.0 → codevira-3.1.1}/docs/linkedin-article-ai-agent-memory.md +0 -0
  108. {codevira-3.0.0 → codevira-3.1.1}/docs/linkedin-post-ai-agent-memory.md +0 -0
  109. {codevira-3.0.0 → codevira-3.1.1}/docs/local-pypi-https.md +0 -0
  110. {codevira-3.0.0 → codevira-3.1.1}/docs/medium-your-ai-coding-agent-has-amnesia.md +0 -0
  111. {codevira-3.0.0 → codevira-3.1.1}/docs/morning-handoff-2026-05-22.md +0 -0
  112. {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.1.2.md +0 -0
  113. {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.1.3.md +0 -0
  114. {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v2.2.0.md +0 -0
  115. {codevira-3.0.0 → codevira-3.1.1}/docs/plans/v3.0.0.md +0 -0
  116. {codevira-3.0.0 → codevira-3.1.1}/docs/qa-playbook.md +0 -0
  117. {codevira-3.0.0 → codevira-3.1.1}/docs/release-process.md +0 -0
  118. {codevira-3.0.0 → codevira-3.1.1}/docs/roadmap.md +0 -0
  119. {codevira-3.0.0 → codevira-3.1.1}/docs/surface-cuts-2026-05-22.md +0 -0
  120. {codevira-3.0.0 → codevira-3.1.1}/docs/troubleshooting/antigravity.md +0 -0
  121. {codevira-3.0.0 → codevira-3.1.1}/docs/v2-completion-plan.md +0 -0
  122. {codevira-3.0.0 → codevira-3.1.1}/docs/v2-execution-log.md +0 -0
  123. {codevira-3.0.0 → codevira-3.1.1}/docs/v2-master-plan.md +0 -0
  124. {codevira-3.0.0 → codevira-3.1.1}/docs/vs-other-memory-tools.md +0 -0
  125. {codevira-3.0.0 → codevira-3.1.1}/graph/_schema.yaml +0 -0
  126. {codevira-3.0.0 → codevira-3.1.1}/indexer/__init__.py +0 -0
  127. {codevira-3.0.0 → codevira-3.1.1}/indexer/_dedupe_migration.py +0 -0
  128. {codevira-3.0.0 → codevira-3.1.1}/indexer/_fork_safety.py +0 -0
  129. {codevira-3.0.0 → codevira-3.1.1}/indexer/_sqlite_util.py +0 -0
  130. {codevira-3.0.0 → codevira-3.1.1}/indexer/chunker.py +0 -0
  131. {codevira-3.0.0 → codevira-3.1.1}/indexer/fix_history.py +0 -0
  132. {codevira-3.0.0 → codevira-3.1.1}/indexer/global_db.py +0 -0
  133. {codevira-3.0.0 → codevira-3.1.1}/indexer/graph_generator.py +0 -0
  134. {codevira-3.0.0 → codevira-3.1.1}/indexer/index_codebase.py +0 -0
  135. {codevira-3.0.0 → codevira-3.1.1}/indexer/outcome_tracker.py +0 -0
  136. {codevira-3.0.0 → codevira-3.1.1}/indexer/sqlite_graph.py +0 -0
  137. {codevira-3.0.0 → codevira-3.1.1}/indexer/treesitter_parser.py +0 -0
  138. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/__main__.py +0 -0
  139. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_ghost_check.py +0 -0
  140. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_mcp_registry.py +0 -0
  141. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_project_inventory.py +0 -0
  142. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_prompts.py +0 -0
  143. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_repair_init.py +0 -0
  144. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/_safe_crash.py +0 -0
  145. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/auto_init.py +0 -0
  146. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_export.py +0 -0
  147. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_hooks_admin.py +0 -0
  148. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_init.py +0 -0
  149. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_projects.py +0 -0
  150. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_replay.py +0 -0
  151. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/cli_uninstall.py +0 -0
  152. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/crash_logger.py +0 -0
  153. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/__init__.py +0 -0
  154. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/builder.md +0 -0
  155. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/developer.md +0 -0
  156. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/documenter.md +0 -0
  157. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/orchestrator.md +0 -0
  158. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/planner.md +0 -0
  159. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/reviewer.md +0 -0
  160. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/agents/tester.md +0 -0
  161. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/config.example.yaml +0 -0
  162. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/post_tool_use.sh +0 -0
  163. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/pre_tool_use.sh +0 -0
  164. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/session_start.sh +0 -0
  165. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/stop.sh +0 -0
  166. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/hooks/user_prompt_submit.sh +0 -0
  167. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-generic.md +0 -0
  168. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-go.md +0 -0
  169. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards-typescript.md +0 -0
  170. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/coding-standards.md +0 -0
  171. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/engineering-excellence.md +0 -0
  172. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/git-cicd-governance.md +0 -0
  173. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/git_commits.md +0 -0
  174. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/incremental-updates.md +0 -0
  175. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/master_rule.md +0 -0
  176. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/multi-language.md +0 -0
  177. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/persistence.md +0 -0
  178. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/resilience-observability.md +0 -0
  179. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/smoke-testing.md +0 -0
  180. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/data/rules/testing-standards.md +0 -0
  181. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/decision_replay.py +0 -0
  182. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/detect.py +0 -0
  183. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/doctor.py +0 -0
  184. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/__init__.py +0 -0
  185. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/demo_policy.py +0 -0
  186. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/events.py +0 -0
  187. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/__init__.py +0 -0
  188. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/_signature_detect.py +0 -0
  189. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/anti_regression.py +0 -0
  190. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/blast_radius.py +0 -0
  191. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/decision_lock.py +0 -0
  192. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/post_edit_refresh.py +0 -0
  193. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policies/token_budget.py +0 -0
  194. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/policy.py +0 -0
  195. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/runner.py +0 -0
  196. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/signals.py +0 -0
  197. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/token_meter.py +0 -0
  198. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/__init__.py +0 -0
  199. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/engine/wiring/claude_code_hooks.py +0 -0
  200. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/gitignore.py +0 -0
  201. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/global_sync.py +0 -0
  202. {codevira-3.0.0/mcp_server/tools → codevira-3.1.1/mcp_server/graph}/__init__.py +0 -0
  203. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/http_server.py +0 -0
  204. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/launchd.py +0 -0
  205. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/log_retention.py +0 -0
  206. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/migrate.py +0 -0
  207. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/paths.py +0 -0
  208. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/prompts.py +0 -0
  209. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/roadmap_drift.py +0 -0
  210. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/setup_wizard.py +0 -0
  211. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/__init__.py +0 -0
  212. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/atomic.py +0 -0
  213. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/digest.py +0 -0
  214. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/manifest.py +0 -0
  215. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/storage/token_estimator.py +0 -0
  216. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/changesets.py +0 -0
  217. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/code_reader.py +0 -0
  218. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/graph.py +0 -0
  219. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/playbook.py +0 -0
  220. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/roadmap.py +0 -0
  221. {codevira-3.0.0 → codevira-3.1.1}/mcp_server/tools/search.py +0 -0
  222. {codevira-3.0.0 → codevira-3.1.1}/rules/coding-standards.md +0 -0
  223. {codevira-3.0.0 → codevira-3.1.1}/rules/engineering-excellence.md +0 -0
  224. {codevira-3.0.0 → codevira-3.1.1}/rules/git-cicd-governance.md +0 -0
  225. {codevira-3.0.0 → codevira-3.1.1}/rules/git_commits.md +0 -0
  226. {codevira-3.0.0 → codevira-3.1.1}/rules/incremental-updates.md +0 -0
  227. {codevira-3.0.0 → codevira-3.1.1}/rules/master_rule.md +0 -0
  228. {codevira-3.0.0 → codevira-3.1.1}/rules/persistence.md +0 -0
  229. {codevira-3.0.0 → codevira-3.1.1}/rules/resilience-observability.md +0 -0
  230. {codevira-3.0.0 → codevira-3.1.1}/rules/smoke-testing.md +0 -0
  231. {codevira-3.0.0 → codevira-3.1.1}/rules/testing-standards.md +0 -0
  232. {codevira-3.0.0 → codevira-3.1.1}/setup.cfg +0 -0
  233. {codevira-3.0.0 → codevira-3.1.1}/tests/test__prompts.py +0 -0
  234. {codevira-3.0.0 → codevira-3.1.1}/tests/test_auto_init.py +0 -0
  235. {codevira-3.0.0 → codevira-3.1.1}/tests/test_call_edge_fk_safety.py +0 -0
  236. {codevira-3.0.0 → codevira-3.1.1}/tests/test_chunker.py +0 -0
  237. {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_projects.py +0 -0
  238. {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_replay.py +0 -0
  239. {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_uninstall.py +0 -0
  240. {codevira-3.0.0 → codevira-3.1.1}/tests/test_cli_version.py +0 -0
  241. {codevira-3.0.0 → codevira-3.1.1}/tests/test_crash_logger.py +0 -0
  242. {codevira-3.0.0 → codevira-3.1.1}/tests/test_dedupe_migration.py +0 -0
  243. {codevira-3.0.0 → codevira-3.1.1}/tests/test_detect.py +0 -0
  244. {codevira-3.0.0 → codevira-3.1.1}/tests/test_doctor.py +0 -0
  245. {codevira-3.0.0 → codevira-3.1.1}/tests/test_fk_safety_extended.py +0 -0
  246. {codevira-3.0.0 → codevira-3.1.1}/tests/test_fork_safety.py +0 -0
  247. {codevira-3.0.0 → codevira-3.1.1}/tests/test_ghost_check.py +0 -0
  248. {codevira-3.0.0 → codevira-3.1.1}/tests/test_gitignore.py +0 -0
  249. {codevira-3.0.0 → codevira-3.1.1}/tests/test_global_db.py +0 -0
  250. {codevira-3.0.0 → codevira-3.1.1}/tests/test_global_sync.py +0 -0
  251. {codevira-3.0.0 → codevira-3.1.1}/tests/test_graph_generator.py +0 -0
  252. {codevira-3.0.0 → codevira-3.1.1}/tests/test_hook_resilience.py +0 -0
  253. {codevira-3.0.0 → codevira-3.1.1}/tests/test_http_server.py +0 -0
  254. {codevira-3.0.0 → codevira-3.1.1}/tests/test_index_codebase.py +0 -0
  255. {codevira-3.0.0 → codevira-3.1.1}/tests/test_launchd.py +0 -0
  256. {codevira-3.0.0 → codevira-3.1.1}/tests/test_log_retention.py +0 -0
  257. {codevira-3.0.0 → codevira-3.1.1}/tests/test_migrate.py +0 -0
  258. {codevira-3.0.0 → codevira-3.1.1}/tests/test_outcome_tracker.py +0 -0
  259. {codevira-3.0.0 → codevira-3.1.1}/tests/test_paths.py +0 -0
  260. {codevira-3.0.0 → codevira-3.1.1}/tests/test_prompts.py +0 -0
  261. {codevira-3.0.0 → codevira-3.1.1}/tests/test_record_decision.py +0 -0
  262. {codevira-3.0.0 → codevira-3.1.1}/tests/test_repair_init.py +0 -0
  263. {codevira-3.0.0 → codevira-3.1.1}/tests/test_roadmap_drift.py +0 -0
  264. {codevira-3.0.0 → codevira-3.1.1}/tests/test_server.py +0 -0
  265. {codevira-3.0.0 → codevira-3.1.1}/tests/test_setup_wizard.py +0 -0
  266. {codevira-3.0.0 → codevira-3.1.1}/tests/test_sqlite_graph.py +0 -0
  267. {codevira-3.0.0 → codevira-3.1.1}/tests/test_sqlite_util.py +0 -0
  268. {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_code_reader.py +0 -0
  269. {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_graph.py +0 -0
  270. {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_playbook.py +0 -0
  271. {codevira-3.0.0 → codevira-3.1.1}/tests/test_tools_roadmap.py +0 -0
  272. {codevira-3.0.0 → codevira-3.1.1}/tests/test_treesitter_parser.py +0 -0
  273. {codevira-3.0.0 → codevira-3.1.1}/tests/test_watcher_circuit.py +0 -0
@@ -9,6 +9,429 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
9
9
 
10
10
  ---
11
11
 
12
+ ## [3.1.1] — 2026-05-30 — Hardening, viewer overhaul, G3, sync-observe-git
13
+
14
+ v3.1.1 is the hardening release that supersedes the brief 3.1.0
15
+ window. Same five memory subsystems, but the read/write surface
16
+ is tightened (secret scrubbing across every store), the viewer
17
+ graduates from "look at the graph" to "interrogate the memory"
18
+ (ranked search + Q&A + outcome lens + lineage trace), and the
19
+ last permanently-skipped gauntlet gate (G3 real-IDE smoke) ships
20
+ as a real check.
21
+
22
+ If you installed 3.1.0, `pip install --upgrade codevira` brings
23
+ you straight to 3.1.1. 3.1.0 is yanked: undocumented at release
24
+ time (this CHANGELOG entry didn't ship with it), superseded
25
+ without code regressions.
26
+
27
+ ### Memory hardening
28
+
29
+ - **Secret scrubbing across every store.** M8 (reflections) and
30
+ M3 (skills) already scrubbed; v3.1.1 brings parity to M2
31
+ (working) and to `decisions_store.record` (decision text +
32
+ context). One shared module: `mcp_server/storage/sanitize.py`.
33
+ Patterns: api-key, Bearer, password, AWS AKIA, long hex,
34
+ long base64. Scrub runs at the storage-write boundary so the
35
+ secret never lands on disk in committed surfaces.
36
+ - **`commit_session` path-traversal hardening.** Previously
37
+ `commit_session("../escape")` would write outside
38
+ `.codevira/working_archived/`. Now validates `session_id`
39
+ against `[A-Za-z0-9._-]+`; non-conforming inputs raise
40
+ `ValueError`.
41
+ - **`skills_store.record(triggers={"tags": "git"})` rejected.**
42
+ Previously a bare string would silently iterate as characters
43
+ and persist `["g", "i", "t"]`. Now raises `ValueError` pointing
44
+ the caller to wrap as a list.
45
+ - **BFS query-time crash fix.** `spatial._bfs_distances` now
46
+ catches `sqlite3.DatabaseError` raised inside the query loop
47
+ (not only at connect-time). A corrupt-bytes `graph.db` or a
48
+ schema with missing `edges` table falls back to neighborhood-
49
+ only mode instead of crashing `spatial_nearby`.
50
+ - **`skills_store.list_all(limit=0)` returns `[]`.** Previously
51
+ the for-loop did append-then-check, returning the first row
52
+ instead of empty.
53
+ - **`promote_skill_to_playbook` refuses archived skills.** A
54
+ low-value skill (5+ consecutive failures OR 90+ days unused)
55
+ is now refused unless `force=True` is passed. Previously
56
+ promoted silently and competed with active skills.
57
+ - **`origin.current_origin` normalizes agent_model.** Whitespace
58
+ and the literal strings `"null"` / `"None"` (any case) collapse
59
+ to `None`. Downstream consensus-check string compares no longer
60
+ see junk values.
61
+ - **Antigravity multi-target atomicity.** `inject_global_antigravity`
62
+ + `_inject_antigravity` now snapshot each target's pre-write
63
+ content. On any write failure, all successfully-written targets
64
+ are restored from snapshot. Either every target is stamped or
65
+ none — no asymmetric provenance state from a mid-iteration
66
+ failure.
67
+
68
+ ### Counter-decision discipline (schema change, back-compat)
69
+
70
+ `decisions_store.record` + `record_decision` MCP tool grew two
71
+ optional fields:
72
+
73
+ - `alternatives_considered: list[str]` — the strongest options
74
+ you rejected. Surfaces in the viewer's rich-detail panel.
75
+ - `would_re_examine_if: str` — the condition that should force
76
+ a re-examination. Pair with `do_not_revert=True` to turn the
77
+ one-way ratchet into a self-documenting precondition.
78
+
79
+ Both fields are optional, sanitized on write, and tolerated as
80
+ absent/null on read for legacy records.
81
+
82
+ ### `codevira graph` viewer overhaul
83
+
84
+ The viewer graduates from a passive force-layout to an active
85
+ interrogation tool. Major additions:
86
+
87
+ - **Ranked search panel.** Free-text queries now produce a
88
+ top-K ranked panel under the search box (BM25-ish: token
89
+ overlap + recency + protected boost). Each row: id, snippet,
90
+ outcome badge, protected lock, score. Click any row →
91
+ centers + selects + opens the rich detail panel.
92
+ - **Q&A intent detection** (no LLM dependency, pure regex).
93
+ Four shapes today: `what did we decide about X`, `why did
94
+ we pick X`, `what got reverted`, `what's protected`. Each
95
+ produces a synthesized answer with clickable decision-id
96
+ chips that jump in the graph.
97
+ - **Rich detail panel for decisions.** Surfaces the new
98
+ counter-decision fields (alternatives_considered as a list,
99
+ would_re_examine_if as an italic banner), context as a
100
+ scrollable block, outcome badge in the title, and the full
101
+ supersedes lineage chain (clickable predecessors + successors).
102
+ - **Outcome lens.** New "Outcome" choice in the lens dropdown.
103
+ Colors decisions by classification: `kept`=green, `modified`=
104
+ amber, `reverted`=coral, `unclassified`=gray. Legend shows
105
+ per-bucket counts.
106
+ - **Lineage trace mode.** Click "trace" in the lineage block on
107
+ any decision in a supersedes chain — everything dims, the
108
+ chain stays full opacity with extra-thick warning-colored
109
+ edges, camera fits to the chain. Esc exits.
110
+ - **`alternatives_considered` + `would_re_examine_if` surfaced**
111
+ in the rich detail panel.
112
+ - **Search debouncing** (120ms trailing-edge) so the ranked-
113
+ score pass doesn't lag on typing bursts at the 2000-node cap.
114
+
115
+ The viewer's underlying file split: `mcp_server/cli_graph.py`
116
+ shrank 84KB → 14KB by extracting the HTML/CSS/JS template into
117
+ `mcp_server/graph/template.html`. Public API unchanged.
118
+
119
+ ### `codevira sync` auto-classifies outcomes
120
+
121
+ Every `codevira sync` (manual or automatic) now runs
122
+ `observe-git` as a best-effort tail step. The outcome lens in
123
+ the viewer + the Q&A "what got reverted" surface now have real
124
+ data on every sync — previously stayed gray because outcome
125
+ classification was opt-in. Non-git projects degrade silently.
126
+
127
+ ### G3 — real-IDE smoke (the last stubbed gate)
128
+
129
+ `scripts/check_real_ide_smoke.sh` was a stub returning exit 2
130
+ ("skipped") since v2.0. Now ships a real implementation:
131
+
132
+ - Locates codevira on PATH (the same binary IDE configs invoke).
133
+ - For each detected IDE config (Claude Code, Claude Desktop,
134
+ Cursor, Windsurf, Antigravity — per-app + shared paths):
135
+ validates JSON; "empty file" treated as not-configured;
136
+ malformed JSON treated as hard fail.
137
+ - Verifies `codevira` (or `codevira-<safe_name>`) is registered;
138
+ reports `env.CODEVIRA_IDE` state (pre-v3.1.0 installs show
139
+ as missing with re-setup guidance).
140
+ - Spawns a real MCP stdio server (`codevira --project-dir <tmp>`),
141
+ runs initialize + tools/list. Thresholds: initialize 5s budget
142
+ (warm-load OK), tools/list 1s HARD (Claude Desktop disconnect
143
+ class), tool count ≥20.
144
+
145
+ Evidence file now records `G3_real_ide_smoke: true` for the
146
+ first time since v2.0.
147
+
148
+ ### Process / discipline
149
+
150
+ - **`test_cross_tool_universality` added to `make test-e2e`.**
151
+ Previously the procedural lock (D000010) said "run test-e2e
152
+ before changing engine policies." The gate only included
153
+ `test_first_contact` + `test_product_invariants`. A bump to
154
+ `_DEFAULT_MIN_SCORE` 0.10 → 0.25 broke the cross-tool wedge
155
+ silently because the test that catches it wasn't in the gate.
156
+ Reverted the bump; widened the gate; added a wedge-regression
157
+ unit test (`TestCrossToolWedgeRegression`) so the same class
158
+ of regression also fails at the fast unit-test layer.
159
+ - **`make release-verify-version` BSD sed fix.** The version
160
+ drift check used `sed -E 's/.*=\s*"([^"]+)".*/\1/'` which is
161
+ GNU-only; BSD sed (macOS default) doesn't recognize `\s` in
162
+ `-E`. Replaced with `= *` (literal space).
163
+ - **CLAUDE.md "MUST"/"SHOULD" honesty.** The
164
+ "before-you-finish" contract claimed `MUST call
165
+ write_session_log` but no engine layer enforced it. Downgraded
166
+ to STRONG RECOMMENDATION with explicit "engine enforcement on
167
+ roadmap" note.
168
+ - **AGENTS.md idempotency.** `agents_md_generator.regenerate`
169
+ now compares computed content vs existing and short-circuits
170
+ when identical (no write, no mtime bump). Kills the
171
+ perpetual uncommitted-drift loop where every codevira write
172
+ bumped AGENTS.md even when content didn't change.
173
+
174
+ ### Tests + suite
175
+
176
+ - Full project suite: 2538 → 2540 passing, 28 skipped, 0
177
+ failures.
178
+ - Widened `make test-e2e` gate: 39 → 43 passing.
179
+ - All 4 product fixes verified end-to-end through the fresh-
180
+ built wheel + against AgentStore's real memory.
181
+
182
+ ### Locked decisions honored
183
+
184
+ D000010 procedural gate ran on every engine-policy change.
185
+ D000001 (atomic disk writes) honored. D000012 (project-root
186
+ validation) honored.
187
+
188
+ ### Yanked
189
+
190
+ - **3.1.0 yanked 2026-05-30.** Same code shape; released
191
+ without this CHANGELOG entry. Process gap, not code gap.
192
+ Existing pins still work; new `pip install codevira` lands
193
+ on 3.1.1 directly.
194
+
195
+ ---
196
+
197
+ ---
198
+
199
+ ## [3.1.0] — Five memory subsystems + cross-IDE consensus
200
+
201
+ v3.1.0 adds five memory subsystems on top of the v3.0.x decision
202
+ log, plus a cross-IDE consensus layer. Every addition is additive
203
+ to the existing schemas; v3.0.x records continue to read without
204
+ migration. The MCP surface gains 22 new tools across the new
205
+ subsystems.
206
+
207
+ ### v3.0.x storage prereq (ships first)
208
+
209
+ - **`refactor(jsonl_store)`** — extract `read_merged` / `compact` /
210
+ `read_recent` from `decisions_store._read_merged` /
211
+ `sessions_store.read_recent`. The five new memory subsystems
212
+ share this amendment-overlay primitive instead of duplicating
213
+ it. Tests cover amendment-chain-three-deep recursion semantics.
214
+ Zero behavior change for existing callers.
215
+
216
+ - **`fix(session_id)`** — `decisions_store.record` and
217
+ `sessions_store.write` now default `session_id` to
218
+ `f"ad-hoc-{secrets.token_hex(3)}"` (e.g., `ad-hoc-a1b2c3`)
219
+ instead of the literal string `"ad-hoc"`. Every concurrent IDE
220
+ that didn't pass a slug previously collided into one bucket;
221
+ the unique-per-call default fixes cross-IDE attribution.
222
+
223
+ ### M1 — Origin tagging (provenance)
224
+
225
+ Every decision and session write now carries an `origin` block:
226
+
227
+ ```json
228
+ "origin": {"ide": "claude_code", "agent_model": "...",
229
+ "host_hash": "<12 hex chars>", "ts": "..."}
230
+ ```
231
+
232
+ - `host_hash` = `sha1(uuid.getnode() bytes + username)[:12]` —
233
+ stable per machine (MAC-based, `platform.node()` fallback),
234
+ privacy-preserving (no plaintext hostname/username leaks).
235
+ - `CODEVIRA_IDE` env var read at MCP server startup; default
236
+ `"unknown"`. `ide_inject.py` now writes `CODEVIRA_IDE=<ide_key>`
237
+ into the MCP config block for all 10 supported IDE configs
238
+ (Claude Code, Claude Desktop, Cursor, Windsurf, Antigravity —
239
+ per-project + global).
240
+ - `check_conflict` response includes the candidate's `origin` so
241
+ agents can see "this conflicts with a decision Cursor wrote 3
242
+ days ago" instead of just an opaque decision_id.
243
+ - Reads tolerate `origin` absent (legacy v3.0.x records treated
244
+ as `ide="unknown"`).
245
+
246
+ ### M2 — Working memory
247
+
248
+ Bounded, decay-scored intra-session scratchpad.
249
+
250
+ - `.codevira-cache/working.jsonl` (per-machine, ephemeral,
251
+ gitignored). Auto-populated by `post_tool_use` hook on Edit /
252
+ Write / MultiEdit / NotebookEdit / update_node (importance 4),
253
+ Bash (importance 3), tool errors (importance bumped to 7).
254
+ - 4 MCP tools: `working_add`, `working_get`, `working_promote`
255
+ (to=decision|skill|playbook with check_conflict gate), and
256
+ `get_working_context` (compact markdown for ReAct loops).
257
+ - Decay score: `importance × exp(-Δt_hours / 6) + 0.5 ×
258
+ access_count`. Top-3 surfaces in `get_session_context`.
259
+ - Eviction = amendment tombstone; periodic compaction during
260
+ `codevira sync`.
261
+ - CLI: `codevira working commit <session_id>` archives a
262
+ session's live entries to
263
+ `.codevira/working_archived/<session_id>.jsonl`.
264
+
265
+ ### M3 — Skill library (procedural memory)
266
+
267
+ `.codevira/skills.jsonl` (canonical, team-shareable). FTS5
268
+ retrieval + composite ranking.
269
+
270
+ - `skill_fts` virtual table in the existing
271
+ `.codevira-cache/fts5.sqlite`. Independent staleness key
272
+ (`skill_source_mtime`) so the existing decisions tracking is
273
+ unaffected.
274
+ - Composite ranking:
275
+ `score = 0.5 × BM25_norm + 0.3 × tag_jaccard + 0.2 ×
276
+ recency_decay(τ=30d)`. Never-used skills score 0 recency —
277
+ reinforcement, not existence, drives the recency signal.
278
+ - 6 MCP tools: `record_skill`, `get_skill`, `apply_skill_outcome`,
279
+ `list_skills`, `supersede_skill`,
280
+ `promote_skill_to_playbook` (writes
281
+ `.codevira/playbooks/<task_type>/<slug>.md`).
282
+ - Lifecycle states: `active` (default), `archived` (5 consec
283
+ failures OR `unused_days ≥ 90` — configurable; do_not_revert
284
+ exempt), `superseded` (final).
285
+ - M5 wires git-derived outcomes_writer to skill reinforcement (see
286
+ below).
287
+
288
+ ### M4 — Spatial memory
289
+
290
+ Activity heatmap + folder-tree neighborhoods + affordances.
291
+
292
+ - `.codevira-cache/activity.jsonl` (per-machine). Auto-emitted on
293
+ Edit/Write via `memory_fanout` + on `decisions_store.record`
294
+ when `file_path` is set. Schema: `{id, ts, node_id, kind:
295
+ edit|decision_ref, session_id, origin, _schema_v: 1}`.
296
+ - 4 MCP tools: `spatial_nearby` (BFS ≤ 2 hops over the indexer
297
+ graph + same-neighborhood union, ranked by `(1/(1+bfs_dist)) ×
298
+ log(1+visit_count_30d)`), `spatial_heat`,
299
+ `spatial_neighborhood`, `spatial_affordances`.
300
+ - Folder-tree neighborhoods (top-2 dir components, e.g.,
301
+ `mcp_server/storage`). Project-overridable via
302
+ `.codevira/neighborhoods.yaml`.
303
+ - Bundled `mcp_server/data/affordances.yaml` mapping file globs to
304
+ task_type affordances (e.g., `mcp_server/tools/*.py` →
305
+ `{add_tool, write_test}`). Project override:
306
+ `.codevira/affordances.yaml`; bundled + project union per match.
307
+
308
+ ### M5 — Skill induction wired to outcomes_writer
309
+
310
+ Closes the reinforcement loop. Two pieces:
311
+
312
+ - **Sessions schema additions**: `task_type` (`feature` | `bug` |
313
+ `refactor` | `release` | `docs` | `other`) and `skill_ids: []`
314
+ (skills used during the session). Additive; legacy sessions
315
+ tolerate absence.
316
+ - **outcomes_writer fan-out**: when `observe_all()` classifies a
317
+ decision as `kept` or `reverted`, each skill referenced via
318
+ `skill_ids` on the same session gets `mark_used(success=…)`.
319
+ Pre-builds a `{session_id → set[skill_id]}` index so the
320
+ per-decision fan-out is O(1). Best-effort: skill errors log and
321
+ drop without blocking the decision-outcome write.
322
+ - **CLI**: `codevira induce-skills [--apply] [--yes]` —
323
+ deterministic induction (no LLM in v3.1.0). Pipeline: filter
324
+ sessions with ≥80% kept; group by task_type; cluster by
325
+ tag-Jaccard ≥ 0.5; keep clusters ≥3 sessions; render candidate
326
+ skill with `name = "<task_type>: <top-3 tags>"`,
327
+ `procedure = bullet-summary of session.task +
328
+ decision.decision` (capped 30 lines).
329
+
330
+ ### M6 — Consensus Phase B (cross-IDE conflict check, read-only)
331
+
332
+ - Per-IDE checkpoint files
333
+ `.codevira/checkpoints/<ide_key>.json` keyed on
334
+ `last_seen_decision_id` — zero-padded base-36 D-ids preserve
335
+ monotonic ordering without clock drift.
336
+ - `consensus_store.scan_and_materialize()`: walks decisions with
337
+ `id > checkpoint`, partitions by `origin.ide` into
338
+ `current_corpus` + `foreign`, runs the reused `check_conflict`
339
+ tokenize/Jaccard/overlap math on every pair, records matches as
340
+ PC-prefixed rows in `.codevira/pending_conflicts.jsonl`.
341
+ - 2 MCP tools: `consensus_check`, `consensus_status`.
342
+ `get_session_context` surfaces a top-3 panel sorted by
343
+ `(do_not_revert × recency)`.
344
+ - CLI: `codevira consensus check`. Read-only — no amendment rows
345
+ written on decisions.
346
+
347
+ ### M7 — Consensus Phase C handshake (opt-in, default off)
348
+
349
+ Opt-in belief-revision protocol gated behind
350
+ `memory.consensus.handshake_enabled` in `.codevira/config.yaml`.
351
+
352
+ - New `config.py` helper for dotted-key lookups against
353
+ `.codevira/config.yaml`.
354
+ - `propose_supersession` (cross-IDE) appends a
355
+ `proposed_supersession` row with `expires_at = ts +
356
+ handshake_timeout_days` (default 14, configurable). Same-IDE
357
+ fast-path returns `{fast_path: True}` so the caller routes to
358
+ `decisions_store.supersede` directly.
359
+ - `resolve_proposal(action: approved|rejected|withdrawn)`
360
+ appends a resolution row carrying `resolver_origin`.
361
+ - `finalize_proposal(expired_unilateral=False)` — approved
362
+ proposals turn into a real `decisions_store.supersede` call.
363
+ Expired proposals require `expired_unilateral=True` (deadlock
364
+ safety); the audit row records the force-finalize.
365
+ - 3 MCP tools: `consensus_propose_supersession`,
366
+ `consensus_resolve`, `origin_of` (provenance lookup; always
367
+ available).
368
+ - Row kind taxonomy in pending_conflicts.jsonl: `conflict` (M6),
369
+ `proposed_supersession` (M7), `resolution` (M7).
370
+
371
+ ### M8 — Reflections (durable LLM abstractions)
372
+
373
+ Generative-Agents-style abstractions over recent decisions +
374
+ sessions.
375
+
376
+ - `.codevira/reflections.jsonl` (canonical, committed) +
377
+ `.codevira/reflection_proposals.jsonl` (review staging).
378
+ - `scrub_sensitive` strips api keys, Bearer tokens, passwords,
379
+ AWS-style AKIA, long hex/base64 from source records before the
380
+ LLM sees them.
381
+ - `build_source_context` aggregates sessions + decisions in the
382
+ period window with plan caps (≤30 sessions, ≤100 decisions,
383
+ ≤6 KB envelope).
384
+ - Bundled prompt template at
385
+ `mcp_server/data/prompts/reflection_v1.md`.
386
+ - **MCP sampling integration scope**: v3.1.0 ships the storage +
387
+ sanitization + prompt rendering + the API surface. The
388
+ `sampling/createMessage` RPC that asks the host LLM for the
389
+ abstraction is the **v3.2** deliverable. v3.1.0 `reflect()`
390
+ returns `{sampling_supported: False, rendered_prompt,
391
+ source_context, deferred_to: "v3.2"}`; the CLI accepts an LLM
392
+ response via `--from-file`.
393
+ - 3 MCP tools: `reflect`, `get_reflections`, `list_reflections`.
394
+ - CLI: `codevira reflect [--period 7d] [--from-file PATH]
395
+ [--apply] [--yes]`. Render mode prints the prompt;
396
+ `--from-file` parses the LLM YAML response and writes a
397
+ proposal; `--apply --yes` commits to `reflections.jsonl`.
398
+
399
+ ### Schema versioning convention
400
+
401
+ All NEW JSONL stores (`working`, `skills`, `activity`,
402
+ `pending_conflicts`, `reflections`) carry `_schema_v: 1` on each
403
+ record. Readers tolerate absence (treats as v1). Existing
404
+ `decisions.jsonl` / `sessions.jsonl` are unchanged.
405
+
406
+ ### `get_session_context` panels
407
+
408
+ Now carries five panels in addition to the existing roadmap /
409
+ recent decisions:
410
+ - `working` — top-3 live entries (M2).
411
+ - `consensus` — top-3 pending conflicts (M6) sorted by
412
+ `(do_not_revert × recency)`.
413
+ The plan reserves panels for working, skills, spatial,
414
+ reflections in future ticks if value justifies the token cost.
415
+
416
+ ### Tests
417
+
418
+ ~450+ new tests across `tests/storage/`, `tests/test_tools_*`,
419
+ `tests/test_cli_*`, `tests/test_reflections.py`,
420
+ `tests/test_consensus_handshake.py`, etc. The full v3.1.0 suite
421
+ runs in <20s; zero regressions from the v3.0.x baseline.
422
+
423
+ ### Locked decisions honored
424
+
425
+ The v3.0.0 locks remain intact:
426
+ - D000001 (atomic writes through `mcp_server/storage/atomic.py`)
427
+ - D000012 (WRITE-path forbidden-root validation via
428
+ `ensure_dirs`)
429
+ - The v2.2.0 "no embeddings; FTS5 + Jaccard only" decision —
430
+ M3's skill retrieval and M6's conflict check both use the
431
+ existing FTS5/Jaccard infrastructure; no new embedding deps.
432
+
433
+ ---
434
+
12
435
  ## [3.0.0] — 2026-05-27 — Lean, audited, opinionated
13
436
 
14
437
  ### Hardened (RC audit — rounds 2 + 3, pre-publish)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: codevira
3
- Version: 3.0.0
3
+ Version: 3.1.1
4
4
  Summary: Cross-IDE decision enforcement for AI coding agents. 1 MB per project, in your repo, no cloud, no vectors. Claude Code, Cursor, Windsurf, Antigravity, Codex all share the same in-repo memory; hooks block AI tool calls that violate prior decisions. MIT, local-first.
5
5
  Author-email: Sachin Shelke <sachin.worldnet@gmail.com>
6
6
  License: MIT
@@ -141,6 +141,28 @@ every AI tool, on every project, on your local machine.**
141
141
 
142
142
  ---
143
143
 
144
+ ## What's new in v3.1.1 — hardening + interrogable memory
145
+
146
+ > 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
147
+ > without this README/CHANGELOG entry). Same code shape; this
148
+ > release is the documented one. Brings five memory subsystems
149
+ > (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
150
+
151
+ | Area | What you get |
152
+ |---|---|
153
+ | **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
154
+ | **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
155
+ | **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
156
+ | **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
157
+ | **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
158
+ | **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
159
+ | **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
160
+ | **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
161
+
162
+ Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
163
+
164
+ ---
165
+
144
166
  ## What's new in v3.0.0 — audited, lean, opinionated
145
167
 
146
168
  > Major version. v3.0.0 is the biggest API contraction since v2.0
@@ -92,6 +92,28 @@ every AI tool, on every project, on your local machine.**
92
92
 
93
93
  ---
94
94
 
95
+ ## What's new in v3.1.1 — hardening + interrogable memory
96
+
97
+ > 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
98
+ > without this README/CHANGELOG entry). Same code shape; this
99
+ > release is the documented one. Brings five memory subsystems
100
+ > (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
101
+
102
+ | Area | What you get |
103
+ |---|---|
104
+ | **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
105
+ | **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
106
+ | **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
107
+ | **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
108
+ | **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
109
+ | **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
110
+ | **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
111
+ | **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
112
+
113
+ Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
114
+
115
+ ---
116
+
95
117
  ## What's new in v3.0.0 — audited, lean, opinionated
96
118
 
97
119
  > Major version. v3.0.0 is the biggest API contraction since v2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: codevira
3
- Version: 3.0.0
3
+ Version: 3.1.1
4
4
  Summary: Cross-IDE decision enforcement for AI coding agents. 1 MB per project, in your repo, no cloud, no vectors. Claude Code, Cursor, Windsurf, Antigravity, Codex all share the same in-repo memory; hooks block AI tool calls that violate prior decisions. MIT, local-first.
5
5
  Author-email: Sachin Shelke <sachin.worldnet@gmail.com>
6
6
  License: MIT
@@ -141,6 +141,28 @@ every AI tool, on every project, on your local machine.**
141
141
 
142
142
  ---
143
143
 
144
+ ## What's new in v3.1.1 — hardening + interrogable memory
145
+
146
+ > 3.1.1 supersedes the briefly-published 3.1.0 (which shipped
147
+ > without this README/CHANGELOG entry). Same code shape; this
148
+ > release is the documented one. Brings five memory subsystems
149
+ > (M1–M9 from 3.1.0) plus the v3.1.1 hardening + viewer overhaul.
150
+
151
+ | Area | What you get |
152
+ |---|---|
153
+ | **Five memory subsystems** | Origin tagging (M1), working memory (M2), skill library with FTS5 ranking (M3), spatial memory + activity heatmap (M4), skill induction wired to outcomes (M5), cross-IDE consensus check + handshake (M6/M7), reflections (M8). 22 new MCP tools. |
154
+ | **Secret scrubbing everywhere** | Decisions, sessions, working memory, skills, reflections — every store scrubs api-key / Bearer / password / AWS AKIA / long hex / long base64 at the write boundary. One shared `mcp_server/storage/sanitize.py`. |
155
+ | **Counter-decision discipline** | `record_decision` now accepts `alternatives_considered: list[str]` and `would_re_examine_if: str` — losing options + invalidation trigger surface in the viewer's rich-detail panel. Optional + back-compat. |
156
+ | **Interrogable graph viewer** | `codevira graph` is no longer a passive force-layout. Free-text search → top-K ranked panel with score + outcome badge. Q&A intent detection ("what did we decide about X", "what got reverted", "what's protected"). Outcome lens (kept/modified/reverted). Lineage trace mode for supersession chains. |
157
+ | **Auto outcome classification** | `codevira sync` now runs `observe-git` as a best-effort tail step — outcomes flow into the viewer's outcome lens automatically. |
158
+ | **G3 real-IDE smoke** | The last permanently-skipped gauntlet gate now ships as a real check. Verifies codevira is registered in each detected IDE config + MCP `tools/list` round-trips in <1s. |
159
+ | **AGENTS.md no more churn** | `regenerate()` is now idempotent — no rewrite when content unchanged, no perpetual uncommitted-drift loop. |
160
+ | **4 silent bugs fixed** | `commit_session("../escape")` rejected; `triggers.tags="git"` rejected; `list_all(limit=0)` returns `[]`; spatial BFS catches query-time sqlite errors. |
161
+
162
+ Full v3.1.1 release notes: [CHANGELOG.md](CHANGELOG.md#311--2026-05-30--hardening-viewer-overhaul-g3-sync-observe-git).
163
+
164
+ ---
165
+
144
166
  ## What's new in v3.0.0 — audited, lean, opinionated
145
167
 
146
168
  > Major version. v3.0.0 is the biggest API contraction since v2.0
@@ -66,6 +66,7 @@ docs/plans/v2.1.2.md
66
66
  docs/plans/v2.1.3.md
67
67
  docs/plans/v2.2.0.md
68
68
  docs/plans/v3.0.0.md
69
+ docs/release-notes/v3.1.1.md
69
70
  docs/troubleshooting/antigravity.md
70
71
  graph/_schema.yaml
71
72
  indexer/__init__.py
@@ -90,14 +91,18 @@ mcp_server/_repair_init.py
90
91
  mcp_server/_safe_crash.py
91
92
  mcp_server/auto_init.py
92
93
  mcp_server/cli.py
94
+ mcp_server/cli_consensus.py
93
95
  mcp_server/cli_export.py
94
96
  mcp_server/cli_graph.py
95
97
  mcp_server/cli_hooks_admin.py
98
+ mcp_server/cli_induce.py
96
99
  mcp_server/cli_init.py
97
100
  mcp_server/cli_projects.py
101
+ mcp_server/cli_reflect.py
98
102
  mcp_server/cli_replay.py
99
103
  mcp_server/cli_sync.py
100
104
  mcp_server/cli_uninstall.py
105
+ mcp_server/cli_working.py
101
106
  mcp_server/crash_logger.py
102
107
  mcp_server/decision_replay.py
103
108
  mcp_server/detect.py
@@ -115,6 +120,7 @@ mcp_server/roadmap_drift.py
115
120
  mcp_server/server.py
116
121
  mcp_server/setup_wizard.py
117
122
  mcp_server/data/__init__.py
123
+ mcp_server/data/affordances.yaml
118
124
  mcp_server/data/config.example.yaml
119
125
  mcp_server/data/agents/builder.md
120
126
  mcp_server/data/agents/developer.md
@@ -128,6 +134,7 @@ mcp_server/data/hooks/pre_tool_use.sh
128
134
  mcp_server/data/hooks/session_start.sh
129
135
  mcp_server/data/hooks/stop.sh
130
136
  mcp_server/data/hooks/user_prompt_submit.sh
137
+ mcp_server/data/prompts/reflection_v1.md
131
138
  mcp_server/data/rules/coding-standards-generic.md
132
139
  mcp_server/data/rules/coding-standards-go.md
133
140
  mcp_server/data/rules/coding-standards-typescript.md
@@ -145,6 +152,7 @@ mcp_server/data/rules/testing-standards.md
145
152
  mcp_server/engine/__init__.py
146
153
  mcp_server/engine/demo_policy.py
147
154
  mcp_server/engine/events.py
155
+ mcp_server/engine/memory_fanout.py
148
156
  mcp_server/engine/policy.py
149
157
  mcp_server/engine/runner.py
150
158
  mcp_server/engine/signals.py
@@ -160,27 +168,42 @@ mcp_server/engine/policies/token_budget.py
160
168
  mcp_server/engine/wiring/__init__.py
161
169
  mcp_server/engine/wiring/claude_code_hooks.py
162
170
  mcp_server/engine/wiring/mcp_dispatch.py
171
+ mcp_server/graph/__init__.py
172
+ mcp_server/graph/template.html
163
173
  mcp_server/storage/__init__.py
174
+ mcp_server/storage/activity_store.py
164
175
  mcp_server/storage/agents_md_generator.py
165
176
  mcp_server/storage/atomic.py
177
+ mcp_server/storage/config.py
178
+ mcp_server/storage/consensus_store.py
166
179
  mcp_server/storage/decisions_store.py
167
180
  mcp_server/storage/digest.py
168
181
  mcp_server/storage/fts5_index.py
169
182
  mcp_server/storage/jsonl_store.py
170
183
  mcp_server/storage/manifest.py
184
+ mcp_server/storage/origin.py
171
185
  mcp_server/storage/outcomes_writer.py
172
186
  mcp_server/storage/paths.py
187
+ mcp_server/storage/reflections_store.py
188
+ mcp_server/storage/sanitize.py
173
189
  mcp_server/storage/sessions_store.py
190
+ mcp_server/storage/skills_store.py
174
191
  mcp_server/storage/token_estimator.py
192
+ mcp_server/storage/working_store.py
175
193
  mcp_server/tools/__init__.py
176
194
  mcp_server/tools/changesets.py
177
195
  mcp_server/tools/check_conflict.py
178
196
  mcp_server/tools/code_reader.py
197
+ mcp_server/tools/consensus.py
179
198
  mcp_server/tools/graph.py
180
199
  mcp_server/tools/learning.py
181
200
  mcp_server/tools/playbook.py
201
+ mcp_server/tools/reflections.py
182
202
  mcp_server/tools/roadmap.py
183
203
  mcp_server/tools/search.py
204
+ mcp_server/tools/skills.py
205
+ mcp_server/tools/spatial.py
206
+ mcp_server/tools/working.py
184
207
  rules/coding-standards.md
185
208
  rules/engineering-excellence.md
186
209
  rules/git-cicd-governance.md
@@ -196,11 +219,15 @@ tests/test_auto_init.py
196
219
  tests/test_call_edge_fk_safety.py
197
220
  tests/test_check_conflict.py
198
221
  tests/test_chunker.py
222
+ tests/test_cli_consensus.py
199
223
  tests/test_cli_graph.py
224
+ tests/test_cli_induce.py
200
225
  tests/test_cli_projects.py
201
226
  tests/test_cli_replay.py
202
227
  tests/test_cli_uninstall.py
203
228
  tests/test_cli_version.py
229
+ tests/test_cli_working.py
230
+ tests/test_consensus_handshake.py
204
231
  tests/test_crash_logger.py
205
232
  tests/test_dedupe_migration.py
206
233
  tests/test_detect.py
@@ -223,6 +250,7 @@ tests/test_outcome_tracker.py
223
250
  tests/test_paths.py
224
251
  tests/test_prompts.py
225
252
  tests/test_record_decision.py
253
+ tests/test_reflections.py
226
254
  tests/test_repair_init.py
227
255
  tests/test_roadmap_drift.py
228
256
  tests/test_server.py
@@ -234,5 +262,8 @@ tests/test_tools_graph.py
234
262
  tests/test_tools_learning.py
235
263
  tests/test_tools_playbook.py
236
264
  tests/test_tools_roadmap.py
265
+ tests/test_tools_skills.py
266
+ tests/test_tools_spatial.py
267
+ tests/test_tools_working.py
237
268
  tests/test_treesitter_parser.py
238
269
  tests/test_watcher_circuit.py