Skip to content

fix: resume Dashboard sessions with missing CWD - #514

Merged
m-aebrer merged 8 commits into
aebrer:masterfrom
Anjiro81:feature/issue-512-resume-missing-session-cwd
Sep 16, 2026
Merged

m-aebrer merged 8 commits into
aebrer:masterfrom
Anjiro81:feature/issue-512-resume-missing-session-cwd

Conversation

@Anjiro81

Copy link
Copy Markdown
Contributor

Closes #512

Allow Dashboard users to resume a persisted session whose recorded historical working directory no longer exists, while keeping that provenance separate from the validated directory used by the live runtime.

Implementation plan posted as a comment below.

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Implementation Plan

Problem analysis

Dashboard disk-session inventory currently drops every session whose recorded JSONL-header cwd no longer exists. For sessions that do reach the client, Fleet and closed-session recovery reuse that historical value as the live runtime CWD. The runtime-create endpoint only checks existsSync, so it neither rejects regular files nor canonicalizes the directory before handing it to child_process.spawn.

The implementation must keep two meanings explicit:

  • Historical session CWD — immutable provenance read from the persisted session header.
  • Effective runtime CWD — a canonical existing directory selected for the new RPC process and all runtime-sensitive project behavior.

This plan deliberately chooses the issue's explicit fallback option rather than adding a new persistent setting or silently falling back to the Dashboard launch directory/home. Project instructions, tools, settings, extensions, skills, memories, and git state depend on this choice, so the user should choose when the historical directory is unavailable. A separate configuration feature is not required by the issue's “explicit or configurable” acceptance criterion.

Deliverables

  1. Expose resumable sessions without losing historical metadata

    • Stop filtering missing-CWD sessions out of /api/fleet, /api/sessions, and resync inventory.
    • Extend the Dashboard session projection with server-computed CWD availability and, when valid, its canonical runtime candidate. Keep cwd as the unchanged historical header value.
    • Apply the same projection to runtime-local session listings so every browser-facing SessionInfoDto has consistent semantics.
    • Keep invalid historical paths out of memory project-root discovery, recent-project choices, and “new session” shortcuts; displaying a historical session must not make its missing path an operational root.
  2. Centralize strict runtime-directory validation

    • Reuse/refactor the Dashboard file API's canonical existing-directory validation for POST /api/runtimes.
    • Require a non-empty absolute path that resolves to a readable existing directory; reject missing paths, regular files, malformed paths, and failed realpath/stat checks before pool creation.
    • Pass the canonical path to RuntimePool and return it as RuntimeInfoDto.cwd, making the effective path authoritative and visible.
    • Return stable, actionable client errors for invalid runtime directories so resume UI can stay open and preserve the user's input.
  3. Add an explicit fallback resume flow

    • Preserve one-click resume when the historical CWD resolves to a valid directory, using the server-projected canonical candidate.
    • For an unavailable historical CWD, open a dedicated resume modal that:
      • identifies the session and shows the unavailable historical path as provenance;
      • accepts an explicit runtime project directory;
      • offers only valid canonical live/recent project shortcuts;
      • disables submission for blank input, prevents duplicate submissions, and displays server validation/startup errors without closing.
    • Reuse the same modal/path-selection behavior for closed-runtime recovery when its captured effective CWD is no longer valid, rather than leaving the read-only session with an unrecoverable error.
    • Keep in-runtime switch_session as a session switch inside the already-running effective CWD; it must not imply that loading another transcript changes the process directory.
  4. Make historical-versus-effective CWD visible after resume

    • Continue showing RuntimeInfoDto.cwd as the live runtime's effective project path on Fleet cards and session chrome.
    • Match the active sessionFile to disk inventory and show a clear original/historical path note when it differs from the effective canonical runtime path, including after refresh/resync and after an in-runtime session switch.
    • Preserve that distinction in closed-session banners/state so the recovery UI does not relabel the fallback as the session's original location.
    • Mark unavailable historical project groups clearly and prevent their + new action from trying to create a runtime in a missing directory.
  5. Align runtime-sensitive RPC behavior without rewriting session provenance

    • Expose the AgentSession runtime CWD through a read-only API.
    • Use the effective runtime CWD for RPC operations that inspect or resolve the live project: git branch/repository/tab-title metadata, project agent discovery, and relative /dream backup resolution.
    • Keep persisted-session metadata operations on SessionManager so the original JSONL header, inventory cwd, and existing conversation provenance are not rewritten merely because a fallback was selected.
    • Keep session-store/listing behavior explicit and documented: switching transcripts does not switch the process CWD.
  6. Update user and protocol documentation

    • Document missing-CWD inventory, the explicit directory chooser, strict canonical validation, and the historical/effective path distinction.
    • Clarify that resumed work uses the chosen runtime directory for project context while the original session header remains historical metadata.
    • Update all public dashboard descriptions required by repository policy, plus RPC wording for commands changed to use effective runtime CWD.

Acceptance criteria

  • A JSONL session with a missing recorded CWD appears in Fleet and remains in disk inventory after refresh/resync.
  • Selecting that session opens an explicit runtime-directory chooser; choosing a valid directory starts the RPC runtime and opens the original session file.
  • A session whose recorded CWD is valid still resumes directly in its canonical resolved directory.
  • Empty, relative, missing, unreadable, and non-directory runtime paths are rejected before RuntimePool.create; symlinked directories resolve consistently to their canonical path.
  • The original session header's cwd value is unchanged after fallback resume. Ordinary append-only session activity remains possible.
  • The live runtime and session UI show the effective runtime CWD, and show the historical CWD separately when the two differ.
  • Missing historical paths are not offered as recent project choices, used for memory scopes, or used by + new actions.
  • Closed-session recovery can choose another runtime directory if its captured path is invalid.
  • Runtime-sensitive RPC git, agent-discovery, tab-title, and relative-path behavior uses the effective runtime CWD; loading/switching a transcript does not silently change it.
  • Existing valid-CWD create/resume, Files “new session here,” normal new-session creation, session switching, and deterministic Fleet ordering continue to work.
  • Relevant focused tests, the complete workspace test suite, build, lint/type checks, and workspace-link verification pass.

Files to create or modify

Dashboard server and protocol

  • packages/dashboard/src/shared/protocol.ts
    • Add explicit browser-facing session CWD availability/canonical-candidate fields and any typed runtime-create validation error contract.
  • packages/dashboard/src/server/files.ts
    • Extract or expose reusable canonical existing-directory validation without weakening host filesystem rules.
  • packages/dashboard/src/server/server.ts
    • Project all disk sessions instead of filtering missing ones; separate display inventory from valid operational CWD inventory; project runtime-local session results consistently; validate/canonicalize runtime creation.
  • packages/dashboard/src/server/runtime-pool.ts (only if needed for assertions/comments)
    • Preserve the invariant that RuntimeHandle.cwd is the already-validated effective canonical directory.

