@runfusion/fusion 0.77.0-beta.5 → 0.77.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/bin.js +42668 -39363
  2. package/dist/child-process-worker.js +7647 -4857
  3. package/dist/client/.vite/manifest.json +259 -322
  4. package/dist/client/assets/{AgentDetailView-CSK_Rnlk.js → AgentDetailView-C1eh_vXv.js} +4 -4
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-kG44Adcm.js → AgentPermissionPolicyEditor-CeKsO1LR.js} +2 -2
  6. package/dist/client/assets/{AgentsView-ClKwKWnU.js → AgentsView-BNe2ABOc.js} +4 -4
  7. package/dist/client/assets/CommandCenter-BuREM-G1.js +102 -0
  8. package/dist/client/assets/DevServerView-D0i1b-QO.js +1 -0
  9. package/dist/client/assets/DirectoryPicker-VOx91hQt.js +1 -0
  10. package/dist/client/assets/DocumentsView-CO5W_WVb.js +1 -0
  11. package/dist/client/assets/EvalsView-BqSINSrZ.js +1 -0
  12. package/dist/client/assets/ExperimentalAgentOnboardingModal-DEcFgONi.js +1 -0
  13. package/dist/client/assets/{GoalsView-ysh3X2x6.js → GoalsView-DZ57wXmJ.js} +1 -1
  14. package/dist/client/assets/{InsightsView-BbMjCu7J.js → InsightsView-DSWfXG7Q.js} +3 -3
  15. package/dist/client/assets/{MemoryView-B3IgA8Bx.js → MemoryView-BEX10uhl.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-CZlIw7C3.js → PiExtensionsManager-DcAmXXoR.js} +2 -2
  17. package/dist/client/assets/PluginManager-BU0omQUv.js +1 -0
  18. package/dist/client/assets/{PullRequestView-DhhsJV8I.js → PullRequestView-B-JL_8Kk.js} +2 -2
  19. package/dist/client/assets/{ReportModal-CQMn4i1y.js → ReportModal-DxggF_RH.js} +5 -5
  20. package/dist/client/assets/{ResearchView-CVwfs4l3.js → ResearchView-CnwTXfQO.js} +1 -1
  21. package/dist/client/assets/{SecretsView-CrJfHle9.js → SecretsView-BDvzsLFz.js} +1 -1
  22. package/dist/client/assets/SettingsModal-801eFQ9u.js +21 -0
  23. package/dist/client/assets/{SettingsModal-B6U5Umru.js → SettingsModal-BZHeQ3ED.js} +1 -1
  24. package/dist/client/assets/{SettingsTextareaRow-O7-u9uMC.js → SettingsTextareaRow-B0rTuelr.js} +1 -1
  25. package/dist/client/assets/SetupWizardModal-CoExPwIn.js +2 -0
  26. package/dist/client/assets/{SkillsView-CoWAjvWU.js → SkillsView-WVP25LPj.js} +1 -1
  27. package/dist/client/assets/WorkflowNodeEditor-pCMyKcnS.js +8 -0
  28. package/dist/client/assets/{agent-import-generation-BqDmtTur.js → agent-import-generation-M_hKtjgN.js} +1 -1
  29. package/dist/client/assets/{agentsOrgChartLayout-C4cLqlV6.js → agentsOrgChartLayout-DjvIMhFD.js} +1 -1
  30. package/dist/client/assets/{app-C_PTWuI1.js → app-BOvA34XN.js} +3 -3
  31. package/dist/client/assets/{app-BBSLJDbV.js → app-Bic4iWXQ.js} +3 -3
  32. package/dist/client/assets/{app-Bvr57EZQ.js → app-BlbH7Tir.js} +2 -2
  33. package/dist/client/assets/{app-DwvelD-n.js → app-C6TctczU.js} +3 -3
  34. package/dist/client/assets/{app-DRW5hIgr.js → app-D3qZmEIu.js} +3 -3
  35. package/dist/client/assets/{app-BKwOvuxE.js → app-DLnMkUt5.js} +2 -2
  36. package/dist/client/assets/{app-DKx18PHE.js → app-mNy0DeDM.js} +3 -3
  37. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CdxcwdRe.js → architectureDiagram-3BPJPVTR-CkzEm8i9.js} +1 -1
  38. package/dist/client/assets/{blockDiagram-GPEHLZMM-CfQrRfHR.js → blockDiagram-GPEHLZMM-Dc-dUMjY.js} +1 -1
  39. package/dist/client/assets/{c4Diagram-AAUBKEIU-Cx7-2SOm.js → c4Diagram-AAUBKEIU-DnYjsrR0.js} +1 -1
  40. package/dist/client/assets/channel-CxQ40s_U.js +1 -0
  41. package/dist/client/assets/{chunk-2J33WTMH-D8jvgP3M.js → chunk-2J33WTMH-0E1GEFEr.js} +1 -1
  42. package/dist/client/assets/{chunk-4BX2VUAB-B5tBx_s_.js → chunk-4BX2VUAB-Dj5oZd51.js} +1 -1
  43. package/dist/client/assets/{chunk-55IACEB6-C-F-HQ5Z.js → chunk-55IACEB6-DfNT0s8E.js} +1 -1
  44. package/dist/client/assets/{chunk-727SXJPM-BP8Ln-8C.js → chunk-727SXJPM-BnFjhiIQ.js} +1 -1
  45. package/dist/client/assets/{chunk-AQP2D5EJ-DMnTmRmn.js → chunk-AQP2D5EJ-DR84wSqR.js} +1 -1
  46. package/dist/client/assets/{chunk-FMBD7UC4-D_YdfnNc.js → chunk-FMBD7UC4-IjByNOrR.js} +1 -1
  47. package/dist/client/assets/{chunk-ND2GUHAM-CULXyuXq.js → chunk-ND2GUHAM-By0q_jZm.js} +1 -1
  48. package/dist/client/assets/{chunk-QZHKN3VN-CT1BWEJL.js → chunk-QZHKN3VN-BELcl3N5.js} +1 -1
  49. package/dist/client/assets/classDiagram-4FO5ZUOK-C2ARdiRL.js +1 -0
  50. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2ARdiRL.js +1 -0
  51. package/dist/client/assets/{common-13IRj_PO.js → common-BsNuuNOe.js} +1 -1
  52. package/dist/client/assets/{common-BBynATth.js → common-CASsTuSW.js} +1 -1
  53. package/dist/client/assets/{common-BG-vw0tL.js → common-CfyFt5OG.js} +1 -1
  54. package/dist/client/assets/{common-DSo46rnH.js → common-DS98trLj.js} +1 -1
  55. package/dist/client/assets/common-DeoHWJCq.js +1 -0
  56. package/dist/client/assets/common-PpMdoH5r.js +1 -0
  57. package/dist/client/assets/{common-vpHuuvkd.js → common-cN--mrmm.js} +1 -1
  58. package/dist/client/assets/{cose-bilkent-S5V4N54A-M-3DXa6e.js → cose-bilkent-S5V4N54A-D4cCw9-_.js} +1 -1
  59. package/dist/client/assets/{dagre-BM42HDAG-Bsiqvroz.js → dagre-BM42HDAG-JJp5dVeY.js} +1 -1
  60. package/dist/client/assets/dashboard-view-6zPJm9zC.js +1 -0
  61. package/dist/client/assets/{dashboard-view-BEBh_Ei5.js → dashboard-view-Bl9CPhxE.js} +1 -1
  62. package/dist/client/assets/{dashboard-view-CnFFG3cW.js → dashboard-view-C5Nt8cvY.js} +1 -1
  63. package/dist/client/assets/{dashboard-view-DAHn20ph.js → dashboard-view-MAC_LHDX.js} +2 -2
  64. package/dist/client/assets/{diagram-2AECGRRQ-CZiHoXo5.js → diagram-2AECGRRQ-D4L7j_t_.js} +1 -1
  65. package/dist/client/assets/{diagram-5GNKFQAL-BoJVz4Or.js → diagram-5GNKFQAL-VAGFaXqG.js} +1 -1
  66. package/dist/client/assets/{diagram-KO2AKTUF-DivGQuAL.js → diagram-KO2AKTUF-hqXSggfW.js} +1 -1
  67. package/dist/client/assets/{diagram-LMA3HP47-DkMK7OJp.js → diagram-LMA3HP47-B3eAIuy8.js} +1 -1
  68. package/dist/client/assets/{diagram-OG6HWLK6-DFFvRcpW.js → diagram-OG6HWLK6-BGufp0RK.js} +1 -1
  69. package/dist/client/assets/{erDiagram-TEJ5UH35--217vrom.js → erDiagram-TEJ5UH35-DplXdx8w.js} +1 -1
  70. package/dist/client/assets/{flowDiagram-I6XJVG4X-CQgWO3xf.js → flowDiagram-I6XJVG4X-C1Ms2bko.js} +1 -1
  71. package/dist/client/assets/{folder-open-DR6cRcNR.js → folder-open-nMraSDXu.js} +1 -1
  72. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BjDMUrS3.js → ganttDiagram-6RSMTGT7-DVgxMtXb.js} +1 -1
  73. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-gKUcDnln.js → gitGraphDiagram-PVQCEYII-DH2_n0J8.js} +1 -1
  74. package/dist/client/assets/index-BJc-A7eB.css +1 -0
  75. package/dist/client/assets/index-CBFPgFTp.js +2787 -0
  76. package/dist/client/assets/{infoDiagram-5YYISTIA-BA91T8S5.js → infoDiagram-5YYISTIA-DmZdWVcU.js} +1 -1
  77. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-0BY5xe-c.js → ishikawaDiagram-YF4QCWOH-DsEIHSXr.js} +1 -1
  78. package/dist/client/assets/{journeyDiagram-JHISSGLW-B_OwenbQ.js → journeyDiagram-JHISSGLW-CsfIWmu1.js} +1 -1
  79. package/dist/client/assets/{kanban-definition-UN3LZRKU-GLabUTKp.js → kanban-definition-UN3LZRKU-CQKqeZvc.js} +1 -1
  80. package/dist/client/assets/{mermaid.core-BXo4rxYI.js → mermaid.core-DkC_dr4-.js} +4 -4
  81. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DZl6LPoE.js → mindmap-definition-RKZ34NQL-RnmE-NUe.js} +1 -1
  82. package/dist/client/assets/{pieDiagram-4H26LBE5-DtHq-4py.js → pieDiagram-4H26LBE5-DPu6FPc4.js} +1 -1
  83. package/dist/client/assets/{puzzle-OVm-I1L4.js → puzzle-DwhHOf32.js} +1 -1
  84. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BdjXhd5d.js → quadrantDiagram-W4KKPZXB-CYbypO2p.js} +1 -1
  85. package/dist/client/assets/{requirementDiagram-4Y6WPE33-BoFVjELN.js → requirementDiagram-4Y6WPE33-DFk1vK_N.js} +1 -1
  86. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-B0qyJh-P.js → sankeyDiagram-5OEKKPKP-CkUY1Zzu.js} +1 -1
  87. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-ByY62Eqp.js → sequenceDiagram-3UESZ5HK-CFivaLOO.js} +1 -1
  88. package/dist/client/assets/{standing-instructions-template-BsnnRlwm.js → standing-instructions-template-BbqKGAC1.js} +2 -2
  89. package/dist/client/assets/{stateDiagram-AJRCARHV-CwJ-_Phi.js → stateDiagram-AJRCARHV-BPeD5PwG.js} +1 -1
  90. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Cfvhq8mV.js → stateDiagram-v2-BHNVJYJU-DduiCPMb.js} +1 -1
  91. package/dist/client/assets/{timeline-definition-PNZ67QCA-Co8VfGN9.js → timeline-definition-PNZ67QCA-CGUNNVro.js} +1 -1
  92. package/dist/client/assets/{upload-CkqDbEeE.js → upload-BS96H1o7.js} +1 -1
  93. package/dist/client/assets/{users-B8DkpbXD.js → users--irrWoyU.js} +1 -1
  94. package/dist/client/assets/{vennDiagram-CIIHVFJN-XSJteQrL.js → vennDiagram-CIIHVFJN-CybTaJJH.js} +1 -1
  95. package/dist/client/assets/{wardley-L42UT6IY-Btc0FRfF.js → wardley-L42UT6IY-DSxaSCGi.js} +1 -1
  96. package/dist/client/assets/{wardleyDiagram-YWT4CUSO--IcDNmrf.js → wardleyDiagram-YWT4CUSO-YFb0AxNt.js} +1 -1
  97. package/dist/client/assets/{xychartDiagram-2RQKCTM6-CZW93G6X.js → xychartDiagram-2RQKCTM6-Cv6zlMJC.js} +1 -1
  98. package/dist/client/index.html +2 -2
  99. package/dist/client/version.json +1 -1
  100. package/dist/droid-cli/package.json +1 -1
  101. package/dist/extension.js +37513 -34387
  102. package/dist/migrations/0065_fn_149_review_convergence_stage.sql +3 -0
  103. package/dist/pi-claude-cli/package.json +1 -1
  104. package/dist/plugin-sdk/index.d.ts +66 -10
  105. package/dist/plugin-sdk/index.js +103 -33
  106. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +158 -36
  107. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +103 -33
  109. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +103 -33
  111. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +103 -33
  113. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +103 -33
  115. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +103 -33
  117. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +103 -33
  119. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +103 -33
  121. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +103 -33
  123. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-linear-import/bundled.js +103 -33
  125. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +103 -33
  127. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +103 -33
  129. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +103 -33
  131. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-quality/bundled.js +103 -33
  133. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-reports/bundled.js +103 -33
  135. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-roadmap/bundled.js +103 -33
  137. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-todos/bundled.js +103 -33
  139. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  140. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +103 -33
  141. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  142. package/package.json +1 -1
  143. package/skill/fusion/references/engine-tools.md +5 -5
  144. package/dist/client/assets/ChatView-DS4XiCm_.css +0 -1
  145. package/dist/client/assets/ChatView-DoOqgkPX.js +0 -13
  146. package/dist/client/assets/CommandCenter-CJxvPbgn.js +0 -102
  147. package/dist/client/assets/DevServerView-C4nyLONX.js +0 -1
  148. package/dist/client/assets/DirectoryPicker-BIvXWIB5.js +0 -1
  149. package/dist/client/assets/DocumentsView-DH_aZysM.js +0 -1
  150. package/dist/client/assets/EvalsView-klRK-GJQ.js +0 -1
  151. package/dist/client/assets/ExperimentalAgentOnboardingModal-CgBmukIm.js +0 -1
  152. package/dist/client/assets/PluginManager-vy0YZ2Nx.js +0 -1
  153. package/dist/client/assets/SessionTerminal-2ZSXmOkG.css +0 -1
  154. package/dist/client/assets/SessionTerminal-BRI8W1-G.js +0 -2
  155. package/dist/client/assets/SettingsModal-h1A_aFqD.js +0 -21
  156. package/dist/client/assets/SetupWizardModal-nXfJp8cA.js +0 -2
  157. package/dist/client/assets/WorkflowNodeEditor-BFMM3RF_.js +0 -8
  158. package/dist/client/assets/channel-B4WN1jC_.js +0 -1
  159. package/dist/client/assets/classDiagram-4FO5ZUOK-CKE8RSOv.js +0 -1
  160. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CKE8RSOv.js +0 -1
  161. package/dist/client/assets/common-DbOCE-0i.js +0 -1
  162. package/dist/client/assets/common-DnXF4Jmj.js +0 -1
  163. package/dist/client/assets/dashboard-view-Bo_gFjdO.js +0 -1
  164. package/dist/client/assets/index-Dki2LBAp.css +0 -1
  165. package/dist/client/assets/index-oxnX59eO.js +0 -2774
  166. package/dist/client/assets/shield-alert-CDy69fl7.js +0 -6
  167. package/dist/client/assets/useDiscoveredSkillsCache-BHUasRiZ.js +0 -1
