@lumenflow/cli 4.24.0 → 5.0.0

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 (294) hide show
  1. package/README.md +54 -52
  2. package/dist/agent-issues-query.js +10 -2
  3. package/dist/agent-issues-query.js.map +1 -1
  4. package/dist/agent-runtime-enrollment-events.js +44 -0
  5. package/dist/agent-runtime-enrollment-events.js.map +1 -0
  6. package/dist/agent-session-end.js +47 -0
  7. package/dist/agent-session-end.js.map +1 -1
  8. package/dist/agent-session-heartbeat.js +250 -0
  9. package/dist/agent-session-heartbeat.js.map +1 -0
  10. package/dist/agent-session.js +299 -5
  11. package/dist/agent-session.js.map +1 -1
  12. package/dist/capacity-snapshot-emitter.js +73 -0
  13. package/dist/capacity-snapshot-emitter.js.map +1 -0
  14. package/dist/claim-queue.js +276 -0
  15. package/dist/claim-queue.js.map +1 -0
  16. package/dist/config-set.js +22 -3
  17. package/dist/config-set.js.map +1 -1
  18. package/dist/control-plane-sidecar-runner.js +145 -0
  19. package/dist/control-plane-sidecar-runner.js.map +1 -0
  20. package/dist/delegation-list.js +160 -1
  21. package/dist/delegation-list.js.map +1 -1
  22. package/dist/delegation-role-resolver.js +69 -0
  23. package/dist/delegation-role-resolver.js.map +1 -0
  24. package/dist/docs-generate-pack-reference.js +500 -0
  25. package/dist/docs-generate-pack-reference.js.map +1 -0
  26. package/dist/docs-sync.js +116 -1
  27. package/dist/docs-sync.js.map +1 -1
  28. package/dist/file-edit.js +28 -8
  29. package/dist/file-edit.js.map +1 -1
  30. package/dist/file-write.js +29 -5
  31. package/dist/file-write.js.map +1 -1
  32. package/dist/gate-co-change.js +25 -7
  33. package/dist/gate-co-change.js.map +1 -1
  34. package/dist/gate-conditional.js +19 -7
  35. package/dist/gate-conditional.js.map +1 -1
  36. package/dist/gates-runners.js +42 -33
  37. package/dist/gates-runners.js.map +1 -1
  38. package/dist/gates-utils.js +34 -20
  39. package/dist/gates-utils.js.map +1 -1
  40. package/dist/gates.js +79 -7
  41. package/dist/gates.js.map +1 -1
  42. package/dist/hooks/config-resolver.js +10 -1
  43. package/dist/hooks/config-resolver.js.map +1 -1
  44. package/dist/init-package-config.js +1 -1
  45. package/dist/init-package-config.js.map +1 -1
  46. package/dist/init-scaffolding.js +5 -1
  47. package/dist/init-scaffolding.js.map +1 -1
  48. package/dist/init-templates.js +10 -0
  49. package/dist/init-templates.js.map +1 -1
  50. package/dist/init.js +1 -1
  51. package/dist/init.js.map +1 -1
  52. package/dist/initiative-create.js +17 -0
  53. package/dist/initiative-create.js.map +1 -1
  54. package/dist/initiative-remove-wu.js +17 -3
  55. package/dist/initiative-remove-wu.js.map +1 -1
  56. package/dist/kernel-event-sync/emitters.js +104 -0
  57. package/dist/kernel-event-sync/emitters.js.map +1 -0
  58. package/dist/kernel-event-sync/index.js +13 -0
  59. package/dist/kernel-event-sync/index.js.map +1 -0
  60. package/dist/kernel-event-sync/lifecycle-emitters.js +160 -0
  61. package/dist/kernel-event-sync/lifecycle-emitters.js.map +1 -0
  62. package/dist/kernel-event-sync/narrow-emissions.js +89 -0
  63. package/dist/kernel-event-sync/narrow-emissions.js.map +1 -0
  64. package/dist/kernel-event-sync/software-delivery-emitters.js +297 -0
  65. package/dist/kernel-event-sync/software-delivery-emitters.js.map +1 -0
  66. package/dist/lane-lock.js +14 -1
  67. package/dist/lane-lock.js.map +1 -1
  68. package/dist/lane-suggest.js +21 -0
  69. package/dist/lane-suggest.js.map +1 -1
  70. package/dist/lumenflow-upgrade.js +7 -5
  71. package/dist/lumenflow-upgrade.js.map +1 -1
  72. package/dist/mem-context.js +145 -0
  73. package/dist/mem-context.js.map +1 -1
  74. package/dist/mem-create.js +39 -6
  75. package/dist/mem-create.js.map +1 -1
  76. package/dist/mem-inbox.js +16 -0
  77. package/dist/mem-inbox.js.map +1 -1
  78. package/dist/mem-roster.js +95 -0
  79. package/dist/mem-roster.js.map +1 -0
  80. package/dist/mem-signal.js +97 -2
  81. package/dist/mem-signal.js.map +1 -1
  82. package/dist/metrics-snapshot.js +3 -2
  83. package/dist/metrics-snapshot.js.map +1 -1
  84. package/dist/orchestrate-init-status.js +117 -2
  85. package/dist/orchestrate-init-status.js.map +1 -1
  86. package/dist/orchestrate-initiative.js +83 -10
  87. package/dist/orchestrate-initiative.js.map +1 -1
  88. package/dist/orchestrate-monitor-quality.js +289 -0
  89. package/dist/orchestrate-monitor-quality.js.map +1 -0
  90. package/dist/orchestrate-monitor.js +85 -0
  91. package/dist/orchestrate-monitor.js.map +1 -1
  92. package/dist/pack-validate.js +127 -2
  93. package/dist/pack-validate.js.map +1 -1
  94. package/dist/plan-create.js +18 -0
  95. package/dist/plan-create.js.map +1 -1
  96. package/dist/plan-link.js +13 -0
  97. package/dist/plan-link.js.map +1 -1
  98. package/dist/plan-promote.js +14 -0
  99. package/dist/plan-promote.js.map +1 -1
  100. package/dist/pre-commit-check.js +4 -3
  101. package/dist/pre-commit-check.js.map +1 -1
  102. package/dist/public-manifest.js +17 -3
  103. package/dist/public-manifest.js.map +1 -1
  104. package/dist/release.js +10 -10
  105. package/dist/release.js.map +1 -1
  106. package/dist/session-cross-link.js +139 -0
  107. package/dist/session-cross-link.js.map +1 -0
  108. package/dist/sidecar-manager.js +208 -0
  109. package/dist/sidecar-manager.js.map +1 -0
  110. package/dist/state-path-resolvers.js +18 -0
  111. package/dist/state-path-resolvers.js.map +1 -1
  112. package/dist/stream-heartbeat.js +151 -0
  113. package/dist/stream-heartbeat.js.map +1 -0
  114. package/dist/sync-templates.js +56 -2
  115. package/dist/sync-templates.js.map +1 -1
  116. package/dist/wu-block.js +47 -5
  117. package/dist/wu-block.js.map +1 -1
  118. package/dist/wu-claim-branch.js +8 -4
  119. package/dist/wu-claim-branch.js.map +1 -1
  120. package/dist/wu-claim-state.js +5 -3
  121. package/dist/wu-claim-state.js.map +1 -1
  122. package/dist/wu-claim-worktree.js +5 -3
  123. package/dist/wu-claim-worktree.js.map +1 -1
  124. package/dist/wu-claim.js +261 -9
  125. package/dist/wu-claim.js.map +1 -1
  126. package/dist/wu-done-auto-cleanup.js +3 -2
  127. package/dist/wu-done-auto-cleanup.js.map +1 -1
  128. package/dist/wu-done-git-ops.js +12 -8
  129. package/dist/wu-done-git-ops.js.map +1 -1
  130. package/dist/wu-done-preflight.js +3 -3
  131. package/dist/wu-done-preflight.js.map +1 -1
  132. package/dist/wu-done.js +46 -10
  133. package/dist/wu-done.js.map +1 -1
  134. package/dist/wu-lifecycle-sync/gate-scope-resolver.js +16 -0
  135. package/dist/wu-lifecycle-sync/gate-scope-resolver.js.map +1 -0
  136. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js +10 -0
  137. package/dist/wu-lifecycle-sync/kernel-event-sync-shim.js.map +1 -0
  138. package/dist/wu-prep.js +363 -22
  139. package/dist/wu-prep.js.map +1 -1
  140. package/dist/wu-prune.js +68 -27
  141. package/dist/wu-prune.js.map +1 -1
  142. package/dist/wu-release.js +34 -3
  143. package/dist/wu-release.js.map +1 -1
  144. package/dist/wu-review.js +167 -0
  145. package/dist/wu-review.js.map +1 -0
  146. package/dist/wu-spawn-prompt-builders.js +296 -40
  147. package/dist/wu-spawn-prompt-builders.js.map +1 -1
  148. package/dist/wu-spawn-strategy-resolver.js +126 -14
  149. package/dist/wu-spawn-strategy-resolver.js.map +1 -1
  150. package/dist/wu-unblock.js +52 -22
  151. package/dist/wu-unblock.js.map +1 -1
  152. package/package.json +13 -8
  153. package/packs/agent-runtime/.turbo/turbo-build.log +1 -1
  154. package/packs/agent-runtime/.turbo/turbo-test.log +25 -0
  155. package/packs/agent-runtime/.turbo/turbo-typecheck.log +4 -0
  156. package/packs/agent-runtime/agent-heartbeat.ts +163 -0
  157. package/packs/agent-runtime/auto-session-integration.ts +874 -0
  158. package/packs/agent-runtime/delegation-registry-schema.ts +220 -0
  159. package/packs/agent-runtime/delegation-registry-store.ts +269 -0
  160. package/packs/agent-runtime/delegation-tree.ts +328 -0
  161. package/packs/agent-runtime/index.ts +9 -0
  162. package/packs/agent-runtime/manifest.ts +103 -19
  163. package/packs/agent-runtime/manifest.yaml +132 -0
  164. package/packs/agent-runtime/memory-coordination-contract.ts +86 -0
  165. package/packs/agent-runtime/memory.d.ts +19 -0
  166. package/packs/agent-runtime/orchestration.ts +238 -23
  167. package/packs/agent-runtime/package.json +11 -2
  168. package/packs/agent-runtime/remote-controls/index.ts +7 -0
  169. package/packs/agent-runtime/remote-controls/operations.ts +399 -0
  170. package/packs/agent-runtime/remote-controls/port.ts +48 -0
  171. package/packs/agent-runtime/remote-controls/state-store.ts +258 -0
  172. package/packs/agent-runtime/remote-controls/types.ts +105 -0
  173. package/packs/agent-runtime/session-schema.ts +423 -0
  174. package/packs/agent-runtime/tool-impl/index.ts +1 -0
  175. package/packs/agent-runtime/tool-impl/remote-controls.mock.ts +252 -0
  176. package/packs/agent-runtime/tool-impl/remote-controls.ts +273 -0
  177. package/packs/agent-runtime/tsconfig.json +1 -1
  178. package/packs/agent-runtime/turn-lifecycle-events.ts +501 -0
  179. package/packs/sidekick/.lumenflow/state/conductor/outbox/sidekick-events.jsonl +213 -0
  180. package/packs/sidekick/.turbo/turbo-build.log +1 -1
  181. package/packs/sidekick/.turbo/turbo-test.log +25 -0
  182. package/packs/sidekick/.turbo/turbo-typecheck.log +4 -0
  183. package/packs/sidekick/channel-ingress.ts +137 -0
  184. package/packs/sidekick/manifest.ts +74 -0
  185. package/packs/sidekick/manifest.yaml +88 -0
  186. package/packs/sidekick/package.json +3 -1
  187. package/packs/sidekick/sidekick-events.ts +517 -0
  188. package/packs/sidekick/src/adapters/cloud-queue.ts +101 -0
  189. package/packs/sidekick/src/adapters/control-plane-bridge.adapter.ts +378 -0
  190. package/packs/sidekick/src/adapters/filesystem-bridge.adapter.ts +224 -0
  191. package/packs/sidekick/src/domain/channel.types.ts +84 -0
  192. package/packs/sidekick/src/ports/channel-bridge.port.ts +75 -0
  193. package/packs/sidekick/src/routines/commit.ts +74 -0
  194. package/packs/sidekick/tool-impl/channel-tools.ts +47 -0
  195. package/packs/sidekick/tool-impl/memory-tools.ts +17 -0
  196. package/packs/sidekick/tool-impl/routine-commit.ts +102 -0
  197. package/packs/sidekick/tool-impl/routine-tools.ts +67 -7
  198. package/packs/sidekick/tool-impl/runtime-context.ts +4 -0
  199. package/packs/sidekick/tool-impl/storage.ts +3 -0
  200. package/packs/sidekick/tool-impl/system-tools.ts +7 -0
  201. package/packs/sidekick/tool-impl/task-tools.ts +46 -0
  202. package/packs/sidekick/tsconfig.json +1 -1
  203. package/packs/software-delivery/.turbo/turbo-build.log +1 -1
  204. package/packs/software-delivery/.turbo/turbo-test.log +63 -0
  205. package/packs/software-delivery/.turbo/turbo-typecheck.log +4 -0
  206. package/packs/software-delivery/manifest-schema.ts +30 -0
  207. package/packs/software-delivery/manifest.ts +99 -1
  208. package/packs/software-delivery/manifest.yaml +46 -0
  209. package/packs/software-delivery/package.json +88 -3
  210. package/packs/software-delivery/src/commands/index.ts +5 -0
  211. package/packs/software-delivery/src/config/delivery-review-contract.ts +20 -0
  212. package/packs/software-delivery/src/config/env-accessors.ts +19 -0
  213. package/packs/software-delivery/src/config/index.ts +8 -0
  214. package/packs/software-delivery/src/config/normalize-config-keys.ts +19 -0
  215. package/packs/software-delivery/src/config/schemas/lumenflow-config-schema-types.ts +436 -0
  216. package/packs/software-delivery/src/config/workspace-reader.ts +310 -0
  217. package/packs/software-delivery/src/constants/backlog-patterns.ts +31 -0
  218. package/packs/software-delivery/src/constants/client-ids.ts +19 -0
  219. package/packs/software-delivery/src/constants/config-contract.ts +7 -0
  220. package/packs/software-delivery/src/constants/docs-layout-presets.ts +50 -0
  221. package/packs/software-delivery/src/constants/duration-constants.ts +20 -0
  222. package/packs/software-delivery/src/constants/gate-constants.ts +32 -0
  223. package/packs/software-delivery/src/constants/index.ts +29 -0
  224. package/packs/software-delivery/src/constants/lock-constants.ts +35 -0
  225. package/packs/software-delivery/src/constants/object-guards.ts +12 -0
  226. package/packs/software-delivery/src/constants/section-headings.ts +107 -0
  227. package/packs/software-delivery/src/constants/wu-cli-constants.ts +485 -0
  228. package/packs/software-delivery/src/constants/wu-domain-constants.ts +466 -0
  229. package/packs/software-delivery/src/constants/wu-git-constants.ts +7 -0
  230. package/packs/software-delivery/src/constants/wu-id-format.ts +327 -0
  231. package/packs/software-delivery/src/constants/wu-paths-constants.ts +358 -0
  232. package/packs/software-delivery/src/constants/wu-statuses.ts +287 -0
  233. package/packs/software-delivery/src/constants/wu-type-helpers.ts +67 -0
  234. package/packs/software-delivery/src/constants/wu-ui-constants.ts +267 -0
  235. package/packs/software-delivery/src/constants/wu-validation-constants.ts +73 -0
  236. package/packs/software-delivery/src/domain/index.ts +5 -0
  237. package/packs/software-delivery/src/domain/orchestration.constants.ts +168 -0
  238. package/packs/software-delivery/src/domain/orchestration.schemas.ts +239 -0
  239. package/packs/software-delivery/src/domain/orchestration.types.ts +178 -0
  240. package/packs/software-delivery/src/methodology/incremental-test.ts +90 -0
  241. package/packs/software-delivery/src/methodology/index.ts +6 -0
  242. package/packs/software-delivery/src/methodology/manual-test-validator.ts +292 -0
  243. package/packs/software-delivery/src/policy/coverage-gate.ts +270 -0
  244. package/packs/software-delivery/src/policy/gates-agent-mode.ts +223 -0
  245. package/packs/software-delivery/src/policy/gates-config-internal.ts +121 -0
  246. package/packs/software-delivery/src/policy/gates-config.ts +293 -0
  247. package/packs/software-delivery/src/policy/gates-coverage.ts +247 -0
  248. package/packs/software-delivery/src/policy/gates-presets.ts +134 -0
  249. package/packs/software-delivery/src/policy/gates-schemas.ts +173 -0
  250. package/packs/software-delivery/src/policy/index.ts +22 -0
  251. package/packs/software-delivery/src/policy/package-manager-resolver.ts +319 -0
  252. package/packs/software-delivery/src/policy/resolve-policy.ts +518 -0
  253. package/packs/software-delivery/src/ports/config.ports.ts +90 -0
  254. package/packs/software-delivery/src/ports/dashboard-renderer.port.ts +125 -0
  255. package/packs/software-delivery/src/ports/index.ts +10 -0
  256. package/packs/software-delivery/src/ports/sync-validator.ports.ts +59 -0
  257. package/packs/software-delivery/src/ports/wu-helpers.ports.ts +168 -0
  258. package/packs/software-delivery/src/ports/wu-state.ports.ts +241 -0
  259. package/packs/software-delivery/src/primitives/index.ts +5 -0
  260. package/packs/software-delivery/src/runtime/index.ts +6 -0
  261. package/packs/software-delivery/src/runtime/work-classifier.ts +561 -0
  262. package/packs/software-delivery/src/sandbox/index.ts +10 -0
  263. package/packs/software-delivery/src/sandbox/sandbox-allowlist.ts +118 -0
  264. package/packs/software-delivery/src/sandbox/sandbox-backend-linux.ts +88 -0
  265. package/packs/software-delivery/src/sandbox/sandbox-backend-macos.ts +154 -0
  266. package/packs/software-delivery/src/sandbox/sandbox-backend-windows.ts +47 -0
  267. package/packs/software-delivery/src/sandbox/sandbox-profile.ts +153 -0
  268. package/packs/software-delivery/src/schemas/index.ts +5 -0
  269. package/packs/software-delivery/src/state/date-utils.ts +158 -0
  270. package/packs/software-delivery/src/state/index.ts +15 -0
  271. package/packs/software-delivery/src/state/state-machine.ts +119 -0
  272. package/packs/software-delivery/src/state/wu-doc-types.ts +51 -0
  273. package/packs/software-delivery/src/state/wu-paths.ts +381 -0
  274. package/packs/software-delivery/src/state/wu-schema.ts +1139 -0
  275. package/packs/software-delivery/src/state/wu-state-schema.ts +255 -0
  276. package/packs/software-delivery/src/state/wu-yaml.ts +338 -0
  277. package/packs/software-delivery/src/types.d.ts +16 -0
  278. package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +18 -0
  279. package/packs/software-delivery/tsconfig.json +28 -2
  280. package/templates/core/AGENTS.md.template +76 -17
  281. package/templates/core/LUMENFLOW.md.template +265 -66
  282. package/templates/core/_frameworks/lumenflow/wu-sizing-guide.md.template +180 -116
  283. package/templates/core/ai/onboarding/agent-invocation-guide.md.template +26 -8
  284. package/templates/core/ai/onboarding/existing-project-bootstrap.md.template +171 -0
  285. package/templates/core/ai/onboarding/first-15-mins.md.template +3 -1
  286. package/templates/core/ai/onboarding/first-wu-mistakes.md.template +1 -1
  287. package/templates/core/ai/onboarding/initiative-orchestration.md.template +46 -30
  288. package/templates/core/ai/onboarding/quick-ref-commands.md.template +36 -33
  289. package/templates/core/ai/onboarding/release-process.md.template +8 -7
  290. package/templates/core/ai/onboarding/starting-prompt.md.template +2 -0
  291. package/templates/core/ai/onboarding/troubleshooting-wu-done.md.template +62 -0
  292. package/templates/vendors/claude/.claude/CLAUDE.md.template +29 -54
  293. package/templates/vendors/cursor/.cursor/rules/lumenflow.md.template +24 -52
  294. package/templates/vendors/windsurf/.windsurf/rules/lumenflow.md.template +24 -52
