# Impact scope, delivery and older services

## Check behavior, not installation date

An updated skill can run against an older service. Inspect available tool schemas and the actual response. Semantics and delivery capabilities are independent:

- `coverage.impact_semantics_version=2` means precise symbol dependencies, separate `structural_context` and `potential_module_consumers`. Symbol dependents still include inferred relationships: preserve their evidence and confidence. For file/module scope, primary records are conservative review candidates (`conservative_candidate_count`), not all confirmed function callers.
- Older results can mix dependency records, container membership and module-import fanout. Treat broad mixed output conservatively; do not claim every returned function calls the changed symbol.
- A returned `delivery.result_id` plus a supported detail tool/route provides immutable detail pages. Large impacts on older deployments can still fail at a transport budget. Smaller operator responses can retain `impact.coverage` without `analysis` or `delivery`; their absence alone does not imply an incomplete traversal.

Read nested impact data from the actual shape: compact resolve/customer responses can use `impact`; named HTTP workflows can use `canonical_data`; direct tools can return canonical fields. `analysis.traversal_complete` or canonical `coverage.traversal_complete` is distinct from `delivery.all_details_included`. A complete traversal is over the modeled index, not proof that every dynamic dependency was extracted. An omitted detail array in a summary is not an empty set.

Newer customer preparation waits within the original request. Do not submit parallel copies of the same impact to accelerate it. A legacy explicit `status:"preparing"` response is unfinished, not an empty impact: retain it, honor its retry interval and allow at most one sequential retry if the task still needs that result. Capacity/deadline failures remain coverage gaps; do not start polling loops or queue scans as recovery.

## Newer detail capabilities

Customer MCP: `truthgraph_impact_details` with original `repositoryId`, `result_id`, `section`, optional cursor and exact file filters. Customer HTTPS fallback:

```sh
python3 scripts/truthgraph.py impact-details --repository ORIGINAL_INDEXED_REPOSITORY_ID --result RESULT_ID --section files --output NEW_PRIVATE_FILE
python3 scripts/truthgraph.py inspect-result --input NEW_PRIVATE_FILE
python3 scripts/truthgraph.py impact-details --repository ORIGINAL_INDEXED_REPOSITORY_ID --result RESULT_ID --section impacted_entities --path src/example.py --output ANOTHER_PRIVATE_FILE
```

Operator MCP: `truthgraph.get_impact_details` uses `result_id`, `section`, optional `cursor`, `repository`, `path`; it has no customer `repositoryId`. Never pass an operator result ID to a customer tool or vice versa.

Sections: `files`, `non_file_entities`, `impacted_entities`, `structural_context`, `potential_module_consumers`, `supporting_edges`, `manifest`. Customer file/entity sections support exact path/repository filters; fetch customer edges and manifest without filters. Operator edge filters can select edges touching a file. Follow `next_cursor` until `complete=true`, keeping result, section and filters fixed. Initial summary continuations appear in `delivery.summary_continuations`.

Fetch only relevant files/categories by default. Customer pages do not consume another monthly graph query, but still share the account request rate limit (currently 60/minute). Pace requests, honor 429/Retry-After, and avoid bursts. Fixed 10 minute TTL, quota eviction and client/service limits mean exhaustive delivery is not guaranteed for every possible snapshot. Preserve completed pages and report details not reviewed if expiry or limits intervene; do not repeatedly rerun a broad query to chase completeness.

Customer publication changes return 409; rerun impact if still needed and never mix generations. Expiry/eviction/restart generally require a new query (customer 410; operator tool error). Every customer page rechecks key/account/entitlement/repository/generation. Keep the initial summary/manifest freshness and source coverage: detail pages need not repeat them.

An oversized individual record returns `record_fragment`. Base64-decode `data` to bytes, append by `offset` for that record, verify `total_bytes` and SHA256, then decode UTF8 and parse JSON. `record_complete=true` marks the last fragment. Preserve order alongside ordinary records; do not parse or send partial fragments to the model. The helper fetches one page and does not automatically reassemble fragments.

Manifest records contain `original_response`, `collection_path` and `collections`. Replace named collections at that path with all records from their sections in page order. Originally absent/null fields remain so. Snapshot SHA covers original serialization; reserialized key order/number formatting can differ. Retain evidence and original metadata when inspecting selected records.

## Oversized results without supported paging

Do not retry the same broad impact or lower count limit: impact ignores that limit. A more precise symbol is appropriate only when it matches the actual change boundary; reducing scope does not establish complete whole-file/feature review.

For an authorized operator client, the supported full HTTP route is `POST /api/v1/workflows/get_change_impact` with a body such as `{"subject":"EXACT_SUBJECT","revision":"main"}`. Its response includes canonical impact data without MCP text/structured duplication. Use an already configured authorized operator origin/authentication, save the result privately and inspect selected records offline. Do not invent an anonymous public URL, bypass operator authentication, use customer keys there, or dump the response into context. HTTP avoids the MCP envelope cap, not computation deadlines or resource constraints. This route is an inspection option only when full review is actually necessary; do not issue a large read merely to test instructions.

Customer `POST /api/agent/workflows/get_change_impact` is the supported account-scoped route, but it is not an unlimited escape hatch: older customer deployments apply their context budget there too. If no detail capability/result ID exists, explain the unreviewed impact and use focused source verification or report that the service needs an upgrade. Do not switch to an operator domain or increase transport caps as recovery.

Raw MCP consumers must check `isError` before JSON parsing, then prefer `structuredContent` or parse text once. Plain-text errors are not empty impact sets or malformed successful graph JSON.
