8.1 KiB
8.1 KiB
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:
aa3f52a8f8 - 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
mainbaseaa3f52a8f8414c9ad939d396bd2828c3e07c70e7. - 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-workspacestore, 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 toassistantStreams. The currentDesignConversationPaneno longer subscribes to or renders that state, so only the later canonicalworkspace.turnsassistant message becomes visible. - Identified the exact history. Commit
c6b0490replaced the visible unfinished text with a generic progress banner to keep the reasoner's summary-like draft out of the conversation. Commit3bda17athen removed both the banner and theassistantStreamssubscription. The latter change explains why replies now appear only after completion. - Confirmed the server event is not provider-native time-to-first-token streaming.
OpenAIJsonDesignReasoningRunnerwaits for one complete JSON-object response;DesignAgentRuntimeV2then takes the validated canonicalassistant_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
assistantStreamstext. 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 callsconfirmGeneration(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
readyand 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, anddesign.quote.requestRun. The current source/Electron fixture does not reproduce such a failure.
Promotion Candidates
- Target canonical documents:
.project-docs/20-architecture/system-overview.mdand.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.