@deksden-com/dd-flow-cli 0.9.0-beta.89 → 0.9.0-beta.90
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 +10 -0
- package/dist/build-info.json +3 -3
- package/dist/services/controller-fanout.js +19 -5
- package/dist/services/run-controller.js +1 -1
- package/package.json +17 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @deksden-com/dd-flow-cli
|
|
2
2
|
|
|
3
|
+
## 0.9.0-beta.90
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 18e2627: Require settled fan-out stages to complete their semantic decision and invoke
|
|
8
|
+
the authoritative finish command before assuming a repair exists. Report the
|
|
9
|
+
controller action that failed to make progress, and hand off repair Work only
|
|
10
|
+
after an actual lifecycle response registers it.
|
|
11
|
+
- 954c676: Publish the exact CI-tested tarball through a credential-isolated release job, with deterministic test shards, package smoke, trusted candidate receipts, and safe lost-reply recovery.
|
|
12
|
+
|
|
3
13
|
## 0.9.0-beta.89
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
package/dist/build-info.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cli_package": "@deksden-com/dd-flow-cli",
|
|
3
|
-
"cli_version": "0.9.0-beta.
|
|
4
|
-
"cli_commit": "
|
|
5
|
-
"built_at": "2026-09-
|
|
3
|
+
"cli_version": "0.9.0-beta.90",
|
|
4
|
+
"cli_commit": "a4e9733f871af5032fc372d324d8fd0dfd2ec44f",
|
|
5
|
+
"built_at": "2026-09-21T11:54:11.387Z",
|
|
6
6
|
"built_with_canon": {
|
|
7
7
|
"version": "4.1.1",
|
|
8
8
|
"commit": "d1a6081ab15ab92ac917ff5d037121a40c709db1",
|
|
@@ -4,6 +4,20 @@ import { getFlowRunVariables } from "./runs.js";
|
|
|
4
4
|
import { dispatchVnextPlanReview } from "./vnext-plan-review.js";
|
|
5
5
|
import { resolveExecutionPolicy } from "./execution-policy.js";
|
|
6
6
|
import { renderDelegationInstructions } from "../harness-runtime/lib/delegation-instructions.mjs";
|
|
7
|
+
function semanticCompletionPrompt(stage, completed) {
|
|
8
|
+
const task = stage === "plan-review"
|
|
9
|
+
? "Classify the reviewer findings, apply every accepted correction in the current PLAN-REVIEW Work, and write the authoritative review decision."
|
|
10
|
+
: stage === "code-review"
|
|
11
|
+
? "Classify the review findings and write or retain the authoritative review decision."
|
|
12
|
+
: "Integrate the accepted child results and update the Stage's authoritative verification evidence.";
|
|
13
|
+
return [
|
|
14
|
+
`All declared ${stage} child Work has settled (${completed} completed).`,
|
|
15
|
+
task,
|
|
16
|
+
"Then invoke the exact Stage finish command from the original authoritative packet.",
|
|
17
|
+
"Only if that command actually returns continuation.kind = repair_required has repair Work been registered; in that case end this Turn immediately so the controller can dispatch it. Otherwise follow the command's actual result.",
|
|
18
|
+
"Do not create speculative repair Work or start a successor Stage."
|
|
19
|
+
].join(" ");
|
|
20
|
+
}
|
|
7
21
|
/** Stage entry acknowledges the packet before the controller issues child commands. */
|
|
8
22
|
export function controllerStageEntryPrompt(stage, command) {
|
|
9
23
|
return [
|
|
@@ -45,11 +59,11 @@ export async function nextControllerFanout(context, input) {
|
|
|
45
59
|
if (fanout.state === "dispatch_required" || fanout.state === "capacity_required")
|
|
46
60
|
return { kind: "wait", reason: "qualified_capacity_required" };
|
|
47
61
|
}
|
|
48
|
-
const prompt = (text) => ({ kind: "prompt", prompt: text, fingerprint: JSON.stringify({ stage: input.stage, parent: fanout.parent_work_id, state: fanout.state, graph: fanout.graph_revision }) });
|
|
62
|
+
const prompt = (action, text) => ({ kind: "prompt", action, prompt: text, fingerprint: JSON.stringify({ stage: input.stage, parent: fanout.parent_work_id, state: fanout.state, graph: fanout.graph_revision }) });
|
|
49
63
|
if (fanout.state === "coordinator_required")
|
|
50
|
-
return prompt(`Continue the current ${input.stage} Stage using its authoritative packet. Materialize only its required Work graph with real dependencies. Do not launch children, finish the Stage, or start a successor. Return after registering the graph; the runtime will dispatch its ready Work.`);
|
|
64
|
+
return prompt("materialize_graph", `Continue the current ${input.stage} Stage using its authoritative packet. Materialize only its required Work graph with real dependencies. Do not launch children, finish the Stage, or start a successor. Return after registering the graph; the runtime will dispatch its ready Work.`);
|
|
51
65
|
if (fanout.works.failed || fanout.works.cancelled)
|
|
52
|
-
return prompt(`Some ${input.stage} child Work failed or was cancelled. Inspect its recorded receipts. Choose a legal scoped repair/retry or block the Stage with the concrete reason. Do not relaunch settled siblings or infer success from a child that omitted work finish.`);
|
|
66
|
+
return prompt("repair_or_block", `Some ${input.stage} child Work failed or was cancelled. Inspect its recorded receipts. Choose a legal scoped repair/retry or block the Stage with the concrete reason. Do not relaunch settled siblings or infer success from a child that omitted work finish.`);
|
|
53
67
|
if (fanout.works.ready.length) {
|
|
54
68
|
const choices = fanout.works.ready.map(work => {
|
|
55
69
|
const payload = context.db.get("SELECT payload_json FROM works WHERE work_id = ?", [work.work_id])?.payload_json;
|
|
@@ -69,13 +83,13 @@ export async function nextControllerFanout(context, input) {
|
|
|
69
83
|
for (const work of wave)
|
|
70
84
|
if (!work.work_id || !work.start_command)
|
|
71
85
|
throw new AppError("fanout_contract_invalid", "Ready Work omits its trusted start command", 1);
|
|
72
|
-
return prompt(renderDelegationInstructions({ harness: input.harness, stage: input.stage, capacity, works: wave }));
|
|
86
|
+
return prompt("dispatch_work", renderDelegationInstructions({ harness: input.harness, stage: input.stage, capacity, works: wave }));
|
|
73
87
|
}
|
|
74
88
|
if (fanout.works.running)
|
|
75
89
|
return { kind: "wait", reason: "work_receipts_pending" };
|
|
76
90
|
if (fanout.works.created)
|
|
77
91
|
throw new AppError("fanout_graph_stalled", "Created Work has no ready or running dependency path", 1);
|
|
78
|
-
return prompt(
|
|
92
|
+
return prompt("semantic_completion", semanticCompletionPrompt(input.stage, fanout.works.completed));
|
|
79
93
|
}
|
|
80
94
|
/** Normalize provider-observed topology only; never parse assistant prose. */
|
|
81
95
|
export function controllerNativeChildren(receipt, rootSessionId) {
|
|
@@ -753,7 +753,7 @@ async function executeController(context, row, manifest, state, assertOwnership,
|
|
|
753
753
|
}
|
|
754
754
|
if (state.last_continuation === fanout.fingerprint)
|
|
755
755
|
assertNoCorrelatedRejection(context, { projectId: row.project_id, runId: row.run_id, generation: row.generation, stage: next.stage, turn: state.turns });
|
|
756
|
-
retainControllerContinuation(state, fanout.fingerprint, { code: "fanout_stage_nonprogressing", message: "The coordinator repeated an unchanged Work-graph continuation", details: { stage: next.stage, before: state.last_continuation, after: fanout.fingerprint, controller_turn: state.turns } });
|
|
756
|
+
retainControllerContinuation(state, fanout.fingerprint, { code: "fanout_stage_nonprogressing", message: "The coordinator repeated an unchanged Work-graph continuation", details: { stage: next.stage, action: fanout.action, before: state.last_continuation, after: fanout.fingerprint, controller_turn: state.turns } });
|
|
757
757
|
saveState(context, row, state);
|
|
758
758
|
await prompt(session, fanout.prompt);
|
|
759
759
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@deksden-com/dd-flow-cli",
|
|
3
|
-
"version": "0.9.0-beta.
|
|
3
|
+
"version": "0.9.0-beta.90",
|
|
4
4
|
"description": "Mechanical runtime CLI for dd-flow workflows.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -22,6 +22,20 @@
|
|
|
22
22
|
"node": ">=26.0.0",
|
|
23
23
|
"pnpm": ">=10.0.0"
|
|
24
24
|
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsc -p tsconfig.build.json && node scripts/generate-build-info.mjs && node scripts/copy-assets.mjs",
|
|
27
|
+
"typecheck": "tsc --noEmit",
|
|
28
|
+
"lint": "eslint . --max-warnings=0",
|
|
29
|
+
"test": "pnpm test:release && pnpm test:integration && pnpm test:runtime-sensitive",
|
|
30
|
+
"test:release": "node --test scripts/verify-release-build.test.mjs && vitest run --pool=forks --no-file-parallelism test/publish-release.test.ts",
|
|
31
|
+
"test:integration": "vitest run --pool=forks --no-file-parallelism --exclude test/publish-release.test.ts --exclude test/run-control-worker.test.ts --exclude test/native-adapter-contracts.test.ts",
|
|
32
|
+
"test:runtime-sensitive": "vitest run --pool=forks --no-file-parallelism test/run-control-worker.test.ts test/native-adapter-contracts.test.ts",
|
|
33
|
+
"changeset": "changeset",
|
|
34
|
+
"version-packages": "changeset version",
|
|
35
|
+
"release:candidate:pack": "node scripts/release-candidate.mjs pack",
|
|
36
|
+
"release:candidate:accept": "node scripts/release-candidate.mjs accept",
|
|
37
|
+
"release:publish": "node scripts/publish-release.mjs"
|
|
38
|
+
},
|
|
25
39
|
"devDependencies": {
|
|
26
40
|
"@changesets/cli": "^2.31.0",
|
|
27
41
|
"@eslint/js": "^9.39.1",
|
|
@@ -40,15 +54,5 @@
|
|
|
40
54
|
"publishConfig": {
|
|
41
55
|
"access": "public"
|
|
42
56
|
},
|
|
43
|
-
"license": "MIT"
|
|
44
|
-
|
|
45
|
-
"build": "tsc -p tsconfig.build.json && node scripts/generate-build-info.mjs && node scripts/copy-assets.mjs",
|
|
46
|
-
"typecheck": "tsc --noEmit",
|
|
47
|
-
"lint": "eslint . --max-warnings=0",
|
|
48
|
-
"test": "vitest run --pool=forks --no-file-parallelism",
|
|
49
|
-
"changeset": "changeset",
|
|
50
|
-
"version-packages": "changeset version",
|
|
51
|
-
"release": "pnpm run build && changeset publish",
|
|
52
|
-
"release:publish": "node scripts/publish-release.mjs"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
57
|
+
"license": "MIT"
|
|
58
|
+
}
|