@zq-silk/yui 0.14.0 → 0.14.2

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 (179) hide show
  1. package/ARCHITECTURE.md +64 -35
  2. package/README.md +258 -125
  3. package/dist/agent/argumentPolicy.js +2 -1
  4. package/dist/agent/managedRuntimeEnvironment.js +5 -8
  5. package/dist/cli/commandCatalog.js +74 -109
  6. package/dist/cli/helpRenderer.js +1 -2
  7. package/dist/cli/interactionCandidates.js +10 -0
  8. package/dist/cli/interactionPolicy.js +76 -37
  9. package/dist/cli/roleWizard.js +5 -6
  10. package/dist/cli/updateOrchestrator.js +10 -8
  11. package/dist/cli/updatePorts.js +17 -13
  12. package/dist/cli/upgradeCommand.js +2 -5
  13. package/dist/cli.js +268 -231
  14. package/dist/commands/agentCommands.js +13 -0
  15. package/dist/commands/configCommands.js +7 -19
  16. package/dist/commands/configOverview.js +3 -2
  17. package/dist/commands/durableJobCommands.js +1 -1
  18. package/dist/commands/executionAuditCommands.js +4 -9
  19. package/dist/commands/globalRoleCommands.js +17 -0
  20. package/dist/commands/profileCommands.js +200 -30
  21. package/dist/commands/sessionCommands.js +1 -1
  22. package/dist/commands/taskActor.js +29 -127
  23. package/dist/commands/taskChangeSetCommands.js +1 -3
  24. package/dist/commands/taskCommands.js +1771 -2107
  25. package/dist/commands/taskCompletionGate.js +27 -103
  26. package/dist/commands/taskContextCommand.js +47 -80
  27. package/dist/commands/taskExecutionCommands.js +9 -27
  28. package/dist/commands/taskInputCommands.js +10 -10
  29. package/dist/commands/taskIntegrationCommands.js +69 -61
  30. package/dist/commands/taskIntegrationQueueCommands.js +1 -1
  31. package/dist/commands/taskNextActionCommand.js +8 -29
  32. package/dist/commands/taskOverviewCommand.js +25 -3
  33. package/dist/commands/taskPublicationCommands.js +151 -85
  34. package/dist/commands/taskPublicationVerifyCommand.js +181 -0
  35. package/dist/commands/taskRemoteDeliveryCommand.js +134 -0
  36. package/dist/commands/taskRoleRuntimeStatus.js +5 -6
  37. package/dist/commands/taskUpstreamCommands.js +79 -95
  38. package/dist/config/configCatalog.js +1 -1
  39. package/dist/context/contextSnapshot.js +17 -2
  40. package/dist/context/sessionBootstrapManifest.js +18 -1
  41. package/dist/context/sourceTurnContext.js +30 -0
  42. package/dist/context/turnContextPack.js +107 -48
  43. package/dist/context/turnInputContract.js +11 -4
  44. package/dist/context/wakeNotification.js +84 -22
  45. package/dist/controller/agentRuntimeObserver.js +9 -12
  46. package/dist/controller/clientRuntime.js +13 -13
  47. package/dist/controller/controller.js +11 -11
  48. package/dist/controller/fileSchedulerStoreAdapter.js +262 -219
  49. package/dist/controller/jobControl.js +11 -10
  50. package/dist/controller/resourceInventory.js +6 -6
  51. package/dist/controller/resourceInventoryLinux.js +2 -2
  52. package/dist/controller/runtime.js +18 -61
  53. package/dist/controller/runtimeEventInbox.js +57 -34
  54. package/dist/controller/runtimeEventProcessor.js +36 -96
  55. package/dist/controller/runtimeHookTurnFence.js +33 -57
  56. package/dist/controller/runtimeLaunchCoordinator.js +44 -40
  57. package/dist/controller/runtimeObservationHook.js +18 -12
  58. package/dist/controller/sessionNotify.js +43 -28
  59. package/dist/controller/sessionOwnerReconciliation.js +21 -21
  60. package/dist/controller/structuredProviderObservation.js +13 -16
  61. package/dist/coordination/workMailboxQueue.js +132 -0
  62. package/dist/core/controllerServer.js +1 -0
  63. package/dist/domain/agentResultTransport.js +60 -0
  64. package/dist/execution/executionHealth.js +111 -118
  65. package/dist/execution/reviewMainTurn.js +161 -0
  66. package/dist/execution/workItemExecution.js +454 -0
  67. package/dist/execution/workItemExecutionProjection.js +309 -0
  68. package/dist/execution/workItemMainTurn.js +164 -0
  69. package/dist/executor/agentExecutor.js +19 -19
  70. package/dist/executor/executorRegistry.js +7 -28
  71. package/dist/executor/fileRoleLaunchPlanner.js +51 -83
  72. package/dist/external/githubPublicationVerifier.js +114 -0
  73. package/dist/external/gitlabPublicationVerifier.js +158 -0
  74. package/dist/external/pinnedCommandRunner.js +73 -0
  75. package/dist/integration/changeSetManifest.js +0 -3
  76. package/dist/integration/deliveryObligation.js +43 -6
  77. package/dist/integration/gitIntegrationService.js +284 -101
  78. package/dist/integration/integrationAttempt.js +64 -14
  79. package/dist/integration/integrationQueueEntry.js +5 -35
  80. package/dist/integration/integrationQueueService.js +65 -194
  81. package/dist/lifecycle/canonicalLifecycleEvent.js +16 -15
  82. package/dist/lifecycle/exactTurnTerminalization.js +100 -97
  83. package/dist/message/message.js +16 -0
  84. package/dist/observability/executionAudit.js +4 -25
  85. package/dist/observability/faultClassification.js +58 -70
  86. package/dist/observability/orchestrationMetrics.js +8 -50
  87. package/dist/profile/agentProfile.js +60 -15
  88. package/dist/profile/agentProfileRuntime.js +100 -0
  89. package/dist/release/releaseWorkflowPorts.js +5 -68
  90. package/dist/repository/executionLaneGitSnapshot.js +80 -0
  91. package/dist/repository/gitWorkspace.js +9 -67
  92. package/dist/repository/taskBaseFreshness.js +3 -1
  93. package/dist/repository/taskWorkspaceCoordinator.js +32 -4
  94. package/dist/repository/taskWorkspacePreparer.js +252 -411
  95. package/dist/resources/liveReferences.js +6 -55
  96. package/dist/resources/resourceDiscovery.js +1 -30
  97. package/dist/resources/resourceRegistrar.js +0 -23
  98. package/dist/review/deltaRecheck.js +8 -65
  99. package/dist/review/reviewAcceptance.js +22 -19
  100. package/dist/review/reviewConfig.js +0 -10
  101. package/dist/review/reviewDecision.js +2 -2
  102. package/dist/review/reviewRound.js +147 -273
  103. package/dist/review/reviewerAvailability.js +13 -23
  104. package/dist/role/role.js +3 -0
  105. package/dist/runtime/agentDriverObservation.js +1 -1
  106. package/dist/runtime/agentHost.js +51 -51
  107. package/dist/runtime/builtinAgentDrivers.js +9 -2
  108. package/dist/runtime/codexAppServerRuntime.js +23 -5
  109. package/dist/runtime/exactControlPlane.js +2 -267
  110. package/dist/runtime/firstProgressAdvisory.js +1 -1
  111. package/dist/runtime/index.js +1 -1
  112. package/dist/runtime/launchBroker.js +11 -11
  113. package/dist/runtime/lifecycleReservation.js +2 -2
  114. package/dist/runtime/managedCaller.js +111 -0
  115. package/dist/runtime/ports.js +16 -3
  116. package/dist/runtime/preallocatedNativeSession.js +2 -2
  117. package/dist/runtime/processExitObservation.js +3 -2
  118. package/dist/runtime/providerContinuationReconciliationService.js +1 -1
  119. package/dist/runtime/runtimeBinding.js +1 -1
  120. package/dist/runtime/runtimeObservation.js +33 -16
  121. package/dist/runtime/runtimeSessionCandidate.js +2 -2
  122. package/dist/runtime/runtimeStopReceipt.js +11 -11
  123. package/dist/runtime/sessionLaunchRequest.js +2 -2
  124. package/dist/runtime/sessionOwnerIdentity.js +9 -9
  125. package/dist/runtime/sessionOwnerRegistry.js +13 -13
  126. package/dist/runtime/sessionReconciliation.js +4 -4
  127. package/dist/runtime/sessionTerminationGuard.js +9 -9
  128. package/dist/runtime/sessionTokenMetrics.js +5 -7
  129. package/dist/runtime/structuredProviderHost.js +5 -5
  130. package/dist/runtime/taskRuntimeIsolation.js +24 -24
  131. package/dist/runtime/tmuxAdapters.js +32 -30
  132. package/dist/scheduler/activeRoleTurnDelivery.js +37 -15
  133. package/dist/scheduler/leaderWakeupProcessor.js +78 -55
  134. package/dist/scheduler/roleTurnLiveness.js +6 -6
  135. package/dist/scheduler/roleTurnStall.js +8 -9
  136. package/dist/scheduler/taskExecutionProjection.js +19 -41
  137. package/dist/scheduler/taskObservabilityProjection.js +75 -122
  138. package/dist/storage/sqliteSchema.js +1 -21
  139. package/dist/storage/sqliteStore.js +62 -47
  140. package/dist/storage/storageSchema.js +1 -8
  141. package/dist/storage/storageVersions.js +7 -4
  142. package/dist/storage/taskStore.js +8 -8
  143. package/dist/storage/upgrade/upgradeOrchestrator.js +112 -83
  144. package/dist/task/completionReadiness.js +17 -98
  145. package/dist/task/deliveryGuard.js +9 -11
  146. package/dist/task/draftPlan.js +142 -0
  147. package/dist/task/nextAction.js +179 -477
  148. package/dist/task/publicationVerification.js +1 -0
  149. package/dist/task/remoteDelivery.js +233 -0
  150. package/dist/task/task.js +108 -4
  151. package/dist/task/taskRecordReference.js +0 -1
  152. package/dist/turn/turn.js +109 -16
  153. package/dist/verification/verificationGateService.js +0 -26
  154. package/dist/web/assets/client/components.js +99 -121
  155. package/dist/web/assets/client/i18n.js +136 -58
  156. package/dist/web/assets/client/view.js +44 -0
  157. package/dist/web/assets/styles/cards.js +3 -15
  158. package/dist/web/assets/styles/widgets.js +4 -0
  159. package/dist/web/webSnapshot.js +29 -14
  160. package/dist/workItem/dependencyGate.js +34 -0
  161. package/dist/workItem/workItem.js +99 -266
  162. package/dist/workspace/workItemChangeSetManager.js +15 -59
  163. package/docs/task-local-identity.md +1 -1
  164. package/i18n/README.zh-CN.md +165 -59
  165. package/package.json +1 -1
  166. package/skills/yui-leader/SKILL.md +272 -782
  167. package/skills/yui-operator/SKILL.md +190 -365
  168. package/skills/yui-reviewer/SKILL.md +40 -33
  169. package/skills/yui-runtime/SKILL.md +27 -6
  170. package/skills/yui-worker/SKILL.md +19 -6
  171. package/dist/execution/candidateConvergence.js +0 -623
  172. package/dist/execution/executionGroup.js +0 -854
  173. package/dist/execution/resourceBroker.js +0 -426
  174. package/dist/executor/launchPlan.js +0 -16
  175. package/dist/review/reviewFinding.js +0 -240
  176. package/dist/review/reviewFindingLedger.js +0 -550
  177. package/dist/review/reviewOutcomeClassifier.js +0 -255
  178. package/dist/scheduler/resourceQueueProjection.js +0 -71
  179. package/dist/task/repairWave.js +0 -150
@@ -156,82 +156,65 @@ export function executionBand(projection, t, locale) {
156
156
  return band;
157
157
  }
158
158
 
159
- // --- Unified execution Group (Lanes + resolution) ---------------------------
160
- export function executionGroupCard(summary, t, locale) {
159
+ // --- WorkItem execution and recovery -----------------------------------------
160
+ export function workItemExecutionCard(projection, t) {
161
161
  const card = node("article", "record-card exec-group");
162
162
  const head = node("div", "record-head");
163
163
  const titleRow = node("div", "record-title-row");
164
- titleRow.append(node("strong", "record-title", summary.groupId));
164
+ titleRow.append(node("strong", "record-title", t("workExec.title")));
165
165
  head.append(titleRow);
166
166
  const pills = node("div", "record-pills");
167
- pills.append(pill(t, "exec.purpose", summary.purpose));
168
- const strategy = summary.strategy.mode === "fixed"
169
- ? t("exec.strategy.fixed").replace("{count}", String(summary.strategy.count))
170
- : t("exec.strategy.adaptive").replace("{max}", String(summary.strategy.max));
171
- pills.append(chip(strategy));
172
- if (summary.failedLaneCount > 0) {
173
- pills.append(chip(summary.failedLaneCount + " " + t("exec.lanesFailed"), "is-danger"));
174
- }
167
+ pills.append(chip(t("workExec.shape." + projection.shape), "is-active"));
168
+ pills.append(chip(t("workExec.synthesis." + projection.synthesis.status)));
175
169
  head.append(pills);
176
170
  card.append(head);
177
171
 
178
- if (summary.stage) {
179
- const stage = node("div", "record-meta execution-stage-meta");
180
- stage.append(node("span", "mono", t("detail.stage") + " · " + (summary.stage.stage || "—")));
181
- stage.append(node("span", "", t("detail.round") + " · " + String(summary.stage.round)));
182
- stage.append(node("span", "", t("detail.stageAttempt") + " · " + String(summary.stage.stageAttempt)));
183
- stage.append(chip(t("mode." + summary.stage.mode)));
184
- card.append(stage);
185
- }
186
- if (summary.resources) {
187
- const resources = summary.resources;
188
- const budget = node("div", "record-meta execution-resource-meta");
189
- budget.append(node("span", "", t("detail.cost") + " · "
190
- + formatResource(resources.tokens, resources.tokensRemaining, resources.tokensObservable) + " tokens"));
191
- budget.append(node("span", "", formatResource(resources.toolCalls, resources.toolCallsRemaining, resources.toolCallsObservable) + " tools"));
192
- budget.append(node("span", "", resources.wallClockSeconds + "s"));
193
- budget.append(node("span", "", t("detail.quorum") + " · "
194
- + resources.usableLaneCount + "/" + (summary.stage.resources?.quorum || "—")));
195
- card.append(budget);
196
- }
197
-
198
- const lanes = node("div", "lane-list");
199
- summary.laneSummaries.forEach(function (lane) {
200
- const row = node("div", "lane-row");
201
- row.append(statusDot(lane.status));
202
- row.append(node("span", "lane-role", lane.roleName));
203
- row.append(node("span", "lane-status", t("lane." + lane.status)));
204
- if (lane.effective) {
205
- const config = [lane.effective.adapterId, lane.effective.model, lane.effective.effort]
206
- .filter(function (value) { return value; }).join(" · ");
207
- if (config) row.append(chip(config));
208
- }
209
- if (lane.summary) {
210
- row.append(node("span", "lane-summary", lane.summary));
211
- }
212
- if (lane.decision) {
213
- row.append(chip(t("resolution." + lane.decision), "is-active"));
214
- }
215
- lanes.append(row);
216
- });
217
- card.append(lanes);
218
-
219
- if (summary.resolution) {
220
- const res = node("div", "exec-resolution");
221
- res.append(node("span", "exec-resolution-decision",
222
- t("resolution." + summary.resolution.decision)));
223
- res.append(node("span", "exec-resolution-summary", summary.resolution.summary));
224
- res.append(node("time", "", formatDateTime(summary.resolution.decidedAt, locale)));
225
- card.append(res);
226
- }
172
+ if (projection.lanes && projection.lanes.length) {
173
+ const lanes = node("div", "lane-list");
174
+ projection.lanes.forEach(function (lane) {
175
+ const row = node("div", "lane-row");
176
+ row.append(statusDot(lane.status));
177
+ row.append(node("span", "lane-role", lane.roleName));
178
+ row.append(node("span", "lane-status", t("workExec.lane." + lane.status)));
179
+ row.append(node("span", "mono", lane.currentTurnId || t("detail.unobserved")));
180
+ if (lane.retryTurnId) row.append(chip(t("workExec.retry") + " · " + lane.retryTurnId, "is-danger"));
181
+ if (lane.settleTurnId) row.append(chip(t("workExec.settle") + " · " + lane.settleTurnId));
182
+ if (lane.session === "unobserved") row.append(chip(t("detail.unobserved")));
183
+ lanes.append(row);
184
+ });
185
+ card.append(lanes);
186
+ }
187
+
188
+ const facts = node("div", "record-meta execution-resource-meta");
189
+ facts.append(node("span", "", t("workExec.main") + " · "
190
+ + (projection.mainTurn.turnId || t("detail.unobserved"))
191
+ + " [" + t("workExec.mainStatus." + projection.mainTurn.status) + "]"));
192
+ facts.append(node("span", "", t("workExec.candidate") + " · "
193
+ + (projection.candidate.candidateId || t("workExec.none"))
194
+ + " [" + t("workExec.candidateStatus." + projection.candidate.status) + "]"));
195
+ card.append(facts);
196
+
197
+ if (projection.candidate.sourceExecutionGroupId) {
198
+ const provenance = projection.candidate.successfulLaneTurns.map(function (lane) {
199
+ return lane.laneId + " → " + lane.successfulTurnId;
200
+ }).join(", ") || t("detail.unobserved");
201
+ card.append(node("p", "muted mono", (projection.candidate.mainTurnId || t("detail.unobserved"))
202
+ + " → " + projection.candidate.sourceExecutionGroupId + " → " + provenance));
203
+ }
204
+
205
+ const next = node("div", "exec-resolution");
206
+ next.append(node("span", "exec-resolution-decision", t("workExec.next")));
207
+ next.append(node("span", "exec-resolution-summary",
208
+ t("workExec.action." + projection.nextAction.kind)
209
+ + " · " + t("workExec.owner") + " "
210
+ + (projection.nextAction.owners.join(", ") || t("workExec.none"))));
211
+ if (projection.nextAction.targetIds.length) {
212
+ next.append(node("span", "mono", projection.nextAction.targetIds.join(", ")));
213
+ }
214
+ card.append(next);
227
215
  return card;
228
216
  }
229
217
 
230
- function formatResource(used, remaining, observable) {
231
- const value = String(used) + (remaining === undefined ? "" : "/" + String(used + remaining));
232
- return observable === false ? value + "*" : value;
233
- }
234
-
235
218
  export function observabilityMetricCard(observability, t) {
236
219
  if (!observability) return null;
237
220
  const card = node("div", "observability-metrics");
@@ -305,23 +288,6 @@ export function candidateList(candidates, t, locale) {
305
288
  return block;
306
289
  }
307
290
 
308
- // --- Execution findings (checks / review findings) ---------------------------
309
- export function findingsBlock(label, findings, t) {
310
- if (!findings || !findings.length) return null;
311
- const block = node("div", "record-block");
312
- block.append(node("small", "", label));
313
- const list = node("div", "finding-list");
314
- findings.forEach(function (finding) {
315
- const row = node("div", "finding-row is-" + finding.severity);
316
- row.append(chip(t("finding.severity." + finding.severity), "is-" + finding.severity));
317
- row.append(node("span", "finding-summary", finding.summary));
318
- row.append(chip(t("finding.status." + finding.status)));
319
- list.append(row);
320
- });
321
- block.append(list);
322
- return block;
323
- }
324
-
325
291
  // --- Progressive disclosure --------------------------------------------------
326
292
  // Re-render is cheap and happens whenever the underlying data changes, so all
327
293
  // disclosure state (collapsed blocks, visible pages) is deliberately
@@ -548,44 +514,28 @@ export function workItemCard(item, titles, t, locale, actions, taskId) {
548
514
  }
549
515
  if (chipCols.childNodes.length) body.append(chipCols);
550
516
 
551
- // Current execution iteration: the unified Group with its Lanes and the
552
- // Leader's resolution when the iteration is settled.
553
- if (item.currentExecution) {
554
- body.append(executionGroupCard(item.currentExecution, t, locale));
517
+ if (item.execution) {
518
+ body.append(workItemExecutionCard(item.execution, t));
555
519
  }
556
520
 
557
521
  if (item.observability) {
558
522
  const observability = item.observability;
559
- if (observability.executionGroups && observability.executionGroups.length) {
560
- observability.executionGroups.forEach(function (group) {
561
- if (!item.currentExecution || group.groupId !== item.currentExecution.groupId) {
562
- body.append(executionGroupCard(group, t, locale));
563
- }
564
- });
565
- }
566
523
  const metrics = node("div", "record-meta work-item-observability");
567
524
  metrics.append(node("span", "", t("detail.cost") + " · "
568
- + observability.cost.tokens + " tokens"));
569
- metrics.append(node("span", "", observability.cost.toolCalls + " tools"));
525
+ + (observability.cost.tokensObservable
526
+ ? observability.cost.tokens + " tokens"
527
+ : t("detail.unobserved"))));
528
+ metrics.append(node("span", "", observability.cost.toolCallsObservable
529
+ ? observability.cost.toolCalls + " tools"
530
+ : t("detail.unobserved")));
570
531
  metrics.append(node("span", "", observability.cost.wallClockSeconds + "s"));
571
532
  metrics.append(node("span", "", t("detail.contextSnapshots") + " · "
572
533
  + observability.context.snapshotCount));
573
- metrics.append(node("span", "", t("detail.evidence") + " · "
574
- + observability.evidenceCount));
575
- if (observability.openFindingCount > 0) {
576
- metrics.append(chip(t("detail.openFindings") + " · " + observability.openFindingCount, "is-danger"));
577
- }
534
+ metrics.append(node("span", "", t("detail.results") + " · "
535
+ + (observability.resultCount == null
536
+ ? t("detail.unobserved")
537
+ : observability.resultCount)));
578
538
  body.append(metrics);
579
- if (observability.stages && observability.stages.length) {
580
- const stages = node("div", "chip-row work-item-stages");
581
- observability.stages.forEach(function (stage) {
582
- const label = (stage.stage || "single")
583
- + (stage.round === undefined ? "" : " #" + stage.round)
584
- + (stage.resolution ? " · " + stage.resolution : "");
585
- stages.append(chip(label, stage.groupId === observability.currentGroupId ? "is-active" : ""));
586
- });
587
- body.append(stages);
588
- }
589
539
  }
590
540
 
591
541
  // Review candidates submitted for this WorkItem, newest first.
@@ -629,6 +579,9 @@ export function turnCard(turn, t, locale) {
629
579
  if (turn.result?.output) {
630
580
  card.append(richText(t("detail.outcome"), turn.result.output, t, { className: "execute-io outcome", threshold: 320 }));
631
581
  }
582
+ if (turn.result?.diagnostic) {
583
+ card.append(richText(t("detail.failure"), turn.result.diagnostic, t, { className: "execute-io outcome", threshold: 320 }));
584
+ }
632
585
 
633
586
  const foot = node("div", "execute-foot");
634
587
  const tags = node("div", "execute-tags");
@@ -662,6 +615,9 @@ export function reviewCard(round, t, locale) {
662
615
  head.append(titleRow);
663
616
  const headPills = node("div", "record-pills");
664
617
  if (round.scope) headPills.append(pill(t, "review.scope", round.scope));
618
+ headPills.append(chip(t(round.executionGroup
619
+ ? "reviewExec.replicated"
620
+ : "reviewExec.direct"), round.executionGroup ? "is-active" : ""));
665
621
  headPills.append(pill(t, "review", round.status));
666
622
  head.append(headPills);
667
623
  card.append(head);
@@ -675,23 +631,44 @@ export function reviewCard(round, t, locale) {
675
631
  if (round.workspace && round.workspace.root) {
676
632
  meta.append(pathMetaItem(t("detail.workspace"), round.workspace.root));
677
633
  }
678
- if (round.evidenceCommit) {
679
- meta.append(node("span", "", t("detail.evidence") + " · " + round.evidenceCommit));
634
+ if (round.reviewerTurnId) {
635
+ meta.append(node("span", "mono", t("detail.reviewerTurn") + " · " + round.reviewerTurnId));
680
636
  }
681
637
  if (round.workspaceDisposition) {
682
638
  meta.append(node("span", "", t("detail.workspaceDisposition") + " · "
683
639
  + t("disposition." + round.workspaceDisposition.kind)));
684
640
  }
685
641
  card.append(meta);
686
- if (round.checks && round.checks.length) {
687
- card.append(richText(t("detail.checks"), round.checks.map(function (check) {
688
- return check.name + "=" + check.outcome;
689
- }).join(", "), t));
690
- }
691
- const findings = findingsBlock(t("detail.findings"), round.findings, t);
692
- if (findings) card.append(findings);
693
- if (round.summary) card.append(richText(null, round.summary, t));
694
- if (round.report) card.append(richText(t("detail.report"), round.report, t, { muted: true }));
642
+ if (round.executionGroup) {
643
+ const group = round.executionGroup;
644
+ const execution = node("div", "record-block exec-group");
645
+ const groupMeta = node("div", "record-meta execution-resource-meta");
646
+ groupMeta.append(node("span", "mono", group.id));
647
+ groupMeta.append(node("span", "", t("reviewExec.assignment") + " · "
648
+ + group.assignment.contextSnapshotRef.id));
649
+ groupMeta.append(node("span", "", t("reviewExec.main") + " · "
650
+ + (round.reviewerTurnId || t("detail.unobserved"))));
651
+ execution.append(groupMeta);
652
+ const lanes = node("div", "lane-list");
653
+ group.lanes.forEach(function (lane) {
654
+ const row = node("div", "lane-row");
655
+ row.append(statusDot(lane.disposition === "open" ? "running" : lane.disposition));
656
+ row.append(node("span", "lane-role", t("reviewExec.producer") + " " + lane.ordinal
657
+ + " · " + lane.roleName));
658
+ row.append(node("span", "lane-status", t("reviewExec.status." + lane.disposition)));
659
+ row.append(node("span", "mono", lane.currentTurnId || t("detail.unobserved")));
660
+ lanes.append(row);
661
+ });
662
+ execution.append(lanes);
663
+ card.append(execution);
664
+ }
665
+ if (round.failure) {
666
+ card.append(richText(
667
+ t("detail.failure"),
668
+ round.failure.kind + ": " + round.failure.message,
669
+ t
670
+ ));
671
+ }
695
672
  return card;
696
673
  }
697
674
 
@@ -831,6 +808,7 @@ export function messageCard(message, t, locale) {
831
808
  titleRow.append(node("strong", "record-title", messageAuthor(message, t)));
832
809
  head.append(titleRow);
833
810
  if (message.kind) head.append(pill(t, "messageKind", message.kind));
811
+ if (message.status) head.append(pill(t, "status", message.status));
834
812
  card.append(head);
835
813
 
836
814
  const meta = node("div", "record-meta");
@@ -36,11 +36,18 @@ const messages = {
36
36
  "breadcrumb.taskList": "All work",
37
37
  "controls.language": "Language",
38
38
  "controls.theme": "Theme",
39
+ "common.yes": "yes",
40
+ "common.no": "no",
39
41
  "decision.active": "Active",
40
42
  "decision.superseded": "Superseded",
41
43
  "delivery.delivered": "Delivered",
42
44
  "delivery.pushed": "Pushed · awaiting provider acceptance",
43
45
  "delivery.pending": "Awaiting delivery",
46
+ "remoteDelivery.none": "No code delivery",
47
+ "remoteDelivery.unavailable": "Exact heads unavailable",
48
+ "remoteDelivery.pending": "Pending merge",
49
+ "remoteDelivery.partial": "Partially merged",
50
+ "remoteDelivery.merged": "Merged",
44
51
  "detail.acceptance": "Acceptance criteria",
45
52
  "detail.agent": "Agent",
46
53
  "detail.agents": "Agents",
@@ -49,16 +56,12 @@ const messages = {
49
56
  "detail.assignee": "Assignee",
50
57
  "detail.attention": "Needs your input",
51
58
  "detail.baseRef": "Base ref",
52
- "detail.checks": "Checks",
53
59
  "detail.completedBy": "Completed by",
54
60
  "detail.conclusion": "Task conclusion",
55
61
  "detail.constraints": "Constraints",
56
62
  "detail.decisions": "Decisions",
57
63
  "detail.dependsOn": "Depends on",
58
64
  "detail.dag": "Task DAG",
59
- "detail.stage": "Stage",
60
- "detail.round": "Round",
61
- "detail.stageAttempt": "Attempt",
62
65
  "detail.cost": "Cost",
63
66
  "detail.tokens": "Tokens",
64
67
  "detail.sessionTotalTokens": "Session total tokens",
@@ -66,7 +69,6 @@ const messages = {
66
69
  "detail.toolCalls": "Tool calls",
67
70
  "detail.wallClock": "Wall clock",
68
71
  "detail.ready": "Ready",
69
- "detail.quorum": "Quorum",
70
72
  "detail.contextSnapshots": "Context snapshots",
71
73
  "detail.contextBytes": "Context bytes",
72
74
  "detail.compression": "Compression",
@@ -74,13 +76,22 @@ const messages = {
74
76
  "detail.partial": "partial",
75
77
  "detail.unavailable": "unavailable",
76
78
  "detail.unobserved": "unobserved",
77
- "detail.openFindings": "Open findings",
79
+ "detail.results": "Agent results",
80
+ "detail.remoteDelivery": "Remote delivery",
81
+ "detail.expectedHeads": "Expected heads",
82
+ "detail.provisional": "provisional",
83
+ "detail.allMerged": "All merged",
84
+ "detail.allVerified": "All verified",
85
+ "detail.integratedCoverage": "Archive --integrated coverage",
86
+ "detail.satisfied": "satisfied",
87
+ "detail.blocked": "blocked",
78
88
  "detail.desired": "Desired launch",
79
89
  "detail.desiredAgent": "Desired Agent",
80
90
  "detail.due": "Due",
81
91
  "detail.effective": "Effective launch",
82
92
  "detail.effectiveAgent": "Effective Agent",
83
- "detail.evidence": "Diagnostic evidence",
93
+ "detail.failure": "Execution failure",
94
+ "detail.reviewerTurn": "Reviewer Turn",
84
95
  "detail.execution": "Turns",
85
96
  "detail.expectedOutput": "Expected output",
86
97
  "detail.focus": "Current focus",
@@ -187,6 +198,14 @@ const messages = {
187
198
  "review.failed": "Failed",
188
199
  "review.pending": "Pending",
189
200
  "review.running": "Running",
201
+ "reviewExec.assignment": "Frozen assignment",
202
+ "reviewExec.direct": "Direct Review",
203
+ "reviewExec.main": "Main Reviewer synthesis",
204
+ "reviewExec.producer": "Producer",
205
+ "reviewExec.replicated": "Replicated Review",
206
+ "reviewExec.status.failed": "Settled failed",
207
+ "reviewExec.status.open": "Open",
208
+ "reviewExec.status.succeeded": "Succeeded",
190
209
  "role.detached": "Detached",
191
210
  "role.exited": "Exited",
192
211
  "role.failed": "Failed",
@@ -235,6 +254,48 @@ const messages = {
235
254
  "work.retired": "Retired",
236
255
  "work.running": "Running",
237
256
  "work.superseded": "Superseded",
257
+ "workExec.title": "Execution and recovery",
258
+ "workExec.shape.direct": "Direct",
259
+ "workExec.shape.replicated": "Replicated",
260
+ "workExec.lane.running": "Running",
261
+ "workExec.lane.succeeded": "Succeeded",
262
+ "workExec.lane.needs-attention": "Needs attention",
263
+ "workExec.lane.failed": "Failed",
264
+ "workExec.lane.unknown": "Unknown",
265
+ "workExec.retry": "Retry",
266
+ "workExec.settle": "Settle",
267
+ "workExec.main": "Main Turn",
268
+ "workExec.candidate": "Candidate source",
269
+ "workExec.next": "Next action",
270
+ "workExec.owner": "owner",
271
+ "workExec.none": "none",
272
+ "workExec.synthesis.not-applicable": "No synthesis",
273
+ "workExec.synthesis.blocked-by-open-lanes": "Waiting for all Lanes",
274
+ "workExec.synthesis.eligible": "Eligible for synthesis",
275
+ "workExec.synthesis.insufficient-results": "Insufficient successful results",
276
+ "workExec.synthesis.main-running": "Main Turn running",
277
+ "workExec.synthesis.main-needs-attention": "Main Turn needs attention",
278
+ "workExec.synthesis.complete": "Synthesis complete",
279
+ "workExec.synthesis.unknown": "Synthesis unknown",
280
+ "workExec.mainStatus.not-started": "Not started",
281
+ "workExec.mainStatus.running": "Running",
282
+ "workExec.mainStatus.succeeded": "Succeeded",
283
+ "workExec.mainStatus.needs-attention": "Needs attention",
284
+ "workExec.mainStatus.unknown": "Unknown",
285
+ "workExec.candidateStatus.none": "None",
286
+ "workExec.candidateStatus.observed": "Observed",
287
+ "workExec.candidateStatus.unknown": "Unknown",
288
+ "workExec.action.dispatch-work": "Dispatch work",
289
+ "workExec.action.wait-for-lanes": "Wait for Lanes",
290
+ "workExec.action.retry-or-settle-lanes": "Retry or settle exact Lanes",
291
+ "workExec.action.inspect-unknown": "Inspect missing facts",
292
+ "workExec.action.await-main-dispatch": "Await main Turn dispatch",
293
+ "workExec.action.wait-for-main": "Wait for main Turn",
294
+ "workExec.action.retry-main": "Retry main Turn",
295
+ "workExec.action.redispatch-work": "Redispatch WorkItem",
296
+ "workExec.action.submit-candidate": "Submit Candidate",
297
+ "workExec.action.decide-candidate": "Review or accept Candidate",
298
+ "workExec.action.none": "No action",
238
299
  "stats.running": "running",
239
300
  "stats.inputs": "inputs",
240
301
  "exec.status.needs-leader-action": "Needs leader action",
@@ -277,16 +338,6 @@ const messages = {
277
338
  "exec.monitoring.stopped": "Monitoring stopped",
278
339
  "exec.failClosed": "Fail-closed",
279
340
  "exec.executors": "active",
280
- "exec.purpose.execution": "Execution",
281
- "exec.purpose.review": "Review",
282
- "exec.strategy.fixed": "Fixed · {count} lanes",
283
- "exec.strategy.adaptive": "Adaptive · up to {max}",
284
- "exec.lanesFailed": "failed",
285
- "lane.pending": "Pending",
286
- "lane.running": "Running",
287
- "lane.completed": "Completed",
288
- "lane.failed": "Failed",
289
- "lane.skipped": "Skipped",
290
341
  "dag.ready": "Ready",
291
342
  "dag.dependsOn": "Dependencies",
292
343
  "dag.rootCause": "Root cause",
@@ -300,27 +351,15 @@ const messages = {
300
351
  "dag.edge.active": "active",
301
352
  "dag.edge.failed-open": "failed",
302
353
  "dag.edge.dead": "missing",
303
- "resolution.accept": "Accepted",
304
- "resolution.reject": "Rejected",
305
- "resolution.retry": "Retry",
306
- "resolution.blocked": "Blocked",
307
354
  "detail.candidates": "Candidates",
308
355
  "detail.disposition": "Retirement",
309
356
  "detail.replacementWorkItem": "Replaced by",
310
357
  "detail.endedAt": "Ended",
311
- "detail.findings": "Findings",
312
- "detail.report": "Report",
313
358
  "detail.workspaceDisposition": "Workspace",
314
359
  "detail.lineage": "Execution",
315
360
  "detail.requester": "Requested by",
316
361
  "candidate.source.direct": "Direct",
317
362
  "candidate.source.turn": "Turn",
318
- "finding.severity.low": "Low",
319
- "finding.severity.medium": "Medium",
320
- "finding.severity.high": "High",
321
- "finding.severity.critical": "Critical",
322
- "finding.status.open": "Open",
323
- "finding.status.resolved": "Resolved",
324
363
  "turn.purpose.execution": "Execution",
325
364
  "turn.purpose.review": "Review",
326
365
  "review.scope.work-item": "Work item",
@@ -362,11 +401,18 @@ const messages = {
362
401
  "breadcrumb.taskList": "所有工作",
363
402
  "controls.language": "语言",
364
403
  "controls.theme": "主题",
404
+ "common.yes": "是",
405
+ "common.no": "否",
365
406
  "decision.active": "有效",
366
407
  "decision.superseded": "已替代",
367
408
  "delivery.delivered": "已送达",
368
409
  "delivery.pushed": "已推送 · 等待提供方确认",
369
410
  "delivery.pending": "等待送达",
411
+ "remoteDelivery.none": "无代码交付",
412
+ "remoteDelivery.unavailable": "精确 head 不可用",
413
+ "remoteDelivery.pending": "待合入",
414
+ "remoteDelivery.partial": "部分合入",
415
+ "remoteDelivery.merged": "已合入",
370
416
  "detail.acceptance": "验收标准",
371
417
  "detail.agent": "Agent",
372
418
  "detail.agents": "智能体",
@@ -375,16 +421,12 @@ const messages = {
375
421
  "detail.assignee": "负责人",
376
422
  "detail.attention": "需要你的输入",
377
423
  "detail.baseRef": "基线引用",
378
- "detail.checks": "检查",
379
424
  "detail.completedBy": "完成人",
380
425
  "detail.conclusion": "任务结论",
381
426
  "detail.constraints": "约束",
382
427
  "detail.decisions": "决策",
383
428
  "detail.dependsOn": "依赖",
384
429
  "detail.dag": "任务 DAG",
385
- "detail.stage": "阶段",
386
- "detail.round": "轮次",
387
- "detail.stageAttempt": "阶段尝试",
388
430
  "detail.cost": "成本",
389
431
  "detail.tokens": "Token",
390
432
  "detail.sessionTotalTokens": "Session 累计 Token",
@@ -392,7 +434,6 @@ const messages = {
392
434
  "detail.toolCalls": "工具调用",
393
435
  "detail.wallClock": "墙钟时间",
394
436
  "detail.ready": "可就绪",
395
- "detail.quorum": "法定数量",
396
437
  "detail.contextSnapshots": "上下文快照",
397
438
  "detail.contextBytes": "上下文字节",
398
439
  "detail.compression": "压缩",
@@ -400,13 +441,22 @@ const messages = {
400
441
  "detail.partial": "部分可见",
401
442
  "detail.unavailable": "不可用",
402
443
  "detail.unobserved": "未观测",
403
- "detail.openFindings": "未解决发现",
444
+ "detail.results": "Agent 结果",
445
+ "detail.remoteDelivery": "远端交付",
446
+ "detail.expectedHeads": "预期交付头",
447
+ "detail.provisional": "暂定",
448
+ "detail.allMerged": "已全部合入",
449
+ "detail.allVerified": "已全部验证",
450
+ "detail.integratedCoverage": "归档 --integrated 覆盖",
451
+ "detail.satisfied": "已满足",
452
+ "detail.blocked": "未满足",
404
453
  "detail.desired": "期望启动配置",
405
454
  "detail.desiredAgent": "期望 Agent",
406
455
  "detail.due": "截止时间",
407
456
  "detail.effective": "实际启动配置",
408
457
  "detail.effectiveAgent": "实际 Agent",
409
- "detail.evidence": "诊断证据",
458
+ "detail.failure": "执行失败",
459
+ "detail.reviewerTurn": "Reviewer Turn",
410
460
  "detail.execution": "运行",
411
461
  "detail.expectedOutput": "期望产出",
412
462
  "detail.focus": "当前重点",
@@ -513,6 +563,14 @@ const messages = {
513
563
  "review.failed": "失败",
514
564
  "review.pending": "待准备",
515
565
  "review.running": "评审中",
566
+ "reviewExec.assignment": "冻结任务",
567
+ "reviewExec.direct": "直接评审",
568
+ "reviewExec.main": "主 Reviewer 综合",
569
+ "reviewExec.producer": "Producer",
570
+ "reviewExec.replicated": "复制评审",
571
+ "reviewExec.status.failed": "已结算失败",
572
+ "reviewExec.status.open": "待结算",
573
+ "reviewExec.status.succeeded": "已成功",
516
574
  "role.detached": "已分离",
517
575
  "role.exited": "已退出",
518
576
  "role.failed": "失败",
@@ -561,6 +619,48 @@ const messages = {
561
619
  "work.retired": "已退役",
562
620
  "work.running": "进行中",
563
621
  "work.superseded": "已替代",
622
+ "workExec.title": "执行与恢复",
623
+ "workExec.shape.direct": "直接执行",
624
+ "workExec.shape.replicated": "复制执行",
625
+ "workExec.lane.running": "运行中",
626
+ "workExec.lane.succeeded": "已成功",
627
+ "workExec.lane.needs-attention": "需要处理",
628
+ "workExec.lane.failed": "已结算失败",
629
+ "workExec.lane.unknown": "未知",
630
+ "workExec.retry": "重试",
631
+ "workExec.settle": "结算",
632
+ "workExec.main": "主 Turn",
633
+ "workExec.candidate": "Candidate 来源",
634
+ "workExec.next": "下一步",
635
+ "workExec.owner": "责任人",
636
+ "workExec.none": "无",
637
+ "workExec.synthesis.not-applicable": "无需综合",
638
+ "workExec.synthesis.blocked-by-open-lanes": "等待全部 Lane 结算",
639
+ "workExec.synthesis.eligible": "可综合",
640
+ "workExec.synthesis.insufficient-results": "成功结果不足",
641
+ "workExec.synthesis.main-running": "主 Turn 运行中",
642
+ "workExec.synthesis.main-needs-attention": "主 Turn 需要处理",
643
+ "workExec.synthesis.complete": "综合已完成",
644
+ "workExec.synthesis.unknown": "综合状态未知",
645
+ "workExec.mainStatus.not-started": "未启动",
646
+ "workExec.mainStatus.running": "运行中",
647
+ "workExec.mainStatus.succeeded": "已成功",
648
+ "workExec.mainStatus.needs-attention": "需要处理",
649
+ "workExec.mainStatus.unknown": "未知",
650
+ "workExec.candidateStatus.none": "无",
651
+ "workExec.candidateStatus.observed": "已观测",
652
+ "workExec.candidateStatus.unknown": "未知",
653
+ "workExec.action.dispatch-work": "派发工作",
654
+ "workExec.action.wait-for-lanes": "等待 Lane",
655
+ "workExec.action.retry-or-settle-lanes": "重试或结算指定 Lane",
656
+ "workExec.action.inspect-unknown": "检查缺失事实",
657
+ "workExec.action.await-main-dispatch": "等待主 Turn 派发",
658
+ "workExec.action.wait-for-main": "等待主 Turn",
659
+ "workExec.action.retry-main": "重试主 Turn",
660
+ "workExec.action.redispatch-work": "重新派发 WorkItem",
661
+ "workExec.action.submit-candidate": "提交 Candidate",
662
+ "workExec.action.decide-candidate": "评审或接纳 Candidate",
663
+ "workExec.action.none": "无需操作",
564
664
  "stats.running": "运行中",
565
665
  "stats.inputs": "项输入",
566
666
  "exec.status.needs-leader-action": "待负责人处理",
@@ -603,16 +703,6 @@ const messages = {
603
703
  "exec.monitoring.stopped": "监控已停止",
604
704
  "exec.failClosed": "失败关闭",
605
705
  "exec.executors": "活跃",
606
- "exec.purpose.execution": "执行",
607
- "exec.purpose.review": "评审",
608
- "exec.strategy.fixed": "固定 · {count} 条泳道",
609
- "exec.strategy.adaptive": "自适应 · 最多 {max}",
610
- "exec.lanesFailed": "失败",
611
- "lane.pending": "待处理",
612
- "lane.running": "运行中",
613
- "lane.completed": "已完成",
614
- "lane.failed": "失败",
615
- "lane.skipped": "已跳过",
616
706
  "dag.ready": "可就绪",
617
707
  "dag.dependsOn": "依赖",
618
708
  "dag.rootCause": "根因",
@@ -626,27 +716,15 @@ const messages = {
626
716
  "dag.edge.active": "进行中",
627
717
  "dag.edge.failed-open": "失败传播",
628
718
  "dag.edge.dead": "缺失",
629
- "resolution.accept": "已接受",
630
- "resolution.reject": "已拒绝",
631
- "resolution.retry": "已重试",
632
- "resolution.blocked": "已阻塞",
633
719
  "detail.candidates": "候选方案",
634
720
  "detail.disposition": "退役处置",
635
721
  "detail.replacementWorkItem": "替代项",
636
722
  "detail.endedAt": "结束时间",
637
- "detail.findings": "发现",
638
- "detail.report": "报告",
639
723
  "detail.workspaceDisposition": "工作区",
640
724
  "detail.lineage": "执行谱系",
641
725
  "detail.requester": "请求方",
642
726
  "candidate.source.direct": "直接",
643
727
  "candidate.source.turn": "Turn",
644
- "finding.severity.low": "低",
645
- "finding.severity.medium": "中",
646
- "finding.severity.high": "高",
647
- "finding.severity.critical": "严重",
648
- "finding.status.open": "未解决",
649
- "finding.status.resolved": "已解决",
650
728
  "turn.purpose.execution": "执行",
651
729
  "turn.purpose.review": "评审",
652
730
  "review.scope.work-item": "工作项",