Files
makelore/.project-docs/30-worklog/tasks/20260903-diagnose-recurring-stall-a83f5c21.md
T

5.7 KiB

Task: Diagnose recurring Coding session stall

Identity

  • Task ID: 20260903-diagnose-recurring-stall-a83f5c21
  • Mode: Feature
  • Branch: codex/20260903-diagnose-recurring-stall-a83f5c21-diagnose-recurring-stall
  • Worktree: /Users/inmanx/Documents/makelore-diagnose-recurring-stall-a83f5c21
  • Base commit: 301c1496b0
  • Owner: codex
  • Status: Completed

Scope

  • Diagnose the recurring visible 处理中 state in the installed macOS app for project 肉鸽2.0, including the active Pi logical thread that began around 09:51 on 2026-09-03.
  • Verify whether the installed artifact actually contains the previously integrated terminal-settlement and Bash tool-bridge fixes.
  • Correlate the screenshot with the installed Main log, persisted Conversation/Pi session, target process state, and any active tool child before deciding whether this is useful work, a tool wait, a Provider failure, or another settlement gap.

Intent And Constraints

  • Keep diagnosis-time live inspection read-only: do not abort the target run, replay the accepted prompt, or mutate user project/session data. For the user's later explicit launch request, replace the old installed process only by a graceful quit after confirming the target had no remaining runtime/tool child; do not force-kill it.
  • Preserve ADR-006 target-only failure and no-replay semantics.
  • Do not touch the occupied main worktree or its uncommitted packaging changes; perform any source change only in this isolated worktree after evidence identifies a concrete defect.

Outcome

  • Confirmed that this recurrence was not an active model or Bash wait. The target Pi JSONL persisted an assistant terminal entry with stopReason: "aborted" and errorMessage: "Request was aborted" at 09:52:24 local time. Electron Main then completed the same Conversation with the intentional project_deactivated reason at 09:52:33. The remaining Agent Server was idle at 0% CPU with no tool child or network socket while Renderer still showed 处理中.
  • Confirmed the installed app already contains the earlier Bash write-lease and bounded terminal-settlement corrections. This incident instead repeated the foreground recovery gap documented by task 20260902-check-session-after-bash-fix-a6d12f39: Renderer retained a cached live Snapshot after Main had stopped the target, and selecting an already selected Conversation skipped authoritative Snapshot hydration.
  • Changed Conversation selection to always reconcile with Main. Existing live state refreshes silently, while cold and invalidated targets keep their prior loading/recovery behavior. Accepted or uncertain mutations are not replayed.
  • Coding Chat now closes its old event stream on Main's lifecycle:sleep, refreshes the selected Conversation when the window becomes visible or focused, and refreshes a still-selected Conversation once when the programming view is mounted or its project context changes. A project/Conversation selection key prevents duplicate hydration caused by the selection render itself.
  • Added store, Renderer, and Electron regressions that begin with a stale running Snapshot and verify that foreground recovery displays the persisted aborted terminal state without posting a prompt.

Verification

  • Correlated screenshot time, installed Main log, project registry, Conversation metadata, target Pi JSONL, and live PID/process/socket state. The durable turn ended before the visible timer continued; no running tool process remained.
  • Installed app.asar contains state_probe, the bounded terminal-settlement failure string, and PROMPT_FAILED_AFTER_ACCEPTANCE, confirming the prior fix was packaged in the inspected app.
  • Focused Vitest: 45 passed across coding-conversations-store.test.tsx and coding-chat-panel.test.tsx.
  • Full Vitest: 1736 passed, 3 skipped across 213 test files, including the single-worker pressure suite.
  • Focused Electron E2E: foreground focus rehydrates a terminal Snapshot after lifecycle sleep passed.
  • TypeScript tsc --noEmit, scoped ESLint, production build:vite, and git diff --check passed. Full lint:check passed with five pre-existing warnings and zero errors.
  • check_project_docs.py and task-aware check_doc_drift.py passed.
  • The old installed app was gracefully quit after confirming no target Agent Server or tool child remained. pnpm run dev then started the repaired worktree successfully, with the Renderer on port 5173 and Electron using the existing Makelore user-data directory.

Follow-ups

  • Integrate this feature branch after the occupied main packaging worktree is available, then rebuild/reinstall the macOS artifact. The currently installed /Applications/Makelore.app remains the older build; the repaired behavior is available from this task worktree for development verification.

Promotion Candidates

  • Target: README.md, 20-architecture/data-flow.md, and 30-worklog/current-state.md during Integration Mode. Proposal: record the Renderer foreground rehydration contract: lifecycle sleep closes the old Coding event stream, and view mount, project reselection, visibility, or focus reconciles the selected Conversation from a Main-owned Snapshot without replaying accepted mutations. Evidence: focused store/Renderer tests, real IPC Electron E2E, and the two installed-app stale-running incidents documented by this task and 20260902-check-session-after-bash-fix-a6d12f39. Future impact: any new Coding navigation or lifecycle surface must preserve the same terminal-state reconciliation and no-replay behavior. Human confirmation: not required; this promotes implemented behavior without changing ADR-006 ownership or product direction.