Dashboard client

  • packages/dashboard/src/client/api.ts
    • Carry the refined runtime-create/session DTO contract and preserve structured validation failures.
  • packages/dashboard/src/client/screens/fleet.tsx
    • Route missing-CWD resume through the chooser, keep valid resume direct, exclude invalid recent roots, label unavailable groups, and prevent invalid + new behavior.
  • packages/dashboard/src/client/components/resume-session-modal.tsx (new, or an equivalently focused shared component)
    • Implement the reusable historical/effective CWD resume chooser using existing Modal, form, and recent-project patterns.
  • packages/dashboard/src/client/state/reducer.ts
    • Retain any additional historical/effective resume metadata needed by closed views.
  • packages/dashboard/src/client/state/store.ts
    • Support a caller-selected CWD for closed-session recreation while preserving single-flight/error and route cleanup behavior.
  • packages/dashboard/src/client/screens/session.tsx
    • Show differing historical/effective paths and expose recoverable closed-session directory selection.
  • packages/dashboard/src/client/screens/subagent.tsx
    • Mirror the parent closed-session recovery behavior without enabling child steering.
  • packages/dashboard/src/client/styles/app.css
    • Style unavailable-path labels, path comparison copy, and the chooser responsively using existing tokens.

Coding-agent runtime boundary

  • packages/coding-agent/src/core/agent-session.ts
    • Add a read-only effective runtime-CWD accessor.
  • packages/coding-agent/src/modes/rpc/rpc-mode.ts
    • Route live-project RPC consumers to that accessor while retaining historical session metadata where appropriate.

Tests

  • packages/dashboard/test/server.test.ts
    • Replace missing-CWD exclusion assertions with annotated inclusion; cover strict validation/canonicalization and operational-root filtering.
  • packages/dashboard/test/files.test.ts
    • Cover the reusable directory validator's absolute/missing/file/symlink/error cases.
  • packages/dashboard/test/client/screens.test.tsx
    • Cover direct valid resume, missing-CWD chooser, path/error retention, historical/effective display, invalid group actions, and closed-session UI.
  • packages/dashboard/test/client/store.test.ts
    • Cover selected-CWD closed resume, failure/single-flight behavior, and preserved historical metadata.
  • packages/dashboard/test/client/fleet-layout.browser.test.ts and/or packages/dashboard/test/client/session-mobile-layout.browser.test.ts
    • Verify new labels/modal/banner controls remain usable at supported mobile widths.
  • packages/coding-agent/test/rpc-dashboard-commands.test.ts and focused session tests as needed
    • Exercise differing historical and runtime CWDs and verify runtime-sensitive commands use the latter while the header retains the former.

Documentation

  • README.md
  • packages/dashboard/README.md
  • packages/coding-agent/docs/dashboard.md
  • packages/coding-agent/docs/rpc.md

Testing approach

  1. Server integration tests

    • Build temporary valid, missing, regular-file, and symlink CWD fixtures.
    • Assert fleet/sessions/resync all expose the same historical metadata and availability state.
    • Assert memory/project-root inventory receives only valid canonical directories.
    • Assert runtime creation rejects every invalid category before the fake pool/client is called and forwards the canonical directory plus unchanged session path on success.
  2. Client component tests

    • Mount Fleet with valid and unavailable sessions.
    • Verify valid resume remains one-click; unavailable resume opens the modal with historical provenance and submits the chosen directory.
    • Verify recent choices contain only usable roots, duplicate clicks are blocked, validation errors remain visible, and successful resume navigates/hydrates normally.
    • Render active and closed views where runtime and historical paths differ and assert both labels are present and unambiguous.
  3. State tests

    • Resume a closed snapshot with an override directory and verify exact API arguments, single-flight behavior, error recovery, inventory refresh, and navigation.
    • Ensure runtime removal/resync retains enough metadata for the chooser and releases it under existing route-family rules.
  4. Coding-agent tests

    • Construct or launch a session whose header CWD differs from the runtime CWD.
    • Assert runtime git/agent/path consumers use the effective directory.
    • Parse the source JSONL before and after fallback startup and assert its historical header CWD is preserved.
  5. Regression and repository validation

    • Run focused Dashboard and coding-agent Vitest files during development.
    • Run formatter/linter on every changed file.
    • Run npm run build before any real-binary/manual Dashboard check.
    • Run npm run verify-workspace-links and the complete npm test suite; per repository policy, fix any failure rather than classifying it as pre-existing.
    • Manually verify desktop and narrow-mobile resume flows with a copied session whose header points to a removed directory.

Risks and resolved scope decisions

  • Wrong-project context: no automatic launch-CWD/home fallback will be introduced; unavailable sessions require an explicit choice.
  • History mutation wording: the invariant is that fallback selection never rewrites the original header/CWD. Normal resumed use remains append-only, and existing format migration behavior is unchanged.
  • Symlink identity: server canonicalization defines runtime identity; historical text remains untouched for provenance.
  • Inventory side effects: missing sessions are displayable but never become memory/files/settings project roots until a valid runtime directory is selected.
  • Resume surfaces: fleet and closed-runtime recreation are in scope. In-runtime switching stays in the existing process and must clearly retain its current effective CWD.
  • Configuration: a persistent dashboard.resumeWorkingDirectory setting is intentionally out of scope because explicit fallback satisfies the agreed criterion and avoids a silent security-sensitive default. It can be proposed separately if automatic policy is desired later.
  • RPC scope: only consumers that describe or resolve the live project move to effective runtime CWD; persisted header/provenance APIs remain historical.

Plan created by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Progress Update

Implemented and pushed the missing-historical-CWD resume flow:

  • missing-CWD sessions remain visible with server-validated availability metadata
  • runtime directories are strictly validated and canonicalized before child creation
  • Fleet and closed-session recovery provide an explicit replacement-directory chooser
  • live views distinguish effective runtime CWD from historical session provenance
  • runtime-sensitive RPC project operations use the effective runtime directory
  • server, client, store, filesystem, RPC, and real-browser layout coverage added
  • root, Dashboard, and RPC documentation updated

Validation completed successfully:

  • npm run check
  • npm run build
  • npm test
  • npm run verify-workspace-links
  • isolated Chromium end-to-end smoke test with a missing historical CWD
  • user manual verification of the local Dashboard flow
  • commit hook: 6,105 passed, 0 failed, 728 skipped

Commit: 93b4be6


Progress tracked by mach6

@Anjiro81
Anjiro81 marked this pull request as ready for review September 12, 2026 05:53
@Anjiro81

Copy link
Copy Markdown
Contributor Author

Unverified Review Candidates — Pending Assessment

Review round: 1
Reviewed commit: 93b4be6

These are unverified candidates. Severity reflects reviewer confidence; do not treat any item as a merge blocker until the assessment comment is posted.

Critical

None.

Important

Finding 1 — Fleet fallback resume can create duplicate runtimes

Confidence: 98/100 · Files: packages/dashboard/src/client/screens/fleet.tsx, packages/dashboard/src/client/components/resume-session-modal.tsx

resumeIn() treats the secondary refreshDiskSessions() as part of resume success after createRuntime() and upsertRuntime() have already succeeded. If inventory refresh fails, the chooser remains open and reports failure; retrying can start another RPC child against the same JSONL file. While creation is pending, Escape/backdrop can also dismiss the modal despite its disabled cancel button, allowing a new chooser/request because Fleet has no session-keyed single-flight state.

Finding 2 — New sessions created after fallback inherit the missing historical CWD

Confidence: 95/100 · File: packages/coding-agent/src/core/agent-session.ts

Fallback resume intentionally leaves SessionManager.cwd as historical provenance while AgentSession.cwd is effective runtime context. AgentSession.newSession() still calls sessionManager.newSession() without supplying/updating the effective CWD, so /new inside the fallback runtime writes a brand-new header containing the missing old path. The new session is then grouped as unavailable and requires another fallback despite actually running in the replacement directory.

Finding 3 — Direct resume can use a stale cached symlink target

Confidence: 86/100 · File: packages/dashboard/src/client/screens/fleet.tsx

Fleet submits inventory-time resolvedCwd. If historical /work/current pointed to project A during inventory and is repointed to project B before resume while A remains present, the server revalidates A and silently starts in the old project. Runtime validation proves the cached target exists but does not re-resolve the historical path at creation time.

Finding 4 — Directory validation does not establish usable read/search permissions

Confidence: 98/100 · File: packages/dashboard/src/server/files.ts

resolveExistingDirectory() performs realpath, stat, and isDirectory() only. A directory can pass those checks while lacking permissions needed for resource discovery and normal tool use; it may reach RuntimePool.create() and fail at spawn or start with project resources silently absent. The approved plan explicitly required unreadable paths to be rejected before pool creation.

Suggestions

Finding 5 — Canonically equivalent paths hide raw historical provenance

Confidence: 90/100 · Files: packages/dashboard/src/client/screens/fleet.tsx, packages/dashboard/src/client/screens/session.tsx

Display logic compares resolvedCwd with runtime CWD. If the historical header stores a symlink path and runtime validation canonicalizes it, the raw values differ but the historical note is suppressed. This conflicts with the documented promise to retain the immutable historical path whenever it differs from effective runtime identity.

Finding 6 — Fallback modal does not identify the selected session

Confidence: 100/100 · File: packages/dashboard/src/client/components/resume-session-modal.tsx

The approved plan says the chooser identifies the session. It receives and displays only CWD values, so several sessions sharing one unavailable historical directory are indistinguishable once the modal opens.

Finding 7 — Required coding-agent README update is absent

Confidence: 100/100 · File: packages/coding-agent/README.md

Repository policy requires public feature changes to update the root README, coding-agent README, and relevant docs. The PR updates the root README, Dashboard README, Dashboard docs, and RPC docs, but leaves the coding-agent README Dashboard overview unchanged.

Finding 8 — Planned high-value regression coverage has gaps

Confidence: 98/100 · Files: Dashboard client/server tests and coding-agent RPC tests

The suite is substantial, but several planned paths are not exercised end-to-end:

  • manual path typing when no recent-project shortcut exists;
  • clicking/submitting the closed-session chooser from both parent and subagent screens;
  • duplicate-submit/dismissal behavior while resume is pending;
  • the real session-open boundary preserving the original header (the server test uses a no-op fake client);
  • differing historical/runtime CWD for relative Dream resolution and tab-title metadata;
  • unreadable-directory rejection and symlink-form provenance visibility.

These gaps matter where they correspond to findings 1, 2, 4, and 5; missing tests alone are not yet assessed as blockers.

Finding 9 — Share the duplicated shortenPath helper

Confidence: 98/100 · Files: resume-session-modal.tsx, fleet.tsx, session.tsx

The exact path-formatting helper now exists in three modules. Exporting one shared helper would keep display policy centralized without behavior change.

Finding 10 — Extract the duplicated closed-session modal adapter

Confidence: 94/100 · Files: session.tsx, subagent.tsx

The same state-to-ResumeSessionModal block is duplicated across parent and subagent screens. A focused shared adapter could preserve the current invariants while reducing divergence risk.

Finding 11 — Use Solid's narrowed Show values

Confidence: 97/100 · Files: fleet.tsx, session.tsx

Historical-CWD accessors are recomputed several times within one Show block and require non-null assertions. Using the narrowed callback value would remove assertions and repeated inventory lookup without changing rendering.

Strengths

  • The PR cleanly introduces explicit historical-versus-effective CWD concepts across protocol, server, UI, state, RPC, tests, and documentation.
  • Missing-CWD sessions remain discoverable while invalid paths are excluded from memory/project-root and recent-project inventories.
  • Runtime creation rejects empty, relative, missing, and non-directory paths and canonicalizes valid/symlinked directories.
  • Fleet handles stale availability errors by opening the chooser; closed recovery supports override directories and has store-level single-flight protection.
  • RPC git and project-agent tests deliberately use differing runtime/historical CWDs.
  • Focused suites, full build/check/test, real-browser layout coverage, an isolated Chromium smoke test, and user manual verification all passed before review.

Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier


Reviewed by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Unverified Review Candidates — Pending Assessment

Review round: 1
Reviewed commit: 93b4be6

These are unverified candidates. Severity reflects reviewer confidence; do not treat any item as a merge blocker until the assessment comment is posted.

Critical

None.

Important

Finding 1 — Fleet fallback resume can create duplicate runtimes

Confidence: 98/100 · Files: packages/dashboard/src/client/screens/fleet.tsx, packages/dashboard/src/client/components/resume-session-modal.tsx

