Type: test · Branch: test/issue-27-monotonicity-gate · Part of epic #26 · Lands first
Problem
CLAUDE.md and README.md:279 advertise L1 ⊆ L2 ⊆ L3 ⊆ L4 as a CI-checkable gate, but the only monotonicity test (test/schema-v2.test.ts:405-424) asserts a partial L3 ⊆ L4 diff — and L1/L2 run on sample-app while L3/L4 run on dataflow-app, so no single fixture is diffed across the full chain. Neo4j↔JSON count parity (testing-and-validation.md:107-108) is never asserted. This is the correctness claim the whole v2 migration rests on, and it becomes the regression net for the rest of the cluster.
Change
Add a gate in test/schema-v2.test.ts on one fixture (test/fixtures/dataflow-app): run the analyzer at -a 1/2/3/4; for each N → N+1 assert the symbol-table id sets, body-node key sets, and edge-key sets (call_graph, per-callable cfg/cdg/ddg/summary, root param_in/param_out) are supersets. The only permitted value change is the sanctioned callee: null → id. Second clause: --emit neo4j (full-depth L4) node/edge counts equal the -a 4 JSON, modulo HAS_*/DECLARES containment.
Acceptance
- All four levels on one fixture, green.
- Removing any lower-level node/edge from the emitter makes it fail (whitelist: the
callee refinement).
- Neo4j overlay relationship counts match the L4 JSON edge-list lengths.
Files: test/schema-v2.test.ts (test-only — no production code).
Type: test · Branch:
test/issue-27-monotonicity-gate· Part of epic #26 · Lands firstProblem
CLAUDE.mdandREADME.md:279advertiseL1 ⊆ L2 ⊆ L3 ⊆ L4as a CI-checkable gate, but the only monotonicity test (test/schema-v2.test.ts:405-424) asserts a partialL3 ⊆ L4diff — and L1/L2 run onsample-appwhile L3/L4 run ondataflow-app, so no single fixture is diffed across the full chain. Neo4j↔JSON count parity (testing-and-validation.md:107-108) is never asserted. This is the correctness claim the whole v2 migration rests on, and it becomes the regression net for the rest of the cluster.Change
Add a gate in
test/schema-v2.test.tson one fixture (test/fixtures/dataflow-app): run the analyzer at-a 1/2/3/4; for eachN → N+1assert the symbol-table id sets, body-node key sets, and edge-key sets (call_graph, per-callablecfg/cdg/ddg/summary, rootparam_in/param_out) are supersets. The only permitted value change is the sanctionedcallee: null → id. Second clause:--emit neo4j(full-depth L4) node/edge counts equal the-a 4JSON, moduloHAS_*/DECLAREScontainment.Acceptance
calleerefinement).Files:
test/schema-v2.test.ts(test-only — no production code).