Part of #69.
Stage 4 — L4 interprocedural SDG + Scalpel oracle
Branch: feat/v2-stage4-l4
Deliverables:
dataflow/scalpel_oracle.py — ScalpelAliasOracle implementing the may_alias(p1, p2) contract (per the Stage 0 record); oracle selection: Scalpel primary, TypeBasedAliasOracle fallback (logged when it falls back).
- Emit synthetic param vertices into
body (@formal_in/out, …/actual_in/out); summary edges on the callable; param_in/param_out at application scope; semantic DDG (prov:["points-to"]) as the delta the oracle adds beyond L3.
- CLI:
-a max 3→4; --graphs sdg requires -a 4.
- Neo4j: param vertices ride
PyCFGNode; PY_PARAM_IN/OUT, PY_SUMMARY.
pyproject.toml: add [project.optional-dependencies] scalpel.
- Migrate
test/test_dataflow_sdg.py, test/test_dataflow_emission.py.
Files: dataflow/{scalpel_oracle,alias,builder,sdg,summaries}.py, __main__.py, neo4j/project.py, pyproject.toml, SDG tests.
Gate: no dangling SDG endpoints; PARAM_IN/OUT arity matches; a summary edge exists for a known transitive flow in the fixture; full superset L1 ⊆ … ⊆ L4; L4 gate runs against the Scalpel oracle (monotonic widening only).
Expand into full bite-sized tasks with superpowers:writing-plans at stage start.
Part of #69.
Stage 4 — L4 interprocedural SDG + Scalpel oracle
Branch:
feat/v2-stage4-l4Deliverables:
dataflow/scalpel_oracle.py—ScalpelAliasOracleimplementing themay_alias(p1, p2)contract (per the Stage 0 record); oracle selection: Scalpel primary,TypeBasedAliasOraclefallback (logged when it falls back).body(@formal_in/out,…/actual_in/out);summaryedges on the callable;param_in/param_outat application scope; semantic DDG (prov:["points-to"]) as the delta the oracle adds beyond L3.-amax3→4;--graphs sdgrequires-a 4.PyCFGNode;PY_PARAM_IN/OUT,PY_SUMMARY.pyproject.toml: add[project.optional-dependencies] scalpel.test/test_dataflow_sdg.py,test/test_dataflow_emission.py.Files:
dataflow/{scalpel_oracle,alias,builder,sdg,summaries}.py,__main__.py,neo4j/project.py,pyproject.toml, SDG tests.Gate: no dangling SDG endpoints; PARAM_IN/OUT arity matches; a
summaryedge exists for a known transitive flow in the fixture; full supersetL1 ⊆ … ⊆ L4; L4 gate runs against the Scalpel oracle (monotonic widening only).