@@ -17,14 +17,21 @@
17
17
  import { Command } from 'commander';
18
18
  import chalk from 'chalk';
19
19
  import { loadInitiativeWUs, loadMultipleInitiatives, buildExecutionPlanWithLockPolicy, resolveLaneConfigsFromConfig, formatExecutionPlan, formatExecutionPlanWithEmbeddedSpawns, calculateProgress, formatProgress, buildCheckpointWave, formatCheckpointOutput, writeExecutionPlanArtifacts, validateCheckpointFlags, resolveCheckpointModeAsync, LOG_PREFIX, } from '@lumenflow/initiatives';
20
+ import { configureSharedHandoffRenderer } from '@lumenflow/core/wu-spawn';
20
21
  import { EXIT_CODES } from '@lumenflow/core/wu-constants';
21
22
  import { getConfig } from '@lumenflow/core/config';
22
- import { getErrorMessage, ProcessExitError } from '@lumenflow/core/error-handler';
23
+ import { createError, ErrorCodes, getErrorMessage, ProcessExitError, } from '@lumenflow/core/error-handler';
23
24
  import { ORCHESTRATION_STATUS_VALUES } from '@lumenflow/control-plane-sdk';
25
+ import { buildOrchestrationLaunchEmittedEvent, buildOrchestrationPlanWrittenEvent, buildOrchestrationStatusUpdatedEvent, readOrgIdFromConfig, resolveConductorEventSink, } from './kernel-event-sync/lifecycle-emitters.js';
24
26
  import { runCLI } from './cli-entry-point.js';
