/** * Deterministic derivation of the `crossResource` flag on AI findings. * * The AI model is unreliable at setting `crossResource` itself: the relationship * topology it receives is *redacted* (logical IDs hashed for privacy), so it * cannot name a related resource and — even when it plainly reasons across two * resources (e.g. "this queue feeds the consumer, with no DLQ failed messages * are lost") — it almost always leaves the boolean `false`. Observed: zero * `crossResource: true` across Nova Lite, Mistral, Haiku 4.5 and Sonnet 4.6. * * Client-side we hold the *un-redacted* relationship graph, so we can derive the * flag deterministically. The rule, deliberately conservative to avoid badging * isolated findings: * * crossResource = the resource has at least one real structural relationship * (a dependency or a dependent) AND the finding text carries a * cross-resource propagation cue. * * The relationship gate is the primary guard: a finding on a resource that * nothing references and that references nothing is never cross-resource, no * matter its wording. The cue set is narrow — each term implies risk crossing a * resource boundary rather than a property of the resource in isolation. */ import type { ResourceRelationships } from '../extractResourceRelationships/extractResourceRelationships'; /** * Minimal shape we need from a relationship entry. The analyzer's relationship * map values are structurally compatible with {@link ResourceRelationships}. */ type RelationshipLike = Pick; /** * Returns true when a finding should be treated as cross-resource. * * @param issueText The finding's text (issue summary, ideally joined with its * recommendation) to scan for cross-resource cues. * @param relationship The un-redacted relationship entry for the finding's * resource, or undefined when none was computed. */ export declare const deriveCrossResource: (issueText: string, relationship: RelationshipLike | undefined) => boolean; export {};