You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Umbrella tracker for the PHP work this fork exists for: what started it, what we found on the way, what is already proposed upstream, and what is still waiting on a dependency before it can be proposed.
Fork is at 0.9.39 (v8 @ 93657ef, fork PR #57 merged 2026-08-07). Everything in sections 1, 2 and 3a–3b has landed on the fork. Nothing has merged upstream yet — all seven upstream PRs are OPEN with no review decision (checked 2026-08-07).
1. The original issue and its fix
What
Where
State
Original upstream bug — PHP member/instance calls never resolve to calls edges; only ClassName::method() works
2507 — we filed it; maintainer CLOSED it 2026-08-07 after landing the relational-verb demotion in upstream 0.9.35. 2516 carries the two failure modes that survived that fix.
So: one upstream issue we filed (2507, closed), one pre-existing upstream issue we're fixing (1682, open), and seven upstream PRs open. The rest of the ~35 fork issues are our own decomposition and never needed an upstream ticket.
Suggested merge order for the maintainer, if asked: 2492 → 2502 → 2505 → 2506 (that chain must go in order); 2503, 2516, 2536 are independent and can go any time.
3. Fixes that have NOT been proposed upstream yet
3a. Landed on the fork (PR #51 / 0.9.38), deliberately held back — dependency-blocked
Both are named in 2536's body as "two sibling fixes deliberately not in this PR".
3b. Landed on the fork (PR #57 / 0.9.39, MERGED 2026-08-07), not yet proposed upstream
All three issues CLOSED on the fork with acceptance + corpus-grading evidence (−1,341 fabricated calls edges, +2,398 legitimate, on the 46.6k-node api rebuild).
PHP: global function calls (event()-family) bare-matching method nodes cross-file — needs a resolution policy #52 — a PHP function_call_expression never bare-matches a method — or, widened during review, a class-like node — cross-file. 848 fabricated inbound calls edges on one test method (GetProviderBillingEventsTest::event()) from Laravel's event() helper; the same family covered config() (−290), dispatch() (−186), request() (−15). Fork commit 9069df5. Portability checked against clean upstream/v8: the PHP call-subtype branch it hooks (extractors/engine.py:4373) and the candidate-filter helpers it uses (_lang_is_case_insensitive, global_label_to_nids_ci in extract.py) all already exist there → openable standalone, ahead of the whole chain. This is the tracker's next concrete action.
Close when: 2492, 2502, 2503, 2505, 2506, 2516 and 2536 have all merged (or been declined) upstream, and every checkbox in section 3 is either merged upstream or explicitly written off as fork-only (#55 already is).
Next concrete action, unblocked today: open #52 upstream standalone — it is the only unshipped item in section 3 with no upstream dependency. (The fork PR for 0.9.39 is done: #57, merged.)
Umbrella tracker for the PHP work this fork exists for: what started it, what we found on the way, what is already proposed upstream, and what is still waiting on a dependency before it can be proposed.
Fork is at 0.9.39 (
v8@93657ef, fork PR #57 merged 2026-08-07). Everything in sections 1, 2 and 3a–3b has landed on the fork. Nothing has merged upstream yet — all seven upstream PRs are OPEN with no review decision (checked 2026-08-07).1. The original issue and its fix
callsedges; onlyClassName::method()worksdistribuidornexvia, 2026-07-05)feat/php-member-calls-1682fix(php): resolve instance-method calls edges from typed receivers (#1682)2. Everything else we found, and where it is upstream
Each row: fork issues → fork PR(s) that landed it → the upstream PR carrying it.
useFQN/alias metadata), #26 (group-formuse function/use constleak)indirect_call), #9 (union/intersection receivers), #20 (qualified receiver types), #16/#21 (use-claim refusal)find_node_ambiguitysourceless rivals), #39 (relative-scope callees)v8@9f25a3a)So: one upstream issue we filed (2507, closed), one pre-existing upstream issue we're fixing (1682, open), and seven upstream PRs open. The rest of the ~35 fork issues are our own decomposition and never needed an upstream ticket.
Suggested merge order for the maintainer, if asked: 2492 → 2502 → 2505 → 2506 (that chain must go in order); 2503, 2516, 2536 are independent and can go any time.
3. Fixes that have NOT been proposed upstream yet
3a. Landed on the fork (PR #51 / 0.9.38), deliberately held back — dependency-blocked
Both are named in 2536's body as "two sibling fixes deliberately not in this PR".
importsedges from their owntarget_fqnmetadata. Kills ~19k dangling import edges on the measured 46.4k-node corpus. Blocked on 2502, which introduces theuse-statement metadata (target_fqn) this reads. 2536 estimates it at a ~60-line follow-up once 2502 merges. Fork commit258d8e3.@vardocblock + typed ctor param assigned across). Blocked on the 2492 → 2505 → 2506 receiver-typing chain. Fork commit293d57e.3b. Landed on the fork (PR #57 / 0.9.39, MERGED 2026-08-07), not yet proposed upstream
All three issues CLOSED on the fork with acceptance + corpus-grading evidence (−1,341 fabricated
callsedges, +2,398 legitimate, on the 46.6k-node api rebuild).function_call_expressionnever bare-matches a method — or, widened during review, a class-like node — cross-file. 848 fabricated inboundcallsedges on one test method (GetProviderBillingEventsTest::event()) from Laravel'sevent()helper; the same family coveredconfig()(−290),dispatch()(−186),request()(−15). Fork commit9069df5. Portability checked against cleanupstream/v8: the PHP call-subtype branch it hooks (extractors/engine.py:4373) and the candidate-filter helpers it uses (_lang_is_case_insensitive,global_label_to_nids_ciinextract.py) all already exist there → openable standalone, ahead of the whole chain. This is the tracker's next concrete action.630072e. Blocked on 2536 — it extends Stub-shadow fix 3/4: find_node_ambiguity must not collapse sourceless rivals into one group (RC3 of #46) #49's sourced-beats-sourceless rule to_score_nodes/_pick_scored_endpoint, which 2536's commit 2 introduces._php_non_class_typesreceiver refusal. Fork commit26f7b03; also fixes a full-vs-incremental parity hole by extending the declared-FQN pre-scan to all four declaration kinds. Blocked on 2536 (Stub-shadow fix 1/4: PHP interface/trait/enum declarations mint canonical nodes (RC1 of #46) #47 must give interface/trait/enum real nodes first) AND on the 2492→2505→2506 receiver chain — it touchesextract.py,extractors/php.py,cli.py,watch.pyin code none of which exists on clean upstreamv8. Last in the queue. Note for the eventual port: this is a deliberate divergence today — upstream has no_php_non_class_typespre-scan at all.3c. Investigated and written off — no code change anywhere
new. Explicitly written off per this tracker's definition of done — it does not ride upstream. Reopen only with a real-corpus wrong-edge repro.3d. Triaged
ready-for-agenton the fork, not implemented anywhere yetparent::/self::scoped calls (PHP: clearly-wrong calls edges in the repro neighborhood (.parent() --calls--> .setUp(); .handle() --calls--> test methods) — failure mode #3 evidence #39 follow-up, split out of the 2536 review). Triaged 2026-08-07 with a decided spec: resolveparent/selfthrough the caller's in-corpusinheritschain, keep refusingstatic::, out-of-corpus base yields nothing, full/incremental parity tests mandatory. Recall left on the table today (parent::__construct()/parent::setUp()are ubiquitous), not a correctness bug. Extraction-side (version bump). Next fork fix cycle; composes with PHP: global function calls (event()-family) bare-matching method nodes cross-file — needs a resolution policy #52's filtering, so it rides upstream behind PHP: global function calls (event()-family) bare-matching method nodes cross-file — needs a resolution policy #52 eventually._php_member_receiver()out ofwalk_calls— deliberately not a tracker checkbox: triaged as a rider-only refactor (fold into the next slice editing that engine.py region, most likely PHP: relative-scope calls (parent::/self::/static::) resolve to nothing — needs a base-class-aware resolution pass (#39 follow-up) #58's; never its own PR, never its own upstream port).Definition of done for this tracker
Close when: 2492, 2502, 2503, 2505, 2506, 2516 and 2536 have all merged (or been declined) upstream, and every checkbox in section 3 is either merged upstream or explicitly written off as fork-only (#55 already is).
Next concrete action, unblocked today: open #52 upstream standalone — it is the only unshipped item in section 3 with no upstream dependency. (The fork PR for 0.9.39 is done: #57, merged.)