From 46262dcd482eed2ddc51f3d81a52324b1a3fd79b Mon Sep 17 00:00:00 2001 From: SentienceDEV Date: Sun, 10 May 2026 20:16:19 -0700 Subject: [PATCH] Skip maxNodes truncation when snapshot elements are Gateway-ranked Gateway already caps output elements (SNAPSHOT_MAX_OUTPUT_LIMIT=100), so agent-side maxNodes truncation is redundant and over-aggressive. When gatewayRanked is true, pruning still applies allow/block role filters and relevance scoring but skips the maxNodes slice. --- src/agents/planner-executor/category-pruner.ts | 12 +++++++----- src/agents/planner-executor/data-driven-pruner.ts | 14 ++++++-------- src/agents/planner-executor/plan-models.ts | 1 + 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/agents/planner-executor/category-pruner.ts b/src/agents/planner-executor/category-pruner.ts index e55c856..7a5d60e 100644 --- a/src/agents/planner-executor/category-pruner.ts +++ b/src/agents/planner-executor/category-pruner.ts @@ -342,13 +342,14 @@ export function pruneSnapshotForTask( // Data-driven path: use profile policy if provided if (options.profilePolicy) { - const { elements, maxNodes } = pruneWithPolicy( + const { elements } = pruneWithPolicy( snapshot, options.profilePolicy, options.goal, relaxationLevel, options.category, - options.learnedFingerprints + options.learnedFingerprints, + snapshot.gatewayRanked ); const actionableElementCount = selectContextElements(elements, elements.length || 1).length; @@ -379,9 +380,10 @@ export function pruneSnapshotForTask( } return policy.allow(element); }); - const elements = filtered - .sort((left, right) => scoreElement(right, options.goal) - scoreElement(left, options.goal)) - .slice(0, policy.maxNodes); + const sorted = filtered.sort( + (left, right) => scoreElement(right, options.goal) - scoreElement(left, options.goal) + ); + const elements = snapshot.gatewayRanked ? sorted : sorted.slice(0, policy.maxNodes); const actionableElementCount = selectContextElements(elements, elements.length || 1).length; return { diff --git a/src/agents/planner-executor/data-driven-pruner.ts b/src/agents/planner-executor/data-driven-pruner.ts index 2f3e341..75c8dca 100644 --- a/src/agents/planner-executor/data-driven-pruner.ts +++ b/src/agents/planner-executor/data-driven-pruner.ts @@ -69,9 +69,9 @@ export function pruneWithPolicy( goal: string, relaxationLevel: number, category: PruningTaskCategory, - fingerprints: LearnedTargetFingerprint[] = [] + fingerprints: LearnedTargetFingerprint[] = [], + gatewayRanked = false ): { elements: SnapshotElement[]; maxNodes: number } { - // Determine max nodes based on relaxation level let maxNodes: number; if (relaxationLevel === 0) { maxNodes = policy.maxElements; @@ -86,19 +86,16 @@ export function pruneWithPolicy( const includePatterns = policy.includeTextPatterns ?? []; const filtered = (snapshot.elements || []).filter(element => { - // Role filter if (allowedRoles.size > 0 && !allowedRoles.has(roleOf(element))) { return false; } const text = textOf(element); - // Exclude patterns if (excludePatterns.some(p => text.includes(p))) { return false; } - // Include patterns (if specified, at least one must match) if (includePatterns.length > 0) { if (!includePatterns.some(p => text.includes(p.toLowerCase()))) { return false; @@ -108,9 +105,10 @@ export function pruneWithPolicy( return true; }); - const elements = filtered - .sort((a, b) => scoreElement(b, goal, fingerprints) - scoreElement(a, goal, fingerprints)) - .slice(0, maxNodes); + const sorted = filtered.sort( + (a, b) => scoreElement(b, goal, fingerprints) - scoreElement(a, goal, fingerprints) + ); + const elements = gatewayRanked ? sorted : sorted.slice(0, maxNodes); return { elements, maxNodes }; } diff --git a/src/agents/planner-executor/plan-models.ts b/src/agents/planner-executor/plan-models.ts index b8832fb..7fbb9ed 100644 --- a/src/agents/planner-executor/plan-models.ts +++ b/src/agents/planner-executor/plan-models.ts @@ -335,6 +335,7 @@ export interface Snapshot { elements: SnapshotElement[]; screenshot?: string; status?: string; + gatewayRanked?: boolean; } // ---------------------------------------------------------------------------