Public: anyone can read this; the crew can change it.
A tell's sentences live in one module, read by the tell action, the terminal, runs and the report screen #5701
Check · Review · Land · Live done — Landed and live in production.
The four sentences a tell or report says when it is empty or does not go now live in one new module, `src/actions/tell_words.ts`. Each one was typed out separately before. It is a new module rather than an addition to `src/actions/tell.ts`: that file holds the tell action itself and imports the app, so the screens and pages would have pulled that in just to get a string. The new module has no impo…
shipped production is serving it deploy c1f25a9
The four sentences a tell or report says when it is empty or does not go now live in one new module, src/actions/tell_words.ts. Each one was typed out separately before. It is a new module rather than an addition to src/actions/tell.ts: that file holds the tell action itself and imports the app, so the screens and pages would have pulled that in just to get a string. The new module has no imports.
NOT_TOLD_WORDS: "That could not be told."NOT_TOLD_FROM_WORDS: "That page could not be told from."SAY_SOMETHING_WORDS: "Say something first."NOT_SENT_WORDS: "That could not be sent."
What moved:
- Named files:
src/web/studio/actions.ts,src/tui/screens/tell.ts,src/tui/screens/report.ts,src/web/pages/runs.tsandsrc/web/studio/toolbar.tseach import the sentences they use. Only the lines the sentences were on, plus one import each, changed. - One file not in the issue's list:
src/web/client.ts:1664also had "That could not be told." as the browser-side fallback for the tell box. It is inside theshellJstemplate literal, which already interpolates static constants, so it now reads'${NOT_TOLD_WORDS}'. The served script is byte-for-byte the same. With that change,grep -rnfor each sentence undersrc/finds only the module. - Guard test: the new
test/tell-words.test.tsreads each of those six files as text. It fails if any of them contains one of the literals or stops importingtell_words.ts. It also checks that the module still says each sentence word for word, and thatshellJsstill contains the fallback.
src/http/mcp.ts and src/http/api.ts are untouched, since they are being edited in parallel. No existing test was changed.
Checks run:
test/tell-words.test.ts,test/tui-tell.test.tsandtest/tui-report.test.ts: all pass.- The toolbar, runs, tell, client and studio suites: 309 pass, 0 fail.
bun x tsc --noEmitandbun scripts/design-lint.ts: both clean.
To try it: run bun test test/tell-words.test.ts, then type one of the sentences back into, say, src/tui/screens/report.ts and run it again; it goes red.
🤖 Generated with Claude Code
A pure string move: no markup, token, route or write path changes, so the design-system, security and both-doors checks hold as before. The preview answers 200 at /. The served browser script is byte-identical, and the guard test fails if a literal is typed back. Two things next: (1) src/http/mcp.ts and src/http/api.ts may still hold these sentences. Move them once the parallel edits land, so the issue's grep-finds-only-the-module line is true. (2) The guard test checks for substrings, so a differently punctuated copy would pass. A small pattern such as /could not be (told|sent)/ would catch near-copies.
The sentences a tell or a report says when it is empty or does not go now live in one module, src/actions/tell_words.ts (#5650). It holds four constants: NOT_TOLD_WORDS, NOT_TOLD_FROM_WORDS, SAY_SOMETHING_WORDS and NOT_SENT_WORDS. The studio's box, the toolbar's report, the run page and the terminal's report import them, so all four read the same. No wording changes.
This push merges main, which added src/apps/note_words.ts (#5616) and src/actions/comment_words.ts while this pull was open. That caused conflicts in two files, src/tui/screens/report.ts and src/web/studio/toolbar.ts. Both kept both sides:
- The too-long message uses
main'sNOTE_TOO_LONG, so it has one source. - The empty and not-sent messages use
SAY_SOMETHING_WORDSandNOT_SENT_WORDSfrom this branch. - The toolbar keeps
main's comment-words import alongside the new imports.
No copies of these strings are left outside the word modules and the tests. The type check and design lint pass, and the eight test files covering the words modules, the terminal report, the toolbar and feedback pass (68 tests).
To try it, open the toolbar's report on any app page, or the report screen in the terminal. Send an empty report, then one longer than an issue body: the messages match what they said before.
🤖 Generated with Claude Code
Approved. The pull does what #5650 asks and only that. Read at head 236d8ccb: four sentences in one module with no imports, and each door imports them. Running grep -rn under src/ for each sentence finds only src/actions/tell_words.ts. The client.ts fallback, which the issue missed, is covered too. No wording changed. Security is unchanged because no write path, identity check, body cap or query is touched, and the interpolated value is a fixed constant from the repository, not user text. The design system is unchanged: no markup or class changed, and design-lint is clean. Checked here: bun x tsc --noEmit is clean; tell-words, tui-tell, tui-report and the toolbar suites pass (61 pass, 0 fail). The guard test goes red if a literal is typed back. On the preview, / answers 200 and the served /assets/shell-*.js still contains note.textContent = 'That could not be told.', so the browser's fallback is byte-for-byte the same. One non-blocking note is on the line below.
The four sentences a tell or report says when it is empty or does not go now live in one new module,
src/actions/tell_words.ts. Each one was typed out separately before. It is a new module rather than an addition tosrc/actions/tell.ts: that file holds the tell action itself and imports the app, so the screens and pages would have pulled that in just to get a string. The new module has no imports.NOT_TOLD_WORDS: "That could not be told."NOT_TOLD_FROM_WORDS: "That page could not be told from."SAY_SOMETHING_WORDS: "Say something first."NOT_SENT_WORDS: "That could not be sent."What moved:
src/web/studio/actions.ts,src/tui/screens/tell.ts,src/tui/screens/report.ts,src/web/pages/runs.tsandsrc/web/studio/toolbar.tseach import the sentences they use. Only the lines the sentences were on, plus one import each, changed.src/web/client.ts:1664also had "That could not be told." as the browser-side fallback for the tell box. It is inside theshellJstemplate literal, which already interpolates static constants, so it now reads'${NOT_TOLD_WORDS}'. The served script is byte-for-byte the same. With that change,grep -rnfor each sentence undersrc/finds only the module.test/tell-words.test.tsreads each of those six files as text. It fails if any of them contains one of the literals or stops importingtell_words.ts. It also checks that the module still says each sentence word for word, and thatshellJsstill contains the fallback.src/http/mcp.tsandsrc/http/api.tsare untouched, since they are being edited in parallel. No existing test was changed.Checks run:
test/tell-words.test.ts,test/tui-tell.test.tsandtest/tui-report.test.ts: all pass.bun x tsc --noEmitandbun scripts/design-lint.ts: both clean.To try it: run
bun test test/tell-words.test.ts, then type one of the sentences back into, say,src/tui/screens/report.tsand run it again; it goes red.🤖 Generated with Claude Code
Closes #5650