Summary
Entry-point signature matching in the stitch compares against Function.CanonicalSignature only. A request naming a published entry point by its erased_signature therefore roots no enumeration and, for a composed entry point, produces no finding graph — so the finding is served without reachability or analysis.
The same function, named by two published and equally valid spellings, answers differently.
Observed
pkg:maven/org.springframework.kafka/spring-kafka@3.2.2, include_call_chains: true, one signature per request:
entry_point_signatures |
assets |
reachability |
analysis |
unmatched |
...KafkaTemplate.send(String, K, V): CompletableFuture |
7 |
reachable |
call_chains: partial |
0 |
...KafkaTemplate.send(String, Object, Object): CompletableFuture |
7 |
absent |
absent |
0 |
Both spellings are published on that entry point. unmatched is empty in both cases, so both are recognised for finding selection; only the first reaches the enumeration.
Cause
chainEntryNodes and composedChainEntryFindings (pkg/graphfrag/stitch.go) build the wanted set from the raw request strings and compare against Function.CanonicalSignature / CryptoEntryPoint.CanonicalSignature. ErasedSignature is carried on Function (schema 1.9+) and published on every exported entry point, but is never consulted here.
For a composed entry point the consequence is the whole verdict: with no signature matched, composedChainEntryFindings returns nil, the zero-chain guard in traceBackward continues, and no finding graph is emitted for the verdict to attach to.
Scope
Accept ErasedSignature alongside CanonicalSignature in both matchers. Pure widening — every signature that matches today still matches — and it restores symmetry between the two published spellings.
function_key is also published and equally unambiguous; accepting it is the same one-line addition and worth deciding on at the same time.
Context
#286 restored the verdict for the canonical spelling. That fix was deliberately scoped to the canonical contract and this limitation was recorded at the time, before the serving layer began accepting the erased spelling for finding selection. Now that it does, the asymmetry is observable in the served response.
Summary
Entry-point signature matching in the stitch compares against
Function.CanonicalSignatureonly. A request naming a published entry point by itserased_signaturetherefore roots no enumeration and, for a composed entry point, produces no finding graph — so the finding is served withoutreachabilityoranalysis.The same function, named by two published and equally valid spellings, answers differently.
Observed
pkg:maven/org.springframework.kafka/spring-kafka@3.2.2,include_call_chains: true, one signature per request:entry_point_signaturesreachabilityanalysisunmatched...KafkaTemplate.send(String, K, V): CompletableFuturereachablecall_chains: partial...KafkaTemplate.send(String, Object, Object): CompletableFutureBoth spellings are published on that entry point.
unmatchedis empty in both cases, so both are recognised for finding selection; only the first reaches the enumeration.Cause
chainEntryNodesandcomposedChainEntryFindings(pkg/graphfrag/stitch.go) build the wanted set from the raw request strings and compare againstFunction.CanonicalSignature/CryptoEntryPoint.CanonicalSignature.ErasedSignatureis carried onFunction(schema 1.9+) and published on every exported entry point, but is never consulted here.For a composed entry point the consequence is the whole verdict: with no signature matched,
composedChainEntryFindingsreturns nil, the zero-chain guard intraceBackwardcontinues, and no finding graph is emitted for the verdict to attach to.Scope
Accept
ErasedSignaturealongsideCanonicalSignaturein both matchers. Pure widening — every signature that matches today still matches — and it restores symmetry between the two published spellings.function_keyis also published and equally unambiguous; accepting it is the same one-line addition and worth deciding on at the same time.Context
#286 restored the verdict for the canonical spelling. That fix was deliberately scoped to the canonical contract and this limitation was recorded at the time, before the serving layer began accepting the erased spelling for finding selection. Now that it does, the asymmetry is observable in the served response.