resumeIn() treats the secondary refreshDiskSessions() as part of resume success after createRuntime() and upsertRuntime() have already succeeded. If inventory refresh fails, the chooser remains open and reports failure; retrying can start another RPC child against the same JSONL file. While creation is pending, Escape/backdrop can also dismiss the modal despite its disabled cancel button, allowing a new chooser/request because Fleet has no session-keyed single-flight state.

Finding 2 — New sessions created after fallback inherit the missing historical CWD

Confidence: 95/100 · File: packages/coding-agent/src/core/agent-session.ts

Fallback resume intentionally leaves SessionManager.cwd as historical provenance while AgentSession.cwd is effective runtime context. AgentSession.newSession() still calls sessionManager.newSession() without supplying/updating the effective CWD, so /new inside the fallback runtime writes a brand-new header containing the missing old path. The new session is then grouped as unavailable and requires another fallback despite actually running in the replacement directory.

Finding 3 — Direct resume can use a stale cached symlink target

Confidence: 86/100 · File: packages/dashboard/src/client/screens/fleet.tsx

Fleet submits inventory-time resolvedCwd. If historical /work/current pointed to project A during inventory and is repointed to project B before resume while A remains present, the server revalidates A and silently starts in the old project. Runtime validation proves the cached target exists but does not re-resolve the historical path at creation time.

Finding 4 — Directory validation does not establish usable read/search permissions

Confidence: 98/100 · File: packages/dashboard/src/server/files.ts

resolveExistingDirectory() performs realpath, stat, and isDirectory() only. A directory can pass those checks while lacking permissions needed for resource discovery and normal tool use; it may reach RuntimePool.create() and fail at spawn or start with project resources silently absent. The approved plan explicitly required unreadable paths to be rejected before pool creation.

Suggestions

Finding 5 — Canonically equivalent paths hide raw historical provenance

Confidence: 90/100 · Files: packages/dashboard/src/client/screens/fleet.tsx, packages/dashboard/src/client/screens/session.tsx

Display logic compares resolvedCwd with runtime CWD. If the historical header stores a symlink path and runtime validation canonicalizes it, the raw values differ but the historical note is suppressed. This conflicts with the documented promise to retain the immutable historical path whenever it differs from effective runtime identity.

Finding 6 — Fallback modal does not identify the selected session

Confidence: 100/100 · File: packages/dashboard/src/client/components/resume-session-modal.tsx

The approved plan says the chooser identifies the session. It receives and displays only CWD values, so several sessions sharing one unavailable historical directory are indistinguishable once the modal opens.

Finding 7 — Required coding-agent README update is absent

Confidence: 100/100 · File: packages/coding-agent/README.md

Repository policy requires public feature changes to update the root README, coding-agent README, and relevant docs. The PR updates the root README, Dashboard README, Dashboard docs, and RPC docs, but leaves the coding-agent README Dashboard overview unchanged.

Finding 8 — Planned high-value regression coverage has gaps

Confidence: 98/100 · Files: Dashboard client/server tests and coding-agent RPC tests

The suite is substantial, but several planned paths are not exercised end-to-end:

  • manual path typing when no recent-project shortcut exists;
  • clicking/submitting the closed-session chooser from both parent and subagent screens;
  • duplicate-submit/dismissal behavior while resume is pending;
  • the real session-open boundary preserving the original header (the server test uses a no-op fake client);
  • differing historical/runtime CWD for relative Dream resolution and tab-title metadata;
  • unreadable-directory rejection and symlink-form provenance visibility.

These gaps matter where they correspond to findings 1, 2, 4, and 5; missing tests alone are not yet assessed as blockers.

Finding 9 — Share the duplicated shortenPath helper

Confidence: 98/100 · Files: resume-session-modal.tsx, fleet.tsx, session.tsx

The exact path-formatting helper now exists in three modules. Exporting one shared helper would keep display policy centralized without behavior change.

Finding 10 — Extract the duplicated closed-session modal adapter

Confidence: 94/100 · Files: session.tsx, subagent.tsx

The closed-session ResumeSessionModal adapter is duplicated across both screens. A small shared adapter would reduce future divergence while retaining the same store single-flight/error behavior.

Finding 11 — Use Solid's narrowed Show values

Confidence: 97/100 · Files: fleet.tsx, session.tsx

Historical-CWD accessors are recomputed and non-null asserted inside Show. Using the narrowed callback value would remove repeated lookups and assertions without changing rendering.

Strengths

  • Historical provenance and effective runtime CWD are explicit across protocol, server, state, UI, RPC, and documentation.
  • Missing-CWD sessions remain discoverable while invalid paths stay out of operational root inventories.
  • Canonical runtime validation now rejects empty, relative, missing, malformed, and non-directory paths.
  • Closed-session recovery has store-level single-flight and treats inventory refresh as secondary.
  • Focused, full-suite, real-browser, isolated end-to-end, and user manual validation all passed.

Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier


Reviewed by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Review Assessment

Unverified review candidates

Classifications

