fix(design): preserve command outcome certainty
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
# Task: Diagnose AI Design message send failure in client
|
||||
|
||||
## Identity
|
||||
|
||||
- Task ID: 20260903-design-message-send-client-8d3f2a71
|
||||
- Mode: Feature
|
||||
- Branch: codex/20260903-design-message-send-client-8d3f2a71-design-message-send-client
|
||||
- Worktree: D:\Datas\OthersProjects\makelore-design-send-failure-8d3f2a71
|
||||
- Base commit: e9875145b41a2cb1827de10d27a4fc6a352704ea
|
||||
- Owner: codex-root
|
||||
- Status: Ready for Integration
|
||||
|
||||
## Scope
|
||||
|
||||
- Diagnose the reported AI Design chat path from the Renderer composer through the
|
||||
Main-owned Works Square V2 command submission, Agent run polling, canonical
|
||||
Workspace refresh, and Renderer pending-operation reconciliation.
|
||||
- Own only the Main-owned Works Square V2 adapter/error boundary, its local Host API
|
||||
error transport, the Renderer Image Workspace API/store/chat presentation, their
|
||||
shared command-outcome type, focused tests, and this task record.
|
||||
- Do not modify the Works Square server while its task registry is inconsistent.
|
||||
Do not touch Plugin Marketplace/My Plugins/Project Plugins pages, plugin
|
||||
navigation, sidebar/router code, database/API DTOs, packaging, deployment,
|
||||
publication, or paid Provider activation.
|
||||
|
||||
## Intent And Constraints
|
||||
|
||||
- Reproduce the exact user-visible failure with a narrow automated seam before
|
||||
changing behavior, and distinguish command receipt from Agent-run success and
|
||||
canonical Workspace commit.
|
||||
- Preserve ADR-007: the Current Specification remains authoritative, mutation
|
||||
transport ambiguity retains the original stable command/operation identity, and
|
||||
no timeout or failure creates an automatic fresh request.
|
||||
- Preserve the local chat draft until success is confirmed. Project terminal Agent
|
||||
failures and transport-unknown results with accurate, youth-readable Chinese copy
|
||||
instead of presenting every rejection as a network send failure.
|
||||
- Treat the supplied trace as evidence only for request dispatch and polling: it has
|
||||
no `reasoner_response` or successful canonical update event. Do not infer a
|
||||
completed write from HTTP access-log `200` lines alone.
|
||||
|
||||
## Concurrent Task Gate
|
||||
|
||||
- Task ID: `20260903-design-message-send-client-8d3f2a71`.
|
||||
- Mode: Feature.
|
||||
- Branch/worktree:
|
||||
`codex/20260903-design-message-send-client-8d3f2a71-design-message-send-client` /
|
||||
`D:\Datas\OthersProjects\makelore-design-send-failure-8d3f2a71`.
|
||||
- Base commit: `e9875145b41a2cb1827de10d27a4fc6a352704ea`.
|
||||
- Ownership result: isolated and claimed by `codex-root`; the canonical root's three
|
||||
existing untracked task records remain untouched.
|
||||
- Peer boundary: `20260903-plugin-navigation-design-7c4e2a91` owns read-only planning
|
||||
for the three Plugin entrances. This task will not touch its pages, navigation,
|
||||
sidebar, or router. The integrated Youth Design task is read-only historical
|
||||
context and no active peer owns the files listed above.
|
||||
- Gate result: Passed.
|
||||
|
||||
## Project Context Loaded
|
||||
|
||||
- Read the startup memory set, active task, project positioning, current state,
|
||||
decision index, system overview, business rules, success criteria, evidence index,
|
||||
ADR-007, module map, data flow, and the relevant Youth Design and live-client hang
|
||||
task scopes.
|
||||
- Confirmed the supported V2 flow is Renderer draft -> stable command -> Main-owned
|
||||
Agent command/run -> canonical Workspace refresh; access-log receipt is not the
|
||||
semantic success boundary.
|
||||
- Planning Gate result: Passed for the bounded client diagnosis and minimal fix above.
|
||||
|
||||
## Outcome
|
||||
|
||||
- The supplied production trace proves that the command reached the V2 reasoner and
|
||||
that the client polled the Agent run, but it contains neither a structured reasoner
|
||||
result nor the run's terminal payload. HTTP `200` polling lines therefore do not
|
||||
prove that the design mutation succeeded.
|
||||
- Reproduced three client defects with failing tests: terminal
|
||||
`design_reasoner_invalid` was projected as HTTP 422, terminal Agent failures were
|
||||
retained as transport-unknown operations, and the chat pane discarded the safe
|
||||
failure and always claimed that the message was not sent.
|
||||
- Added an explicit `commandOutcome` contract from Main through the local route,
|
||||
Host API/AppError, Renderer API error, and store. Main now marks a failed/cancelled
|
||||
Agent run as `definitive_failure`; an accepted command whose polling or canonical
|
||||
refresh fails remains `unknown` with the original stable operation ID.
|
||||
- Definitive failures preserve the local chat draft, remove the settled pending
|
||||
operation and any partial assistant stream, and show fixed youth-readable Chinese
|
||||
copy. Unknown outcomes preserve the draft, pending command identity, and partial
|
||||
stream so retry cannot silently create a second mutation. Polling auth expiry is
|
||||
explicitly covered by that unknown path.
|
||||
- Corrected V2 run error status projection, including
|
||||
`design_reasoner_invalid -> 502`, while keeping canonical 409 refresh behavior.
|
||||
- No server, Plugin Marketplace/My Plugins/Project Plugins, navigation, sidebar, or
|
||||
router file was changed.
|
||||
|
||||
## Verification
|
||||
|
||||
- Red phase: the initial focused suite failed in the three reported seams (safe chat
|
||||
copy, terminal store settlement, and reasoner status/copy). The outcome-transport
|
||||
extension then produced six expected failures across Main, local route, Host API,
|
||||
Renderer API, and store before implementation.
|
||||
- Focused and adjacent suites: 10 files / 85 tests passed after implementation;
|
||||
the final stream-settlement pair passed 20/20.
|
||||
- Full ordinary suite: 221 files and 1,822 tests passed, with 2 declared skips. Its
|
||||
only first-run failure occurred before product code loaded because Windows denied
|
||||
the Electron dependency self-installer permission to replace an in-use
|
||||
`electron.exe`. Re-running that real-process file through its supported
|
||||
`MAKELORE_PI_ELECTRON_EXECUTABLE` override passed 2/2 with the same 2 skips.
|
||||
- The isolated pressure suite passed 1/1 with Main-to-React p95 37.94 ms.
|
||||
- `pnpm exec tsc --noEmit`, scoped ESLint for every changed TypeScript file,
|
||||
`pnpm run build:vite`, and `git diff --check` passed. Vite emitted only existing
|
||||
Browserslist, chunk-size, and dynamic/static import warnings.
|
||||
- Independent final read-only review passed with no P1/P2 findings after two found
|
||||
settlement gaps were fixed: non-enumerated terminal errors and accepted-command
|
||||
polling auth ambiguity, followed by partial-stream cleanup on definitive failure.
|
||||
|
||||
## Follow-ups
|
||||
|
||||
- Query production run `0bb3a074-aee2-43bf-af7d-ca4585b96132` read-only and inspect
|
||||
`status`, `error_code`, retryability, attempts, and timestamps. The attached trace
|
||||
alone cannot distinguish `design_reasoner_invalid`, provider/runtime unavailable,
|
||||
or a still-running run.
|
||||
- If the production run confirms a server-side reasoner failure, remediate it in a
|
||||
separately owned server task after the server task registry inconsistency is
|
||||
repaired; this client task intentionally made no server write.
|
||||
|
||||
## Promotion Candidates
|
||||
|
||||
- None. The explicit outcome transport implements the already accepted ADR-007
|
||||
requirement that ambiguous mutation results retain their stable operation identity.
|
||||
Reference in New Issue
Block a user