RUFU-018: Land pnpm env fix + no-commits dep-sync skip - #2438
Conversation
📝 WalkthroughWalkthroughThe release expands project-scoped CLI settings, adds workflow-step recovery, hardens PostgreSQL migration paths, updates no-commit merge handling, forwards dependency-install environments, and routes context-overflow recovery through direct session compaction. ChangesCLI and release surface
Core workflow and PostgreSQL reliability
Engine merge and runtime behavior
Estimated code review effort: 5 (Critical) | ~90+ minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/core/src/postgres/sqlite-migrator.ts (1)
891-930: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winThe post-copy phase runs outside any savepoint, so the "UPDATE always succeeds" claim does not hold.
Only
migrateTableis savepoint-wrapped. The sametryalso coversbuildMigrationPlan(Line 769) andmigrateLegacyProjectPluginRowsOnSession(Line 891). If either throws, there is no savepoint to roll back to, the transaction stays aborted, and both thefinallyblock'sSET session_replication_role = originand the statusUPDATEat Line 923 fail with "current transaction is aborted" — the failure mode this change set out to eliminate. TheUPDATE's own throw then maskscopyError. The Line 901 log also attributes every error in this catch to "plugin migration" even when planning failed.Wrap the plugin/post-copy work in its own savepoint (and roll back to it on error) so the abort state is always cleared before the status write, and soften the comment/log accordingly.
🛡️ Proposed fix
if (!dryRun) { + await migrationDb.execute(sql`SAVEPOINT migration_post_copy`); + } + try { for (const source of sources) { if (source.pgSchema !== PROJECT_SCHEMA) continue; const projectPath = source.projectPath ?? options.projectPath; if (sqliteTableExists(source.sqlitePath, "plugins") && !projectPath) { throw new Error(`projectPath is required to migrate legacy plugin state from ${source.sqlitePath}`); } if (projectPath) { await migrateLegacyProjectPluginRowsOnSession( migrationDb, source.sqlitePath, projectPath, ); } } + if (!dryRun) { + await migrationDb.execute(sql`RELEASE SAVEPOINT migration_post_copy`); + } + } catch (error) { + if (!dryRun) { + await migrationDb + .execute(sql`ROLLBACK TO SAVEPOINT migration_post_copy`) + .catch(() => undefined); + } + throw error; } } catch (error) { copyError = error; - log.warn( - `Post-copy phase (plugin migration) failed: ${getErrorMessage(error)}`, - ); + log.warn(`Migration copy phase failed: ${getErrorMessage(error)}`); } finally {And soften the comment at Lines 917-922:
/* FNXC:PostgresMigration 2026-07-18-10:30: - The transaction abort state was cleared by ROLLBACK TO SAVEPOINT above, - so this UPDATE always succeeds. The original error (not "current transaction - is aborted") is recorded, preserving diagnostic information. + Every failing phase above rolls back to its own savepoint, so the + transaction abort state is cleared before this UPDATE runs and the + original error (not "current transaction is aborted") is recorded. */🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/postgres/sqlite-migrator.ts` around lines 891 - 930, Wrap the entire post-copy phase, including buildMigrationPlan and migrateLegacyProjectPluginRowsOnSession, in its own savepoint and roll back to it when the phase fails before re-enabling foreign-key enforcement. Update the catch log to describe post-copy/planning failures rather than only plugin migration, and soften the comment before the failed-status UPDATE to avoid claiming it always succeeds; preserve copyError so the original failure is rethrown without being masked.
🧹 Nitpick comments (5)
packages/core/src/task-merge.ts (1)
326-347: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winRemove or wire the unused pre-merge helper.
findPendingPreMergeStepis only exercised by merge-bypass tests, whileresumeWorkflowStepstill requires an explicitstepIdand does not use it. Either connect it as the fallback when nostepIdis supplied, or drop the export along with its tests.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/task-merge.ts` around lines 326 - 347, The exported findPendingPreMergeStep helper is unused by production code. Wire it into resumeWorkflowStep as the fallback step lookup when stepId is omitted, preserving explicit stepId behavior; otherwise remove the helper and its merge-bypass tests.packages/engine/src/pi.ts (1)
467-500: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExtract the duplicated overflow-detection/logging block into a shared helper.
Both
promptWithFallbackcopies independently parseMAX_TOKENS_OVERFLOW_EXACT_PATTERNand log the same warning — the duplication is explicitly acknowledged in the comments as intentional (thecreateFnAgent-attached copy is the only reachable one for session-created agents). A small shared helper (e.g.logProviderOverflowIfMatched(errorMessage: string): void) next to the regex constant would let a future tweak to the log format or pattern happen once instead of twice.♻️ Proposed helper extraction
+function logProviderOverflowIfMatched(errorMessage: string): void { + const overflowMatch = MAX_TOKENS_OVERFLOW_EXACT_PATTERN.exec(errorMessage); + if (overflowMatch) { + const maxContext = Number(overflowMatch[1]); + const requestedOutput = Number(overflowMatch[2]); + const actualInput = Number(overflowMatch[3]); + piLog.warn( + `promptWithFallback: provider overflow (ctx=${maxContext}, ` + + `input=${actualInput}, requested=${requestedOutput}) — ` + + `proceeding to session compaction`, + ); + } +}Then call
logProviderOverflowIfMatched(errorMessage);at both sites instead of the inline block.Also applies to: 2700-2723
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/pi.ts` around lines 467 - 500, Extract the duplicated MAX_TOKENS_OVERFLOW_EXACT_PATTERN parsing and warning logic from both promptWithFallback copies into a shared logProviderOverflowIfMatched(errorMessage: string) helper near the regex constant. Replace each inline overflowMatch block with a call to this helper, preserving the existing warning details and behavior.packages/engine/src/__tests__/max-tokens-overflow-recovery.test.ts (2)
70-102: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win"Safety calculation" tests cover a feature this PR removes from production.
Per the
pi.tschanges in this same PR, the reduced-max_tokens-retry path (and itsMAX_TOKENS_OVERFLOW_SAFETY_MARGIN-based safe-token calculation) was removed becausesession.prompt()ignoresmaxTokens— recovery now goes directly to session compaction. Thisdescribe("safety calculation", ...)block still asserts the old formula's arithmetic even though nothing in production calls it anymore, which risks confusing future readers into thinking that retry path still exists.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/__tests__/max-tokens-overflow-recovery.test.ts` around lines 70 - 102, Remove the entire “safety calculation” describe block from max-tokens-overflow-recovery.test.ts, including its safeMaxTokens arithmetic tests and references to MAX_TOKENS_OVERFLOW_SAFETY_MARGIN. Keep tests for the current direct session-compaction recovery behavior unchanged.
10-41: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winTest asserts against a copy-pasted regex, not the real production constant.
MAX_TOKENS_OVERFLOW_EXACT_PATTERNis locally re-declared here as a "mirror" because it isn't exported frompi.ts. If the production pattern is later tweaked (or accidentally broken), this suite won't catch it since it only tests its own duplicate copy. Exporting the constant frompi.tsand importing it here would make this an actual regression test instead of a documentation-by-duplication test.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/__tests__/max-tokens-overflow-recovery.test.ts` around lines 10 - 41, Export the production overflow regex constant from pi.ts, then remove the locally duplicated MAX_TOKENS_OVERFLOW_EXACT_PATTERN in max-tokens-overflow-recovery.test.ts and import the exported symbol instead. Keep the existing pattern-matching assertions unchanged so they exercise the real production pattern.packages/engine/src/merger-ai.ts (1)
1175-1231: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAnother copy of the "demote to todo with preserved progress" boilerplate.
This new branch-missing no-commits lane (store.updateTask + logEntry + audit.database + moveTask + return) duplicates the same ~30-line pattern already repeated for the ai-empty-merge step-evidence guard, the no-landed-proof guard, and the executor-veto guard later in this function, plus the workspace equivalent in
landWorkspaceTask. Worth extracting a small shared helper (e.g.demoteToTodoWithReason(store, audit, taskId, reason, metadata, lane)) so future guards don't keep re-copying this block.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/merger-ai.ts` around lines 1175 - 1231, Extract the repeated demotion workflow from the no-commits branch in the finalize flow into a shared helper, such as demoteToTodoWithReason, that performs updateTask, logEntry, audit.database, moveTask with preserved progress, and returns the standard result. Reuse this helper in the ai-empty-merge, no-landed-proof, executor-veto, and landWorkspaceTask guards, preserving each guard’s reason, metadata, lane, and return semantics.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/infra/push-access-blocker-decision.md`:
- Around line 86-92: Update the landing recipe’s feature-branch setup and
cleanup to use git worktree add and git worktree remove instead of git checkout
-b in the primary checkout. Ensure the primary checkout remains on main and
adjust the related commands around the documented feature-branch workflow
consistently.
- Around line 13-17: Specify a language on the fenced shell transcript by
changing its opening fence to use console or text, preserving the existing
command output unchanged.
In `@docs/integration-branch-cli-setting.md`:
- Around line 8-18: Add language identifiers to every fenced code block in
docs/integration-branch-cli-setting.md, using text for output or value-list
blocks and bash for CLI command examples, including the additional section
around the referenced later lines.
In `@packages/cli/src/commands/dashboard.ts`:
- Around line 2184-2206: Update the detached store-warmup task around startAll()
and the visible async IIFE so it waits or retries until each project engine is
ready before calling getEngine(), counts only projects whose stores were
actually passed to setHostTaskStore(), and reports that count. Retain the warmup
promise and cancel or await it during engine teardown so it cannot repopulate
the cache after disposal.
In `@packages/cli/src/commands/settings.ts`:
- Around line 46-51: Replace the NOTE header in
packages/cli/src/commands/settings.ts lines 46-51 with an FNXC:<area>
yyyy-MM-dd-hh:mm header while preserving the requirePrApproval policy. In
packages/cli/src/commands/__tests__/settings.test.ts lines 111-121, prefix the
baseBranch and moved-setting policy blocks with FNXC headers; in lines 179-186,
prefix the deprecated-alias policy block with an FNXC header. Use the required
area-and-timestamp convention for each header.
In `@packages/cli/src/extension.ts`:
- Around line 1988-2042: The fn_workflow_step_resume tool lacks operator
authorization and accepts unstructured audit prose. In
packages/cli/src/extension.ts lines 1988-2042, require a host-supplied
privileged/operator capability before calling store.resumeWorkflowStep and pass
only permitted structured audit metadata instead of params.reason; in
packages/cli/skill/fusion/SKILL.md line 31 and
packages/cli/skill/fusion/references/fusion-capabilities.md line 34, remove the
tool from agent-facing catalogs; in
packages/cli/skill/fusion/references/extension-tools.md lines 308-316, document
the authorized entrypoint and structured audit fields without describing a
free-text reason.
In `@packages/core/src/postgres/plugin-schema-hook.ts`:
- Around line 581-601: The even_realities_seen_tasks reconciliation currently
runs only during table creation; keep only CREATE TABLE inside its guard, and
move the index, RLS settings, fusion_project_isolation policy, trigger
attachment, and fusion_runtime grant outside it with appropriate idempotent
guards. In packages/core/src/postgres/plugin-schema-hook.ts lines 581-601,
update the surrounding hook accordingly. Also move CREATE INDEX IF NOT EXISTS
idxWhatsAppDedupeRetention out of the whatsapp_chat_dedupe creation branch at
packages/core/src/postgres/plugin-schema-hook.ts lines 535-537 so existing
tables receive the index.
In `@packages/core/src/postgres/startup-factory.ts`:
- Around line 412-433: Delete the duplicate wrapper declaration of
bootSchemaBackendOnce that recursively calls itself, leaving the existing
recovery logic in bootSchemaBackend unchanged. Update the remaining
bootSchemaBackendOnce options type to include "globalSettingsDir", since its
implementation accesses options.globalSettingsDir.
- Around line 473-480: Update the FNXC comment above
resolveEmbeddedMaxConnections in the startup configuration to describe the
actual platform-aware defaults and embeddedPostgresMaxConnections override,
removing the stale claim that the ceiling is raised to 250. Keep the documented
values and behavior aligned with resolveEmbeddedMaxConnections.
In `@packages/core/src/store.ts`:
- Around line 1447-1457: The FNXC comment lacks the identifiers needed to
describe the escape hatch accurately. Restore the original symbol names in the
prose for the permanently stuck status, the target transition status, the
clearing command pair, and the related registration comments, while preserving
the existing FNXC prefix, timestamp, access restrictions, audit requirement, and
concise wording.
- Around line 1483-1497: Update resumeWorkflowStep’s target lookup to restrict
matches to results in the pre-merge phase, using the same phase criterion as
findPendingPreMergeStep. Ensure post-merge results are not resumable, while
preserving the existing not-found and pending-status validation for eligible
pre-merge steps.
---
Outside diff comments:
In `@packages/core/src/postgres/sqlite-migrator.ts`:
- Around line 891-930: Wrap the entire post-copy phase, including
buildMigrationPlan and migrateLegacyProjectPluginRowsOnSession, in its own
savepoint and roll back to it when the phase fails before re-enabling
foreign-key enforcement. Update the catch log to describe post-copy/planning
failures rather than only plugin migration, and soften the comment before the
failed-status UPDATE to avoid claiming it always succeeds; preserve copyError so
the original failure is rethrown without being masked.
---
Nitpick comments:
In `@packages/core/src/task-merge.ts`:
- Around line 326-347: The exported findPendingPreMergeStep helper is unused by
production code. Wire it into resumeWorkflowStep as the fallback step lookup
when stepId is omitted, preserving explicit stepId behavior; otherwise remove
the helper and its merge-bypass tests.
In `@packages/engine/src/__tests__/max-tokens-overflow-recovery.test.ts`:
- Around line 70-102: Remove the entire “safety calculation” describe block from
max-tokens-overflow-recovery.test.ts, including its safeMaxTokens arithmetic
tests and references to MAX_TOKENS_OVERFLOW_SAFETY_MARGIN. Keep tests for the
current direct session-compaction recovery behavior unchanged.
- Around line 10-41: Export the production overflow regex constant from pi.ts,
then remove the locally duplicated MAX_TOKENS_OVERFLOW_EXACT_PATTERN in
max-tokens-overflow-recovery.test.ts and import the exported symbol instead.
Keep the existing pattern-matching assertions unchanged so they exercise the
real production pattern.
In `@packages/engine/src/merger-ai.ts`:
- Around line 1175-1231: Extract the repeated demotion workflow from the
no-commits branch in the finalize flow into a shared helper, such as
demoteToTodoWithReason, that performs updateTask, logEntry, audit.database,
moveTask with preserved progress, and returns the standard result. Reuse this
helper in the ai-empty-merge, no-landed-proof, executor-veto, and
landWorkspaceTask guards, preserving each guard’s reason, metadata, lane, and
return semantics.
In `@packages/engine/src/pi.ts`:
- Around line 467-500: Extract the duplicated MAX_TOKENS_OVERFLOW_EXACT_PATTERN
parsing and warning logic from both promptWithFallback copies into a shared
logProviderOverflowIfMatched(errorMessage: string) helper near the regex
constant. Replace each inline overflowMatch block with a call to this helper,
preserving the existing warning details and behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 7ef28c6f-8fc1-4868-9c60-85138bc7318b
⛔ Files ignored due to path filters (1)
pnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (381)
.changeset/FN-8357-quality-verification-videos.md.changeset/FN-8399-migration-status-dashboard.md.changeset/FN-8436-planning-no-reconnecting-hint.md.changeset/aiwo-039-integration-branch-cli-setting.md.changeset/aiwo-040-merge-settings-whitelist.md.changeset/aiwo-041-merge-integration-worktree-cli-setting.md.changeset/beta-notes-scoped-per-beta.md.changeset/beta-stable-release-channels.md.changeset/binary-release-bidi-windows-channel.md.changeset/board-header-active-chrome-count.md.changeset/bump-pi-0-81-1.md.changeset/calm-review-recovery.md.changeset/calm-tasks-reuse-parent-intent.md.changeset/ce-turn-admission-json-parse.md.changeset/chat-codebase-accuracy-guidance.md.changeset/chat-jump-to-latest-active-transform.md.changeset/clear-orphaned-pending-step-results.md.changeset/cross-parent-diagnostic-file-path-claims.md.changeset/cutover-delete-fn-review-step.md.changeset/dashboard-custom-columns.md.changeset/dynamic-plugin-route-dispatch.md.changeset/embedded-pg-crash-recovery-2411.md.changeset/embedded-postgres-connection-cap.md.changeset/exempt-task-prompt-write-approval.md.changeset/fix-builtin-workflow-lifecycle.md.changeset/fix-chat-freeform-task-create.md.changeset/fix-chat-mailbox-nul-byte-sanitize.md.changeset/fix-claude-usage-login-timeout.md.changeset/fix-codex-weekly-usage-label.md.changeset/fix-completion-summary-contract.md.changeset/fix-extension-taskstore-postmaster-port.md.changeset/fix-fn-8064-proactive-step-chat.md.changeset/fix-github-discussions-force-mode.md.changeset/fix-max-tokens-overflow-recovery-direct-compaction.md.changeset/fix-mobile-planning-start.md.changeset/fix-no-merge-workflow-completion.md.changeset/fix-no-selection-default-workflow-drift.md.changeset/fix-parallel-step-completion-order.md.changeset/fix-planning-ai-start.md.changeset/fix-planning-complete-reopen.md.changeset/fix-planning-mobile-selection-comment.md.changeset/fix-planning-refinement-action.md.changeset/fix-planning-session-timers.md.changeset/fix-planning-stop-resume.md.changeset/fix-planning-task-creation-handoff.md.changeset/fix-pooled-worktree-ownership.md.changeset/fix-postgres-activity-lifecycle.md.changeset/fix-postgres-startup-migration-deadlock.md.changeset/fix-settings-beta-update-check.md.changeset/fix-task-card-overseer-cache.md.changeset/fix-task-done-summary-prose.md.changeset/fix-triage-prompt-writer-tools.md.changeset/fix-windows-update-ce-assets.md.changeset/fix-zh-cn-roadmap-duplicate.md.changeset/fn-8255-card-eye-inherited-default-oversight.md.changeset/fn-8258-pg-quarantine.md.changeset/fn-8260-planning-truncated-completion.md.changeset/fn-8262-omp-model-routing.md.changeset/fn-8263-session-advisor-detail-eye.md.changeset/fn-8265-task-follow-up-policy.md.changeset/fn-8269-fff-tokens.md.changeset/fn-8273-mission-auto-merge.md.changeset/fn-8275-mission-merge-summary.md.changeset/fn-8276-unify-board-magnetism.md.changeset/fn-8277-agentic-reports.md.changeset/fn-8282-config-versioning.md.changeset/fn-8283-org-bundle.md.changeset/fn-8286-review-artifacts.md.changeset/fn-8287-task-detail-button-sizes.md.changeset/fn-8288-native-structure-preview.md.changeset/fn-8289-feature-video.md.changeset/fn-8291-chat-native-structure-inline-preview.md.changeset/fn-8292-mail-native-structure-embeds.md.changeset/fn-8293-mail-drag-compose-chat.md.changeset/fn-8294-mission-engine-tools.md.changeset/fn-8295-ideation-diverge-converge.md.changeset/fn-8296-feature.md.changeset/fn-8297-research-mission-bridge.md.changeset/fn-8301-pwa-auth-recovery.md.changeset/fn-8304-issue-form-translation.md.changeset/fn-8306-mission-symbol-scheduler-admission.md.changeset/fn-8307-heartbeat-mission-guard.md.changeset/fn-8308-report-discussions.md.changeset/fn-8309-report-capture.md.changeset/fn-8310-public-roadmap-dedupe.md.changeset/fn-8311-report-context.md.changeset/fn-8317-report-context.md.changeset/fn-8324-card-cost-promote.md.changeset/fn-8326-roadmap-report-dedup.md.changeset/fn-8327-discussion-fallback.md.changeset/fn-8331-planning-interview.md.changeset/fn-8332-planning-reload-resume.md.changeset/fn-8339-chat-scroll-follow.md.changeset/fn-8341-deepening-checkpoint-removal.md.changeset/fn-8341-planning-reactive-backend.md.changeset/fn-8344-planner-chat-scroll-follow.md.changeset/fn-8345-workflow-live-log-scroll.md.changeset/fn-8346-live-tail-scroll-follow.md.changeset/fn-8350-config-versions-settings.md.changeset/fn-8351-org-portability-team-tab.md.changeset/fn-8352-ideation-top-level-view.md.changeset/fn-8355-mobile-model-dropdown-scroll.md.changeset/fn-8356-stale-duplicate-decision.md.changeset/fn-8358-roadmap-item-native-structure-preview.md.changeset/fn-8364-session-token-deltas.md.changeset/fn-8369-github-import-dedup.md.changeset/fn-8372-html2canvas.md.changeset/fn-8395-settings-autosave.md.changeset/fn-8396-task-detail-tablet-icon-size.md.changeset/fn-8397-chat-pin-separation-and-edit-save.md.changeset/fn-8398-compound-engineering-nav.md.changeset/fn-8400-planning-mode-ui.md.changeset/fn-8400-worktree-recovery.md.changeset/fn-8401-same-agent-intake.md.changeset/fn-8406-report-home-zindex.md.changeset/fn-8409-chat-coding-tools.md.changeset/fn-8411-configversions-i18n.md.changeset/fn-8413-pi-claude-cli-acp-sdk-dep.md.changeset/fn-8414-mission-interview-thinking-level-bind.md.changeset/fn-8415-report-file-activity-trace-scrub.md.changeset/fn-8418-whatsapp-settings-pairing.md.changeset/fn-8419-rekey-partition-merge.md.changeset/fn-8420-planning-mode-user-validation.md.changeset/fn-8421-task-detail-tablet-control-heights.md.changeset/fn-8422-mcp-bridge.md.changeset/fn-8423-duplicate-agent-badge.md.changeset/fn-8424-cli-chat-reply-routing.md.changeset/fn-8425-cli-chat-conversation.md.changeset/fn-8426-planning-mobile-tablet-layout.md.changeset/fn-8426-question-tool-wait.md.changeset/fn-8427-planning-mobile-session-list-nav.md.changeset/fn-8430-tui-log-timestamps.md.changeset/fn-8431-report-menu-background.md.changeset/fn-8432-planning-tablet-mobile-plan-layout.md.changeset/fn-8434-running-plan-content.md.changeset/fn-8437-planning-leave-return-restore.md.changeset/fn-8438-running-plan-generate-refine.md.changeset/fn-8439-planning-prompt-triage-template.md.changeset/fn-8440-persist-duplicate-decision.md.changeset/fn-8441-separate-plan-from-prompt.md.changeset/fn-8442-planning-sequential-qa.md.changeset/fn-8443-chat-plugin-skill-paths.md.changeset/fn-8444-planning-time-cost.md.changeset/fn-8445-planning-compact-switcher-top.md.changeset/fn-8446-oauth-relogin-dismiss-sticky.md.changeset/fn-8448-github-import-back-to-issue-list.md.changeset/fn-8449-planning-history-thinking.md.changeset/fn-8452-update-unknown-flags.md.changeset/fn-8453-unified-concurrency.md.changeset/fn-8454-aurora-theme.md.changeset/fn-8455-calm-theme.md.changeset/fn-8456-dawn-theme.md.changeset/fn-8461-skill-load-warning.md.changeset/fn-8462-legacy-adoption-drained-marker.md.changeset/fn-8463-file-scope-root-extensions.md.changeset/fn-8464-baseline-cwd.md.changeset/fn-8465-legacy-skill-toggle-path-match.md.changeset/fn-8466-skill-path-read-boundary.md.changeset/fn-8467-plugin-enable-state-consistency.md.changeset/fn-8468-plugin-single-onload.md.changeset/fn-8469-workflow-definition-id-allocator.md.changeset/fn-8471-theme-filter.md.changeset/fn-8472-ideas-column-indicator.md.changeset/fn-8474-tablet-task-popup-gutter.md.changeset/fn-8475-planning-status-badge.md.changeset/fn-8476-coding-ideas-move.md.changeset/fn-8477-planning-model-marker.md.changeset/fn-8480-remove-column-header-descriptions.md.changeset/fn-8481-ideas-github-tracking.md.changeset/fn-8482-merging-badge.md.changeset/fn-8489-mobile-column-settle.md.changeset/fn-8490-step-execute-skill.md.changeset/fn-8492-mobile-task-footer-single-row.md.changeset/fn-8493-revising-status-badge.md.changeset/fn-8494-replan-active-glow.md.changeset/fn-8496-mobile-column-settle-residual.md.changeset/fn-8498-quick-add-start-menu.md.changeset/fn-8499-macos-postgres-libicu.md.changeset/fn-8500-xiaomi-provider-icon.md.changeset/fn-8501-mobile-footer-alignment.md.changeset/fn-8502-chat-quick-add-attachments.md.changeset/fn-8503-unbounded-code-review-retries.md.changeset/fn-8504-chat-reentry-state.md.changeset/fn-8505-task-wedge-notifications.md.changeset/fn-8509-coding-ideas-start-todo.md.changeset/fn-8520-runtime-sidebar.md.changeset/fn-8521-separate-plugin-install-toggle.md.changeset/fn-8522-windows-embedded-postgres-recovery.md.changeset/fn-8523-skip-completed-sqlite-rescan.md.changeset/fn-8526-workflow-column-descriptions.md.changeset/fn-8527-themed-stats-link.md.changeset/fn-8529-planning-comments.md.changeset/fn-8533-mobile-planning-comments.md.changeset/fn-8534-planning-workflow-model.md.changeset/fn-8536-planning-retry.md.changeset/fn-8537-mobile-planning-actions.md.changeset/fn-8538-planning-prompt.md.changeset/fn-8539-option-driven-planning.md.changeset/fn-8540-mission-show-hierarchy.md.changeset/fn-8541-validator-diagnostics.md.changeset/fn-8542-feature-validation-scope.md.changeset/fn-8543-bounded-fix-lineage.md.changeset/fn-8544-mission-autonomy-audit.md.changeset/fn-8545-mission-admission.md.changeset/fn-8546-ideation-candidate-ids.md.changeset/fn-8547-local-provider-onboarding.md.changeset/fn-8548-mobile-github-import-actions.md.changeset/fn-8551-agent-heartbeat-controls.md.changeset/fn-8552-heartbeat-disabled-option.md.changeset/fn-991-archived-mission-reconciliation.md.changeset/fn-windows-embedded-pg-connection-default.md.changeset/fx-004-task-document-cas.md.changeset/fx-005-archived-document-publication.md.changeset/github-report-screenshot-embed.md.changeset/grok-fallback-no-preempt.md.changeset/grok-process-lifecycle-owner.md.changeset/guard-empty-implementation-plans.md.changeset/improve-planning-refinement-menu.md.changeset/improve-sequential-planning-workspace.md.changeset/install-agent-browser-windows.md.changeset/ir-driven-lifecycle-cutover.md.changeset/isolate-provider-rate-limit-pauses.md.changeset/kb-002-push-after-merge-stranded.md.changeset/legacy-adoption-and-ir-pin.md.changeset/legacy-adoption-live-status-stomp.md.changeset/live-gate-running-count.md.changeset/mcp-bootstrap-resilience.md.changeset/merge-review-blockers-survive-rebuilds.md.changeset/mobile-board-pointercancel-settle.md.changeset/omp-process-lifecycle-owner.md.changeset/ordered-step-starts.md.changeset/orphaned-pending-rewrite-to-failed.md.changeset/plan-review-missing-artifact.md.changeset/plan-review-root-lease-cleanup.md.changeset/planning-deleted-task-recreate.md.changeset/planning-initial-plan-one-shot.md.changeset/planning-initial-plan-refresh.md.changeset/planning-multi-task-per-plan.md.changeset/planning-provider-error-no-hang.md.changeset/planning-regenerate-question-on-refine.md.changeset/planning-session-complete-after-task-create.md.changeset/planning-session-loading-state.md.changeset/planning-stop-pending-initial-turn.md.changeset/planning-thinking-all-steps.md.changeset/planning-turn-admission.md.changeset/planning-turn-sync.md.changeset/planning-validated-plan-never-dead-end.md.changeset/plugin-mcp-servers.md.changeset/polish-planning-markdown-review.md.changeset/postgres-health-false-corruption.md.changeset/pre.json.changeset/preserve-needs-replan-adoption.md.changeset/prevent-cross-parent-diagnostic-duplicates.md.changeset/project-switch-modal-reset.md.changeset/project-workflow-model-lanes.md.changeset/quickentry-agent-outside-click.md.changeset/quiet-tasks-stop-before-todo.md.changeset/quiet-triage-recovery.md.changeset/read-sqlite-migration-health.md.changeset/report-screenshot-artifacts.md.changeset/respect-user-paused-dispatch.md.changeset/restore-mission-validation-recovery.md.changeset/retry-returned-planning-streams.md.changeset/safe-test-database.md.changeset/single-flight-anthropic-refresh.md.changeset/single-github-progress-update.md.changeset/six-column-merge-boundary.md.changeset/step-narration-one-based.md.changeset/sync-heartbeat-locale-parity.md.changeset/task-card-popup-deep-tabs.md.changeset/task-chat-new-command-guard.md.changeset/task-stats-provenance-section.md.changeset/task-verification-status-placement.md.changeset/terminal-autostart-server-platform.md.changeset/terminal-manual-start-and-single-paste.md.changeset/theme-token-contract.md.changeset/tidy-planning-questions.md.changeset/track-task-planning-lineage.md.changeset/truthful-workflow-lifecycle.md.changeset/uncap-planning-refinement-categories.md.changeset/use-planning-session-back.md.changeset/workflow-review-followups.mdCHANGELOG-archive.mdCHANGELOG.mddocs/cli-reference.mddocs/infra/push-access-blocker-decision.mddocs/integration-branch-cli-setting.mdpackage.jsonpackages/cli-alias/CHANGELOG.mdpackages/cli-alias/package.jsonpackages/cli/CHANGELOG.mdpackages/cli/package.jsonpackages/cli/skill/fusion/SKILL.mdpackages/cli/skill/fusion/references/extension-tools.mdpackages/cli/skill/fusion/references/fusion-capabilities.mdpackages/cli/src/__tests__/extension.test.tspackages/cli/src/commands/__tests__/settings.test.tspackages/cli/src/commands/dashboard.tspackages/cli/src/commands/settings.tspackages/cli/src/extension.tspackages/core/CHANGELOG.mdpackages/core/package.jsonpackages/core/src/__tests__/store-resume-step.test.tspackages/core/src/__tests__/task-merge-bypass.test.tspackages/core/src/index.tspackages/core/src/postgres/embedded-lifecycle.tspackages/core/src/postgres/plugin-schema-hook.tspackages/core/src/postgres/sqlite-migrator.tspackages/core/src/postgres/startup-factory.tspackages/core/src/store.tspackages/core/src/task-merge.tspackages/core/src/types/workflow-steps.tspackages/dashboard/CHANGELOG.mdpackages/dashboard/package.jsonpackages/desktop/CHANGELOG.mdpackages/desktop/package.jsonpackages/droid-cli/CHANGELOG.mdpackages/droid-cli/package.jsonpackages/engine/CHANGELOG.mdpackages/engine/package.jsonpackages/engine/src/__tests__/max-tokens-overflow-recovery.test.tspackages/engine/src/__tests__/merge-dependency-sync-lockfile-heal.test.tspackages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.tspackages/engine/src/__tests__/merger-ai.test.tspackages/engine/src/merge-dependency-sync.tspackages/engine/src/merger-ai.tspackages/engine/src/pi.tspackages/i18n/CHANGELOG.mdpackages/i18n/package.jsonpackages/mobile/CHANGELOG.mdpackages/mobile/package.jsonpackages/pi-claude-cli/CHANGELOG.mdpackages/pi-claude-cli/package.jsonpackages/plugin-sdk/CHANGELOG.mdpackages/plugin-sdk/package.jsonplugins/examples/fusion-plugin-auto-label/CHANGELOG.mdplugins/examples/fusion-plugin-auto-label/package.jsonplugins/examples/fusion-plugin-ci-status/CHANGELOG.mdplugins/examples/fusion-plugin-ci-status/package.jsonplugins/examples/fusion-plugin-notification/CHANGELOG.mdplugins/examples/fusion-plugin-notification/package.jsonplugins/examples/fusion-plugin-settings-demo/CHANGELOG.mdplugins/examples/fusion-plugin-settings-demo/package.jsonplugins/fusion-plugin-acp-runtime/CHANGELOG.mdplugins/fusion-plugin-acp-runtime/package.jsonplugins/fusion-plugin-agent-browser/CHANGELOG.mdplugins/fusion-plugin-agent-browser/package.jsonplugins/fusion-plugin-claude-runtime/CHANGELOG.mdplugins/fusion-plugin-claude-runtime/package.jsonplugins/fusion-plugin-cli-printing-press/CHANGELOG.mdplugins/fusion-plugin-cli-printing-press/package.jsonplugins/fusion-plugin-compound-engineering/CHANGELOG.mdplugins/fusion-plugin-compound-engineering/package.jsonplugins/fusion-plugin-cursor-runtime/CHANGELOG.mdplugins/fusion-plugin-cursor-runtime/package.jsonplugins/fusion-plugin-dependency-graph/CHANGELOG.mdplugins/fusion-plugin-dependency-graph/package.jsonplugins/fusion-plugin-droid-runtime/CHANGELOG.mdplugins/fusion-plugin-droid-runtime/package.jsonplugins/fusion-plugin-even-realities-glasses/CHANGELOG.mdplugins/fusion-plugin-even-realities-glasses/package.jsonplugins/fusion-plugin-grok-runtime/CHANGELOG.mdplugins/fusion-plugin-grok-runtime/package.jsonplugins/fusion-plugin-hermes-runtime/CHANGELOG.mdplugins/fusion-plugin-hermes-runtime/package.jsonplugins/fusion-plugin-linear-import/CHANGELOG.mdplugins/fusion-plugin-linear-import/package.jsonplugins/fusion-plugin-omp-runtime/CHANGELOG.mdplugins/fusion-plugin-omp-runtime/package.jsonplugins/fusion-plugin-openclaw-runtime/CHANGELOG.mdplugins/fusion-plugin-openclaw-runtime/package.jsonplugins/fusion-plugin-paperclip-runtime/CHANGELOG.mdplugins/fusion-plugin-paperclip-runtime/package.jsonplugins/fusion-plugin-quality/CHANGELOG.mdplugins/fusion-plugin-quality/package.jsonplugins/fusion-plugin-reports/CHANGELOG.mdplugins/fusion-plugin-reports/package.jsonplugins/fusion-plugin-roadmap/CHANGELOG.mdplugins/fusion-plugin-roadmap/package.jsonplugins/fusion-plugin-whatsapp-chat/CHANGELOG.mdplugins/fusion-plugin-whatsapp-chat/package.json
💤 Files with no reviewable changes (278)
- .changeset/beta-stable-release-channels.md
- .changeset/clear-orphaned-pending-step-results.md
- .changeset/fix-postgres-activity-lifecycle.md
- .changeset/fix-task-card-overseer-cache.md
- .changeset/fn-8283-org-bundle.md
- .changeset/fn-8293-mail-drag-compose-chat.md
- .changeset/fn-8306-mission-symbol-scheduler-admission.md
- .changeset/fn-8310-public-roadmap-dedupe.md
- .changeset/fn-8341-deepening-checkpoint-removal.md
- .changeset/fn-8350-config-versions-settings.md
- .changeset/fn-8372-html2canvas.md
- .changeset/fn-8397-chat-pin-separation-and-edit-save.md
- .changeset/fn-8400-planning-mode-ui.md
- .changeset/fn-8409-chat-coding-tools.md
- .changeset/fn-8413-pi-claude-cli-acp-sdk-dep.md
- .changeset/fn-8432-planning-tablet-mobile-plan-layout.md
- .changeset/fn-8439-planning-prompt-triage-template.md
- .changeset/fn-8440-persist-duplicate-decision.md
- .changeset/fn-8441-separate-plan-from-prompt.md
- .changeset/fn-8446-oauth-relogin-dismiss-sticky.md
- .changeset/fn-8449-planning-history-thinking.md
- .changeset/fn-8456-dawn-theme.md
- .changeset/fn-8471-theme-filter.md
- .changeset/fn-8475-planning-status-badge.md
- .changeset/fn-8496-mobile-column-settle-residual.md
- .changeset/fn-8509-coding-ideas-start-todo.md
- .changeset/fn-8529-planning-comments.md
- .changeset/fn-8536-planning-retry.md
- .changeset/fn-8538-planning-prompt.md
- .changeset/fn-8541-validator-diagnostics.md
- .changeset/fn-8542-feature-validation-scope.md
- .changeset/fn-8545-mission-admission.md
- .changeset/fn-991-archived-mission-reconciliation.md
- .changeset/github-report-screenshot-embed.md
- .changeset/plugin-mcp-servers.md
- .changeset/polish-planning-markdown-review.md
- .changeset/quickentry-agent-outside-click.md
- .changeset/fn-8504-chat-reentry-state.md
- .changeset/fn-8422-mcp-bridge.md
- .changeset/FN-8357-quality-verification-videos.md
- .changeset/FN-8399-migration-status-dashboard.md
- .changeset/board-header-active-chrome-count.md
- .changeset/cutover-delete-fn-review-step.md
- .changeset/fix-mobile-planning-start.md
- .changeset/fix-planning-task-creation-handoff.md
- .changeset/fix-planning-session-timers.md
- .changeset/fix-chat-mailbox-nul-byte-sanitize.md
- .changeset/fix-no-merge-workflow-completion.md
- .changeset/fix-github-discussions-force-mode.md
- .changeset/fix-parallel-step-completion-order.md
- .changeset/fn-8258-pg-quarantine.md
- .changeset/fn-8255-card-eye-inherited-default-oversight.md
- .changeset/fn-8275-mission-merge-summary.md
- .changeset/fix-task-done-summary-prose.md
- .changeset/fn-8269-fff-tokens.md
- .changeset/fn-8276-unify-board-magnetism.md
- .changeset/fn-8273-mission-auto-merge.md
- .changeset/fn-8265-task-follow-up-policy.md
- .changeset/fn-8294-mission-engine-tools.md
- .changeset/fn-8288-native-structure-preview.md
- .changeset/fn-8289-feature-video.md
- .changeset/fn-8296-feature.md
- .changeset/fn-8307-heartbeat-mission-guard.md
- .changeset/fn-8308-report-discussions.md
- .changeset/fn-8311-report-context.md
- .changeset/fn-8326-roadmap-report-dedup.md
- .changeset/fn-8332-planning-reload-resume.md
- .changeset/fn-8339-chat-scroll-follow.md
- .changeset/fn-8341-planning-reactive-backend.md
- .changeset/fn-8344-planner-chat-scroll-follow.md
- .changeset/fn-8356-stale-duplicate-decision.md
- .changeset/fn-8395-settings-autosave.md
- .changeset/fn-8398-compound-engineering-nav.md
- .changeset/fn-8401-same-agent-intake.md
- .changeset/fn-8415-report-file-activity-trace-scrub.md
- .changeset/fn-8423-duplicate-agent-badge.md
- .changeset/fn-8430-tui-log-timestamps.md
- .changeset/fn-8434-running-plan-content.md
- .changeset/fn-8438-running-plan-generate-refine.md
- .changeset/fn-8442-planning-sequential-qa.md
- .changeset/fn-8454-aurora-theme.md
- .changeset/fn-8464-baseline-cwd.md
- .changeset/fn-8499-macos-postgres-libicu.md
- .changeset/fn-8501-mobile-footer-alignment.md
- .changeset/fn-8503-unbounded-code-review-retries.md
- .changeset/fn-8522-windows-embedded-postgres-recovery.md
- .changeset/fn-8534-planning-workflow-model.md
- .changeset/fn-8537-mobile-planning-actions.md
- .changeset/fn-8539-option-driven-planning.md
- .changeset/fn-8543-bounded-fix-lineage.md
- .changeset/fn-8544-mission-autonomy-audit.md
- .changeset/fn-8547-local-provider-onboarding.md
- .changeset/fn-windows-embedded-pg-connection-default.md
- .changeset/fx-005-archived-document-publication.md
- .changeset/guard-empty-implementation-plans.md
- .changeset/improve-sequential-planning-workspace.md
- .changeset/ir-driven-lifecycle-cutover.md
- .changeset/plan-review-missing-artifact.md
- .changeset/planning-thinking-all-steps.md
- .changeset/postgres-health-false-corruption.md
- .changeset/safe-test-database.md
- .changeset/single-github-progress-update.md
- .changeset/fix-zh-cn-roadmap-duplicate.md
- .changeset/uncap-planning-refinement-categories.md
- .changeset/isolate-provider-rate-limit-pauses.md
- .changeset/fn-8396-task-detail-tablet-icon-size.md
- .changeset/fn-8448-github-import-back-to-issue-list.md
- .changeset/planning-deleted-task-recreate.md
- .changeset/fn-8482-merging-badge.md
- .changeset/task-verification-status-placement.md
- .changeset/planning-turn-admission.md
- .changeset/fn-8502-chat-quick-add-attachments.md
- .changeset/fn-8468-plugin-single-onload.md
- .changeset/fx-004-task-document-cas.md
- .changeset/calm-review-recovery.md
- .changeset/fn-8520-runtime-sidebar.md
- .changeset/fn-8455-calm-theme.md
- .changeset/fn-8462-legacy-adoption-drained-marker.md
- .changeset/quiet-tasks-stop-before-todo.md
- .changeset/planning-turn-sync.md
- .changeset/fn-8292-mail-native-structure-embeds.md
- .changeset/fn-8477-planning-model-marker.md
- .changeset/fn-8421-task-detail-tablet-control-heights.md
- .changeset/fn-8480-remove-column-header-descriptions.md
- .changeset/fn-8465-legacy-skill-toggle-path-match.md
- .changeset/fn-8551-agent-heartbeat-controls.md
- .changeset/fn-8494-replan-active-glow.md
- .changeset/fn-8352-ideation-top-level-view.md
- .changeset/respect-user-paused-dispatch.md
- .changeset/planning-validated-plan-never-dead-end.md
- .changeset/fn-8426-planning-mobile-tablet-layout.md
- .changeset/fn-8425-cli-chat-conversation.md
- .changeset/fn-8419-rekey-partition-merge.md
- .changeset/fn-8452-update-unknown-flags.md
- .changeset/quiet-triage-recovery.md
- .changeset/kb-002-push-after-merge-stranded.md
- .changeset/fn-8263-session-advisor-detail-eye.md
- .changeset/prevent-cross-parent-diagnostic-duplicates.md
- .changeset/fn-8426-question-tool-wait.md
- .changeset/terminal-manual-start-and-single-paste.md
- .changeset/fn-8331-planning-interview.md
- .changeset/fn-8309-report-capture.md
- .changeset/fn-8548-mobile-github-import-actions.md
- .changeset/omp-process-lifecycle-owner.md
- .changeset/beta-notes-scoped-per-beta.md
- .changeset/fix-claude-usage-login-timeout.md
- .changeset/fn-8369-github-import-dedup.md
- .changeset/fn-8500-xiaomi-provider-icon.md
- .changeset/report-screenshot-artifacts.md
- .changeset/embedded-postgres-connection-cap.md
- .changeset/fn-8467-plugin-enable-state-consistency.md
- .changeset/ordered-step-starts.md
- .changeset/terminal-autostart-server-platform.md
- .changeset/fn-8492-mobile-task-footer-single-row.md
- .changeset/read-sqlite-migration-health.md
- .changeset/calm-tasks-reuse-parent-intent.md
- .changeset/fn-8505-task-wedge-notifications.md
- .changeset/task-card-popup-deep-tabs.md
- .changeset/plan-review-root-lease-cleanup.md
- .changeset/fn-8523-skip-completed-sqlite-rescan.md
- .changeset/sync-heartbeat-locale-parity.md
- .changeset/fn-8489-mobile-column-settle.md
- .changeset/fn-8400-worktree-recovery.md
- .changeset/track-task-planning-lineage.md
- .changeset/planning-session-complete-after-task-create.md
- .changeset/preserve-needs-replan-adoption.md
- .changeset/six-column-merge-boundary.md
- .changeset/fn-8540-mission-show-hierarchy.md
- .changeset/fn-8526-workflow-column-descriptions.md
- .changeset/fn-8498-quick-add-start-menu.md
- .changeset/task-stats-provenance-section.md
- .changeset/fn-8317-report-context.md
- .changeset/fn-8527-themed-stats-link.md
- .changeset/fn-8472-ideas-column-indicator.md
- .changeset/project-switch-modal-reset.md
- .changeset/binary-release-bidi-windows-channel.md
- .changeset/bump-pi-0-81-1.md
- .changeset/chat-codebase-accuracy-guidance.md
- .changeset/dashboard-custom-columns.md
- .changeset/chat-jump-to-latest-active-transform.md
- .changeset/fix-codex-weekly-usage-label.md
- .changeset/fix-planning-ai-start.md
- .changeset/fix-postgres-startup-migration-deadlock.md
- .changeset/fix-planning-refinement-action.md
- .changeset/fn-8260-planning-truncated-completion.md
- .changeset/fix-planning-complete-reopen.md
- .changeset/fix-windows-update-ce-assets.md
- .changeset/fn-8282-config-versioning.md
- .changeset/fn-8287-task-detail-button-sizes.md
- .changeset/fix-triage-prompt-writer-tools.md
- .changeset/fn-8286-review-artifacts.md
- .changeset/fn-8277-agentic-reports.md
- .changeset/fn-8291-chat-native-structure-inline-preview.md
- .changeset/fn-8295-ideation-diverge-converge.md
- .changeset/fn-8301-pwa-auth-recovery.md
- .changeset/fn-8324-card-cost-promote.md
- .changeset/fn-8327-discussion-fallback.md
- .changeset/fn-8355-mobile-model-dropdown-scroll.md
- .changeset/fn-8411-configversions-i18n.md
- .changeset/fn-8414-mission-interview-thinking-level-bind.md
- .changeset/fn-8424-cli-chat-reply-routing.md
- .changeset/fn-8444-planning-time-cost.md
- .changeset/fn-8461-skill-load-warning.md
- .changeset/fn-8481-ideas-github-tracking.md
- .changeset/fn-8490-step-execute-skill.md
- .changeset/fn-8546-ideation-candidate-ids.md
- .changeset/grok-fallback-no-preempt.md
- .changeset/legacy-adoption-and-ir-pin.md
- .changeset/legacy-adoption-live-status-stomp.md
- .changeset/planning-initial-plan-one-shot.md
- .changeset/planning-stop-pending-initial-turn.md
- .changeset/improve-planning-refinement-menu.md
- .changeset/planning-session-loading-state.md
- .changeset/orphaned-pending-rewrite-to-failed.md
- .changeset/grok-process-lifecycle-owner.md
- .changeset/live-gate-running-count.md
- .changeset/mcp-bootstrap-resilience.md
- .changeset/fn-8552-heartbeat-disabled-option.md
- .changeset/pre.json
- .changeset/truthful-workflow-lifecycle.md
- .changeset/planning-regenerate-question-on-refine.md
- .changeset/fix-planning-stop-resume.md
- .changeset/fix-fn-8064-proactive-step-chat.md
- .changeset/merge-review-blockers-survive-rebuilds.md
- .changeset/fix-chat-freeform-task-create.md
- .changeset/project-workflow-model-lanes.md
- .changeset/fn-8474-tablet-task-popup-gutter.md
- .changeset/fn-8427-planning-mobile-session-list-nav.md
- .changeset/step-narration-one-based.md
- .changeset/mobile-board-pointercancel-settle.md
- .changeset/fn-8297-research-mission-bridge.md
- .changeset/fn-8476-coding-ideas-move.md
- .changeset/restore-mission-validation-recovery.md
- .changeset/fix-settings-beta-update-check.md
- .changeset/planning-multi-task-per-plan.md
- .changeset/fix-completion-summary-contract.md
- .changeset/fn-8443-chat-plugin-skill-paths.md
- .changeset/fix-no-selection-default-workflow-drift.md
- .changeset/fn-8346-live-tail-scroll-follow.md
- .changeset/fn-8364-session-token-deltas.md
- .changeset/ce-turn-admission-json-parse.md
- .changeset/planning-initial-plan-refresh.md
- .changeset/fn-8453-unified-concurrency.md
- .changeset/exempt-task-prompt-write-approval.md
- .changeset/fn-8358-roadmap-item-native-structure-preview.md
- .changeset/retry-returned-planning-streams.md
- .changeset/fn-8351-org-portability-team-tab.md
- .changeset/FN-8436-planning-no-reconnecting-hint.md
- .changeset/workflow-review-followups.md
- .changeset/fix-extension-taskstore-postmaster-port.md
- .changeset/fn-8262-omp-model-routing.md
- .changeset/fn-8418-whatsapp-settings-pairing.md
- .changeset/fix-pooled-worktree-ownership.md
- .changeset/fn-8445-planning-compact-switcher-top.md
- .changeset/fn-8406-report-home-zindex.md
- .changeset/fn-8533-mobile-planning-comments.md
- .changeset/fn-8463-file-scope-root-extensions.md
- .changeset/fn-8420-planning-mode-user-validation.md
- .changeset/fn-8521-separate-plugin-install-toggle.md
- .changeset/tidy-planning-questions.md
- .changeset/fn-8431-report-menu-background.md
- .changeset/planning-provider-error-no-hang.md
- .changeset/single-flight-anthropic-refresh.md
- .changeset/fn-8345-workflow-live-log-scroll.md
- .changeset/fn-8469-workflow-definition-id-allocator.md
- .changeset/dynamic-plugin-route-dispatch.md
- .changeset/embedded-pg-crash-recovery-2411.md
- .changeset/fn-8437-planning-leave-return-restore.md
- .changeset/install-agent-browser-windows.md
- .changeset/task-chat-new-command-guard.md
- .changeset/fn-8304-issue-form-translation.md
- .changeset/fn-8466-skill-path-read-boundary.md
- .changeset/fn-8493-revising-status-badge.md
- .changeset/use-planning-session-back.md
- .changeset/cross-parent-diagnostic-file-path-claims.md
- .changeset/theme-token-contract.md
- .changeset/fix-builtin-workflow-lifecycle.md
- .changeset/fix-planning-mobile-selection-comment.md
| void (async () => { | ||
| try { | ||
| const projects = await centralCoreForEngine.listProjects(); | ||
| // Skip cwd — its store is already injected at line 928. | ||
| const nonCwd = projects.filter((p) => p.path !== cwd); | ||
| for (const p of nonCwd) { | ||
| try { | ||
| const engine = engineManager.getEngine(p.id); | ||
| if (!engine) continue; | ||
| setHostTaskStore(p.path, engine.getTaskStore()); | ||
| } catch (err) { | ||
| const msg = err instanceof Error ? err.message : String(err); | ||
| logSink.warn(`Failed to warm extension store for ${p.name} (${p.path}): ${msg}`, "extension"); | ||
| } | ||
| } | ||
| if (nonCwd.length > 0) { | ||
| logSink.log(`Warmed extension host stores for ${nonCwd.length} project(s)`, "extension"); | ||
| } | ||
| } catch (err) { | ||
| const msg = err instanceof Error ? err.message : String(err); | ||
| logSink.warn(`Failed to list projects for store warmup: ${msg}`, "extension"); | ||
| } | ||
| })(); |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift
Do not race cache warmup with engine startup and shutdown.
startAll() is non-blocking, so getEngine() can be undefined during this one-shot loop; those projects are never warmed, yet the log reports all projects. The detached task can also reinsert a store after disposal clears the cache. Await/retry engine readiness, count actual warmed stores, and track/cancel the promise during teardown.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/cli/src/commands/dashboard.ts` around lines 2184 - 2206, Update the
detached store-warmup task around startAll() and the visible async IIFE so it
waits or retries until each project engine is ready before calling getEngine(),
counts only projects whose stores were actually passed to setHostTaskStore(),
and reports that count. Retain the warmup promise and cancel or await it during
engine teardown so it cannot repopulate the cache after disposal.
There was a problem hiding this comment.
Still valid; not patched this cycle (fix-action cap). Required change in packages/cli/src/commands/dashboard.ts ~2181–2210:
- Do not one-shot
getEngine()whilestartAll()is in flight — eitherawait engineManager.ensureEngine(p.id)(or a short readiness retry) per project beforesetHostTaskStore, or gate the loop on engines already present ingetAllEngines(). - Count only projects that successfully call
setHostTaskStoreand log that count (notnonCwd.length). - Hold the warmup promise on a local var; in the dispose path, set a cancelled flag and
await/ignorethe promise beforeengineManager.stopAll()/ cache clear so a late completion cannot reinsert a disposed store.
Correctness for non-cwd extension tools still depends on the engine's store; racing past a missing engine leaves those projects cold until first tool access falls through to createTaskStoreForBackend.
There was a problem hiding this comment.
@gsxdsm, acknowledged. The race remains unresolved in this PR and the follow-up should implement all three safeguards you listed: engine readiness, accurate successful-warmup accounting, and teardown coordination that prevents late cache repopulation.
Would you like me to open a GitHub follow-up issue with these acceptance criteria and links back to this PR discussion?
| CREATE INDEX IF NOT EXISTS "idxEvenRealitiesSeenTasksProjectUpdated" | ||
| ON project.even_realities_seen_tasks(project_id, updated_at, task_id); | ||
| ALTER TABLE project.even_realities_seen_tasks ENABLE ROW LEVEL SECURITY; | ||
| ALTER TABLE project.even_realities_seen_tasks FORCE ROW LEVEL SECURITY; | ||
| DROP POLICY IF EXISTS fusion_project_isolation ON project.even_realities_seen_tasks; | ||
| CREATE POLICY fusion_project_isolation ON project.even_realities_seen_tasks | ||
| USING (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true)) | ||
| WITH CHECK (current_setting('fusion.project_bypass', true) = 'on' OR project_id = current_setting('fusion.project_id', true)); | ||
| DO $even_realities_runtime$ | ||
| BEGIN | ||
| IF to_regprocedure('project.fusion_assign_project_id()') IS NOT NULL THEN | ||
| DROP TRIGGER IF EXISTS fusion_assign_project_id ON project.even_realities_seen_tasks; | ||
| CREATE TRIGGER fusion_assign_project_id | ||
| BEFORE INSERT OR UPDATE OF project_id ON project.even_realities_seen_tasks | ||
| FOR EACH ROW EXECUTE FUNCTION project.fusion_assign_project_id(); | ||
| END IF; | ||
| IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'fusion_runtime') THEN | ||
| GRANT SELECT, INSERT, UPDATE, DELETE ON project.even_realities_seen_tasks TO fusion_runtime; | ||
| END IF; | ||
| END | ||
| $even_realities_runtime$; |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Idempotent reconciliation statements were folded into one-shot first-boot guards. In the two hooks that have no out-of-guard convergence pass (no ensureProjectIndexes, no readiness/upgrade block), statements that are safe and cheap to re-run every boot now live inside IF to_regclass(...) IS NULL, so any database whose table already exists never receives them. The lock contention this PR targets comes from CREATE TABLE / ADD COLUMN, not from CREATE INDEX IF NOT EXISTS, ENABLE ROW LEVEL SECURITY, or GRANT on already-correct objects.
packages/core/src/postgres/plugin-schema-hook.ts#L581-L601: keep onlyCREATE TABLEinside theeven_realities_seen_tasksguard; move the index,ENABLE/FORCE ROW LEVEL SECURITY,fusion_project_isolationpolicy, trigger attach, andGRANT ... TO fusion_runtimeback outside it (individually guarded onpg_class.relrowsecurity/pg_policies/pg_triggeras needed).packages/core/src/postgres/plugin-schema-hook.ts#L535-L537: moveCREATE INDEX IF NOT EXISTS "idxWhatsAppDedupeRetention"out of thewhatsapp_chat_dedupecreation branch so existing tables missing the index still acquire it.
📍 Affects 1 file
packages/core/src/postgres/plugin-schema-hook.ts#L581-L601(this comment)packages/core/src/postgres/plugin-schema-hook.ts#L535-L537
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/core/src/postgres/plugin-schema-hook.ts` around lines 581 - 601, The
even_realities_seen_tasks reconciliation currently runs only during table
creation; keep only CREATE TABLE inside its guard, and move the index, RLS
settings, fusion_project_isolation policy, trigger attachment, and
fusion_runtime grant outside it with appropriate idempotent guards. In
packages/core/src/postgres/plugin-schema-hook.ts lines 581-601, update the
surrounding hook accordingly. Also move CREATE INDEX IF NOT EXISTS
idxWhatsAppDedupeRetention out of the whatsapp_chat_dedupe creation branch at
packages/core/src/postgres/plugin-schema-hook.ts lines 535-537 so existing
tables receive the index.
There was a problem hiding this comment.
Still valid; not patched this cycle (fix-action cap).
In plugin-schema-hook.ts:
even_realities_seen_tasks: keep onlyCREATE TABLEinside theto_regclass(...) IS NULLfirst-boot guard. MoveCREATE INDEX IF NOT EXISTS,ENABLE/FORCE ROW LEVEL SECURITY,fusion_project_isolationpolicy, trigger attach, andGRANT … TO fusion_runtimeoutside that guard (each with its own idempotent guard: index IF NOT EXISTS,pg_class.relrowsecurity,pg_policies,pg_triggeras needed) so already-created tables still converge.whatsapp_chat_dedupe: moveCREATE INDEX IF NOT EXISTS \"idxWhatsAppDedupeRetention\"out of the table-creation branch so existing tables missing the index still acquire it.
Lock contention fix should stay on CREATE TABLE/ADD COLUMN; cheap idempotent DDL must remain boot-recurring.
There was a problem hiding this comment.
@gsxdsm, acknowledged. I’ll leave this finding unresolved for the follow-up: existing plugin tables must continue to converge their index, RLS/policy, trigger, and runtime-grant state on later boots, while only lock-heavy table/column creation remains first-boot guarded.
Would you like me to open a GitHub issue with the two required fixes and acceptance criteria?
✏️ Learnings added
Learnt from: gsxdsm
Repo: Runfusion/Fusion PR: 2438
File: packages/core/src/postgres/plugin-schema-hook.ts:581-601
Timestamp: 2026-07-26T14:21:52.648Z
Learning: In `packages/core/src/postgres/plugin-schema-hook.ts`, plugin schema hooks must keep cheap, idempotent reconciliation—such as `CREATE INDEX IF NOT EXISTS`, RLS/policy enforcement, trigger attachment, and runtime grants—recurring on boot for existing tables. First-boot `to_regclass(...) IS NULL` guards should contain only lock-heavy table creation (and similarly `ADD COLUMN` checks), so existing schemas can converge after partial or legacy initialization.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
PR cleanup status (gsxdsm / pr-cleanup agent)Conflicts with Review fixes prepared at
Blocked: cannot git fetch origin pr-cleanup/2438-rebase
git push --force-with-lease ischindl-fork origin/pr-cleanup/2438-rebase:land/rufu-018-picks-v2Or reset the fork branch to that tip. Until the PR head advances, GitHub still reports CONFLICTING against the pre-rebase tip. |
2ec487a to
5addb3b
Compare
- Drop recursive duplicate bootSchemaBackendOnce (critical boot hang) and restore globalSettingsDir signature; align max_connections FNXC with resolveEmbeddedMaxConnections platform defaults - Restore StepResume FNXC identifiers; restrict resumeWorkflowStep to pre-merge phase (match findPendingPreMergeStep) - FNXC headers for settings CLI whitelist policy; MD040 fence languages; landing recipe uses isolated worktrees - Drop accidental root @fusion-plugin-examples/claude-runtime dep - Skip obsolete chore(release): v0.73.0 (main is already 0.74.0-beta.x)
Greptile SummaryThis PR expands CLI settings and workflow recovery controls while changing merge, dependency-installation, context-recovery, and PostgreSQL initialization behavior.
Confidence Score: 2/5This PR is not safe to merge until no-commit finalization honors failed executor signals and workflow-step resume is restricted to authorized operators. The two previously reported failures remain reachable: both no-commit early-return paths finalize before the executor veto, and the new step-resume handler remains exposed as an unclassified extension mutation that can rewrite a pending review result. Files Needing Attention: packages/engine/src/merger-ai.ts; packages/cli/src/extension.ts; packages/engine/src/gating-classifications.ts
|
| Filename | Overview |
|---|---|
| packages/engine/src/merger-ai.ts | Adds no-commit dependency-sync skipping and early no-op finalization, but the previously reported executor-failure veto bypass remains. |
| packages/cli/src/extension.ts | Registers workflow-step resume, but the previously reported operator-authorization boundary remains unenforced for agent extension callers. |
| packages/core/src/store.ts | Adds the audited pending-to-failed workflow-step mutation used by the new resume tool. |
| packages/core/src/postgres/plugin-schema-hook.ts | Reworks bundled plugin table initialization to avoid repeated table DDL on startup. |
| packages/engine/src/merge-dependency-sync.ts | Extends dependency installation with Corepack and pnpm environment passthrough. |
| packages/cli/src/commands/settings.ts | Whitelists and parses additional project-scoped merge and handoff settings. |
| packages/engine/src/pi.ts | Simplifies context-limit recovery to compact session history before retrying. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[No-commit task enters AI merge] --> B{Branch missing or zero net diff?}
B -- Yes --> C[Check workflow-step completion]
C --> D[Finalize task early]
B -- No --> E[Run normal landOneRepo path]
E --> F[Empty-land guards]
F --> G[Failed-executor veto]
G --> H[Finalize or demote]
Reviews (2): Last reviewed commit: "fix: address PR #2438 review after rebas..." | Re-trigger Greptile
Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: Fusion <noreply@runfusion.ai>
…add changeset Co-authored-by: Fusion <noreply@runfusion.ai>
…s/mergeStrategy/directMergeCommitStrategy/mergeAdvanceAutoSync/owningNodeHandoffPolicy to CLI whitelist Co-authored-by: Fusion <noreply@runfusion.ai>
…rePrApproval exclusion Co-authored-by: Fusion <noreply@runfusion.ai>
… changeset for merge settings whitelist Co-authored-by: Fusion <noreply@runfusion.ai>
…R decision Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: Fusion <noreply@runfusion.ai>
…tings set and cwd-main rejection Co-authored-by: Fusion <noreply@runfusion.ai>
…ix and add changeset Co-authored-by: Fusion <noreply@runfusion.ai>
…Worktree support Co-authored-by: Fusion <noreply@runfusion.ai>
Adds a noCommitsExpected guard to the branch-missing check in runAiMerge (packages/engine/src/merger-ai.ts). When the task has noCommitsExpected: true, the branch is missing, and the task was executed, route through evaluateNoCommitsNoOpFinalize instead of throwing 'work appears lost'. If all steps are done, finalize as a no-op. If steps are incomplete/skipped, demote to todo with progress preserved. Non-no-commits tasks still throw unchanged. Co-authored-by: Fusion <noreply@runfusion.ai> Fusion-Task-Id: RUFU-011
…lock, max_tokens compaction recovery
… index The function read lines[4] (Unix socket directory path, e.g. '/tmp') instead of lines[3] (TCP port number) from postmaster.pid. This caused isAlreadyRunning() to always return null, making every extension tool call (fn_task_retry, fn_task_create, etc.) attempt to start a second embedded PostgreSQL instance instead of joining the running one. Root cause cascade: 1. setHostTaskStore IS called by dashboard (line 928) for its cwd 2. Extension tools for a different project (ds/devops) get a cache miss 3. getStore() calls createTaskStoreForBackend() 4. BootSchemaBackend creates EmbeddedPostgresLifecycle 5. isAlreadyRunning() calls readPortFromPostmasterPid() -> returns null 6. startInternal() tries pg.start() -> fails (lock collision) 7. Second isAlreadyRunning() call also returns null -> error thrown 8. 30-second timeout fires -> 'TaskStore boot timed out' Includes complementary max_connections=250 fix from previous worktree session (embedded PG pool sizing). Co-authored-by: Fusion <noreply@runfusion.ai>
…kStores FNXC:ExtensionHostStoreWarmup 2026-07-18-19:20: Pre-populate setHostTaskStore for all registered projects from already- running ProjectEngine TaskStores, so extension API tools (fn_task_archive, fn_task_update, fn_agent_show) find a cached store and never fall through to createTaskStoreForBackend which times out creating a second pool. Uses each engine's existing TaskStore directly via engine.getTaskStore() instead of creating a new backend connection — no PG boot overhead, no schema advisory lock contention, no connection pool exhaustion.
…ntext and skip dep sync Co-authored-by: Fusion <noreply@runfusion.ai> Fusion-Task-Id: RUFU-018
…n installWorktreeDependencies Co-authored-by: Fusion <noreply@runfusion.ai> Fusion-Task-Id: RUFU-018
Co-authored-by: Fusion <noreply@runfusion.ai> Fusion-Task-Id: RUFU-018
Co-authored-by: Fusion <noreply@runfusion.ai> Fusion-Task-Id: RUFU-018
Co-authored-by: Fusion <noreply@runfusion.ai>
…n_workflow_step_resume tool - Add resumeWorkflowStep method to TaskStore (packages/core/src/store.ts) - Add fn_workflow_step_resume to review_gate_bypass tool permission list (packages/core/src/types.ts) - Register fn_workflow_step_resume MCP tool in extension.ts (packages/cli/src/extension.ts) - Add store-level test suite for resumeWorkflowStep (store-resume-step.test.ts) - Add fn_workflow_step_resume to expected tools in CLI extension test Co-authored-by: Fusion <noreply@runfusion.ai>
- Add resumedBy, resumedAt, resumeReason, resumedFromStatus fields to WorkflowStepResult for the fn_workflow_step_resume tool's audit trail - Fixes TS2353 error in resumeWorkflowStep method Co-authored-by: Fusion <noreply@runfusion.ai>
…tant Co-authored-by: Fusion <noreply@runfusion.ai>
…caded dead code Co-authored-by: Fusion <noreply@runfusion.ai>
Co-authored-by: Fusion <noreply@runfusion.ai>
Add an early empty-diff guard that short-circuits the merger clean room setup for no-commits tasks whose branch has only synthetic merge commits (zero net changes vs integration branch), preventing unnecessary pnpm install and build. - Add early git diff --stat check before landOneRepo when noCommitsExpected is true - Add evaluateNoCommitsNoOpFinalize guard for incomplete steps fallthrough - Add regression test suite covering zero-diff, real-changes, incomplete-steps, and commit-expected edge cases - Add fn_workflow_step_resume tool to skill documentation - Fix embedded cluster bootstrap retry on non-UTF-8 OS-locale encoding - Update pnpm-lock.yaml with latest dependency resolutions Files changed: packages/cli/skill/fusion/SKILL.md | 2 +- .../cli/skill/fusion/references/extension-tools.md | 10 + .../skill/fusion/references/fusion-capabilities.md | 1 + packages/core/src/postgres/startup-factory.ts | 18 ++ packages/engine/src/__tests__/merger-ai.test.ts | 220 ++++++++++++++++++--- packages/engine/src/merger-ai.ts | 36 ++++ pnpm-lock.yaml | 185 ++++++++++++++++- 7 files changed, 437 insertions(+), 35 deletions(-) Fusion-Task-Id: RUFU-015 Fusion-Task-Lineage: 9155c391-fd89-4791-9550-25e05acca94d Co-authored-by: Fusion <noreply@runfusion.ai>
- Drop recursive duplicate bootSchemaBackendOnce (critical boot hang) and restore globalSettingsDir signature; align max_connections FNXC with resolveEmbeddedMaxConnections platform defaults - Restore StepResume FNXC identifiers; restrict resumeWorkflowStep to pre-merge phase (match findPendingPreMergeStep) - FNXC headers for settings CLI whitelist policy; MD040 fence languages; landing recipe uses isolated worktrees - Drop accidental root @fusion-plugin-examples/claude-runtime dep - Skip obsolete chore(release): v0.73.0 (main is already 0.74.0-beta.x)
5addb3b to
d1ad1b1
Compare
|
I apologize for huge PR, this is Fusion's proactive self healing work :) This is description from my AI agent Here's the breakdown of all commits currently in PR #2438 (vs clean origin/main), organized into logical topic branches:
Dependency map: PR #2437 = topic #2 only (clean, minimal). PR #2438 = topics #1–7 combined. |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/engine/src/merge-dependency-sync.ts (1)
176-191: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winDo not pass
envseparately for these variables.
resolveEnvis a copy ofprocess.env, and this loop only reassigns values that already exist, so omitted values remain omitted. Since the defaultchild_process.execenvironment isprocess.envwhenenvis not provided, this does not make pnpm resolvable when the engine process itself lacks those env vars; default or source the needed corepack/pnpm paths instead.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/merge-dependency-sync.ts` around lines 176 - 191, Update the environment setup used by runInstall so it does not separately pass PNPM_ENV_VARS through a copied process.env. Ensure the required Corepack/pnpm paths are resolved or sourced with appropriate defaults when absent from the engine process, while preserving the existing cwd, encoding, buffer, and timeout options.
🧹 Nitpick comments (2)
packages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.ts (2)
137-167: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDuplicate test case.
"skips installWorktreeDependencies entirely when noCommitsExpected: true" (137-167) and "lands successfully with noCommitsExpected: true and actual changes" (232-260) exercise the identical fixture, ctx, and assertions (
not.toHaveBeenCalled()+outcome === "landed"). Both spin up a real git repo/worktree vialandOneRepo, so this duplication adds real (non-mocked) execution time for no additional coverage.Consider removing one of the two.
Also applies to: 232-260
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.ts` around lines 137 - 167, Remove one of the duplicate noCommitsExpected test cases, keeping a single test that uses landOneRepo with actual changes and verifies installWorktreeDependencies is not called and the result outcome is "landed".
57-82: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
withChanges: falsebranch is never exercised.
createRepoFixturesupports a docs-only (withChanges: false) branch, but every call site in this file passestrue. Either add a test exercising the no-code-change fixture, or drop the unused parameter/branch.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.ts` around lines 57 - 82, The createRepoFixture no-code-change path is unused because all callers pass true. Update the tests to exercise createRepoFixture(false) with an assertion for the docs-only behavior, or remove the withChanges parameter and its false branch if that scenario is not needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@packages/engine/src/merge-dependency-sync.ts`:
- Around line 176-191: Update the environment setup used by runInstall so it
does not separately pass PNPM_ENV_VARS through a copied process.env. Ensure the
required Corepack/pnpm paths are resolved or sourced with appropriate defaults
when absent from the engine process, while preserving the existing cwd,
encoding, buffer, and timeout options.
---
Nitpick comments:
In `@packages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.ts`:
- Around line 137-167: Remove one of the duplicate noCommitsExpected test cases,
keeping a single test that uses landOneRepo with actual changes and verifies
installWorktreeDependencies is not called and the result outcome is "landed".
- Around line 57-82: The createRepoFixture no-code-change path is unused because
all callers pass true. Update the tests to exercise createRepoFixture(false)
with an assertion for the docs-only behavior, or remove the withChanges
parameter and its false branch if that scenario is not needed.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 486d1c7a-1a6c-4dfa-9999-60328da30300
📒 Files selected for processing (33)
.changeset/aiwo-039-integration-branch-cli-setting.md.changeset/aiwo-040-merge-settings-whitelist.md.changeset/aiwo-041-merge-integration-worktree-cli-setting.md.changeset/fix-max-tokens-overflow-recovery-direct-compaction.mddocs/cli-reference.mddocs/infra/push-access-blocker-decision.mddocs/integration-branch-cli-setting.mdpackage.jsonpackages/cli/skill/fusion/SKILL.mdpackages/cli/skill/fusion/references/extension-tools.mdpackages/cli/skill/fusion/references/fusion-capabilities.mdpackages/cli/src/__tests__/extension.test.tspackages/cli/src/commands/__tests__/settings.test.tspackages/cli/src/commands/dashboard.tspackages/cli/src/commands/settings.tspackages/cli/src/extension.tspackages/core/src/__tests__/store-resume-step.test.tspackages/core/src/__tests__/task-merge-bypass.test.tspackages/core/src/index.tspackages/core/src/postgres/embedded-lifecycle.tspackages/core/src/postgres/plugin-schema-hook.tspackages/core/src/postgres/sqlite-migrator.tspackages/core/src/postgres/startup-factory.tspackages/core/src/store.tspackages/core/src/task-merge.tspackages/core/src/types/workflow-steps.tspackages/engine/src/__tests__/max-tokens-overflow-recovery.test.tspackages/engine/src/__tests__/merge-dependency-sync-lockfile-heal.test.tspackages/engine/src/__tests__/merger-ai-no-commits-deps-skip.test.tspackages/engine/src/__tests__/merger-ai.test.tspackages/engine/src/merge-dependency-sync.tspackages/engine/src/merger-ai.tspackages/engine/src/pi.ts
🚧 Files skipped from review as they are similar to previous changes (26)
- .changeset/aiwo-039-integration-branch-cli-setting.md
- packages/core/src/task-merge.ts
- packages/core/src/index.ts
- packages/cli/src/tests/extension.test.ts
- .changeset/fix-max-tokens-overflow-recovery-direct-compaction.md
- .changeset/aiwo-040-merge-settings-whitelist.md
- .changeset/aiwo-041-merge-integration-worktree-cli-setting.md
- packages/cli/skill/fusion/references/fusion-capabilities.md
- packages/core/src/types/workflow-steps.ts
- packages/cli/skill/fusion/references/extension-tools.md
- packages/core/src/postgres/embedded-lifecycle.ts
- packages/engine/src/tests/max-tokens-overflow-recovery.test.ts
- docs/infra/push-access-blocker-decision.md
- packages/core/src/tests/task-merge-bypass.test.ts
- packages/core/src/tests/store-resume-step.test.ts
- packages/core/src/store.ts
- packages/cli/src/commands/dashboard.ts
- docs/cli-reference.md
- docs/integration-branch-cli-setting.md
- packages/cli/src/commands/settings.ts
- packages/core/src/postgres/plugin-schema-hook.ts
- packages/cli/src/commands/tests/settings.test.ts
- packages/engine/src/tests/merge-dependency-sync-lockfile-heal.test.ts
- packages/engine/src/tests/merger-ai.test.ts
- packages/engine/src/merger-ai.ts
- packages/core/src/postgres/sqlite-migrator.ts
|
Going to hold this for now. Doing a big refsctor in this area then will re apply |
|
Superseded by #2501 (same change, clean landing; this one is DIRTY with a failing check). Closing in favor of it. |
Manually landing RUFU-018 commits (bypassing broken AI merge pipeline).
4 commits:
Closes RUFU-018
Summary by CodeRabbit
New Features
integrationBranchandmergeIntegrationWorktree).Bug Fixes
Documentation