Finding Classification Reasoning
Finding 1 — duplicate Fleet fallback runtimes merge blocker Factual: runtime creation/upsert succeeds before an awaited inventory refresh can reject, and modal Escape/backdrop dismissal remains active during the request; the pool has no session-path dedupe. Scope: the approved plan requires duplicate prevention and preserving normal resume integrity. Practical: a routine inventory/network failure or pending dismissal permits a second RPC child on the same JSONL, risking concurrent appends and wasted resources. Modal-local busy protects only the still-mounted instance.
Finding 2 — /new inherits missing historical CWD merge blocker Factual: resumed SessionManager.cwd comes from the header; AgentSession.newSession() calls SessionManager.newSession() without effective AgentSession.cwd, and the new header writes manager CWD. Scope: normal new-session creation must keep working and new provenance must describe its actual runtime. Practical: every new session created after fallback is persisted as unavailable and requires another chooser after close, while recording false provenance. The original resumed header can remain untouched while new headers use effective CWD.
Finding 3 — cached symlink target can become stale merge blocker Factual: inventory caches canonical resolvedCwd; direct resume submits that target rather than re-resolving historical path at creation. Scope: this PR changes prior raw-path behavior and wrong-project context is an explicit risk. Practical: a credible release/current symlink retarget can launch tools, instructions, settings, extensions, and git state in retained project A instead of current project B, with no validation failure. Re-resolving at the runtime boundary prevents the introduced stale-target window.
Finding 4 — unreadable directories pass preflight merge blocker Factual: validation checks realpath/stat/directory type but not read/search access. Scope: the approved acceptance criteria explicitly require unreadable paths to be rejected before RuntimePool.create. Practical: normal Unix permission or ACL changes can cause late spawn failure or missing project resources after the chooser accepted the path. A read/search access check gives deterministic actionable rejection.
Finding 5 — symlink form hidden from provenance UI merge blocker Factual: display suppression compares canonical resolvedCwd with effective runtime CWD, not raw header text. Scope: issue acceptance and published docs require both historical and effective values when they differ. Practical: an active runtime started from historical /work/current shows only canonical /srv/releases/A, hiding the exact immutable provenance users need to understand the resumed transcript. Disk data survives, but the required active-view distinction is absent.
Finding 6 — modal lacks session identity useful follow-up Factual: the modal receives no name, ID, preview, or file path. Scope: identification was included in the plan. Practical: the clicked session remains safely captured by the closure, so this creates brief ambiguity rather than resuming the wrong transcript. Useful UX polish, not a shipping blocker.
Finding 7 — coding-agent README omitted deferred Factual: repository guidance names this README and its Dashboard overview was not updated. Scope: the plan incorporates that documentation policy. Practical: existing text is not false and links to the updated detailed Dashboard documentation, so discoverability impact is limited. Complete it with the next blocker-fix batch but it does not independently block.
Finding 8 — focused coverage gaps deferred Factual: the listed paths are not all covered, and the header test uses a no-op client. Scope: several appear in the approved testing plan. Practical: missing tests do not harm users independently. Regression tests tied to findings 1–5 are required with those fixes; typed-only chooser, closed-screen wiring, real open/header preservation, and Dream/tab-title coverage remain useful completeness work.
Finding 9 — duplicated shortenPath nitpick Factual: three identical helpers exist. Scope: no acceptance criterion requires centralization. Practical: implementations are currently identical; only maintenance convenience is affected.
Finding 10 — duplicated closed-session adapter nitpick Factual: parent and subagent screens contain nearly identical modal adapters. Scope: both surfaces are required, not a shared abstraction. Practical: both currently route through the same safe store operation; extraction changes no outcome.
Finding 11 — repeated accessors inside Show nitpick Factual: accessors are recomputed and non-null asserted instead of using Solid's narrowed callback value. Scope: no behavioral requirement applies. Practical: accessors are side-effect free and render correctly; this is readability cleanup.

Action Plan

  1. Fix finding 1: make runtime creation the authoritative success, refresh inventory non-blockingly, guard modal dismissal while pending, and add Fleet/session-keyed single-flight plus refresh-failure/dismissal tests.
  2. Fix finding 2: let genuinely new sessions record effective runtime CWD without rewriting the resumed source header; test /new from a real divergent historical/runtime setup.
  3. Fix finding 3: resolve/revalidate the historical path at runtime creation instead of trusting inventory-time canonical identity; test symlink retarget while the old target remains.
  4. Fix finding 4: reject directories lacking required read/search access before pool creation with focused permission-path coverage.
  5. Fix finding 5: compare raw historical header text for presentation and test canonically equivalent symlink provenance in Fleet and Session views.

Only these five merge blockers belong in the action plan. Findings 6–8 can be completed opportunistically in the authorized fix batch where they overlap required files/tests/docs; findings 9–11 are non-blocking cleanup.


Assessment by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Progress Update

Implemented and pushed the five round-1 merge-blocker fixes:

  • made Fleet resume session-keyed single-flight and runtime creation authoritative over inventory refresh
  • kept the fallback chooser mounted and non-dismissible while resume is pending
  • made newly created sessions record the effective runtime CWD without rewriting the resumed source header
  • re-resolved historical symlink paths at runtime creation instead of trusting inventory-time canonical targets
  • rejected directories lacking read/search access before pool creation
  • displayed raw historical path provenance even when it canonically matches the effective runtime path
  • added focused client, server, filesystem, and coding-agent regression coverage and updated relevant docs

Validation completed successfully:

  • \�0npm run check\�0
  • \�0npm run build\�0
  • \�0npm run verify-workspace-links\�0
  • \�0npm test\�0
  • commit hook: 6,110 passed, 0 failed, 728 skipped

Commit: \�043b1ba71ee53e67a3102bab670bda13f83067e57\�0


Progress tracked by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Unverified Review Candidates — Pending Assessment

Review round: 3
Reviewed commit: 43b1ba7

These are unverified candidates. Severity reflects reviewer confidence; do not treat any item as a merge blocker until the assessment comment is posted.

Critical

None.

Important

Finding 1 — Fleet single-flight does not survive remounts, tabs, or ambiguous responses

Confidence: 98/100 · Files: packages/dashboard/src/client/screens/fleet.tsx, packages/dashboard/src/server/runtime-pool.ts

The new resumeRequests map belongs to one FleetScreen instance. Browser navigation/remount, another Dashboard tab, or a lost HTTP response bypasses it; the server has no session-path reservation, deduplication, or idempotency token. Two requests can therefore start separate RPC children against the same JSONL and append concurrently.

Finding 2 — A stalled create request leaves the fallback chooser locked indefinitely

Confidence: 96/100 · Files: packages/dashboard/src/client/api.ts, packages/dashboard/src/client/components/resume-session-modal.tsx

Dashboard fetches have no timeout or abort signal. Once fallback resume is busy, every control is disabled and Escape/backdrop dismissal is ignored. A half-open remote connection can leave the operator with no action except reloading, while the server-side creation result is unknown. Re-enabling retry without idempotency could compound finding 1.

Finding 3 — A stale or corrupted session path can resume blank or overwrite the source

Confidence: 99/100 · Files: packages/dashboard/src/server/server.ts, packages/coding-agent/src/core/session-manager.ts, packages/coding-agent/src/main.ts

Runtime creation validates only CWD before forwarding sessionPath. If the selected JSONL is deleted between inventory and creation, SessionManager.open() starts a blank session at that path; if it is empty/malformed, it rewrites the file with a fresh header. The API can thus report successful resume without the selected history, or destructively replace a corrupted transcript.

Finding 4 — Non-root message forks still persist the missing historical CWD

Confidence: 96/100 · Files: packages/coding-agent/src/core/agent-session.ts, packages/coding-agent/src/core/session-manager.ts

The /new and root-user fork paths now pass effective runtime CWD. Forking from an assistant message or non-root user message calls createBranchedSession(), whose new header still uses historical SessionManager.cwd. The derived session is subsequently classified unavailable and requires another chooser despite having operated in the replacement project.

Finding 5 — A permission-race 403 does not open the replacement chooser

Confidence: 99/100 · File: packages/dashboard/src/client/screens/fleet.tsx

Direct resume opens the chooser only for status 400 or 404. The new directory permission validation returns 403, so a path that becomes unreadable after inventory produces a generic Fleet error instead of allowing the explicit replacement-directory flow.

Suggestions

Finding 6 — Resume chooser does not identify the selected session

Confidence: 100/100 · File: packages/dashboard/src/client/components/resume-session-modal.tsx

The approved plan says the chooser identifies the session. It shows historical CWD only, with no session name, ID, preview, or file path, so sessions sharing the same historical path have indistinguishable chooser content.

Finding 7 — Required coding-agent README update remains absent

Confidence: 100/100 · File: packages/coding-agent/README.md

The approved plan and repository documentation policy name this README. Root, Dashboard, and detailed coding-agent docs were updated, but the package README's Dashboard overview remains unchanged.

Finding 8 — Persisted provenance coverage still stops at fakes/in-memory state

Confidence: 98/100 · Files: packages/dashboard/test/server.test.ts, packages/coding-agent/test/rpc-dashboard-commands.test.ts

The fallback header-preservation server test uses a no-op fake client, while the /new test mutates an in-memory manager. No real-file test opens divergent historical/runtime CWDs, persists /new or a fork, and independently verifies both source and derived headers.

Finding 9 — Closed-session chooser adapters lack interaction coverage

Confidence: 97/100 · File: packages/dashboard/test/client/screens.test.tsx

Parent and subagent tests assert that “Choose directory…” exists, while store tests bypass both screen adapters. Neither separate UI adapter is exercised through open, path entry/selection, submit, failure retention, and exact recovery arguments.

Finding 10 — Two changed runtime-CWD RPC consumers lack divergent-CWD tests

Confidence: 98/100 · File: packages/coding-agent/test/rpc-dashboard-commands.test.ts

Git and project-agent discovery have differing-CWD tests. Relative /dream backup resolution and tab-title repository/CWD metadata do not exercise the changed runRpcMode wiring under divergent historical/effective paths.

Finding 11 — Stale-availability overrides are unused

Confidence: 100/100 · File: packages/dashboard/src/client/screens/fleet.tsx

On a direct-resume 400/404, Fleet copies the session solely to overwrite cwdAvailable and resolvedCwd, but the modal always receives historicalUnavailable and later resume uses only path/CWD. Passing the original session preserves behavior and avoids the allocation.

Finding 12 — Path display formatting remains duplicated

Confidence: 99/100 · Files: resume-session-modal.tsx, fleet.tsx, session.tsx

The identical shortenPath helper exists in three modules and could be shared without behavior change.

Finding 13 — Historical path rendering can use Show's narrowed value

Confidence: 98/100 · Files: fleet.tsx, session.tsx

Both render paths recompute accessors and use non-null assertions inside Show. The narrowed callback value removes repeated inventory lookup and assertions.

Finding 14 — Closed-session modal adapter remains duplicated

Confidence: 92/100 · Files: session.tsx, subagent.tsx

The same store-to-modal adapter exists in both screens. A focused shared wrapper could retain existing precedence, error propagation, and single-flight behavior while reducing divergence risk.

Strengths

  • The five previously assessed blockers are fixed on their originally identified paths: mounted-Fleet duplicate clicks, /new CWD, creation-time symlink resolution, pre-pool permission validation, and raw provenance display.
  • Runtime creation is authoritative over secondary inventory refresh, avoiding the original retry-after-success failure.
  • Permission checks are centralized and covered at validator and endpoint boundaries.
  • Historical and effective directory identities remain explicit across server, protocol, state, UI, RPC, and docs.
  • Missing paths remain visible without becoming operational project roots.
  • Focused suites, repository checks, build, workspace-link verification, full tests, and commit hooks pass at the reviewed head.

Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier


Reviewed by mach6

@Anjiro81

Copy link
Copy Markdown
Contributor Author

Review Assessment

Round-3 unverified review candidates

Classifications

Finding Classification Reasoning
Finding 1 — component-local resume single-flight deferred Factual: separate Fleet instances, tabs, or ambiguous retries bypass the local map, and the server does not deduplicate session paths. Scope: server-wide resume idempotency predates this PR; the approved chooser requirement is satisfied for mounted duplicate submissions and the PR-created refresh-failure retry path. Practical: concurrent children can damage a transcript, but reaching this requires another tab/remount or ambiguous retry before inventory catches up. Broader request idempotency is worthwhile hardening, not an issue-512 blocker.
Finding 2 — stalled create locks chooser useful follow-up Factual: fetch has no timeout/abort and the busy modal cannot be dismissed. Scope: request timeout/reconciliation is not required here and generic Dashboard requests already lack it. Practical: a half-open connection can require reload, but permitting retry without finding-1 idempotency is less safe. Address both as a broader lifecycle design.
Finding 3 — stale/corrupt session path deferred Factual: a missing explicit path creates a blank session and an empty/malformed file can be rewritten. Scope: session-path open behavior predates this PR; issue 512 concerns runtime CWD for an otherwise valid persisted session. Practical: deletion/corruption between inventory and child startup can cause blank resume or data loss, so fail-closed session opening deserves separate hardening, but is not caused by this change.
Finding 4 — non-root forks retain historical CWD merge blocker Factual: /new and root-user forks pass effective CWD, while assistant/non-root forks call createBranchedSession(), which writes historical SessionManager.cwd. Scope: this is the same newly-derived-session invariant as the prior /new blocker and a divergent-CWD regression enabled by this PR. Practical: a normal user fallback-resumes, forks from an assistant or later user message, closes the branch, and then must choose a replacement again because its new header falsely records the missing path. Both the independent assessor and developer's advocate confirm material impact.
Finding 5 — permission-race 403 lacks chooser transition useful follow-up Factual: directory access failures return 403, but Fleet transitions to the chooser only for 400/404. Scope: immediate replacement selection aligns with the plan. Practical: permissions must change in the inventory-to-click window; the user receives an actionable error and reload reprojects the session as unavailable. Cheap UX improvement, but the reachable harm is not material enough to block.
Finding 6 — chooser lacks session identity useful follow-up Factual: only CWD provenance is shown. Scope: the approved plan says the chooser identifies the session. Practical: the caller closure still resumes the exact clicked transcript, so this causes ambiguity rather than incorrect selection.
Finding 7 — coding-agent README omitted useful follow-up Factual: repository policy and the plan name this README, and it remains unchanged. Scope: documentation completeness is authorized. Practical: its existing overview is not false and links to the updated detailed docs. The developer's advocate cited the categorical policy, but the independent assessor found no material reader harm; round-3 blocker concurrence is therefore absent.
Finding 8 — no real-file divergent provenance test useful follow-up Factual: current source-preservation coverage uses a fake client and /new coverage is in-memory. Scope: persisted provenance testing appears in the plan. Practical: missing tests do not independently harm users, but a focused real-file source/derived-header test is required with finding 4 because it catches that concrete regression.
Finding 9 — closed chooser adapters lack full interaction tests discarded observation Factual: each screen adapter is not exercised end-to-end. Scope: closed parent/subagent recovery is required. Practical: both screens render the action, shared modal tests cover interaction/error retention, and store tests cover exact override/session path, single-flight, error, and navigation semantics. Duplicating the full sequence does not expose a current failure.
Finding 10 — Dream/tab-title divergent-CWD tests absent useful follow-up Factual: those two changed consumers lack focused divergent-CWD wiring tests. Scope: both are named in the plan. Practical: current code directly reads the already-verified effective accessor and no defect is shown. Additional focused tests would improve regression confidence only.
Finding 11 — unused stale-availability overrides nitpick Factual: copied fields are not consumed by the modal/resume path. Scope: no behavioral requirement applies. Practical: only a tiny exceptional-path allocation is affected.
Finding 12 — duplicated shortenPath nitpick Factual: three identical helpers remain. Scope: no criterion requires centralization. Practical: current output is consistent; this is maintenance preference.
Finding 13 — repeated accessors inside Show nitpick Factual: pure accessors are recomputed and non-null asserted. Scope: no behavior requirement applies. Practical: rendering is safe and correct; this is style cleanup.
Finding 14 — duplicated closed modal adapter nitpick Factual: parent and subagent wrappers are nearly identical. Scope: both surfaces are required, not a shared abstraction. Practical: both delegate to the same tested store operation; extraction changes no current outcome.

