@chllming/wave-orchestration 0.8.1 → 0.8.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.
- package/CHANGELOG.md +15 -0
- package/README.md +8 -8
- package/docs/plans/current-state.md +1 -1
- package/docs/plans/examples/wave-example-live-proof.md +1 -1
- package/docs/plans/migration.md +3 -3
- package/docs/reference/npmjs-trusted-publishing.md +2 -2
- package/docs/reference/sample-waves.md +4 -4
- package/package.json +1 -1
- package/releases/manifest.json +20 -0
- package/scripts/wave-orchestrator/control-cli.mjs +49 -5
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.8.2 - 2026-03-24
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- Updated the shipped package metadata, release manifest, README, migration guide, sample-wave docs, and npm publishing runbook to advertise `0.8.2` as the current release surface.
|
|
10
|
+
|
|
11
|
+
### Fixed And Hardened
|
|
12
|
+
|
|
13
|
+
- `wave control status` now stops surfacing stale blocking edges after a wave has already reached `phase=completed`.
|
|
14
|
+
- Completed waves now suppress stale `nextTimer` deadlines and preserve successful logical-agent states instead of re-blocking agents from historical open request records.
|
|
15
|
+
|
|
16
|
+
### Testing And Validation
|
|
17
|
+
|
|
18
|
+
- Added regression coverage for completed-wave control-status projections so historical request records stay visible without reopening blocking state after closure.
|
|
19
|
+
|
|
5
20
|
## 0.8.1 - 2026-03-24
|
|
6
21
|
|
|
7
22
|
### Changed
|
package/README.md
CHANGED
|
@@ -79,18 +79,18 @@ Wave is built to mitigate those failures with a canonical authority set, generat
|
|
|
79
79
|
|
|
80
80
|
Current release:
|
|
81
81
|
|
|
82
|
-
- `@chllming/wave-orchestration@0.8.
|
|
83
|
-
- Release tag: [`v0.8.
|
|
82
|
+
- `@chllming/wave-orchestration@0.8.2`
|
|
83
|
+
- Release tag: [`v0.8.2`](https://github.com/chllming/agent-wave-orchestrator/releases/tag/v0.8.2)
|
|
84
84
|
- Public install path: npmjs
|
|
85
85
|
- Authenticated fallback: GitHub Packages
|
|
86
86
|
|
|
87
|
-
Highlights in `0.8.
|
|
87
|
+
Highlights in `0.8.2`:
|
|
88
88
|
|
|
89
|
-
- `
|
|
90
|
-
-
|
|
91
|
-
-
|
|
92
|
-
- The architecture-hardening migration plan, reducer or envelope wiring, and aligned docs or skills from the prior
|
|
93
|
-
- Upgrade and operator docs now cover the full `0.8.
|
|
89
|
+
- `wave control status` now clears stale blocking edges once a wave is already completed instead of replaying historical open request records as live blockers.
|
|
90
|
+
- Completed waves now suppress stale `nextTimer` deadlines and preserve successful logical-agent states in the control-status projection.
|
|
91
|
+
- The helper-assignment policy-closure fixes from `0.8.1` remain intact.
|
|
92
|
+
- The architecture-hardening migration plan, reducer or envelope wiring, and aligned docs or skills from the prior releases remain intact.
|
|
93
|
+
- Upgrade and operator docs now cover the full `0.8.2` package surface end to end.
|
|
94
94
|
|
|
95
95
|
Requirements:
|
|
96
96
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Current State
|
|
2
2
|
|
|
3
|
-
- The starter workspace in this source repo reflects the `0.8.
|
|
3
|
+
- The starter workspace in this source repo reflects the `0.8.2` package release surface.
|
|
4
4
|
- The staged architecture cutover from launcher-centric decisions to reducer and phase-engine ownership is tracked in `docs/plans/architecture-hardening-migration.md`.
|
|
5
5
|
- The repository contains the published `@chllming/wave-orchestration` package plus the starter scaffold used by `wave init`.
|
|
6
6
|
- The runtime is package-first and non-destructive for adopting repos: `wave init --adopt-existing` records existing repo-owned plans, waves, prompts, and config without overwriting them, and `wave upgrade` writes only `.wave/install-state.json` plus `.wave/upgrade-history/`.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This is a showcase-first sample wave.
|
|
4
4
|
|
|
5
|
-
Use it as the single reference example for the current `0.8.
|
|
5
|
+
Use it as the single reference example for the current `0.8.2` Wave surface.
|
|
6
6
|
|
|
7
7
|
It intentionally combines more sections than a normal production wave so one file can demonstrate:
|
|
8
8
|
|
package/docs/plans/migration.md
CHANGED
|
@@ -24,13 +24,13 @@ GitHub Packages remains available as an authenticated fallback path, and maintai
|
|
|
24
24
|
- Fresh `wave init` seeds the starter `skills/` library. `wave init --adopt-existing` records existing repo-owned skill bundles when they are already present, but does not replace or rewrite them.
|
|
25
25
|
- The current runtime expects the post-roadmap model: typed coordination, compiled inboxes, `A8` integration, staged closure, orchestrator-first clarification, and operational runtime policy.
|
|
26
26
|
|
|
27
|
-
## Upgrading From 0.6.x To 0.8.
|
|
27
|
+
## Upgrading From 0.6.x To 0.8.2
|
|
28
28
|
|
|
29
29
|
Read `CHANGELOG.md` first, then treat this section as the repo-owned migration checklist for adopted `0.6.x` workspaces.
|
|
30
30
|
|
|
31
31
|
`wave upgrade` updates the installed runtime only. It does not copy planner starter files into a repo that already owns its docs, skills, and Context7 bundles.
|
|
32
32
|
|
|
33
|
-
`0.8.
|
|
33
|
+
`0.8.2` carries forward the `0.8.1` helper-assignment fixes and hardens the control-status projection layer: completed waves no longer replay stale blocking edges or overdue timers from historical coordination records, and successful logical-agent state stays preserved once the wave is terminal.
|
|
34
34
|
|
|
35
35
|
### Required Repo Changes
|
|
36
36
|
|
|
@@ -42,7 +42,7 @@ If the repo adopted Wave before the planner corpus became a tracked required sur
|
|
|
42
42
|
- `docs/reference/wave-planning-lessons.md`
|
|
43
43
|
- the `planner-agentic` bundle entry in `docs/context7/bundles.json`
|
|
44
44
|
|
|
45
|
-
If the repo copied the shipped starter architecture docs or skills and wants the `0.8.
|
|
45
|
+
If the repo copied the shipped starter architecture docs or skills and wants the `0.8.2` authority-model language, also sync:
|
|
46
46
|
|
|
47
47
|
- `docs/agents/wave-launcher-role.md`
|
|
48
48
|
- `docs/agents/wave-orchestrator-role.md`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This repo now includes a dedicated npmjs publish workflow at [publish-npm.yml](../../.github/workflows/publish-npm.yml).
|
|
4
4
|
|
|
5
|
-
The current `0.8.
|
|
5
|
+
The current `0.8.2` release procedure publishes through a repository Actions secret named `NPM_TOKEN`.
|
|
6
6
|
|
|
7
7
|
## What This Repo Already Does
|
|
8
8
|
|
|
@@ -47,6 +47,6 @@ If this repo later needs private npm dependencies during CI, consider a separate
|
|
|
47
47
|
1. Confirm [publish-npm.yml](../../.github/workflows/publish-npm.yml) is on the default branch.
|
|
48
48
|
2. Confirm `NPM_TOKEN` exists in the GitHub repo secrets.
|
|
49
49
|
3. Confirm the package version has been bumped and committed.
|
|
50
|
-
4. Push the release commit and release tag, for example `v0.8.
|
|
50
|
+
4. Push the release commit and release tag, for example `v0.8.2`.
|
|
51
51
|
5. Verify both `publish-npm.yml` and `publish-package.yml` start from the tag push.
|
|
52
52
|
6. Verify the npmjs publish completes successfully for the tagged source.
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Sample Waves"
|
|
3
|
-
summary: "Showcase-first sample waves that demonstrate the current 0.8.
|
|
3
|
+
summary: "Showcase-first sample waves that demonstrate the current 0.8.2 Wave surface."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Sample Waves
|
|
7
7
|
|
|
8
|
-
This guide points to showcase-first sample waves that demonstrate the current `0.8.
|
|
8
|
+
This guide points to showcase-first sample waves that demonstrate the current `0.8.2` authored Wave surface.
|
|
9
9
|
|
|
10
10
|
The examples are intentionally denser than typical production waves. Their job is to teach the current authoring and runtime surface quickly, not to be the smallest possible launch-ready files.
|
|
11
11
|
|
|
@@ -15,7 +15,7 @@ The examples are intentionally denser than typical production waves. Their job i
|
|
|
15
15
|
Shows what a good `repo-landed` outcome looks like when one promoted component only closes honestly if desired-state records, reconcile-loop substrate, and cluster-view surfaces land together. It emphasizes maturity discipline, explicit deliverables, and shared-plan closure without drifting into `pilot-live` claims.
|
|
16
16
|
|
|
17
17
|
- [Full modern sample wave](../plans/examples/wave-example-live-proof.md)
|
|
18
|
-
Shows the combined `0.8.
|
|
18
|
+
Shows the combined `0.8.2` authored surface in one file: closure roles, `E0`, optional security review, delegated and pinned benchmark targets, richer executor config, `### Skills`, `### Capabilities`, `### Deliverables`, `### Exit contract`, `### Proof artifacts`, sticky retry, deploy environments, and proof-first live-wave structure.
|
|
19
19
|
|
|
20
20
|
## What These Examples Teach
|
|
21
21
|
|
|
@@ -38,7 +38,7 @@ The examples are intentionally denser than typical production waves. Their job i
|
|
|
38
38
|
|
|
39
39
|
## Feature Coverage Map
|
|
40
40
|
|
|
41
|
-
Together these samples cover the main surfaces added or hardened for `0.8.
|
|
41
|
+
Together these samples cover the main surfaces added or hardened for `0.8.2`:
|
|
42
42
|
|
|
43
43
|
- repo-landed maturity discipline and anti-overclaim framing
|
|
44
44
|
- explicit shared-plan closure for future-wave safety
|
package/package.json
CHANGED
package/releases/manifest.json
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"packageName": "@chllming/wave-orchestration",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"version": "0.8.2",
|
|
7
|
+
"date": "2026-03-24",
|
|
8
|
+
"summary": "Completed-wave control-status projection hardening and 0.8.2 release-surface alignment.",
|
|
9
|
+
"features": [
|
|
10
|
+
"`wave control status` now clears stale blocking edges after a wave has already reached `phase=completed`, instead of replaying historical open request records as live blockers.",
|
|
11
|
+
"Completed waves now suppress stale `nextTimer` deadlines in the control-status projection.",
|
|
12
|
+
"Successful logical-agent states are preserved for completed waves instead of being re-blocked by stale coordination history in the control-status surface.",
|
|
13
|
+
"Regression coverage now exercises the completed-wave stale-blocking projection path directly.",
|
|
14
|
+
"Shipped package metadata, README, migration guidance, sample-wave docs, and npm publishing instructions now point at the `0.8.2` release surface."
|
|
15
|
+
],
|
|
16
|
+
"manualSteps": [
|
|
17
|
+
"Run `pnpm exec wave doctor` and `pnpm exec wave launch --lane main --dry-run --no-dashboard` after upgrading so the repo validates against the `0.8.2` runtime and completed-wave control-status contract.",
|
|
18
|
+
"If an adopted repo fails `wave doctor` after the upgrade, sync the repo-owned planner starter surface (`docs/agents/wave-planner-role.md`, `skills/role-planner/`, `docs/context7/planner-agent/`, `docs/reference/wave-planning-lessons.md`, and the `planner-agentic` bundle entry) before relying on planner-aware validation.",
|
|
19
|
+
"If a repo carries custom operator docs for `wave control status`, update that guidance so completed waves are described as terminal projections where historical coordination records may remain visible without reopening blockers.",
|
|
20
|
+
"If an adopted repo copied the starter architecture docs or skill bundles, sync the updated role prompts, `skills/wave-core/`, runtime skills, and closure-role skills so local guidance matches the `0.8.2` authority model and completed-wave control behavior.",
|
|
21
|
+
"Review `docs/plans/architecture-hardening-migration.md` before continuing reducer-authoritative cutover work in repos that extend the shipped starter surface."
|
|
22
|
+
],
|
|
23
|
+
"breaking": false
|
|
24
|
+
},
|
|
5
25
|
{
|
|
6
26
|
"version": "0.8.1",
|
|
7
27
|
"date": "2026-03-24",
|
|
@@ -270,6 +270,10 @@ function assignmentRelevantToAgent(assignment, agentId = "") {
|
|
|
270
270
|
);
|
|
271
271
|
}
|
|
272
272
|
|
|
273
|
+
function isCompletedPhase(phase) {
|
|
274
|
+
return String(phase || "").trim().toLowerCase() === "completed";
|
|
275
|
+
}
|
|
276
|
+
|
|
273
277
|
function buildEffectiveSelection(lanePaths, wave, { activeAttempt = null, rerunRequest = null, relaunchPlan = null } = {}) {
|
|
274
278
|
const activeAttemptSelected = Array.isArray(activeAttempt?.selectedAgentIds)
|
|
275
279
|
? Array.from(new Set(activeAttempt.selectedAgentIds.filter(Boolean)))
|
|
@@ -308,10 +312,20 @@ function buildEffectiveSelection(lanePaths, wave, { activeAttempt = null, rerunR
|
|
|
308
312
|
};
|
|
309
313
|
}
|
|
310
314
|
|
|
311
|
-
function buildLogicalAgents({
|
|
315
|
+
function buildLogicalAgents({
|
|
316
|
+
lanePaths,
|
|
317
|
+
wave,
|
|
318
|
+
tasks,
|
|
319
|
+
dependencySnapshot,
|
|
320
|
+
capabilityAssignments,
|
|
321
|
+
selection,
|
|
322
|
+
proofRegistry,
|
|
323
|
+
phase,
|
|
324
|
+
}) {
|
|
312
325
|
const selectedAgentIds = new Set(selection?.selectedAgentIds || []);
|
|
313
326
|
const helperAssignments = Array.isArray(capabilityAssignments) ? capabilityAssignments : [];
|
|
314
327
|
const openInbound = dependencySnapshot?.openInbound || [];
|
|
328
|
+
const completedPhase = isCompletedPhase(phase);
|
|
315
329
|
return wave.agents.map((agent) => {
|
|
316
330
|
const statusPath = statusPathForAgent(lanePaths, wave, agent);
|
|
317
331
|
const statusRecord = readStatusRecordIfPresent(statusPath);
|
|
@@ -343,6 +357,11 @@ function buildLogicalAgents({ lanePaths, wave, tasks, dependencySnapshot, capabi
|
|
|
343
357
|
(assignment) => assignment.blocking && assignment.assignedAgentId === agent.agentId,
|
|
344
358
|
);
|
|
345
359
|
const dependency = openInbound.find((record) => record.assignedAgentId === agent.agentId);
|
|
360
|
+
const satisfiedByStatus =
|
|
361
|
+
statusRecord?.code === 0 &&
|
|
362
|
+
(proofValidation.ok ||
|
|
363
|
+
isSecurityReviewAgent(agent) ||
|
|
364
|
+
isContEvalReportOnlyAgent(agent, { contEvalAgentId: lanePaths.contEvalAgentId }));
|
|
346
365
|
let state = "planned";
|
|
347
366
|
let reason = "";
|
|
348
367
|
if (selection?.source === "active-attempt" && selectedAgentIds.has(agent.agentId)) {
|
|
@@ -354,6 +373,16 @@ function buildLogicalAgents({ lanePaths, wave, tasks, dependencySnapshot, capabi
|
|
|
354
373
|
selection?.source === "relaunch-plan"
|
|
355
374
|
? "Selected by the persisted relaunch plan."
|
|
356
375
|
: "Selected by active rerun request.";
|
|
376
|
+
} else if (completedPhase && satisfiedByStatus) {
|
|
377
|
+
state = [
|
|
378
|
+
lanePaths.contEvalAgentId || "E0",
|
|
379
|
+
lanePaths.integrationAgentId || "A8",
|
|
380
|
+
lanePaths.documentationAgentId || "A9",
|
|
381
|
+
lanePaths.contQaAgentId || "A0",
|
|
382
|
+
].includes(agent.agentId) || isSecurityReviewAgent(agent)
|
|
383
|
+
? "closed"
|
|
384
|
+
: "satisfied";
|
|
385
|
+
reason = "Completed wave preserves the latest satisfied agent state.";
|
|
357
386
|
} else if (targetedBlockingTasks.some((task) => task.state === "working")) {
|
|
358
387
|
state = "working";
|
|
359
388
|
reason = targetedBlockingTasks.find((task) => task.state === "working")?.title || "";
|
|
@@ -365,7 +394,7 @@ function buildLogicalAgents({ lanePaths, wave, tasks, dependencySnapshot, capabi
|
|
|
365
394
|
helperAssignment?.summary ||
|
|
366
395
|
dependency?.summary ||
|
|
367
396
|
"";
|
|
368
|
-
} else if (
|
|
397
|
+
} else if (satisfiedByStatus) {
|
|
369
398
|
state = [
|
|
370
399
|
lanePaths.contEvalAgentId || "E0",
|
|
371
400
|
lanePaths.integrationAgentId || "A8",
|
|
@@ -401,7 +430,19 @@ function selectionTargetsAgent(agentId, selectionSet) {
|
|
|
401
430
|
return Boolean(agentId) && selectionSet.has(agentId);
|
|
402
431
|
}
|
|
403
432
|
|
|
404
|
-
function buildBlockingEdge({
|
|
433
|
+
function buildBlockingEdge({
|
|
434
|
+
tasks,
|
|
435
|
+
capabilityAssignments,
|
|
436
|
+
dependencySnapshot,
|
|
437
|
+
activeAttempt,
|
|
438
|
+
rerunRequest,
|
|
439
|
+
relaunchPlan,
|
|
440
|
+
agentId = "",
|
|
441
|
+
phase,
|
|
442
|
+
}) {
|
|
443
|
+
if (isCompletedPhase(phase)) {
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
405
446
|
const attemptSelection = new Set(activeAttempt?.selectedAgentIds || []);
|
|
406
447
|
const scopeToActiveAttempt = !agentId && attemptSelection.size > 0;
|
|
407
448
|
const scopedTasks = (agentId
|
|
@@ -546,6 +587,7 @@ export function buildControlStatusPayload({ lanePaths, wave, agentId = "" }) {
|
|
|
546
587
|
const logPath = coordinationLogPath(lanePaths, wave.wave);
|
|
547
588
|
const coordinationState = readMaterializedCoordinationState(logPath);
|
|
548
589
|
const ledger = readWaveLedger(ledgerPath(lanePaths, wave.wave)) || { phase: "planned" };
|
|
590
|
+
const phase = ledger.phase || "unknown";
|
|
549
591
|
const capabilityAssignments = buildRequestAssignments({
|
|
550
592
|
coordinationState,
|
|
551
593
|
agents: wave.agents,
|
|
@@ -596,7 +638,7 @@ export function buildControlStatusPayload({ lanePaths, wave, agentId = "" }) {
|
|
|
596
638
|
return {
|
|
597
639
|
lane: lanePaths.lane,
|
|
598
640
|
wave: wave.wave,
|
|
599
|
-
phase
|
|
641
|
+
phase,
|
|
600
642
|
agentId: agentId || null,
|
|
601
643
|
blockingEdge: buildBlockingEdge({
|
|
602
644
|
tasks,
|
|
@@ -606,6 +648,7 @@ export function buildControlStatusPayload({ lanePaths, wave, agentId = "" }) {
|
|
|
606
648
|
rerunRequest,
|
|
607
649
|
relaunchPlan,
|
|
608
650
|
agentId,
|
|
651
|
+
phase,
|
|
609
652
|
}),
|
|
610
653
|
logicalAgents: buildLogicalAgents({
|
|
611
654
|
lanePaths,
|
|
@@ -615,6 +658,7 @@ export function buildControlStatusPayload({ lanePaths, wave, agentId = "" }) {
|
|
|
615
658
|
capabilityAssignments,
|
|
616
659
|
selection,
|
|
617
660
|
proofRegistry,
|
|
661
|
+
phase,
|
|
618
662
|
}).filter((agent) => !agentId || agent.agentId === agentId),
|
|
619
663
|
tasks,
|
|
620
664
|
helperAssignments: (capabilityAssignments || []).filter(
|
|
@@ -634,7 +678,7 @@ export function buildControlStatusPayload({ lanePaths, wave, agentId = "" }) {
|
|
|
634
678
|
selectionSource: selection.source,
|
|
635
679
|
rerunRequest,
|
|
636
680
|
relaunchPlan,
|
|
637
|
-
nextTimer: nextTaskDeadline(tasks),
|
|
681
|
+
nextTimer: isCompletedPhase(phase) ? null : nextTaskDeadline(tasks),
|
|
638
682
|
activeAttempt: controlState.activeAttempt,
|
|
639
683
|
};
|
|
640
684
|
}
|