@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.
Files changed (131) hide show
  1. package/AGENTS.md +12 -2
  2. package/CHANGELOG.md +41 -0
  3. package/CLAUDE.md +13 -2
  4. package/dist/acceptance-criteria-quality.d.ts +12 -0
  5. package/dist/acceptance-criteria-quality.js +137 -0
  6. package/dist/acceptance-criteria-quality.js.map +1 -0
  7. package/dist/architecture-debt-inventory.d.ts +31 -0
  8. package/dist/architecture-debt-inventory.js +200 -0
  9. package/dist/architecture-debt-inventory.js.map +1 -0
  10. package/dist/architecture-debt-report.d.ts +2 -0
  11. package/dist/architecture-debt-report.js +28 -0
  12. package/dist/architecture-debt-report.js.map +1 -0
  13. package/dist/autonomous-phase-lifecycle.d.ts +5 -1
  14. package/dist/autonomous-phase-lifecycle.js +87 -17
  15. package/dist/autonomous-phase-lifecycle.js.map +1 -1
  16. package/dist/cli-payloads.d.ts +4 -0
  17. package/dist/cli-payloads.js +24 -0
  18. package/dist/cli-payloads.js.map +1 -0
  19. package/dist/cli.js +4 -446
  20. package/dist/cli.js.map +1 -1
  21. package/dist/command-manifest.js +3 -1
  22. package/dist/command-manifest.js.map +1 -1
  23. package/dist/command-route-utils.d.ts +18 -0
  24. package/dist/command-route-utils.js +18 -0
  25. package/dist/command-route-utils.js.map +1 -0
  26. package/dist/command-routes-integrations.d.ts +2 -0
  27. package/dist/command-routes-integrations.js +82 -0
  28. package/dist/command-routes-integrations.js.map +1 -0
  29. package/dist/command-routes.d.ts +2 -0
  30. package/dist/command-routes.js +175 -0
  31. package/dist/command-routes.js.map +1 -0
  32. package/dist/commands.d.ts +1 -1
  33. package/dist/commands.js +16 -3
  34. package/dist/commands.js.map +1 -1
  35. package/dist/github.js +22 -7
  36. package/dist/github.js.map +1 -1
  37. package/dist/metrics-commands.js +69 -17
  38. package/dist/metrics-commands.js.map +1 -1
  39. package/dist/phase-executor.js +5 -169
  40. package/dist/phase-executor.js.map +1 -1
  41. package/dist/phase-playbooks.js +17 -0
  42. package/dist/phase-playbooks.js.map +1 -1
  43. package/dist/qa-e2e-artifacts.d.ts +7 -0
  44. package/dist/qa-e2e-artifacts.js +225 -0
  45. package/dist/qa-e2e-artifacts.js.map +1 -0
  46. package/dist/quality-contracts.d.ts +83 -0
  47. package/dist/quality-contracts.js +463 -0
  48. package/dist/quality-contracts.js.map +1 -0
  49. package/dist/refresh-generated.js +87 -45
  50. package/dist/refresh-generated.js.map +1 -1
  51. package/dist/runtime-bootstrap-targets.d.ts +15 -0
  52. package/dist/runtime-bootstrap-targets.js +68 -0
  53. package/dist/runtime-bootstrap-targets.js.map +1 -0
  54. package/dist/runtime-bootstrap.js +3 -0
  55. package/dist/runtime-bootstrap.js.map +1 -1
  56. package/dist/runtime-commands.d.ts +2 -0
  57. package/dist/runtime-commands.js +187 -2
  58. package/dist/runtime-commands.js.map +1 -1
  59. package/dist/runtime-context-manifest.d.ts +27 -0
  60. package/dist/runtime-context-manifest.js +151 -0
  61. package/dist/runtime-context-manifest.js.map +1 -0
  62. package/dist/runtime-execution-renderer.d.ts +3 -1
  63. package/dist/runtime-execution-renderer.js +17 -53
  64. package/dist/runtime-execution-renderer.js.map +1 -1
  65. package/dist/runtime-execution.d.ts +2 -1
  66. package/dist/runtime-execution.js +166 -4
  67. package/dist/runtime-execution.js.map +1 -1
  68. package/dist/runtime-guardrails.js +9 -1
  69. package/dist/runtime-guardrails.js.map +1 -1
  70. package/dist/runtime-lifecycle-watch.d.ts +93 -0
  71. package/dist/runtime-lifecycle-watch.js +391 -0
  72. package/dist/runtime-lifecycle-watch.js.map +1 -0
  73. package/dist/runtime-parent-actions.d.ts +7 -2
  74. package/dist/runtime-parent-actions.js +132 -1
  75. package/dist/runtime-parent-actions.js.map +1 -1
  76. package/dist/runtime-renderer-lines.d.ts +5 -0
  77. package/dist/runtime-renderer-lines.js +58 -0
  78. package/dist/runtime-renderer-lines.js.map +1 -0
  79. package/dist/runtime-spawn-bridge.js +40 -10
  80. package/dist/runtime-spawn-bridge.js.map +1 -1
  81. package/dist/runtime-spawn-quality.d.ts +2 -0
  82. package/dist/runtime-spawn-quality.js +11 -0
  83. package/dist/runtime-spawn-quality.js.map +1 -0
  84. package/dist/sonar-insights.d.ts +1 -0
  85. package/dist/sonar-insights.js +6 -2
  86. package/dist/sonar-insights.js.map +1 -1
  87. package/dist/types/model-config.d.ts +6 -0
  88. package/dist/types/runtime.d.ts +26 -2
  89. package/dist/types/tasks.d.ts +12 -0
  90. package/dist/types.d.ts +1 -1
  91. package/dist/types.js.map +1 -1
  92. package/dist/web-api.js +8 -0
  93. package/dist/web-api.js.map +1 -1
  94. package/dist/web-console/assets/index-DXbrxR_d.js +11 -0
  95. package/dist/web-console/index.html +1 -1
  96. package/dist/workflow-handoff-assessment.d.ts +3 -0
  97. package/dist/workflow-handoff-assessment.js +246 -0
  98. package/dist/workflow-handoff-assessment.js.map +1 -0
  99. package/dist/workflow-handoff-contract.d.ts +32 -0
  100. package/dist/workflow-handoff-contract.js +123 -0
  101. package/dist/workflow-handoff-contract.js.map +1 -0
  102. package/dist/workflow-phase-transition.d.ts +16 -0
  103. package/dist/workflow-phase-transition.js +76 -0
  104. package/dist/workflow-phase-transition.js.map +1 -0
  105. package/dist/workflow-run-commands.js +47 -12
  106. package/dist/workflow-run-commands.js.map +1 -1
  107. package/dist/workflow-services.js +57 -27
  108. package/dist/workflow-services.js.map +1 -1
  109. package/dist/workspace-init-artifacts.d.ts +17 -0
  110. package/dist/workspace-init-artifacts.js +81 -0
  111. package/dist/workspace-init-artifacts.js.map +1 -0
  112. package/dist/workspace-runtime-bootstrap.d.ts +12 -0
  113. package/dist/workspace-runtime-bootstrap.js +64 -0
  114. package/dist/workspace-runtime-bootstrap.js.map +1 -0
  115. package/dist/workspace.d.ts +5 -2
  116. package/dist/workspace.js +43 -145
  117. package/dist/workspace.js.map +1 -1
  118. package/docs/architecture-debt-inventory.md +25 -0
  119. package/docs/autonomous-workflow.md +7 -0
  120. package/docs/e2e-test-batteries.md +106 -0
  121. package/docs/orchestra-mvp.md +8 -0
  122. package/docs/release-test-matrix.md +7 -0
  123. package/docs/runtime-adapters.md +86 -9
  124. package/docs/site-manifest.json +2 -0
  125. package/docs/sonar-quality-gates.md +133 -11
  126. package/package.json +5 -1
  127. package/rules/delivery-quality-gates.mdc +6 -0
  128. package/rules/devops-tooling.mdc +1 -0
  129. package/rules/security-guardrails.mdc +3 -0
  130. package/rules/testing-discipline.mdc +9 -0
  131. 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-CgSKcay8.js"></script>
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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"}