fix(RUFU-075): safest scheduler queue/mission-store writes for minimal stores (#3472)

**Problem:** Scheduler writes assumed a full missionStore contract
(getSlice/getMilestone), aborting/pre-resolving mission reconciliation
when a minimal store or a genuine missing mission was present.

**Fix:** Resolve a missing `missionId` best-effort through
`missionStore.getSlice`/getMilestone when available, and make
reconciliation non-blocking — a partial missionStore must not gate the
completion advance. Includes scheduler + pre.json rebase resolution over
the latest origin.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **New Features**
  - Added Grok 4.6 to the model catalog.
- Added archive and restore views for mailbox messages and chat
conversations.
- Added manager evaluation tools for reviewing agents and follow-up
actions.
  - Updated the bundled Pi runtime.

- **Bug Fixes**
  - Improved Quick Add model searching and dropdown toggling.
  - Refined Quick Add merger labels and spacing.
- Recommendations now appear only for completed tasks with valid
recommendations.
- Improved scheduler resilience during mission updates and
reconciliation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: gsxdsm <gsxdsm@users.noreply.github.com>
This commit is contained in:
ischindl
2026-08-17 22:54:48 +02:00
committed by GitHub
parent dc00bc386c
commit 5e95a930f3
11 changed files with 302 additions and 119 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Fix the Quick Add model dropdown filter box so typing narrows the model list.
category: fix
dev: The quick-entry model menu's blanket onMouseDown preventDefault crossed the React portal boundary and suppressed focus on CustomModelDropdown's search input.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Upgrade the bundled Pi runtime to 0.84.1 for updated provider and model support.
category: internal
dev: Advance the exact Pi closure from 0.82.1 to 0.84.1 and guard pi-client, pi-protocol, and pi-telemetry.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": minor
---
summary: Add Grok 4.6 to the built-in Grok model catalog across every model picker.
category: feature
dev: Registers Grok 4.6 in `GROK_PROVIDER_REGISTRATION` in `packages/core/src/ai/grok-provider.ts`, which fans out through `seedDashboardProviders` and `pi.ts`.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Quick Add model menu now labels the merger row “Merger” with spacing matching other roles.
category: fix
dev: Adds the tasks.modelMerger translation key for the top-level Quick Add menu row.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Fix the collapse/expand toggle in model selection dropdowns.
category: fix
dev: Stop portal-bound pointer and mouse events before document-level outside-close handlers can unmount CustomModelDropdown.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Show the task Recommendations tab only when a completed task has recommendations.
category: fix
dev: TaskDetailModal gates hasRecommendations on task-owned recommendations (fullDetail?.id === task.id, else the live prop); tab reconciliation waits for that same proof, not detailLoading.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Fix mission reconciliation failing every cycle with an internal scheduler error.
category: fix
dev: Preserves the listFeatures receiver and contains per-slice failures in Scheduler.reconcileActiveMissionAutomation.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": minor
---
summary: Add archive and restore views for mailbox messages and chat conversations.
category: feature
dev: Adds project.messages.archived via migration 0058 and POST /messages/:id/archive|unarchive routes.

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": minor
---
summary: Let managers review and coach evaluation results for agents in their reporting tree.
category: feature
dev: Adds `fn_agent_read_evaluations` and `fn_agent_evaluation_followup`, reusing the management-subtree boundary and action-gate classification.

View File

@@ -2,110 +2,201 @@
"mode": "pre",
"tag": "beta",
"initialVersions": {
"@runfusion/fusion": "0.76.0",
"runfusion.ai": "0.76.0",
"@fusion/core": "0.76.0",
"@fusion/dashboard": "0.76.0",
"@fusion/desktop": "0.76.0",
"@fusion/droid-cli": "0.11.61",
"@fusion/engine": "0.76.0",
"@fusion/i18n": "0.39.35",
"@fusion/mobile": "0.76.0",
"@fusion/pi-claude-cli": "0.76.0",
"@runfusion/fusion": "0.75.1",
"runfusion.ai": "0.75.1",
"@fusion/core": "0.75.1",
"@fusion/dashboard": "0.75.1",
"@fusion/desktop": "0.75.1",
"@fusion/droid-cli": "0.11.60",
"@fusion/engine": "0.75.1",
"@fusion/i18n": "0.39.34",
"@fusion/mobile": "0.75.1",
"@fusion/pi-claude-cli": "0.75.1",
"@fusion/pi-llama-cpp": "0.17.2",
"@fusion/plugin-sdk": "0.76.0",
"@fusion-plugin-examples/auto-label": "0.2.85",
"@fusion-plugin-examples/ci-status": "0.2.85",
"@fusion-plugin-examples/notification": "0.2.85",
"@fusion-plugin-examples/settings-demo": "0.2.85",
"@fusion-plugin-examples/acp-runtime": "0.1.35",
"@fusion-plugin-examples/agent-browser": "0.1.55",
"@fusion-plugin-examples/claude-runtime": "0.1.10",
"@fusion-plugin-examples/cli-printing-press": "0.1.52",
"@fusion-plugin-examples/compound-engineering": "0.1.35",
"@fusion-plugin-examples/cursor-runtime": "0.1.54",
"@fusion-plugin-examples/dependency-graph": "0.1.66",
"@fusion-plugin-examples/droid-runtime": "0.1.61",
"@fusion-plugin-examples/even-realities-glasses": "0.1.54",
"@fusion-plugin-examples/grok-runtime": "0.2.13",
"@fusion-plugin-examples/hermes-runtime": "0.2.85",
"@fusion-plugin-examples/linear-import": "0.1.17",
"@fusion-plugin-examples/omp-runtime": "0.1.10",
"@fusion-plugin-examples/openclaw-runtime": "0.2.85",
"@fusion-plugin-examples/paperclip-runtime": "0.2.85",
"@fusion-plugin-examples/quality": "0.1.10",
"@fusion-plugin-examples/reports": "0.1.54",
"@fusion-plugin-examples/roadmap": "0.1.54",
"@fusion-plugin-examples/todos": "0.1.3",
"@fusion-plugin-examples/whatsapp-chat": "0.1.54"
"@fusion/plugin-sdk": "0.75.1",
"@fusion-plugin-examples/auto-label": "0.2.84",
"@fusion-plugin-examples/ci-status": "0.2.84",
"@fusion-plugin-examples/notification": "0.2.84",
"@fusion-plugin-examples/settings-demo": "0.2.84",
"@fusion-plugin-examples/acp-runtime": "0.1.34",
"@fusion-plugin-examples/agent-browser": "0.1.54",
"@fusion-plugin-examples/claude-runtime": "0.1.9",
"@fusion-plugin-examples/cli-printing-press": "0.1.51",
"@fusion-plugin-examples/compound-engineering": "0.1.34",
"@fusion-plugin-examples/cursor-runtime": "0.1.53",
"@fusion-plugin-examples/dependency-graph": "0.1.65",
"@fusion-plugin-examples/droid-runtime": "0.1.60",
"@fusion-plugin-examples/even-realities-glasses": "0.1.53",
"@fusion-plugin-examples/grok-runtime": "0.2.12",
"@fusion-plugin-examples/hermes-runtime": "0.2.84",
"@fusion-plugin-examples/linear-import": "0.1.16",
"@fusion-plugin-examples/omp-runtime": "0.1.9",
"@fusion-plugin-examples/openclaw-runtime": "0.2.84",
"@fusion-plugin-examples/paperclip-runtime": "0.2.84",
"@fusion-plugin-examples/quality": "0.1.9",
"@fusion-plugin-examples/reports": "0.1.53",
"@fusion-plugin-examples/roadmap": "0.1.53",
"@fusion-plugin-examples/todos": "0.1.2",
"@fusion-plugin-examples/whatsapp-chat": "0.1.53"
},
"changesets": [
"events-unknown-project-404",
"fix-anthropic-login-banner-mobile",
"fix-anthropic-subscription-instance-login",
"fix-cc-spacing-and-settings-search",
"fix-github-tracking-close-after-done",
"fix-mission-triage-unknown-workflow-404",
"fix-planning-retry-gateway-503",
"fix-transient-post-merge-push-retry",
"fix-wave18-peel-restorations",
"fn-9030-computer-use-project-local-state",
"fn-9031-computer-use-snapshot-consumption",
"fn-9032-knowledge-graph-artifact-validation",
"fn-9034-file-scoped-vitest",
"fn-9037-recommendation-create-perf",
"fn-9038-knowledge-graph-tab",
"fn-9039-voice-runtime-interop",
"fn-9040-database-backups-visibility",
"fn-9041-removal",
"fn-9042-update-now-outcomes",
"fn-9043-workspace-no-commits",
"fn-9044-workspace-worktree-grouping",
"fn-9045-workspace-mode-toggle",
"fn-9046-pnpm-filter-selector",
"fn-9047-workspace-revert-landed-sha",
"fn-9048-workspace-unarchive",
"fn-9049-workspace-branch-evidence",
"fn-9050-ai-merge-scope-gates",
"fn-9051-workspace-blocked-finalize",
"fn-9052-workspace-worktree-atomic-merge",
"fn-9053-workspace-acquisition-atomicity",
"fn-9055-archive-live-worktree-guard",
"fn-9056-workspace-terminal-teardown",
"fn-9057-workspace-land-predicate-recycled-id",
"fn-9058-workspace-main-checkout-guard",
"fn-9059-workspace-durable-coordination",
"fn-9060-workspace-zero-acquire",
"fn-9061-foreach-workspace-isolation-gate",
"fn-9062-workspace-land-status",
"fn-9092-model-filter-dialog-dismissal",
"fn-9093-cursor-runtime-eager-install",
"fn-9095-spec-alignment-position",
"fn-9096-cli-runtime-routing",
"fn-9097-cursor-cli-runtime",
"fn-9098-cursor-mcp-bridge",
"fn-9099-hermes-windows-launch",
"fn-9100-staged-plugin-core-shim",
"fn-9101-anthropic-subscription-model-resolution",
"fn-9102-task-runtime-double-count",
"fn-9104-mailbox-recommendation-create",
"fn-9106-non-continuable-step-session",
"fn-9107-mission-trigger",
"fn-9108-workflow-principal-session-identity",
"fn-9109-cross-runtime-cursor-fallback",
"fn-9110-github-import-pulls-mobile",
"fn-9111-quick-add-enter",
"fn-9112-memory-keeper-heartbeat-default-off",
"fn-9114-forced-skills",
"fn-9115-skills-ui",
"fn-9116-planning-reconciliation",
"fn-9117-planning-turn-ownership",
"fn-9120-create-room-picker",
"fn-9124-mission-cta-top",
"insights-newest-first",
"kb-title-redirect-and-workflow-partition-fixes",
"mission-interview-cli-runtime-routing",
"remove-diff-volume-gate",
"task-create-github-tracking-flags"
"bind-self-owned-worktree-probe",
"builtin-workflow-role-agents-always-routable",
"calm-noop-finalization",
"clear-stale-planning-badges",
"darwin-only-computer-use-skill-staging",
"dependent-worktree-base-refresh",
"executor-split-external-checkout-guards",
"extension-host-store-warmup",
"external-checkout-routing-followup",
"external-checkout-routing-review-followup",
"fix-builtin-role-provisioning-deadlock",
"fix-dashboard-unpause-sync",
"fix-grok-acp-no-auto-update",
"fix-mission-followup-admission",
"fix-mission-reconcile-preview",
"fix-model-chat-404-and-worktree-conflict-misclassification",
"fix-planning-lock-reentry",
"fix-quick-add-model-filter",
"fn-8764-workflow-role-agents",
"fn-8815-retry-first-tool-failure",
"fn-8816-planning-storage-recovery",
"fn-8818-planning-response-choices",
"fn-8819-planning-options",
"fn-8820-message-composer-mobile-width",
"fn-8821-retire-ephemeral-routing",
"fn-8822-worktree-capacity-leak",
"fn-8823-shared-member-consent",
"fn-8824-mission-slice-advancement",
"fn-8825-secrets-env-fingerprint",
"fn-8826-dashboard-wip-badge",
"fn-8826-restart-partial-progress",
"fn-8829-recommendations",
"fn-8830-workflow-agent-identities",
"fn-8831-settings-default-description",
"fn-8834-mission-merge-guidance",
"fn-8835-pr-merge-readiness",
"fn-8836-gh-merge-policy-errors",
"fn-8837-pr-merge-retries",
"fn-8838-refresh-pr-heads",
"fn-8839-worktree-integration-rebase",
"fn-8840-duplicate-title-redirect",
"fn-8841-plan-review-no-op",
"fn-8843-intake-agent-assignment",
"fn-8845-spec-lock-drift-report",
"fn-8847-remove-ephemeral-setting",
"fn-8848-recommendations-empty-state",
"fn-8850-populate-task-recommendations",
"fn-8851-settings-attribution",
"fn-8852-config-revision-heartbeat",
"fn-8853-settings-activity-coverage",
"fn-8855-required-checks",
"fn-8856-hold-release-sweep-bounded",
"fn-8857-stale-effective-route",
"fn-8859-roadmap-native-structure-embeds",
"fn-8861-planning-source-issue",
"fn-8863-remediation-auto-merge-hold",
"fn-8864-agent-activity-events",
"fn-8865-live-agent-activity",
"fn-8866-agent-activity-surfaces",
"fn-8867-wedge-false-terminal-alerts",
"fn-8868-durable-agent-activity-telemetry",
"fn-8869-role-agent-project-model-override",
"fn-8870-structural-mail-contract",
"fn-8872-structural-mail-ui",
"fn-8877-planning-issue-image-attachments",
"fn-8879-detail-task-patch",
"fn-8884-github-native-auto-merge",
"fn-8885-github-signals-connector",
"fn-8888-triage-approval-mail",
"fn-8901-deterministic-duplicate-409",
"fn-8902-models-refresh-bounding",
"fn-8903-event-driven-checks",
"fn-8907-promote-planning",
"fn-8908-terminal-failure-auto-recovery",
"fn-8909-orphaned-planning-segment-sweep",
"fn-8910-premerge-remediation-hold",
"fn-8911-direct-database-url-planning-lock",
"fn-8912-merge-abort-transient-status",
"fn-8913-older-first-scheduling",
"fn-8918-false-parked-task-alerts",
"fn-8919-agent-link-sweep-fail-open",
"fn-8921-knowledge-graph",
"fn-8922-memory-recall-store",
"fn-8925-paused-stale-merge",
"fn-8926-memory-mcp-server",
"fn-8929-chat-attachment-dismiss",
"fn-8930-taskcard-provenance-chip",
"fn-8932-memory-agent",
"fn-8933-memory-semantics-capture",
"fn-8934-memory-pre-steering",
"fn-8935-agents-overview-mobile-scroll",
"fn-8943-spec-lock-divergence",
"fn-8945-lineage-approval-invalidation",
"fn-8946-mission-status-writes",
"fn-8947-mission-validation-repair",
"fn-8948-mission-auto-reconcile",
"fn-8950-promote-plan-gate",
"fn-8953-wedge-settle-window",
"fn-8954-cli-exit-13",
"fn-8955-verdict-extractor",
"fn-8956-review-finding-resolution",
"fn-8957-agent-project-isolation",
"fn-8958-orphan-merge-write-fence",
"fn-8960-computer-use-cli",
"fn-8961-computer-use-skill",
"fn-8962-mission-blocked-clear",
"fn-8963-validate-inflight-guard",
"fn-8965-intake-owner-explicit-routing",
"fn-8969-plan-evidence-version-collision",
"fn-8970-mission-reconcile-control",
"fn-8971-mission-clear-blocked-tool",
"fn-8972-mission-recompute-blocked-guard",
"fn-8973-mission-blocker-descriptor",
"fn-8976-validator-admission",
"fn-8978-typescript-dedup",
"fn-8979-removal",
"fn-8987-release-gate-verdict",
"fn-8988-agent-ratings-project-partition",
"fn-8990-plugin-reload-scratch-cleanup",
"fn-8997-project-ownership-declaration-drift",
"fn-8998-workflows-project-partition",
"fn-9000-project-ownership-runtime-scope",
"fn-9002-project-schema-ownership-declarations",
"fn-9003-approval-audit-project-scope",
"fn-9004-project-ownership-defaults",
"fn-9007-pi-0-84-1",
"fn-9008-grok-4-6",
"fn-9009-quick-add-merger-label",
"fn-9011-model-dropdown-toggle",
"fn-9012-recommendations-tab-visibility",
"fn-9013-scheduler-listfeatures-receiver",
"fn-9014-message-archive",
"fn-9016-manager-eval-tools",
"fn-workflow-executor-agent-store-wiring",
"manual-handoff-limbo",
"orphaned-planning-segments",
"pinned-worktree-recovery-review-followup",
"plan-review-replan-cap-wiring",
"planning-retry-budget-and-timeout",
"polite-penguins-preserve-claims",
"pt-br-locale",
"quiet-executor-dispatch-blocked-logs",
"quiet-external-checkouts",
"refresh-empty-task-activity-feed",
"required-checks-locale-parity",
"restore-executor-peel-regressions",
"resume-capacity-parked-continuations",
"review-severity-gate",
"separate-heartbeat-from-workflow-routability",
"spec-drift-connection-exhaustion",
"stas-032-resume-workflow-step",
"task-pinned-orphan-recovery",
"todos-plugin-nav-entry",
"transient-request-timeout",
"tunnel-auto-restart",
"uncapped-workflow-principals-and-continuation-reclaim",
"workflow-principal-stale-fence-reroute",
"worktree-base-refresh-never-blocks-execution"
]
}

View File

@@ -1643,7 +1643,27 @@ export class Scheduler {
task: Task,
input: { signature: string; blockedBy: string | null; overlapBlockedBy: string | null; action: string },
): Promise<boolean> {
return (await this.store.transitionQueuedEpisode(task.id, input)).appended;
/*
FNXC:RUFU-075 2026-08-13-03:16:
The review-lease and dependency overlap-queue writes historically went straight through
`store.updateTask(…, { status: "queued", …, overlapBlockedBy })`. FN-8785 moved them onto the
store's atomic `transitionQueuedEpisode` helper (advisory-locked, edge-triggered queue logging).
A minimal/legacy store that does not implement `transitionQueuedEpisode` (as several scheduler
test mocks and older store shims do not) must still receive a correct queue write, or the lease
overlap / dependency block is silently dropped. Mirror the FN-8806 convention already used by
`executor/dependency-dispatch-gate.ts`: require the method before using it, and fall back to the
pre-FN-8785 `updateTask` + `logEntry` contract otherwise, so `overlapBlockedBy` reaches the row.
*/
if (typeof this.store.transitionQueuedEpisode === "function") {
return (await this.store.transitionQueuedEpisode(task.id, input)).appended;
}
await this.store.updateTask(task.id, {
status: "queued",
blockedBy: input.blockedBy ?? null,
overlapBlockedBy: input.overlapBlockedBy ?? null,
});
await this.logDispatchQueuedReason(task.id, input.action);
return true;
}
private async logDispatchQueuedReason(taskId: string, reason: string, memoKey?: string): Promise<boolean> {
@@ -3173,25 +3193,34 @@ export class Scheduler {
}
const sliceIdBeforeUpdate = feature.sliceId;
const featureSlice = await missionStore.getSlice(feature.sliceId);
const milestone = featureSlice ? await missionStore.getMilestone(featureSlice.milestoneId) : undefined;
const missionId = task.missionId ?? milestone?.missionId;
if (!missionId) {
schedulerLog.warn(`Task ${taskId} feature ${feature.id} has no resolvable mission; skipping reconciliation`);
return;
}
/*
FNXC:MissionAutoReconcile 2026-08-11-02:39:
Live moves use the same authority as maintenance rather than retaining a second direct
writer. This keeps task-move attribution and validation-badge repair identical to every
other deterministic ground-truth projection.
FNXC:RUFU-075 2026-08-13-03:16:
FN-8948 routed the task-move feature-status reconciliation through a resolve-missionId ->
reconcileMissionState authority. That block is a maintenance side-channel and must not gate the
mission-completion advance below: a missionStore that cannot resolve the mission (does not
implement getSlice/getMilestone, or genuinely has no mission) should skip reconcile rather than
abort the completion check. Pre-FN-8948 the completion check ran directly from the resolved
feature, which is what the scheduler contract (and minimal missionStore mocks) still require.
*/
if (missionId !== task.missionId) {
try {
await reconcileMissionState({ taskStore: this.store, missionStore }, { missionId, source: "task-move" });
} catch (error) {
schedulerLog.warn(`Mission reconciliation failed after resolving task ${taskId}; continuing mission completion handling:`, error);
let missionId = task.missionId;
try {
if (!missionId && typeof missionStore.getSlice === "function") {
const featureSlice = await missionStore.getSlice(feature.sliceId);
const milestone =
featureSlice && typeof missionStore.getMilestone === "function"
? await missionStore.getMilestone(featureSlice.milestoneId)
: undefined;
missionId = milestone?.missionId;
}
if (!missionId) {
schedulerLog.warn(`Task ${taskId} feature ${feature.id} has no resolvable mission; skipping reconciliation`);
} else if (missionId !== task.missionId) {
await reconcileMissionState({ taskStore: this.store, missionStore }, { missionId, source: "task-move" });
}
} catch (error) {
// Best-effort reconcile — a partial missionStore (missing getSlice/getMilestone or the
// reconcile probes) must not gate the completion advance below.
schedulerLog.warn(`Task ${taskId} feature ${feature.id} mission reconcile skipped (${String(error)}); continuing to completion check`);
}
/*