From 180c4dacf01dbc1c2b008e4441f65b3ea32902a5 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Sun, 1 Nov 2026 02:31:59 -0800 Subject: [PATCH] =?UTF-8?q?design(d215):=20draw=20the=20run=20trace=20?= =?UTF-8?q?=E2=80=94=20done,=20running=20size-limited,=20not=20available?= =?UTF-8?q?=20at=201440=20and=20390=20(TASK-757)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 Co-authored-by: ux-lead Agent-Model: claude/claude-opus-5-5/high --- .../artboards/d215/cap/measure_after.js | 2 +- .../artboards/d215/cap/measure_after.test.js | 4 +-- docs/design/artboards/d215/index.html | 34 ++++++++++++++++++- docs/design/artboards/d215/targets.json | 24 +++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/docs/design/artboards/d215/cap/measure_after.js b/docs/design/artboards/d215/cap/measure_after.js index c6cff3694..9faaee66a 100644 --- a/docs/design/artboards/d215/cap/measure_after.js +++ b/docs/design/artboards/d215/cap/measure_after.js @@ -18,7 +18,7 @@ const fs = require('fs'); const HERE = __dirname; const TARGETS = path.join(HERE, '..', 'targets.json'); -const SURFACES = ['settings', 'agent-settings', 'agent-memory', 'board', 'connectors', 'chat', 'sidebar', 'byo', 'byo-handoff', 'firstrun-welcome', 'firstrun-waiting', 'firstrun-connected', 'firstrun-error', 'activity-queue', 'activity-empty', 'activity-error', 'profile-person', 'profile-empty', 'profile-error', 'taskrecord-log', 'taskrecord-empty', 'taskrecord-error']; +const SURFACES = ['settings', 'agent-settings', 'agent-memory', 'board', 'connectors', 'chat', 'sidebar', 'byo', 'byo-handoff', 'firstrun-welcome', 'firstrun-waiting', 'firstrun-connected', 'firstrun-error', 'activity-queue', 'activity-empty', 'activity-error', 'profile-person', 'profile-empty', 'profile-error', 'taskrecord-log', 'taskrecord-empty', 'taskrecord-error', 'runtrace-done', 'runtrace-live', 'runtrace-error']; // byo-handoff is drawn but can't be captured on prod: reaching it issues a real key. The first-run // dialog is a latch-gated overlay, and the Scout welcome only exists in a brand-new pod, so neither is measured on prod. const PROD_SURFACES = SURFACES.filter(s => s !== 'byo-handoff' && !s.startsWith('firstrun-')); diff --git a/docs/design/artboards/d215/cap/measure_after.test.js b/docs/design/artboards/d215/cap/measure_after.test.js index 25543a01e..76f2c7205 100644 --- a/docs/design/artboards/d215/cap/measure_after.test.js +++ b/docs/design/artboards/d215/cap/measure_after.test.js @@ -29,7 +29,7 @@ test('--only with an unknown surface throws', () => { test('the committed targets.json passes its own validation', () => { const t = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'targets.json'), 'utf8')); - assert.strictEqual(Object.keys(t).length, 44); + assert.strictEqual(Object.keys(t).length, 50); validateTargets(t); }); @@ -39,7 +39,7 @@ test('an empty or partial measurement is refused', () => { const partial = { ...t }; delete partial['board-390']; assert.throws(() => validateTargets(partial), /missing board-390/); assert.throws(() => validateTargets({ ...t, 'chat-1440': { helperWords: NaN, innerRatio: 2 } }), /invalid chat-1440/); - assert.strictEqual(EXPECTED.length, 44); + assert.strictEqual(EXPECTED.length, 50); }); // A page whose SPA shell answers 200 and then redirects to `landsOn`. Its metrics would score diff --git a/docs/design/artboards/d215/index.html b/docs/design/artboards/d215/index.html index d4ee468d7..61db35cd4 100644 --- a/docs/design/artboards/d215/index.html +++ b/docs/design/artboards/d215/index.html @@ -670,6 +670,12 @@ .app.m .v2-rec dl { grid-template-columns: minmax(0, 1fr); } .app.m .v2-rec dd { margin-bottom: 4px; } .app.m .v2-run-trace__summary .b { height: 44px; } +/* runtrace: turns and tool-call cards. */ +.v2-run-trace__turns { border-radius: 0; background: none; box-shadow: none; overflow: visible; gap: 12px; } +.v2-run-trace__turns > li { display: grid; gap: 6px; padding-top: 4px; } +.v2-run-trace__turns h2 { margin: 0; font: 700 15px/1.2 var(--f-display); color: var(--ink); } +.v2-run-trace__meta { margin: 0; font: 500 11.5px/1.5 var(--f-mono); color: var(--mu); } +.v2-run-trace__turns .v2-run-trace__call { display: grid; gap: 4px; padding: 11px 14px; border-radius: 12px; background: var(--sf); box-shadow: inset 0 0 0 1px var(--d); }

