Skip to content

Commit 2541aab

Browse files
committed
Delete unreachable thrash salvage matcher, hint, and class
CL-6936/PR #558 removed the re-read thrash stop, so no report can ever carry a 'progressive thrash' Summary. Remove the now-dead isThrashSubAgentReport/appendThrashParentHint/THRASH_PARENT_HINT in stop-policy.ts, the classifyBriefSalvage thrash branch in brief-dispatch.ts, and the 'thrash' entries in HARD_BLOCK_SALVAGES and BriefSalvageKind. Other salvage kinds are untouched.
1 parent 6ea4085 commit 2541aab

4 files changed

Lines changed: 15 additions & 36 deletions

File tree

src/subagent/brief-dispatch.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@ import {
2020
isNoProgressSubAgentReport,
2121
isNoShipSubAgentReport,
2222
isRepetitionSubAgentReport,
23-
isThrashSubAgentReport,
2423
isTurnBudgetSubAgentReport,
2524
} from "./stop-policy.js";
2625

2726
/** Salvage classes that must not be re-dispatched with an identical brief. */
2827
export type HardBlockSalvage =
29-
"thrash" | "no-ship" | "no-progress" | "repetition" | "never-acted" | "never-edited";
28+
"no-ship" | "no-progress" | "repetition" | "never-acted" | "never-edited";
3029

3130
export type BriefSalvageKind =
3231
HardBlockSalvage | "turn-budget" | "deadline" | "stalled" | "cancelled" | "incomplete-report";
@@ -54,7 +53,6 @@ export interface BriefDispatchRecord {
5453
export const TURN_BUDGET_STOP_AFTER_DISPATCHES = 3;
5554

5655
const HARD_BLOCK_SALVAGES = new Set<BriefSalvageKind>([
57-
"thrash",
5856
"no-ship",
5957
"no-progress",
6058
"repetition",
@@ -90,7 +88,6 @@ export function isIncompleteReportSubAgentReport(report: string): boolean {
9088
*/
9189
export function classifyBriefSalvage(report: string): BriefSalvageKind | null {
9290
// Order: more specific salvage phrases first.
93-
if (isThrashSubAgentReport(report)) return "thrash";
9491
if (isNoShipSubAgentReport(report)) return "no-ship";
9592
if (isRepetitionSubAgentReport(report)) return "repetition";
9693
if (isNeverEditedSubAgentReport(report)) return "never-edited";

src/subagent/index.test.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2146,19 +2146,19 @@ describe("brief re-dispatch ledger (CL-4343 / CL-5203)", () => {
21462146
expect(changed).not.toBe(a);
21472147
});
21482148

2149-
test("hard-blocks identical brief after thrash salvage; allows changed brief", () => {
2149+
test("hard-blocks identical brief after no-progress salvage; allows changed brief", () => {
21502150
const ledger = createBriefDispatchLedger();
2151-
const fp = fingerprintTaskBrief({ prompt: "fix thrash", intent: "implement" });
2151+
const fp = fingerprintTaskBrief({ prompt: "fix no-progress job", intent: "implement" });
21522152
expect(ledger.admit(fp).ok).toBe(true);
2153-
ledger.recordOutcome(fp, "thrash");
2153+
ledger.recordOutcome(fp, "no-progress");
21542154
const blocked = ledger.admit(fp);
21552155
expect(blocked.ok).toBe(false);
21562156
if (blocked.ok) throw new Error("expected block");
21572157
expect(blocked.message).toContain("refused re-dispatch");
2158-
expect(blocked.message).toContain("thrash");
2158+
expect(blocked.message).toContain("no-progress");
21592159

21602160
const other = fingerprintTaskBrief({
2161-
prompt: "fix thrash with narrower scope",
2161+
prompt: "fix no-progress job with narrower scope",
21622162
intent: "implement",
21632163
successCriteria: ["one file only"],
21642164
});
@@ -2183,7 +2183,7 @@ describe("brief re-dispatch ledger (CL-4343 / CL-5203)", () => {
21832183
expect(second.dispatchCount).toBe(2);
21842184
});
21852185

2186-
test("successful complete resets retry budget; thrash hard-block is sticky", () => {
2186+
test("successful complete resets retry budget; hard-block is sticky", () => {
21872187
const ledger = createBriefDispatchLedger();
21882188
const fp = fingerprintTaskBrief({ prompt: "ok job" });
21892189
expect(ledger.admit(fp).ok).toBe(true);
@@ -2196,12 +2196,12 @@ describe("brief re-dispatch ledger (CL-4343 / CL-5203)", () => {
21962196
if (!afterSuccess.ok) throw new Error("expected admit");
21972197
expect(afterSuccess.dispatchCount).toBe(1);
21982198

2199-
// Thrash is sticky for the session — success on a concurrent twin must not clear it.
2200-
const thrashFp = fingerprintTaskBrief({ prompt: "thrash sticky" });
2201-
ledger.admit(thrashFp);
2202-
ledger.recordOutcome(thrashFp, "thrash");
2203-
ledger.recordOutcome(thrashFp, null);
2204-
expect(ledger.admit(thrashFp).ok).toBe(false);
2199+
// Hard-block salvage is sticky for the session — success on a concurrent twin must not clear it.
2200+
const stickyFp = fingerprintTaskBrief({ prompt: "no-progress sticky" });
2201+
ledger.admit(stickyFp);
2202+
ledger.recordOutcome(stickyFp, "no-progress");
2203+
ledger.recordOutcome(stickyFp, null);
2204+
expect(ledger.admit(stickyFp).ok).toBe(false);
22052205
});
22062206

22072207
test("release undoes admit when run never produces a body", () => {

src/subagent/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ export {
5252
appendNoProgressParentHint,
5353
appendRepetitionParentHint,
5454
appendSubAgentParentHints,
55-
appendThrashParentHint,
5655
appendTurnBudgetParentHint,
5756
evaluateSubAgentStop,
5857
fingerprintToolCalls,
@@ -62,7 +61,6 @@ export {
6261
isNeverEditedSubAgentReport,
6362
isNoProgressSubAgentReport,
6463
isRepetitionSubAgentReport,
65-
isThrashSubAgentReport,
6664
isTurnBudgetSubAgentReport,
6765
nextToolCallStreak,
6866
partialTextFromEvent,

src/subagent/stop-policy.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -530,12 +530,6 @@ export function isDeadlineSubAgentReport(report: string): boolean {
530530
return parsed.summary.includes("deadline reached");
531531
}
532532

533-
/** True when the worker returned a progressive-thrash salvage report. */
534-
export function isThrashSubAgentReport(report: string): boolean {
535-
const parsed = parseSubAgentReport(report);
536-
return parsed.summary.includes("progressive thrash");
537-
}
538-
539533
/** True when the worker returned a streamed-repetition salvage report. */
540534
export function isRepetitionSubAgentReport(report: string): boolean {
541535
const parsed = parseSubAgentReport(report);
@@ -558,9 +552,6 @@ const NEVER_EDITED_PARENT_HINT =
558552
const DEADLINE_PARENT_HINT =
559553
"[Sub-agent hit an explicit wall-clock deadline before finishing. Continue from Findings rather than redoing completed work; re-dispatch with continuation context and a longer deadline only if more wall-clock time is warranted.]";
560554

561-
const THRASH_PARENT_HINT =
562-
"[Sub-agent stopped for progressive thrash (re-read pressure). Do not re-dispatch the identical brief (it will be refused) — change scope, success_criteria, and do_not; continue from Findings.]";
563-
564555
const NO_SHIP_PARENT_HINT =
565556
"[Sub-agent stopped after searching many files without writing any. Do not search the repo yourself and do not re-dispatch the identical brief (it will be refused) — change success_criteria and do_not, or treat findings as unexecuted.]";
566557

@@ -611,11 +602,6 @@ export function appendDeadlineParentHint(report: string): string {
611602
return `${DEADLINE_PARENT_HINT}\n\n${report}`;
612603
}
613604

614-
export function appendThrashParentHint(report: string): string {
615-
if (!isThrashSubAgentReport(report)) return report;
616-
return `${THRASH_PARENT_HINT}\n\n${report}`;
617-
}
618-
619605
/** True when the worker returned a no-ship (search-tour) salvage report. */
620606
export function isNoShipSubAgentReport(report: string): boolean {
621607
const parsed = parseSubAgentReport(report);
@@ -643,7 +629,7 @@ export function appendNoProgressParentHint(report: string): string {
643629
return `${NO_PROGRESS_PARENT_HINT}\n\n${report}`;
644630
}
645631

646-
/** Stack parent-visible salvage hints for thrash / budget / never-acted / deadline / repetition / no-progress. */
632+
/** Stack parent-visible salvage hints for budget / never-acted / deadline / repetition / no-progress. */
647633
export function appendSubAgentParentHints(
648634
report: string,
649635
options: SubAgentParentHintOptions = {},
@@ -652,9 +638,7 @@ export function appendSubAgentParentHints(
652638
appendNeverEditedParentHint(
653639
appendNeverActedParentHint(
654640
appendTurnBudgetParentHint(
655-
appendNoProgressParentHint(
656-
appendNoShipParentHint(appendThrashParentHint(appendRepetitionParentHint(report))),
657-
),
641+
appendNoProgressParentHint(appendNoShipParentHint(appendRepetitionParentHint(report))),
658642
options,
659643
),
660644
),

0 commit comments

Comments
 (0)