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

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 (155) hide show
  1. package/dist/bin.js +9130 -4814
  2. package/dist/child-process-worker.js +9665 -6048
  3. package/dist/client/.vite/manifest.json +260 -260
  4. package/dist/client/assets/{AgentDetailView-C1eh_vXv.js → AgentDetailView-DLzgMG5W.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-CeKsO1LR.js → AgentPermissionPolicyEditor-CHoQs5wt.js} +1 -1
  6. package/dist/client/assets/{AgentsView-BNe2ABOc.js → AgentsView-LDH9ih8-.js} +3 -3
  7. package/dist/client/assets/{CommandCenter-BuREM-G1.js → CommandCenter-DQ2Wjfo6.js} +1 -1
  8. package/dist/client/assets/{DevServerView-D0i1b-QO.js → DevServerView-NunavHb5.js} +1 -1
  9. package/dist/client/assets/{DirectoryPicker-VOx91hQt.js → DirectoryPicker-FymMYoLf.js} +1 -1
  10. package/dist/client/assets/{DocumentsView-CO5W_WVb.js → DocumentsView-By9SHDrK.js} +1 -1
  11. package/dist/client/assets/{EvalsView-BqSINSrZ.js → EvalsView-KHDm_jIP.js} +1 -1
  12. package/dist/client/assets/{ExperimentalAgentOnboardingModal-DEcFgONi.js → ExperimentalAgentOnboardingModal-CXZXL44D.js} +1 -1
  13. package/dist/client/assets/{GoalsView-DZ57wXmJ.js → GoalsView-CXJQllGu.js} +1 -1
  14. package/dist/client/assets/{InsightsView-DSWfXG7Q.js → InsightsView-PSlbun5-.js} +1 -1
  15. package/dist/client/assets/{MemoryView-BEX10uhl.js → MemoryView-Bj31SvJV.js} +1 -1
  16. package/dist/client/assets/{PiExtensionsManager-DcAmXXoR.js → PiExtensionsManager-CbEnWrEb.js} +1 -1
  17. package/dist/client/assets/{PluginManager-BU0omQUv.js → PluginManager-Ncr6jySY.js} +1 -1
  18. package/dist/client/assets/{PullRequestView-B-JL_8Kk.js → PullRequestView-3cR6DptH.js} +1 -1
  19. package/dist/client/assets/ReportModal-0cDRUWOi.js +21 -0
  20. package/dist/client/assets/ReportModal-Dx3f2aj7.css +1 -0
  21. package/dist/client/assets/{ResearchView-CnwTXfQO.js → ResearchView-rnrVF79-.js} +1 -1
  22. package/dist/client/assets/{SecretsView-BDvzsLFz.js → SecretsView-kF17RkhO.js} +1 -1
  23. package/dist/client/assets/{SettingsModal-BZHeQ3ED.js → SettingsModal-BQdO_hEg.js} +1 -1
  24. package/dist/client/assets/SettingsModal-DZdXfRcf.css +1 -0
  25. package/dist/client/assets/SettingsModal-DsA3Vg3y.js +21 -0
  26. package/dist/client/assets/{SettingsTextareaRow-B0rTuelr.js → SettingsTextareaRow-BmxrECAt.js} +1 -1
  27. package/dist/client/assets/{SetupWizardModal-CoExPwIn.js → SetupWizardModal-Dlgtw7CJ.js} +2 -2
  28. package/dist/client/assets/{SkillsView-WVP25LPj.js → SkillsView-D6BmZdru.js} +1 -1
  29. package/dist/client/assets/{WorkflowNodeEditor-pCMyKcnS.js → WorkflowNodeEditor-CVHHMqvn.js} +1 -1
  30. package/dist/client/assets/{agent-import-generation-M_hKtjgN.js → agent-import-generation-CnrRwmdq.js} +1 -1
  31. package/dist/client/assets/{agentsOrgChartLayout-DjvIMhFD.js → agentsOrgChartLayout-purG_-3A.js} +1 -1
  32. package/dist/client/assets/app-BE1XE5i8.js +5 -0
  33. package/dist/client/assets/app-BZBG5TsV.js +5 -0
  34. package/dist/client/assets/app-BZk9L8ul.js +13 -0
  35. package/dist/client/assets/app-CSFGL3vj.js +13 -0
  36. package/dist/client/assets/app-CfwwdZoX.js +13 -0
  37. package/dist/client/assets/app-CtSn_Ct1.js +13 -0
  38. package/dist/client/assets/app-CyJ_qBtM.js +13 -0
  39. package/dist/client/assets/{architectureDiagram-3BPJPVTR-CkzEm8i9.js → architectureDiagram-3BPJPVTR-D_oUETkg.js} +1 -1
  40. package/dist/client/assets/{blockDiagram-GPEHLZMM-Dc-dUMjY.js → blockDiagram-GPEHLZMM-SeVvCFBr.js} +1 -1
  41. package/dist/client/assets/{c4Diagram-AAUBKEIU-DnYjsrR0.js → c4Diagram-AAUBKEIU-C-bOAkwQ.js} +1 -1
  42. package/dist/client/assets/channel-CxElf6wV.js +1 -0
  43. package/dist/client/assets/{chunk-2J33WTMH-0E1GEFEr.js → chunk-2J33WTMH-Dfy3ok0u.js} +1 -1
  44. package/dist/client/assets/{chunk-4BX2VUAB-Dj5oZd51.js → chunk-4BX2VUAB-CJhw204d.js} +1 -1
  45. package/dist/client/assets/{chunk-55IACEB6-DfNT0s8E.js → chunk-55IACEB6-Sgt6UphC.js} +1 -1
  46. package/dist/client/assets/{chunk-727SXJPM-BnFjhiIQ.js → chunk-727SXJPM-BvQJpRvs.js} +1 -1
  47. package/dist/client/assets/{chunk-AQP2D5EJ-DR84wSqR.js → chunk-AQP2D5EJ-Cthfrcwy.js} +1 -1
  48. package/dist/client/assets/{chunk-FMBD7UC4-IjByNOrR.js → chunk-FMBD7UC4-Cz3x993o.js} +1 -1
  49. package/dist/client/assets/{chunk-ND2GUHAM-By0q_jZm.js → chunk-ND2GUHAM-PNcjW0Zw.js} +1 -1
  50. package/dist/client/assets/{chunk-QZHKN3VN-BELcl3N5.js → chunk-QZHKN3VN-4nKyNxvF.js} +1 -1
  51. package/dist/client/assets/classDiagram-4FO5ZUOK-CtVaR4ZF.js +1 -0
  52. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CtVaR4ZF.js +1 -0
  53. package/dist/client/assets/{cose-bilkent-S5V4N54A-D4cCw9-_.js → cose-bilkent-S5V4N54A-Ceay49Yk.js} +1 -1
  54. package/dist/client/assets/{dagre-BM42HDAG-JJp5dVeY.js → dagre-BM42HDAG-D9VGvuIj.js} +1 -1
  55. package/dist/client/assets/{dashboard-view-6zPJm9zC.js → dashboard-view-BBWCZOq1.js} +1 -1
  56. package/dist/client/assets/{dashboard-view-MAC_LHDX.js → dashboard-view-RQ4TPddv.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-C5Nt8cvY.js → dashboard-view-ZGUl38Cw.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-Bl9CPhxE.js → dashboard-view-gpkvNzBo.js} +1 -1
  59. package/dist/client/assets/{diagram-2AECGRRQ-D4L7j_t_.js → diagram-2AECGRRQ-Q5XXKnnv.js} +1 -1
  60. package/dist/client/assets/{diagram-5GNKFQAL-VAGFaXqG.js → diagram-5GNKFQAL-ByGKtZN7.js} +1 -1
  61. package/dist/client/assets/{diagram-KO2AKTUF-hqXSggfW.js → diagram-KO2AKTUF-B5wCSTUz.js} +1 -1
  62. package/dist/client/assets/{diagram-LMA3HP47-B3eAIuy8.js → diagram-LMA3HP47-C4eGtq1N.js} +1 -1
  63. package/dist/client/assets/{diagram-OG6HWLK6-BGufp0RK.js → diagram-OG6HWLK6-BxTb4tZr.js} +1 -1
  64. package/dist/client/assets/{erDiagram-TEJ5UH35-DplXdx8w.js → erDiagram-TEJ5UH35-CWt1TSp9.js} +1 -1
  65. package/dist/client/assets/{flowDiagram-I6XJVG4X-C1Ms2bko.js → flowDiagram-I6XJVG4X-DUAfL604.js} +1 -1
  66. package/dist/client/assets/{folder-open-nMraSDXu.js → folder-open-CihApyzT.js} +1 -1
  67. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DVgxMtXb.js → ganttDiagram-6RSMTGT7-DBS31zRY.js} +1 -1
  68. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DH2_n0J8.js → gitGraphDiagram-PVQCEYII-BmYxNXvm.js} +1 -1
  69. package/dist/client/assets/index-BN0mudGK.js +2898 -0
  70. package/dist/client/assets/index-Bi6-k7Mt.css +1 -0
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-DmZdWVcU.js → infoDiagram-5YYISTIA-oeqISHuE.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DsEIHSXr.js → ishikawaDiagram-YF4QCWOH-De7HSTs3.js} +1 -1
  73. package/dist/client/assets/{journeyDiagram-JHISSGLW-CsfIWmu1.js → journeyDiagram-JHISSGLW-CnOQgak6.js} +1 -1
  74. package/dist/client/assets/{kanban-definition-UN3LZRKU-CQKqeZvc.js → kanban-definition-UN3LZRKU-DkkSXQc1.js} +1 -1
  75. package/dist/client/assets/{mermaid.core-DkC_dr4-.js → mermaid.core-DPtpszZ3.js} +4 -4
  76. package/dist/client/assets/{mindmap-definition-RKZ34NQL-RnmE-NUe.js → mindmap-definition-RKZ34NQL-CTVye-HX.js} +1 -1
  77. package/dist/client/assets/{pieDiagram-4H26LBE5-DPu6FPc4.js → pieDiagram-4H26LBE5-Dls6obgy.js} +1 -1
  78. package/dist/client/assets/{puzzle-DwhHOf32.js → puzzle-o6sQbTzB.js} +1 -1
  79. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CYbypO2p.js → quadrantDiagram-W4KKPZXB-BPHggPTG.js} +1 -1
  80. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DFk1vK_N.js → requirementDiagram-4Y6WPE33-Cdtv6VSz.js} +1 -1
  81. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CkUY1Zzu.js → sankeyDiagram-5OEKKPKP-CgQ4VG36.js} +1 -1
  82. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-CFivaLOO.js → sequenceDiagram-3UESZ5HK-DllpS820.js} +1 -1
  83. package/dist/client/assets/{standing-instructions-template-BbqKGAC1.js → standing-instructions-template-BpjTC7lE.js} +1 -1
  84. package/dist/client/assets/{stateDiagram-AJRCARHV-BPeD5PwG.js → stateDiagram-AJRCARHV-BjDL2xGC.js} +1 -1
  85. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DduiCPMb.js → stateDiagram-v2-BHNVJYJU-CvKLFCGR.js} +1 -1
  86. package/dist/client/assets/{timeline-definition-PNZ67QCA-CGUNNVro.js → timeline-definition-PNZ67QCA-BHlmiUIC.js} +1 -1
  87. package/dist/client/assets/{upload-BS96H1o7.js → upload-Bn7DjmMR.js} +1 -1
  88. package/dist/client/assets/{users--irrWoyU.js → users-CAwUf5mJ.js} +1 -1
  89. package/dist/client/assets/{vennDiagram-CIIHVFJN-CybTaJJH.js → vennDiagram-CIIHVFJN-_pYBvG2q.js} +1 -1
  90. package/dist/client/assets/{wardley-L42UT6IY-DSxaSCGi.js → wardley-L42UT6IY-Cnu65RLv.js} +1 -1
  91. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-YFb0AxNt.js → wardleyDiagram-YWT4CUSO-DQC_N8jk.js} +1 -1
  92. package/dist/client/assets/{xychartDiagram-2RQKCTM6-Cv6zlMJC.js → xychartDiagram-2RQKCTM6-CMaINq7s.js} +1 -1
  93. package/dist/client/index.html +13 -6
  94. package/dist/client/theme-data.css +85 -0
  95. package/dist/client/version.json +1 -1
  96. package/dist/droid-cli/package.json +1 -1
  97. package/dist/extension.js +8370 -4577
  98. package/dist/migrations/0066_chat_session_memory_focus.sql +20 -0
  99. package/dist/migrations/0067_fn_179_session_contention_wait_state.sql +3 -0
  100. package/dist/pi-claude-cli/package.json +1 -1
  101. package/dist/plugin-sdk/index.d.ts +58 -4
  102. package/dist/plugin-sdk/index.js +361 -20
  103. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +379 -38
  104. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  105. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +374 -33
  106. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  107. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +361 -20
  108. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  109. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +361 -20
  110. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  111. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +361 -20
  112. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  113. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +361 -20
  114. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  115. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +361 -20
  116. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  117. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +374 -33
  118. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  119. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +361 -20
  120. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  121. package/dist/plugins/fusion-plugin-linear-import/bundled.js +361 -20
  122. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  123. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +374 -33
  124. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  125. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +361 -20
  126. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  127. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +361 -20
  128. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  129. package/dist/plugins/fusion-plugin-quality/bundled.js +361 -20
  130. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  131. package/dist/plugins/fusion-plugin-reports/bundled.js +361 -20
  132. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  133. package/dist/plugins/fusion-plugin-roadmap/bundled.js +361 -20
  134. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  135. package/dist/plugins/fusion-plugin-todos/bundled.js +361 -20
  136. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  137. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +464 -6486
  138. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  139. package/package.json +1 -1
  140. package/dist/client/assets/ReportModal-DxggF_RH.js +0 -21
  141. package/dist/client/assets/ReportModal-lzN_xrnM.css +0 -1
  142. package/dist/client/assets/SettingsModal-801eFQ9u.js +0 -21
  143. package/dist/client/assets/SettingsModal-Ds0Yj47X.css +0 -1
  144. package/dist/client/assets/app-BOvA34XN.js +0 -13
  145. package/dist/client/assets/app-Bic4iWXQ.js +0 -13
  146. package/dist/client/assets/app-BlbH7Tir.js +0 -5
  147. package/dist/client/assets/app-C6TctczU.js +0 -13
  148. package/dist/client/assets/app-D3qZmEIu.js +0 -13
  149. package/dist/client/assets/app-DLnMkUt5.js +0 -5
  150. package/dist/client/assets/app-mNy0DeDM.js +0 -13
  151. package/dist/client/assets/channel-CxQ40s_U.js +0 -1
  152. package/dist/client/assets/classDiagram-4FO5ZUOK-C2ARdiRL.js +0 -1
  153. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-C2ARdiRL.js +0 -1
  154. package/dist/client/assets/index-BJc-A7eB.css +0 -1
  155. package/dist/client/assets/index-CBFPgFTp.js +0 -2787
