Skip to content

all: next: and path read the whole answer before saying local or independent (#1388) - #1615

Merged
swapnilpaliwal-sd merged 1 commit into
0.1.4from
fix/1388-no-false-local-r3
Sep 28, 2026
Merged

swapnilpaliwal-sd merged 1 commit into
0.1.4from
fix/1388-no-false-local-r3

Conversation

@swapnilpaliwal-sd

Copy link
Copy Markdown
Contributor

Fixes #1388, Fixes #1385, Fixes #1573, Fixes #1467, Fixes #1468, Fixes #1552

What was wrong

impact ended with next: nothing resolved depends on it, so the change is local and path ended with "the two are independent in this graph" on answers that had just printed evidence to the contrary. The next: line was built from the resolved production rows only, so it ignored everything else the same answer showed:

path said "independent" when one side calls into a library and the other side is entered from outside the graph in the same process, such as an event publisher and its listener (#1385). It also said "independent" one line above a framework note showing that one side writes the key the other is registered under.

The change

This is one contract across both verbs. The word "local" or "independent" is used only when the answer holds none of that evidence.

  • axiomcode-impact: next: reads every kind of evidence the answer prints. It names the non-source sites, the remote caller, the by-name callers to check, or the tests to run, or it says that callers of an entry point are outside the graph. A fully qualified [text] name counts against deletion. A bare word match stays a lead.
  • axiomcode-path: the no-chain branch names library calls when the other side is entered in-process from outside the graph. The framework key note is computed before the verdict line.
  • ax_pages.next_path: the next: line for a no-chain answer now depends on why no chain exists.

Tests

tests/cases/<lang>/next-step-reads-the-whole-answer covers Java, Python, C#, TypeScript and JavaScript. Each case includes near-miss controls:

  • a method that nothing calls still reads as local;
  • a private method of a servlet still reads as local;
  • a plain static method next to a controller still reads as local;
  • a start that calls nothing is still independent;
  • a console write does not make a pair "not shown to be independent".

The local runs of tests/run.py for java (104/104), python (71/71) and csharp (10/10) passed. The typescript suite passed 92 of 95 checks. The 2 PENDING checks were already pending. The 1 failure was an index killed by a concurrent engine compile on this machine, and that case passed when run again. The new javascript case is left to CI, because the JavaScript engine was still compiling cold here.

Smoke check (installed 0.1.4 vs this branch, same graph)

  • A Spring Boot project, 20 random targets: before the change, all 6 entry points (http, scheduled) said "the change is local". After it, each says its callers are outside the graph. The 14 other answers are unchanged.
  • A Django project, 20 random targets: before the change, 8 said "local" while the answer held an ORM-hook entry point, by-name callers or tests. After it, none of those do. The 7 truly local targets (migrations, empty __init__) still say local, and the other 5 (resolved callers) are unchanged.

Deep scan deferred (regression gate, negative controls, held-out runs).

…swer printed (#1388, #1385, #1573, #1467, #1468, #1552)

next: in impact was built from resolved production rows only. It now reads what
the same answer printed: [text] sites outside the source, which also count against
delete; an entry point; a [remote] caller, which is a place and not a lead;
[by name] callers; tests that reach the change; and a library supertype that
calls an override. path no longer says two methods are independent when one side
calls into a library and the other is entered in-process from outside the graph,
or when a framework key joins them. Cases in all five languages, with controls.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant