- Add getFusionDir() method to TaskStore for resolving agent database path
- Update in-process-runtime to use getFusionDir() instead of hardcoded path
- Update dashboard routes AgentStore initialization to use getFusionDir()
- Add changeset for published package patch bump
When the stuck task detector killed a task and immediately called
moveTask("todo"), the scheduler could re-dispatch the task before the
old execution's finally block cleared this.executing. The new execute()
call hit the guard and silently returned, stranding the task in
"in-progress" with no active session or worktree (seen on FN-810/FN-912).
Move the requeue responsibility from StuckTaskDetector.killAndRetry to
the executor's finally block, which runs after this.executing.delete().
The beforeRequeue budget check now runs before session.dispose() and its
result is passed via StuckTaskEvent.shouldRequeue → markStuckAborted().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix resolveBaseBranch to use stored branch name and consistent fusion/ prefix
for both explicit deps and blockedBy paths (was using kb/ for blockedBy)
- Add main branch checkout verification in merger before squash merge to prevent
feature code from landing on wrong branch lineage
- Align all branch prefix references from stale kb/ to fusion/ across executor,
merger, store, and routes
- Fix executor test OOM by mocking merger fully, adding fake timers to retry
tests, and switching vitest pool to vmThreads
- Update all test assertions to use fusion/ branch prefix
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix branch name assertion in executor test: use kb/ prefix instead of fusion/
- Add comprehensive tests for stale worktree and branch reference recovery (267 lines)
- Document stale worktree/branch recovery procedure in README
Instead of immediately failing when an agent finishes without calling
task_done, spawn a fresh session with a recovery prompt that asks the
agent to review the worktree state and complete the task. Only fail
if the retry also doesn't produce a task_done call.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The merger was using `git diff HEAD..branch --stat` which includes
artifacts from other tasks when branches fork from older main commits.
Switch to `git diff $(merge-base)..branch --stat` so commit messages
only describe the branch's own changes.
Also surface the "files changed" button on done task cards using
mergeDetails, opening the same ChangedFilesModal with commit-backed
diffs (matching the Changes tab in the task modal).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add explicit no-progress loop detection signals to executor agent sessions
- Enhance stuck-task detector with configurable strategies (timeout, no-progress, combined)
- Add comprehensive test coverage for stuck-task detector (371 lines of tests)
- Remove modelFilter test utilities (198 lines of dead test code)
- Simplify modelFilter.ts by removing unused filtering logic
- Clean up dashboard server startup and minor README fix
- Extend WorkflowStep type with optional modelProvider, modelId, validatorModelProvider, validatorModelId fields
- Add API endpoints (PATCH /api/workflow-steps/:id) to update model overrides on workflow steps
- Update executor to use per-step model overrides when running workflow step agents
- Add AgentDetailView support for displaying workflow step model configuration
- Add store and executor tests for new model override behavior
- Auto-resume in-progress tasks that were paused and then unpaused, picking up from their last step
- Add event-driven scheduler trigger on task unpause so resumed tasks are immediately scheduled
- Update Store and TaskStore with unpause handling, type changes for resume tracking
- Refactor executor, merger, and scheduler tests for improved reliability
- Remove dead code: mission-interview, pr-comment-handler, taskStuck util, OpenRouter model sync changeset
- Update AGENTS.md documentation for pause/unpause behavior
- Fix executor bug where tasks paused during execution with a graceful session exit were silently dropped instead of moved back to todo
- When session.dispose() resolves the prompt without throwing, the paused-aborted flag now triggers moveTask(todo) so the scheduler can resume after unpause
- Add executor test suite covering pause via graceful exit, pause via abort error, and pause during session disposal
- Document corrected pause/unpause behavior for in-progress tasks in README and AGENTS.md
- Thread real project context (projectName, projectId) into ntfy notification deep links
- Dashboard deep-link URL now honors project context with /project/:name/task/:id pattern
- Update App.tsx routing to handle project-scoped deep link navigation
- Add project info to NtfyNotifier types and wire through notification payload
- Add changeset for published @gsxdsm/fusion package
- Add tests for notifier project context and dashboard routing
- Log the selected model provider and ID during triage so the agent log records which model was used
- Add agent-log entry capturing triage model choice for observability
- Add comprehensive tests for triage model logging behavior
- Update AgentsView component and dashboard docs for consistency
- Remove obsolete AgentsView test
The body-scan fallback (includes("APPROVE") etc.) would misclassify verdicts
when the reviewer mentioned a keyword in context without it being the actual
verdict — e.g. "this does not yet merit APPROVE". Replaced with a
line-anchored regex that only matches "Verdict: X" lines, and expanded the
primary regex to also catch bold/italic formatted verdicts like **Verdict: APPROVE**.
UNAVAILABLE is now the honest fallback when no structured verdict is found,
triggering a retry rather than silently misclassifying.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1. Scoping rules in agent prompts: executor, triage template, and reviewer
now explicitly forbid deleting/gutting modules, settings, interfaces,
exports, or test files outside the task's declared File Scope. Reviewer
will REVISE if out-of-scope removals are detected.
2. Pre-merge diffstat scope check: merger.ts validates the git diffstat
against the task's PROMPT.md File Scope before merging. Large deletions
outside scope are logged as warnings on the task (soft guardrail).
3. Changeset requirement for feature removal: triage template now requires
a .changeset/ entry when removing existing functionality. Executor and
reviewer enforce this requirement.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add state to tasks: persisted in DB, gates scheduler pickup to prevent immediate retry of transient failures
- Introduce shared recovery-policy module with bounded exponential backoff (1s → 60s, max 5 attempts)
- Wire recovery policy into executor, scheduler, and triage so all agents respect the same retry cadence
- Persist retry state (attempt count, next eligible time) in task metadata via store and DB schema
- Add DB migration for new retry columns and update schema tests
- Update README with recovery policy documentation
- Refactor dashboard Header component and styles, consolidate header tests
- Fix session-files route tests to align with updated route signatures
- Add git worktree prune as first recovery step before branch deletion to release stale locks
- Add git update-ref -d fallback when git branch -D fails on corrupted references
- Handle stale references in the fallback conflict path (not just primary path)
- Expand invalid-reference pattern matching to cover additional error outputs (unable to resolve reference, stale file handle, not a valid ref, unable to delete ref)
- Add detailed logging at each recovery step for operational traceability
- Add describeModel() helper in pi.ts to format provider/model info for logging
- Log resolved model details in executor, reviewer, and triage agent creation
- Update executor and reviewer to call describeModel before session start
- Add unit tests for describeModel covering all input combinations
- Fix test mocks to account for new describeModel dependency
- Fix addSteeringComment to skip auto-refinement and write directly to steeringComments array
- Update formatCommentForInjection to accept SteeringComment type instead of raw string
- Export SteeringComment type from @fusion/core for executor usage
- Add tests verifying steering comments are persisted to task store
- Fix executor import to use exported SteeringComment type
- Add 'branch' field to Task and ArchivedTaskEntry types with DB migration
- Executor stores branch name on task after worktree assignment
- Merger reads branch from task metadata instead of relying on worktree state
- Implement non-destructive conflict recovery in prepareForTask with reset/clean
- Add tests for branch storage, merger branch reading, and worktree recovery
- Add branch conflict recovery to worktree-pool prepareForTask when checkout fails
- Add fallthrough in executor to create fresh worktree when pool preparation fails
- Add tests for branch conflict recovery in worktree-pool
- Add tests for executor fallthrough on pool preparation failure
- Add rate-limit retry utility with exponential backoff, jitter, and configurable limits
- Integrate retry logic into executor, triage, and merger agent sessions
- Export retryOnRateLimit from engine package index
- Remove unused DirectoryPicker component, stale CSS, and dead dashboard routes
- Update SetupWizardModal and usage tests to reflect cleanup
- Add projectId parameter to NtfyNotifier constructor and sendMessage method
- Include projectId in notification deep links for multi-project context
- Add unit tests for deep link URL construction with projectId in App.tsx
- Add unit tests verifying project ID handling in notifier
- Add git diff for session-files using baseCommitSha with double-dot syntax
- Add merge-base fallback to find common ancestor when baseCommitSha is missing
- Add HEAD~1 fallback when merge-base fails (e.g., no remote main)
- Add 10-second in-memory cache for session-files computation
- Fix scheduler to immediately schedule tasks created via dashboard
- Add task:moved to done handler for immediate scheduling on status change
- Add comprehensive unit tests for scheduler immediate scheduling
- Add unit tests for session-files caching and base ref resolution
fix: update scheduler filesystem path from .kb to .fusion for task validation
style: clean up TaskDetailModal styling with reusable CSS classes
test: add comprehensive tests for file-service operations with mocked filesystem
- Optimize backup tests with fake timers and deterministic timestamps
- Enable Vitest fileParallelism in core, engine, cli, and dashboard packages
- Fix SettingsModal scope initialization regression covered by merge resolution
- Update affected dashboard and engine tests for the new parallel-friendly behavior
- Add a changeset and document test optimization patterns in AGENTS.md
- Add mission CLI commands and pi extension tools for creating missions, milestones, slices, features, and task links
- Extend core mission storage and schema migrations with auto-advance support, task slice linkage, and comment normalization coverage
- Wire mission-aware scheduler and executor behavior so linked features progress with task execution and completed slices can auto-activate follow-on work
- Add regression tests for mission CLI parsing, extension behaviors, scheduler mission semantics, and executor integration
- Add activity feed fallback to the local project log when central activity is empty or unavailable
- Pass configured build commands into executor and merger prompts with hard-gate instructions
- Add merger build-failure reporting via report_build_failure and stop commits when verification fails
- Expand engine and dashboard regression coverage for activity feed fallback and merge build verification
- Add `setupScript` property to ProjectSettings to reference a named script
- Execute the referenced setup script after worktreeInitCommand on fresh worktrees
- Log success/failure of setup script execution; warn and skip if script name not found
- Skip setup script for pooled/recycled worktrees (fresh only)
- Add changeset (minor) for the new setting
- Fix SQL parameter mismatch in db-migrate task INSERT (add baseCommitSha, modifiedFiles, sliceId columns)
- Fix dashboard routes type predicate to guard against null entries from git diff parsing
- Stabilize central-core activity cleanup test with fake timers
- Align executor test assertions with updated steering comment log messages
- Align store test comment log assertion with new action/outcome format