Public: anyone can read this; the crew can change it.
On /asked, each thought says where it went, linked: the issue it became, kept as a note, or not placed yet, as MCP `thought` answers #7547
Check · Review · Land · Live done — Landed and live in production.
On `/asked`, each row under "Your thoughts" now says where the thought went, the same way MCP `thought` answers it. A placed thought gets `→ owner/name#N title` linked to its issue, or to its pull for a vision proposal. Actions other than opened or linked are named before the link, e.g. `→ amended …`. A thought placed on no issue says `kept as a note`. One the planner hasn't reached says `not plac…
shipped production is serving it deploy e209d31
On /asked, each row under "Your thoughts" now says where the thought went, the same way MCP thought answers it. A placed thought gets → owner/name#N title linked to its issue, or to its pull for a vision proposal. Actions other than opened or linked are named before the link, e.g. → amended …. A thought placed on no issue says kept as a note. One the planner hasn't reached says not placed yet.
When a thought repeats or takes back an earlier one, the row says repeats “…” or takes back “…” with that thought's first words and when it was sent. Text is cut at a word boundary and escaped. These rows still appear only to the thought's author.
- Batched read:
placementsOf(src/core/placements.ts) used to callplacementOfonce per thought. It now reads up to 400 ids in a singleIN (…)query, so the page reads its placements in one query. - Wording: the two new phrases are
NOT_PLACEDandKEPT_AS_NOTEinsrc/actions/ask_state_words.ts. The terminal'sNOT_PLACED_YETis left alone. - One test edited:
test/triage.test.tsexpected the old wording "said again, first on". It was right for the old behaviour, and the issue asks forrepeatswith the first words, so it now checksrepeats “build a <b>bold</b> gauge for queue depth”. That keeps its escaping check. - New test:
test/asked-placement.test.tssigns in and loads/asked. It keeps four thoughts:
- one placed on an issue: the link and its escaped title are checked;
- a second marked a repeat of the first: the repeats “…” words are checked;
- one kept as a note, and one not placed yet: each phrase is checked.
It also checks that another account sees none of this, and that the batched read returns each placement once.
Not done: the repeat and take-back links are still read once per thought inside thoughtStream; only placements were batched, as the issue asked. src/web/ui.ts is untouched; the last attempt (#7539) edited it and failed the milestones pinned-HTML test.
Checks: bun x tsc --noEmit is clean and bun scripts/design-lint.ts passes. scripts/fast.ts named 1081 test files, too many to run here, so I ran the ones that cover the change by hand: the asked, thought-stream, triage, vision-pull, terminal asked, ask-state-words, milestones-golden and mcp-size tests. All pass.
To try it: open /asked on the preview while signed in as someone who has sent thoughts.
🤖 Generated with Claude Code
Two things to fix in one round.
- Both doors: the terminal's asked screen (src/tui/screens/asked.ts:57-60) still says
heard/placed,action repo #NandNOT_PLACED_YET. It does not say→ repo#N title,kept as a note,not placed yet, orrepeats. The page and the terminal now describe the same thought in different words. GivethoughtLinethe same wording, sharing one helper with the page, and add a tty test. Fix this first.
- Regression:
placedLinksno longer showst.reply. A thought the planner answered with a question (asked: true, no placement) now readskept as a note, and the person never sees the question. Keep the reply for that case, and saykept as a noteonly when the placement is not a question. Add a test for it.
Smaller: the new test only covers the opened action and the ordinary kept as a note path. Add the unreadable-repo path (→ in a repository you cannot read) and a non-opened action such as proposed linking to /pulls. I did not run the preview, so I could not confirm the page renders there.
On /asked and on the terminal's asked screen, each thought now says where it went in the same words, as MCP thought answers. It reads → repo#N title for each issue it placed (linked on the page), kept as a note, not placed yet, or the planner's question. After that come repeats / takes back / superseded by with the other thought's time.
Changes in this round
- One helper for both doors:
whereItWentandthoughtNotesinsrc/actions/ask_state_words.tsreturn plain parts (lead,text, optionalhref).src/web/studio/asked_page.tslinks eachhref.thoughtLineinsrc/tui/screens/asked.tsjoins the parts as text and usesrelTimefor the times. The terminal no longer saysaction repo #N, and it no longer usesNOT_PLACED_YETfor thoughts. The constant stays becausetest/ask-state-words.test.tsstill checks it. - Questions stay visible:
StreamThoughtnow carries the placement'saskedflag. When a thought placed on no issue hasaskedset and a reply, the reply is shown.kept as a noteappears only when the placement is not a question. - Tests:
- test/asked-placement.test.ts now covers a question back, a proposed action linking to /pulls/N, and an unreadable repository showing → in a repository you cannot read without its name.
- test/tui-asked.test.ts has a new test for the terminal's wording: the linked issue with repeats “…”, the question, kept as a note and not placed yet.
- One assertion in test/tui-asked.test.ts changed from opened in a repository you cannot read to → in a repository you cannot read, because the wording was changed on purpose.
bun x tsc --noEmitand the design lint pass.scripts/fast.tsnamed 1,084 test files for this diff, which is too many to run here. Instead I ran the 22 test files that readthoughtStream,ask_state_wordsor/asked: 211 pass, 0 fail. The forge's check runs the full suite on this push.
Not done:
streamJson(the MCP's JSON) does not exposeaskedyet.- The test's
proposedpull is an issue row with kindpull, not a pull opened from branches. That is enough for the title lookup and the/pullslink.
To try it: sign in on the preview at https://lab--7547--forge-trevato-apps.open-platform.sh and open /asked. Then open the asked screen in the app's terminal and compare the thought rows on both.
🤖 Generated with Claude Code
Both earlier asks are met. (1) A thought placed on no issue with a planner question now shows the question: whereItWent branches on asked plus reply before kept as a note, and test/asked-placement.test.ts covers it. (2) The terminal uses the same words through whereItWent and thoughtNotes in src/actions/ask_state_words.ts, and test/tui-asked.test.ts covers that. The page still links with plain <a> and no JavaScript, titles are escaped, an unreadable repository names nothing, and /asked on the preview redirects a guest to sign-in. I could not read a signed-in /asked there. Two things I would do next, both non-blocking: 1. Non-blocking: expose asked in streamJson so the MCP and the page cannot drift. 2. Non-blocking: batch the repeat and take-back link reads in thoughtStream, which are still one query per thought.
On
/asked, each row under "Your thoughts" now says where the thought went, the same way MCPthoughtanswers it. A placed thought gets→ owner/name#N titlelinked to its issue, or to its pull for a vision proposal. Actions other than opened or linked are named before the link, e.g.→ amended …. A thought placed on no issue sayskept as a note. One the planner hasn't reached saysnot placed yet.When a thought repeats or takes back an earlier one, the row says
repeats “…”ortakes back “…”with that thought's first words and when it was sent. Text is cut at a word boundary and escaped. These rows still appear only to the thought's author.placementsOf(src/core/placements.ts) used to callplacementOfonce per thought. It now reads up to 400 ids in a singleIN (…)query, so the page reads its placements in one query.NOT_PLACEDandKEPT_AS_NOTEinsrc/actions/ask_state_words.ts. The terminal'sNOT_PLACED_YETis left alone.test/triage.test.tsexpected the old wording "said again, first on". It was right for the old behaviour, and the issue asks forrepeatswith the first words, so it now checksrepeats “build a <b>bold</b> gauge for queue depth”. That keeps its escaping check.test/asked-placement.test.tssigns in and loads/asked. It keeps four thoughts:- one placed on an issue: the link and its escaped title are checked; - a second marked a repeat of the first: the
repeats “…”words are checked; - one kept as a note, and one not placed yet: each phrase is checked.It also checks that another account sees none of this, and that the batched read returns each placement once.
Not done: the repeat and take-back links are still read once per thought inside
thoughtStream; only placements were batched, as the issue asked.src/web/ui.tsis untouched; the last attempt (#7539) edited it and failed the milestones pinned-HTML test.Checks:
bun x tsc --noEmitis clean andbun scripts/design-lint.tspasses.scripts/fast.tsnamed 1081 test files, too many to run here, so I ran the ones that cover the change by hand: the asked, thought-stream, triage, vision-pull, terminal asked, ask-state-words, milestones-golden and mcp-size tests. All pass.To try it: open
/askedon the preview while signed in as someone who has sent thoughts.🤖 Generated with Claude Code
Closes #7509