25
27
  import { loadInitiativeExecutionSummary, } from './orchestrate-monitor.js';
26
28
  import { readMaxActiveWorkersFromConfig, readStallThresholdMs } from './orchestrate-integrity.js';
29
+ import { renderBriefForClient, SUPPORTED_BRIEF_CLIENTS, } from './wu-spawn-prompt-builders.js';
27
30
  const VALID_CLIENTS = ['claude-code', 'codex-cli', 'gemini-cli', 'cursor', 'windsurf'];
31
+ const SUPPORTED_BRIEF_CLIENT_SET = new Set(SUPPORTED_BRIEF_CLIENTS);
32
+ function isSupportedBriefClient(clientName) {
33
+ return SUPPORTED_BRIEF_CLIENT_SET.has(clientName);
34
+ }
28
35
  export function mapExecutionSummaryToCheckpointEvidence(summary) {
29
36
  return summary.wus.map((wu) => ({
30
37
  wuId: wu.wuId,
@@ -51,15 +58,16 @@ const program = new Command()
51
58
  .option('-c, --checkpoint-per-wave', 'Spawn next wave then exit (no polling)')
52
59
  .option('--no-checkpoint', 'Force polling mode')
53
60
  .option('--client <name>', 'Agent client (claude-code, codex-cli, gemini-cli, cursor, windsurf)')
61
+ .option('--print-handoffs', 'Print stored handoff artifacts inline for manual copy/paste output')
54
62
  .option('--max-active-workers <count>', 'Cap concurrent active workers; overrides software_delivery.orchestration.max_active_workers', (value) => {
55
63
  const parsed = Number.parseInt(value, 10);
56
64
  if (!Number.isInteger(parsed) || parsed < 0) {
57
- throw new Error(`Invalid --max-active-workers: expected a non-negative integer`);
65
+ throw createError(ErrorCodes.INVALID_ARGUMENT, 'Invalid --max-active-workers: expected a non-negative integer', { value });
58
66
  }
59
67
  return parsed;
60
68
  })
61
69
  .action(async (options) => {
62
- const { initiative: initIds, dryRun, progress: progressOnly, checkpointPerWave, checkpoint, client: clientArg, maxActiveWorkers: maxActiveWorkersFlag, } = options;
70
+ const { initiative: initIds, dryRun, progress: progressOnly, checkpointPerWave, checkpoint, client: clientArg, printHandoffs, maxActiveWorkers: maxActiveWorkersFlag, } = options;
63
71
  const noCheckpoint = checkpoint === false;
64
72
  try {
65
73
  validateCheckpointFlags({ checkpointPerWave, dryRun, noCheckpoint });
@@ -89,6 +97,20 @@ const program = new Command()
89
97
  console.error(' pnpm orchestrate:initiative --initiative INIT-001 --client codex-cli');
90
98
  throw new ProcessExitError(message, EXIT_CODES.ERROR);
91
99
  }
100
+ const restoreSharedHandoffRenderer = configureSharedHandoffRenderer(clientName && isSupportedBriefClient(clientName)
101
+ ? ({ clientName: sharedClientName, doc, id, strategy, config: sharedConfig }) => {
102
+ if (!isSupportedBriefClient(sharedClientName)) {
103
+ return undefined;
104
+ }
105
+ return renderBriefForClient({
106
+ client: sharedClientName,
107
+ doc,
108
+ id,
109
+ strategy,
110
+ config: sharedConfig,
111
+ });
112
+ }
113
+ : undefined);
92
114
  try {
93
115
  console.log(chalk.cyan(`${LOG_PREFIX} Loading initiative(s): ${initIds.join(', ')}`));
94
116
  let wus;
@@ -135,7 +157,7 @@ const program = new Command()
135
157
  return;
136
158
  }
137
159
  // WU-2375: Pass clientName to checkpoint output formatting
138
- console.log(formatCheckpointOutput({ ...waveData, dryRun, clientName }));
160
+ console.log(formatCheckpointOutput({ ...waveData, dryRun, clientName }, { printHandoffs: printHandoffs === true }));
139
161
  return;
140
162
  }
141
163
  console.log(chalk.cyan(`${LOG_PREFIX} Building execution plan...`));
@@ -182,28 +204,76 @@ const program = new Command()
182
204
  console.log('');
183
205
  console.log(chalk.bold('Monitoring Commands:'));
184
206
  console.log(' pnpm mem:inbox --since 10m # Check for signals from agents');
207
+ console.log(' pnpm mem:roster # Inspect live session/display-name roster');
208
+ console.log(' pnpm delegation:list --initiative ' +
209
+ initIds[0] +
210
+ ' # Cross-link sessions + delegations');
185
211
  console.log(' pnpm orchestrate:init-status -i ' + initIds[0] + ' # Check progress');
186
212
  console.log(' pnpm orchestrate:monitor # Live agent activity');
213
+ console.log('');
214
+ console.log(chalk.bold('Orchestrator Session Contract:'));
215
+ console.log(' When dispatching from an orchestrator WU, start the coordinator session with:');
216
+ console.log(' pnpm agent:session --wu <ORCHESTRATOR-WU> --tier 2 --lifecycle-role orchestrator --specialty-profile delivery');
217
+ console.log(' This keeps the coordinator visible in mem:roster and delegation:list.');
187
218
  return;
188
219
  }
189
220
  // WU-1202: Output spawn content for actual execution (not dry-run)
190
221
  // WU-2375: Format varies by client capability (XML for Claude, markdown for others)
222
+ let launchArtifacts;
191
223
  if (initIds.length === 1) {
192
- const launchArtifacts = writeExecutionPlanArtifacts(initIds[0], wus, plan, { clientName });
224
+ launchArtifacts = writeExecutionPlanArtifacts(initIds[0], wus, plan, { clientName });
193
225
  console.log(chalk.cyan(`${LOG_PREFIX} Wrote plan/launch/status artifacts for launch attempt ${launchArtifacts.launchAttempt}`));
194
226
  console.log(` Plan: ${launchArtifacts.planPath}`);
195
227
  console.log(` Launch: ${launchArtifacts.launchPath}`);
196
228
  console.log(` Status: ${launchArtifacts.statusPath}`);
229
+ // WU-2654: narrow conductor emissions now that plan/launch/status
230
+ // artifacts have been durably written. Fail-silent when the workspace
231
+ // is local-only (no control_plane.org_id). Discrete fire-once kinds:
232
+ // - orchestration:plan_written (1 per attempt)
233
+ // - orchestration:launch_emitted (1 per launchable WU)
234
+ // - orchestration:status_updated (1 per WU with handoff_emitted state)
235
+ const orgId = readOrgIdFromConfig(config);
236
+ if (orgId) {
237
+ const sink = await resolveConductorEventSink();
238
+ sink(buildOrchestrationPlanWrittenEvent({
239
+ initiative: initIds[0],
240
+ launch_attempt: launchArtifacts.launchAttempt,
241
+ }));
242
+ for (const receipt of launchArtifacts.handoffReceipts) {
243
+ sink(buildOrchestrationLaunchEmittedEvent({
244
+ initiative: initIds[0],
245
+ wu_id: receipt.wu_id,
246
+ launch_attempt: launchArtifacts.launchAttempt,
247
+ }));
248
+ sink(buildOrchestrationStatusUpdatedEvent({
249
+ initiative: initIds[0],
250
+ wu_id: receipt.wu_id,
251
+ orchestration_state: receipt.orchestration_state,
252
+ }));
253
+ }
254
+ }
197
255
  }
198
256
  console.log('');
199
- console.log(chalk.bold('Spawn Commands:'));
200
- console.log(formatExecutionPlanWithEmbeddedSpawns(plan, clientName));
257
+ console.log(chalk.bold('Launch Summary:'));
258
+ console.log(formatExecutionPlanWithEmbeddedSpawns(plan, clientName, {
259
+ printHandoffs,
260
+ artifactDir: launchArtifacts?.artifactDir,
261
+ planPath: launchArtifacts?.planPath,
262
+ launchPath: launchArtifacts?.launchPath,
263
+ statusPath: launchArtifacts?.statusPath,
264
+ handoffReceipts: launchArtifacts?.handoffReceipts,
265
+ }));
201
266
  console.log(chalk.green(`${LOG_PREFIX} Execution plan output complete.`));
202
- if (!clientName || clientName === 'claude-code') {
203
- console.log(chalk.cyan('Copy the spawn XML above to execute agents.'));
267
+ if (printHandoffs) {
268
+ if (!clientName || clientName === 'claude-code') {
269
+ console.log(chalk.cyan('Copy the stored XML above to execute agents.'));
270
+ }
271
+ else {
272
+ console.log(chalk.cyan('Copy the stored prompts above to your agent platform.'));
273
+ }
204
274
  }
205
275
  else {
206
- console.log(chalk.cyan('Copy the prompts above to your agent platform.'));
276
+ console.log(chalk.cyan('Use --print-handoffs to inline the stored handoff artifacts for manual copy/paste.'));
207
277
  }
208
278
  }
209
279
  catch (error) {
@@ -214,6 +284,9 @@ const program = new Command()
214
284
  console.error(chalk.red(message));
215
285
  throw new ProcessExitError(message, EXIT_CODES.ERROR);
216
286
  }
287
+ finally {
288
+ restoreSharedHandoffRenderer();
289
+ }
217
290
  });
218
291
  export async function main() {
219
292
  await program.parseAsync(process.argv);
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrate-initiative.js","sourceRoot":"","sources":["../src/orchestrate-initiative.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrate-initiative.js","sourceRoot":"","sources":["../src/orchestrate-initiative.ts"],"names":[],"mappings":";AACA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,gCAAgC,EAChC,4BAA4B,EAC5B,mBAAmB,EACnB,qCAAqC,EACrC,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,UAAU,GAIX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,EACL,oCAAoC,EACpC,kCAAkC,EAClC,oCAAoC,EACpC,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EACL,8BAA8B,GAE/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EACL,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACvF,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS,uBAAuB,CAAC,CAAC;AAE5E,SAAS,sBAAsB,CAAC,UAAkB;IAChD,OAAO,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,uCAAuC,CACrD,OAA0C;IAgB1C,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,cAAc,EACZ,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,eAAe,IAAI,EAAE,CAAC,aAAa,KAAK,SAAS;QAC5F,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,MAAM;QACvD,cAAc,EAAE,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,eAAe;QACxE,YAAY,EAAE,EAAE,CAAC,YAAY;QAC7B,eAAe,EAAE,EAAE,CAAC,eAAe;QACnC,WAAW,EAAE,EAAE,CAAC,WAAW;QAC3B,aAAa,EAAE,EAAE,CAAC,aAAa;QAC/B,aAAa,EAAE,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACvF,cAAc,EAAE,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,eAAe,IAAI,EAAE,CAAC,eAAe;QAC9F,aAAa,EAAE,EAAE,CAAC,KAAK,KAAK,2BAA2B,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC,eAAe;QAC9F,iBAAiB,EAAE,EAAE,CAAC,iBAAiB;QACvC,OAAO,EAAE,EAAE,CAAC,OAAO;KACpB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,wBAAwB,CAAC;KAC9B,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,2BAA2B,EAAE,iCAAiC,CAAC;KACtE,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;KACtD,MAAM,CAAC,2BAA2B,EAAE,wCAAwC,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,iBAAiB,EAAE,qEAAqE,CAAC;KAChG,MAAM,CAAC,kBAAkB,EAAE,oEAAoE,CAAC;KAChG,MAAM,CACL,8BAA8B,EAC9B,6FAA6F,EAC7F,CAAC,KAAK,EAAE,EAAE;IACR,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,WAAW,CACf,UAAU,CAAC,gBAAgB,EAC3B,+DAA+D,EAC/D,EAAE,KAAK,EAAE,CACV,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CACF;KACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EACJ,UAAU,EAAE,OAAO,EACnB,MAAM,EACN,QAAQ,EAAE,YAAY,EACtB,iBAAiB,EACjB,UAAU,EACV,MAAM,EAAE,SAAS,EACjB,aAAa,EACb,gBAAgB,EAAE,oBAAoB,GACvC,GAAG,OAAO,CAAC;IACZ,MAAM,YAAY,GAAG,UAAU,KAAK,KAAK,CAAC;IAE1C,IAAI,CAAC;QACH,uBAAuB,CAAC,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,GAAG,UAAU,WAAW,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,+BAA+B;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAuB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,SAAS,CAAC;IAE9F,IAAI,SAAS,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,GAAG,UAAU,6BAA6B,SAAS,KAAK;YACtD,kBAAkB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/C,CACF,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,YAAY,UAAU,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,GAAG,UAAU,kCAAkC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,wEAAwE,CAAC,CAAC;QACxF,MAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,4BAA4B,GAAG,8BAA8B,CACjE,UAAU,IAAI,sBAAsB,CAAC,UAAU,CAAC;QAC9C,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE;YAC5E,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,oBAAoB,CAAC;gBAC1B,MAAM,EAAE,gBAAgB;gBACxB,GAAG;gBACH,EAAE;gBACF,QAAQ;gBACR,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;QACL,CAAC;QACH,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,2BAA2B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtF,IAAI,GAAc,CAAC;QACnB,IAAI,UAAyB,CAAC;QAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7C,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YAC/B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YACvC,UAAU,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACzE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,WAAW,GAAG,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,0BAA0B,CACzD,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,EAAE,EAC3C,GAAG,CACJ,CAAC;QAEF,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,GAAG,UAAU,yDAAyD,CAAC;gBACvF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;gBAClC,MAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;YAED,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACtD,MAAM,gBAAgB,GAAG,MAAM,8BAA8B,CAC3D,OAAO,CAAC,GAAG,EAAE,EACb,OAAO,CAAC,CAAC,CAAC,EACV,GAAG,EACH,EAAE,gBAAgB,EAAE,CACrB,CAAC;YACF,MAAM,kBAAkB,GAAG,uCAAuC,CAAC,gBAAgB,CAAC,CAAC;YACrF,MAAM,gBAAgB,GACpB,OAAO,oBAAoB,KAAK,QAAQ;gBACtC,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAC/C,MAAM;gBACN,UAAU;gBACV,iBAAiB,EAAE,kBAAkB;gBACrC,gBAAgB;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,0CAA0C,CAAC,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,2DAA2D;YAC3D,OAAO,CAAC,GAAG,CACT,sBAAsB,CACpB,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,EACnC,EAAE,aAAa,EAAE,aAAa,KAAK,IAAI,EAAE,CAC1C,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,6BAA6B,CAAC,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,gCAAgC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAEpE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,iDAAiD;YACjD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;YAClF,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;gBAC3E,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,GAAG,UAAU,IAAI,YAAY,8CAA8C,CAC5E,CACF,CAAC;gBACF,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,GAAG,UAAU,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,sCAAsC,CAC9E,CACF,CAAC;gBACJ,CAAC;gBACD,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,GAAG,UAAU,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,6BAA6B,CAC/E,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,4CAA4C,CAAC,CAAC,CAAC;YACtF,CAAC;YACD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QAEnD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,UAAU,mCAAmC,CAAC,CAAC,CAAC;YAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CACT,gFAAgF,CACjF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CACT,kFAAkF,CACnF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,sCAAsC;gBACpC,OAAO,CAAC,CAAC,CAAC;gBACV,wCAAwC,CAC3C,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,oCAAoC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CACT,iFAAiF,CAClF,CAAC;YACF,OAAO,CAAC,GAAG,CACT,iHAAiH,CAClH,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,oFAAoF;QACpF,IAAI,eAAwD,CAAC;QAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,eAAe,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,GAAG,UAAU,0DAA0D,eAAe,CAAC,aAAa,EAAE,CACvG,CACF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,WAAW,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,aAAa,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,aAAa,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC;YAEvD,kEAAkE;YAClE,sEAAsE;YACtE,qEAAqE;YACrE,iDAAiD;YACjD,yDAAyD;YACzD,yEAAyE;YACzE,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,MAAM,yBAAyB,EAAE,CAAC;gBAC/C,IAAI,CACF,kCAAkC,CAAC;oBACjC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;oBACtB,cAAc,EAAE,eAAe,CAAC,aAAa;iBAC9C,CAAC,CACH,CAAC;gBACF,KAAK,MAAM,OAAO,IAAI,eAAe,CAAC,eAAe,EAAE,CAAC;oBACtD,IAAI,CACF,oCAAoC,CAAC;wBACnC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;wBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,cAAc,EAAE,eAAe,CAAC,aAAa;qBAC9C,CAAC,CACH,CAAC;oBACF,IAAI,CACF,oCAAoC,CAAC;wBACnC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;wBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;qBACjD,CAAC,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CACT,qCAAqC,CAAC,IAAI,EAAE,UAAU,EAAE;YACtD,aAAa;YACb,WAAW,EAAE,eAAe,EAAE,WAAW;YACzC,QAAQ,EAAE,eAAe,EAAE,QAAQ;YACnC,UAAU,EAAE,eAAe,EAAE,UAAU;YACvC,UAAU,EAAE,eAAe,EAAE,UAAU;YACvC,eAAe,EAAE,eAAe,EAAE,eAAe;SAClD,CAAC,CACH,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,UAAU,kCAAkC,CAAC,CAAC,CAAC;QAC1E,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,oFAAoF,CACrF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,GAAG,UAAU,WAAW,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;YAAS,CAAC;QACT,4BAA4B,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -0,0 +1,289 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Orchestrate Monitor — Quality Signal (WU-2667)
5
+ *
6
+ * Complements WU-2650 (at-merge commit-order gate) by catching the same
7
+ * TDD violation mid-execution. For each active worktree, walks the lane
8
+ * branch's commits vs the shared base and emits a non-blocking
9
+ * `quality:tests-missing` signal when production LOC exceeds the configured
10
+ * threshold with zero test-file commits past the grace window.
11
+ *
12
+ * This module is the pure core: the integration function accepts an injected
13
+ * commit resolver and clock so tests can drive it with real git fixtures or
14
+ * synthetic commits. See runQualityDetectionForActiveWorktrees for the shape
15
+ * that orchestrate-monitor.ts calls.
16
+ *
17
+ * @module orchestrate-monitor-quality
18
+ */
19
+ import { execFileSync } from 'node:child_process';
20
+ import { join } from 'node:path';
21
+ import { TEST_FILE_PATTERNS } from '@lumenflow/core';
22
+ import { BRANCHES, GIT_REFS } from '@lumenflow/core/wu-constants';
23
+ import { createSignal } from '@lumenflow/memory/signal';
24
+ /**
25
+ * Default minimum production LOC required to trigger a signal. Chosen to match
26
+ * the WU-2650 gate so operators see the same threshold both mid-execution and
27
+ * at merge time unless they override one.
28
+ */
29
+ export const DEFAULT_MONITOR_QUALITY_MIN_RUNTIME_LOC = 50;
30
+ /**
31
+ * Default grace window in minutes. Agents routinely land the first prod commit
32
+ * a few minutes after claim; the grace window absorbs that normal churn so the
33
+ * signal only fires on genuinely stalled TDD.
34
+ */
35
+ export const DEFAULT_MONITOR_QUALITY_GRACE_MINUTES = 15;
36
+ /**
37
+ * Canonical signal type emitted by this detector. Orchestrators filter inbox
38
+ * signals on this type via the existing mem:inbox command.
39
+ */
40
+ export const MONITOR_QUALITY_SIGNAL_TYPE = 'quality:tests-missing';
41
+ const MS_PER_MINUTE = 60 * 1000;
42
+ function isPositiveInteger(value) {
43
+ return typeof value === 'number' && Number.isInteger(value) && value > 0;
44
+ }
45
+ function isNonNegativeInteger(value) {
46
+ return typeof value === 'number' && Number.isInteger(value) && value >= 0;
47
+ }
48
+ function readBool(value, fallback) {
49
+ return typeof value === 'boolean' ? value : fallback;
50
+ }
51
+ /**
52
+ * Read `software_delivery.agents.monitor_quality_signals` from the resolved
53
+ * workspace config, applying defaults and coercing invalid values back to
54
+ * defaults so a broken workspace.yaml never silently disables the detector.
55
+ */
56
+ export function readMonitorQualitySignalsConfig(config) {
57
+ const defaults = {
58
+ enabled: true,
59
+ min_runtime_loc: DEFAULT_MONITOR_QUALITY_MIN_RUNTIME_LOC,
60
+ grace_minutes: DEFAULT_MONITOR_QUALITY_GRACE_MINUTES,
61
+ };
62
+ if (typeof config !== 'object' || config === null) {
63
+ return defaults;
64
+ }
65
+ const sd = config.software_delivery;
66
+ if (typeof sd !== 'object' || sd === null) {
67
+ return defaults;
68
+ }
69
+ const agents = sd.agents;
70
+ if (typeof agents !== 'object' || agents === null) {
71
+ return defaults;
72
+ }
73
+ const raw = agents.monitor_quality_signals;
74
+ if (typeof raw !== 'object' || raw === null) {
75
+ return defaults;
76
+ }
77
+ const candidate = raw;
78
+ return {
79
+ enabled: readBool(candidate.enabled, defaults.enabled),
80
+ min_runtime_loc: isPositiveInteger(candidate.min_runtime_loc)
81
+ ? candidate.min_runtime_loc
82
+ : defaults.min_runtime_loc,
83
+ grace_minutes: isNonNegativeInteger(candidate.grace_minutes)
84
+ ? candidate.grace_minutes
85
+ : defaults.grace_minutes,
86
+ };
87
+ }
88
+ function normalisePath(filePath) {
89
+ return filePath.replace(/\\/g, '/');
90
+ }
91
+ function isTestFilePath(filePath) {
92
+ const normalized = normalisePath(filePath);
93
+ return TEST_FILE_PATTERNS.some((pattern) => pattern.test(normalized));
94
+ }
95
+ /**
96
+ * Documentation-only path prefixes and extensions. Kept intentionally narrow
97
+ * and static so the detector never depends on project-root lookup during a
98
+ * monitor tick — the monitor runs across multiple worktrees and any per-WU
99
+ * config resolution would be a hot-path hazard.
100
+ */
101
+ const DOC_PATH_PREFIXES = ['docs/', 'apps/docs/', 'ai/', '.claude/', 'memory-bank/'];
102
+ function isDocPath(filePath) {
103
+ const normalized = normalisePath(filePath).toLowerCase();
104
+ if (normalized.endsWith('.md') || normalized.endsWith('.mdx')) {
105
+ return true;
106
+ }
107
+ return DOC_PATH_PREFIXES.some((prefix) => normalized.startsWith(prefix));
108
+ }
109
+ function isRuntimeFilePath(filePath) {
110
+ if (isTestFilePath(filePath)) {
111
+ return false;
112
+ }
113
+ // Documentation-only paths (docs/, *.md, etc.) don't count as production code.
114
+ if (isDocPath(filePath)) {
115
+ return false;
116
+ }
117
+ return true;
118
+ }
119
+ /**
120
+ * Pure violation detector. Returns `violator: true` when:
121
+ * - total non-test, non-doc LOC added across runtime commits >= minRuntimeLoc
122
+ * - at least one runtime commit exists
123
+ * - no commit touched a test file
124
+ * - wall-clock time since `claimedAt` exceeds graceMinutes (grace is waived
125
+ * when `claimedAt` is missing; we fall back to "detect on LOC alone").
126
+ */
127
+ export function detectTestsMissingForWorktree(input) {
128
+ const { commits, minRuntimeLoc, graceMinutes, claimedAt, now } = input;
129
+ let productionLoc = 0;
130
+ let firstProductionCommit;
131
+ let sawTestCommit = false;
132
+ for (const commit of commits) {
133
+ const hasTestInCommit = commit.files.some((file) => isTestFilePath(file.path));
134
+ if (hasTestInCommit) {
135
+ sawTestCommit = true;
136
+ }
137
+ const runtimeAdded = commit.files.reduce((sum, file) => (isRuntimeFilePath(file.path) ? sum + file.added : sum), 0);
138
+ if (runtimeAdded > 0 && !firstProductionCommit) {
139
+ firstProductionCommit = { hash: commit.hash, subject: commit.subject };
140
+ }
141
+ productionLoc += runtimeAdded;
142
+ }
143
+ if (sawTestCommit) {
144
+ return { violator: false, productionLoc, withinGrace: false };
145
+ }
146
+ if (productionLoc < minRuntimeLoc || !firstProductionCommit) {
147
+ return { violator: false, productionLoc, withinGrace: false };
148
+ }
149
+ // Respect the grace window: agents routinely land the first prod commit a
150
+ // few minutes after claim; warning during that window is noise.
151
+ const claimedAtMs = claimedAt ? Date.parse(claimedAt) : NaN;
152
+ if (!Number.isNaN(claimedAtMs)) {
153
+ const elapsedMs = now.getTime() - claimedAtMs;
154
+ if (elapsedMs < graceMinutes * MS_PER_MINUTE) {
155
+ return { violator: false, productionLoc, withinGrace: true, firstProductionCommit };
156
+ }
157
+ }
158
+ return { violator: true, productionLoc, withinGrace: false, firstProductionCommit };
159
+ }
160
+ /**
161
+ * Default commit resolver: `git log main..HEAD --numstat`. Matches the
162
+ * invocation wu-prep.ts uses at merge time so the same parsing path applies.
163
+ */
164
+ export function defaultResolveBranchCommitsSync(options) {
165
+ try {
166
+ // `git` is a first-class LumenFlow runtime dependency; other orchestrate
167
+ // modules resolve it from PATH the same way.
168
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
169
+ let baseRef = GIT_REFS.ORIGIN_MAIN;
170
+ try {
171
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
172
+ execFileSync('git', ['rev-parse', '--verify', baseRef], {
173
+ cwd: options.cwd,
174
+ stdio: 'pipe',
175
+ });
176
+ }
177
+ catch {
178
+ baseRef = BRANCHES.MAIN;
179
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
180
+ execFileSync('git', ['rev-parse', '--verify', baseRef], {
181
+ cwd: options.cwd,
182
+ stdio: 'pipe',
183
+ });
184
+ }
185
+ const raw = execFileSync(
186
+ // eslint-disable-next-line sonarjs/no-os-command-from-path
187
+ 'git', [
188
+ 'log',
189
+ `${baseRef}..HEAD`,
190
+ '--reverse',
191
+ '--numstat',
192
+ '--format=__WU_COMMIT__%H%x09%s',
193
+ '--no-merges',
194
+ ], { cwd: options.cwd, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
195
+ return { ok: true, commits: parseBranchCommits(raw) };
196
+ }
197
+ catch (error) {
198
+ return { ok: false, reason: error instanceof Error ? error.message : String(error) };
199
+ }
200
+ }
201
+ /**
202
+ * Parse `git log --numstat --format=__WU_COMMIT__<hash>\t<subject>` output.
203
+ * Binary files report `-` for added/deleted; those contribute 0 LOC.
204
+ */
205
+ export function parseBranchCommits(raw) {
206
+ const commits = [];
207
+ let current = null;
208
+ for (const rawLine of raw.split('\n')) {
209
+ const line = rawLine.trimEnd();
210
+ if (line.startsWith('__WU_COMMIT__')) {
211
+ if (current)
212
+ commits.push(current);
213
+ const header = line.slice('__WU_COMMIT__'.length);
214
+ const tab = header.indexOf('\t');
215
+ const hash = tab === -1 ? header : header.slice(0, tab);
216
+ const subject = tab === -1 ? '' : header.slice(tab + 1);
217
+ current = { hash, subject, files: [] };
218
+ continue;
219
+ }
220
+ if (!current || line.length === 0)
221
+ continue;
222
+ const parts = line.split('\t');
223
+ if (parts.length < 3)
224
+ continue;
225
+ const [addedRaw, deletedRaw, ...pathParts] = parts;
226
+ const filePath = pathParts.join('\t');
227
+ const added = addedRaw === '-' ? 0 : Number.parseInt(addedRaw, 10);
228
+ const deleted = deletedRaw === '-' ? 0 : Number.parseInt(deletedRaw, 10);
229
+ if (Number.isNaN(added) || Number.isNaN(deleted) || !filePath)
230
+ continue;
231
+ current.files.push({ path: filePath, added, deleted });
232
+ }
233
+ if (current)
234
+ commits.push(current);
235
+ return commits;
236
+ }
237
+ function buildSignalMessage(wuId, productionLoc, threshold) {
238
+ return (`quality:tests-missing — ${wuId}: ${productionLoc} runtime LOC committed ` +
239
+ `(threshold ${threshold}) with zero test commits on the lane branch.`);
240
+ }
241
+ /**
242
+ * Run the detector across every active worktree and emit a signal for each
243
+ * violator. Returns the emitted signals so the monitor can surface them in
244
+ * its output; the canonical delivery channel is the appended
245
+ * `.lumenflow/memory/signals.jsonl` line (observable via mem:inbox).
246
+ */
247
+ export async function runQualityDetectionForActiveWorktrees(options) {
248
+ const { baseDir, now, policy, activeWorktrees } = options;
249
+ if (!policy.enabled) {
250
+ return [];
251
+ }
252
+ const resolve = options.resolveBranchCommits ?? defaultResolveBranchCommitsSync;
253
+ const emissions = [];
254
+ for (const wt of activeWorktrees) {
255
+ const cwd = join(baseDir, wt.worktreePath);
256
+ const commitsResult = resolve({ cwd });
257
+ if (!commitsResult.ok) {
258
+ continue; // Silently skip worktrees we can't inspect — not our job to fail the monitor.
259
+ }
260
+ const detection = detectTestsMissingForWorktree({
261
+ commits: commitsResult.commits,
262
+ minRuntimeLoc: policy.min_runtime_loc,
263
+ graceMinutes: policy.grace_minutes,
264
+ claimedAt: wt.claimedAt,
265
+ now,
266
+ });
267
+ if (!detection.violator) {
268
+ continue;
269
+ }
270
+ const message = buildSignalMessage(wt.wuId, detection.productionLoc, policy.min_runtime_loc);
271
+ const { signal } = await createSignal(baseDir, {
272
+ message,
273
+ wuId: wt.wuId,
274
+ lane: wt.lane,
275
+ type: MONITOR_QUALITY_SIGNAL_TYPE,
276
+ sender: 'orchestrate:monitor',
277
+ origin: 'local',
278
+ });
279
+ emissions.push({
280
+ wuId: wt.wuId,
281
+ lane: wt.lane,
282
+ productionLoc: detection.productionLoc,
283
+ firstProductionCommit: detection.firstProductionCommit,
284
+ signal,
285
+ });
286
+ }
287
+ return emissions;
288
+ }
289
+ //# sourceMappingURL=orchestrate-monitor-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrate-monitor-quality.js","sourceRoot":"","sources":["../src/orchestrate-monitor-quality.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,8 @@ import { join } from 'node:path';
27
27
  import { EXIT_CODES, LUMENFLOW_PATHS, DelegationRegistryStore, analyzeDelegations, detectStuckDelegations, checkZombieLocks, generateSuggestions, formatMonitorOutput, formatRecoveryResults, runRecovery, processDelegationFailureSignals, formatSignalHandlerOutput, DEFAULT_THRESHOLD_MINUTES, calculateBackoff, } from '@lumenflow/core';
28
28
  import { ORCHESTRATION_ARTIFACT_DIR, ORCHESTRATION_STATUS_VALUES, } from '@lumenflow/control-plane-sdk';
29
29
  import { DEFAULT_STALL_THRESHOLD_MS, detectContaminatedCodePaths, getMainDirtyPaths, isWorktreeStalled, } from './orchestrate-integrity.js';
30
+ import { MONITOR_QUALITY_SIGNAL_TYPE, readMonitorQualitySignalsConfig, runQualityDetectionForActiveWorktrees, } from './orchestrate-monitor-quality.js';
31
+ import { getConfig } from '@lumenflow/core/config';
30
32
  import { DelegationStatus } from '@lumenflow/core/delegation-registry-schema';
31
33
  import { defaultWorktreeFrom } from '@lumenflow/core/wu-paths';
32
34
  import { loadInitiativeWUs } from '@lumenflow/initiatives';
@@ -395,6 +397,7 @@ export async function loadInitiativeExecutionSummary(baseDir, initiativeId, wus,
395
397
  blockerSignals,
396
398
  contaminatedPaths: contaminatedPaths.length > 0 ? contaminatedPaths : undefined,
397
399
  stalled: stalled ? true : undefined,
400
+ claimedAt: typeof wu.doc.claimed_at === 'string' ? wu.doc.claimed_at : undefined,
398
401
  };
399
402
  });
400
403
  return {
@@ -559,6 +562,13 @@ export async function runMonitor(options = {}) {
559
562
  if (executionEvidence.length > 0) {
560
563
  result.executionEvidence = executionEvidence;
561
564
  }
565
+ // WU-2667: Quality signal — active worktrees with prod commits but zero tests.
566
+ // Non-blocking: appended to MonitorResult so formatOutput can warn, and
567
+ // persisted via mem:signal so orchestrators poll it through mem:inbox.
568
+ const qualitySignals = await collectQualitySignals(baseDir, executionEvidence);
569
+ if (qualitySignals.length > 0) {
570
+ result.qualitySignals = qualitySignals;
571
+ }
562
572
  // Run recovery if requested
563
573
  if (recover) {
564
574
  const recoveryResults = await runRecovery(stuckDelegations, { baseDir, dryRun });
@@ -566,6 +576,59 @@ export async function runMonitor(options = {}) {
566
576
  }
567
577
  return result;
568
578
  }
579
+ /**
580
+ * WU-2667: Derive the list of active worktrees from execution evidence, then
581
+ * call the quality detector. Returns an empty list when the policy is
582
+ * disabled or no active worktrees exist.
583
+ */
584
+ async function collectQualitySignals(baseDir, executionEvidence) {
585
+ const policy = readMonitorQualitySignalsConfig(getConfig());
586
+ if (!policy.enabled) {
587
+ return [];
588
+ }
589
+ const activeWorktrees = collectActiveWorktreesForQualityCheck(executionEvidence);
590
+ if (activeWorktrees.length === 0) {
591
+ return [];
592
+ }
593
+ return runQualityDetectionForActiveWorktrees({
594
+ baseDir,
595
+ now: new Date(),
596
+ policy,
597
+ activeWorktrees,
598
+ });
599
+ }
600
+ function collectActiveWorktreesForQualityCheck(executionEvidence) {
601
+ const seen = new Set();
602
+ const collected = [];
603
+ for (const summary of executionEvidence) {
604
+ for (const wu of summary.wus) {
605
+ if (!wu.worktreePresent || wu.state === EXECUTION_STATES.DONE) {
606
+ continue;
607
+ }
608
+ if (seen.has(wu.wuId)) {
609
+ continue;
610
+ }
611
+ seen.add(wu.wuId);
612
+ const worktreePath = deriveWorktreePathForQualityCheck(wu);
613
+ if (!worktreePath) {
614
+ continue;
615
+ }
616
+ collected.push({
617
+ wuId: wu.wuId,
618
+ lane: wu.lane,
619
+ worktreePath,
620
+ claimedAt: wu.claimedAt ?? wu.delegation?.pickedUpAt ?? wu.latestCheckpointAt,
621
+ });
622
+ }
623
+ }
624
+ return collected;
625
+ }
626
+ function deriveWorktreePathForQualityCheck(wu) {
627
+ if (typeof wu.lane !== 'string' || wu.lane.trim().length === 0) {
628
+ return null;
629
+ }
630
+ return defaultWorktreeFrom({ lane: wu.lane, id: wu.wuId });
631
+ }
569
632
  /**
570
633
  * Formats monitor result for display.
571
634
  *
@@ -586,6 +649,10 @@ export function formatOutput(result) {
586
649
  lines.push('');
587
650
  lines.push(formatExecutionEvidenceSection(result.executionEvidence));
588
651
  }
652
+ if (result.qualitySignals && result.qualitySignals.length > 0) {
653
+ lines.push('');
654
+ lines.push(formatQualitySignalsSection(result.qualitySignals));
655
+ }
589
656
  // Add dry-run notice if applicable
590
657
  if (result.dryRun) {
591
658
  lines.push('');
@@ -594,6 +661,24 @@ export function formatOutput(result) {
594
661
  }
595
662
  return lines.join('\n');
596
663
  }
664
+ /**
665
+ * WU-2667: Format the quality-signal section. Warning class — never fails
666
+ * the monitor exit code. The canonical delivery channel is the mem:inbox
667
+ * signal; this section exists so interactive monitor runs surface the same
668
+ * information without requiring a second `pnpm mem:inbox` call.
669
+ */
670
+ export function formatQualitySignalsSection(signals) {
671
+ const lines = [];
672
+ lines.push(chalk.bold(`Quality Signals (${MONITOR_QUALITY_SIGNAL_TYPE}):`));
673
+ for (const emission of signals) {
674
+ const locLine = `${emission.productionLoc} runtime LOC without tests`;
675
+ lines.push(chalk.yellow(` ⚠ ${emission.wuId} [${emission.lane}]: ${locLine}`));
676
+ if (emission.firstProductionCommit) {
677
+ lines.push(chalk.gray(` first prod commit: ${emission.firstProductionCommit.hash.slice(0, 10)} ${emission.firstProductionCommit.subject}`));
678
+ }
679
+ }
680
+ return lines.join('\n');
681
+ }
597
682
  function parseTimeString(timeStr) {
598
683
  const msValue = ms(timeStr);
599
684
  if (typeof msValue === 'number') {