docs(planning): record v1.4.20.1 hotfix wave

New `.planning/phase-v1421-hotfix-report.md` summarises the six
fixes (Daily Briefing regenerate · Coach day-level snapshot · Coach
prompt update · streaming-bubble dedup · drawer header · sources rail
scope picker), the test-count delta (2026 → 2036 unit), the
token-budget impact of the day-level snapshot (~190 → ~3000 tokens
per full-scope turn), and a recommendation to ship as a v1.4.20.1
hotfix.

STATE.md grows a Phase F section + status block tracking the six
commits on develop. Includes prettier polish across the touched
coach surfaces (sources-rail, drawer, message-thread, snapshot,
chat route).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Marc-André BombeckandClaude Opus 4.7 committed 2026-05-10 19:31:20 +02:00
1 parent 08fd411ff1
commit 52dd9ff9c3
9 files changed
+253 -60

No files matched your search

@@ -53,9 +53,8 @@ describe("<SourcesRail>", () => {
it("renders a checkbox per row + a window selector trigger", () => {
const html = render(<SourcesRail />);
const checkboxes = (
html.match(/data-slot="coach-sources-checkbox"/g) ?? []
).length;
const checkboxes = (html.match(/data-slot="coach-sources-checkbox"/g) ?? [])
.length;
expect(checkboxes).toBe(5);
expect(html).toContain('data-slot="coach-sources-window-trigger"');
});
@@ -258,10 +258,7 @@ export function CoachDrawer({
}
sourcesRail={
sourcesRail ?? (
<SourcesRail
scope={scope}
onScopeChange={setScope}
/>
<SourcesRail scope={scope} onScopeChange={setScope} />
)
}
thread={
@@ -67,9 +67,7 @@ export function MessageThread({
messages.some((m) => m.id === streaming.messageId);
const streamingActive =
!streamingPersisted &&
(!!streaming?.inProgress ||
!!streaming?.content ||
!!streaming?.errorCode);
(!!streaming?.inProgress || !!streaming?.content || !!streaming?.errorCode);
// Track scroll position so we don't yank the viewport when the user
// is browsing earlier turns.
@@ -82,7 +82,10 @@ export interface SourcesRailProps {
* the controls still render but stay read-only — keeps the legend
* surface stable for callers that don't yet wire scope through.
*/
onScopeChange?: (next: { sources: CoachScopeSource[]; window: CoachScopeWindow }) => void;
onScopeChange?: (next: {
sources: CoachScopeSource[];
window: CoachScopeWindow;
}) => void;
}
interface SourceRow {