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.
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/INDEX.md +4 -3
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/PKG-INFO +23 -5
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/README.md +19 -3
- doubled_graph-2.1.0/docs/ACCEPTANCE_CERTIFICATE.md +251 -0
- doubled_graph-2.1.0/docs/AUDIT_PROMPT.md +229 -0
- doubled_graph-2.1.0/docs/CHANGELOG.md +1493 -0
- doubled_graph-2.1.0/docs/HOOKS.md +267 -0
- doubled_graph-2.1.0/docs/SPEC.md +680 -0
- doubled_graph-2.1.0/docs/TOOLS.md +538 -0
- doubled_graph-2.1.0/docs/VERIFICATION.md +160 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-maintenance/README.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/FAQ.md +3 -3
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/getting-started.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/README.md +5 -5
- doubled_graph-2.1.0/methodology/artifacts.md +520 -0
- doubled_graph-2.1.0/methodology/ci-templates/github-actions.yml +57 -0
- doubled_graph-2.1.0/methodology/ci-templates/gitlab-ci.yml +34 -0
- doubled_graph-2.1.0/methodology/drift-and-priority.md +195 -0
- doubled_graph-2.1.0/methodology/language-adapters/_template.md +102 -0
- doubled_graph-2.1.0/methodology/language-adapters/java.md +256 -0
- doubled_graph-2.1.0/methodology/principles.md +169 -0
- doubled_graph-2.1.0/methodology/roles.md +115 -0
- doubled_graph-2.1.0/methodology/runtime-adapters/_template.md +71 -0
- doubled_graph-2.1.0/methodology/runtime-adapters/claude-code.md +135 -0
- doubled_graph-2.1.0/methodology/runtime-adapters/codex.md +68 -0
- doubled_graph-2.1.0/methodology/runtime-adapters/continue.md +86 -0
- doubled_graph-2.1.0/methodology/runtime-adapters/cursor.md +122 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/runtime-adapters/local-llm.md +4 -4
- doubled_graph-2.1.0/methodology/runtime-adapters/windsurf.md +62 -0
- doubled_graph-2.1.0/methodology/tools.md +245 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/workflow.md +4 -4
- doubled_graph-2.1.0/mutants/docs/ACCEPTANCE_CERTIFICATE.md +67 -0
- doubled_graph-2.1.0/mutants/docs/AUDIT_PROMPT.md +231 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/CHANGELOG.md +197 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/HOOKS.md +46 -34
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/SPEC.md +62 -60
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/docs/TOOLS.md +88 -90
- doubled_graph-2.1.0/mutants/docs/VERIFICATION.md +118 -0
- doubled_graph-2.1.0/mutants/methodology/README.md +138 -0
- doubled_graph-2.1.0/mutants/methodology/approval-checkpoints.md +150 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/artifacts.md +6 -6
- doubled_graph-2.1.0/mutants/methodology/auto-scaling.md +77 -0
- doubled_graph-2.1.0/mutants/methodology/ci-templates/github-actions.yml +57 -0
- doubled_graph-2.1.0/mutants/methodology/ci-templates/gitlab-ci.yml +34 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/drift-and-priority.md +2 -2
- doubled_graph-2.1.0/mutants/methodology/language-adapters/csharp.md +340 -0
- doubled_graph-2.1.0/mutants/methodology/language-adapters/go.md +282 -0
- doubled_graph-2.1.0/mutants/methodology/language-adapters/python.md +248 -0
- doubled_graph-2.1.0/mutants/methodology/language-adapters/rust.md +271 -0
- doubled_graph-2.1.0/mutants/methodology/language-adapters/swift.md +260 -0
- doubled_graph-2.1.0/mutants/methodology/language-adapters/typescript.md +256 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/_template.md +1 -1
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/claude-code.md +10 -21
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/codex.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/cursor.md +8 -4
- doubled_graph-2.1.0/mutants/methodology/runtime-adapters/local-llm.md +145 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/tools.md +20 -17
- doubled_graph-2.1.0/mutants/methodology/workflow.md +169 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-drift-detected.md +4 -4
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-user-manual-edit.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/00-entry-prompt.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/06-validation-gates.md +3 -6
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/00-entry-prompt.md +1 -1
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/02-requirements.md +5 -5
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/07-post-init-sync.md +1 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/upgrade-methodology/01-content-gaps.md +1 -1
- doubled_graph-2.1.0/mutants/pyproject.toml +124 -0
- doubled_graph-2.1.0/mutants/tests/conftest.py +24 -0
- doubled_graph-2.1.0/mutants/tests/test_anchors.py +123 -0
- doubled_graph-2.1.0/mutants/tests/test_cgc_contract.py +1426 -0
- doubled_graph-2.1.0/mutants/tests/test_crossref_drift.py +880 -0
- doubled_graph-2.1.0/mutants/tests/test_e2e_acceptance.py +619 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_migration_grace3_to_grace4.py +108 -4
- doubled_graph-2.1.0/mutants/tests/test_mutation_gate_script.py +202 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_analyze.py +173 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_edges.py +305 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_fallback.py +235 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_cgc_misc.py +431 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_context.py +393 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_crossref.py +770 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_hooks.py +535 -0
- doubled_graph-2.1.0/mutants/tests/test_mutation_kill_impact.py +426 -0
- doubled_graph-2.1.0/mutants/tests/test_provenance.py +942 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_setup_artifacts.py +99 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_smoke.py +1413 -29
- doubled_graph-2.1.0/prompts/maintenance/on-after-edit.md +117 -0
- doubled_graph-2.1.0/prompts/maintenance/on-before-edit.md +88 -0
- doubled_graph-2.1.0/prompts/maintenance/on-drift-detected.md +152 -0
- doubled_graph-2.1.0/prompts/maintenance/on-user-manual-edit.md +106 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/00-entry-prompt.md +84 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/01-discover.md +196 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/02-reconstruct-intent.md +209 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/03-draft-plan.md +299 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/04-markup-codebase.md +190 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/05-verification-and-logs.md +166 -0
- doubled_graph-2.1.0/prompts/migrate-existing-project/06-validation-gates.md +193 -0
- doubled_graph-2.1.0/prompts/new-project/00-entry-prompt.md +56 -0
- doubled_graph-2.1.0/prompts/new-project/01-intent-interview.md +103 -0
- doubled_graph-2.1.0/prompts/new-project/02-requirements.md +223 -0
- doubled_graph-2.1.0/prompts/new-project/03-technology.md +95 -0
- doubled_graph-2.1.0/prompts/new-project/04-development-plan.md +363 -0
- doubled_graph-2.1.0/prompts/new-project/05-verification-plan.md +208 -0
- doubled_graph-2.1.0/prompts/new-project/06-generate.md +186 -0
- doubled_graph-2.1.0/prompts/new-project/07-post-init-sync.md +163 -0
- doubled_graph-2.1.0/prompts/upgrade-methodology/00-entry-prompt.md +143 -0
- doubled_graph-2.1.0/prompts/upgrade-methodology/01-content-gaps.md +354 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/pyproject.toml +6 -3
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/__init__.py +2 -1
- doubled_graph-2.1.0/src/doubled_graph/__main__.py +12 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/cli.py +190 -97
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/config.py +32 -13
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-before-edit/SKILL.md +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-guide/SKILL.md +1 -1
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-manual-edit/SKILL.md +4 -4
- doubled_graph-2.1.0/src/doubled_graph/graphs/anchors.py +129 -0
- doubled_graph-2.1.0/src/doubled_graph/graphs/crossref.py +772 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/graphs/declared.py +35 -5
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/graphs/grace4.py +127 -3
- doubled_graph-2.1.0/src/doubled_graph/health.py +214 -0
- doubled_graph-2.1.0/src/doubled_graph/hooks_installer.py +388 -0
- doubled_graph-2.1.0/src/doubled_graph/integrations/cgc.py +1708 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/integrations/grace_cli.py +90 -18
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/migrations/grace3_to_grace4.py +73 -8
- doubled_graph-2.1.0/src/doubled_graph/policy/agents_md.py +128 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/policy/phase.py +73 -3
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/server.py +19 -60
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/setup.py +66 -31
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/storage/paths.py +2 -2
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/tools/_meta.py +15 -3
- doubled_graph-2.1.0/src/doubled_graph/tools/analyze.py +406 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/tools/context.py +106 -28
- doubled_graph-2.1.0/src/doubled_graph/tools/detect_changes.py +437 -0
- doubled_graph-2.1.0/src/doubled_graph/tools/impact.py +508 -0
- doubled_graph-2.1.0/src/doubled_graph/tools/post_tool.py +83 -0
- doubled_graph-2.1.0/src/doubled_graph/tools/provenance.py +188 -0
- doubled_graph-2.1.0/tests/__init__.py +0 -0
- doubled_graph-2.1.0/tests/conftest.py +92 -0
- doubled_graph-2.1.0/tests/test_anchors.py +123 -0
- doubled_graph-2.1.0/tests/test_bom_support.py +204 -0
- doubled_graph-2.1.0/tests/test_cgc_backend.py +272 -0
- doubled_graph-2.1.0/tests/test_cgc_contract.py +1685 -0
- doubled_graph-2.1.0/tests/test_cgc_lifecycle.py +318 -0
- doubled_graph-2.1.0/tests/test_cli_entrypoint.py +141 -0
- doubled_graph-2.1.0/tests/test_crossref_drift.py +1166 -0
- doubled_graph-2.1.0/tests/test_e2e_acceptance.py +773 -0
- doubled_graph-2.1.0/tests/test_grace4_artifacts.py +391 -0
- doubled_graph-2.1.0/tests/test_grace_cli_engine.py +339 -0
- doubled_graph-2.1.0/tests/test_health.py +396 -0
- doubled_graph-2.1.0/tests/test_migration_grace3_to_grace4.py +979 -0
- doubled_graph-2.1.0/tests/test_mutation_gate_script.py +271 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_analyze.py +173 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_cgc_edges.py +305 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_cgc_fallback.py +285 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_cgc_misc.py +435 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_context.py +408 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_crossref.py +822 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_hooks.py +573 -0
- doubled_graph-2.1.0/tests/test_mutation_kill_impact.py +426 -0
- doubled_graph-2.1.0/tests/test_provenance.py +942 -0
- doubled_graph-2.1.0/tests/test_repo_hygiene.py +63 -0
- doubled_graph-2.1.0/tests/test_setup_artifacts.py +225 -0
- doubled_graph-2.1.0/tests/test_smoke.py +3468 -0
- doubled_graph-2.0.2/src/doubled_graph/__main__.py +0 -6
- doubled_graph-2.0.2/src/doubled_graph/graphs/crossref.py +0 -31
- doubled_graph-2.0.2/src/doubled_graph/hooks_installer.py +0 -188
- doubled_graph-2.0.2/src/doubled_graph/integrations/cgc.py +0 -522
- doubled_graph-2.0.2/src/doubled_graph/tools/analyze.py +0 -158
- doubled_graph-2.0.2/src/doubled_graph/tools/detect_changes.py +0 -282
- doubled_graph-2.0.2/src/doubled_graph/tools/impact.py +0 -293
- doubled_graph-2.0.2/tests/test_cgc_contract.py +0 -248
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/.gitignore +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/ARTICLE.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/LICENSE +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-existing-project/README.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-ai-new-project/README.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/for-humans/deep-dive.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/approval-checkpoints.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/auto-scaling.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/csharp.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/go.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/python.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/rust.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/swift.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/methodology/language-adapters/typescript.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/language-adapters/_template.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/language-adapters/java.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/principles.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/roles.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/continue.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/methodology/runtime-adapters/windsurf.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-after-edit.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/maintenance/on-before-edit.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/01-discover.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/02-reconstruct-intent.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/03-draft-plan.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/04-markup-codebase.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/migrate-existing-project/05-verification-and-logs.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/01-intent-interview.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/03-technology.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/04-development-plan.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/05-verification-plan.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/new-project/06-generate.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/prompts/upgrade-methodology/00-entry-prompt.md +0 -0
- {doubled_graph-2.0.2/src/doubled_graph/graphs → doubled_graph-2.1.0/mutants/tests}/__init__.py +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_bom_support.py +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_grace4_artifacts.py +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0/mutants}/tests/test_grace_cli_engine.py +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-after-edit/SKILL.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-drift/SKILL.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-refactor/SKILL.md +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/data/skills/doubled-graph-verify/SKILL.md +0 -0
- {doubled_graph-2.0.2/src/doubled_graph/integrations → doubled_graph-2.1.0/src/doubled_graph/graphs}/__init__.py +0 -0
- {doubled_graph-2.0.2/src/doubled_graph/policy → doubled_graph-2.1.0/src/doubled_graph/integrations}/__init__.py +0 -0
- {doubled_graph-2.0.2 → doubled_graph-2.1.0}/src/doubled_graph/migrations/__init__.py +0 -0
- {doubled_graph-2.0.2/src/doubled_graph/storage → doubled_graph-2.1.0/src/doubled_graph/policy}/__init__.py +0 -0
- {doubled_graph-2.0.2/src/doubled_graph/tools → doubled_graph-2.1.0/src/doubled_graph/storage}/__init__.py +0 -0
- {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
|
-
| Обновление методики (
|
|
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
|
-
| Контракт
|
|
62
|
+
| Контракт MCP-tools (10) | [docs/TOOLS.md](docs/TOOLS.md) |
|
|
63
63
|
| Hooks (git + Claude Code + optional) | [docs/HOOKS.md](docs/HOOKS.md) |
|
|
64
|
-
|
|
|
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
|
|
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
|
|
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. Обновление версии методики (
|
|
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
|
|
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. Обновление версии методики (
|
|
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
|
|
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.
|