diff --git a/.project-docs/30-worklog/tasks/20260904-diagnose-design-stream-6a4e9c21.md b/.project-docs/30-worklog/tasks/20260904-diagnose-design-stream-6a4e9c21.md new file mode 100644 index 0000000..e0e1f28 --- /dev/null +++ b/.project-docs/30-worklog/tasks/20260904-diagnose-design-stream-6a4e9c21.md @@ -0,0 +1,132 @@ +# Task: Diagnose AI Design streaming and generation trigger + +## Identity + +- Task ID: 20260904-diagnose-design-stream-6a4e9c21 +- Mode: Feature +- Branch: codex/20260904-diagnose-design-stream-6a4e9c21-diagnose-design-stream +- Worktree: D:\Datas\OthersProjects\.codex-worktrees\makelore\20260904-diagnose-design-stream-6a4e9c21 +- Base commit: aa3f52a8f8414c9ad939d396bd2828c3e07c70e7 +- Owner: codex-root +- Status: Ready for Integration + +## Scope + +- Diagnose, without changing product behavior, why AI Design assistant replies no + longer appear incrementally and why the screenshot path does not visibly create a + generation Task. +- Trace the current Renderer/store/Main contracts at the public test seams for + `design.assistant.delta`, Quote request/opening, immutable Quote confirmation, and + Workspace Task reconciliation. +- Build focused red-capable regressions that distinguish a presentation regression + from a transport failure and distinguish “no Quote requested” from “Quote confirmed + but no Task recovered”. Remove temporary probes before completion. +- Own only this task record and temporary diagnostic tests. Do not change product + code, the Works Square server, database, billing, packaging, publication, Plugin + navigation, or the three foreign untracked root task records. + +## Intent And Constraints + +- The user reports two observable regressions after the conversation-feedback UI + changes: completed assistant text arrives all at once, and the ready-state action + appears not to trigger generation. +- Preserve ADR-007. Streaming deltas are not canonical conversation turns, but the + diagnosis must determine whether they can be presented as an explicitly unfinished + reply without duplicating the right-side Current Specification summary. +- Generation remains a deliberate two-step boundary: request/check an immutable Quote, + then explicitly confirm its ID. A chat reply saying creation is possible is not + authorization to create a paid Task. +- Do not infer failure from the screenshot alone. Reproduce the actual button callback, + panel-mount, command dispatch, confirmation, and Task projection seams one at a time. +- Preserve stable operation identity and no-replay behavior while diagnosing. + +## Project Context Loaded + +- Concurrent Task Gate and Planning Gate passed in the managed isolated worktree at + exact client `main` base `aa3f52a8f8414c9ad939d396bd2828c3e07c70e7`. +- Loaded the startup memory set, ADR-007, architecture/data flow, business rules, + success criteria, evidence/reflection/commitment indexes, and the three integrated + AI Design conversation-feedback task records. +- Assessed 176 peer task records with no unreadable record. Relevant Canvas peers are + historical Ready-for-Integration sources already reflected in this base; none is a + live semantic conflict. One old undefined Design assessment remains unknown but is + on a stale base and this task is read-only diagnosis. +- Likely seams are `DesignConversationPane`, `YouthCreationCard`, the ImageCanvas + composition, `image-workspace` store, Quote/Task panels, and focused unit/Electron + fixtures. +- Gate result: Passed. + +## Outcome + +- Confirmed a Renderer presentation regression rather than a transport outage. The + server still persists and emits `design.assistant.delta`; Main maps it and the + Renderer store deduplicates and appends it to `assistantStreams`. The current + `DesignConversationPane` no longer subscribes to or renders that state, so only the + later canonical `workspace.turns` assistant message becomes visible. +- Identified the exact history. Commit `c6b0490` replaced the visible unfinished text + with a generic progress banner to keep the reasoner's summary-like draft out of the + conversation. Commit `3bda17a` then removed both the banner and the + `assistantStreams` subscription. The latter change explains why replies now appear + only after completion. +- Confirmed the server event is not provider-native time-to-first-token streaming. + `OpenAIJsonDesignReasoningRunner` waits for one complete JSON-object response; + `DesignAgentRuntimeV2` then takes the validated canonical `assistant_message`, splits + it into six-character chunks, and the Gateway spaces frames by 60 ms. Restoring the + old bubble would restore incremental painting only after reasoning has completed and + risks recreating the summary-as-chat confusion reported by the user. +- Built a temporary red-capable Renderer probe that seeded a pending operation plus + `assistantStreams` text. It failed because no streamed text was rendered, while the + provisional user message remained visible. The probe was removed after diagnosis. +- Found no break in the current source generation command chain. A ready Creation Card + calls `requestQuote`; an offered immutable Quote exposes an explicit Design Point + confirmation; confirmation calls `confirmGeneration(quoteId)`; the Electron flow + projects the resulting Task. Focused unit tests and the real Electron scenario pass. +- The supplied screenshot is factually before Quote confirmation: the card is still in + `ready` and offers “看看制作方案”. A chat sentence saying the design can be generated + is not authorization for a paid Task. Whether that particular installed client + emitted a Quote command after a click remains unverified because no matching Run or + client version was supplied. +- No product, server, database, billing, packaging, publication, or Plugin navigation + code was changed. + +## Verification + +- Temporary red probe: + `pnpm exec vitest run tests/unit/image-canvas-page.test.tsx -t "shows unfinished assistant reply text incrementally"` + -> expected failure: streamed text was absent from the conversation. The temporary + assertion was restored and is not part of this task. +- `pnpm exec vitest run tests/unit/youth-creation-card.test.tsx tests/unit/image-canvas-page.test.tsx -t "plain creation summary|production confirmation"` + -> 2 passed, 15 skipped. +- `pnpm run build:vite` -> passed for Renderer, Main, Preload, and utility processes; + only existing Browserslist, chunk-size, and dynamic-import warnings were reported. +- `node ./node_modules/@playwright/test/cli.js test tests/e2e/image-workspace-v2.spec.ts -g "keeps conversation and youth-friendly direct edits"` + -> 1 passed. The scenario exercised “看看制作方案” -> offered Quote -> explicit + Design Point confirmation -> queued Task projection. + +## Follow-ups + +- Product decision required before implementation: choose between (a) showing the + already-finalized assistant message with a typewriter effect after reasoning, or + (b) introducing a distinct conversational streaming contract that can emit safe + assistant prose before the structured Specification proposal is complete. Option + (b) is the only route to genuine lower time-to-first-visible-text; do not render raw + structured reasoner JSON or revive the former summary-like draft bubble. +- Make the two-step production boundary explicit in the conversation: when the assistant + says the idea is ready, point to or provide an inline “看看制作方案” action; after Quote + creation, keep the existing explicit Design Point confirmation. Do not auto-create a + paid Task from ordinary chat. +- If a user reports that clicking “看看制作方案” itself does nothing, capture that exact + operation's client version, `client_operation_id`, and `design.quote.request` Run. The + current source/Electron fixture does not reproduce such a failure. + +## Promotion Candidates + +- Target canonical documents: `.project-docs/20-architecture/system-overview.md` and + `.project-docs/40-domain/business-rules.md`. Proposal: distinguish provider-native + conversational streaming from post-validation chunk projection, and record that + readiness chat must lead users to Quote review but cannot itself authorize a paid + generation Task. Evidence: this task's red presentation probe, commit history, and + passing end-to-end Quote-confirm-Task flow. Future impact: prevents another UI change + from conflating an internal structured-reasoning draft, a canonical assistant turn, + and a progress indicator. No known semantic conflict; human confirmation is required + because the streaming architecture and conversation CTA behavior are product choices.