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:
7
.changeset/fix-quick-add-model-filter.md
Normal file
7
.changeset/fix-quick-add-model-filter.md
Normal 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.
|
||||
7
.changeset/fn-9007-pi-0-84-1.md
Normal file
7
.changeset/fn-9007-pi-0-84-1.md
Normal 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.
|
||||
7
.changeset/fn-9008-grok-4-6.md
Normal file
7
.changeset/fn-9008-grok-4-6.md
Normal 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`.
|
||||
7
.changeset/fn-9009-quick-add-merger-label.md
Normal file
7
.changeset/fn-9009-quick-add-merger-label.md
Normal 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.
|
||||
7
.changeset/fn-9011-model-dropdown-toggle.md
Normal file
7
.changeset/fn-9011-model-dropdown-toggle.md
Normal 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.
|
||||
7
.changeset/fn-9012-recommendations-tab-visibility.md
Normal file
7
.changeset/fn-9012-recommendations-tab-visibility.md
Normal 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.
|
||||
7
.changeset/fn-9013-scheduler-listfeatures-receiver.md
Normal file
7
.changeset/fn-9013-scheduler-listfeatures-receiver.md
Normal 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.
|
||||
7
.changeset/fn-9014-message-archive.md
Normal file
7
.changeset/fn-9014-message-archive.md
Normal 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.
|
||||
7
.changeset/fn-9016-manager-eval-tools.md
Normal file
7
.changeset/fn-9016-manager-eval-tools.md
Normal 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.
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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`);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user