Skip to content

Commit 29471d5

Browse files
jithin23-kvclaude
andauthored
feat(report): add hover explanations and polish run/hunt report UI (#237)
* feat(report): add hover explanations and polish run/hunt report ui Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(report): correct finding vs thread wording in hunt tooltips * fix: turn rail in run report to match turn rail in hunt report --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
1 parent 317eb27 commit 29471d5

10 files changed

Lines changed: 399 additions & 218 deletions

File tree

‎core/src/autonomous/report/html.ts‎

Lines changed: 218 additions & 92 deletions
Large diffs are not rendered by default.

‎core/src/autonomous/report/types.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ export interface AutonomousReport {
9696
operatorModel: string;
9797
/** Optional — older reports predate these fields. */
9898
scoutModel?: string;
99-
/** Falls back to the commander model when unset. */
99+
/** Unset means the run never used the independent verifier (no --verify flag). When
100+
* verification IS on and no dedicated model was configured, this falls back to the
101+
* commander model, but it is only ever set at all if verification actually ran. */
100102
verifierModel?: string;
101103
/** Whether the run was truncated by a budget/turn ceiling. */
102104
truncated: boolean;

‎core/src/execute/runAll.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,11 @@ async function curateTracesIfConfigured(
317317
/**
318318
* Label for the "Evaluation Suite" report field. Only a `mode: "suite"` selection
319319
* runs a whole named suite verbatim — explicit evaluator lists and preloaded specs
320-
* are, by definition, a hand-picked subset, so they're labeled "Custom Suite"
320+
* are, by definition, a hand-picked subset, so they're labeled "Custom"
321321
* rather than borrowing a suite name that would overstate what actually ran.
322322
*/
323323
function suiteLabel(selection: RunConfig["selection"]): string {
324-
return selection.mode === "suite" ? selection.suite : "Custom Suite";
324+
return selection.mode === "suite" ? selection.suite : "Custom";
325325
}
326326

327327
/** Assemble a {@link UnifiedRunReport} from Node-side run config and evaluator results. */

‎core/src/execute/runAllBrowser.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ function buildBrowserReport(
277277
// The browser path takes preloaded evaluator specs with no suite concept —
278278
// the extension builds its own report/suite label independently of this
279279
// return value (see popup.js's buildFinalReport).
280-
suiteId: "Custom Suite",
280+
suiteId: "Custom",
281281
effort: config.effort,
282282
attackModel,
283283
judgeModel,

‎core/src/execute/types.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ export interface UnifiedRunReport {
263263
targetName: string;
264264
targetKind: "agent" | "mcp";
265265
/**
266-
* The evaluation suite that was run, or "Custom Suite" when the selection
266+
* The evaluation suite that was run, or "Custom" when the selection
267267
* doesn't correspond to one whole named suite (an explicit evaluator list,
268268
* preloaded specs, or a hand-picked subset of a suite's evaluators).
269269
*/

‎core/src/report/render.ts‎

Lines changed: 160 additions & 107 deletions
Large diffs are not rendered by default.

‎docs/hunt.md‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ respond before it's killed.
106106

107107
### Models
108108

109-
| Option | Default |
110-
| ----------------------- | -------- |
111-
| `--model <id>` | `sonnet` |
112-
| `--operator-model <id>` | `sonnet` |
113-
| `--scout-model <id>` | `haiku` |
109+
| Option | Default |
110+
| ------------------------ | -------- |
111+
| `--commander-model <id>` | `sonnet` |
112+
| `--operator-model <id>` | `sonnet` |
113+
| `--scout-model <id>` | `haiku` |
114114

115115
### Limits
116116

@@ -203,7 +203,7 @@ The credential actually in use is printed at startup (`Authenticating via: …`)
203203

204204
### Pinning model snapshots
205205

206-
`--model`, `--operator-model`, and `--scout-model` take the aliases `haiku` / `sonnet` / `opus`. To pin those aliases to specific snapshots — for a gateway that only exposes certain ids, or to freeze behaviour across runs — set:
206+
`--commander-model`, `--operator-model`, and `--scout-model` take the aliases `haiku` / `sonnet` / `opus`. To pin those aliases to specific snapshots — for a gateway that only exposes certain ids, or to freeze behaviour across runs — set:
207207

208208
```bash
209209
ANTHROPIC_DEFAULT_HAIKU_MODEL=claude-haiku-4-5-20251001

‎runners/cli/src/commands/hunt.ts‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ interface HuntCliOptions {
4545
targetModel?: string;
4646
header?: string[];
4747
name?: string;
48-
model: string;
48+
commanderModel: string;
4949
operatorModel: string;
5050
scoutModel: string;
5151
maxOperators: string;
@@ -189,7 +189,7 @@ export function registerHuntCommand(program: Command): void {
189189
(v: string, acc: string[]) => [...acc, v],
190190
[]
191191
)
192-
.option("--model <id>", "Commander model (alias or id)", "sonnet")
192+
.option("--commander-model <id>", "Commander model (alias or id)", "sonnet")
193193
.option("--operator-model <id>", "Operator subagent model", "sonnet")
194194
.option("--scout-model <id>", "Scout subagent model", "haiku")
195195
.option("--max-operators <n>", "Max parallel operator subagents", "6")
@@ -274,7 +274,7 @@ export function registerHuntCommand(program: Command): void {
274274
targetName: opts.name,
275275
objective: opts.objective,
276276
apiKeyEnv: opts.targetKeyEnv,
277-
commanderModel: opts.model,
277+
commanderModel: opts.commanderModel,
278278
operatorModel: opts.operatorModel,
279279
scoutModel: opts.scoutModel,
280280
maxOperators: opts.maxOperators,
@@ -453,7 +453,7 @@ export function registerHuntCommand(program: Command): void {
453453
const huntOptions: HuntOptions = {
454454
target,
455455
objective,
456-
commanderModel: opts.model,
456+
commanderModel: opts.commanderModel,
457457
operatorModel: opts.operatorModel,
458458
scoutModel: opts.scoutModel,
459459
maxOperators: intOr(opts.maxOperators, 6),

‎runners/extension/popup.js‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,12 +1169,12 @@ function judgedCount(summary) {
11691169
* Label for the report's "Evaluation Suite" field. A suite name is only
11701170
* accurate when every one of its evaluators was actually selected — picking
11711171
* a subset (or the catch-all "Custom Evaluators" bucket) is a hand-picked
1172-
* list, not that suite, so it's labeled "Custom Suite" instead of borrowing
1172+
* list, not that suite, so it's labeled "Custom" instead of borrowing
11731173
* a name that would overstate what actually ran.
11741174
*/
11751175
function resolveSuiteLabel() {
11761176
const suite = state.catalog?.suites?.find((s) => s.id === state.suiteId);
1177-
if (!suite) return "Custom Suite";
1177+
if (!suite) return "Custom";
11781178
// Based on what actually completed, not what was selected — a run stopped
11791179
// partway through a full-suite selection is not that suite either.
11801180
const completedIds = new Set(
@@ -1183,7 +1183,7 @@ function resolveSuiteLabel() {
11831183
const fullSuite =
11841184
suite.evaluatorIds.length === completedIds.size &&
11851185
suite.evaluatorIds.every((id) => completedIds.has(id));
1186-
return fullSuite ? suite.id : "Custom Suite";
1186+
return fullSuite ? suite.id : "Custom";
11871187
}
11881188

11891189
function buildReport() {

‎runners/sdk/src/types.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export interface RunResults {
198198
id: string;
199199
timestamp: string;
200200
targetName: string;
201-
/** The evaluation suite that was run, or "Custom Suite" for a hand-picked selection. */
201+
/** The evaluation suite that was run, or "Custom" for a hand-picked selection. */
202202
suiteId: string;
203203
targetKind: "agent" | "mcp";
204204
effort: Effort;

0 commit comments

Comments
 (0)