---
title: Polish the generation timeline's tool event display
type: task
status: completed
description: >-
  Third pass on the agent session timeline: left-align the share page behind its measure, retire the
  per-row argument chip border, give each generation tool a display that fits what it is, and rework
  preview_view to show its request with the outcome on the collapsed row.
base_uri: user:task/league/data-views/polish-generation-tool-event-display.md
created_at: '2026-09-09T04:46:30.627Z'
entity_id: e9ebaeea-008d-4f26-b4af-1cc9493f7e44
finished_at: '2026-09-10T03:09:21.602Z'
observations:
  - ████████████████████████████████████████████████
owner_identity_uri: █████████████████████████
priority: Medium
public_read: true
relations:
  - relates [[user:task/league/data-views/refine-generation-timeline-display.md]]
started_at: '2026-09-09T05:20:17.039Z'
tags:
  - user:tag/league-xo-football.md
updated_at: '2026-09-10T03:09:21.602Z'
visibility_analyzed_at: '2026-11-05T23:48:56.964Z'
---

All four items are implemented, committed, and unit-verified (package `yarn verify` 176 passing and league 17 passing, each new behaviour with a negative control shown to fail). The package half is on origin — `8e25ec0`, pushed. The league half (`f8025d746` — the outcome-aware resolver, the left-aligned share stylesheet, and the spec) is committed on `master`, but the branch push is deferred by ████████'s red-main CI gate on `mistakia/league` (a sibling's run is red; it is time-bounded and lifts on its own or clears with `PUSH_TO_RED_MAIN=mistakia/league`). The league pin has not yet moved to the new package. The only remaining work is the live pass against the reference share, which has to run after the pin bump and a dev-server restart.

The timeline component is the public `react-agent-timeline` package, SHA-pinned by league at line 190 of `package.json` (still `0b96920`). A change there is a four-step loop — commit, `PUSH_IMMEDIATELY=react-agent-timeline cli/sync/sync-all.sh`, bump the pin in league's `package.json`, `sandbox-install yarn install` — and the dev server does not watch `node_modules`, so it needs a full restart afterwards. See [[███████████████████████████████-█████████]].

## Plan

### Left-align the share page, keep the measure

- [x] `view-generation-share.styl` drops the centring: `margin 0 0 10px` at `max-width 880px`, `width 100%`. The masthead sits on the page's own left edge, sharing it with the table's first column below.
- [x] Rendered block verified (`margin: 0 0 10px; max-width: 880px; width: 100%`, no stray tokens); the one-look check against the table edge is part of the live pass below.

### Stop bordering every tool event body

- [x] `tool-event.styl` deletes the chip rule (border, radius, ground); the body hangs on the row's own line under the shared mono-small face. `tokens.styl` no longer carries a `--rat-field` ground token.
- [x] `test/event-row-clamp.spec.mjs` now gathers every `.rat-event-body {…}` block across the per-type stylesheets and asserts none sets `border` or `background`; a re-added chip is its control, run and shown to fail.

### Give each tool call a display that fits what it is

- [x] The seam grew from `(entry)` to `(entry, { tool_result, is_collapsed })`, returning `[{label, value, tone?}]`; the package stays vocabulary-free and `resolve_generation_tool_argument` chooses per tool and per surface (expanded reads the request, collapsed reads the outcome).
- [x] A search reads its query and grain; `describe_column` the column and params; `run_sql` the statement; `validate_table_state` reads a verdict (`valid` or the error) from the result; `preview_view` reads the request in the expanded list and the outcome on the collapsed line; `emit` is the run's answer. A value a tool marks failed tints the error tone.

### Rework preview_view, and let the collapsed row carry the outcome

- [x] `table_state_request` renders the request itself — `grain`, `columns`, `filter` (first where clause as `column operator (values)`), and `sort` (`column desc|asc`).
- [x] Collapsed rows and commands that hold nothing identifying read the tool RESULT: the outcome line (`error`, `valid`, `N of M rows`, `no rows matched`). The four temp-file preview/validate calls are answered through the result — the only honest source for those rows.

## Remaining

Nothing. All four items are live on production at `8d261aed8`.

The pin never stopped at `8e25ec0`: a later session added the file-read path renderer and the slow-call marker, so league moved to `33a5060` and then to `2310c80`, and the live pass ran against the deployed share rather than a local dev server.

That pass confirmed the four items and found six further readability defects, all fixed in the same lane:

- The disclosure marker was rendered only for expandable rows, so short entries sat 17px left of the label column.
- An errored call drew its argument in ordinary ink — `.rat-tool-field-value` re-declares `$rat_text` over the row's error tint.
- Tool fields and paths were `inline-flex` inside a body that clamps with an ellipsis, so a long argument sheared instead of truncating.
- The floating jump control sat on the last visible row, over a list reserving no ground for it.
- Twelve byte-identical system rows, each opening onto the same text.
- Three rows rendered 200 characters of `node -e` plumbing, because the resolver gave up on a state read from a temp file rather than naming the file.

One known cost went out with the fix: the jump reserve is unconditional, so a list scrolled to the bottom holds 33px of empty ground. Recorded on [[user:repository/active/react-agent-timeline/ABOUT.md]] for whoever next touches the component.

## Verification

Each new behaviour carries a negative control that was run and shown to fail; the package's `yarn verify` is green at 176 and league's at 17. The one thing unit tests cannot do is the real-run look above — see Remaining.