Action Plan

  1. Fix finding 4: allow persisted branch creation to receive the effective runtime CWD, and pass AgentSession.cwd for assistant and non-root user forks without changing the source transcript.
  2. Add one focused persistent divergent-CWD regression that independently verifies the original header remains historical and the derived fork header records the effective runtime directory. This supplies the material portion of finding 8 without broadening the blocker scope.

No other candidate meets the round-3 requirement that both the independent assessor and developer's advocate confirm material practical impact.


Assessment by mach6

…esume-missing-session-cwd

# Conflicts:
#	packages/coding-agent/docs/dashboard.md
#	packages/dashboard/src/client/screens/fleet.tsx
#	packages/dashboard/src/client/screens/session.tsx
#	packages/dashboard/src/client/screens/subagent.tsx
#	packages/dashboard/src/client/styles/app.css
@m-aebrer

Copy link
Copy Markdown
Collaborator

Unverified Review Candidates — Pending Assessment

Review round: 4
Reviewed commit: 396c1d2

These are unverified candidates. Severity reflects reviewer confidence; do not treat any item as a merge blocker until the assessment comment is posted.

Critical

None.

Important

  1. Fallback-resumed message forks persist the missing historical CWDAgentSession.fork() passes no effective-CWD override to SessionManager.createBranchedSession() for assistant-message and non-root user-message forks (packages/coding-agent/src/core/agent-session.ts:3992,4006; packages/coding-agent/src/core/session-manager.ts:1219-1251). After fallback resume, the manager still holds the immutable historical CWD while the agent holds the selected effective CWD, so the new derived transcript gets a missing path and becomes unavailable again after close. This was the remaining round-3 blocker and has no divergent-CWD fork regression test. Confidence: 98.

Suggestions

  1. Closed-resume banner handlers return boolean despite a void | Promise<void> contract — direct Solid setter expression bodies in packages/dashboard/src/client/screens/session.tsx:1814 and packages/dashboard/src/client/screens/subagent.tsx:165 fail tsgo -p tsconfig.client.json with TS2322. The runtime behavior is harmless, but block-bodied handlers would satisfy the declared callback type. Confidence: 90.
  2. Use narrowed Show callback values for historical-CWD labelspackages/dashboard/src/client/components/session-card-summary.tsx:62-65 and packages/dashboard/src/client/screens/session.tsx:2008-2011 repeatedly evaluate the same accessor and require non-null assertions. Confidence: 95.
  3. Avoid unused stale-availability object overridespackages/dashboard/src/client/screens/fleet.tsx:214 copies a session while overriding fields the fallback modal does not read; passing the original session has the same behavior. Confidence: 92.
  4. Express optional CWD assignment without self-assignmentpackages/coding-agent/src/core/session-manager.ts:755 can use an explicit defined check rather than this.cwd = options?.cwd ?? this.cwd. Confidence: 88.

Strengths

  • The issue is real, although its original claim that missing-CWD sessions were already listed was inaccurate: master filtered them before resume. The PR correctly fixes inventory exposure and resume together.
  • Historical provenance and effective runtime CWD are separated across DTOs, server validation, RPC behavior, state, and both live and closed UI surfaces.
  • Runtime directory validation is centralized, canonicalizes paths, checks directory type plus read/search access, and runs before child creation.
  • The merge with master's fleet-sidebar/session-card refactor preserves both features and passed the full pre-commit suite (6,250 tests) plus focused Dashboard/RPC coverage (597 tests).

Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier


Reviewed by mach6

@m-aebrer

Copy link
Copy Markdown
Collaborator

Review Assessment

Round-4 unverified review candidates

Classifications

Finding Classification Reasoning
Finding 1 — fallback-resumed message forks persist the missing historical CWD merge blocker Factual: assistant-message and non-root user-message fork paths call createBranchedSession() without an effective-CWD override, and that method writes the historical SessionManager.cwd. Scope: this is the same unfixed blocker and explicit action item from round 3; the PR creates the divergent-CWD state and must keep newly derived transcript provenance accurate. Practical: an ordinary user can fallback-resume, fork from a message, close the branch, and then find that branch falsely marked unavailable and requiring another chooser. No safeguard covers these two paths.
Finding 2 — closed-resume handlers return boolean nitpick Factual: the two handlers fail the standalone client TypeScript config. Scope: the lines are introduced here, but the config is not run by build or CI and is already red on master-derived code. Practical: the caller explicitly discards the return value, so runtime behavior is unaffected.
Finding 3 — narrowed Show callback values nitpick Factual: the accessors are repeatedly evaluated with non-null assertions. Scope/Practical: this is readability-only; the memos are pure and rendering is correct.
Finding 4 — unused stale-availability overrides nitpick Factual: the copied overrides are not read by the modal path. Scope/Practical: removing them changes no observable behavior and only avoids a tiny exceptional-path allocation.
Finding 5 — optional-CWD self-assignment nitpick Factual: the absent-option branch assigns the field to itself. Scope/Practical: the expression is correct and both forms are behaviorally equivalent.

Action Plan

  1. Let SessionManager.createBranchedSession() receive an effective runtime CWD and pass AgentSession.cwd from both assistant-message and non-root user-message fork paths.
  2. Add a persisted divergent-CWD regression test covering both fork paths: the source header must retain its historical CWD, while each derived branch header records the effective runtime CWD.

Concrete trigger and outcome: a Dashboard user fallback-resumes the issue-512 scenario, then uses fork-from-message. Today the new JSONL header is written with the missing historical path and the closed branch becomes unavailable again. The fix makes newly created branch provenance match where that branch actually operated without rewriting the source transcript.


Assessment by mach6

@m-aebrer

Copy link
Copy Markdown
Collaborator

Progress Update

Fixed round-4 finding 1:

  • assistant-message and non-root user-message forks now pass the effective runtime CWD into branched-session creation
  • the new branch header and active session manager record that effective CWD while the source transcript retains its historical CWD
  • added persisted divergent-CWD regression coverage for both fork paths
  • verified formatting, focused fork/session-manager tests, full build, workspace links, and the complete offline test suite (6,252 passed)

Commit: 2bfc9ea184626c3b0714d02c8325f1ee69b9fd9c


Progress tracked by mach6

@m-aebrer

Copy link
Copy Markdown
Collaborator

Unverified Review Candidates — Pending Assessment

Review round: 5
Reviewed commit: 2bfc9ea

These are unverified candidates. Severity reflects reviewer confidence; do not treat any item as a merge blocker until the assessment comment is posted.

Critical

None.

Important

None.

Suggestions

Finding 1 — Divergent-CWD coverage omits relative Dream backup and tab-title context

Confidence: 98/100 · Files: packages/coding-agent/src/modes/rpc/rpc-mode.ts, packages/coding-agent/test/rpc-dashboard-commands.test.ts

The changed runtime-CWD wiring has divergent historical/effective CWD coverage for git branch, new-session creation, and agent discovery, but not for relative /dream backup resolution or TabTitleGenerator context. Reverting either consumer to session.sessionManager.getCwd() could therefore pass the current focused tests while resolving a backup path or title metadata from the missing historical project.

Finding 2 — Closed-session chooser adapters lack interaction coverage

Confidence: 97/100 · Files: packages/dashboard/src/client/screens/session.tsx, packages/dashboard/src/client/screens/subagent.tsx, packages/dashboard/test/client/screens.test.tsx

Parent and subagent tests assert that “Choose directory…” is rendered, while store tests bypass both screen adapters and Fleet covers the shared modal. Neither closed-screen adapter is exercised through opening the chooser, selecting or entering a CWD, submitting it to resumeClosedSession(sessionKey, cwd), and retaining the modal on failure or closing it on success. A wiring regression in either adapter could escape the current suite.

Finding 3 — Use Solid's narrowed Show value in session-card history

Confidence: 88/100 · File: packages/dashboard/src/client/components/session-card-summary.tsx

The historical-CWD block evaluates historicalCwd() three times and uses a non-null assertion. The Show callback form would evaluate and narrow the value once, remove the assertion, and preserve behavior.

Finding 4 — Use Solid's narrowed Show value in session chrome

Confidence: 88/100 · File: packages/dashboard/src/client/screens/session.tsx

The differing-historical-CWD block likewise evaluates its accessor repeatedly and requires a non-null assertion. Binding Show's narrowed callback value would be simpler and idiomatic without changing output.

Strengths

  • The round-4 merge blocker is fixed on both assistant-message and non-root user-message fork paths: each now passes the effective runtime CWD to branched-session creation.
  • The new persisted regression reads both actual JSONL headers for both fork roles, proving that the source keeps its historical CWD while the derived branch records the effective CWD and updates the active manager.
  • All issue acceptance criteria and approved plan deliverables are implemented across inventory, strict validation, explicit fallback UX, historical/effective visibility, RPC behavior, documentation, and tests.
  • Runtime validation occurs before child creation, preserves structured errors, and missing historical paths remain visible without entering operational project-root inventories.

Agents run: code-reviewer, error-auditor, test-reviewer, completeness-checker, simplifier


Reviewed by mach6

@m-aebrer

Copy link
Copy Markdown
Collaborator

Review Assessment

Round-5 unverified review candidates

Classifications

Finding Classification Reasoning
Finding 1 — divergent-CWD Dream/tab-title coverage useful follow-up Factual: the RPC wiring correctly uses effective session.cwd, but divergent historical/effective coverage does not exercise relative Dream backup or tab-title integration. Scope: those behaviors are named in the approved plan and are implemented correctly. Practical: this is future regression-detection value, not a current defect or acceptance-criterion failure; missing tests alone do not block.
Finding 2 — closed-session chooser adapter coverage useful follow-up Factual: parent and subagent adapters are not driven end-to-end, although banner rendering, shared modal behavior, and store recovery semantics are separately tested. Scope: closed-session replacement-directory recovery is in scope and currently wired correctly. Practical: the untested seam is small prop/state plumbing; no current actor-trigger-harm sequence exists, only a future regression risk.
Finding 3 — narrowed Show value in session-card history nitpick Factual: the accessor is evaluated repeatedly and uses a safe non-null assertion. Scope: no acceptance criterion requires a different Solid idiom. Practical: the callback form is readability-only and changes no outcome.
Finding 4 — narrowed Show value in session chrome nitpick Factual: the same repeated-accessor pattern exists in session chrome. Scope/Practical: rendering is correct and the suggested callback form is behavior-preserving style cleanup only.

Action Plan

No merge blockers.

The prior blocker is independently verified fixed: assistant-message and non-root user-message forks pass the effective runtime CWD, and the persisted regression confirms the source JSONL header remains historical while both derived branch paths record the effective CWD.


Assessment by mach6

@m-aebrer

Copy link
Copy Markdown
Collaborator

Progress Update

Implemented both round-5 useful follow-ups:

  • added divergent historical/effective CWD coverage for relative Dream backup resolution and RPC tab-title metadata
  • added parent and subagent closed-session chooser interaction coverage for selected-CWD forwarding, retained failure/retry behavior, and successful modal closure
  • verified focused RPC and Dashboard screen suites, repository checks, full build, workspace links, and the complete deterministic test suite

Commit: 1a4e8ba265c1dfa8016dfd534a147b8171186e1f


Progress tracked by mach6

@m-aebrer
m-aebrer merged commit 8eba358 into aebrer:master Sep 16, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow Dashboard to resume sessions with missing historical CWD

2 participants