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

Merged opened this

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

Merged

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 5f71e3e

opened this

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 call placementOf once per thought. It now reads up to 400 ids in a single IN (…) query, so the page reads its placements in one query.
  • Wording: the two new phrases are NOT_PLACED and KEPT_AS_NOTE in src/actions/ask_state_words.ts. The terminal's NOT_PLACED_YET is left alone.
  • One test edited: test/triage.test.ts expected the old wording "said again, first on". It was right for the old behaviour, and the issue asks for repeats with the first words, so it now checks repeats “build a <b>bold</b> gauge for queue depth”. That keeps its escaping check.
  • New test: test/asked-placement.test.ts signs 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

Closes #7509

commented

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 call placementOf once per thought. It now reads up to 400 ids in a single IN (…) query, so the page reads its placements in one query.
  • Wording: the two new phrases are NOT_PLACED and KEPT_AS_NOTE in src/actions/ask_state_words.ts. The terminal's NOT_PLACED_YET is left alone.
  • One test edited: test/triage.test.ts expected the old wording "said again, first on". It was right for the old behaviour, and the issue asks for repeats with the first words, so it now checks repeats “build a <b>bold</b> gauge for queue depth”. That keeps its escaping check.
  • New test: test/asked-placement.test.ts signs 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

Changes requested — before the latest push

Two things to fix in one round.

  1. Both doors: the terminal's asked screen (src/tui/screens/asked.ts:57-60) still says heard/placed, action repo #N and NOT_PLACED_YET. It does not say → repo#N title, kept as a note, not placed yet, or repeats. The page and the terminal now describe the same thought in different words. Give thoughtLine the same wording, sharing one helper with the page, and add a tty test. Fix this first.
  1. Regression: placedLinks no longer shows t.reply. A thought the planner answered with a question (asked: true, no placement) now reads kept as a note, and the person never sees the question. Keep the reply for that case, and say kept as a note only 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.

commented

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: whereItWent and thoughtNotes in src/actions/ask_state_words.ts return plain parts (lead, text, optional href). src/web/studio/asked_page.ts links each href. thoughtLine in src/tui/screens/asked.ts joins the parts as text and uses relTime for the times. The terminal no longer says action repo #N, and it no longer uses NOT_PLACED_YET for thoughts. The constant stays because test/ask-state-words.test.ts still checks it.
  • Questions stay visible: StreamThought now carries the placement's asked flag. When a thought placed on no issue has asked set and a reply, the reply is shown. kept as a note appears 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 --noEmit and the design lint pass. scripts/fast.ts named 1,084 test files for this diff, which is too many to run here. Instead I ran the 22 test files that read thoughtStream, ask_state_words or /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 expose asked yet.
  • The test's proposed pull is an issue row with kind pull, not a pull opened from branches. That is enough for the title lookup and the /pulls link.

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

Approved

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs