@chllming/wave-orchestration 0.9.10 → 0.9.12

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 (42) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +7 -8
  3. package/docs/README.md +4 -10
  4. package/docs/architecture/README.md +12 -4
  5. package/docs/concepts/operating-modes.md +1 -1
  6. package/docs/guides/author-and-run-waves.md +3 -2
  7. package/docs/guides/planner.md +3 -3
  8. package/docs/guides/recommendations-0.9.11.md +44 -0
  9. package/docs/guides/recommendations-0.9.12.md +49 -0
  10. package/docs/guides/sandboxed-environments.md +2 -2
  11. package/docs/guides/terminal-surfaces.md +1 -1
  12. package/docs/plans/current-state.md +3 -3
  13. package/docs/plans/end-state-architecture.md +1 -1
  14. package/docs/plans/examples/wave-example-design-handoff.md +1 -1
  15. package/docs/plans/examples/wave-example-live-proof.md +1 -1
  16. package/docs/plans/migration.md +32 -28
  17. package/docs/plans/wave-orchestrator.md +1 -1
  18. package/docs/reference/cli-reference.md +2 -2
  19. package/docs/reference/coordination-and-closure.md +1 -1
  20. package/docs/reference/npmjs-token-publishing.md +2 -2
  21. package/docs/reference/package-publishing-flow.md +12 -12
  22. package/docs/reference/runtime-config/README.md +2 -2
  23. package/docs/reference/sample-waves.md +5 -5
  24. package/docs/reference/skills.md +1 -1
  25. package/docs/reference/wave-control.md +3 -1
  26. package/docs/roadmap.md +3 -3
  27. package/package.json +1 -1
  28. package/releases/manifest.json +32 -0
  29. package/scripts/wave-orchestrator/agent-state.mjs +3 -1
  30. package/scripts/wave-orchestrator/autonomous.mjs +2 -2
  31. package/scripts/wave-orchestrator/closure-engine.mjs +103 -6
  32. package/scripts/wave-orchestrator/closure-policy.mjs +319 -0
  33. package/scripts/wave-orchestrator/config.mjs +15 -0
  34. package/scripts/wave-orchestrator/derived-state-engine.mjs +52 -4
  35. package/scripts/wave-orchestrator/gate-engine.mjs +72 -4
  36. package/scripts/wave-orchestrator/install.mjs +1 -1
  37. package/scripts/wave-orchestrator/launcher.mjs +14 -4
  38. package/scripts/wave-orchestrator/planner.mjs +4 -3
  39. package/scripts/wave-orchestrator/shared.mjs +11 -12
  40. package/scripts/wave-orchestrator/swe-bench-pro-task.mjs +1 -1
  41. package/scripts/wave-orchestrator/traces.mjs +22 -1
  42. package/wave.config.json +13 -2
@@ -277,6 +277,8 @@ export function buildLanePaths(laneInput = DEFAULT_WAVE_LANE, options = {}) {
277
277
  laneProfile.validation.requireComponentPromotionsFromWave,
278
278
  requireAgentComponentsFromWave: laneProfile.validation.requireAgentComponentsFromWave,
279
279
  gateModeThresholds: laneProfile.validation.gateModeThresholds,
280
+ closureModeThresholds: laneProfile.validation.closureModeThresholds,
281
+ autoClosure: laneProfile.validation.autoClosure,
280
282
  executors: laneProfile.executors,
281
283
  skills: laneProfile.skills,
282
284
  capabilityRouting: laneProfile.capabilityRouting,
@@ -428,9 +430,6 @@ export function normalizeWaveVerdict(verdict) {
428
430
  const normalized = String(verdict || "")
429
431
  .trim()
430
432
  .toLowerCase();
431
- if (normalized === "hold") {
432
- return "concerns";
433
- }
434
433
  if (normalized === "fail") {
435
434
  return "blocked";
436
435
  }
@@ -443,16 +442,16 @@ export function parseVerdictFromText(text, regex) {
443
442
  }
444
443
  regex.lastIndex = 0;
445
444
  let match = regex.exec(text);
446
- let verdict = null;
447
- let detail = "";
448
- while (match !== null) {
449
- verdict = normalizeWaveVerdict(match[1]);
450
- detail = String(match[2] || "")
451
- .trim()
452
- .replace(/^detail=/i, "")
453
- .trim();
454
- match = regex.exec(text);
445
+ if (!match) {
446
+ return { verdict: null, detail: "" };
455
447
  }
448
+ // Use the first match — in append-only reports the latest verdict is written
449
+ // at the top of the newest section, while stale entries linger at the bottom.
450
+ const verdict = normalizeWaveVerdict(match[1]);
451
+ const detail = String(match[2] || "")
452
+ .trim()
453
+ .replace(/^detail=/i, "")
454
+ .trim();
456
455
  return { verdict, detail };
457
456
  }
458
457
 
@@ -796,7 +796,7 @@ function buildFullWaveSolve(row, taskWorkspace, options) {
796
796
  });
797
797
  assertSuccess(doctor, "wave doctor");
798
798
  const launch = runShellCommand(
799
- `node ${shellQuote(WAVE_ENTRY)} launch --lane main --start-wave 1 --end-wave 1 --no-dashboard --terminal-surface tmux`,
799
+ `node ${shellQuote(WAVE_ENTRY)} launch --lane main --start-wave 1 --end-wave 1 --no-dashboard`,
800
800
  {
801
801
  cwd: taskWorkspace.repoDir,
802
802
  timeoutMs: options.maxWallClockMinutes * 60 * 1000,
@@ -623,6 +623,7 @@ export function normalizeGateSnapshotForBundle(gateSnapshot, agentArtifacts) {
623
623
  return gateSnapshot;
624
624
  }
625
625
  const normalized = { ...gateSnapshot };
626
+ const overallGate = String(gateSnapshot.overall?.gate || "").trim();
626
627
  for (const key of [
627
628
  "implementationGate",
628
629
  "componentGate",
@@ -638,7 +639,27 @@ export function normalizeGateSnapshotForBundle(gateSnapshot, agentArtifacts) {
638
639
  "evaluatorGate",
639
640
  "infraGate",
640
641
  ]) {
641
- normalized[key] = normalizeGateLogPath(gateSnapshot[key], agentArtifacts);
642
+ const nextValue = normalizeGateLogPath(gateSnapshot[key], agentArtifacts);
643
+ if (key === "documentationGate") {
644
+ normalized[key] =
645
+ overallGate === "documentationGate" && nextValue
646
+ ? {
647
+ ok: Boolean(nextValue.ok),
648
+ statusCode: nextValue.statusCode || null,
649
+ }
650
+ : null;
651
+ continue;
652
+ }
653
+ if (key === "integrationGate" || key === "integrationBarrier") {
654
+ normalized[key] = nextValue
655
+ ? {
656
+ ok: Boolean(nextValue.ok),
657
+ statusCode: nextValue.statusCode || null,
658
+ }
659
+ : null;
660
+ continue;
661
+ }
662
+ normalized[key] = nextValue;
642
663
  }
643
664
  return normalized;
644
665
  }
package/wave.config.json CHANGED
@@ -276,7 +276,18 @@
276
276
  "requireExitContractsFromWave": 6,
277
277
  "requireIntegrationStewardFromWave": 0,
278
278
  "requireComponentPromotionsFromWave": 0,
279
- "requireAgentComponentsFromWave": 0
279
+ "requireAgentComponentsFromWave": 0,
280
+ "closureModeThresholds": {
281
+ "bootstrap": 0,
282
+ "standard": 4,
283
+ "strict": 10
284
+ },
285
+ "autoClosure": {
286
+ "allowInferredIntegration": true,
287
+ "allowAutoDocNoChange": true,
288
+ "allowAutoDocProjection": false,
289
+ "allowSkipContQaInBootstrap": true
290
+ }
280
291
  },
281
292
  "capabilityRouting": {
282
293
  "preferredAgents": {}
@@ -309,4 +320,4 @@
309
320
  }
310
321
  }
311
322
  }
312
- }
323
+ }