mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-14 04:50:22 +08:00
A main commit can now publish its test-impact bundle — the commit's frozen graph, its per-test coverage map and receipt.json binding both — and a PR selection given the bundle of its merge base, verified by the caller, builds its graph incrementally from the bundle's graph and narrows suites by the admitted map. Without a verified bundle nothing changes: the graph is built from scratch and every reached suite runs whole. Producer and consumer: - `codebase-memory-mcp test-impact publish|select` (in process, no daemon): publish builds the bundle of the checked-out commit, from the previous bundle's graph when that bundle verifies; select is the selection with optional --artifact/--artifact-commit/--artifact-verified. The MCP surface is unchanged. - receipt.json binds the exact imported graph (graph digest), the graph's content and topology, the map's three files and a compatibility digest (platform label + the bytes of test_impact.coverage.compatibility_paths). - A bundle is used only when the caller verified its source, it is the merge base's own, and its imported graph is the one the receipt names; the map is admitted by the existing receipt policy (source, ancestry, content, age, compatibility, metadata). Refusals become rejection reasons in the answer's receipt. - C_eff: a changed function the map knows contributes its own id; one it does not know (new, platform-only, a type or macro) contributes its nearest mapped callers on the static inbound closure; deleted names contribute every mapped function of that name. Graph: - the frozen build accepts a base candidate and repairs it through the incremental closure route; any doubt declines to the full build. Pinned to one worker like the full frozen build. - incremental closure repair skipped the interprocedural complexity pass: re-parsed functions lost transitive_loop_depth/recursive and callers kept stale values. One traversal now serves the in-memory pass and a new store-level recompute that runs before the importance rescore. - test-impact's frozen builds use a fixed display Git context: the per-run pin path and the commit ids made two builds of one tree differ and made every commit a semantic-input change, so repair always declined. - graph content and topology digests (store_content_digest.c): the exact graph digest binds one database (ids, db_uid, generation), never equal across builds; the content digest keys rows by what they say, the topology digest by what selection reads. Measured on this repository (frozen publish, macOS arm64): a two-file C change repairs in 18-20 s instead of 75-80 s with the topology of the full build; a docs-only change repairs with identical content; selections with and without the bundle are identical on all seven replayed pairs (two repaired incrementally, five declined to the full build). Recorded, not fixed: closure repair still differs from a full build in edge PROPERTIES (argument quoting and key order, CONFIGURES args) and in the corpus-wide SIMILAR_TO/SEMANTICALLY_RELATED edges; selection reads neither, so the topology digest is the incremental-equals-full check and the receipt carries both. Tooling: scripts/test-impact/coverage-merge.py builds a push's incremental coverage map (re-run suites verbatim, the rest carried with ids remapped onto the new image's function table), with its contract as test.sh Step 0z7. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
60 lines
1.4 KiB
JSON
60 lines
1.4 KiB
JSON
{
|
|
"test_impact": {
|
|
"version": 1,
|
|
"tests": {
|
|
"presets": {
|
|
"c-cbm": true
|
|
}
|
|
},
|
|
"rules": [
|
|
{
|
|
"id": "harness",
|
|
"paths": ["tests/test_framework.h", "tests/test_helpers.*", "tests/test_main.c"],
|
|
"action": "run_all"
|
|
},
|
|
{
|
|
"id": "engine",
|
|
"paths": [".codebase-memory.json", "src/mcp/test_impact*", "src/store/store_impact.*"],
|
|
"action": "run_all"
|
|
},
|
|
{
|
|
"id": "build",
|
|
"paths": ["scripts/**", "test-infrastructure/**", "pkg/**"],
|
|
"action": "run_all"
|
|
},
|
|
{
|
|
"id": "grammars",
|
|
"paths": ["internal/cbm/vendored/**"],
|
|
"action": "run_all"
|
|
},
|
|
{
|
|
"id": "fixtures",
|
|
"paths": ["tests/fixtures/*/**"],
|
|
"action": "referencing_tests",
|
|
"key": "path_segment:2"
|
|
},
|
|
{
|
|
"id": "contracts",
|
|
"paths": ["tests/**/*.{sh,py,json,txt}"],
|
|
"action": "ignore"
|
|
},
|
|
{
|
|
"id": "notices",
|
|
"paths": ["NOTICE*", "CHANGELOG*", "THIRD_PARTY*"],
|
|
"action": "ignore"
|
|
}
|
|
],
|
|
"unmapped_files": "run_all",
|
|
"coverage": {
|
|
"compatibility_paths": [
|
|
"tests/test_framework.h",
|
|
"tests/test_main.c",
|
|
"tests/test_helpers.h",
|
|
"Makefile.cbm",
|
|
"scripts/test-impact/coverage-map.py",
|
|
"scripts/test-impact/coverage-merge.py"
|
|
]
|
|
}
|
|
}
|
|
}
|