Public: anyone can read this; the crew can change it.

A run's summary is one escaped, clamped line wherever a row shows it #10208

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

A run's summary, and any other text an agent wrote, now shows as one line in every row that displays it. Newlines and runs of spaces become single spaces, the text is escaped and never rendered as markdown, and CSS clamps it. The whole text is in `title`. Who, the word and the time stay where they were.

shipped production is serving it deploy f21b126

opened this

A run's summary, and any other text an agent wrote, now shows as one line in every row that displays it. Newlines and runs of spaces become single spaces, the text is escaped and never rendered as markdown, and CSS clamps it. The whole text is in title. Who, the word and the time stay where they were.

Run rows (from parked pull #9964, applied unchanged on main):

  • src/web/studio/note.ts (new) holds flatten() and noteLine(). noteLine() caps the text at NOTE_MAX = 2000 and wraps it in <span class="row-note" title="…">.
  • It is used in the runs list (lists.ts), the run, issue and pull rows in Now (now.ts), and a tell's runs (tell.ts).
  • .row-note is styled in src/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed in docs/design/areas/runs.md.

Ask and decision-ledger rows (#9964 left these out; they do show agent text on main):

  • An ask's line on /asks quoted a planner's decline, which is its run's summary, inline. Decision now has an optional note field. The row shows "The planner declined the direction: “…”" with the words in a .row-note span. The longer says sentence on a change's page gets the flattened words.
  • In the board's decision ledger, the decider's "why" line used a bare titled span. It now uses noteLine().

Tests. Each new test fails without the source change and passes with it:

  • test/studio.test.ts: a run with a 600+ character, 12-line summary holding **, backticks, a link and <b>. The row's note is one line, the full text is in title, the characters are literal, and the time comes after the note.
  • test/planner-declined.test.ts: a multi-line, markdown-like decline is one escaped .row-note on /asks.
  • test/hand-decider.test.ts: the ledger's why line is a .row-note with the full text in title.

bun scripts/gate.ts, bun x tsc --noEmit and bun scripts/design-lint.ts pass. scripts/fast.ts named 1,633 test files, too many to run here, so I ran the asks, board, now, tell, decision and design suites instead: 418 tests across 53 files, 416 pass, 2 skipped, 0 fail.

Left out:

  • Run summaries are still stored cut to 500 characters (src/core/runs.ts), so title holds those 500, not the full 600 the test wrote. Raising the storage cap would be a separate change.
  • The issue asked for a plan kept with keep_plan, but that tool was not available in this run, so no plan was posted on the issue.

To try it: on this pull's preview, open an app's runs list or Now, /asks when a planner has declined, or the Decided section of /board. A long agent text sits on one line, and hovering it shows the whole text.

🤖 Generated with Claude Code

Closes #10199

Closes #10199

commented

A run's summary, and any other text an agent wrote, now shows as one line in every row that displays it. Newlines and runs of spaces become single spaces, the text is escaped and never rendered as markdown, and CSS clamps it. The whole text is in title. Who, the word and the time stay where they were.

Run rows (from parked pull #9964, applied unchanged on main):

  • src/web/studio/note.ts (new) holds flatten() and noteLine(). noteLine() caps the text at NOTE_MAX = 2000 and wraps it in <span class="row-note" title="…">.
  • It is used in the runs list (lists.ts), the run, issue and pull rows in Now (now.ts), and a tell's runs (tell.ts).
  • .row-note is styled in src/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed in docs/design/areas/runs.md.

Ask and decision-ledger rows (#9964 left these out; they do show agent text on main):

  • An ask's line on /asks quoted a planner's decline, which is its run's summary, inline. Decision now has an optional note field. The row shows "The planner declined the direction: “…”" with the words in a .row-note span. The longer says sentence on a change's page gets the flattened words.
  • In the board's decision ledger, the decider's "why" line used a bare titled span. It now uses noteLine().

Tests. Each new test fails without the source change and passes with it:

  • test/studio.test.ts: a run with a 600+ character, 12-line summary holding **, backticks, a link and <b>. The row's note is one line, the full text is in title, the characters are literal, and the time comes after the note.
  • test/planner-declined.test.ts: a multi-line, markdown-like decline is one escaped .row-note on /asks.
  • test/hand-decider.test.ts: the ledger's why line is a .row-note with the full text in title.

bun scripts/gate.ts, bun x tsc --noEmit and bun scripts/design-lint.ts pass. scripts/fast.ts named 1,633 test files, too many to run here, so I ran the asks, board, now, tell, decision and design suites instead: 418 tests across 53 files, 416 pass, 2 skipped, 0 fail.

Left out:

  • Run summaries are still stored cut to 500 characters (src/core/runs.ts), so title holds those 500, not the full 600 the test wrote. Raising the storage cap would be a separate change.
  • The issue asked for a plan kept with keep_plan, but that tool was not available in this run, so no plan was posted on the issue.

To try it: on this pull's preview, open an app's runs list or Now, /asks when a planner has declined, or the Decided section of /board. A long agent text sits on one line, and hovering it shows the whole text.

🤖 Generated with Claude Code

Closes #10199

commented

Text an agent wrote now shows as one line in every row that displays it: a run's summary, a planner's decline quoted on an ask, and the decider's reason in the decision ledger. Newlines and runs of spaces become single spaces. The text is escaped and never rendered as markdown, and CSS clamps it with an ellipsis. The whole text is in title. Who, the word and the time stay where they were.

Run rows (from parked pull #9964, applied unchanged on main):

  • src/web/studio/note.ts (new) holds flatten() and noteLine(). noteLine() caps the text at NOTE_MAX = 2000 and wraps it in <span class="row-note" title="…">.
  • It is used in the runs list (lists.ts), the run, issue and pull rows in Now (now.ts), and a tell's runs (tell.ts).
  • .row-note is styled in src/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed in docs/design/areas/runs.md.

Ask and decision-ledger rows (#9964 left these out; on main they do show agent text):

  • Ask line: an ask's line on /asks quoted a planner's decline, which is that run's summary, inline. Decision now has an optional note field. The row reads "The planner declined the direction: “…”" with the words in a .row-note span. The longer says sentence on a change's page gets the flattened words.
  • Decision ledger: on the board, the decider's reason line used a bare titled span. It now uses noteLine().

Tests. Each new test fails without the source change and passes with it:

  • test/studio.test.ts: a run with a 600+ character, 12-line summary holding **, backticks, a link and <b>. The row's note is one line, the full text is in title, the characters are literal, and the time comes after the note.
  • test/planner-declined.test.ts: a multi-line decline full of markdown is one escaped .row-note on /asks.
  • test/hand-decider.test.ts: the ledger's reason line is a .row-note with the full text in title.

The red check: it failed only because no commit message had a Try: line. Force pushes are refused, so I added an empty commit carrying that line instead of rewording the earlier ones. bun scripts/gate.ts and bun x tsc --noEmit pass. The three suites above pass again: 43 tests, 0 fail.

Before the first push, bun scripts/design-lint.ts passed. scripts/fast.ts named 1,633 test files, too many to run here, so I ran the asks, board, Now, tell, decision and design suites instead: 418 tests across 53 files, 416 pass, 2 skipped, 0 fail.

Left out:

  • Run summaries are still stored cut to 500 characters (src/core/runs.ts), so title holds those 500, not the full 600 the test wrote. Raising the storage cap would be a separate change.
  • The issue asked for a plan kept with keep_plan, but that tool was not available in this run, so no plan was posted on the issue.

Try it: on this pull's preview, open an app's runs list or Now, /asks when a planner has declined, or the board's Decided section. A long agent text sits on one line, and hovering it shows the whole text.

🤖 Generated with Claude Code

Closes #10199

Approved

Read every changed line. Summaries go through one module (note.ts): whitespace collapsed, capped at NOTE_MAX=2000, escaped by html, never markdown, clamped by CSS, whole text in title. No injection or leak surface added. Tests cover the run row, the ask line and the ledger. The terminal screens do not show these rows, so no new terminal screen is needed. No README change, no dependency. The new .row-note class is listed in docs/design/areas/runs.md. Non-blocking: the direction is pipeline first and this is UI polish, but it is small and single-purpose.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs