feat(pre-push-safety-net): measure M1b step 1 and record the inventory prerequisite

Rerunning the three NodeGoat revisions after tasks 10.1-10.3 shows the recorded
view now classifies the case: the vulnerable revision reaches new with
operation_absent_from_comparable_base, and the unchanged revision reaches
unchanged with its base location resolved to the same lines. Both previously
stopped at operation_correspondence_unresolved and witness_identity_unresolved.

The rerun also caught a defect in the repair itself: the new novelty reason was
missing from the admission allowlist, so admission rejected the candidate as
change_unsupported. Fixed with a control.

The production path is still blocked by the last two vetoes, and the measurement
shows neither can be scoped or relaxed as the plan described. A taint answer
reports traced flows, so an absent row means either that the operation does not
exist in the base or that no traced flow reached it.
dynamic_external_or_depth_context_unresolved exists to stop the second being read
as the first, and removing it would turn a wrong absence into a wrong new
finding. It is also computed over every in-scope method, so on any real Express
application it is always true and can never be discharged, which is why the tool
reports nothing on real projects.

The resolution is new evidence rather than a relaxed rule: export the operations
the query actually enumerated, separately from the flows it traced, so absence is
established from the inventory while a traced-flow claim still requires complete
reachability. That is now task 10.4, ahead of the two vetoes it unblocks, and it
adds no detector, alias resolver or second source IR.

1,348 tests passed, nine skipped. No capability enabled; rollout stays NO-GO.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
This commit is contained in:
Marius Ciepluch
2026-09-16 16:03:16 +02:00
co-authored by Claude Opus 5
parent 8ff1d9a638
commit 86980d8aa0
9 changed files with 2488 additions and 25 deletions
+9 -8
View File
@@ -15,7 +15,7 @@ not a demonstrated useful safety net. Task 8.3 and rollout remain NO-GO.
| Order | Milestone | Observable exit | Current state |
|---|---|---|---|
| M1a | Show the NodeGoat detection with every admission veto recorded, not applied | Raw finding with witness on the vulnerable revision; analyzed fixed twin and unchanged control quiet; per-finding veto list. One-week time box | MET 2026-09-16 |
| M1b | Repair only the vetoes M1a showed to matter | Supported evaluation finding through production rules, exact change/base evidence and repair direction; fixed twin and unchanged control stay quiet | NEXT |
| M1b | Repair only the vetoes M1a showed to matter | Supported evaluation finding through production rules, exact change/base evidence and repair direction; fixed twin and unchanged control stay quiet | IN PROGRESS: 10.1-10.3 verified; 10.4 operation inventory now blocks the rest |
| M2 | Make that same analysis fast | Equivalent evidence; representative warm changed-code p95 <=30s, cancellation/report <=2s, >=95% supported completion | Pending M1 |
| M3 | Prove the shared design transfers | PMPro/PHP and VAmPI/Python vulnerable/fixed evidence; unchanged core rules; Node replay after any PMPro core change | Pending M2 |
| M4 | Qualify on independent cases | Reviewed untouched vulnerable/fixed/benign populations pass joint quality, coverage and latency gates per capability | Pending M3 |
@@ -23,13 +23,14 @@ not a demonstrated useful safety net. Task 8.3 and rollout remain NO-GO.
### Immediate next action
Repair the five vetoes M1a recorded, then rerun the same three NodeGoat revisions without
the flag through the production rules (M1b). Start with operation correspondence for an
operation on a changed line: M1a measured that this one survives every other repair, and it
was not in the earlier four-veto diagnosis. The others are per-family change context,
question-owned vendor relevance, file-wide correspondence ambiguity scope and
query-to-operation provenance. Vetoes that did not fire stay unchanged and their families
stay experimental. Normal hook eligibility stays disabled.
Export the enumerated operation inventory separately from traced flows (task 10.4), then
finish the last two vetoes it unblocks and rerun the three NodeGoat revisions through the
production rules. Operation correspondence, required comparison scope and ambiguity scoping
are already verified and measured. The inventory is needed because a taint answer reports
flows: an absent row means either that the operation does not exist or that no traced flow
reached it, and the veto that stops those being confused is always true on a real Express
application, so it can neither be discharged nor safely removed. Vetoes that did not fire
stay unchanged and their families stay experimental. Normal hook eligibility stays disabled.
Do not start another broad speed campaign before this outcome exists. See the
[M1a evidence](../specs/pre-push-safety-net/m1a-recorded-vetoes.md) and the
[owner diagnosis](../specs/contributor-scan/release-remediation-research.md).