- Restore projectId field when rehydrating subtask sessions from SQLite via buildSubtaskSessionFromRow()
- Add regression tests for projectId forwarding in subtask start-streaming route
- Add documentation note in memory.md for durable subtask session context propagation
- Fix 30 git routes to use getScopedStore(req) instead of global store
- Fix activity GET/DELETE routes to use scoped store
- Fix POST /api/github/webhooks to use scoped store for badge updates
- Fix POST /api/ai/summarize-title to use scoped store for settings
- Fix GET /api/git/worktrees to use scoped store for task listing
- Add projectId parameter to all git and activity frontend API functions
- Update useActivityLog hook to pass projectId through
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add spec-staleness evaluator to check task specification age before execution
- Guard executor startup and resume to prevent running tasks with stale specs
- Guard scheduler dispatch to skip stale tasks and move them back to triage
- Add comprehensive tests for spec staleness detection (7d/14d thresholds)
- Add getFusionDir mock for executor staleness check tests
- Add CSS rule to override padding-right for QuickEntryBox textarea
- The .description-with-refine textarea rule was adding 70px padding that wasn't needed in QuickEntryBox (refine button is in controls panel)
- Add regression tests for textarea width contract
- Add mockDesktopViewport helper for viewport-specific tests
- Keep max-width: 800px constraint in list view (design decision)
- Replace blocking execSync calls with async execAsync in executor.ts for user-configured commands
- Convert self-healing.ts worktree status checks to async to avoid blocking the event loop
- Update step-session-executor.ts to use async worktree operations
- Refactor worktree-pool.ts for fully async worktree creation, cleanup, and listing
- Convert pi.ts agent session handling to async execution
- Update all corresponding tests with async/await patterns
- Add changeset for @gsxdsm/fusion patch release
- Handle { items: [...] } response format from companies.sh API
- Parse installs field as both string and number
- Accept owner/repo shorthand in addition to full GitHub URLs
- Replace broken Web Streams pipeTo with Node stream/promises.pipeline
- Add max-height with scroll to planning-options to prevent overflow
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add compose button to Agents tab for composing messages to agents
- Compose pre-fills recipient when agent is selected, shows dropdown otherwise
- After send, user stays on Agents tab and selected agent is preserved
- Add 4 regression tests for new compose contract
- Add CSS for mailbox-agents-header layout
Apply consistent font-family, font-weight, and line-height to count,
separator, and max elements.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Remove Kimi provider from usage tracking module
- Clean up unused Kimi-related code in usage.ts (225 lines removed)
- Remove Kimi-specific tests from usage.test.ts (686 lines removed)
- Add tests for usage routes (routes.test.ts)
- Add new usage API routes for usage data endpoints
- Fix planning resume state mismatch in PlanningModeModal
- Add PlanningModeModal tests for state consistency
Remove min-height: 300px from .planning-loading and add overflow: hidden
to .planning-initial so the modal stays within 80vh bounds.
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
- Add context-overflow detection and recovery in step-session executor with same parity as single-session
- Implement step resumption from overflow checkpoints with accumulated context replay
- Add overflow state tracking and recovery logging for diagnostics
- Harden single-session executor overflow recovery with improved state management
- Update appendAgentLog parameter signatures across executors
- Add comprehensive tests for context overflow scenarios in both execution modes
- Add memory entry documenting the unified context-limit recovery approach
- Add process lifecycle diagnostics for dashboard and serve commands
- Add SQLite database health check to diagnostics endpoint
- Add store listener count diagnostics for debugging subscription leaks
- Audit and fix SSE connection management to prevent connection leaks
- Audit and fix timer/interval cleanup in engine and CLI shutdown handlers
- Fix res.on() call guard for test mocks compatibility
- Fix variable declaration ordering in serve.ts
- Update memory with diagnostic findings for future debugging
- Add backend API routes for companies.sh catalog with pagination and search
- Wire frontend API client with browse mode endpoints (search, list agents)
- Build Agent Import modal with tabbed interface (URL input + browse mode)
- Add browse mode styling with search results grid and agent cards
- Include UI and route test coverage for browse flow
- Update in-UI help text with browse mode usage instructions
- Fix thinking level selector to default to 'off' when no global default is configured
- Add 'Using default' badge when thinking level falls back to global setting
- Show explicit thinking level badge only when a non-default value is selected
- Add comprehensive tests for thinking level selector behavior
- Add tests for resolved model display with global settings fallback
- Add eslint-disable comments for unused parameters in truncateVerificationOutput and summarizeVerificationOutput
- Preserve functions that may be useful for future diagnostics while silencing no-unused-vars warnings
- Update BackgroundTasksIndicator to display error sessions count alongside active sessions
- Include error sessions in App filter for notification banner visibility
- Add session cancellation for mission interviews on banner dismiss
- Add comprehensive test coverage for SessionNotificationBanner component
- Update useBackgroundSessions hook to expose error session counts
- Add summarizeVerificationOutput helper function to condense test output
- Update runVerificationCommand to use summarization for cleaner merge reports
- Improve readability of test failure summaries in the dashboard
- Convert hasRecoverableGitWork from sync execSync to async execAsync
- Update recoverNoProgressNoTaskDoneFailures caller to await the method
- Update self-healing tests to work with async method and execAsync mock
- Add exec and promisify imports to self-healing.ts
- Fix mock to include exec export for promisify compatibility
The FN-1598 merger.ts async conversion introduced an escalation strategy where
attempt 3 uses -X theirs and succeeds when AI fails. The tests were expecting
the merge to fail after 3 AI attempts, but now attempt 3 succeeds via the
theirs strategy.
This commit fixes the test mocks to make the -X theirs merge fail so all
3 attempts exhaust and the function throws as expected.
- Replace execSync with promisified execAsync in init.ts detectProjectName() for non-blocking git remote lookups
- Replace execSync with promisified execAsync in task-lifecycle.ts cleanupMergedTaskArtifacts() for non-blocking git worktree/branch cleanup
- Add 30s timeout to git operations to prevent indefinite hangs
- Update test mocks to support both callback-style and promise-style exec usage
The dashboard used incorrect field names (passedCount/failedCount/blockedCount/pendingCount)
that don't exist on the type. The backend returns passedAssertions/failedAssertions etc.
Fixed MissionManager.tsx to use correct field names with ?? 0 fallback for tooltip text.
1. Fix TypeError in run history: fetchValidationRuns now correctly
destructures .runs from paginated API response {runs, total, offset}
2. Fix assertions panel rendering: inline fetch calls in loadMissionDetail
and toggleMilestoneExpanded to avoid forward-reference of callback hooks.
Added Array.isArray guard to prevent .map on undefined state values.
3. Add missing UI components:
- Clickable lineage indicator for fix features (navigates to source)
- Retry budget 'Attempt X of Y' display on feature cards
- 'No fix features generated' empty state
- Milestone validation state badge in header (already existed, now
loads correctly)
- Validation rollup badge with coverage bar in milestone header
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>