Repository navigation
Conversation
4f2089a to
6a99569
Compare
Design Review (Opus 5.5, fork) — ✅ PASSDesign-level review of Design-Verdict: PASS Nothing blocks: the change only adds things, reuses the per-row title path, its guards and its budget, and the PR includes screenshots of this revision. Notes
[DESIGN-REVIEWED] 9ed521e Description read[DESCRIPTION-READ] 7fa848958ccf60c6008acb40e9185c475b242aa14f550eee0265562edaffa802 That sha256 names everything this verdict read: the PR description, plus the 1 evidence file(s) the workflow collected from it and handed this review. It covers that evidence because the media strip replaces every attachment URL with the same placeholder, so an edit swapping one attachment for another would leave the description's captured text identical while what this review judged changed. Recompute it with |
First Principles Review (Opus 5.5, fork) — ✅ PASSPremise-level review of First-Principles-Verdict: PASS The feature has a clear, named harm and nothing duplicates it. The only extra is the plan response carrying lists of session keys that the panel only ever counts. Notes
What this change shipsInventory (10 items) — 9 justifiedIntent: let a user retitle every open session from its recent conversation in one step, from the sidebar. ADDITION.
[FIRST-PRINCIPLES-REVIEWED] 9ed521e Description read[DESCRIPTION-READ] 47ac4b20bdb113c56cd69169f57311b02394d14d5b11eca7847920da04a05569 That sha256 names the PR description this verdict read. Recompute it with |
UX Review (Opus 5.5, fork) — ✅ PASS (a BLOCK with no Trigger and no Outcome does not block)UX-level review of UX-Verdict: PASS cannot evaluate: missing the finished summary's "Left as they were: {{n}}" line and the three new error notices. No attached or committed screenshot shows any of them. Evidence gaps
Notes
[UX-REVIEWED] 9ed521e Description read[DESCRIPTION-READ] a2019cf16234c98107f9ebdcd88048bdc619429de66498665b3f91d02c02cf5b That sha256 names everything this verdict read: the PR description, plus the 13 evidence file(s) the workflow collected from it and handed this review. It covers that evidence because the media strip replaces every attachment URL with the same placeholder, so an edit swapping one attachment for another would leave the description's captured text identical while what this review judged changed. Recompute it with |
Opus 5.5 Review (fork) — ✅ no blocking findingsReviewed |
GPT 6.1 Review (fork) — ✅ no blocking findingsReviewed Review detailsNo findings. |
6a99569 to
38d9c7c
Compare
38d9c7c to
ea61613
Compare
ea61613 to
cbaf179
Compare
37c87f4 to
b4ef971
Compare
|
The Fork UX Review run for b4ef971 timed out at 30 minutes (run 39834121828). Could a maintainer rerun it? UX passed on the previous head, and the later push only changes backend code and docs. |
b4ef971 to
fdb13dc
Compare
fdb13dc to
cb263d6
Compare
cb263d6 to
16e5595
Compare
16e5595 to
cb4db9d
Compare
|
The rate-limit row now reads "Retitled in the last 5 minutes, try again shortly: {{n}}", the wording you suggested, in all 12 locales. The first screenshot under "Screenshots / video" shows it in the preview. |
|
When a run finishes with failures, the failure notice now lists each failed session by title. Each title is a link that opens that session, and a session with no title shows as "Untitled session". The status route returns the key and title of each failed session for this. I left out a retry for just the failed ones. A retry within 5 minutes would hit the same per-session limit, so it would skip most of them. The last two screenshots show the list and the session it opens. |
|
A bulk run spends the same per-session The question: keep one shared budget, or give bulk runs their own key? I recommend keeping it shared. It's the cost bound the verb already relies on, and a separate key would let a bulk run and the agent each spend a call on the same session in the same window. If the 429 turns out to bite in practice, a separate key is a small follow-up. |
The same push also fixes three issues the previous GPT round raised on
Each has a regression test that fails without the fix. |
The sidebar header menu gains a Regenerate all titles panel. A dry-run preview counts the sessions it would retitle and the ones it leaves alone, and the run titles up to two sessions at once, counts down as each lands and names every session it could not retitle, each as a link that opens it. A model failure in the bulk path leaves the existing title in place instead of falling back to the opening message. Closes kirodotdev#21976
Problem / Motivation
Goal: Let a user give every open session a fresh title from its recent conversation in one step, from the sidebar.
Today a title can only be regenerated one session at a time, from each row's own menu. Someone with a dozen sessions whose early titles no longer describe them has to open a dozen menus.
Why it matters
Titles are how people find a session in the sidebar. Stale titles from the first message ("hi", "quick question") make a long sidebar hard to scan, and fixing them one by one is tedious enough that most people don't.
Not a goal
What changed (motivation → approach → change)
I added Regenerate all titles… to the sidebar header ⋮ menu, next to Clean up and Switch all sessions. It opens a panel that previews what will happen, then runs in the background.
Backend (
src/kiro_crew/dashboard/chat_title_bulk.py):POST /api/chat/slots/generate-titleswith{include_renamed?, dry_run?}. A dry run returns the plan and spends nothing. A real run spends each queued session's title budget and starts a background task.GET /api/chat/slots/generate-titlesreturns the latest run's counts and the key and title of each session that failed.bulk_titles_in_progress, so a double click can't spend budget twice._model_manual_title(the model call behind the per-row action) andapply_regenerated_title, with the same epoch and replaced-slot checks. The bulk path has no fallback to the opening message, so a model error counts as failed and keeps the title.apply_regenerated_titleis unchanged.Frontend (
website/src/pages/chat-sidebar/bulkTitles.tsx, client inwebsite/src/api/client/chatSlotSettings.ts): preview counts, a checkbox for renamed sessions, a live "Done: 4 of 12" counter and a finished summary. When sessions fail, the notice names each one as a link that opens it. Reopening the panel during a run shows that run.The strings are in all 12 locales under
website/src/i18n/locales/, withen-XAregenerated and the started plural inwebsite/src/i18n/pluralKeys.json.docs/feature-map/README.mdgets a row, anddocs/system-specs/modules/learn-cron-dashboard.mddescribes both routes.Decisions I'd like a maintainer to confirm
GENERATE_TITLEbudget (one call per 5 minutes). A session with no budget left is skipped and counted. At most 2 titles generate at once. That budget is shared with the agentsession_generate_titleverb, so for 5 minutes after a bulk run that verb answers 429 on the same sessions. The per-row Regenerate never spends it. I recommend keeping the shared budget, because it is the cost bound the verb already has.Backwards compatibility
Compatible: two new routes and a new menu item. No existing route, field or default changes.
One effect on existing behavior: for 5 minutes after a bulk run, the agent's
session_generate_titleverb answers 429 on the sessions that run retitled, because both spend the same per-sessionGENERATE_TITLEbudget (decision 1).Removes nothing: the change only adds a route pair, a panel and catalog keys.
Tests
test/test_chat_title_bulk.py:website/src/test/ChatSidebar.bulkTitles.test.tsx:test/test_chat_title.pychecks that the per-row action still falls back to the opening message when the model fails.Determinism: every wait the backend tests release themselves is bounded by
await_until, so a regression fails by name. The backend file passed 5 runs in shuffled orders, and the frontend file passed 5 repeats. One frontend test waits on the real 1-second poll, with a 3-second timeout.Manual verification
I ran an isolated gateway from this branch at b6033113cf on loopback, with a fresh data home, and drove it with
playwright-cli. I sent one message each to three sessions and left a fourth empty. The preview counted 3 to retitle and 1 with no conversation yet. Applying it showed "Done: 0 of 3" while the titles ran, then "Finished. Retitled: 3". The new titles matched the old ones, because the model gave the same answer for the same conversation. The agent turns in that instance stopped with an MCP setup error from the fresh data home. That error is unrelated to this change, and the title calls still ran.Screenshots / video
The new item in the sessions ⋮ menu:
The preview, with three sessions to retitle and one empty session left alone:
The live counter right after applying, then the finished summary:
A second round at fdb13dc, on the same kind of isolated gateway, covers the states the first round's screenshots left out. I gave four sessions one message each and renamed one of them by hand. The preview counted 3 to retitle and offered the renamed one behind the checkbox. Checking it re-counted to 4:
I ran it on the 3 and reopened the panel. All 3 now hit the 5-minute limit and are left alone:
A session that is mid-reply, and a run where some titles fail, are hard to produce on purpose. For these shots I stubbed
/api/chat/slots/generate-titleswith fixed JSON and ran the real bundle from this head with scripted Playwright. These three frames are committed undertemp-screenshots/21976/. The preview, with the rate-limit row's new wording:A finished run where two sessions failed. Each name opens that session:
Clicking "Deploy triage" in the notice opened that session:
Related Issues
Closes #21976
Review notes
Earlier review findings, fixed:
Checklist
Contribution License Agreement
I contribute this under the project's Apache-2.0 license.