@revisium/orchestrator 0.1.0-alpha.1 → 0.1.0-alpha.3
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/control-plane/bootstrap.config.json +47 -2
- package/control-plane/default-playbook/catalog/pipelines.json +329 -0
- package/control-plane/default-playbook/catalog/roles.json +56 -0
- package/control-plane/default-playbook/package.json +5 -0
- package/control-plane/default-playbook/playbook.json +13 -0
- package/control-plane/default-playbook/prompts/analyst.md +27 -0
- package/control-plane/default-playbook/prompts/developer.md +25 -0
- package/control-plane/default-playbook/prompts/integrator.md +20 -0
- package/control-plane/default-playbook/prompts/orchestrator.md +23 -0
- package/control-plane/default-playbook/prompts/reviewer.md +27 -0
- package/control-plane/default-playbook/prompts/watcher.md +24 -0
- package/dist/cli/commands/bootstrap.js +68 -7
- package/dist/cli/commands/bootstrap.js.map +1 -1
- package/dist/cli/commands/run.js +76 -49
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/needs-host.js +7 -8
- package/dist/cli/needs-host.js.map +1 -1
- package/dist/cli/program.js +0 -2
- package/dist/cli/program.js.map +1 -1
- package/dist/config.js +18 -1
- package/dist/config.js.map +1 -1
- package/dist/control-plane/client-transport.js +73 -40
- package/dist/control-plane/client-transport.js.map +1 -1
- package/dist/control-plane/data-access.js +3 -2
- package/dist/control-plane/data-access.js.map +1 -1
- package/dist/control-plane/definitions.js +1 -1
- package/dist/control-plane/definitions.js.map +1 -1
- package/dist/control-plane/json-fields.js +1 -0
- package/dist/control-plane/json-fields.js.map +1 -1
- package/dist/control-plane/schema-migration.js +79 -0
- package/dist/control-plane/schema-migration.js.map +1 -0
- package/dist/control-plane/seed-default-playbook.js +71 -0
- package/dist/control-plane/seed-default-playbook.js.map +1 -0
- package/dist/e2e/kit/agents.js +113 -0
- package/dist/e2e/kit/agents.js.map +1 -0
- package/dist/e2e/kit/assertions.js +119 -0
- package/dist/e2e/kit/assertions.js.map +1 -0
- package/dist/e2e/kit/crash.js +44 -0
- package/dist/e2e/kit/crash.js.map +1 -0
- package/dist/e2e/kit/drive.js +49 -0
- package/dist/e2e/kit/drive.js.map +1 -0
- package/dist/e2e/kit/env.js +16 -0
- package/dist/e2e/kit/env.js.map +1 -0
- package/dist/e2e/kit/fake-integrator.js +42 -0
- package/dist/e2e/kit/fake-integrator.js.map +1 -0
- package/dist/e2e/kit/gh-emulator.js +49 -0
- package/dist/e2e/kit/gh-emulator.js.map +1 -0
- package/dist/e2e/kit/git-target-repo.js +83 -0
- package/dist/e2e/kit/git-target-repo.js.map +1 -0
- package/dist/e2e/kit/harness.js +59 -0
- package/dist/e2e/kit/harness.js.map +1 -0
- package/dist/e2e/kit/index.js +14 -0
- package/dist/e2e/kit/index.js.map +1 -0
- package/dist/e2e/kit/mcp.js +32 -0
- package/dist/e2e/kit/mcp.js.map +1 -0
- package/dist/e2e/kit/scenarios.js +196 -0
- package/dist/e2e/kit/scenarios.js.map +1 -0
- package/dist/e2e/recovery-crash-child.js +29 -0
- package/dist/e2e/recovery-crash-child.js.map +1 -0
- package/dist/e2e/recovery-dd-crash-child.js +42 -0
- package/dist/e2e/recovery-dd-crash-child.js.map +1 -0
- package/dist/engine/ensure-postgres.js +13 -1
- package/dist/engine/ensure-postgres.js.map +1 -1
- package/dist/mcp/mcp-capabilities.js +1 -0
- package/dist/mcp/mcp-capabilities.js.map +1 -1
- package/dist/mcp/mcp-facade.service.js +24 -3
- package/dist/mcp/mcp-facade.service.js.map +1 -1
- package/dist/mcp/mcp-tools.js +16 -7
- package/dist/mcp/mcp-tools.js.map +1 -1
- package/dist/pipeline/data-driven-task.workflow.js +403 -0
- package/dist/pipeline/data-driven-task.workflow.js.map +1 -0
- package/dist/pipeline/data-driven-template.js +57 -0
- package/dist/pipeline/data-driven-template.js.map +1 -0
- package/dist/pipeline/develop-task.workflow.js +150 -308
- package/dist/pipeline/develop-task.workflow.js.map +1 -1
- package/dist/pipeline/pipeline.module.js +1 -1
- package/dist/pipeline/route-contract.js +82 -0
- package/dist/pipeline/route-contract.js.map +1 -0
- package/dist/pipeline-core/index.js +16 -0
- package/dist/pipeline-core/index.js.map +1 -0
- package/dist/pipeline-core/interpret.js +351 -0
- package/dist/pipeline-core/interpret.js.map +1 -0
- package/dist/pipeline-core/kit/assertions.js +61 -0
- package/dist/pipeline-core/kit/assertions.js.map +1 -0
- package/dist/pipeline-core/kit/builders.js +134 -0
- package/dist/pipeline-core/kit/builders.js.map +1 -0
- package/dist/pipeline-core/kit/drive.js +96 -0
- package/dist/pipeline-core/kit/drive.js.map +1 -0
- package/dist/pipeline-core/kit/fixtures.js +248 -0
- package/dist/pipeline-core/kit/fixtures.js.map +1 -0
- package/dist/pipeline-core/kit/index.js +13 -0
- package/dist/pipeline-core/kit/index.js.map +1 -0
- package/dist/pipeline-core/types.js +124 -0
- package/dist/pipeline-core/types.js.map +1 -0
- package/dist/pipeline-core/validate.js +1032 -0
- package/dist/pipeline-core/validate.js.map +1 -0
- package/dist/playbook/catalog-loader.js +14 -1
- package/dist/playbook/catalog-loader.js.map +1 -1
- package/dist/playbook/import-mapper.js +14 -38
- package/dist/playbook/import-mapper.js.map +1 -1
- package/dist/playbook/manifest.js +1 -1
- package/dist/revisium/playbooks.service.js +95 -17
- package/dist/revisium/playbooks.service.js.map +1 -1
- package/dist/revisium/roles.service.js +1 -1
- package/dist/revisium/roles.service.js.map +1 -1
- package/dist/revisium/run.service.js +16 -0
- package/dist/revisium/run.service.js.map +1 -1
- package/dist/run/append-event.js +24 -1
- package/dist/run/append-event.js.map +1 -1
- package/dist/run/block-run.js +17 -0
- package/dist/run/block-run.js.map +1 -0
- package/dist/run/complete-run.js +18 -0
- package/dist/run/complete-run.js.map +1 -0
- package/dist/run/create-run.js +28 -5
- package/dist/run/create-run.js.map +1 -1
- package/dist/run/inspect-run.js +9 -0
- package/dist/run/inspect-run.js.map +1 -1
- package/dist/run/terminal-run-status.js +89 -7
- package/dist/run/terminal-run-status.js.map +1 -1
- package/dist/runners/claude-code.service.js +4 -0
- package/dist/runners/claude-code.service.js.map +1 -1
- package/dist/runners/integrator.js +25 -9
- package/dist/runners/integrator.js.map +1 -1
- package/dist/task-control-plane/task-control-plane-api.service.js +247 -19
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
- package/dist/worker/artifact-store.js +111 -0
- package/dist/worker/artifact-store.js.map +1 -0
- package/dist/worker/claude-code-runner.js +44 -5
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/process-executor.js +23 -2
- package/dist/worker/process-executor.js.map +1 -1
- package/dist/worker/runner-dispatch.js +1 -0
- package/dist/worker/runner-dispatch.js.map +1 -1
- package/dist/worker/runner.js +11 -1
- package/dist/worker/runner.js.map +1 -1
- package/dist/worker/stub-runner.js +7 -45
- package/dist/worker/stub-runner.js.map +1 -1
- package/package.json +3 -1
- package/dist/cli/commands/work.js +0 -149
- package/dist/cli/commands/work.js.map +0 -1
- package/dist/worker/git-worktree-manager.js +0 -84
- package/dist/worker/git-worktree-manager.js.map +0 -1
- package/dist/worker/loop.js +0 -122
- package/dist/worker/loop.js.map +0 -1
- package/dist/worker/script-runner.js +0 -28
- package/dist/worker/script-runner.js.map +0 -1
- package/dist/worker/worker-id.js +0 -18
- package/dist/worker/worker-id.js.map +0 -1
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pipeline-core/kit/builders.ts — fluent helpers for writing templates in tests.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the readability of the e2e kit: a test builds a `Template` declaratively instead of hand-
|
|
5
|
+
* writing the verbose discriminated-union literals. Builders apply NO semantics — they only assemble
|
|
6
|
+
* data; `validateTemplate` is the single source of truth. Intentionally permissive so INVALID
|
|
7
|
+
* fixtures can be expressed (e.g. omit a default, point an edge nowhere).
|
|
8
|
+
*/
|
|
9
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
10
|
+
// Condition shorthands — read like the spec (§3).
|
|
11
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
12
|
+
export const verdictEq = (value) => ({ op: 'verdict.eq', value });
|
|
13
|
+
export const verdictIn = (...value) => ({ op: 'verdict.in', value });
|
|
14
|
+
export const counterLt = (scope, value) => ({ op: 'counter.lt', scope, value });
|
|
15
|
+
export const counterGte = (scope, value) => ({ op: 'counter.gte', scope, value });
|
|
16
|
+
export const allOf = (...of) => ({ op: 'all', of });
|
|
17
|
+
export const anyOf = (...of) => ({ op: 'any', of });
|
|
18
|
+
export const notCond = (cond) => ({ op: 'not', cond });
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
// Branch shorthands.
|
|
21
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
22
|
+
export const on = (when, goto) => ({ when, goto });
|
|
23
|
+
export const otherwise = (goto) => ({ default: goto });
|
|
24
|
+
export const node = {
|
|
25
|
+
agent(id, roleRef, next, opts = {}) {
|
|
26
|
+
return { id, kind: 'agent', roleRef, next, ...effect(opts) };
|
|
27
|
+
},
|
|
28
|
+
script(id, scriptRef, next, opts = {}) {
|
|
29
|
+
return { id, kind: 'script', scriptRef, next, ...effect(opts) };
|
|
30
|
+
},
|
|
31
|
+
humanGate(id, reason, outcomes, branches, opts = {}) {
|
|
32
|
+
return {
|
|
33
|
+
id,
|
|
34
|
+
kind: 'humanGate',
|
|
35
|
+
reason,
|
|
36
|
+
outcomes,
|
|
37
|
+
branches,
|
|
38
|
+
...(opts.timeout ? { timeout: opts.timeout } : {}),
|
|
39
|
+
...(opts.incrementCounters ? { incrementCounters: opts.incrementCounters } : {}),
|
|
40
|
+
...(opts.displayName ? { displayName: opts.displayName } : {}),
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
choice(id, branches, opts = {}) {
|
|
44
|
+
return {
|
|
45
|
+
id,
|
|
46
|
+
kind: 'choice',
|
|
47
|
+
branches,
|
|
48
|
+
...(opts.incrementCounters ? { incrementCounters: opts.incrementCounters } : {}),
|
|
49
|
+
...(opts.displayName ? { displayName: opts.displayName } : {}),
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
parallel(id, branches, join, opts = {}) {
|
|
53
|
+
return { id, kind: 'parallel', branches, join, ...(opts.displayName ? { displayName: opts.displayName } : {}) };
|
|
54
|
+
},
|
|
55
|
+
join(id, joinMode, next, opts = {}) {
|
|
56
|
+
return {
|
|
57
|
+
id,
|
|
58
|
+
kind: 'join',
|
|
59
|
+
joinMode,
|
|
60
|
+
next,
|
|
61
|
+
...(opts.merge ? { merge: opts.merge } : {}),
|
|
62
|
+
...(opts.displayName ? { displayName: opts.displayName } : {}),
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
wait(id, duration, next, opts = {}) {
|
|
66
|
+
return { id, kind: 'wait', duration, next, ...(opts.displayName ? { displayName: opts.displayName } : {}) };
|
|
67
|
+
},
|
|
68
|
+
terminal(id, status, opts = {}) {
|
|
69
|
+
return { id, kind: 'terminal', status, ...(opts.displayName ? { displayName: opts.displayName } : {}) };
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
function effect(opts) {
|
|
73
|
+
return {
|
|
74
|
+
...(opts.catch ? { catch: opts.catch } : {}),
|
|
75
|
+
...(opts.onFailure ? { onFailure: opts.onFailure } : {}),
|
|
76
|
+
...(opts.escalateTo ? { escalateTo: opts.escalateTo } : {}),
|
|
77
|
+
...(opts.resultSchema ? { resultSchema: opts.resultSchema } : {}),
|
|
78
|
+
...(opts.incrementCounters ? { incrementCounters: opts.incrementCounters } : {}),
|
|
79
|
+
...(opts.displayName ? { displayName: opts.displayName } : {}),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
+
// Join-mode shorthands.
|
|
84
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
85
|
+
export const joinAll = () => ({ kind: 'all' });
|
|
86
|
+
export const joinAny = () => ({ kind: 'any' });
|
|
87
|
+
export const joinQuorum = (count) => ({ kind: 'quorum', count });
|
|
88
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
89
|
+
// Template builder — `template().entry(...).domain(...).scope(...).add(...).build()`.
|
|
90
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
91
|
+
export class TemplateBuilder {
|
|
92
|
+
t;
|
|
93
|
+
constructor(pipelineId) {
|
|
94
|
+
this.t = { specVersion: '1.0', pipelineId, entry: '', verdicts: { domain: [] }, nodes: {} };
|
|
95
|
+
}
|
|
96
|
+
specVersion(v) {
|
|
97
|
+
this.t.specVersion = v;
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
title(title) {
|
|
101
|
+
this.t.title = title;
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
entry(id) {
|
|
105
|
+
this.t.entry = id;
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
domain(...labels) {
|
|
109
|
+
this.t.verdicts = { domain: labels };
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
policy(policy) {
|
|
113
|
+
this.t.policy = policy;
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
scope(id, scope) {
|
|
117
|
+
this.t.scopes ??= {};
|
|
118
|
+
this.t.scopes[id] = scope;
|
|
119
|
+
return this;
|
|
120
|
+
}
|
|
121
|
+
add(...nodes) {
|
|
122
|
+
for (const n of nodes)
|
|
123
|
+
this.t.nodes[n.id] = n;
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
build() {
|
|
127
|
+
// Return a deep-ish clone so a fixture can be mutated by a diff test without leaking.
|
|
128
|
+
return structuredClone(this.t);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export function template(pipelineId) {
|
|
132
|
+
return new TemplateBuilder(pipelineId);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/pipeline-core/kit/builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pipeline-core/kit/drive.ts — run `step()` to a terminal, feeding scripted results.
|
|
3
|
+
*
|
|
4
|
+
* The readability counterpart of the e2e `drive`: a test names the verdict each agent/gate produces
|
|
5
|
+
* and `drive` walks the interpreter to completion, recording the visited path of effect/gate/terminal
|
|
6
|
+
* nodes. This keeps interpreter tests declarative ("reviewer BLOCKER ×3 → blocked at the cap") instead
|
|
7
|
+
* of hand-threading `step()` calls and `RunState`.
|
|
8
|
+
*
|
|
9
|
+
* Scripted results are keyed by NODE ID and consumed one-per-visit (arrays clamp to the last entry,
|
|
10
|
+
* mirroring the e2e AgentSpec), so a node hit N times in a loop can yield a different verdict each pass.
|
|
11
|
+
*/
|
|
12
|
+
import { initialState, step } from '../interpret.js';
|
|
13
|
+
const MAX_STEPS = 1000; // a VALID template always terminates; this guards a test-authoring mistake.
|
|
14
|
+
/**
|
|
15
|
+
* Drive `template` from its initial state to a terminal, feeding each emitted Decision the scripted
|
|
16
|
+
* result for its node. Throws if a non-terminal Decision has no script entry, or if it runs away.
|
|
17
|
+
*/
|
|
18
|
+
export function drive(template, script = {}) {
|
|
19
|
+
const visits = new Map();
|
|
20
|
+
const joinVisits = new Map();
|
|
21
|
+
const trace = [];
|
|
22
|
+
const path = [];
|
|
23
|
+
let state = initialState(template);
|
|
24
|
+
let lastResult;
|
|
25
|
+
for (let i = 0; i < MAX_STEPS; i++) {
|
|
26
|
+
const out = step(template, state, lastResult);
|
|
27
|
+
state = out.state;
|
|
28
|
+
const decision = out.decision;
|
|
29
|
+
// For `complete` the cursor sits on the node that completed (terminal, or an aborting effect);
|
|
30
|
+
// every other Decision carries its own nodeId.
|
|
31
|
+
const nodeId = decision.type === 'complete' ? soleActive(state) : decision.nodeId;
|
|
32
|
+
trace.push({ nodeId, decision: decision.type });
|
|
33
|
+
path.push(nodeId);
|
|
34
|
+
if (decision.type === 'complete') {
|
|
35
|
+
return { status: decision.status, path, trace, counters: { ...state.scopedCounters } };
|
|
36
|
+
}
|
|
37
|
+
if (decision.type === 'fork') {
|
|
38
|
+
// The adapter runs the branches concurrently and records arrivals (§4); the core never sees the
|
|
39
|
+
// live race. We model that by jumping the cursor to the JOIN and feeding the arrivals scripted
|
|
40
|
+
// on the join node, so the next step aggregates a recorded result. A missing join script with
|
|
41
|
+
// mode `all` synthesizes one arrival per branch (verdict undefined) so the barrier is satisfied.
|
|
42
|
+
const arrivals = joinArrivalsFor(script, decision.joinId, decision.branches.map((b) => b.id), joinVisits);
|
|
43
|
+
state = { ...state, activeNodeIds: new Set([decision.joinId]) };
|
|
44
|
+
lastResult = { joinArrivals: arrivals };
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
// Resolve the scripted result for THIS node's effect and feed it as the next lastResult.
|
|
48
|
+
lastResult = resultFor(script, nodeId, decision, visits);
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`drive: ${template.pipelineId} did not terminate within ${MAX_STEPS} steps (script gap or loop)`);
|
|
51
|
+
}
|
|
52
|
+
function soleActive(state) {
|
|
53
|
+
return [...state.activeNodeIds][0] ?? '<none>';
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Recorded arrivals for a join: from the script entry on the join node, else one per branch. Like
|
|
57
|
+
* `resultFor`, an ARRAY entry is consumed one-per-visit (clamped) so a join hit repeatedly in a loop can
|
|
58
|
+
* yield a different recorded aggregation each pass; a single entry is reused every visit.
|
|
59
|
+
*/
|
|
60
|
+
function joinArrivalsFor(script, joinId, branchIds, joinVisits) {
|
|
61
|
+
const n = joinVisits.get(joinId) ?? 0;
|
|
62
|
+
joinVisits.set(joinId, n + 1);
|
|
63
|
+
const entry = script[joinId];
|
|
64
|
+
const picked = Array.isArray(entry) ? entry[Math.min(n, entry.length - 1)] : entry;
|
|
65
|
+
if (picked && typeof picked === 'object' && 'joinArrivals' in picked)
|
|
66
|
+
return picked.joinArrivals;
|
|
67
|
+
return branchIds.map((branchId, i) => ({ branchId, seq: i + 1 }));
|
|
68
|
+
}
|
|
69
|
+
function resultFor(script, nodeId, _decision, visits) {
|
|
70
|
+
const n = visits.get(nodeId) ?? 0;
|
|
71
|
+
visits.set(nodeId, n + 1);
|
|
72
|
+
const entry = script[nodeId];
|
|
73
|
+
if (entry === undefined) {
|
|
74
|
+
// A gate/effect with no script: assume structural success with no domain verdict (e.g. a script
|
|
75
|
+
// node that just proceeds). Tests that route on a verdict must script it. `_decision` is unused
|
|
76
|
+
// here but kept in the signature so a future kind-specific default can branch on it.
|
|
77
|
+
return {};
|
|
78
|
+
}
|
|
79
|
+
const picked = Array.isArray(entry) ? (entry[Math.min(n, entry.length - 1)] ?? {}) : entry;
|
|
80
|
+
return normalize(picked);
|
|
81
|
+
}
|
|
82
|
+
function normalize(r) {
|
|
83
|
+
if (typeof r === 'string')
|
|
84
|
+
return { verdict: r, outcome: 'succeeded' };
|
|
85
|
+
if ('joinArrivals' in r)
|
|
86
|
+
return { joinArrivals: r.joinArrivals };
|
|
87
|
+
const out = {};
|
|
88
|
+
if (r.verdict !== undefined)
|
|
89
|
+
out.verdict = r.verdict;
|
|
90
|
+
if (r.outcome !== undefined)
|
|
91
|
+
out.outcome = r.outcome;
|
|
92
|
+
if (r.errorCode !== undefined)
|
|
93
|
+
out.errorCode = r.errorCode;
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=drive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../../../src/pipeline-core/kit/drive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pipeline-core/kit/fixtures.ts — typed Template fixtures (the e2e-style "real pipelines" + targeted).
|
|
3
|
+
*
|
|
4
|
+
* `featureDevelopment` is the §13 canonical example, transcribed faithfully to a typed `Template`.
|
|
5
|
+
* `localChange` is its no-gate sibling (§13 footnote). The rest are small, single-purpose fixtures:
|
|
6
|
+
* nested-scope loops, a parallel/join, and one INVALID template per §12 rule (each named for the rule
|
|
7
|
+
* + diagnostic it is designed to trip), so validation tests read as a rule catalogue.
|
|
8
|
+
*/
|
|
9
|
+
import { allOf, counterGte, counterLt, joinAll, joinAny, joinQuorum, node, on, otherwise, template, verdictEq, } from './builders.js';
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
// §13 — feature-development (the canonical example).
|
|
12
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
13
|
+
export function featureDevelopment() {
|
|
14
|
+
return template('feature-development')
|
|
15
|
+
.title('Feature development with plan + merge gates and bounded rework')
|
|
16
|
+
.specVersion('1.0')
|
|
17
|
+
.entry('analyst')
|
|
18
|
+
.domain('approved', 'changes_requested', 'blocker', 'clean', 'dirty')
|
|
19
|
+
.policy({ conflicts: [['developer', 'reviewer']], enforcement: 'strict' })
|
|
20
|
+
.scope('codeReviewLoop', { cap: 3, parent: null })
|
|
21
|
+
.add(node.agent('analyst', 'role:analyst', 'planGate', { resultSchema: 'schema:plan', onFailure: 'abort' }), node.humanGate('planGate', 'plan-review', ['approved', 'changes_requested'], [
|
|
22
|
+
on(verdictEq('approved'), 'developer'),
|
|
23
|
+
on(verdictEq('changes_requested'), 'analyst'),
|
|
24
|
+
otherwise('blockedEnd'),
|
|
25
|
+
]), node.agent('developer', 'role:developer', 'codeReview', { resultSchema: 'schema:change', onFailure: 'abort' }), node.agent('codeReview', 'role:reviewer', 'codeReviewRouter', {
|
|
26
|
+
resultSchema: 'schema:reviewVerdict',
|
|
27
|
+
onFailure: 'abort',
|
|
28
|
+
}), node.choice('codeReviewRouter', [
|
|
29
|
+
on(verdictEq('approved'), 'integrator'),
|
|
30
|
+
on(allOf(verdictEq('blocker'), counterLt('codeReviewLoop', 3)), 'reworkDeveloper'),
|
|
31
|
+
otherwise('blockedEnd'),
|
|
32
|
+
]), node.agent('reworkDeveloper', 'role:developer', 'codeReview', {
|
|
33
|
+
resultSchema: 'schema:change',
|
|
34
|
+
incrementCounters: ['codeReviewLoop'],
|
|
35
|
+
onFailure: 'abort',
|
|
36
|
+
}), node.script('integrator', 'script:integrator', 'watcherPost', {
|
|
37
|
+
resultSchema: 'schema:integration',
|
|
38
|
+
onFailure: 'route',
|
|
39
|
+
catch: [{ onError: 'revo.ScriptFailed', goto: 'failedEnd' }],
|
|
40
|
+
}), node.agent('watcherPost', 'role:watcher', 'watcherRouter', {
|
|
41
|
+
resultSchema: 'schema:watchVerdict',
|
|
42
|
+
onFailure: 'abort',
|
|
43
|
+
}), node.choice('watcherRouter', [on(verdictEq('clean'), 'mergeGate'), otherwise('failedEnd')]), node.humanGate('mergeGate', 'merge-review', ['approved', 'changes_requested'], [
|
|
44
|
+
on(verdictEq('approved'), 'mergedEnd'),
|
|
45
|
+
otherwise('blockedEnd'),
|
|
46
|
+
]), node.terminal('mergedEnd', 'succeeded'), node.terminal('failedEnd', 'failed'), node.terminal('blockedEnd', 'blocked'))
|
|
47
|
+
.build();
|
|
48
|
+
}
|
|
49
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
// §13 footnote — local-change (orchestrator + developer, NO humanGate).
|
|
51
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
export function localChange() {
|
|
53
|
+
return template('local-change')
|
|
54
|
+
.title('Local change — orchestrator + developer, no gate')
|
|
55
|
+
.entry('orchestrator')
|
|
56
|
+
.domain('approved')
|
|
57
|
+
.add(node.agent('orchestrator', 'role:orchestrator', 'developer', { resultSchema: 'schema:plan' }), node.agent('developer', 'role:developer', 'doneEnd', { resultSchema: 'schema:change' }), node.terminal('doneEnd', 'succeeded'))
|
|
58
|
+
.build();
|
|
59
|
+
}
|
|
60
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
61
|
+
// Targeted — a nested-scope rework loop (inner loop resets on outer re-entry, §7).
|
|
62
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* outer (cap 2) ⊃ inner (cap 2). `outerWork` increments `outer` (and resets `inner`); `innerWork`
|
|
65
|
+
* increments `inner`. The inner cap routes back to the outer loop; the outer cap routes to blocked.
|
|
66
|
+
*/
|
|
67
|
+
export function nestedScopeLoop() {
|
|
68
|
+
return template('nested-scope-loop')
|
|
69
|
+
.entry('start')
|
|
70
|
+
.domain('redo_inner', 'redo_outer', 'done')
|
|
71
|
+
.scope('outer', { cap: 2, parent: null })
|
|
72
|
+
.scope('inner', { cap: 2, parent: 'outer' })
|
|
73
|
+
.add(node.agent('start', 'role:worker', 'innerWork'), node.agent('innerWork', 'role:worker', 'innerRouter', { incrementCounters: ['inner'] }), node.choice('innerRouter', [
|
|
74
|
+
on(verdictEq('done'), 'doneEnd'),
|
|
75
|
+
on(allOf(verdictEq('redo_inner'), counterLt('inner', 2)), 'innerWork'),
|
|
76
|
+
on(counterGte('inner', 2), 'outerRouter'),
|
|
77
|
+
otherwise('blockedEnd'),
|
|
78
|
+
]), node.choice('outerRouter', [
|
|
79
|
+
on(counterLt('outer', 2), 'outerWork'),
|
|
80
|
+
otherwise('blockedEnd'),
|
|
81
|
+
]), node.agent('outerWork', 'role:worker', 'innerWork', { incrementCounters: ['outer'] }), node.terminal('doneEnd', 'succeeded'), node.terminal('blockedEnd', 'blocked'))
|
|
82
|
+
.build();
|
|
83
|
+
}
|
|
84
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
85
|
+
// Targeted — a parallel/join (two review branches → join → terminal).
|
|
86
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
87
|
+
/** Map a join-mode kind to its `JoinMode` (quorum fixed at 2 for this fan-out shape). */
|
|
88
|
+
function joinModeFromKind(kind) {
|
|
89
|
+
if (kind === 'all')
|
|
90
|
+
return joinAll();
|
|
91
|
+
if (kind === 'any')
|
|
92
|
+
return joinAny();
|
|
93
|
+
return joinQuorum(2);
|
|
94
|
+
}
|
|
95
|
+
/** `joinModeKind` selects `all` (default), `any`, or `quorum{2}` on the same fan-out shape. */
|
|
96
|
+
export function parallelReview(joinModeKind = 'all') {
|
|
97
|
+
const mode = joinModeFromKind(joinModeKind);
|
|
98
|
+
return template('parallel-review')
|
|
99
|
+
.entry('fanout')
|
|
100
|
+
.domain('clean', 'dirty', 'approved')
|
|
101
|
+
.add(node.parallel('fanout', [
|
|
102
|
+
{ id: 'sec', entry: 'secReview' },
|
|
103
|
+
{ id: 'perf', entry: 'perfReview' },
|
|
104
|
+
], 'reviewJoin'), node.agent('secReview', 'role:reviewer', 'reviewJoin'), node.agent('perfReview', 'role:reviewer', 'reviewJoin'),
|
|
105
|
+
// `merge` declared so the 2-writer fan-out is well-formed under all modes (§12.8).
|
|
106
|
+
node.join('reviewJoin', mode, 'joinRouter', { merge: { findings: 'appendByBranchOrder' } }), node.choice('joinRouter', [on(verdictEq('clean'), 'doneEnd'), otherwise('blockedEnd')]), node.terminal('doneEnd', 'succeeded'), node.terminal('blockedEnd', 'blocked'))
|
|
107
|
+
.build();
|
|
108
|
+
}
|
|
109
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
110
|
+
// Targeted — a gate with a timeout edge (§6) + a node with onFailure=route+catch (§6).
|
|
111
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
112
|
+
export function gateWithTimeout() {
|
|
113
|
+
return template('gate-with-timeout')
|
|
114
|
+
.entry('gate')
|
|
115
|
+
.domain('approved')
|
|
116
|
+
.add(node.humanGate('gate', 'review', ['approved'], [on(verdictEq('approved'), 'doneEnd'), otherwise('blockedEnd')], {
|
|
117
|
+
timeout: { after: 'PT24H', goto: 'failedEnd' },
|
|
118
|
+
}), node.terminal('doneEnd', 'succeeded'), node.terminal('blockedEnd', 'blocked'), node.terminal('failedEnd', 'failed'))
|
|
119
|
+
.build();
|
|
120
|
+
}
|
|
121
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
122
|
+
// INVALID fixtures — one per §12 rule. Each is the minimal shape that trips its rule.
|
|
123
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
124
|
+
/** rule 1 — entry points at a node that does not exist (ENTRY_UNRESOLVED). */
|
|
125
|
+
export const invalidEntryUnresolved = () => template('inv').entry('ghost').domain('approved').add(node.terminal('end', 'succeeded')).build();
|
|
126
|
+
/** rule 2 — an edge points at a non-existent node (REF_UNRESOLVED). */
|
|
127
|
+
export const invalidRefUnresolved = () => template('inv').entry('a').domain('approved').add(node.agent('a', 'role:x', 'nowhere')).build();
|
|
128
|
+
/** rule 3 — a non-terminal with no exit (NONTERMINAL_NO_EXIT) — forced via a choice with no branches. */
|
|
129
|
+
export const invalidNonterminalNoExit = () => template('inv').entry('a').domain('approved').add(node.choice('a', [])).build();
|
|
130
|
+
/** rule 3 — a terminal with a bad status (TERMINAL_BAD_STATUS). */
|
|
131
|
+
export const invalidTerminalBadStatus = () => {
|
|
132
|
+
const t = template('inv').entry('a').domain('approved').add(node.terminal('a', 'succeeded')).build();
|
|
133
|
+
t.nodes['a'].status = 'done'; // not in {succeeded,failed,blocked}
|
|
134
|
+
return t;
|
|
135
|
+
};
|
|
136
|
+
/** rule 4 — a choice with no default (ROUTING_NO_DEFAULT). */
|
|
137
|
+
export const invalidNoDefault = () => template('inv')
|
|
138
|
+
.entry('a')
|
|
139
|
+
.domain('approved')
|
|
140
|
+
.add(node.choice('a', [on(verdictEq('approved'), 'end')]), node.terminal('end', 'succeeded'))
|
|
141
|
+
.build();
|
|
142
|
+
/** rule 4 — a guard placed AFTER the default (ROUTING_GUARD_AFTER_DEFAULT). */
|
|
143
|
+
export const invalidGuardAfterDefault = () => template('inv')
|
|
144
|
+
.entry('a')
|
|
145
|
+
.domain('approved')
|
|
146
|
+
.add(node.choice('a', [otherwise('end'), on(verdictEq('approved'), 'end')]), node.terminal('end', 'succeeded'))
|
|
147
|
+
.build();
|
|
148
|
+
/** rule 5 — a node unreachable from entry (UNREACHABLE_NODE). */
|
|
149
|
+
export const invalidUnreachable = () => template('inv')
|
|
150
|
+
.entry('a')
|
|
151
|
+
.domain('approved')
|
|
152
|
+
.add(node.agent('a', 'role:x', 'end'), node.terminal('end', 'succeeded'), node.agent('orphan', 'role:y', 'end'))
|
|
153
|
+
.build();
|
|
154
|
+
/** rule 6 — an unbounded back-edge (LOOP_UNBOUNDED): a choice loops back with no counter.gte cap. */
|
|
155
|
+
export const invalidUnboundedLoop = () => template('inv')
|
|
156
|
+
.entry('a')
|
|
157
|
+
.domain('approved')
|
|
158
|
+
.add(node.agent('a', 'role:x', 'router'), node.choice('router', [on(verdictEq('approved'), 'a'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
159
|
+
.build();
|
|
160
|
+
/** rule 7 — a guard references an undeclared scope (SCOPE_UNDECLARED). */
|
|
161
|
+
export const invalidScopeUndeclared = () => template('inv')
|
|
162
|
+
.entry('a')
|
|
163
|
+
.domain('approved')
|
|
164
|
+
.add(node.agent('a', 'role:x', 'router'), node.choice('router', [on(counterGte('ghostScope', 3), 'end'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
165
|
+
.build();
|
|
166
|
+
/** rule 7 — a scope whose parent does not resolve (SCOPE_PARENT_UNRESOLVED). The scope is otherwise
|
|
167
|
+
* well-formed (incremented on its own loop) so the parent-unresolved finding stands alone. */
|
|
168
|
+
export const invalidScopeParent = () => template('inv')
|
|
169
|
+
.entry('a')
|
|
170
|
+
.domain('approved')
|
|
171
|
+
.scope('child', { cap: 2, parent: 'ghostParent' })
|
|
172
|
+
.add(node.agent('a', 'role:x', 'router', { incrementCounters: ['child'] }), node.choice('router', [on(counterLt('child', 2), 'a'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
173
|
+
.build();
|
|
174
|
+
/** rule 8 — quorum K > N (QUORUM_K_GT_N). */
|
|
175
|
+
export const invalidQuorumKgtN = () => template('inv')
|
|
176
|
+
.entry('fanout')
|
|
177
|
+
.domain('clean')
|
|
178
|
+
.add(node.parallel('fanout', [{ id: 'a', entry: 'aWork' }, { id: 'b', entry: 'bWork' }], 'j'), node.agent('aWork', 'role:x', 'j'), node.agent('bWork', 'role:y', 'j'), node.join('j', joinQuorum(3), 'end', { merge: { f: 'overwrite' } }), node.terminal('end', 'succeeded'))
|
|
179
|
+
.build();
|
|
180
|
+
/** rule 8 — a cross-branch goto (BRANCH_CROSS_GOTO): branch a's node jumps into branch b. */
|
|
181
|
+
export const invalidCrossBranchGoto = () => template('inv')
|
|
182
|
+
.entry('fanout')
|
|
183
|
+
.domain('clean')
|
|
184
|
+
.add(node.parallel('fanout', [{ id: 'a', entry: 'aWork' }, { id: 'b', entry: 'bWork' }], 'j'), node.agent('aWork', 'role:x', 'bWork'), // crosses into branch b
|
|
185
|
+
node.agent('bWork', 'role:y', 'j'), node.join('j', joinAll(), 'end', { merge: { f: 'overwrite' } }), // merge present → only BRANCH_CROSS_GOTO trips
|
|
186
|
+
node.terminal('end', 'succeeded'))
|
|
187
|
+
.build();
|
|
188
|
+
/** rule 8 — a multi-writer fan-out with no merge reducer (MERGE_MISSING). */
|
|
189
|
+
export const invalidMissingMerge = () => template('inv')
|
|
190
|
+
.entry('fanout')
|
|
191
|
+
.domain('clean')
|
|
192
|
+
.add(node.parallel('fanout', [{ id: 'a', entry: 'aWork' }, { id: 'b', entry: 'bWork' }], 'j'), node.agent('aWork', 'role:x', 'j'), node.agent('bWork', 'role:y', 'j'), node.join('j', joinAll(), 'end'), // no merge declared, 2 effect writers
|
|
193
|
+
node.terminal('end', 'succeeded'))
|
|
194
|
+
.build();
|
|
195
|
+
/** rule 9 — a guard uses an undeclared verdict (VERDICT_UNDECLARED). */
|
|
196
|
+
export const invalidVerdictUndeclared = () => template('inv')
|
|
197
|
+
.entry('a')
|
|
198
|
+
.domain('approved')
|
|
199
|
+
.add(node.agent('a', 'role:x', 'router'), node.choice('router', [on(verdictEq('mystery'), 'end'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
200
|
+
.build();
|
|
201
|
+
/** rule 9 — a guard uses a CORE verdict, which must route structurally (VERDICT_CORE_IN_GUARD). */
|
|
202
|
+
export const invalidCoreVerdictInGuard = () => template('inv')
|
|
203
|
+
.entry('a')
|
|
204
|
+
.domain('approved')
|
|
205
|
+
.add(node.agent('a', 'role:x', 'router'), node.choice('router', [on(verdictEq('succeeded'), 'end'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
206
|
+
.build();
|
|
207
|
+
/** rule 9 — a domain label shadows a core verdict (VERDICT_DOMAIN_SHADOWS_CORE). */
|
|
208
|
+
export const invalidDomainShadowsCore = () => template('inv')
|
|
209
|
+
.entry('a')
|
|
210
|
+
.domain('approved', 'failed')
|
|
211
|
+
.add(node.agent('a', 'role:x', 'end'), node.terminal('end', 'succeeded'))
|
|
212
|
+
.build();
|
|
213
|
+
/** rule 9 — a gate outcome not in domain (GATE_OUTCOME_NOT_SUBSET). */
|
|
214
|
+
export const invalidGateOutcomeNotSubset = () => template('inv')
|
|
215
|
+
.entry('g')
|
|
216
|
+
.domain('approved')
|
|
217
|
+
.add(node.humanGate('g', 'r', ['approved', 'rejected'], [on(verdictEq('approved'), 'end'), otherwise('end')]), node.terminal('end', 'succeeded'))
|
|
218
|
+
.build();
|
|
219
|
+
/** rule 11 — a node id that breaks the id pattern (ID_BAD_PATTERN). */
|
|
220
|
+
export const invalidBadId = () => {
|
|
221
|
+
const t = template('inv').entry('a').domain('approved').add(node.agent('a', 'role:x', 'end'), node.terminal('end', 'succeeded')).build();
|
|
222
|
+
// Re-key 'a' to an illegal id and re-point entry.
|
|
223
|
+
const a = t.nodes['a'];
|
|
224
|
+
delete t.nodes['a'];
|
|
225
|
+
a.id = '1bad';
|
|
226
|
+
t.nodes['1bad'] = a;
|
|
227
|
+
t.entry = '1bad';
|
|
228
|
+
return t;
|
|
229
|
+
};
|
|
230
|
+
/** rule 12 — a malformed capability ref (CAPABILITY_REF_SHAPE). */
|
|
231
|
+
export const invalidCapabilityRef = () => template('inv')
|
|
232
|
+
.entry('a')
|
|
233
|
+
.domain('approved')
|
|
234
|
+
.add(node.agent('a', 'not-a-role-handle', 'end'), node.terminal('end', 'succeeded'))
|
|
235
|
+
.build();
|
|
236
|
+
/** rule 6 — onFailure=route with NO catch (FAILURE_ROUTE_NO_CATCH). */
|
|
237
|
+
export const invalidRouteNoCatch = () => template('inv')
|
|
238
|
+
.entry('a')
|
|
239
|
+
.domain('approved')
|
|
240
|
+
.add(node.script('a', 'script:x', 'end', { onFailure: 'route' }), node.terminal('end', 'succeeded'))
|
|
241
|
+
.build();
|
|
242
|
+
/** rule 6 — onFailure=escalate with NO escalateTo (FAILURE_ESCALATE_NO_TARGET). */
|
|
243
|
+
export const invalidEscalateNoTarget = () => template('inv')
|
|
244
|
+
.entry('a')
|
|
245
|
+
.domain('approved')
|
|
246
|
+
.add(node.agent('a', 'role:x', 'end', { onFailure: 'escalate' }), node.terminal('end', 'succeeded'))
|
|
247
|
+
.build();
|
|
248
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../src/pipeline-core/kit/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pipeline-core/kit — the readability test kit (mirrors src/e2e/kit).
|
|
3
|
+
*
|
|
4
|
+
* builders — fluent `template()` / `node.*` / condition + branch shorthands.
|
|
5
|
+
* fixtures — the two real pipelines (§13) + targeted valid/invalid fixtures.
|
|
6
|
+
* drive — run `step()` to a terminal feeding scripted verdicts, recording the path.
|
|
7
|
+
* assertions — `assertValid` / `assertDiagnostics` / `assertReachesTerminal` / `assertPath` / …
|
|
8
|
+
*/
|
|
9
|
+
export * from './builders.js';
|
|
10
|
+
export * from './fixtures.js';
|
|
11
|
+
export * from './drive.js';
|
|
12
|
+
export * from './assertions.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pipeline-core/kit/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
|