@@ -5877,6 +5877,8 @@ var tasks = projectSchema.table("tasks", {
5877
5877
  executeRequeueLoopCount: integer("execute_requeue_loop_count").default(0),
5878
5878
  executeRequeueLoopSignature: text("execute_requeue_loop_signature"),
5879
5879
  recoveryRetryCount: integer("recovery_retry_count"),
5880
+ sessionContentionHoldCount: integer("session_contention_hold_count").default(0),
5881
+ sessionContentionWaitReason: text("session_contention_wait_reason"),
5880
5882
  taskDoneRetryCount: integer("task_done_retry_count").default(0),
5881
5883
  // FNXC:Lifecycle 2026-07-16-21:40: FN-8141 skip-bypass taint marker (nullable ISO timestamp).
5882
5884
  bulkCompletionRefusalAt: text("bulk_completion_refusal_at"),
@@ -7799,6 +7801,12 @@ var chatSessions = projectSchema.table("chat_sessions", {
7799
7801
  // FNXC:ChatPinned 2026-07-16-12:00: nullable timestamp persists the active
7800
7802
  // Direct-session pin; the ChatStore enforces the per-scope max-three invariant.
7801
7803
  pinnedAt: text("pinned_at"),
7804
+ // FNXC:MemoryFocus 2026-08-13-15:57: per-conversation read-time memory FOCUS/TOPIC
7805
+ // (migration 0059). NULL/empty ('' normalized to NULL) means the conversation
7806
+ // inherits the whole-project scope; otherwise it scopes fn_memory_search +
7807
+ // proactive recall to this topic. It is a read-time filter only — Stash capture
7808
+ // stays write-anywhere across every conversation.
7809
+ memoryFocus: text("memory_focus"),
7802
7810
  cliSessionFile: text("cli_session_file"),
7803
7811
  inFlightGeneration: jsonb("in_flight_generation"),
7804
7812
  cliExecutorAdapterId: text("cli_executor_adapter_id")
@@ -8228,7 +8236,42 @@ var projectTableNames = [
8228
8236
  "chat_rooms",
8229
8237
  "chat_room_members",
8230
8238
  "chat_room_messages",
8231
- "chat_token_usage"
8239
+ "chat_token_usage",
8240
+ /*
8241
+ FNXC:WorkspaceCoordination 2026-08-23-20:05:
8242
+ FN-9059 (migration 0060) added these two tables to the schema without registering them here, so
8243
+ every registry consumer under-counted them: the PostgreSQL test harness never TRUNCATEd them
8244
+ between tests (a held `repo:<repo>` lease leaked from one case into the next and made the next
8245
+ land report the previous test's successor as the busy holder), and health compaction skipped them.
8246
+ */
8247
+ "workspace_coordination_leases",
8248
+ "workspace_land_intents",
8249
+ /*
8250
+ FNXC:PgTableRegistry 2026-08-23-16:05:
8251
+ Second occurrence of the FN-9059 omission above, found by a leaking `current_plan_evidence` row:
8252
+ a task's plan-evidence version counter continued across tests (a fresh KB-002 started at v2), so
8253
+ `task-dependency-mutation.pg` asserted version 2 and read 3 in a whole-file run while passing in
8254
+ isolation. Every table declared with `projectSchema.table(...)` must be registered here — the
8255
+ harness reset and health compaction both drive off this list, and an unregistered table is simply
8256
+ never cleaned. `project-table-registry.test.ts` now fails when the two drift apart.
8257
+ */
8258
+ "chat_session_tags",
8259
+ "chat_tags",
8260
+ "configuration_revisions",
8261
+ "current_plan_evidence",
8262
+ "mission_lineage_stops",
8263
+ "spec_drift_reports",
8264
+ "spec_locks",
8265
+ "symbol_locks",
8266
+ "task_lifecycle_consumer_cursors",
8267
+ "task_lifecycle_consumer_dead_letters",
8268
+ "task_lifecycle_consumer_receipts",
8269
+ "task_lifecycle_consumer_registrations",
8270
+ "task_lifecycle_event_seq",
8271
+ "task_lifecycle_events",
8272
+ "task_verification_requests",
8273
+ "unplanned_execution_blocks",
8274
+ "workflow_agent_capacity_leases"
8232
8275
  ];
8233
8276
 
8234
8277
  // ../core/src/postgres/schema/central.ts
@@ -9091,6 +9134,7 @@ var DEFAULT_GLOBAL_SETTINGS = {
9091
9134
  defaultProjectId: void 0,
9092
9135
  setupComplete: void 0,
9093
9136
  cliOnboardingCompletedAt: void 0,
9137
+ githubStarPromptDismissedAt: void 0,
9094
9138
  favoriteProviders: void 0,
9095
9139
  favoriteModels: void 0,
9096
9140
  openrouterModelSync: true,
@@ -9120,7 +9164,10 @@ var DEFAULT_GLOBAL_SETTINGS = {
9120
9164
  /* FNXC:UpdateAutomation 2026-08-21-02:48: Keep these schema keys unset because defaults merge into effective settings and `undefined` is distinct from explicit false. */
9121
9165
  autoUpdateEnabled: void 0,
9122
9166
  autoRestartAfterUpdate: void 0,
9123
- autoReloadOnVersionChange: true,
9167
+ /*
9168
+ FNXC:VersionAutoReload 2026-08-23-04:03:
9169
+ Version-change reload is mandatory, so its key is retired. Older persisted values are ignored because GLOBAL_SETTINGS_KEYS derives from this object and rejects unknown keys before save patches.
9170
+ */
9124
9171
  githubTrackingDefaultRepo: void 0,
9125
9172
  reportRoadmapDedupeEnabled: void 0,
9126
9173
  reportRoadmapLabel: void 0,
@@ -9513,12 +9560,16 @@ var DEFAULT_PROJECT_SETTINGS = {
9513
9560
  executorEscalationProvider: void 0,
9514
9561
  executorEscalationModelId: void 0,
9515
9562
  executorEscalationNodeId: void 0,
9516
- reviewConvergenceEscalationEnabled: true,
9517
- reviewConvergenceEscalationProvider: void 0,
9518
- reviewConvergenceEscalationModelId: void 0,
9519
- reviewArbitrationEnabled: true,
9520
- reviewArbitrationProvider: void 0,
9521
- reviewArbitrationModelId: void 0,
9563
+ /*
9564
+ FNXC:ReviewConvergence 2026-08-23-21:05:
9565
+ FN-149's six review-convergence/arbitration keys are declared in BUILTIN_WORKFLOW_SETTINGS, which
9566
+ the U4 hard-move made the SINGLE source of truth for a moved key's default. Re-declaring them here
9567
+ put them back in the legacy object the hard-move emptied, so an undeclared key on a custom workflow
9568
+ could resolve to this literal instead of the declaration default — the exact drift
9569
+ `workflow-settings-fallback-alignment` guards. The declaration defaults are identical (both
9570
+ `*Enabled` default true, the provider/model lanes carry no default), and the reader uses
9571
+ `!== false`, so removing them here preserves behaviour and restores the invariant.
9572
+ */
9522
9573
  /**
9523
9574
  * FNXC:Merge 2026-06-26-00:00:
9524
9575
  * 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.
@@ -9711,6 +9762,40 @@ var DEFAULT_PROJECT_SETTINGS = {
9711
9762
  taskEvaluationRetention: void 0,
9712
9763
  memoryEnabled: true,
9713
9764
  memoryBackendType: "qmd",
9765
+ // FNXC:StashConfig 2026-08-13-16:35: (RUFU-068) Optional per-project Stash LCM
9766
+ // memory backend config. stashUrl points at the operator's Stash server
9767
+ // (default http://127.0.0.1:3457). stashApiKey is an override for hard
9768
+ // isolation (separate Stash instance/account); the PRIMARY API key lives in
9769
+ // the global secrets store ("stash-api-key") and is NEVER committed. Project
9770
+ // value wins over global. TencentDB's URL setting is intentionally NOT ported.
9771
+ stashUrl: "",
9772
+ stashApiKey: "",
9773
+ /*
9774
+ FNXC:Rufu126VectorSearch 2026-08-19-10:50:
9775
+ RUFU-126 (D3): opt-in vector (semantic) recall for the Stash memory backend.
9776
+ Default OFF — zero behavior change until the operator enables it (this is a
9777
+ prototype; rejected alternative was automatic capability detection, which
9778
+ would change default behavior and pay a per-process 404 round-trip against
9779
+ unpatched servers). When true, multi-word (≥2 tokens) recall queries try the
9780
+ Stash GET /api/v1/me/sessions/events/semantic-search endpoint first and fall
9781
+ back byte-identically to the RUFU-121 keyword path on any vector failure
9782
+ (see memory-backend-stash.ts search() + docs/research/stash-vector-search-evaluation.md
9783
+ for D1–D5). Schema-only, consistent with stashUrl/stashApiKey (no UI row).
9784
+ */
9785
+ stashVectorSearch: false,
9786
+ /*
9787
+ FNXC:StashSessionCapture 2026-08-19-04:37:
9788
+ (RUFU-122) Task-terminal transcript upload defaults. All are inert unless
9789
+ memoryBackendType === "stash". executorSessionCaptureEnabled gates ONLY the
9790
+ transcript upload (the RUFU-068 terminal anchor event still fires when it is
9791
+ off) and defaults ON. executorSessionCaptureMaxEvents caps transcript events
9792
+ per task; the engine keeps the most recent N (default 20000).
9793
+ executorSessionCaptureIncludeStatus is the schema-only "keep a setting" for
9794
+ uploading `status` log entries (default off; no UI row).
9795
+ */
9796
+ executorSessionCaptureEnabled: true,
9797
+ executorSessionCaptureMaxEvents: 2e4,
9798
+ executorSessionCaptureIncludeStatus: false,
9714
9799
  memoryAutoSummarizeEnabled: false,
9715
9800
  memoryAutoSummarizeThresholdChars: 5e4,
9716
9801
  memoryAutoSummarizeSchedule: "0 3 * * *",
@@ -10411,6 +10496,20 @@ function classifyWorkflowAgentNode(node) {
10411
10496
  }
10412
10497
  }
10413
10498
 
10499
+ // ../core/src/workflows/workflow-merge-region.ts
10500
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10501
+ "merge-gate",
10502
+ "merge-attempt",
10503
+ "manual-merge-hold",
10504
+ "retry-backoff",
10505
+ "recovery-router",
10506
+ "branch-group-member-integration",
10507
+ "branch-group-promotion",
10508
+ "pr-create",
10509
+ "pr-respond",
10510
+ "pr-merge"
10511
+ ]);
10512
+
10414
10513
  // ../core/src/workflows/workflow-extension-types.ts
10415
10514
  function workflowExtensionRegistryId(pluginId, extensionId) {
10416
10515
  return `plugin:${pluginId}:${extensionId}`;
@@ -10939,18 +11038,7 @@ function reachableFrom(start, outgoing) {
10939
11038
  }
10940
11039
  return seen;
10941
11040
  }
10942
- var INTERPRETER_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10943
- "merge-gate",
10944
- "merge-attempt",
10945
- "manual-merge-hold",
10946
- "retry-backoff",
10947
- "recovery-router",
10948
- "branch-group-member-integration",
10949
- "branch-group-promotion",
10950
- "pr-create",
10951
- "pr-respond",
10952
- "pr-merge"
10953
- ]);
11041
+ var INTERPRETER_ENTRY_NODE_KINDS = MERGE_REGION_ENTRY_NODE_KINDS;
10954
11042
  var MERGE_CLASS_NODE_KINDS = /* @__PURE__ */ new Set([
10955
11043
  "merge-gate",
10956
11044
  "merge-attempt",
@@ -12970,6 +13058,13 @@ Lint, tests, and typecheck are also hard quality gates:
12970
13058
  - Keep fixing failures caused by your change until lint, impacted tests, build, and typecheck pass.
12971
13059
  - If the repository exposes a typecheck command, run it and fix failures caused by your change.
12972
13060
  - When tests fail, classify whether the failure is caused by your change, a pre-existing defect, an unrelated flaky test, or an outdated test expectation.
13061
+
13062
+ **A behavior change owns every test that asserts the old behavior.** Targeted verification runs the tests for files you TOUCHED; the tests encoding the behavior you just changed usually live in files you did NOT touch, so a green targeted run is not evidence that none exist. Before finishing, search for them:
13063
+ - Added a guard, validation, or required field? Grep for the FIXTURES it will now refuse \u2014 they are outside your File Scope \u2014 and fix each to state its intent explicitly.
13064
+ - Removed a feature? Delete its tests. A test asserting a deliberately removed contract guards nothing, and making it pass later means re-adding removed behavior.
13065
+ - Changed an order, default, constant, or prompt string? Grep for the literal; topology lists, prompt-content assertions, and size budgets live far from the code they describe.
13066
+ - Added a public store/service method? Update the inventory/drift guards that require every public surface to be classified.
13067
+ Fix at the SHARED FIXTURE FACTORY, not per test \u2014 one helper usually explains dozens of failures. Never make a stale test pass by weakening it: update the fixture, record the new truth, or delete the test naming the change that removed its subject.
12973
13068
  - If broad workspace verification fails on unrelated or pre-existing failures after impacted checks pass, do NOT expand this task by fixing unrelated areas. Log the evidence, quarantine flakes per project policy, or create/link a follow-up task.
12974
13069
  - Do not repeatedly rerun a broad failing or hanging workspace command without a new hypothesis and a narrower confirming command.
12975
13070
 
@@ -13242,6 +13337,7 @@ files with assertions that run via a test runner. Typechecks and builds are NOT
13242
13337
  tests. Manual verification is NOT a test.
13243
13338
 
13244
13339
  - Each implementation step should include writing tests for the code being changed
13340
+ - **If the task CHANGES, GATES, or REMOVES existing behavior, include a step to find and update the tests that assert the OLD behavior.** Name the search in that step: the fixtures a new guard will now refuse, the tests of a removed feature, or the literal to grep for a changed order/default/constant/prompt string. Those tests live OUTSIDE the File Scope, so targeted verification will not surface them and the executor will not find them by accident. Measured 2026-08-24: five such changes left ~135 stale failing tests behind, every one having passed its own targeted verification; one shared fixture line accounted for 37 of them.
13245
13341
  - For bug fixes and UI-affordance add/remove tasks, the spec MUST include a \`## Surface Enumeration\` section. The workflow Plan Review gate validates this before execution when plan review is enabled; missing coverage is a blocking REVISE.
13246
13342
  - For bug fixes and UI-affordance add/remove tasks, populate \`## Surface Enumeration\` with this checklist from \`docs/testing.md\`: providers/bridges/execution paths; desktop + mobile breakpoints/platforms; empty/undefined/duplicate/populated data states; shared hooks/components/modules/helpers; every component that renders the affordance; leftover shells after removal.
13247
13343
  - For bug fixes and UI-affordance add/remove tasks, regression tests must assert the invariant across all known surfaces \u2014 enumerate every provider/bridge, desktop + mobile breakpoints, empty/undefined/populated data states, and for UI-affordance changes every component rendering the affordance plus leftover shells after removal \u2014 not just the reported repro (see FN-5787/FN-5789/FN-5803, FN-5751, and FN-6115/FN-6118/FN-6123)
@@ -14037,10 +14133,59 @@ var DEFAULT_TRIAGE_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id ===
14037
14133
  var DEFAULT_TRIAGE_FAST_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.id === "default-triage-fast")?.prompt ?? "";
14038
14134
  var DEFAULT_REVIEWER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "reviewer")?.prompt ?? "";
14039
14135
  var DEFAULT_MERGER_PROMPT = BUILTIN_AGENT_PROMPTS.find((prompt) => prompt.role === "merger")?.prompt ?? "";
14136
+ var REVIEW_GATE_STEP_TEMPLATE_START = "### Step {N-1}: Testing & Verification";
14137
+ var REVIEW_GATE_STEP_TEMPLATE_END = "## Documentation Requirements";
14138
+ var REVIEW_GATED_STEP_CONTRACT = `## Review-gated step contract (OVERRIDES the step template above)
14139
+
14140
+ This workflow runs testing, verification, documentation, and delivery as REVIEW-COLUMN GATES after
14141
+ implementation. They are not task steps here.
14142
+
14143
+ - Do NOT emit a "Testing & Verification" step.
14144
+ - Do NOT emit a "Documentation & Delivery" step.
14145
+ - Emit implementation steps only, ending with the last implementation step.
14146
+ - Per-step verification bullets stay: each implementation step still runs its own targeted tests.
14147
+
14148
+ `;
14149
+ function applyReviewGatedStepContract(prompt) {
14150
+ const start = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_START);
14151
+ const end = prompt.indexOf(REVIEW_GATE_STEP_TEMPLATE_END);
14152
+ if (start < 0 || end < 0 || end <= start) {
14153
+ return `${prompt}
14154
+
14155
+ ${REVIEW_GATED_STEP_CONTRACT}`;
14156
+ }
14157
+ return `${prompt.slice(0, start)}${REVIEW_GATED_STEP_CONTRACT}${prompt.slice(end)}`;
14158
+ }
14159
+ var DOCUMENTATION_STEP_TEMPLATE_START = "### Step {N}: Documentation & Delivery";
14160
+ var DOCUMENTATION_STEP_TEMPLATE_END = "## Documentation Requirements";
14161
+ var NO_DOCUMENTATION_STEP_CONTRACT = `## Documentation is not a step (OVERRIDES the step template above)
14162
+
14163
+ Do NOT emit a "Documentation & Delivery" step. "Testing & Verification" is the LAST step.
14164
+
14165
+ - **Repository documentation is implementation work.** When a change makes an existing doc wrong,
14166
+ update that doc inside the step that made the change, so it is reviewed together with the code.
14167
+ Never plan it as its own step, and never gate completion on it when the change documents nothing.
14168
+ - **Fusion-side delivery is not yours to plan.** The card summary, the delivery note, artifact
14169
+ registration, and out-of-scope follow-up tasks are produced by a review-column milestone after the
14170
+ review passes. Do not emit steps or checklist items for any of them.
14171
+
14172
+ `;
14173
+ function stripDocumentationDeliveryStep(prompt) {
14174
+ const start = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_START);
14175
+ const end = prompt.indexOf(DOCUMENTATION_STEP_TEMPLATE_END);
14176
+ if (start < 0 || end < 0 || end <= start) {
14177
+ return `${prompt}
14178
+
14179
+ ${NO_DOCUMENTATION_STEP_CONTRACT}`;
14180
+ }
14181
+ return `${prompt.slice(0, start)}${NO_DOCUMENTATION_STEP_CONTRACT}${prompt.slice(end)}`;
14182
+ }
14040
14183
  var BUILTIN_SEAM_PROMPTS = {
14041
14184
  execute: DEFAULT_EXECUTOR_PROMPT,
14042
14185
  planning: DEFAULT_TRIAGE_PROMPT,
14043
14186
  "planning-fast": DEFAULT_TRIAGE_FAST_PROMPT,
14187
+ /* Review-gated tasks keep test and delivery work in review-column gates. */
14188
+ "planning-implementation-only": applyReviewGatedStepContract(DEFAULT_TRIAGE_PROMPT),
14044
14189
  "step-execute": DEFAULT_EXECUTOR_PROMPT,
14045
14190
  review: DEFAULT_REVIEWER_PROMPT,
14046
14191
  merge: DEFAULT_MERGER_PROMPT
@@ -14308,6 +14453,7 @@ function postMergeVerificationOptionalGroupNode(column = "done") {
14308
14453
  }
14309
14454
 
14310
14455
  // ../core/src/workflows/builtin-plan-review-group.ts
14456
+ var IMPLEMENTATION_ONLY_STEPS_CRITERION = "\n\n## Review-gated implementation steps\nREVISE when the proposed task-step list includes testing, verification, documentation, or delivery work. Those are review-column gates in this workflow, not implementation steps.";
14311
14457
  var PLAN_REVIEW_GROUP_ID = "plan-review";
14312
14458
  var PLAN_REVIEW_STEP_NODE_ID = "plan-review-step";
14313
14459
  var PLAN_REVIEW_NAME = "Plan Review";
@@ -14349,6 +14495,10 @@ function planReviewOptionalGroupNode(column, options = {}) {
14349
14495
  toolMode: "readonly",
14350
14496
  gateMode: "gate"
14351
14497
  };
14498
+ if (options.requireImplementationOnlySteps === true) {
14499
+ promptConfig.prompt = `${PLAN_REVIEW_PROMPT}${IMPLEMENTATION_ONLY_STEPS_CRITERION}`;
14500
+ promptConfig.requireImplementationOnlySteps = true;
14501
+ }
14352
14502
  if (options.requireExternalIntegrationEvidence === true) {
14353
14503
  promptConfig.requireExternalIntegrationEvidence = true;
14354
14504
  }
@@ -14389,6 +14539,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
14389
14539
  var PLAN_REPLAN_NODE_ID = "plan-replan";
14390
14540
  var BROWSER_VERIFICATION_REMEDIATION_NODE_ID = "browser-verification-remediation";
14391
14541
  var CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation";
14542
+ var REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID = "code-review-remediation-steps";
14392
14543
  function planReplanNode(column = "triage") {
14393
14544
  return {
14394
14545
  id: PLAN_REPLAN_NODE_ID,
@@ -14415,6 +14566,14 @@ function browserVerificationRemediationNode(column = "in-progress") {
14415
14566
  }
14416
14567
  };
14417
14568
  }
14569
+ function codeReviewRemediationStepsNode(column = "in-progress") {
14570
+ return {
14571
+ id: REVIEW_GATED_CODE_REVIEW_REMEDIATION_NODE_ID,
14572
+ kind: "prompt",
14573
+ column,
14574
+ config: { name: "Code review remediation", workflowAction: "review-remediation-steps", forWorkflowStepId: "code-review", toolMode: "readonly" }
14575
+ };
14576
+ }
14418
14577
  function codeReviewRemediationNode(column = "in-progress") {
14419
14578
  return {
14420
14579
  id: CODE_REVIEW_REMEDIATION_NODE_ID,
@@ -15063,6 +15222,147 @@ var RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR = (() => {
15063
15222
  })();
15064
15223
  var BUILTIN_CODING_IDEAS_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_WORKFLOW_IR);
15065
15224
 
15225
+ // ../core/src/workflows/builtin-documentation-delivery-group.ts
15226
+ var DOCUMENTATION_DELIVERY_GROUP_ID = "documentation-delivery";
15227
+ var DOCUMENTATION_DELIVERY_PROMPT = `Report on the accepted implementation exactly once, for the operator who reads this card later.
15228
+
15229
+ You have NO writer. This session can read, search and list \u2014 nothing else. Everything durable you
15230
+ produce is the text you output here. Do not call a tool to save it, do not claim you saved anything,
15231
+ and do not modify repository files: the code has already been reviewed and must not change now.
15232
+
15233
+ ## 1. The card summary (always)
15234
+
15235
+ Open with 2-4 sentences of plain prose an operator can read to know what shipped and why. Mention
15236
+ user-visible behaviour or important files when they matter, and how it was verified. No headings, no
15237
+ bullet lists, no process narration, no verdict. This text becomes the task's summary.
15238
+
15239
+ ## 2. Follow-up proposals (only when they genuinely exist)
15240
+
15241
+ If the work surfaced worthwhile follow-up ideas OUTSIDE this task's scope, end your output with one
15242
+ fenced JSON block, and nothing after it:
15243
+
15244
+ \`\`\`json
15245
+ {"recommendations":[{"id":"stable-slug","title":"short title","description":"what to do and why","category":"improvement"}]}
15246
+ \`\`\`
15247
+
15248
+ - \`category\` is one of: improvement, feature, bug, other.
15249
+ - Each \`id\` must be unique and stable.
15250
+ - These are PROPOSALS for a human, not work orders and not tasks: an operator decides which become
15251
+ tasks. You cannot create tasks and must not try.
15252
+ - Ground every entry in something you actually saw. Omit the block entirely rather than invent work,
15253
+ restate this task, or pad the list. Fewer, real proposals are the correct answer.
15254
+ - Never put commands, shell syntax, credentials or secrets in a proposal.
15255
+
15256
+ You cannot block this card and you have no verdict to give. If something is missing or you could not
15257
+ determine it, say so plainly in the summary and finish.`;
15258
+ function documentationDeliveryOptionalGroupNode(column) {
15259
+ return {
15260
+ id: DOCUMENTATION_DELIVERY_GROUP_ID,
15261
+ kind: "optional-group",
15262
+ column,
15263
+ config: {
15264
+ name: "Documentation",
15265
+ defaultOn: true,
15266
+ /*
15267
+ FNXC:ReportingOnlyGroup 2026-08-26-06:56:
15268
+ Documentation ONLY documents. `gateMode: "advisory"` on the inner node was not enough and the
15269
+ gap was measured on a real card: its REVISE recorded `advisory_failure`, which held the merge
15270
+ door ("no current approval") AND bounced the card to implementation with no work to do, where
15271
+ it re-ran Code Review against an unchanged tree and merged on the second pass by luck.
15272
+ `reportingOnly` states the contract once: no approval to withhold, no remediation to request.
15273
+ */
15274
+ reportingOnly: true,
15275
+ template: {
15276
+ nodes: [{
15277
+ id: "documentation-delivery-step",
15278
+ kind: "prompt",
15279
+ config: {
15280
+ name: "Documentation",
15281
+ prompt: DOCUMENTATION_DELIVERY_PROMPT,
15282
+ toolMode: "readonly",
15283
+ gateMode: "advisory",
15284
+ workflowAction: "documentation-delivery",
15285
+ /* The two projection contracts that give a writer-less node durable output. */
15286
+ summaryTarget: "task",
15287
+ recommendationsTarget: "task"
15288
+ }
15289
+ }],
15290
+ edges: []
15291
+ }
15292
+ }
15293
+ };
15294
+ }
15295
+
15296
+ // ../core/src/workflows/builtin-coding-ideas-v2-workflow-ir.ts
15297
+ var clone = (ir) => JSON.parse(JSON.stringify(ir));
15298
+ var RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = (() => {
15299
+ const ir = clone(BUILTIN_CODING_IDEAS_WORKFLOW_IR);
15300
+ ir.name = "builtin-coding-ideas-v2";
15301
+ const plan = ir.nodes.find((node) => node.id === "plan");
15302
+ if (!plan?.config) throw new Error("coding-ideas-v2 requires the inherited planning node");
15303
+ plan.config.prompt = stripDocumentationDeliveryStep(String(plan.config.prompt ?? ""));
15304
+ const parse = ir.nodes.find((node) => node.id === "parse");
15305
+ if (parse) parse.config = { ...parse.config, implementationOnlySteps: true, preserveRemediationSteps: true };
15306
+ const codeReviewRemediation = ir.nodes.find((node) => node.id === "code-review-remediation");
15307
+ if (codeReviewRemediation) {
15308
+ codeReviewRemediation.config = {
15309
+ ...codeReviewRemediation.config,
15310
+ ...codeReviewRemediationStepsNode().config,
15311
+ name: "Code Review Remediation"
15312
+ };
15313
+ }
15314
+ const codeReviewIndex = ir.nodes.findIndex((node) => node.id === "code-review");
15315
+ if (codeReviewIndex < 0) throw new Error("coding-ideas-v2 requires the inherited code-review gate");
15316
+ const codeReviewStep = ir.nodes[codeReviewIndex]?.config?.template?.nodes?.find((node) => node.id === "code-review-step");
15317
+ if (!codeReviewStep?.config) throw new Error("coding-ideas-v2 requires the inherited code-review-step template node");
15318
+ codeReviewStep.config.prompt = `${String(codeReviewStep.config.prompt ?? "")}
15319
+
15320
+ ## Step 0: Judge the TESTS before you judge the code
15321
+
15322
+ You cannot run anything: this session is read-only, \`bash\` is denied and no verification tool is
15323
+ available to you. Do not claim you ran lint, tests or a build, and do not ask for a command to be
15324
+ run. The executor already wrote and ran the tests; your job is to rule on whether that work is
15325
+ sound.
15326
+
15327
+ Read the test files in the diff and rule on FOUR things:
15328
+
15329
+ 1. **They exist.** A behavioural change with no test is a REVISE. Say which change is uncovered.
15330
+ 2. **They are real tests.** Assertions executed by a test runner. A typecheck is not a test, a build
15331
+ is not a test, and manual verification is not a test.
15332
+ 3. **They assert BEHAVIOUR.** Never a comment, a date stamp, or prose lifted from source. Asserting
15333
+ that a comment exists tests nothing a user or caller can observe. Code-construct guards
15334
+ (call-site allowlists, architectural ratchets) are legitimate and stay.
15335
+ 4. **They cover the INVARIANT, not just the reported case.** For a bug fix, a test that only
15336
+ reproduces the single reported symptom is incomplete: require every known surface. If this task
15337
+ CHANGED, GATED or REMOVED behaviour, the tests that encoded the OLD behaviour must have been
15338
+ updated or deleted in the same change \u2014 they live outside the File Scope and targeted
15339
+ verification will not have surfaced them.
15340
+
15341
+ Then review the code itself for what tests do not catch: logic errors, broken edge cases, and
15342
+ unhandled failure modes.`;
15343
+ ir.nodes.splice(codeReviewIndex + 1, 0, documentationDeliveryOptionalGroupNode("in-review"));
15344
+ const summaryIndex = ir.nodes.findIndex((node) => node.id === "completion-summary");
15345
+ if (summaryIndex >= 0) ir.nodes.splice(summaryIndex, 1);
15346
+ ir.edges = ir.edges.filter((edge) => edge.from !== "completion-summary" && edge.to !== "completion-summary");
15347
+ ir.edges = ir.edges.filter((edge) => !(edge.from === "code-review" && edge.to === "merge-gate"));
15348
+ ir.edges.push(
15349
+ { from: "steps", to: "code-review", condition: "success" },
15350
+ { from: "code-review", to: "documentation-delivery", condition: "success" },
15351
+ { from: "documentation-delivery", to: "merge-gate", condition: "success" },
15352
+ /*
15353
+ FNXC:CodingIdeasV2Workflow 2026-08-25-10:20:
15354
+ Documentation is ADVISORY: it reports, it never vetoes. Its failure edge reaches the merge gate
15355
+ exactly like its success edge, so a delivery note that could not be written cannot strand a
15356
+ card whose code is already approved. Measured why: as a blocking gate it bounced a task whose
15357
+ own plan said not to implement anything ("No task-specific implementation is present"), and the
15358
+ card looped through the review lane every five minutes indefinitely.
15359
+ */
15360
+ { from: "documentation-delivery", to: "merge-gate", condition: "failure" }
15361
+ );
15362
+ return ir;
15363
+ })();
15364
+ var BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR = parseWorkflowIr(RAW_BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR);
15365
+
15066
15366
  // ../core/src/workflows/builtin-brainstorming-workflow-ir.ts
15067
15367
  var APPROVAL_PHRASE = "looks good";
15068
15368
  var RAW_BUILTIN_BRAINSTORMING_WORKFLOW_IR = (() => {
@@ -15818,6 +16118,47 @@ var BUILTIN_WORKFLOWS = [
15818
16118
  createdAt: BUILTIN_TS,
15819
16119
  updatedAt: BUILTIN_TS
15820
16120
  },
16121
+ /*
16122
+ * FNXC:CodingIdeasV2Workflow 2026-08-26-05:56:
16123
+ * Same Ideas board as builtin:coding-ideas, with one rule: in-review NEVER writes code.
16124
+ * Implementation and its tests finish in `in-progress` — the executor's own final verification
16125
+ * runs the project's configured test/build commands there, and a red result appends named fix
16126
+ * steps rather than letting the card advance. `in-review` is then three read-only milestones:
16127
+ * Code Review judges, Documentation reports, and the merge is the last thing that happens.
16128
+ * The layout is ordered left-to-right in that same sequence so the editor's diagram reads the way
16129
+ * the graph runs; nodes deleted from the graph must be deleted from this map too, or the editor
16130
+ * keeps positioning ghosts.
16131
+ */
16132
+ {
16133
+ id: "builtin:coding-ideas-v2",
16134
+ name: "Coding (Ideas) V2",
16135
+ description: "Capture-first coding pipeline with a read-only review lane: park ideas in a manual intake, plan, implement and test per step, then review, document, and merge.",
16136
+ kind: "workflow",
16137
+ ir: BUILTIN_CODING_IDEAS_V2_WORKFLOW_IR,
16138
+ layout: {
16139
+ start: { x: 60, y: 160 },
16140
+ plan: { x: 230, y: 160 },
16141
+ "plan-review": { x: 400, y: 160 },
16142
+ "plan-replan": { x: 400, y: 320 },
16143
+ "plan-review-no-op": { x: 570, y: 320 },
16144
+ parse: { x: 570, y: 160 },
16145
+ steps: { x: 740, y: 160 },
16146
+ "review-pending-handoff": { x: 740, y: 320 },
16147
+ "code-review": { x: 910, y: 160 },
16148
+ "code-review-remediation": { x: 910, y: 320 },
16149
+ "documentation-delivery": { x: 1080, y: 160 },
16150
+ "merge-gate": { x: 1250, y: 160 },
16151
+ "branch-group-member-integration": { x: 1420, y: 80 },
16152
+ "branch-group-promotion": { x: 1590, y: 80 },
16153
+ "merge-manual-hold": { x: 1420, y: 240 },
16154
+ "merge-attempt": { x: 1760, y: 160 },
16155
+ "merge-retry": { x: 1930, y: 80 },
16156
+ "recovery-router": { x: 1930, y: 240 },
16157
+ end: { x: 2100, y: 160 }
16158
+ },
16159
+ createdAt: BUILTIN_TS,
16160
+ updatedAt: BUILTIN_TS
16161
+ },
15821
16162
  {
15822
16163
  id: "builtin:legacy-coding",
15823
16164
  name: "Legacy coding",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.53-beta.7",
3
+ "version": "0.1.53-beta.9",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {