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
Today a call that's clearly outbound but unattributed is silently discarded at two points: detection (src/scanner/core-scanner.ts:269 — if (!fp && !knownSdkProvider && !knownHttpHost) continue;) and endpoint aggregation (src/scan-results.tsisHighConfidenceEndpointUrl rejecting sdk:// placeholders — see #141). This makes "unknown provider" and "not a call" indistinguishable. Per the agreed design, an outbound-but-unknown call should become a logged known-unknown with a captured "calling card" so providers can be backfilled.
Proposed fix
Split resolution into two explicit steps:
isOutbound(call) — from call shape: bound HTTP-client method, bound SDK/agent method, fetch/axios/requests/httpx, etc. (no provider needed).
When isOutbound && !provider: emit a match with provider: "unknown", kind: "http" | "sdk", and a capture payload: { hostFragment?, sdkRoot?, modelString?, methodChain, file, line }. Do not drop.
Part of #142.
Summary
Today a call that's clearly outbound but unattributed is silently discarded at two points: detection (
src/scanner/core-scanner.ts:269—if (!fp && !knownSdkProvider && !knownHttpHost) continue;) and endpoint aggregation (src/scan-results.tsisHighConfidenceEndpointUrlrejectingsdk://placeholders — see #141). This makes "unknown provider" and "not a call" indistinguishable. Per the agreed design, an outbound-but-unknown call should become a logged known-unknown with a captured "calling card" so providers can be backfilled.Proposed fix
isOutbound(call)— from call shape: bound HTTP-client method, bound SDK/agent method, fetch/axios/requests/httpx, etc. (no provider needed).resolveProvider(call)— best-effort attribution (existing logic + #A/#B/#C).isOutbound && !provider: emit a match withprovider: "unknown",kind: "http" | "sdk", and acapturepayload:{ hostFragment?, sdkRoot?, modelString?, methodChain, file, line }. Do not drop.isOutboundmatches:core-scanner.ts:269, and teachisHighConfidenceEndpointUrlto acceptsdk:///unknown://shapes (coordinate with Endpoint aggregation drops cross-file-resolved SDK calls with sdk:// placeholder URLs (A5 cross-file factory invisible to benchmark) #141 so cross-filesdk://calls also survive aggregation).scanNotification(today a bare unknown count, see CLI remote submit omits per-callprovider, API rejects whole batch → silent local-only fallback #136 / wave 6) → a ranked, deduped list of "providers seen but not fingerprinted" for backfill.Acceptance criteria
provider:"unknown"with a non-emptycapture, not dropped.sdk:///unknown://calls survive endpoint aggregation (coordinated with Endpoint aggregation drops cross-file-resolved SDK calls with sdk:// placeholder URLs (A5 cross-file factory invisible to benchmark) #141).Related: #141, #136.