GitNexus/docs/languages/php-ingestion-gaps.md
Gergő Magyar 48f108a58a
docs: simplify guides and verify receiver gaps (#3694)
* docs: align resolution architecture and roadmap

* docs: add language ingestion gap inventories

* test: audit receiver gap targets and coverage

Check exact declaration IDs, expose the Dart await wrong-owner edge, and execute previously excluded C++, Rust, PHP, Dart and Vue shapes. Refresh the baseline and all language inventories from fresh measurements; call-drop counts remain unchanged.

* docs: focus roadmap and shorten project README

Keep the resolution roadmap limited to future work and acceptance criteria. Move detailed editor, CLI, MCP, deployment and wiki instructions into linked guides, preserve their command examples, and correct stale onboarding claims.

* docs: correct setup and audit descriptions

---------

Co-authored-by: Gergo Magyar <gergomagyar0@gmail.com>
2026-10-23 09:06:03 +01:00

5 KiB

PHP Ingestion Gaps

Audited on 2026-10-23 with freshly built production sources at c35806d24 and the accompanying benchmark changes. See the measurement audit for commands, target checks, exclusions and test limits. Historical reports below remain separate from freshly measured receiver cases; broader ingestion is not exhaustively assessed.

Receiver shape snapshot

States below come from baseline.json. The harness defines each spelling and its N/A reason. RESOLVES requires the exact expected declaration ID and no same-named call to a different owner. WRONG-TARGET records incorrect edges.

Shape Recorded state Expression or exclusion
arrowCallChain VISIBLE-GAP $svc->getUser()->save(); (intentional untyped control)
arrowPropertyPath RESOLVES $this->repo->save();
plainChain RESOLVES $svc->getUserTyped()->save();
plainDeepChain RESOLVES $svc->getUserTyped()->address->save();
optionalChain RESOLVES $svc?->getUserTyped()->save();
nonNullAssert N/A PHP has no non-null assertion operator.
awaitParen N/A PHP has no await expression in the core language.
explicitTypeArgs N/A PHP has no generic type-argument syntax at a call site.
indexElement VISIBLE-GAP $repos[0]->save();
fieldReceiverCall RESOLVES $this->repo->save();
decoratedReceiverBase N/A PHP $this carries no type decoration on a method receiver.
decoratedFieldType RESOLVES $this->repo->save();

Typed return annotations make the plain/deep/nullsafe chains resolve. indexElement stays visible: PHPDoc User[] is normalized to User, losing container evidence, and PHP has no elementTypeOf hook. arrowCallChain deliberately calls an unannotated producer and remains a negative control.

Planning candidates

ID Evidence Gap or boundary Next planning step and acceptance
PHP-01 Measured gap $repos[0]->save() cannot use the PHPDoc element type. Preserve both the container and its element type, then add provider-owned element resolution. Check the exact target plus untyped arrays and same-name decoys.
PHP-02 Documented boundary Functions in multi-namespace files remain ambiguity evidence but are refused as qualified call targets, function imports and factory producers while ownership is unproven. Capture declaration-local namespace ownership before increasing recall. Preserve single-namespace positives and cross-namespace collision negatives.
PHP-03 Negative control arrowCallChain is VISIBLE-GAP for an unannotated return. Keep this control unresolved; a member-name match is not evidence of a receiver type.

Code and regression entry points

Evidence details: receiver baseline notes and current roadmap.