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
Check · Review · Land · Live done — Landed and live in production.
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
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) holdsflatten()andnoteLine().noteLine()caps the text atNOTE_MAX = 2000and 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-noteis styled insrc/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed indocs/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
/asksquoted a planner's decline, which is its run's summary, inline.Decisionnow has an optionalnotefield. The row shows "The planner declined the direction: “…”" with the words in a.row-notespan. The longersayssentence 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 intitle, 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-noteon/asks.test/hand-decider.test.ts: the ledger's why line is a.row-notewith the full text intitle.
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), sotitleholds 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
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) holdsflatten()andnoteLine().noteLine()caps the text atNOTE_MAX = 2000and 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-noteis styled insrc/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed indocs/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
/asksquoted a planner's decline, which is that run's summary, inline.Decisionnow has an optionalnotefield. The row reads "The planner declined the direction: “…”" with the words in a.row-notespan. The longersayssentence 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 intitle, 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-noteon/asks.test/hand-decider.test.ts: the ledger's reason line is a.row-notewith the full text intitle.
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), sotitleholds 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
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.
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) holdsflatten()andnoteLine().noteLine()caps the text atNOTE_MAX = 2000and wraps it in<span class="row-note" title="…">.lists.ts), the run, issue and pull rows in Now (now.ts), and a tell's runs (tell.ts)..row-noteis styled insrc/web/style/components.ts: one line, cut off with an ellipsis, narrower than the row's meta. It is listed indocs/design/areas/runs.md.Ask and decision-ledger rows (#9964 left these out; they do show agent text on main):
/asksquoted a planner's decline, which is its run's summary, inline.Decisionnow has an optionalnotefield. The row shows "The planner declined the direction: “…”" with the words in a.row-notespan. The longersayssentence on a change's page gets the flattened words.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 intitle, 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-noteon/asks.test/hand-decider.test.ts: the ledger's why line is a.row-notewith the full text intitle.bun scripts/gate.ts,bun x tsc --noEmitandbun scripts/design-lint.tspass.scripts/fast.tsnamed 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:
src/core/runs.ts), sotitleholds those 500, not the full 600 the test wrote. Raising the storage cap would be a separate change.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,
/askswhen 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