@@ -5878,6 +5878,8 @@ var tasks = projectSchema.table("tasks", {
5878
5878
  branchConflictRecoveryCount: integer("branch_conflict_recovery_count").default(0),
5879
5879
  reviewerContextRetryCount: integer("reviewer_context_retry_count").default(0),
5880
5880
  reviewerFallbackRetryCount: integer("reviewer_fallback_retry_count").default(0),
5881
+ reviewConvergenceStage: integer("review_convergence_stage").default(0),
5882
+ reviewConvergenceEscalationCount: integer("review_convergence_escalation_count").default(0),
5881
5883
  nextRecoveryAt: text("next_recovery_at"),
5882
5884
  error: text("error"),
5883
5885
  summary: text("summary"),
@@ -8975,6 +8977,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
8975
8977
  openrouterAppAttribution: void 0,
8976
8978
  openrouterModelFilters: void 0,
8977
8979
  openrouterProviderPreferences: void 0,
8980
+ orcarouterModelSync: true,
8978
8981
  opencodeGoModelSync: true,
8979
8982
  updateCheckEnabled: true,
8980
8983
  fnBinaryCheckEnabled: true,
@@ -9390,6 +9393,12 @@ var DEFAULT_PROJECT_SETTINGS = {
9390
9393
  executorEscalationProvider: void 0,
9391
9394
  executorEscalationModelId: void 0,
9392
9395
  executorEscalationNodeId: void 0,
9396
+ reviewConvergenceEscalationEnabled: true,
9397
+ reviewConvergenceEscalationProvider: void 0,
9398
+ reviewConvergenceEscalationModelId: void 0,
9399
+ reviewArbitrationEnabled: true,
9400
+ reviewArbitrationProvider: void 0,
9401
+ reviewArbitrationModelId: void 0,
9393
9402
  /**
9394
9403
  * FNXC:Merge 2026-06-26-00:00:
9395
9404
  * New and unconfigured projects default AI merge to sync a dirty checked-out integration branch, restoring the legacy stash → fast-forward → restore landing behavior. Explicit persisted merger.allowDirtyLocalCheckoutSync values still win, and no existing-project migration stamps this default into storage.
@@ -12469,6 +12478,49 @@ var BUILTIN_REVIEW_REVISION_SETTINGS = [
12469
12478
  default: DEFAULT_CODE_REVIEW_BLOCKING_SEVERITY,
12470
12479
  description: 'Minimum finding severity that lets Code Review block merge. A REVISE carrying no finding at or above this level is recorded as APPROVE_WITH_NOTES and its findings are handed to the implementer. Choose "any" to block on every REVISE.'
12471
12480
  },
12481
+ /*
12482
+ * FNXC:ReviewConvergence 2026-08-22-05:42:
12483
+ * FN-149 keeps recovery targets workflow-native so operators choose the cost and
12484
+ * capability of automatic review convergence without widening project policy.
12485
+ */
12486
+ {
12487
+ id: "reviewConvergenceEscalationEnabled",
12488
+ name: "Review convergence escalation",
12489
+ type: "boolean",
12490
+ default: true,
12491
+ description: "Run one bounded alternate-model or replan recovery when a review repeats unchanged input."
12492
+ },
12493
+ {
12494
+ id: "reviewConvergenceEscalationProvider",
12495
+ name: "Review convergence escalation provider",
12496
+ type: "string",
12497
+ description: "Provider for the optional alternate-model review remediation target."
12498
+ },
12499
+ {
12500
+ id: "reviewConvergenceEscalationModelId",
12501
+ name: "Review convergence escalation model",
12502
+ type: "string",
12503
+ description: "Model for the optional alternate-model review remediation target."
12504
+ },
12505
+ {
12506
+ id: "reviewArbitrationEnabled",
12507
+ name: "Review arbitration",
12508
+ type: "boolean",
12509
+ default: true,
12510
+ description: "Enable bounded third-model arbitration after a review disagreement persists."
12511
+ },
12512
+ {
12513
+ id: "reviewArbitrationProvider",
12514
+ name: "Review arbitration provider",
12515
+ type: "string",
12516
+ description: "Provider for the optional review arbitration target."
12517
+ },
12518
+ {
12519
+ id: "reviewArbitrationModelId",
12520
+ name: "Review arbitration model",
12521
+ type: "string",
12522
+ description: "Model for the optional review arbitration target."
12523
+ },
12472
12524
  {
12473
12525
  id: "planReviewReplanCap",
12474
12526
  name: "Plan Review replan cap",
@@ -12674,16 +12726,11 @@ You have tools to report progress. The board updates in real-time.
12674
12726
 
12675
12727
  /*
12676
12728
  FNXC:TaskRecommendations 2026-08-09-04:06:
12677
- FN-8850 requires optional, non-blocking discoveries to be captured only at the explicit accepted
12678
- completion boundary. Immediate task creation remains for required dependency coordination or an
12679
- operator-directed filing, while workflow step sessions remain unable to write recommendations.
12729
+ FN-125 requires task-execution sessions to preserve optional, non-blocking discoveries only at the
12730
+ accepted completion boundary. Durable Workflow Executor sessions cannot create or delegate tasks;
12731
+ in-scope work remains in the current task and external blockers use the honest blocked exit.
12680
12732
  */
12681
- **Out-of-scope findings at completion:** Do not automatically create a task for optional, non-blocking work discovered outside this task. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate genuine task-ready follow-ups and send \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler.
12682
-
12683
- Use \`task_create\` or \`fn_delegate_task\` only when the task explicitly requires immediate filing, necessary dependency coordination, or the operator directs it. When creating multiple related tasks, declare dependencies between them:
12684
- \`task_create(description="load door sounds", dependencies=[])\` \u2192 returns KB-050
12685
- \`task_create(description="play sound on door open/close", dependencies=["KB-050"])\`
12686
-
12733
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate optional, non-blocking findings as genuine task-ready \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler. Implement required in-scope work directly in this task.
12687
12734
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
12688
12735
 
12689
12736
  ## Task Documents
@@ -12755,16 +12802,16 @@ If you attempt to write to a path outside the worktree, the file tools will reje
12755
12802
  FNXC:WorkflowRouting 2026-06-22-17:26:
12756
12803
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
12757
12804
  -->
12758
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
12805
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
12759
12806
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
12760
12807
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
12761
12808
  - Read "Context to Read First" files before starting
12762
12809
  - Follow the "Do NOT" section strictly
12763
12810
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
12764
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
12811
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
12765
12812
  - Update documentation listed in "Must Update" and check "Check If Affected"
12766
12813
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
12767
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
12814
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
12768
12815
  - Removing code is acceptable ONLY when it is explicitly part of your task's mission
12769
12816
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
12770
12817
 
@@ -13438,7 +13485,7 @@ You have tools to report progress. The board updates in real-time.
13438
13485
 
13439
13486
  **Logging important actions:** \`task_log(message="what happened")\`
13440
13487
 
13441
- **Out-of-scope findings at completion:** When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Use \`task_create\` only for explicit immediate filing, dependency coordination, or operator direction; never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
13488
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Implement required in-scope work directly here; use the honest blocked exit only for a real external blocker. Never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
13442
13489
 
13443
13490
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
13444
13491
 
@@ -13508,15 +13555,15 @@ If you attempt to write to a path outside the worktree, the file tools will reje
13508
13555
  FNXC:WorkflowRouting 2026-06-22-17:26:
13509
13556
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
13510
13557
  -->
13511
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
13558
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
13512
13559
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
13513
13560
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
13514
13561
  - Read "Context to Read First" files before starting
13515
13562
  - Follow the "Do NOT" section strictly
13516
13563
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
13517
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
13564
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
13518
13565
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
13519
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
13566
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
13520
13567
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
13521
13568
 
13522
13569
  ## Spawning Child Agents
@@ -14383,11 +14430,15 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
14383
14430
  // execute → browser-verification (optional-group) → review. When the group is
14384
14431
  // disabled it passes through with outcome=success and routes straight to review.
14385
14432
  { from: "execute", to: "browser-verification", condition: "success" },
14386
- // browser-verification → code-review → review. Each optional-group passes through with
14387
- // outcome=success when disabled, so a task with both off routes straight to review.
14388
- { from: "browser-verification", to: "code-review", condition: "success" },
14389
- { from: "code-review", to: "completion-summary", condition: "success" },
14390
- { from: "completion-summary", to: "review", condition: "success" },
14433
+ /*
14434
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
14435
+ Completion summary runs before Code Review because its agent may acquire and write the task
14436
+ worktree. The approving review is the final write-capable pre-merge stage, so landing consumes
14437
+ evidence for the branch it will publish rather than evidence invalidated by a later summary.
14438
+ */
14439
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
14440
+ { from: "completion-summary", to: "code-review", condition: "success" },
14441
+ { from: "code-review", to: "review", condition: "success" },
14391
14442
  { from: "review", to: "merge-gate", condition: "success" },
14392
14443
  { from: "merge-gate", to: "branch-group-member-integration", condition: "outcome:auto-on" },
14393
14444
  { from: "merge-gate", to: "merge-manual-hold", condition: "outcome:auto-off" },
@@ -14400,6 +14451,12 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
14400
14451
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
14401
14452
  { from: "post-merge-verification", to: "end", condition: "success" },
14402
14453
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
14454
+ /*
14455
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
14456
+ Evidence rejected during an active graph merge is a fresh Code Review obligation, never a
14457
+ merge retry. Route the typed result to the final review gate before another landing attempt.
14458
+ */
14459
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
14403
14460
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
14404
14461
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
14405
14462
  { from: "planning", to: "end", condition: "failure" },
@@ -14697,12 +14754,15 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
14697
14754
  // KTD-5: bounded rework exhaustion → manual hold; release re-enters the group.
14698
14755
  { from: "steps", to: "rework-hold", condition: "outcome:rework-exhausted" },
14699
14756
  { from: "rework-hold", to: "browser-verification", condition: "success" },
14700
- // browser-verification → code-review → completion-summary → merge-gate; each
14701
- // optional-group passes through (outcome=success) when disabled, so a task with
14702
- // both off routes straight to completion summary and merge policy.
14703
- { from: "browser-verification", to: "code-review", condition: "success" },
14704
- { from: "code-review", to: "completion-summary", condition: "success" },
14705
- { from: "completion-summary", to: "merge-gate", condition: "success" },
14757
+ /*
14758
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
14759
+ A completion-summary agent can acquire the task worktree. It therefore precedes Code Review;
14760
+ the approval becomes the final write-sensitive pre-merge gate and cannot be invalidated by the
14761
+ built-in workflow after it is recorded.
14762
+ */
14763
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
14764
+ { from: "completion-summary", to: "code-review", condition: "success" },
14765
+ { from: "code-review", to: "merge-gate", condition: "success" },
14706
14766
  { from: "browser-verification", to: "browser-verification-remediation", condition: "failure" },
14707
14767
  { from: "browser-verification-remediation", to: "browser-verification", condition: "success", kind: "rework" },
14708
14768
  { from: "code-review", to: "code-review-remediation", condition: "failure" },
@@ -14728,6 +14788,12 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
14728
14788
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
14729
14789
  { from: "post-merge-verification", to: "end", condition: "success" },
14730
14790
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
14791
+ /*
14792
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
14793
+ A stale workspace approval returns to the final Code Review gate through a bounded rework
14794
+ edge, preserving the existing graph owner instead of burning a merge retry.
14795
+ */
14796
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
14731
14797
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
14732
14798
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
14733
14799
  { from: "merge-attempt", to: "end", condition: "failure" }
@@ -14790,11 +14856,11 @@ var RAW_BUILTIN_STEPWISE_FINAL_REVIEW_CODING_WORKFLOW_IR = (() => {
14790
14856
  if (!ir.edges.some((edge) => edge.from === "plan-replan" && edge.to === "plan-review" && edge.condition === "success")) {
14791
14857
  ir.edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
14792
14858
  }
14793
- if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "completion-summary" && edge.condition === "success")) {
14794
- ir.edges.push({ from: "code-review", to: "completion-summary", condition: "success" });
14859
+ if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "code-review" && edge.condition === "success")) {
14860
+ ir.edges.push({ from: "completion-summary", to: "code-review", condition: "success" });
14795
14861
  }
14796
- if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "merge-gate" && edge.condition === "success")) {
14797
- ir.edges.push({ from: "completion-summary", to: "merge-gate", condition: "success" });
14862
+ if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "merge-gate" && edge.condition === "success")) {
14863
+ ir.edges.push({ from: "code-review", to: "merge-gate", condition: "success" });
14798
14864
  }
14799
14865
  return ir;
14800
14866
  })();
@@ -14874,8 +14940,8 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
14874
14940
  ]);
14875
14941
  v2.nodes = v2.nodes.filter((node) => !removedNodeIds.has(node.id));
14876
14942
  v2.edges = v2.edges.filter((edge) => !removedNodeIds.has(edge.from) && !removedNodeIds.has(edge.to));
14877
- if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "code-review")) {
14878
- v2.edges.push({ from: "steps", to: "code-review", condition: "success" });
14943
+ if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "completion-summary")) {
14944
+ v2.edges.push({ from: "steps", to: "completion-summary", condition: "success" });
14879
14945
  }
14880
14946
  if (!v2.edges.some((edge) => edge.from === "merge-attempt" && edge.to === "end" && edge.condition === "success")) {
14881
14947
  v2.edges.push({ from: "merge-attempt", to: "end", condition: "success" });
@@ -15462,10 +15528,12 @@ function linear(spec) {
15462
15528
  ...hasBrowserVerification ? [browserVerificationRemediationNode("in-progress")] : [],
15463
15529
  ...hasCodeReview ? [codeReviewRemediationNode("in-progress")] : []
15464
15530
  ] : [];
15531
+ const noOpTerminalNode = hasPlanReview ? { id: "plan-review-no-op", kind: "gate", column: "todo", config: { workflowAction: "plan-review-no-op" } } : void 0;
15465
15532
  const nodes2 = [
15466
15533
  { id: "start", kind: "start" },
15467
15534
  ...workflowNodes,
15468
15535
  ...remediationNodes,
15536
+ ...noOpTerminalNode ? [noOpTerminalNode] : [],
15469
15537
  { id: "end", kind: "end" }
15470
15538
  ];
15471
15539
  const edges = [];
@@ -15481,6 +15549,8 @@ function linear(spec) {
15481
15549
  }
15482
15550
  if (hasPlanReview) {
15483
15551
  edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
15552
+ edges.push({ from: "plan-review", to: "plan-review-no-op", condition: "outcome:close-no-op" });
15553
+ edges.push({ from: "plan-review-no-op", to: "end", condition: "success" });
15484
15554
  }
15485
15555
  if (hasBrowserVerification) {
15486
15556
  edges.push({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/grok-runtime",
3
- "version": "0.2.14-beta.5",
3
+ "version": "0.2.14-beta.7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -5881,6 +5881,8 @@ var tasks = projectSchema.table("tasks", {
5881
5881
  branchConflictRecoveryCount: integer("branch_conflict_recovery_count").default(0),
5882
5882
  reviewerContextRetryCount: integer("reviewer_context_retry_count").default(0),
5883
5883
  reviewerFallbackRetryCount: integer("reviewer_fallback_retry_count").default(0),
5884
+ reviewConvergenceStage: integer("review_convergence_stage").default(0),
5885
+ reviewConvergenceEscalationCount: integer("review_convergence_escalation_count").default(0),
5884
5886
  nextRecoveryAt: text("next_recovery_at"),
5885
5887
  error: text("error"),
5886
5888
  summary: text("summary"),
@@ -8978,6 +8980,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
8978
8980
  openrouterAppAttribution: void 0,
8979
8981
  openrouterModelFilters: void 0,
8980
8982
  openrouterProviderPreferences: void 0,
8983
+ orcarouterModelSync: true,
8981
8984
  opencodeGoModelSync: true,
8982
8985
  updateCheckEnabled: true,
8983
8986
  fnBinaryCheckEnabled: true,
@@ -9393,6 +9396,12 @@ var DEFAULT_PROJECT_SETTINGS = {
9393
9396
  executorEscalationProvider: void 0,
9394
9397
  executorEscalationModelId: void 0,
9395
9398
  executorEscalationNodeId: void 0,
9399
+ reviewConvergenceEscalationEnabled: true,
9400
+ reviewConvergenceEscalationProvider: void 0,
9401
+ reviewConvergenceEscalationModelId: void 0,
9402
+ reviewArbitrationEnabled: true,
9403
+ reviewArbitrationProvider: void 0,
9404
+ reviewArbitrationModelId: void 0,
9396
9405
  /**
9397
9406
  * FNXC:Merge 2026-06-26-00:00:
9398
9407
  * New and unconfigured projects default AI merge to sync a dirty checked-out integration branch, restoring the legacy stash → fast-forward → restore landing behavior. Explicit persisted merger.allowDirtyLocalCheckoutSync values still win, and no existing-project migration stamps this default into storage.
@@ -12464,6 +12473,49 @@ var BUILTIN_REVIEW_REVISION_SETTINGS = [
12464
12473
  default: DEFAULT_CODE_REVIEW_BLOCKING_SEVERITY,
12465
12474
  description: 'Minimum finding severity that lets Code Review block merge. A REVISE carrying no finding at or above this level is recorded as APPROVE_WITH_NOTES and its findings are handed to the implementer. Choose "any" to block on every REVISE.'
12466
12475
  },
12476
+ /*
12477
+ * FNXC:ReviewConvergence 2026-08-22-05:42:
12478
+ * FN-149 keeps recovery targets workflow-native so operators choose the cost and
12479
+ * capability of automatic review convergence without widening project policy.
12480
+ */
12481
+ {
12482
+ id: "reviewConvergenceEscalationEnabled",
12483
+ name: "Review convergence escalation",
12484
+ type: "boolean",
12485
+ default: true,
12486
+ description: "Run one bounded alternate-model or replan recovery when a review repeats unchanged input."
12487
+ },
12488
+ {
12489
+ id: "reviewConvergenceEscalationProvider",
12490
+ name: "Review convergence escalation provider",
12491
+ type: "string",
12492
+ description: "Provider for the optional alternate-model review remediation target."
12493
+ },
12494
+ {
12495
+ id: "reviewConvergenceEscalationModelId",
12496
+ name: "Review convergence escalation model",
12497
+ type: "string",
12498
+ description: "Model for the optional alternate-model review remediation target."
12499
+ },
12500
+ {
12501
+ id: "reviewArbitrationEnabled",
12502
+ name: "Review arbitration",
12503
+ type: "boolean",
12504
+ default: true,
12505
+ description: "Enable bounded third-model arbitration after a review disagreement persists."
12506
+ },
12507
+ {
12508
+ id: "reviewArbitrationProvider",
12509
+ name: "Review arbitration provider",
12510
+ type: "string",
12511
+ description: "Provider for the optional review arbitration target."
12512
+ },
12513
+ {
12514
+ id: "reviewArbitrationModelId",
12515
+ name: "Review arbitration model",
12516
+ type: "string",
12517
+ description: "Model for the optional review arbitration target."
12518
+ },
12467
12519
  {
12468
12520
  id: "planReviewReplanCap",
12469
12521
  name: "Plan Review replan cap",
@@ -12669,16 +12721,11 @@ You have tools to report progress. The board updates in real-time.
12669
12721
 
12670
12722
  /*
12671
12723
  FNXC:TaskRecommendations 2026-08-09-04:06:
12672
- FN-8850 requires optional, non-blocking discoveries to be captured only at the explicit accepted
12673
- completion boundary. Immediate task creation remains for required dependency coordination or an
12674
- operator-directed filing, while workflow step sessions remain unable to write recommendations.
12724
+ FN-125 requires task-execution sessions to preserve optional, non-blocking discoveries only at the
12725
+ accepted completion boundary. Durable Workflow Executor sessions cannot create or delegate tasks;
12726
+ in-scope work remains in the current task and external blockers use the honest blocked exit.
12675
12727
  */
12676
- **Out-of-scope findings at completion:** Do not automatically create a task for optional, non-blocking work discovered outside this task. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate genuine task-ready follow-ups and send \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler.
12677
-
12678
- Use \`task_create\` or \`fn_delegate_task\` only when the task explicitly requires immediate filing, necessary dependency coordination, or the operator directs it. When creating multiple related tasks, declare dependencies between them:
12679
- \`task_create(description="load door sounds", dependencies=[])\` \u2192 returns KB-050
12680
- \`task_create(description="play sound on door open/close", dependencies=["KB-050"])\`
12681
-
12728
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, at the final accepted \`fn_task_done(outcome="completed")\` checkpoint evaluate optional, non-blocking findings as genuine task-ready \`recommendations\` (or \`recommendations: []\` when none qualify). Each recommendation needs a stable unique \`id\`, \`title\`, \`description\`, and \`category\`; never use it for a required current-task fix, blocker, secret, executable command, reasoning transcript, or filler. Implement required in-scope work directly in this task.
12682
12729
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
12683
12730
 
12684
12731
  ## Task Documents
@@ -12750,16 +12797,16 @@ If you attempt to write to a path outside the worktree, the file tools will reje
12750
12797
  FNXC:WorkflowRouting 2026-06-22-17:26:
12751
12798
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
12752
12799
  -->
12753
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
12800
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
12754
12801
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
12755
12802
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
12756
12803
  - Read "Context to Read First" files before starting
12757
12804
  - Follow the "Do NOT" section strictly
12758
12805
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
12759
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
12806
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
12760
12807
  - Update documentation listed in "Must Update" and check "Check If Affected"
12761
12808
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
12762
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
12809
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
12763
12810
  - Removing code is acceptable ONLY when it is explicitly part of your task's mission
12764
12811
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
12765
12812
 
@@ -13433,7 +13480,7 @@ You have tools to report progress. The board updates in real-time.
13433
13480
 
13434
13481
  **Logging important actions:** \`task_log(message="what happened")\`
13435
13482
 
13436
- **Out-of-scope findings at completion:** When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Use \`task_create\` only for explicit immediate filing, dependency coordination, or operator direction; never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
13483
+ **Out-of-scope findings at completion:** This task-execution session cannot create or delegate tasks. When recommendation capture is enabled, retain optional, non-blocking discoveries as task-ready \`fn_task_done\` recommendations at accepted completion, or send \`recommendations: []\` when none qualify. Implement required in-scope work directly here; use the honest blocked exit only for a real external blocker. Never recommend required current-task work, blockers, secrets, commands, reasoning, or filler.
13437
13484
 
13438
13485
  **Discovered a dependency:** \`task_add_dep(task_id="KB-XXX")\` \u2014 use when you discover mid-execution that another task must be completed first. This will return a warning first \u2014 you must call again with \`confirm=true\` to proceed. Adding a dependency stops execution, discards current work, and moves the task to triage for re-specification.
13439
13486
 
@@ -13503,15 +13550,15 @@ If you attempt to write to a path outside the worktree, the file tools will reje
13503
13550
  FNXC:WorkflowRouting 2026-06-22-17:26:
13504
13551
  Executors must not move the workflow of the task they are executing unless the user explicitly asked for that task's workflow. Agents remain free to set workflows on tasks they create because they are the creator for those new tasks.
13505
13552
  -->
13506
- - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction. You may still set the workflow on tasks you create via \`fn_task_create\` or \`fn_delegate_task\`, because you are the creator of those new tasks.
13553
+ - Do not call \`fn_workflow_select\` to change the workflow of the task you are executing; you did not create that task, the user or triage did. The only exception is when the user explicitly requested a specific workflow for this task in a steering comment, task instruction, or similar direct instruction.
13507
13554
  - **NEVER kill processes on port 4040.** Port 4040 is the production dashboard. Do not run \`kill\`, \`pkill\`, \`killall\`, or \`lsof -ti:4040 | xargs kill\` against it. If you need to start a test server, use \`--port 0\` for a random free port. If port 4040 is occupied, pick a different port \u2014 do NOT kill the occupant.
13508
13555
  - Treat the File Scope in PROMPT.md as the expected starting scope, not a hard boundary when quality gates fail
13509
13556
  - Read "Context to Read First" files before starting
13510
13557
  - Follow the "Do NOT" section strictly
13511
13558
  - If tests, lint, build, or typecheck fail and the fix requires touching code outside the declared File Scope, fix those failures directly and keep the repo green
13512
- - Use \`task_create\` for genuinely separate follow-up work, not for mandatory fixes required to make this task land cleanly
13559
+ - Implement mandatory and in-scope work directly in this task. Preserve optional out-of-scope follow-ups as completion recommendations.
13513
13560
  - NEVER delete, remove, or gut modules, interfaces, settings, exports, or test files outside your File Scope
13514
- - NEVER remove features as "cleanup" \u2014 if something seems unused, create a task for investigation instead
13561
+ - NEVER remove features as "cleanup" \u2014 if something seems unused, record an optional completion recommendation for investigation instead
13515
13562
  - If you remove existing functionality, you MUST create a changeset in \`.changeset/\` explaining the removal and rationale
13516
13563
 
13517
13564
  ## Spawning Child Agents
@@ -14378,11 +14425,15 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
14378
14425
  // execute → browser-verification (optional-group) → review. When the group is
14379
14426
  // disabled it passes through with outcome=success and routes straight to review.
14380
14427
  { from: "execute", to: "browser-verification", condition: "success" },
14381
- // browser-verification → code-review → review. Each optional-group passes through with
14382
- // outcome=success when disabled, so a task with both off routes straight to review.
14383
- { from: "browser-verification", to: "code-review", condition: "success" },
14384
- { from: "code-review", to: "completion-summary", condition: "success" },
14385
- { from: "completion-summary", to: "review", condition: "success" },
14428
+ /*
14429
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
14430
+ Completion summary runs before Code Review because its agent may acquire and write the task
14431
+ worktree. The approving review is the final write-capable pre-merge stage, so landing consumes
14432
+ evidence for the branch it will publish rather than evidence invalidated by a later summary.
14433
+ */
14434
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
14435
+ { from: "completion-summary", to: "code-review", condition: "success" },
14436
+ { from: "code-review", to: "review", condition: "success" },
14386
14437
  { from: "review", to: "merge-gate", condition: "success" },
14387
14438
  { from: "merge-gate", to: "branch-group-member-integration", condition: "outcome:auto-on" },
14388
14439
  { from: "merge-gate", to: "merge-manual-hold", condition: "outcome:auto-off" },
@@ -14395,6 +14446,12 @@ var RAW_BUILTIN_CODING_WORKFLOW_IR = {
14395
14446
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
14396
14447
  { from: "post-merge-verification", to: "end", condition: "success" },
14397
14448
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
14449
+ /*
14450
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
14451
+ Evidence rejected during an active graph merge is a fresh Code Review obligation, never a
14452
+ merge retry. Route the typed result to the final review gate before another landing attempt.
14453
+ */
14454
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
14398
14455
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
14399
14456
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
14400
14457
  { from: "planning", to: "end", condition: "failure" },
@@ -14692,12 +14749,15 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
14692
14749
  // KTD-5: bounded rework exhaustion → manual hold; release re-enters the group.
14693
14750
  { from: "steps", to: "rework-hold", condition: "outcome:rework-exhausted" },
14694
14751
  { from: "rework-hold", to: "browser-verification", condition: "success" },
14695
- // browser-verification → code-review → completion-summary → merge-gate; each
14696
- // optional-group passes through (outcome=success) when disabled, so a task with
14697
- // both off routes straight to completion summary and merge policy.
14698
- { from: "browser-verification", to: "code-review", condition: "success" },
14699
- { from: "code-review", to: "completion-summary", condition: "success" },
14700
- { from: "completion-summary", to: "merge-gate", condition: "success" },
14752
+ /*
14753
+ FNXC:WorkspaceReviewSeal 2026-08-21-19:36:
14754
+ A completion-summary agent can acquire the task worktree. It therefore precedes Code Review;
14755
+ the approval becomes the final write-sensitive pre-merge gate and cannot be invalidated by the
14756
+ built-in workflow after it is recorded.
14757
+ */
14758
+ { from: "browser-verification", to: "completion-summary", condition: "success" },
14759
+ { from: "completion-summary", to: "code-review", condition: "success" },
14760
+ { from: "code-review", to: "merge-gate", condition: "success" },
14701
14761
  { from: "browser-verification", to: "browser-verification-remediation", condition: "failure" },
14702
14762
  { from: "browser-verification-remediation", to: "browser-verification", condition: "success", kind: "rework" },
14703
14763
  { from: "code-review", to: "code-review-remediation", condition: "failure" },
@@ -14723,6 +14783,12 @@ var RAW_BUILTIN_STEPWISE_CODING_WORKFLOW_IR = {
14723
14783
  { from: "merge-attempt", to: "post-merge-verification", condition: "success" },
14724
14784
  { from: "post-merge-verification", to: "end", condition: "success" },
14725
14785
  { from: "merge-attempt", to: "merge-retry", condition: "outcome:transient-failure" },
14786
+ /*
14787
+ FNXC:WorkspaceReviewReroute 2026-08-21-20:11:
14788
+ A stale workspace approval returns to the final Code Review gate through a bounded rework
14789
+ edge, preserving the existing graph owner instead of burning a merge retry.
14790
+ */
14791
+ { from: "merge-attempt", to: "code-review", condition: "outcome:workspace-review-required", kind: "rework" },
14726
14792
  { from: "merge-attempt", to: "merge-manual-hold", condition: "outcome:manual-required" },
14727
14793
  { from: "recovery-router", to: "merge-attempt", condition: "outcome:wake-merge", kind: "rework" },
14728
14794
  { from: "merge-attempt", to: "end", condition: "failure" }
@@ -14785,11 +14851,11 @@ var RAW_BUILTIN_STEPWISE_FINAL_REVIEW_CODING_WORKFLOW_IR = (() => {
14785
14851
  if (!ir.edges.some((edge) => edge.from === "plan-replan" && edge.to === "plan-review" && edge.condition === "success")) {
14786
14852
  ir.edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
14787
14853
  }
14788
- if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "completion-summary" && edge.condition === "success")) {
14789
- ir.edges.push({ from: "code-review", to: "completion-summary", condition: "success" });
14854
+ if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "code-review" && edge.condition === "success")) {
14855
+ ir.edges.push({ from: "completion-summary", to: "code-review", condition: "success" });
14790
14856
  }
14791
- if (!ir.edges.some((edge) => edge.from === "completion-summary" && edge.to === "merge-gate" && edge.condition === "success")) {
14792
- ir.edges.push({ from: "completion-summary", to: "merge-gate", condition: "success" });
14857
+ if (!ir.edges.some((edge) => edge.from === "code-review" && edge.to === "merge-gate" && edge.condition === "success")) {
14858
+ ir.edges.push({ from: "code-review", to: "merge-gate", condition: "success" });
14793
14859
  }
14794
14860
  return ir;
14795
14861
  })();
@@ -14869,8 +14935,8 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
14869
14935
  ]);
14870
14936
  v2.nodes = v2.nodes.filter((node) => !removedNodeIds.has(node.id));
14871
14937
  v2.edges = v2.edges.filter((edge) => !removedNodeIds.has(edge.from) && !removedNodeIds.has(edge.to));
14872
- if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "code-review")) {
14873
- v2.edges.push({ from: "steps", to: "code-review", condition: "success" });
14938
+ if (!v2.edges.some((edge) => edge.from === "steps" && edge.to === "completion-summary")) {
14939
+ v2.edges.push({ from: "steps", to: "completion-summary", condition: "success" });
14874
14940
  }
14875
14941
  if (!v2.edges.some((edge) => edge.from === "merge-attempt" && edge.to === "end" && edge.condition === "success")) {
14876
14942
  v2.edges.push({ from: "merge-attempt", to: "end", condition: "success" });
@@ -15457,10 +15523,12 @@ function linear(spec) {
15457
15523
  ...hasBrowserVerification ? [browserVerificationRemediationNode("in-progress")] : [],
15458
15524
  ...hasCodeReview ? [codeReviewRemediationNode("in-progress")] : []
15459
15525
  ] : [];
15526
+ const noOpTerminalNode = hasPlanReview ? { id: "plan-review-no-op", kind: "gate", column: "todo", config: { workflowAction: "plan-review-no-op" } } : void 0;
15460
15527
  const nodes2 = [
15461
15528
  { id: "start", kind: "start" },
15462
15529
  ...workflowNodes,
15463
15530
  ...remediationNodes,
15531
+ ...noOpTerminalNode ? [noOpTerminalNode] : [],
15464
15532
  { id: "end", kind: "end" }
15465
15533
  ];
15466
15534
  const edges = [];
@@ -15476,6 +15544,8 @@ function linear(spec) {
15476
15544
  }
15477
15545
  if (hasPlanReview) {
15478
15546
  edges.push({ from: "plan-replan", to: "plan-review", condition: "success", kind: "rework" });
15547
+ edges.push({ from: "plan-review", to: "plan-review-no-op", condition: "outcome:close-no-op" });
15548
+ edges.push({ from: "plan-review-no-op", to: "end", condition: "success" });
15479
15549
  }
15480
15550
  if (hasBrowserVerification) {
15481
15551
  edges.push({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.86-beta.5",
3
+ "version": "0.2.86-beta.7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {