@jterrats/open-orchestra 1.0.7 → 1.0.9
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/AGENTS.md +12 -2
- package/CHANGELOG.md +41 -0
- package/CLAUDE.md +13 -2
- package/dist/acceptance-criteria-quality.d.ts +12 -0
- package/dist/acceptance-criteria-quality.js +137 -0
- package/dist/acceptance-criteria-quality.js.map +1 -0
- package/dist/architecture-debt-inventory.d.ts +31 -0
- package/dist/architecture-debt-inventory.js +200 -0
- package/dist/architecture-debt-inventory.js.map +1 -0
- package/dist/architecture-debt-report.d.ts +2 -0
- package/dist/architecture-debt-report.js +28 -0
- package/dist/architecture-debt-report.js.map +1 -0
- package/dist/autonomous-phase-lifecycle.d.ts +5 -1
- package/dist/autonomous-phase-lifecycle.js +87 -17
- package/dist/autonomous-phase-lifecycle.js.map +1 -1
- package/dist/cli-payloads.d.ts +4 -0
- package/dist/cli-payloads.js +24 -0
- package/dist/cli-payloads.js.map +1 -0
- package/dist/cli.js +4 -446
- package/dist/cli.js.map +1 -1
- package/dist/command-manifest.js +3 -1
- package/dist/command-manifest.js.map +1 -1
- package/dist/command-route-utils.d.ts +18 -0
- package/dist/command-route-utils.js +18 -0
- package/dist/command-route-utils.js.map +1 -0
- package/dist/command-routes-integrations.d.ts +2 -0
- package/dist/command-routes-integrations.js +82 -0
- package/dist/command-routes-integrations.js.map +1 -0
- package/dist/command-routes.d.ts +2 -0
- package/dist/command-routes.js +175 -0
- package/dist/command-routes.js.map +1 -0
- package/dist/commands.d.ts +1 -1
- package/dist/commands.js +16 -3
- package/dist/commands.js.map +1 -1
- package/dist/github.js +22 -7
- package/dist/github.js.map +1 -1
- package/dist/metrics-commands.js +69 -17
- package/dist/metrics-commands.js.map +1 -1
- package/dist/phase-executor.js +5 -169
- package/dist/phase-executor.js.map +1 -1
- package/dist/phase-playbooks.js +17 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/qa-e2e-artifacts.d.ts +7 -0
- package/dist/qa-e2e-artifacts.js +225 -0
- package/dist/qa-e2e-artifacts.js.map +1 -0
- package/dist/quality-contracts.d.ts +83 -0
- package/dist/quality-contracts.js +463 -0
- package/dist/quality-contracts.js.map +1 -0
- package/dist/refresh-generated.js +87 -45
- package/dist/refresh-generated.js.map +1 -1
- package/dist/runtime-bootstrap-targets.d.ts +15 -0
- package/dist/runtime-bootstrap-targets.js +68 -0
- package/dist/runtime-bootstrap-targets.js.map +1 -0
- package/dist/runtime-bootstrap.js +3 -0
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.d.ts +2 -0
- package/dist/runtime-commands.js +187 -2
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-context-manifest.d.ts +27 -0
- package/dist/runtime-context-manifest.js +151 -0
- package/dist/runtime-context-manifest.js.map +1 -0
- package/dist/runtime-execution-renderer.d.ts +3 -1
- package/dist/runtime-execution-renderer.js +17 -53
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +2 -1
- package/dist/runtime-execution.js +166 -4
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-guardrails.js +9 -1
- package/dist/runtime-guardrails.js.map +1 -1
- package/dist/runtime-lifecycle-watch.d.ts +93 -0
- package/dist/runtime-lifecycle-watch.js +391 -0
- package/dist/runtime-lifecycle-watch.js.map +1 -0
- package/dist/runtime-parent-actions.d.ts +7 -2
- package/dist/runtime-parent-actions.js +132 -1
- package/dist/runtime-parent-actions.js.map +1 -1
- package/dist/runtime-renderer-lines.d.ts +5 -0
- package/dist/runtime-renderer-lines.js +58 -0
- package/dist/runtime-renderer-lines.js.map +1 -0
- package/dist/runtime-spawn-bridge.js +40 -10
- package/dist/runtime-spawn-bridge.js.map +1 -1
- package/dist/runtime-spawn-quality.d.ts +2 -0
- package/dist/runtime-spawn-quality.js +11 -0
- package/dist/runtime-spawn-quality.js.map +1 -0
- package/dist/sonar-insights.d.ts +1 -0
- package/dist/sonar-insights.js +6 -2
- package/dist/sonar-insights.js.map +1 -1
- package/dist/types/model-config.d.ts +6 -0
- package/dist/types/runtime.d.ts +26 -2
- package/dist/types/tasks.d.ts +12 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js.map +1 -1
- package/dist/web-api.js +8 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-console/assets/index-DXbrxR_d.js +11 -0
- package/dist/web-console/index.html +1 -1
- package/dist/workflow-handoff-assessment.d.ts +3 -0
- package/dist/workflow-handoff-assessment.js +246 -0
- package/dist/workflow-handoff-assessment.js.map +1 -0
- package/dist/workflow-handoff-contract.d.ts +32 -0
- package/dist/workflow-handoff-contract.js +123 -0
- package/dist/workflow-handoff-contract.js.map +1 -0
- package/dist/workflow-phase-transition.d.ts +16 -0
- package/dist/workflow-phase-transition.js +76 -0
- package/dist/workflow-phase-transition.js.map +1 -0
- package/dist/workflow-run-commands.js +47 -12
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.js +57 -27
- package/dist/workflow-services.js.map +1 -1
- package/dist/workspace-init-artifacts.d.ts +17 -0
- package/dist/workspace-init-artifacts.js +81 -0
- package/dist/workspace-init-artifacts.js.map +1 -0
- package/dist/workspace-runtime-bootstrap.d.ts +12 -0
- package/dist/workspace-runtime-bootstrap.js +64 -0
- package/dist/workspace-runtime-bootstrap.js.map +1 -0
- package/dist/workspace.d.ts +5 -2
- package/dist/workspace.js +43 -145
- package/dist/workspace.js.map +1 -1
- package/docs/architecture-debt-inventory.md +25 -0
- package/docs/autonomous-workflow.md +7 -0
- package/docs/e2e-test-batteries.md +106 -0
- package/docs/orchestra-mvp.md +8 -0
- package/docs/release-test-matrix.md +7 -0
- package/docs/runtime-adapters.md +86 -9
- package/docs/site-manifest.json +2 -0
- package/docs/sonar-quality-gates.md +133 -11
- package/package.json +5 -1
- package/rules/delivery-quality-gates.mdc +6 -0
- package/rules/devops-tooling.mdc +1 -0
- package/rules/security-guardrails.mdc +3 -0
- package/rules/testing-discipline.mdc +9 -0
- package/dist/web-console/assets/index-CgSKcay8.js +0 -11
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Open Orchestra Local workflow console</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DXbrxR_d.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-jxCY5eEc.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { HandoffFieldAssessment, HandoffTransitionInput } from "./workflow-handoff-contract.js";
|
|
2
|
+
export declare function assessRequiredHandoffField(field: string, input: HandoffTransitionInput): HandoffFieldAssessment;
|
|
3
|
+
export declare function normalizeHandoffField(value: string): string;
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { assessAcceptanceCriteriaQuality } from "./acceptance-criteria-quality.js";
|
|
2
|
+
export function assessRequiredHandoffField(field, input) {
|
|
3
|
+
const detail = detailForField(field, input);
|
|
4
|
+
return {
|
|
5
|
+
field,
|
|
6
|
+
status: detail.trim().toLowerCase().startsWith("gap:") ? "gap" : "covered",
|
|
7
|
+
detail,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function normalizeHandoffField(value) {
|
|
11
|
+
return value.toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
12
|
+
}
|
|
13
|
+
function detailForField(field, input) {
|
|
14
|
+
const normalized = normalizeHandoffField(field);
|
|
15
|
+
const output = input.output;
|
|
16
|
+
const task = input.task;
|
|
17
|
+
if (normalized.includes("backlogitem"))
|
|
18
|
+
return backlogItem(task);
|
|
19
|
+
if (normalized.includes("acceptancecriteriacoverage")) {
|
|
20
|
+
return acceptanceCriteriaCoverage(task);
|
|
21
|
+
}
|
|
22
|
+
if (normalized.includes("acceptancecriteria")) {
|
|
23
|
+
return acceptanceCriteria(task);
|
|
24
|
+
}
|
|
25
|
+
if (normalized.includes("scopedecision")) {
|
|
26
|
+
return scopeDecision(task, "functional");
|
|
27
|
+
}
|
|
28
|
+
if (normalized.includes("functionalsplitdecision")) {
|
|
29
|
+
return splitDecision(task, "functional");
|
|
30
|
+
}
|
|
31
|
+
if (normalized.includes("scopeassessment")) {
|
|
32
|
+
return scopeDecision(task, "technical");
|
|
33
|
+
}
|
|
34
|
+
if (normalized.includes("splitdecision")) {
|
|
35
|
+
return splitDecision(task, "technical");
|
|
36
|
+
}
|
|
37
|
+
if (normalized.includes("affectedboundaries"))
|
|
38
|
+
return affectedBoundaries(task);
|
|
39
|
+
if (isRiskField(normalized))
|
|
40
|
+
return riskDetail(output, task);
|
|
41
|
+
if (normalized.includes("decision"))
|
|
42
|
+
return decisionDetail(output);
|
|
43
|
+
if (normalized.includes("changedcomponents")) {
|
|
44
|
+
return task?.paths?.length
|
|
45
|
+
? task.paths.join(", ")
|
|
46
|
+
: input.handoff.changed || "Gap: no changed components were recorded.";
|
|
47
|
+
}
|
|
48
|
+
if (normalized.includes("behaviorchanged")) {
|
|
49
|
+
return (input.handoff.behavior || output?.summary || "Gap: behavior missing.");
|
|
50
|
+
}
|
|
51
|
+
if (normalized.includes("unittests")) {
|
|
52
|
+
return input.handoff.tests || "Gap: unit test result missing.";
|
|
53
|
+
}
|
|
54
|
+
if (normalized.includes("commandsrun")) {
|
|
55
|
+
return input.handoff.commands || "Gap: command evidence missing.";
|
|
56
|
+
}
|
|
57
|
+
if (normalized.includes("knowngaps"))
|
|
58
|
+
return knownGaps(output);
|
|
59
|
+
if (normalized.includes("architecturalconcerns")) {
|
|
60
|
+
return architecturalConcernDetail(output);
|
|
61
|
+
}
|
|
62
|
+
if (normalized.includes("testplan"))
|
|
63
|
+
return qaPlanDetail(task, output);
|
|
64
|
+
if (normalized.includes("results"))
|
|
65
|
+
return resultDetail(output);
|
|
66
|
+
if (normalized.includes("evidence"))
|
|
67
|
+
return evidenceDetail(output);
|
|
68
|
+
if (normalized.includes("gono"))
|
|
69
|
+
return goNoGoDetail(output);
|
|
70
|
+
if (normalized.includes("rollback"))
|
|
71
|
+
return rollbackDetail();
|
|
72
|
+
if (isUxField(normalized))
|
|
73
|
+
return uxDetail(field, output);
|
|
74
|
+
if (isGeneralNarrativeField(normalized)) {
|
|
75
|
+
return output?.handoff || output?.summary || input.handoff.changed;
|
|
76
|
+
}
|
|
77
|
+
return output?.handoff || output?.summary || input.handoff.changed;
|
|
78
|
+
}
|
|
79
|
+
function backlogItem(task) {
|
|
80
|
+
return task
|
|
81
|
+
? `${task.id}: ${task.title}`
|
|
82
|
+
: "Gap: no task record was available for backlog traceability.";
|
|
83
|
+
}
|
|
84
|
+
function acceptanceCriteria(task) {
|
|
85
|
+
const quality = assessAcceptanceCriteriaQuality(task);
|
|
86
|
+
if (!task?.acceptanceCriteria?.length) {
|
|
87
|
+
return "Gap: no acceptance criteria are recorded on the task.";
|
|
88
|
+
}
|
|
89
|
+
if (quality.issues.length > 0) {
|
|
90
|
+
return `Gap: acceptance criteria include non-verifiable fragments: ${renderAcceptanceCriteriaIssues(quality)}`;
|
|
91
|
+
}
|
|
92
|
+
return task.acceptanceCriteria.join("; ");
|
|
93
|
+
}
|
|
94
|
+
function scopeDecision(task, dimension) {
|
|
95
|
+
const signals = scopeSignals(task);
|
|
96
|
+
if (signals.length === 0) {
|
|
97
|
+
return `${dimension} scope reviewed; no oversized-scope signals detected from task metadata.`;
|
|
98
|
+
}
|
|
99
|
+
return `${dimension} scope requires split review: ${signals.join("; ")}`;
|
|
100
|
+
}
|
|
101
|
+
function splitDecision(task, dimension) {
|
|
102
|
+
const signals = scopeSignals(task);
|
|
103
|
+
if (signals.length === 0) {
|
|
104
|
+
return `No ${dimension} split required based on current task metadata.`;
|
|
105
|
+
}
|
|
106
|
+
return `${dimension} split recommended or explicit accepted-risk decision required: ${signals.join("; ")}`;
|
|
107
|
+
}
|
|
108
|
+
function scopeSignals(task) {
|
|
109
|
+
if (!task)
|
|
110
|
+
return ["task metadata unavailable"];
|
|
111
|
+
const signals = [];
|
|
112
|
+
if ((task.paths?.length ?? 0) > 3) {
|
|
113
|
+
signals.push(`broad path count (${task.paths?.length})`);
|
|
114
|
+
}
|
|
115
|
+
if ((task.acceptanceCriteria?.length ?? 0) > 5) {
|
|
116
|
+
signals.push(`many acceptance criteria (${task.acceptanceCriteria?.length})`);
|
|
117
|
+
}
|
|
118
|
+
if ((task.workflow?.requiredRoles?.length ?? 0) > 2) {
|
|
119
|
+
signals.push(`multiple required roles (${task.workflow?.requiredRoles?.join(", ")})`);
|
|
120
|
+
}
|
|
121
|
+
if (hasCrossCuttingKeyword(task))
|
|
122
|
+
signals.push("cross-cutting technical keywords");
|
|
123
|
+
return signals;
|
|
124
|
+
}
|
|
125
|
+
function hasCrossCuttingKeyword(task) {
|
|
126
|
+
const text = [task.title, task.goal, task.scope, ...(task.paths ?? [])]
|
|
127
|
+
.filter((value) => typeof value === "string")
|
|
128
|
+
.join(" ")
|
|
129
|
+
.toLowerCase();
|
|
130
|
+
return /\b(refactor|enforcement|architecture|security|runtime|workflow)\b/.test(text);
|
|
131
|
+
}
|
|
132
|
+
function affectedBoundaries(task) {
|
|
133
|
+
if (!task?.paths?.length) {
|
|
134
|
+
return "Gap: no paths recorded to identify affected boundaries.";
|
|
135
|
+
}
|
|
136
|
+
const boundaries = uniqueStrings(task.paths
|
|
137
|
+
.map((item) => item.split(/[\\/]/)[0])
|
|
138
|
+
.filter((value) => typeof value === "string"));
|
|
139
|
+
return boundaries.join(", ");
|
|
140
|
+
}
|
|
141
|
+
function acceptanceCriteriaCoverage(task) {
|
|
142
|
+
if (!task?.acceptanceCriteria?.length) {
|
|
143
|
+
return "Gap: no acceptance criteria are recorded for QA mapping.";
|
|
144
|
+
}
|
|
145
|
+
const quality = assessAcceptanceCriteriaQuality(task);
|
|
146
|
+
if (quality.issues.length > 0) {
|
|
147
|
+
return `Gap: QA cannot map fragmented acceptance criteria to evidence: ${renderAcceptanceCriteriaIssues(quality)}`;
|
|
148
|
+
}
|
|
149
|
+
return quality.valid
|
|
150
|
+
.map((criterion, index) => `AC${index + 1} mapped for evidence: ${criterion}`)
|
|
151
|
+
.join("; ");
|
|
152
|
+
}
|
|
153
|
+
function riskDetail(output, task) {
|
|
154
|
+
const riskFindings = (output?.findings ?? []).filter((finding) => /risk|gap|block|split/i.test(finding));
|
|
155
|
+
if (riskFindings.length > 0)
|
|
156
|
+
return riskFindings.join("; ");
|
|
157
|
+
if (task?.risks?.length)
|
|
158
|
+
return task.risks.join("; ");
|
|
159
|
+
return "Reviewed: no risk findings were recorded by this phase.";
|
|
160
|
+
}
|
|
161
|
+
function decisionDetail(output) {
|
|
162
|
+
return output?.decisions.length
|
|
163
|
+
? output.decisions.join("; ")
|
|
164
|
+
: "Gap: no explicit decision was recorded by this phase.";
|
|
165
|
+
}
|
|
166
|
+
function knownGaps(output) {
|
|
167
|
+
return output?.findings.length
|
|
168
|
+
? output.findings.join("; ")
|
|
169
|
+
: "Reviewed: no phase findings were recorded as open gaps.";
|
|
170
|
+
}
|
|
171
|
+
function qaPlanDetail(task, output) {
|
|
172
|
+
const quality = assessAcceptanceCriteriaQuality(task);
|
|
173
|
+
if (quality.issues.length > 0) {
|
|
174
|
+
return `Gap: QA plan blocked by non-verifiable acceptance criteria: ${renderAcceptanceCriteriaIssues(quality)}`;
|
|
175
|
+
}
|
|
176
|
+
if (output?.evidence.length)
|
|
177
|
+
return output.evidence.join("; ");
|
|
178
|
+
if (task?.acceptanceCriteria?.length) {
|
|
179
|
+
return "QA plan must validate every acceptance criterion with result evidence and E2E where behavior is observable.";
|
|
180
|
+
}
|
|
181
|
+
return "Gap: QA plan cannot be completed because no acceptance criteria are recorded.";
|
|
182
|
+
}
|
|
183
|
+
function renderAcceptanceCriteriaIssues(quality) {
|
|
184
|
+
return quality.issues
|
|
185
|
+
.map((issue) => `AC${issue.index + 1} "${issue.criterion}" (${issue.reason})`)
|
|
186
|
+
.join("; ");
|
|
187
|
+
}
|
|
188
|
+
function resultDetail(output) {
|
|
189
|
+
return output?.verdict
|
|
190
|
+
? `Phase verdict: ${output.verdict}`
|
|
191
|
+
: "Gap: test execution result missing.";
|
|
192
|
+
}
|
|
193
|
+
function evidenceDetail(output) {
|
|
194
|
+
return output?.evidence.length
|
|
195
|
+
? output.evidence.join("; ")
|
|
196
|
+
: "Gap: no evidence artifact was recorded by this phase.";
|
|
197
|
+
}
|
|
198
|
+
function goNoGoDetail(output) {
|
|
199
|
+
return output?.verdict === "fail"
|
|
200
|
+
? "Go/no-go: no-go due to failing phase verdict."
|
|
201
|
+
: "Go/no-go: proceed based on current phase verdict and recorded gaps.";
|
|
202
|
+
}
|
|
203
|
+
function rollbackDetail() {
|
|
204
|
+
return "Rollback review required for release-impacting work; no runtime rollback action was generated by this phase.";
|
|
205
|
+
}
|
|
206
|
+
function uxDetail(field, output) {
|
|
207
|
+
return output?.findings.length || output?.evidence.length
|
|
208
|
+
? [...(output?.findings ?? []), ...(output?.evidence ?? [])].join("; ")
|
|
209
|
+
: `Gap: ${field} was not explicitly covered by the phase output.`;
|
|
210
|
+
}
|
|
211
|
+
function architecturalConcernDetail(output) {
|
|
212
|
+
const concerns = output?.architecturalConcerns;
|
|
213
|
+
if (!concerns) {
|
|
214
|
+
return "Gap: architectural concerns were not reported by the developer phase.";
|
|
215
|
+
}
|
|
216
|
+
const inherited = concerns.inherited.length
|
|
217
|
+
? concerns.inherited.join("; ")
|
|
218
|
+
: "None";
|
|
219
|
+
const selfImposed = concerns.selfImposed.length
|
|
220
|
+
? concerns.selfImposed.join("; ")
|
|
221
|
+
: "None";
|
|
222
|
+
return `Inherited: ${inherited}; Self-imposed: ${selfImposed}`;
|
|
223
|
+
}
|
|
224
|
+
function isRiskField(normalized) {
|
|
225
|
+
return (normalized.includes("risk") ||
|
|
226
|
+
normalized.includes("technicalrisks") ||
|
|
227
|
+
normalized.includes("tradeoffs"));
|
|
228
|
+
}
|
|
229
|
+
function isUxField(normalized) {
|
|
230
|
+
return (normalized.includes("userflow") ||
|
|
231
|
+
normalized.includes("flow") ||
|
|
232
|
+
normalized.includes("states") ||
|
|
233
|
+
normalized.includes("accessibility"));
|
|
234
|
+
}
|
|
235
|
+
function isGeneralNarrativeField(normalized) {
|
|
236
|
+
return (normalized.includes("recommendation") ||
|
|
237
|
+
normalized.includes("status") ||
|
|
238
|
+
normalized.includes("priority") ||
|
|
239
|
+
normalized.includes("successmetrics") ||
|
|
240
|
+
normalized.includes("rules") ||
|
|
241
|
+
normalized.includes("assumptions"));
|
|
242
|
+
}
|
|
243
|
+
function uniqueStrings(values) {
|
|
244
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=workflow-handoff-assessment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-handoff-assessment.js","sourceRoot":"","sources":["../src/workflow-handoff-assessment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { HandoffInput, PhaseStructuredOutput, Role, Task } from "./types.js";
|
|
2
|
+
import { type QualityContractEvaluation, type QualityContractPolicyConfig } from "./quality-contracts.js";
|
|
3
|
+
export interface HandoffFieldAssessment {
|
|
4
|
+
field: string;
|
|
5
|
+
status: "covered" | "gap";
|
|
6
|
+
detail: string;
|
|
7
|
+
}
|
|
8
|
+
export interface HandoffTransitionContract {
|
|
9
|
+
fromRole: string;
|
|
10
|
+
toRole: string;
|
|
11
|
+
phase: string;
|
|
12
|
+
nextPhase: string;
|
|
13
|
+
requiredFields: string[];
|
|
14
|
+
assessments: HandoffFieldAssessment[];
|
|
15
|
+
roleContract?: QualityContractEvaluation;
|
|
16
|
+
}
|
|
17
|
+
export interface HandoffTransitionInput {
|
|
18
|
+
task: Task | undefined;
|
|
19
|
+
fromRole: Role;
|
|
20
|
+
toRole: Role;
|
|
21
|
+
phase: string;
|
|
22
|
+
nextPhase: string;
|
|
23
|
+
output: PhaseStructuredOutput | undefined;
|
|
24
|
+
handoff: Pick<HandoffInput, "changed" | "behavior" | "tests" | "commands">;
|
|
25
|
+
handoffContent?: string;
|
|
26
|
+
qualityContracts?: QualityContractPolicyConfig;
|
|
27
|
+
enforceRoleContract?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export declare function buildHandoffTransitionContract(input: HandoffTransitionInput): HandoffTransitionContract;
|
|
30
|
+
export declare function contractHasBlockingGaps(contract: HandoffTransitionContract): boolean;
|
|
31
|
+
export declare function renderHandoffTransitionContract(contract: HandoffTransitionContract | undefined): string[];
|
|
32
|
+
export declare function summarizeContractGaps(contract: HandoffTransitionContract): string;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { assessRequiredHandoffField, normalizeHandoffField, } from "./workflow-handoff-assessment.js";
|
|
2
|
+
import { evaluateQualityContract, } from "./quality-contracts.js";
|
|
3
|
+
const PHASE_REQUIRED_FIELDS = {
|
|
4
|
+
po: ["scopeDecision", "functionalSplitDecision"],
|
|
5
|
+
architect: [
|
|
6
|
+
"scopeAssessment",
|
|
7
|
+
"affectedBoundaries",
|
|
8
|
+
"splitDecision",
|
|
9
|
+
"technicalRisks",
|
|
10
|
+
],
|
|
11
|
+
developer: ["knownGaps", "architecturalConcerns"],
|
|
12
|
+
qa: ["acceptanceCriteriaCoverage", "testPlan", "results", "evidence"],
|
|
13
|
+
release: ["goNoGo", "rollback"],
|
|
14
|
+
ux_design: ["userFlow", "states", "accessibility"],
|
|
15
|
+
ux_review: ["userFlow", "states", "evidence"],
|
|
16
|
+
docs_review: ["docsUpdated", "audience", "links"],
|
|
17
|
+
architecture_challenge: ["findings", "risk", "recommendation"],
|
|
18
|
+
};
|
|
19
|
+
export function buildHandoffTransitionContract(input) {
|
|
20
|
+
const requiredFields = uniqueStrings([
|
|
21
|
+
...input.fromRole.requiredHandoffFields,
|
|
22
|
+
...(PHASE_REQUIRED_FIELDS[input.phase] ?? []),
|
|
23
|
+
]);
|
|
24
|
+
return {
|
|
25
|
+
fromRole: input.fromRole.id,
|
|
26
|
+
toRole: input.toRole.id,
|
|
27
|
+
phase: input.phase,
|
|
28
|
+
nextPhase: input.nextPhase,
|
|
29
|
+
requiredFields,
|
|
30
|
+
assessments: requiredFields.map((field) => assessRequiredHandoffField(field, input)),
|
|
31
|
+
...((input.enforceRoleContract ?? true)
|
|
32
|
+
? {
|
|
33
|
+
roleContract: evaluateQualityContract({
|
|
34
|
+
role: input.fromRole,
|
|
35
|
+
phase: input.phase,
|
|
36
|
+
nextPhase: input.nextPhase,
|
|
37
|
+
handoff: input.handoff,
|
|
38
|
+
...(input.task ? { task: input.task } : {}),
|
|
39
|
+
...(input.output ? { output: input.output } : {}),
|
|
40
|
+
...(input.handoffContent
|
|
41
|
+
? { handoffContent: input.handoffContent }
|
|
42
|
+
: {}),
|
|
43
|
+
...(input.qualityContracts
|
|
44
|
+
? { qualityContracts: input.qualityContracts }
|
|
45
|
+
: {}),
|
|
46
|
+
}),
|
|
47
|
+
}
|
|
48
|
+
: {}),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function contractHasBlockingGaps(contract) {
|
|
52
|
+
return (contract.assessments.some((assessment) => assessment.status === "gap" &&
|
|
53
|
+
!isAllowedPlanningGap(contract.phase, assessment.field)) || contract.roleContract?.status === "block");
|
|
54
|
+
}
|
|
55
|
+
export function renderHandoffTransitionContract(contract) {
|
|
56
|
+
if (!contract) {
|
|
57
|
+
return [
|
|
58
|
+
"## Transition Guard",
|
|
59
|
+
"- State transition: not recorded",
|
|
60
|
+
"- Required fields: none",
|
|
61
|
+
"- Contract result: not evaluated",
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
return [
|
|
65
|
+
"## Transition Guard",
|
|
66
|
+
`- State transition: ${contract.phase} (${contract.fromRole}) -> ${contract.nextPhase} (${contract.toRole})`,
|
|
67
|
+
`- Required fields: ${contract.requiredFields.join(", ") || "none"}`,
|
|
68
|
+
"- Contract result: evaluated",
|
|
69
|
+
"",
|
|
70
|
+
"## Required Handoff Field Coverage",
|
|
71
|
+
...contract.assessments.map((assessment) => `- ${assessment.field}: ${assessment.status} - ${assessment.detail}`),
|
|
72
|
+
"",
|
|
73
|
+
...renderRoleContract(contract.roleContract),
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
export function summarizeContractGaps(contract) {
|
|
77
|
+
const gaps = contract.assessments.filter((assessment) => assessment.status === "gap");
|
|
78
|
+
if (gaps.length === 0) {
|
|
79
|
+
const roleContractSummary = summarizeRoleContractGaps(contract.roleContract);
|
|
80
|
+
return (roleContractSummary ??
|
|
81
|
+
"All required transition checks were explicitly assessed.");
|
|
82
|
+
}
|
|
83
|
+
const fieldGaps = gaps
|
|
84
|
+
.map((assessment) => `${assessment.field}: ${assessment.detail}`)
|
|
85
|
+
.join("; ");
|
|
86
|
+
const roleContractGaps = summarizeRoleContractGaps(contract.roleContract);
|
|
87
|
+
return [fieldGaps, roleContractGaps].filter(Boolean).join("; ");
|
|
88
|
+
}
|
|
89
|
+
function isAllowedPlanningGap(phase, field) {
|
|
90
|
+
const normalized = normalizeHandoffField(field);
|
|
91
|
+
return ((phase === "qa" && normalized.includes("evidence")) ||
|
|
92
|
+
(phase === "release" && normalized.includes("rollback")));
|
|
93
|
+
}
|
|
94
|
+
function uniqueStrings(values) {
|
|
95
|
+
return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
|
|
96
|
+
}
|
|
97
|
+
function renderRoleContract(roleContract) {
|
|
98
|
+
if (!roleContract)
|
|
99
|
+
return [];
|
|
100
|
+
return [
|
|
101
|
+
"## Role Quality Contract",
|
|
102
|
+
`- Contract: ${roleContract.contract.id}`,
|
|
103
|
+
`- Validation mode: ${roleContract.mode}`,
|
|
104
|
+
`- Result: ${roleContract.status}`,
|
|
105
|
+
`- Transition allowed: ${String(roleContract.transitionAllowed)}`,
|
|
106
|
+
`- Allowed transitions: ${roleContract.allowedTransitions.join(", ")}`,
|
|
107
|
+
`- Return to phase: ${roleContract.returnToPhase ?? "not required"}`,
|
|
108
|
+
`- Human approval required: ${String(roleContract.requiresHumanApproval)}`,
|
|
109
|
+
"",
|
|
110
|
+
"## Role Contract Requirement Coverage",
|
|
111
|
+
...roleContract.assessments.map((assessment) => `- ${assessment.label}: ${assessment.status} - ${assessment.detail}`),
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
function summarizeRoleContractGaps(roleContract) {
|
|
115
|
+
if (!roleContract || roleContract.missingRequirements.length === 0) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
const returnNote = roleContract.returnToPhase
|
|
119
|
+
? `; return to ${roleContract.returnToPhase}`
|
|
120
|
+
: "";
|
|
121
|
+
return `Role contract ${roleContract.contract.id} ${roleContract.status}: missing ${roleContract.missingRequirements.join(", ")}${returnNote}`;
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=workflow-handoff-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-handoff-contract.js","sourceRoot":"","sources":["../src/workflow-handoff-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
2
|
+
import type { AutonomousRun, PhaseOutcome } from "./types.js";
|
|
3
|
+
export interface PhaseTransitionResult {
|
|
4
|
+
handoffArtifact?: string;
|
|
5
|
+
blockedNotes?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function createValidatedPhaseHandoff({ root, run, from, to, outcome, executorProvenance, }: {
|
|
8
|
+
root: string;
|
|
9
|
+
run: AutonomousRun;
|
|
10
|
+
from: AutonomousPhaseDefinition;
|
|
11
|
+
to: AutonomousPhaseDefinition;
|
|
12
|
+
outcome: Extract<PhaseOutcome, {
|
|
13
|
+
kind: "done";
|
|
14
|
+
}>;
|
|
15
|
+
executorProvenance?: string;
|
|
16
|
+
}): Promise<PhaseTransitionResult>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { resolveWorkspaceWritePath } from "./fs-utils.js";
|
|
3
|
+
import { createHandoff, getWorkflowConfig } from "./workflow-services.js";
|
|
4
|
+
import { buildHandoffTransitionContract, contractHasBlockingGaps, summarizeContractGaps, } from "./workflow-handoff-contract.js";
|
|
5
|
+
import { loadWorkspace } from "./workspace.js";
|
|
6
|
+
export async function createValidatedPhaseHandoff({ root, run, from, to, outcome, executorProvenance, }) {
|
|
7
|
+
const workspace = await loadWorkspace(root);
|
|
8
|
+
const task = workspace.tasks.find((candidate) => candidate.id === run.taskId);
|
|
9
|
+
const fromRole = workspace.roles.find((role) => role.id === from.role);
|
|
10
|
+
const toRole = workspace.roles.find((role) => role.id === to.role);
|
|
11
|
+
if (!fromRole || !toRole) {
|
|
12
|
+
throw new Error("handoff transition roles must exist in roles.json");
|
|
13
|
+
}
|
|
14
|
+
const handoffInput = {
|
|
15
|
+
task: run.taskId,
|
|
16
|
+
from: from.role,
|
|
17
|
+
to: to.role,
|
|
18
|
+
changed: outcome.notes,
|
|
19
|
+
behavior: from.summary,
|
|
20
|
+
tests: "See phase task evidence",
|
|
21
|
+
commands: "See phase task evidence",
|
|
22
|
+
};
|
|
23
|
+
const runtimeHandoffContent = executorProvenance
|
|
24
|
+
? await readExecutorHandoffContent(root, executorProvenance)
|
|
25
|
+
: undefined;
|
|
26
|
+
const config = await getWorkflowConfig(root);
|
|
27
|
+
const transitionContract = buildHandoffTransitionContract({
|
|
28
|
+
task,
|
|
29
|
+
fromRole,
|
|
30
|
+
toRole,
|
|
31
|
+
phase: from.phase,
|
|
32
|
+
nextPhase: to.phase,
|
|
33
|
+
output: outcome.output,
|
|
34
|
+
handoff: handoffInput,
|
|
35
|
+
...(runtimeHandoffContent ? { handoffContent: runtimeHandoffContent } : {}),
|
|
36
|
+
...(config.qualityContracts
|
|
37
|
+
? {
|
|
38
|
+
qualityContracts: config.qualityContracts,
|
|
39
|
+
enforceRoleContract: true,
|
|
40
|
+
}
|
|
41
|
+
: { enforceRoleContract: Boolean(runtimeHandoffContent) }),
|
|
42
|
+
});
|
|
43
|
+
if (contractHasBlockingGaps(transitionContract)) {
|
|
44
|
+
return {
|
|
45
|
+
blockedNotes: `Handoff transition blocked: ${summarizeContractGaps(transitionContract)}`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const handoffResult = await createHandoff({
|
|
49
|
+
...handoffInput,
|
|
50
|
+
status: "ready_for_review",
|
|
51
|
+
gaps: summarizeContractGaps(transitionContract),
|
|
52
|
+
risks: transitionContract.assessments
|
|
53
|
+
.filter((assessment) => /risk|split/i.test(assessment.field))
|
|
54
|
+
.map((assessment) => `${assessment.field}: ${assessment.detail}`)
|
|
55
|
+
.join("; "),
|
|
56
|
+
transitionContract,
|
|
57
|
+
...(executorProvenance ? { executorProvenance } : {}),
|
|
58
|
+
}, root);
|
|
59
|
+
return { handoffArtifact: handoffResult.artifact };
|
|
60
|
+
}
|
|
61
|
+
async function readExecutorHandoffContent(root, executorProvenance) {
|
|
62
|
+
const artifact = executorProvenance
|
|
63
|
+
.split(";")
|
|
64
|
+
.map((part) => part.trim())
|
|
65
|
+
.find((part) => part.startsWith("artifact="))
|
|
66
|
+
?.slice("artifact=".length);
|
|
67
|
+
if (!artifact)
|
|
68
|
+
return undefined;
|
|
69
|
+
try {
|
|
70
|
+
return await readFile(resolveWorkspaceWritePath(root, artifact), "utf8");
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=workflow-phase-transition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-phase-transition.js","sourceRoot":"","sources":["../src/workflow-phase-transition.ts"],"names":[],"mappings":"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"}
|