doubled-graph 2.0.2__tar.gz → 2.1.0__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 (217) hide show
  1. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/INDEX.md +4 -3
  2. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/PKG-INFO +23 -5
  3. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/README.md +19 -3
  4. doubled_graph-2.1.0/docs/ACCEPTANCE_CERTIFICATE.md +251 -0
  5. doubled_graph-2.1.0/docs/AUDIT_PROMPT.md +229 -0
  6. doubled_graph-2.1.0/docs/CHANGELOG.md +1493 -0
  7. doubled_graph-2.1.0/docs/HOOKS.md +267 -0
  8. doubled_graph-2.1.0/docs/SPEC.md +680 -0
  9. doubled_graph-2.1.0/docs/TOOLS.md +538 -0
  10. doubled_graph-2.1.0/docs/VERIFICATION.md +160 -0
  11. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-maintenance/README.md +2 -2
  12. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/FAQ.md +3 -3
  13. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/getting-started.md +2 -2
  14. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/README.md +5 -5
  15. doubled_graph-2.1.0/methodology/artifacts.md +520 -0
  16. doubled_graph-2.1.0/methodology/ci-templates/github-actions.yml +57 -0
  17. doubled_graph-2.1.0/methodology/ci-templates/gitlab-ci.yml +34 -0
  18. doubled_graph-2.1.0/methodology/drift-and-priority.md +195 -0
  19. doubled_graph-2.1.0/methodology/language-adapters/_template.md +102 -0
  20. doubled_graph-2.1.0/methodology/language-adapters/java.md +256 -0
  21. doubled_graph-2.1.0/methodology/principles.md +169 -0
  22. doubled_graph-2.1.0/methodology/roles.md +115 -0
  23. doubled_graph-2.1.0/methodology/runtime-adapters/_template.md +71 -0
  24. doubled_graph-2.1.0/methodology/runtime-adapters/claude-code.md +135 -0
  25. doubled_graph-2.1.0/methodology/runtime-adapters/codex.md +68 -0
  26. doubled_graph-2.1.0/methodology/runtime-adapters/continue.md +86 -0
  27. doubled_graph-2.1.0/methodology/runtime-adapters/cursor.md +122 -0
  28. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/runtime-adapters/local-llm.md +4 -4
  29. doubled_graph-2.1.0/methodology/runtime-adapters/windsurf.md +62 -0
  30. doubled_graph-2.1.0/methodology/tools.md +245 -0
  31. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/workflow.md +4 -4
  32. doubled_graph-2.1.0/mutants/docs/ACCEPTANCE_CERTIFICATE.md +67 -0
  33. doubled_graph-2.1.0/mutants/docs/AUDIT_PROMPT.md +231 -0
  34. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/CHANGELOG.md +197 -2
  35. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/HOOKS.md +46 -34
  36. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/SPEC.md +62 -60
  37. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/TOOLS.md +88 -90
  38. doubled_graph-2.1.0/mutants/docs/VERIFICATION.md +118 -0
  39. doubled_graph-2.1.0/mutants/methodology/README.md +138 -0
  40. doubled_graph-2.1.0/mutants/methodology/approval-checkpoints.md +150 -0
  41. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/artifacts.md +6 -6
  42. doubled_graph-2.1.0/mutants/methodology/auto-scaling.md +77 -0
  43. doubled_graph-2.1.0/mutants/methodology/ci-templates/github-actions.yml +57 -0
  44. doubled_graph-2.1.0/mutants/methodology/ci-templates/gitlab-ci.yml +34 -0
  45. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/drift-and-priority.md +2 -2
  46. doubled_graph-2.1.0/mutants/methodology/language-adapters/csharp.md +340 -0
  47. doubled_graph-2.1.0/mutants/methodology/language-adapters/go.md +282 -0
  48. doubled_graph-2.1.0/mutants/methodology/language-adapters/python.md +248 -0
  49. doubled_graph-2.1.0/mutants/methodology/language-adapters/rust.md +271 -0
  50. doubled_graph-2.1.0/mutants/methodology/language-adapters/swift.md +260 -0
  51. doubled_graph-2.1.0/mutants/methodology/language-adapters/typescript.md +256 -0
  52. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/_template.md +1 -1
  53. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/claude-code.md +10 -21
  54. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/codex.md +2 -2
  55. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/cursor.md +8 -4
  56. doubled_graph-2.1.0/mutants/methodology/runtime-adapters/local-llm.md +145 -0
  57. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/tools.md +20 -17
  58. doubled_graph-2.1.0/mutants/methodology/workflow.md +169 -0
  59. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-drift-detected.md +4 -4
  60. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-user-manual-edit.md +2 -2
  61. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/00-entry-prompt.md +2 -2
  62. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/06-validation-gates.md +3 -6
  63. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/00-entry-prompt.md +1 -1
  64. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/02-requirements.md +5 -5
  65. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/07-post-init-sync.md +1 -0
  66. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/upgrade-methodology/01-content-gaps.md +1 -1
  67. doubled_graph-2.1.0/mutants/pyproject.toml +124 -0
  68. doubled_graph-2.1.0/mutants/tests/conftest.py +24 -0
  69. doubled_graph-2.1.0/mutants/tests/test_anchors.py +123 -0
  70. doubled_graph-2.1.0/mutants/tests/test_cgc_contract.py +1426 -0
  71. doubled_graph-2.1.0/mutants/tests/test_crossref_drift.py +880 -0
  72. doubled_graph-2.1.0/mutants/tests/test_e2e_acceptance.py +619 -0
  73. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_migration_grace3_to_grace4.py +108 -4
  74. doubled_graph-2.1.0/mutants/tests/test_mutation_gate_script.py +202 -0
  75. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_analyze.py +173 -0
  76. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_edges.py +305 -0
  77. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_fallback.py +235 -0
  78. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_misc.py +431 -0
  79. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_context.py +393 -0
  80. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_crossref.py +770 -0
  81. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_hooks.py +535 -0
  82. doubled_graph-2.1.0/mutants/tests/test_mutation_kill_impact.py +426 -0
  83. doubled_graph-2.1.0/mutants/tests/test_provenance.py +942 -0
  84. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_setup_artifacts.py +99 -0
  85. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_smoke.py +1413 -29
  86. doubled_graph-2.1.0/prompts/maintenance/on-after-edit.md +117 -0
  87. doubled_graph-2.1.0/prompts/maintenance/on-before-edit.md +88 -0
  88. doubled_graph-2.1.0/prompts/maintenance/on-drift-detected.md +152 -0
  89. doubled_graph-2.1.0/prompts/maintenance/on-user-manual-edit.md +106 -0
  90. doubled_graph-2.1.0/prompts/migrate-existing-project/00-entry-prompt.md +84 -0
  91. doubled_graph-2.1.0/prompts/migrate-existing-project/01-discover.md +196 -0
  92. doubled_graph-2.1.0/prompts/migrate-existing-project/02-reconstruct-intent.md +209 -0
  93. doubled_graph-2.1.0/prompts/migrate-existing-project/03-draft-plan.md +299 -0
  94. doubled_graph-2.1.0/prompts/migrate-existing-project/04-markup-codebase.md +190 -0
  95. doubled_graph-2.1.0/prompts/migrate-existing-project/05-verification-and-logs.md +166 -0
  96. doubled_graph-2.1.0/prompts/migrate-existing-project/06-validation-gates.md +193 -0
  97. doubled_graph-2.1.0/prompts/new-project/00-entry-prompt.md +56 -0
  98. doubled_graph-2.1.0/prompts/new-project/01-intent-interview.md +103 -0
  99. doubled_graph-2.1.0/prompts/new-project/02-requirements.md +223 -0
  100. doubled_graph-2.1.0/prompts/new-project/03-technology.md +95 -0
  101. doubled_graph-2.1.0/prompts/new-project/04-development-plan.md +363 -0
  102. doubled_graph-2.1.0/prompts/new-project/05-verification-plan.md +208 -0
  103. doubled_graph-2.1.0/prompts/new-project/06-generate.md +186 -0
  104. doubled_graph-2.1.0/prompts/new-project/07-post-init-sync.md +163 -0
  105. doubled_graph-2.1.0/prompts/upgrade-methodology/00-entry-prompt.md +143 -0
  106. doubled_graph-2.1.0/prompts/upgrade-methodology/01-content-gaps.md +354 -0
  107. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/pyproject.toml +6 -3
  108. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/__init__.py +2 -1
  109. doubled_graph-2.1.0/src/doubled_graph/__main__.py +12 -0
  110. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/cli.py +190 -97
  111. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/config.py +32 -13
  112. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-before-edit/SKILL.md +2 -2
  113. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-guide/SKILL.md +1 -1
  114. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-manual-edit/SKILL.md +4 -4
  115. doubled_graph-2.1.0/src/doubled_graph/graphs/anchors.py +129 -0
  116. doubled_graph-2.1.0/src/doubled_graph/graphs/crossref.py +772 -0
  117. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/graphs/declared.py +35 -5
  118. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/graphs/grace4.py +127 -3
  119. doubled_graph-2.1.0/src/doubled_graph/health.py +214 -0
  120. doubled_graph-2.1.0/src/doubled_graph/hooks_installer.py +388 -0
  121. doubled_graph-2.1.0/src/doubled_graph/integrations/cgc.py +1708 -0
  122. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/integrations/grace_cli.py +90 -18
  123. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/migrations/grace3_to_grace4.py +73 -8
  124. doubled_graph-2.1.0/src/doubled_graph/policy/agents_md.py +128 -0
  125. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/policy/phase.py +73 -3
  126. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/server.py +19 -60
  127. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/setup.py +66 -31
  128. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/storage/paths.py +2 -2
  129. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/tools/_meta.py +15 -3
  130. doubled_graph-2.1.0/src/doubled_graph/tools/analyze.py +406 -0
  131. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/tools/context.py +106 -28
  132. doubled_graph-2.1.0/src/doubled_graph/tools/detect_changes.py +437 -0
  133. doubled_graph-2.1.0/src/doubled_graph/tools/impact.py +508 -0
  134. doubled_graph-2.1.0/src/doubled_graph/tools/post_tool.py +83 -0
  135. doubled_graph-2.1.0/src/doubled_graph/tools/provenance.py +188 -0
  136. doubled_graph-2.1.0/tests/__init__.py +0 -0
  137. doubled_graph-2.1.0/tests/conftest.py +92 -0
  138. doubled_graph-2.1.0/tests/test_anchors.py +123 -0
  139. doubled_graph-2.1.0/tests/test_bom_support.py +204 -0
  140. doubled_graph-2.1.0/tests/test_cgc_backend.py +272 -0
  141. doubled_graph-2.1.0/tests/test_cgc_contract.py +1685 -0
  142. doubled_graph-2.1.0/tests/test_cgc_lifecycle.py +318 -0
  143. doubled_graph-2.1.0/tests/test_cli_entrypoint.py +141 -0
  144. doubled_graph-2.1.0/tests/test_crossref_drift.py +1166 -0
  145. doubled_graph-2.1.0/tests/test_e2e_acceptance.py +773 -0
  146. doubled_graph-2.1.0/tests/test_grace4_artifacts.py +391 -0
  147. doubled_graph-2.1.0/tests/test_grace_cli_engine.py +339 -0
  148. doubled_graph-2.1.0/tests/test_health.py +396 -0
  149. doubled_graph-2.1.0/tests/test_migration_grace3_to_grace4.py +979 -0
  150. doubled_graph-2.1.0/tests/test_mutation_gate_script.py +271 -0
  151. doubled_graph-2.1.0/tests/test_mutation_kill_analyze.py +173 -0
  152. doubled_graph-2.1.0/tests/test_mutation_kill_cgc_edges.py +305 -0
  153. doubled_graph-2.1.0/tests/test_mutation_kill_cgc_fallback.py +285 -0
  154. doubled_graph-2.1.0/tests/test_mutation_kill_cgc_misc.py +435 -0
  155. doubled_graph-2.1.0/tests/test_mutation_kill_context.py +408 -0
  156. doubled_graph-2.1.0/tests/test_mutation_kill_crossref.py +822 -0
  157. doubled_graph-2.1.0/tests/test_mutation_kill_hooks.py +573 -0
  158. doubled_graph-2.1.0/tests/test_mutation_kill_impact.py +426 -0
  159. doubled_graph-2.1.0/tests/test_provenance.py +942 -0
  160. doubled_graph-2.1.0/tests/test_repo_hygiene.py +63 -0
  161. doubled_graph-2.1.0/tests/test_setup_artifacts.py +225 -0
  162. doubled_graph-2.1.0/tests/test_smoke.py +3468 -0
  163. doubled_graph-2.0.2/src/doubled_graph/__main__.py +0 -6
  164. doubled_graph-2.0.2/src/doubled_graph/graphs/crossref.py +0 -31
  165. doubled_graph-2.0.2/src/doubled_graph/hooks_installer.py +0 -188
  166. doubled_graph-2.0.2/src/doubled_graph/integrations/cgc.py +0 -522
  167. doubled_graph-2.0.2/src/doubled_graph/tools/analyze.py +0 -158
  168. doubled_graph-2.0.2/src/doubled_graph/tools/detect_changes.py +0 -282
  169. doubled_graph-2.0.2/src/doubled_graph/tools/impact.py +0 -293
  170. doubled_graph-2.0.2/tests/test_cgc_contract.py +0 -248
  171. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/.gitignore +0 -0
  172. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/ARTICLE.md +0 -0
  173. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/LICENSE +0 -0
  174. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-existing-project/README.md +0 -0
  175. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-new-project/README.md +0 -0
  176. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/deep-dive.md +0 -0
  177. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/approval-checkpoints.md +0 -0
  178. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/auto-scaling.md +0 -0
  179. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/csharp.md +0 -0
  180. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/go.md +0 -0
  181. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/python.md +0 -0
  182. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/rust.md +0 -0
  183. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/swift.md +0 -0
  184. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/typescript.md +0 -0
  185. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/language-adapters/_template.md +0 -0
  186. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/language-adapters/java.md +0 -0
  187. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/principles.md +0 -0
  188. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/roles.md +0 -0
  189. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/continue.md +0 -0
  190. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/windsurf.md +0 -0
  191. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-after-edit.md +0 -0
  192. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-before-edit.md +0 -0
  193. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/01-discover.md +0 -0
  194. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/02-reconstruct-intent.md +0 -0
  195. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/03-draft-plan.md +0 -0
  196. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/04-markup-codebase.md +0 -0
  197. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/05-verification-and-logs.md +0 -0
  198. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/01-intent-interview.md +0 -0
  199. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/03-technology.md +0 -0
  200. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/04-development-plan.md +0 -0
  201. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/05-verification-plan.md +0 -0
  202. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/06-generate.md +0 -0
  203. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/upgrade-methodology/00-entry-prompt.md +0 -0
  204. {doubled_graph-2.0.2/src/doubled_graph/graphs → doubled_graph-2.1.0/mutants/tests}/__init__.py +0 -0
  205. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_bom_support.py +0 -0
  206. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_grace4_artifacts.py +0 -0
  207. {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_grace_cli_engine.py +0 -0
  208. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-after-edit/SKILL.md +0 -0
  209. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-drift/SKILL.md +0 -0
  210. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-refactor/SKILL.md +0 -0
  211. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-verify/SKILL.md +0 -0
  212. {doubled_graph-2.0.2/src/doubled_graph/integrations → doubled_graph-2.1.0/src/doubled_graph/graphs}/__init__.py +0 -0
  213. {doubled_graph-2.0.2/src/doubled_graph/policy → doubled_graph-2.1.0/src/doubled_graph/integrations}/__init__.py +0 -0
  214. {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/migrations/__init__.py +0 -0
  215. {doubled_graph-2.0.2/src/doubled_graph/storage → doubled_graph-2.1.0/src/doubled_graph/policy}/__init__.py +0 -0
  216. {doubled_graph-2.0.2/src/doubled_graph/tools → doubled_graph-2.1.0/src/doubled_graph/storage}/__init__.py +0 -0
  217. {doubled_graph-2.0.2/tests → doubled_graph-2.1.0/src/doubled_graph/tools}/__init__.py +0 -0
@@ -49,7 +49,7 @@
49
49
  |---|---|
50
50
  | Новый проект | [prompts/new-project/](prompts/new-project/) (8 файлов) |
51
51
  | Миграция | [prompts/migrate-existing-project/](prompts/migrate-existing-project/) (7 файлов) |
52
- | Обновление методики (1.9.x → 2.0) | [prompts/upgrade-methodology/](prompts/upgrade-methodology/) (2 файла) |
52
+ | Обновление методики (2.0.x → 2.1) | [prompts/upgrade-methodology/](prompts/upgrade-methodology/) (2 файла) |
53
53
  | Поддержка | [prompts/maintenance/](prompts/maintenance/) (4 файла) |
54
54
 
55
55
  ---
@@ -59,9 +59,10 @@
59
59
  | Тема | Файл |
60
60
  |---|---|
61
61
  | Архитектура | [docs/SPEC.md](docs/SPEC.md) |
62
- | Контракт 4 публичных tool'ов | [docs/TOOLS.md](docs/TOOLS.md) |
62
+ | Контракт MCP-tools (10) | [docs/TOOLS.md](docs/TOOLS.md) |
63
63
  | Hooks (git + Claude Code + optional) | [docs/HOOKS.md](docs/HOOKS.md) |
64
- | Исходник MVP | [src/doubled_graph/](src/doubled_graph/) |
64
+ | Verification / Definition of Done | [docs/VERIFICATION.md](docs/VERIFICATION.md) |
65
+ | Исходник | [src/doubled_graph/](src/doubled_graph/) |
65
66
  | Smoke-тесты | [tests/](tests/) |
66
67
 
67
68
  ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: doubled-graph
3
- Version: 2.0.2
3
+ Version: 2.1.0
4
4
  Summary: MCP facade over CodeGraphContext + GRACE 4 (.grace artifacts): impact, context, drift-detect, migration for LLM-driven codebases.
5
5
  Project-URL: Homepage, https://github.com/rour/doubled-graph-mcp
6
6
  Project-URL: Repository, https://github.com/rour/doubled-graph-mcp
@@ -23,12 +23,14 @@ Classifier: Topic :: Software Development :: Code Generators
23
23
  Classifier: Topic :: Software Development :: Documentation
24
24
  Requires-Python: >=3.11
25
25
  Requires-Dist: anyio>=4.15.1
26
- Requires-Dist: codegraphcontext>=0.6.13
26
+ Requires-Dist: codegraphcontext<0.7,>=0.6.13
27
27
  Requires-Dist: mcp<2,>=1.30.0
28
28
  Requires-Dist: pydantic>=2.14.1
29
29
  Requires-Dist: tree-sitter-language-pack>=1.22.1
30
30
  Provides-Extra: dev
31
+ Requires-Dist: mutmut<4,>=3.8.1; extra == 'dev'
31
32
  Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
33
+ Requires-Dist: pytest-cov>=5; extra == 'dev'
32
34
  Requires-Dist: pytest>=8.0; extra == 'dev'
33
35
  Requires-Dist: ruff>=0.5; extra == 'dev'
34
36
  Description-Content-Type: text/markdown
@@ -42,7 +44,7 @@ MCP-сервер для LLM-агентов, работающих с больши
42
44
  - **Computed graph** — AST-граф реального кода (через CodeGraphContext): кто вызывает что, где определено.
43
45
  - **Declared graph** — граф из артефактов GRACE 4 (`.grace/`): замысел, контракты, верификация.
44
46
 
45
- Четыре MCP-инструмента:
47
+ Четыре доменных MCP-инструмента (плюс `health`, `migrate_check` и четыре gateway над `grace`):
46
48
 
47
49
  | Инструмент | Когда |
48
50
  |---|---|
@@ -51,6 +53,8 @@ MCP-сервер для LLM-агентов, работающих с больши
51
53
  | `context` | 360° вид: символ + контракт + вызовы |
52
54
  | `detect_changes` | дрейф кода от артефактов — **до** коммита |
53
55
 
56
+ `detect_changes` возвращает шесть типов дрейфа: `code_without_module`, `module_without_code`, `contract_mismatch`, `stale_crosslinks`, `missing_verification`, `markup_missing`. `contract_mismatch` сверяет `<Exports>`, `MODULE_MAP` и `INPUTS` контрактов с AST-сигнатурой (имена; типы — только если CGC их отдаёт), `stale_crosslinks` — с реальными `CALLS`/`IMPORTS`-рёбрами между файлами модулей.
57
+
54
58
  ---
55
59
 
56
60
  ## Установка
@@ -104,6 +108,14 @@ doubled-graph setup
104
108
  - установит `git post-commit` хук для автообновления графа
105
109
  - запустит первый полный `analyze`
106
110
 
111
+ > **Важно:** `setup` при каждом запуске **перезаписывает** скопированные
112
+ > `prompts/` и `methodology/` версиями из установленного пакета
113
+ > (`_copy_bundle` всегда пишет файлы заново, чтобы после `pipx upgrade`
114
+ > не оставались устаревшие workflow). Не редактируйте их на месте — правки
115
+ > будут потеряны при следующем `setup`. Для локальных изменений скопируйте
116
+ > нужный файл в отдельный путь проекта и ссылайтесь на него оттуда;
117
+ > исходные `prompts/`/`methodology/` в репозитории считайте managed-контентом.
118
+
107
119
  Посмотреть план без реальных изменений:
108
120
 
109
121
  ```bash
@@ -149,12 +161,12 @@ head -1 "$(which doubled-graph)" # вывести shebang — это и ест
149
161
 
150
162
  Сценарий 2. Миграция существующего — `prompts/migrate-existing-project/00-entry-prompt.md`.
151
163
 
152
- Сценарий 3. Обновление версии методики (1.9.x → 2.0) — `prompts/upgrade-methodology/00-entry-prompt.md`.
164
+ Сценарий 3. Обновление версии методики (2.0.x → 2.1) — `prompts/upgrade-methodology/00-entry-prompt.md`.
153
165
 
154
166
  ### 4. Проверить, что всё встало
155
167
 
156
168
  ```bash
157
- doubled-graph --version # 2.0.2
169
+ doubled-graph --version # 2.1.0
158
170
  doubled-graph status --repo . # artifacts.project_kind = grace4, grace_engine.upgrade_required = false
159
171
  doubled-graph lint --repo . # summary.errors = 0
160
172
  doubled-graph migrate check --repo . # map_pending / placeholders — что осталось заполнить
@@ -164,6 +176,10 @@ doubled-graph migrate check --repo . # map_pending / placeholders — что
164
176
  Если `upgrade_required` = `true` — движок старее 4.x: `npm install -g @osovv/grace-cli@4.2.1`, затем `setup` повторно.
165
177
  Если `lint` вернул `markup.module-map-missing` — это содержательная работа, промпт `prompts/upgrade-methodology/01-content-gaps.md`.
166
178
 
179
+ Полная проверка (ruff + unit + real-CGC E2E + diff/version): `bash scripts/verify.sh`; критерии готовности — [docs/VERIFICATION.md](docs/VERIFICATION.md).
180
+
181
+ В 2.1: `detect_changes` проверяет `<Exports>`/`MODULE_MAP`/`INPUTS` и реальные CALLS/IMPORTS-рёбра, `impact` отдаёт `anchor`, `include_unchanged` расширяет охват, а `DG-Authored`-трейлер ставится через `prepare-commit-msg`. Установить все хуки: `doubled-graph init-hooks --all` (git + Claude Code + provenance); без Claude Code — `--post-commit --prepare-commit-msg`.
182
+
167
183
 
168
184
  ---
169
185
 
@@ -234,6 +250,8 @@ doubled-graph setup # 2. обновить движок и подгот
234
250
  создаёт недостающие обязательные документы, добавляет `LINKS: M-*` в
235
251
  `MODULE_CONTRACT` (без этого файл не привязан к модулю), приводит `MAP_MODE`
236
252
  в соответствие с `ROLE`. Legacy `docs/` не изменяются и не удаляются.
253
+ `setup` также дописывает в `AGENTS.md` управляемый блок anti-patterns
254
+ (идемпотентно; существующий текст и BOM сохраняются).
237
255
 
238
256
  Если миграцию не сделать:
239
257
 
@@ -7,7 +7,7 @@ MCP-сервер для LLM-агентов, работающих с больши
7
7
  - **Computed graph** — AST-граф реального кода (через CodeGraphContext): кто вызывает что, где определено.
8
8
  - **Declared graph** — граф из артефактов GRACE 4 (`.grace/`): замысел, контракты, верификация.
9
9
 
10
- Четыре MCP-инструмента:
10
+ Четыре доменных MCP-инструмента (плюс `health`, `migrate_check` и четыре gateway над `grace`):
11
11
 
12
12
  | Инструмент | Когда |
13
13
  |---|---|
@@ -16,6 +16,8 @@ MCP-сервер для LLM-агентов, работающих с больши
16
16
  | `context` | 360° вид: символ + контракт + вызовы |
17
17
  | `detect_changes` | дрейф кода от артефактов — **до** коммита |
18
18
 
19
+ `detect_changes` возвращает шесть типов дрейфа: `code_without_module`, `module_without_code`, `contract_mismatch`, `stale_crosslinks`, `missing_verification`, `markup_missing`. `contract_mismatch` сверяет `<Exports>`, `MODULE_MAP` и `INPUTS` контрактов с AST-сигнатурой (имена; типы — только если CGC их отдаёт), `stale_crosslinks` — с реальными `CALLS`/`IMPORTS`-рёбрами между файлами модулей.
20
+
19
21
  ---
20
22
 
21
23
  ## Установка
@@ -69,6 +71,14 @@ doubled-graph setup
69
71
  - установит `git post-commit` хук для автообновления графа
70
72
  - запустит первый полный `analyze`
71
73
 
74
+ > **Важно:** `setup` при каждом запуске **перезаписывает** скопированные
75
+ > `prompts/` и `methodology/` версиями из установленного пакета
76
+ > (`_copy_bundle` всегда пишет файлы заново, чтобы после `pipx upgrade`
77
+ > не оставались устаревшие workflow). Не редактируйте их на месте — правки
78
+ > будут потеряны при следующем `setup`. Для локальных изменений скопируйте
79
+ > нужный файл в отдельный путь проекта и ссылайтесь на него оттуда;
80
+ > исходные `prompts/`/`methodology/` в репозитории считайте managed-контентом.
81
+
72
82
  Посмотреть план без реальных изменений:
73
83
 
74
84
  ```bash
@@ -114,12 +124,12 @@ head -1 "$(which doubled-graph)" # вывести shebang — это и ест
114
124
 
115
125
  Сценарий 2. Миграция существующего — `prompts/migrate-existing-project/00-entry-prompt.md`.
116
126
 
117
- Сценарий 3. Обновление версии методики (1.9.x → 2.0) — `prompts/upgrade-methodology/00-entry-prompt.md`.
127
+ Сценарий 3. Обновление версии методики (2.0.x → 2.1) — `prompts/upgrade-methodology/00-entry-prompt.md`.
118
128
 
119
129
  ### 4. Проверить, что всё встало
120
130
 
121
131
  ```bash
122
- doubled-graph --version # 2.0.2
132
+ doubled-graph --version # 2.1.0
123
133
  doubled-graph status --repo . # artifacts.project_kind = grace4, grace_engine.upgrade_required = false
124
134
  doubled-graph lint --repo . # summary.errors = 0
125
135
  doubled-graph migrate check --repo . # map_pending / placeholders — что осталось заполнить
@@ -129,6 +139,10 @@ doubled-graph migrate check --repo . # map_pending / placeholders — что
129
139
  Если `upgrade_required` = `true` — движок старее 4.x: `npm install -g @osovv/grace-cli@4.2.1`, затем `setup` повторно.
130
140
  Если `lint` вернул `markup.module-map-missing` — это содержательная работа, промпт `prompts/upgrade-methodology/01-content-gaps.md`.
131
141
 
142
+ Полная проверка (ruff + unit + real-CGC E2E + diff/version): `bash scripts/verify.sh`; критерии готовности — [docs/VERIFICATION.md](docs/VERIFICATION.md).
143
+
144
+ В 2.1: `detect_changes` проверяет `<Exports>`/`MODULE_MAP`/`INPUTS` и реальные CALLS/IMPORTS-рёбра, `impact` отдаёт `anchor`, `include_unchanged` расширяет охват, а `DG-Authored`-трейлер ставится через `prepare-commit-msg`. Установить все хуки: `doubled-graph init-hooks --all` (git + Claude Code + provenance); без Claude Code — `--post-commit --prepare-commit-msg`.
145
+
132
146
 
133
147
  ---
134
148
 
@@ -199,6 +213,8 @@ doubled-graph setup # 2. обновить движок и подгот
199
213
  создаёт недостающие обязательные документы, добавляет `LINKS: M-*` в
200
214
  `MODULE_CONTRACT` (без этого файл не привязан к модулю), приводит `MAP_MODE`
201
215
  в соответствие с `ROLE`. Legacy `docs/` не изменяются и не удаляются.
216
+ `setup` также дописывает в `AGENTS.md` управляемый блок anti-patterns
217
+ (идемпотентно; существующий текст и BOM сохраняются).
202
218
 
203
219
  Если миграцию не сделать:
204
220
 
@@ -0,0 +1,251 @@
1
+ # Acceptance certificate — doubled-graph 2.1
2
+
3
+ Status: **AUDIT CANDIDATE — NOT PASS** (contract v2, 2026-11-08: the owner removed the
4
+ full mutation score from the acceptance criteria; targeted probes remain mandatory. No
5
+ independent audit has run yet under contract v2. Cycle-10 audit FAILED on an incomplete
6
+ manifest (49/122 read by the auditor) and open P2 handoff decisions: 30 manifest files
7
+ are not in the git index and 1293 tracked `.pyc`/`__pycache__` remain. Cycle 11 was a
8
+ **maintenance repair**, not an audit: it fixed the CGC worker leak, the `python -m`
9
+ exit-code loss and the `health` "no side effects" promise.)
10
+
11
+ ## Artifact
12
+
13
+ | Field | Value |
14
+ |---|---|
15
+ | Tree hash | `7e26796626bfed4939d7f38d3fc9feabdbe2159073f308789d83c5bd7adf9d9e` (src/tests/scripts, AUDIT_PROMPT §1 command; `LC_ALL=ru_RU.UTF-8` and `LC_ALL=C` now produce the same hash on this tree) |
16
+ | HEAD | `b7ed89b31879d7de3132ff66ece7107f5b0bcb09` (working tree intentionally dirty; `git status --short` is part of the hand-off) |
17
+ | Manifest | 124 files / 41,071 lines (AUDIT_PROMPT §2 scope; recomputed after the final edit including this certificate) |
18
+ | Python | `3.12.16` (`venv/bin/python`); gates ran with `HOME=/tmp/fix-home-c11` |
19
+ | CGC | `0.6.13` (pin `>=0.6.13,<0.7`) — FalkorDB 1.2.0 / redislite |
20
+ | Backend | **FalkorDB** — `codegraphcontext.core.database_falkordb.FalkorDBManager`, per-repo DB at `~/.codegraphcontext/repos/<repo>-<hash>/graph` |
21
+ | Date | `2026-11-08` |
22
+
23
+ The backend claim is now precise about **selection and cross-process behaviour**:
24
+
25
+ - `cgc.backend="auto"` is resolved **before** CGC runs to one concrete backend — FalkorDB
26
+ Little on Unix/Python ≥3.12 when `redislite` is importable, KuzuDB on Windows/<3.12 —
27
+ and that value is pinned through `CGC_RUNTIME_DB_TYPE`. It is no longer "let CGC pick".
28
+ - FalkorDB is constructed directly; CGC's silent fallback to KuzuDB at the same
29
+ `db_path` is rejected (`CGCUnavailable` names the requested and actual backend). A
30
+ failed start is an explicit, actionable `CGC_BACKEND_FAIL`, never a silent `NONE`/HIGH.
31
+ - Lock-contention errors (`Could not set lock on file`, `docs.kuzudb.com/concurrency`)
32
+ are retried at most 3 times with bounded backoff; exhaustion raises the original error
33
+ wrapped as `CGCUnavailable` (no extra processes are forked).
34
+ - Cross-process handoff is exercised for real: the E2E test releases the per-repo DB
35
+ (`CGC.close()` → persisted shutdown of the FalkorDB worker) before running
36
+ `python -m doubled_graph impact` in a subprocess, then reconnects. The same backend and
37
+ DB path are asserted (not a mock/Kuzu). If the host cannot start FalkorDB at all, the
38
+ failure is explicit (`CGC_BACKEND_FAIL`), which is a visible backend failure, not a
39
+ silent fallback.
40
+
41
+ ## Gate
42
+
43
+ Measured on the frozen artifact (`7e2679…`, all commands run after the final
44
+ source/test/script edit, sequentially, `HOME=/tmp/fix-home-c11`, Python 3.12.16):
45
+
46
+ - `ruff check src tests scripts`: **PASS** (`All checks passed!`).
47
+ - Unit/contract: **657 passed, 2 skipped** — the only skips are exactly the two allowed
48
+ engine-level ones (`DOUBLED_GRAPH_ENGINE_TS`/tsx), and `tests/conftest.py` enforces a
49
+ **strict allowlist** (exact node id + exact reason): any third skip fails the session.
50
+ - Real-CGC E2E: **14 passed, 0 skipped** on this artifact (separate
51
+ `pytest tests/test_e2e_acceptance.py` run). The 5/5 stability evidence quoted by
52
+ cycle 8 belongs to an older artifact and is **not transferred**.
53
+ - Branch coverage (six critical modules): **100.00%** — `TOTAL 1891 statements, 734
54
+ branches, 0 partial`; `--cov-fail-under=100` reached.
55
+ - Targeted mutation probes: **6/6 killed** (`scripts/mutation_probes.py`, timeout +
56
+ sha256-restore verified).
57
+ - Process-leak check (cycle-11 P1): before the gate series `pgrep -f falkor_worker` = 1
58
+ and `pgrep -f redis-server` = 1 (both foreign: a `WebFront` repo worker from the
59
+ pipx 3.14 install, not this workspace); after the full suite, the separate E2E run,
60
+ coverage, probes and a manual `analyze` → `health` → `detect-changes` CLI series they
61
+ are back to exactly 1/1, and `pgrep -f 'Grace/venv'` is 0. Transient foreign
62
+ `falkor_worker` processes (pipx 3.14, other workspaces) appeared and exited
63
+ independently and were not touched.
64
+ - Full mutation: **out of acceptance scope (owner decision 2026-11-08, contract v2).**
65
+ It is reported for information only and is **not** a PASS criterion. Last complete run
66
+ on `1793bb33…`: `3740 killed / 590 survived / 2 timeout / 192 suspicious / 4524 total`
67
+ (**82.67%**, threshold 100%), exit code `1`, duration `6063.9 s`,
68
+ `--max-children 1 --retries 0`; not transferred to `7e2679…`. Evidence:
69
+ `mutation-report.json`, `mutation-report.md`, `mutation-run.log`,
70
+ `mutants/mutmut-cicd-stats.json`. The full run remains a release backlog, not an
71
+ acceptance gate.
72
+ - `scripts/verify.sh`: **PASS** (exit 0) — ruff + 657 passed/2 skipped + coverage 100% +
73
+ probes 6/6 + `git diff --check`/`--cached` + `doubled-graph 2.1.0`.
74
+ - `git diff --check` + `--cached`: clean.
75
+
76
+ ## Audits
77
+
78
+ | Audit | Scope | P0/P1/P2/P3 | Status |
79
+ |---|---|---|---|
80
+ | Independent full audit — cycle 1 | 109 files / 31,999 lines | 0 / 2 / 9 / 12 | **FAILED** (all findings addressed; see `.tmp/fix/cycle-01/RESOLUTION.md`) |
81
+ | Independent full audit — cycle 2 | 109 files | 0 / 2 / 4 / 7 | **FAILED** (all findings addressed in code/tests/docs; see `.tmp/fix/cycle-02/RESOLUTION.md`) |
82
+ | Independent full audit — cycle 3 | 118 files / 36,620 lines | 0 / 1 / 5 / 9 | **FAILED** (all findings addressed; see `.tmp/fix/cycle-03/RESOLUTION.md`) |
83
+ | Independent full audit — cycle 4 | 119 files / 37,254 lines | 0 / 2 / 4 / 4 | **FAILED** — P1-1 + P2-1…P2-4 + P3-1…P3-4 addressed; P1-2 (full mutation score) remains open; see `.tmp/fix/cycle-04/RESOLUTION.md` |
84
+ | Independent full audit — cycle 5 | 78/119 files read (auditor process failure, not an author claim) | 0 / 1 / 0 / 12 | **FAILED** — P1-1 and P3-1…P3-12 addressed in code/tests/docs; full mutation score still not re-measured; see `.tmp/fix/cycle-05/RESOLUTION.md` |
85
+ | Independent full audit — cycle 6 | 51/120 files read fully (auditor process failure, not an author claim) | 0 / 2 / 2 / 4 | **FAILED** — P1-1, P1-2, P2-1, P2-2, P3-1…P3-4 addressed in code/tests/docs; full mutation score still not re-measured; see `.tmp/fix/cycle-06/RESOLUTION.md` |
86
+ | Independent full audit — cycle 7 | 120/120 files read (manifest complete) | 0 / 2 / 2 / 10 | **FAILED** — P1-1, P1-2, P2-1, P2-2 and P3-1…P3-10 addressed in code/tests/docs; full mutation score still not re-measured on the new artifact; see `.tmp/fix/cycle-07/RESOLUTION.md` |
87
+ | Independent full audit — cycle 8 | 121/121 files read (manifest complete) | 0 / 3 / 5 / 6 | **FAILED** — P1-1, P1-2, P2-1…P2-5 and P3-1…P3-6 addressed in code/tests/docs; full mutation score still not re-measured on the cycle-8 artifact; see `.tmp/fix/cycle-08/RESOLUTION.md` |
88
+ | Independent full audit — cycle 9 | 53/122 files read (auditor process failure, not an author claim; the rest is N/R) | 0 / 0 / 5 / 4 | **FAILED** — P1 remains unconfirmed; P2-3, P2-5 and P3-1…P3-4 fixed in code/tests/docs; P2-1 (full mutation), P2-2 (tracked `.pyc`) and P2-4 (CI `gate` vs full mutation) remain open **user decisions**; see `.tmp/fix/cycle-09/RESOLUTION.md` |
89
+ | Independent full audit — cycle 10 | 49/122 files read (auditor process failure, not an author claim; the rest is N/R) | 0 / 0 / 5 / 6 | **FAILED** — no P1 in the read scope; FAILED on the contract's incomplete-manifest rule plus P2 handoff items (mutation out of scope only after this cycle; 28 untracked manifest files; 1293 tracked `.pyc`). After it, the owner removed full mutation from the acceptance criteria (contract v2, 2026-11-08). |
90
+
91
+ Cycle-8 findings closed in this artifact:
92
+
93
+ - **P1-1** the CGC backend is deterministic across processes and never silently
94
+ swaps engines. `cgc.backend="auto"` resolves to FalkorDB (Unix/3.12+, `redislite`
95
+ present) or KuzuDB otherwise and is pinned via `CGC_RUNTIME_DB_TYPE`; FalkorDB is
96
+ constructed directly and a CGC-selected fallback is rejected with `CGCUnavailable`.
97
+ Lock errors are retried 3× with backoff, then surface explicitly. The post-commit
98
+ hook runs `analyze --strict` (no `--silent`) and writes the failure JSON plus an
99
+ explicit `post-commit analyze FAILED` line to `post-commit.log` while still exiting 0
100
+ (a post-commit hook must not break an already-created commit). The cross-process E2E
101
+ test releases the DB (`CGC.close()`) before the CLI subprocess, so it no longer races
102
+ for the same socket/dump. Tests: `test_cgc_backend.py` (pin, mismatch rejection,
103
+ bounded retry, exhaustion, `close`), updated `test_cgc_contract.py` auto/backend tests,
104
+ `test_e2e_impact_isolated_class_is_none_not_query_fail` (5/5), `test_e2e_workspace_path_real_backend`.
105
+ - **P1-2** `drift_md.open_entries` is parsed from real markdown: `## D-*` and `### D-*`
106
+ entries, open/closed sections, recorded statuses (explicit status wins over section,
107
+ negations like "not resolved" count as open), and a preamble is not an entry. Tests:
108
+ `test_health.py::test_drift_md_*` (open `###` under an open section → 1/false-green
109
+ fixed; intro + closed `## D-*` → 0/false-red fixed; valid empty → 0; recorded status;
110
+ negation).
111
+ - **P2-1** the certificate's backend claim now names the deterministic pin, the rejected
112
+ fallback, the bounded lock retry and the cross-process handoff (this section).
113
+ - **P2-2** “E2E 14 passed” was backed by 5/5 consecutive full-suite runs on the previous
114
+ artifact `923dc61c…`; that count is **not transferred** to `0d039dce…`/`7e2679…`, where
115
+ the freeze ran the E2E suite once (`14 passed, 0 skipped`, also reported above).
116
+ - **P2-3** `docs/VERIFICATION.md` keeps the isolated-class invariant `done` because the
117
+ E2E branch was made deterministic (DB released before the subprocess) and was repeated
118
+ 5/5 on the previous artifact; the cycle-9 changes do not touch that path, and the
119
+ current artifact’s single E2E run is reported honestly above rather than as 5/5.
120
+ - **P2-4** `docs/TOOLS.md §7.2` describes the real DRIFT.md parser and the
121
+ `open_entries > 0 → ok:false/exit 1` contract.
122
+ - **P2-5** the literal `§4.4` deviation (merge `gate` runs coverage 100 + six targeted
123
+ probes; full mutation is a separate release job) stays documented in
124
+ `docs/VERIFICATION.md` and the workflow comment; no false PASS or transferred score.
125
+ - **P3-1** stale `_relationship_fallback` docstring (“edge walk stays
126
+ Function-to-Function”) updated to the label-agnostic walk.
127
+ - **P3-2** `docs/SPEC.md §6.4` shows the real `lint(self, verbose: bool = False)`.
128
+ - **P3-3** `docs/SPEC.md §5` tree now lists all source modules (`health.py`,
129
+ `hooks_installer.py`, `policy/agents_md.py`, `tools/_meta.py`, …) and all **23** test
130
+ modules (including `test_cgc_backend.py`) plus `conftest.py`. Cycle 9 found that the
131
+ cycle-8 wording still said “22” and omitted `scripts/`, `methodology/`, `prompts/`,
132
+ `for-*`, `docs/AUDIT_PROMPT.md` and this certificate; the tree is complete now, and
133
+ the earlier “all cycle-8 findings addressed” claim is corrected in this section.
134
+ - **P3-4** `.gitignore` keeps new bytecode out (`__pycache__/`, `*.py[cod]`) and a
135
+ hygiene test pins those rules. 1293 `.pyc`/`__pycache__` files are still **tracked**;
136
+ untracking them is a **user decision** (`git rm --cached` was explicitly not run).
137
+ - **P3-5** `impact --depth` is validated to the documented/MCP `1–10` range in the CLI
138
+ (`argparse` type), with a regression test.
139
+ - **P3-6** `docs/TOOLS.md` gives the same complete `meta` (including
140
+ `index_freshness_s`) in §1.2, §2.2, §3.2 and §4.2.
141
+
142
+ ## Cycle-9 corrections
143
+
144
+ The cycle-9 audit was itself incomplete (53/122 files read; the auditor's process
145
+ failure — the remaining files are N/R, not “OK”), returned **FAILED** with P0=0,
146
+ **P1 not confirmed**, P2=5 and P3=4. P1 is therefore neither accepted nor refuted by
147
+ that cycle; this certificate does not claim P1=0 on its basis.
148
+
149
+ Fixed in this artifact:
150
+
151
+ - **P2-5** `analyze_incremental` updated `imports_map` before `add_file_to_graph` and
152
+ never rolled it back on failure, so later files and `link_function_calls` resolved
153
+ imports of a file that was not indexed. It now snapshots the map before parse and
154
+ restores it on parse/skip/delete/write failure, before the rollback re-add and before
155
+ the next file/link phase. Tests: `tests/test_cgc_contract.py`
156
+ `::test_incremental_failed_file_imports_do_not_leak_into_later_files` (mixed
157
+ success/failure + repeated incremental) and
158
+ `::test_incremental_rollback_restores_imports_map_for_committed_file`.
159
+ - **P2-3** `docs/SPEC.md §5` tree/counters corrected (23 test modules, `scripts/`,
160
+ `methodology/`, `prompts/`, `for-*`, audit prompt and certificate); the cycle-8
161
+ P3-3 “22 test modules” claim was incomplete and is corrected above.
162
+ - **P3-1** `server.py` docstring now names the pinned `mcp` 1.30.x line
163
+ (`mcp>=1.30,<2`), not 0.9.x; the missing-SDK error message says `>=1.30,<2`.
164
+ - **P3-2** `ensure_gitignore_entries` compares normalized whole lines
165
+ (`_gitignore_patterns`) instead of substrings, so
166
+ `.doubled-graph/logs/archive/` or a comment cannot satisfy
167
+ `.doubled-graph/logs/`. Test:
168
+ `tests/test_mutation_kill_hooks.py::test_ensure_gitignore_requires_exact_pattern_not_substring`.
169
+ - **P3-3** `_extract_contract` requires a left token boundary for the marker keyword
170
+ and the symbol name (`MYCONTRACT: f` no longer matches `CONTRACT: f`; a name suffix
171
+ is not accepted), while `START_CONTRACT`/`START CONTRACT` still work. Test:
172
+ `tests/test_mutation_kill_context.py::test_extract_contract_requires_keyword_and_name_boundaries`.
173
+ - **P3-4** `KùzuDB` → `KuzuDB` everywhere it occurred (`docs/SPEC.md` §4 diagram and
174
+ §11, `methodology/tools.md`).
175
+
176
+ Open, not fixed and **not silently accepted** (user decisions):
177
+
178
+ - **P2-1** full mutation is out of acceptance scope under contract v2 (owner decision
179
+ 2026-11-08); the last measured score is reported for information only.
180
+ - **P2-2** 1293 tracked `.pyc`/`__pycache__` files; untracking requires
181
+ `git rm --cached`, explicitly a user decision and not executed here.
182
+ - **P2-4** the merge `gate` runs coverage 100 + six targeted probes, matching the
183
+ contract-v2 §4.4 wording; full mutation remains a separate release/backlog job.
184
+
185
+ ## Cycle-11 corrections (maintenance repair, not an audit)
186
+
187
+ Three user-reported defects were fixed in the working tree (no commit):
188
+
189
+ - **P1-A — CGC worker leak / process-table exhaustion.** `CGC` now owns a lifecycle:
190
+ `atexit.register(self.close)` per instance (re-armed by `_ensure` after a `close()`),
191
+ a class-level `weakref.WeakSet` registry, `CGC.close_all()` (idempotent, swallows
192
+ per-instance close errors), `__enter__`/`__exit__`, and a `close()` that always sets
193
+ `_db=None`, unregisters the exit hook and **never raises** (last error in
194
+ `last_close_error`). `analyze`, `impact`, `context`, `detect_changes` and `health`
195
+ release the instance in `finally`; `tests/conftest.py` runs `CGC.close_all()` after
196
+ every test (autouse) and on `pytest_sessionfinish`. This is the root cause of the
197
+ ~980 orphaned `redis-server`/`falkor_worker` processes that produced
198
+ `spawn sandbox-exec EAGAIN`.
199
+ - Closing the DB after every incremental analyze exposed an upstream CGC/FalkorDB
200
+ index bug: once the `(name, path, line_number, occurrence_index)` range index is
201
+ populated, predicates on `occurrence_index=0` return no rows, so the writer's
202
+ `File-[:CONTAINS]->symbol` link silently finds nothing on a reopened graph.
203
+ `CGC._relink_file_symbols()` re-links by the correctly indexed
204
+ `(name, path, line_number)` prefix after every incremental add/rollback; this also
205
+ fixes cross-process incremental (hook after CLI full), which was previously broken.
206
+ Best-effort: failures are reported as `relink …` incremental warnings.
207
+ - Tests: `tests/test_cgc_lifecycle.py` (registry/atexit/close/close_all/`with`,
208
+ per-tool `close()` spies, relink unit tests). The absolute worker count is verified
209
+ by the CLI series recorded above, not by a flaky `pgrep` test (the strict skip
210
+ allowlist forbids a new platform skip, and the host already runs foreign workers).
211
+ - **P1-B — `python -m doubled_graph` lost every exit code.** `__main__.py` now does
212
+ `raise SystemExit(main(argv_default=["serve"]))`. Regression tests run the real
213
+ module in a subprocess: `--version` → 0, `init-hooks --post-commit` outside git → ≠0,
214
+ malformed `phase set` → 2 (`PHASE_INVALID`), `detect-changes --scope all
215
+ --fail-on-drift` on a real tmp repo with drift → 1, plus the installed console script
216
+ (`doubled-graph`) rc 0/1. `tests/test_cli_entrypoint.py`.
217
+ - **P2-C — `health` claimed "Read-only, no side effects".** It never changes sources or
218
+ `.grace`, but `detect_changes` writes `.doubled-graph/cache/` and the CGC parser probe
219
+ initialises the per-repo graph DB under `~/.codegraphcontext/`. The MCP description,
220
+ the `health.py` docstring, the CLI docstring and `docs/TOOLS.md §7.2` now say
221
+ "read-only for the project" and name the local caches/DBs;
222
+ `tests/test_health.py::test_health_description_is_read_only_for_project_not_side_effect_free`
223
+ fails if the unconditional promise returns.
224
+
225
+ The normative rule is now in `docs/VERIFICATION.md` ("Правило: CGC всегда
226
+ закрывается") and in the `CGC` class docstring: any code that constructs `CGC` must
227
+ close it (`with`/`close`/`close_all`), otherwise it leaks a process.
228
+
229
+ ## Known gaps at candidate time
230
+
231
+ | Gap | Class | Evidence |
232
+ |---|---|---|
233
+ | full mutation score | **out of acceptance scope** (owner decision 2026-11-08) | Removed from the contract's PASS criteria; targeted probes (6/6) remain mandatory. Last measured score (`1793bb33…`): 82.67%, exit 1 — release backlog, not an acceptance blocker. |
234
+ | artifact not committed / 30 manifest files untracked | handoff, **user decision** | HEAD `b7ed89b` predates this work; `scripts/`, `docs/ACCEPTANCE_CERTIFICATE.md`, `docs/AUDIT_PROMPT.md`, `docs/VERIFICATION.md`, `tests/conftest.py`, `tests/test_cli_entrypoint.py`, `tests/test_cgc_lifecycle.py`, `tests/test_e2e_acceptance.py`, `tests/test_health.py`, `health.py`, `provenance.py`, `post_tool.py`, `anchors.py`, `agents_md.py` and the other untracked tests are outside the index. A clean clone of HEAD cannot run `scripts/verify.sh`. The user forbade `git add`/commit, so the artifact must be committed by the owner. |
235
+ | tracked `.pyc` / `__pycache__` backlog | repository hygiene, **user decision** | 1293 files are still in the index. `.gitignore` prevents new ones and a test pins the rules; `git rm --cached` is forbidden for the automated repair and must be decided by the user. |
236
+ | `arg_types` positional semantics | external CGC | CGC does not expose a positional contract; equal-length names/types comparison stays conservative |
237
+ | `ARTICLE.md` / `extra/*` | out-of-scope | archive/article |
238
+
239
+ No known gap is labelled `external` unless the limitation is outside this codebase.
240
+ The cycle-3 `internal/partial` gaps (untracked-file rollback, single-file export parity)
241
+ remain **closed**; their regression tests are named in `docs/VERIFICATION.md`.
242
+
243
+ ## Signature
244
+
245
+ NOT SIGNED — no independent audit has run under contract v2 yet; the cycle-10 audit
246
+ FAILED on an incomplete manifest and open handoff items. Cycle 11 was a maintenance
247
+ repair (CGC worker leak, `python -m` exit codes, `health` side-effect claim), not an
248
+ independent audit, so it does not change the verdict. The full mutation score is out
249
+ of acceptance scope per the owner's 2026-11-08 decision; targeted probes remain green.
250
+ The artifact is uncommitted and 1293 tracked `.pyc` files remain; both are user
251
+ decisions. This file is an audit candidate, not a PASS.