Same look. Less said.

  • One screen firstRepeated blocks become a table; rare settings collapse.
  • @@ -1132,6 +1138,32 @@

    Same look. Less said.

    +
    +

    Run trace

    /v2/pods/:podId/runs/:runId
    helper words done – → 57live – → 61scroll 390 – → 1.0×
    +
    +
    Succeeded · 1440two turns, a grant trail

    Run trace

    Cards have a 30-day default retention. Pod policy and storage limits can change it. This trace persists after the card expires.

    KaiSucceeded · Task assignment
    Recorded turns: 2 · 5,412 tokensrun_8f31c0
    1. Turn 1

      claude-sonnet-5-5 · 2140 ms · 3,106 tokens

      slack.postok · 412 ms
      Call c_77a1
      Grant
      g_41c2
      Credential owner
      Dana Okafor
      Outcome
      ok
      read_fileok · 38 ms

      Built-in tool. No connector credential.

    2. Turn 2

      Asked claude-sonnet-5-5, answered by claude-haiku-5-5 · 1210 ms · 2,306 tokens

      No tool calls.

    +
    Running, size-limited · 1440in progress

    Run trace

    Cards have a 30-day default retention. Pod policy and storage limits can change it. This trace persists after the card expires.

    IvyRunning · Heartbeat
    Recorded turns: 1 · 1,874 tokensrun_2b90de

    This run is still in progress.

    This stored trace was size-limited. 3 turns and 8 tool calls are omitted. Large content fields are also capped.

    1. Turn 1

      claude-haiku-5-5 · 980 ms · 1,874 tokens

      read_fileok · 41 ms

      Built-in tool. No connector credential.

    +
    +
    +
    Not available · 1440trace is gone or no access

    Run trace

    +
      +
    • Summary first, then turns. Who ran, how it ended and what started it, then the counts, the start time and the run id in mono. A turn is a heading, a mono line for model, time and tokens, and its tool calls as small cards.
    • +
    • A tool call says where its credential came from. A brokered call shows grant, credential owner and outcome; a built-in tool says so in one line, and a call with no trail says "Broker trail unavailable."
    • +
    • The retention line leads. Cards expire after 30 days by default; the trace does not. It is the first thing under the title so nobody reads a missing card as a missing trace.
    • +
    • At 390 the back key becomes a 44px row, and the grant fields stack key over value.
    • +

    Each state, one line

    + + + +
    SucceededServed-model line appears only when the answering model differs from the one asked for.
    Running, size-limitedA running or queued run shows "still in progress" with Refresh trace. The size-limit line names what was left out: turns, calls, or large fields only.
    Not availableOne line. A network failure shows "Could not load the run trace" with Try again; a 404 does not.
    +
    +
    +
    Succeeded · 390

    Run trace

    Cards have a 30-day default retention. Pod policy and storage limits can change it. This trace persists after the card expires.

    KaiSucceeded · Task assignment
    Recorded turns: 2 · 5,412 tokensrun_8f31c0
    1. Turn 1

      claude-sonnet-5-5 · 2140 ms · 3,106 tokens

      slack.postok · 412 ms
      Call c_77a1
      Grant
      g_41c2
      Credential owner
      Dana Okafor
      Outcome
      ok
    Pods
    3Needs you
    Team
    Settings
    +
    Running, size-limited · 390

    Run trace

    Cards have a 30-day default retention. Pod policy and storage limits can change it. This trace persists after the card expires.

    IvyRunning · Heartbeat
    Recorded turns: 1 · 1,874 tokensrun_2b90de

    This run is still in progress.

    This stored trace was size-limited. 3 turns and 8 tool calls are omitted. Large content fields are also capped.

    1. Turn 1

      claude-haiku-5-5 · 980 ms · 1,874 tokens

      read_fileok · 41 ms

      Built-in tool. No connector credential.

    Pods
    3Needs you
    Team
    Settings
    +
    Not available · 390

    Run trace

    Pods
    3Needs you
    Team
    Settings
    +
    +
    +

    Dark mode

    one dark value per token
    diff --git a/docs/design/artboards/d215/targets.json b/docs/design/artboards/d215/targets.json index 9ee175a04..46d45d680 100644 --- a/docs/design/artboards/d215/targets.json +++ b/docs/design/artboards/d215/targets.json @@ -174,5 +174,29 @@ "taskrecord-error-390": { "helperWords": 0, "innerRatio": 1 + }, + "runtrace-done-1440": { + "helperWords": 57, + "innerRatio": 1 + }, + "runtrace-live-1440": { + "helperWords": 61, + "innerRatio": 1 + }, + "runtrace-error-1440": { + "helperWords": 0, + "innerRatio": 1 + }, + "runtrace-done-390": { + "helperWords": 40, + "innerRatio": 1 + }, + "runtrace-live-390": { + "helperWords": 61, + "innerRatio": 1 + }, + "runtrace-error-390": { + "helperWords": 0, + "innerRatio": 1 } }