@jterrats/open-orchestra 0.5.5 → 1.0.1
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 +9 -8
- package/CLAUDE.md +13 -11
- package/README.md +78 -11
- package/dist/assets/web-console.js +203 -36
- package/dist/automation-evidence.d.ts +23 -0
- package/dist/automation-evidence.js +97 -0
- package/dist/automation-evidence.js.map +1 -0
- package/dist/autonomous-run-state.d.ts +4 -1
- package/dist/autonomous-run-state.js +8 -2
- package/dist/autonomous-run-state.js.map +1 -1
- package/dist/autonomous-run-store.d.ts +3 -1
- package/dist/autonomous-run-store.js +9 -3
- package/dist/autonomous-run-store.js.map +1 -1
- package/dist/autonomous-workflow-constants.js +5 -1
- package/dist/autonomous-workflow-constants.js.map +1 -1
- package/dist/benchmark.d.ts +4 -1
- package/dist/benchmark.js +140 -19
- package/dist/benchmark.js.map +1 -1
- package/dist/cli.js +88 -2
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.js +5 -19
- package/dist/collaboration-flows.js.map +1 -1
- package/dist/collection-utils.d.ts +3 -0
- package/dist/collection-utils.js +10 -0
- package/dist/collection-utils.js.map +1 -0
- package/dist/command-manifest.d.ts +12 -1
- package/dist/command-manifest.js +218 -10
- package/dist/command-manifest.js.map +1 -1
- package/dist/commands.d.ts +14 -6
- package/dist/commands.js +78 -28
- package/dist/commands.js.map +1 -1
- package/dist/config-migrations.d.ts +24 -0
- package/dist/config-migrations.js +102 -0
- package/dist/config-migrations.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -1
- package/dist/cursor-canvas.d.ts +20 -0
- package/dist/cursor-canvas.js +119 -0
- package/dist/cursor-canvas.js.map +1 -0
- package/dist/dashboard-commands.d.ts +2 -0
- package/dist/dashboard-commands.js +14 -0
- package/dist/dashboard-commands.js.map +1 -0
- package/dist/defaults.d.ts +13 -0
- package/dist/defaults.js +13 -0
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.js +23 -8
- package/dist/delegation-decision.js.map +1 -1
- package/dist/delivery-commands.js +5 -0
- package/dist/delivery-commands.js.map +1 -1
- package/dist/delivery-dashboard-charts.d.ts +4 -0
- package/dist/delivery-dashboard-charts.js +156 -0
- package/dist/delivery-dashboard-charts.js.map +1 -0
- package/dist/delivery-dashboard-html.d.ts +2 -0
- package/dist/delivery-dashboard-html.js +115 -0
- package/dist/delivery-dashboard-html.js.map +1 -0
- package/dist/delivery-dashboard-types.d.ts +78 -0
- package/dist/delivery-dashboard-types.js +2 -0
- package/dist/delivery-dashboard-types.js.map +1 -0
- package/dist/delivery-dashboard.d.ts +8 -0
- package/dist/delivery-dashboard.js +124 -0
- package/dist/delivery-dashboard.js.map +1 -0
- package/dist/doc-sync.d.ts +25 -0
- package/dist/doc-sync.js +79 -0
- package/dist/doc-sync.js.map +1 -0
- package/dist/effort-classification.d.ts +7 -0
- package/dist/effort-classification.js +72 -0
- package/dist/effort-classification.js.map +1 -0
- package/dist/extension-commands.d.ts +3 -0
- package/dist/extension-commands.js +40 -0
- package/dist/extension-commands.js.map +1 -0
- package/dist/extensions.d.ts +22 -0
- package/dist/extensions.js +126 -0
- package/dist/extensions.js.map +1 -0
- package/dist/gemini-provider.d.ts +3 -6
- package/dist/gemini-provider.js +8 -17
- package/dist/gemini-provider.js.map +1 -1
- package/dist/github.d.ts +2 -0
- package/dist/github.js +15 -3
- package/dist/github.js.map +1 -1
- package/dist/health-checks.js +51 -0
- package/dist/health-checks.js.map +1 -1
- package/dist/lucid-story-map.d.ts +73 -0
- package/dist/lucid-story-map.js +112 -0
- package/dist/lucid-story-map.js.map +1 -0
- package/dist/mcp-integrations.d.ts +19 -0
- package/dist/mcp-integrations.js +58 -0
- package/dist/mcp-integrations.js.map +1 -0
- package/dist/mcp-tool-adapter.d.ts +21 -0
- package/dist/mcp-tool-adapter.js +56 -0
- package/dist/mcp-tool-adapter.js.map +1 -0
- package/dist/metrics-commands.js +47 -13
- package/dist/metrics-commands.js.map +1 -1
- package/dist/model-commands.d.ts +5 -0
- package/dist/model-commands.js +95 -1
- package/dist/model-commands.js.map +1 -1
- package/dist/model-providers.d.ts +5 -12
- package/dist/model-providers.js +30 -43
- package/dist/model-providers.js.map +1 -1
- package/dist/network-policy.d.ts +2 -0
- package/dist/network-policy.js +6 -0
- package/dist/network-policy.js.map +1 -0
- package/dist/ollama-provider.d.ts +3 -6
- package/dist/ollama-provider.js +7 -16
- package/dist/ollama-provider.js.map +1 -1
- package/dist/package-update-check.d.ts +19 -0
- package/dist/package-update-check.js +24 -0
- package/dist/package-update-check.js.map +1 -1
- package/dist/phase-executor.d.ts +1 -0
- package/dist/phase-executor.js +401 -9
- package/dist/phase-executor.js.map +1 -1
- package/dist/phase-playbooks.d.ts +18 -1
- package/dist/phase-playbooks.js +146 -2
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/planning-commands.d.ts +1 -0
- package/dist/planning-commands.js +36 -36
- package/dist/planning-commands.js.map +1 -1
- package/dist/policy-commands.d.ts +2 -0
- package/dist/policy-commands.js +29 -0
- package/dist/policy-commands.js.map +1 -0
- package/dist/policy-defaults.d.ts +2 -0
- package/dist/policy-defaults.js +42 -0
- package/dist/policy-defaults.js.map +1 -0
- package/dist/policy.d.ts +20 -0
- package/dist/policy.js +155 -0
- package/dist/policy.js.map +1 -0
- package/dist/project-detection.js +9 -7
- package/dist/project-detection.js.map +1 -1
- package/dist/prompt-registry-update.d.ts +2 -0
- package/dist/prompt-registry-update.js +5 -1
- package/dist/prompt-registry-update.js.map +1 -1
- package/dist/prompt-registry-validation.d.ts +3 -0
- package/dist/prompt-registry-validation.js +61 -21
- package/dist/prompt-registry-validation.js.map +1 -1
- package/dist/provider-utils.d.ts +11 -0
- package/dist/provider-utils.js +14 -0
- package/dist/provider-utils.js.map +1 -1
- package/dist/qa-commands.d.ts +2 -0
- package/dist/qa-commands.js +18 -0
- package/dist/qa-commands.js.map +1 -0
- package/dist/qa-coverage.d.ts +24 -0
- package/dist/qa-coverage.js +189 -0
- package/dist/qa-coverage.js.map +1 -0
- package/dist/qa-readiness.d.ts +5 -0
- package/dist/qa-readiness.js +26 -0
- package/dist/qa-readiness.js.map +1 -0
- package/dist/refresh-generated.d.ts +32 -0
- package/dist/refresh-generated.js +180 -0
- package/dist/refresh-generated.js.map +1 -0
- package/dist/release-candidate.d.ts +9 -1
- package/dist/release-candidate.js +52 -1
- package/dist/release-candidate.js.map +1 -1
- package/dist/release-commands.js +161 -8
- package/dist/release-commands.js.map +1 -1
- package/dist/release-readiness.d.ts +33 -0
- package/dist/release-readiness.js +187 -3
- package/dist/release-readiness.js.map +1 -1
- package/dist/runtime-adapters.d.ts +2 -1
- package/dist/runtime-adapters.js +16 -0
- package/dist/runtime-adapters.js.map +1 -1
- package/dist/runtime-bootstrap.js +1 -1
- package/dist/runtime-bootstrap.js.map +1 -1
- package/dist/runtime-commands.d.ts +2 -0
- package/dist/runtime-commands.js +85 -3
- package/dist/runtime-commands.js.map +1 -1
- package/dist/runtime-execution-adapters.js +40 -0
- package/dist/runtime-execution-adapters.js.map +1 -1
- package/dist/runtime-execution-renderer.d.ts +3 -2
- package/dist/runtime-execution-renderer.js +46 -8
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.d.ts +8 -2
- package/dist/runtime-execution.js +109 -11
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-guardrails.d.ts +26 -0
- package/dist/runtime-guardrails.js +168 -0
- package/dist/runtime-guardrails.js.map +1 -0
- package/dist/setup-agents-import.js +5 -3
- package/dist/setup-agents-import.js.map +1 -1
- package/dist/skills-catalog.js +1 -0
- package/dist/skills-catalog.js.map +1 -1
- package/dist/skills-commands.d.ts +5 -0
- package/dist/skills-commands.js +79 -2
- package/dist/skills-commands.js.map +1 -1
- package/dist/skills-memory.d.ts +36 -2
- package/dist/skills-memory.js +165 -6
- package/dist/skills-memory.js.map +1 -1
- package/dist/skills-planning.js +9 -22
- package/dist/skills-planning.js.map +1 -1
- package/dist/skills-render.js +2 -4
- package/dist/skills-render.js.map +1 -1
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/skills.js.map +1 -1
- package/dist/sprint-commands.js +2 -1
- package/dist/sprint-commands.js.map +1 -1
- package/dist/subagent-protocol.js +3 -5
- package/dist/subagent-protocol.js.map +1 -1
- package/dist/support-commands.d.ts +2 -0
- package/dist/support-commands.js +18 -0
- package/dist/support-commands.js.map +1 -0
- package/dist/support-diagnostics.d.ts +49 -0
- package/dist/support-diagnostics.js +86 -0
- package/dist/support-diagnostics.js.map +1 -0
- package/dist/task-graph-commands.js +6 -14
- package/dist/task-graph-commands.js.map +1 -1
- package/dist/task-text.d.ts +8 -0
- package/dist/task-text.js +18 -0
- package/dist/task-text.js.map +1 -0
- package/dist/telemetry-redaction.js +8 -1
- package/dist/telemetry-redaction.js.map +1 -1
- package/dist/tool-commands.d.ts +3 -0
- package/dist/tool-commands.js +62 -0
- package/dist/tool-commands.js.map +1 -1
- package/dist/tracker-adapters.d.ts +71 -0
- package/dist/tracker-adapters.js +186 -0
- package/dist/tracker-adapters.js.map +1 -0
- package/dist/tracker-commands.d.ts +2 -0
- package/dist/tracker-commands.js +119 -0
- package/dist/tracker-commands.js.map +1 -0
- package/dist/types/metrics.d.ts +25 -1
- package/dist/types/model-config.d.ts +51 -4
- package/dist/types/runtime.d.ts +83 -0
- package/dist/types/skills.d.ts +2 -0
- package/dist/types/tasks.d.ts +10 -0
- package/dist/types/workflow-run.d.ts +35 -0
- package/dist/types.d.ts +12 -4
- package/dist/types.js.map +1 -1
- package/dist/upgrade-commands.js +13 -4
- package/dist/upgrade-commands.js.map +1 -1
- package/dist/validation.js +2 -2
- package/dist/validation.js.map +1 -1
- package/dist/visual-validation.d.ts +81 -0
- package/dist/visual-validation.js +290 -0
- package/dist/visual-validation.js.map +1 -0
- package/dist/web-action-security.d.ts +11 -0
- package/dist/web-action-security.js +45 -0
- package/dist/web-action-security.js.map +1 -0
- package/dist/web-api-read-routes.js +115 -3
- package/dist/web-api-read-routes.js.map +1 -1
- package/dist/web-api.js +507 -5
- package/dist/web-api.js.map +1 -1
- package/dist/web-artifacts.d.ts +55 -0
- package/dist/web-artifacts.js +222 -0
- package/dist/web-artifacts.js.map +1 -0
- package/dist/web-console/assets/index-C9lx-V42.css +1 -0
- package/dist/web-console/assets/index-M3S0g1GK.js +11 -0
- package/dist/web-console/index.html +13 -0
- package/dist/web-console.js +9 -3
- package/dist/web-console.js.map +1 -1
- package/dist/web-recovery.d.ts +30 -0
- package/dist/web-recovery.js +163 -0
- package/dist/web-recovery.js.map +1 -0
- package/dist/web-workflow-progress.d.ts +41 -0
- package/dist/web-workflow-progress.js +114 -0
- package/dist/web-workflow-progress.js.map +1 -0
- package/dist/workflow-approval-service.d.ts +2 -1
- package/dist/workflow-approval-service.js +83 -4
- package/dist/workflow-approval-service.js.map +1 -1
- package/dist/workflow-approval-utils.js +13 -3
- package/dist/workflow-approval-utils.js.map +1 -1
- package/dist/workflow-event-query.d.ts +2 -0
- package/dist/workflow-event-query.js +6 -0
- package/dist/workflow-event-query.js.map +1 -0
- package/dist/workflow-evidence-service.js +18 -9
- package/dist/workflow-evidence-service.js.map +1 -1
- package/dist/workflow-gates.d.ts +2 -0
- package/dist/workflow-gates.js +103 -0
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-markdown.d.ts +6 -0
- package/dist/workflow-markdown.js +25 -0
- package/dist/workflow-markdown.js.map +1 -0
- package/dist/workflow-phase-planner.d.ts +19 -0
- package/dist/workflow-phase-planner.js +133 -0
- package/dist/workflow-phase-planner.js.map +1 -0
- package/dist/workflow-run-commands.d.ts +1 -0
- package/dist/workflow-run-commands.js +247 -20
- package/dist/workflow-run-commands.js.map +1 -1
- package/dist/workflow-services.d.ts +21 -12
- package/dist/workflow-services.js +376 -260
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-task-service.d.ts +11 -0
- package/dist/workflow-task-service.js +242 -0
- package/dist/workflow-task-service.js.map +1 -0
- package/dist/workflow-templates.js +2 -14
- package/dist/workflow-templates.js.map +1 -1
- package/dist/workspace-validator.js +133 -5
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.js +10 -2
- package/dist/workspace.js.map +1 -1
- package/docs/adoption-guide.md +147 -0
- package/docs/autonomous-workflow.md +146 -28
- package/docs/benchmark.md +17 -9
- package/docs/command-contracts.md +18 -1
- package/docs/core-command-surface.md +62 -13
- package/docs/end-to-end-demo.md +1 -0
- package/docs/extension-contracts.md +83 -0
- package/docs/orchestra-mvp.md +86 -3
- package/docs/persona-workflows.md +32 -0
- package/docs/release-test-matrix.md +42 -0
- package/docs/runtime-adapters.md +113 -0
- package/docs/runtime-llm-flow.md +13 -0
- package/docs/setup-agents-applicability-review.md +173 -0
- package/docs/skill-loading-strategy.md +1 -0
- package/docs/source-of-truth-and-agent-learning.md +14 -0
- package/docs/traceability-flow.md +5 -1
- package/docs/tracker-adapter-contract.md +10 -1
- package/docs/web-console-qa.md +35 -0
- package/package.json +12 -6
- package/rules/development-engineering.mdc +66 -0
- package/skills/doc-sync/SKILL.md +2 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EvidenceInput } from "./types.js";
|
|
2
|
+
export type AutomationSurface = "web" | "api" | "cli" | "integration";
|
|
3
|
+
export interface AutomationEvidenceInput {
|
|
4
|
+
surface?: AutomationSurface;
|
|
5
|
+
assertions?: string;
|
|
6
|
+
externalValidation?: string;
|
|
7
|
+
deferredOwner?: string;
|
|
8
|
+
deferredRationale?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AutomationEvidenceQuality {
|
|
11
|
+
automated: boolean;
|
|
12
|
+
surface?: AutomationSurface;
|
|
13
|
+
assertions?: string;
|
|
14
|
+
externalValidation?: string;
|
|
15
|
+
deferredOwner?: string;
|
|
16
|
+
deferredRationale?: string;
|
|
17
|
+
observableOutcome: boolean;
|
|
18
|
+
deferredExternalValidation: boolean;
|
|
19
|
+
gaps: string[];
|
|
20
|
+
}
|
|
21
|
+
export declare function evaluateAutomationEvidence(input: EvidenceInput): AutomationEvidenceQuality;
|
|
22
|
+
export declare function assertAutomationEvidenceQuality(input: EvidenceInput): void;
|
|
23
|
+
export declare function automationEvidenceLines(quality: AutomationEvidenceQuality): string[];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const SURFACES = new Set([
|
|
2
|
+
"web",
|
|
3
|
+
"api",
|
|
4
|
+
"cli",
|
|
5
|
+
"integration",
|
|
6
|
+
]);
|
|
7
|
+
export function evaluateAutomationEvidence(input) {
|
|
8
|
+
const surface = parseSurface(input.surface);
|
|
9
|
+
const assertions = stringValue(input.assertions);
|
|
10
|
+
const externalValidation = stringValue(input.externalValidation);
|
|
11
|
+
const deferredOwner = stringValue(input.deferredOwner);
|
|
12
|
+
const deferredRationale = stringValue(input.deferredRationale);
|
|
13
|
+
if (!surface) {
|
|
14
|
+
return {
|
|
15
|
+
automated: false,
|
|
16
|
+
observableOutcome: false,
|
|
17
|
+
deferredExternalValidation: false,
|
|
18
|
+
gaps: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
const gaps = [
|
|
22
|
+
...assertionGaps(surface, assertions),
|
|
23
|
+
...integrationGaps(surface, externalValidation, deferredOwner, deferredRationale),
|
|
24
|
+
];
|
|
25
|
+
return {
|
|
26
|
+
automated: true,
|
|
27
|
+
surface,
|
|
28
|
+
...(assertions ? { assertions } : {}),
|
|
29
|
+
...(externalValidation ? { externalValidation } : {}),
|
|
30
|
+
...(deferredOwner ? { deferredOwner } : {}),
|
|
31
|
+
...(deferredRationale ? { deferredRationale } : {}),
|
|
32
|
+
observableOutcome: gaps.length === 0,
|
|
33
|
+
deferredExternalValidation: Boolean(deferredOwner && deferredRationale),
|
|
34
|
+
gaps,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function assertAutomationEvidenceQuality(input) {
|
|
38
|
+
const quality = evaluateAutomationEvidence(input);
|
|
39
|
+
if (!quality.automated || quality.gaps.length === 0) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`automation evidence is missing observable outcome validation: ${quality.gaps.join("; ")}`);
|
|
43
|
+
}
|
|
44
|
+
export function automationEvidenceLines(quality) {
|
|
45
|
+
if (!quality.automated) {
|
|
46
|
+
return ["- Automation surface: not declared"];
|
|
47
|
+
}
|
|
48
|
+
return [
|
|
49
|
+
`- Automation surface: ${quality.surface}`,
|
|
50
|
+
`- Assertions: ${quality.assertions ?? "not provided"}`,
|
|
51
|
+
`- External validation: ${quality.externalValidation ?? "not provided"}`,
|
|
52
|
+
`- Deferred owner: ${quality.deferredOwner ?? "not applicable"}`,
|
|
53
|
+
`- Deferred rationale: ${quality.deferredRationale ?? "not applicable"}`,
|
|
54
|
+
`- Observable outcome: ${quality.observableOutcome ? "yes" : "no"}`,
|
|
55
|
+
`- Gaps: ${quality.gaps.length === 0 ? "none" : quality.gaps.join("; ")}`,
|
|
56
|
+
];
|
|
57
|
+
}
|
|
58
|
+
function assertionGaps(surface, assertions) {
|
|
59
|
+
if (assertions)
|
|
60
|
+
return [];
|
|
61
|
+
if (surface === "web") {
|
|
62
|
+
return ["web automation must assert visible user-facing state"];
|
|
63
|
+
}
|
|
64
|
+
if (surface === "api") {
|
|
65
|
+
return ["api automation must assert response body, state, or side effects"];
|
|
66
|
+
}
|
|
67
|
+
if (surface === "cli") {
|
|
68
|
+
return [
|
|
69
|
+
"cli automation must assert stdout, stderr, files, events, or state",
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
return ["integration automation must assert the triggered flow outcome"];
|
|
73
|
+
}
|
|
74
|
+
function integrationGaps(surface, externalValidation, deferredOwner, deferredRationale) {
|
|
75
|
+
if (surface !== "integration")
|
|
76
|
+
return [];
|
|
77
|
+
if (externalValidation)
|
|
78
|
+
return [];
|
|
79
|
+
if (deferredOwner && deferredRationale)
|
|
80
|
+
return [];
|
|
81
|
+
return [
|
|
82
|
+
"integration automation must validate sandbox/mock/contract/webhook/event/log or defer with owner and rationale",
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
function parseSurface(value) {
|
|
86
|
+
const text = stringValue(value);
|
|
87
|
+
if (!text)
|
|
88
|
+
return undefined;
|
|
89
|
+
if (!SURFACES.has(text)) {
|
|
90
|
+
throw new Error("automation surface must be one of: web, api, cli, integration");
|
|
91
|
+
}
|
|
92
|
+
return text;
|
|
93
|
+
}
|
|
94
|
+
function stringValue(value) {
|
|
95
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=automation-evidence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automation-evidence.js","sourceRoot":"","sources":["../src/automation-evidence.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
2
2
|
import type { AutonomousRun } from "./types.js";
|
|
3
|
+
import type { ProviderFailureDetail } from "./types.js";
|
|
3
4
|
export declare function cancelRun(root: string, runId: string, reason?: string): Promise<AutonomousRun>;
|
|
4
|
-
export declare function markRunFailed(root: string, run: AutonomousRun, reason: string, failedPhase?: string
|
|
5
|
+
export declare function markRunFailed(root: string, run: AutonomousRun, reason: string, failedPhase?: string, diagnostics?: {
|
|
6
|
+
providerFailures?: ProviderFailureDetail[];
|
|
7
|
+
}): Promise<AutonomousRun>;
|
|
5
8
|
export declare function markRunDone(root: string, run: AutonomousRun): Promise<AutonomousRun>;
|
|
6
9
|
export declare function resumePhaseIndex(run: AutonomousRun, sequence?: AutonomousPhaseDefinition[]): number;
|
|
7
10
|
export declare function suspendPhaseForClarification(root: string, run: AutonomousRun, phaseIndex: number, sequence?: AutonomousPhaseDefinition[]): Promise<AutonomousRun>;
|
|
@@ -42,7 +42,7 @@ export async function cancelRun(root, runId, reason = "Workflow run canceled") {
|
|
|
42
42
|
}
|
|
43
43
|
return updated;
|
|
44
44
|
}
|
|
45
|
-
export async function markRunFailed(root, run, reason, failedPhase) {
|
|
45
|
+
export async function markRunFailed(root, run, reason, failedPhase, diagnostics = {}) {
|
|
46
46
|
const now = new Date().toISOString();
|
|
47
47
|
const updated = {
|
|
48
48
|
...run,
|
|
@@ -63,7 +63,13 @@ export async function markRunFailed(root, run, reason, failedPhase) {
|
|
|
63
63
|
taskId: run.taskId,
|
|
64
64
|
actor: "parent",
|
|
65
65
|
summary: reason,
|
|
66
|
-
metadata: {
|
|
66
|
+
metadata: {
|
|
67
|
+
runId: run.id,
|
|
68
|
+
...(diagnostics.providerFailures &&
|
|
69
|
+
diagnostics.providerFailures.length > 0
|
|
70
|
+
? { providerFailures: diagnostics.providerFailures }
|
|
71
|
+
: {}),
|
|
72
|
+
},
|
|
67
73
|
});
|
|
68
74
|
await notifyWorkflowLifecycle({
|
|
69
75
|
root,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomous-run-state.js","sourceRoot":"","sources":["../src/autonomous-run-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"autonomous-run-state.js","sourceRoot":"","sources":["../src/autonomous-run-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import type { AutonomousGateMode, AutonomousRun } from "./types.js";
|
|
1
|
+
import type { AutonomousGateMode, AutonomousRun, WorkflowRunMode } from "./types.js";
|
|
2
2
|
import type { AutonomousPhaseDefinition } from "./autonomous-workflow-constants.js";
|
|
3
3
|
export declare const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
|
|
4
4
|
export declare function autonomousRunsPath(root: string): string;
|
|
5
5
|
export type AutonomousRunOptions = {
|
|
6
6
|
taskId: string;
|
|
7
7
|
gates: AutonomousGateMode;
|
|
8
|
+
mode?: WorkflowRunMode;
|
|
8
9
|
maxIterations: number;
|
|
9
10
|
phaseSequence?: string[];
|
|
11
|
+
phaseDefinitions?: AutonomousPhaseDefinition[];
|
|
10
12
|
skippedPhases?: AutonomousPhaseDefinition[];
|
|
11
13
|
};
|
|
12
14
|
export declare function createAutonomousRun(root: string, opts: AutonomousRunOptions): Promise<AutonomousRun>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import {
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import { ensureDir, resolveWorkflowPath } from "./fs-utils.js";
|
|
4
|
+
import { appendJsonLine, ensureDir, resolveWorkflowPath } from "./fs-utils.js";
|
|
5
5
|
import { appendEvent } from "./workspace.js";
|
|
6
6
|
export const AUTONOMOUS_RUNS_FILE = "workflow-runs.jsonl";
|
|
7
7
|
export function autonomousRunsPath(root) {
|
|
@@ -26,8 +26,12 @@ export async function createAutonomousRun(root, opts) {
|
|
|
26
26
|
id,
|
|
27
27
|
taskId: opts.taskId,
|
|
28
28
|
gates: opts.gates,
|
|
29
|
+
...(opts.mode ? { mode: opts.mode } : {}),
|
|
29
30
|
maxIterations: opts.maxIterations,
|
|
30
31
|
...(opts.phaseSequence ? { phaseSequence: opts.phaseSequence } : {}),
|
|
32
|
+
...(opts.phaseDefinitions
|
|
33
|
+
? { phaseDefinitions: opts.phaseDefinitions }
|
|
34
|
+
: {}),
|
|
31
35
|
qaIterations: 0,
|
|
32
36
|
phases: skippedPhases,
|
|
33
37
|
status: "running",
|
|
@@ -43,8 +47,10 @@ export async function createAutonomousRun(root, opts) {
|
|
|
43
47
|
metadata: {
|
|
44
48
|
runId: run.id,
|
|
45
49
|
gates: opts.gates,
|
|
50
|
+
mode: opts.mode ?? "new",
|
|
46
51
|
maxIterations: opts.maxIterations,
|
|
47
52
|
phaseSequence: opts.phaseSequence,
|
|
53
|
+
phaseDefinitions: opts.phaseDefinitions,
|
|
48
54
|
skippedPhases: opts.skippedPhases?.map((phase) => phase.phase) ?? [],
|
|
49
55
|
},
|
|
50
56
|
});
|
|
@@ -70,7 +76,7 @@ export async function persistRun(root, run) {
|
|
|
70
76
|
if (current?.status === "canceled" && run.status !== "canceled") {
|
|
71
77
|
return;
|
|
72
78
|
}
|
|
73
|
-
await
|
|
79
|
+
await appendJsonLine(file, run);
|
|
74
80
|
}
|
|
75
81
|
async function latestRuns(root) {
|
|
76
82
|
const file = autonomousRunsPath(root);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomous-run-store.js","sourceRoot":"","sources":["../src/autonomous-run-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"autonomous-run-store.js","sourceRoot":"","sources":["../src/autonomous-run-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,5 +32,9 @@ export const AUTONOMOUS_PHASE_SEQUENCE = [
|
|
|
32
32
|
},
|
|
33
33
|
];
|
|
34
34
|
// Gate transitions that require human approval in 'phase' mode.
|
|
35
|
-
export const PHASE_GATES = new Set([
|
|
35
|
+
export const PHASE_GATES = new Set([
|
|
36
|
+
"po→architect",
|
|
37
|
+
"architect→architecture_challenge",
|
|
38
|
+
"qa→release",
|
|
39
|
+
]);
|
|
36
40
|
//# sourceMappingURL=autonomous-workflow-constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomous-workflow-constants.js","sourceRoot":"","sources":["../src/autonomous-workflow-constants.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAIjC;IACH;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,sDAAsD;KAChE;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,2DAA2D;KACrE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,0DAA0D;KACpE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,4CAA4C;KACtD;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,yDAAyD;KACnE;IACD;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,8CAA8C;KACxD;CACF,CAAC;AAKF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,
|
|
1
|
+
{"version":3,"file":"autonomous-workflow-constants.js","sourceRoot":"","sources":["../src/autonomous-workflow-constants.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,CAAC,MAAM,yBAAyB,GAIjC;IACH;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,sDAAsD;KAChE;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,2DAA2D;KACrE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,0DAA0D;KACpE;IACD;QACE,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,4CAA4C;KACtD;IACD;QACE,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,yDAAyD;KACnE;IACD;QACE,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,8CAA8C;KACxD;CACF,CAAC;AAKF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS;IACzC,cAAc;IACd,kCAAkC;IAClC,YAAY;CACb,CAAC,CAAC"}
|
package/dist/benchmark.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import type { BenchmarkResult, BenchmarkSummary, EstimateInput, EstimateRecord, VelocityReport } from "./types.js";
|
|
1
|
+
import type { BenchmarkResult, BenchmarkSummary, EstimateCalibration, EstimateInput, EstimateRecord, VelocityReport } from "./types.js";
|
|
2
2
|
export declare const ESTIMATES_FILE = "estimates.jsonl";
|
|
3
3
|
export declare function estimatesPath(root: string): string;
|
|
4
4
|
export declare function recordEstimate(root: string, input: EstimateInput): Promise<EstimateRecord>;
|
|
5
|
+
export declare function calibrateEstimate(root: string, input: EstimateInput, options?: {
|
|
6
|
+
ignoreHistory?: boolean;
|
|
7
|
+
}): Promise<EstimateCalibration>;
|
|
5
8
|
export declare function readEstimate(root: string, taskId: string): Promise<EstimateRecord | undefined>;
|
|
6
9
|
export declare function listEstimates(root: string): Promise<EstimateRecord[]>;
|
|
7
10
|
export declare function computeBenchmark(root: string, taskId: string): Promise<BenchmarkResult>;
|
package/dist/benchmark.js
CHANGED
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { ensureDir, resolveWorkflowPath } from "./fs-utils.js";
|
|
5
5
|
import { appendEvent, loadWorkspace, readEvents } from "./workspace.js";
|
|
6
6
|
import { listAutonomousRuns } from "./autonomous-workflow.js";
|
|
7
|
+
import { manualEffortBreakdown, pendingEffortBreakdown, workflowEffortBreakdown, } from "./effort-classification.js";
|
|
7
8
|
export const ESTIMATES_FILE = "estimates.jsonl";
|
|
8
9
|
const MS_PER_HOUR = 1000 * 60 * 60;
|
|
9
10
|
const MS_PER_DAY = MS_PER_HOUR * 24;
|
|
@@ -23,6 +24,7 @@ export async function recordEstimate(root, input) {
|
|
|
23
24
|
sizingLabel: input.sizingLabel,
|
|
24
25
|
soloEstimateDays: input.soloEstimateDays,
|
|
25
26
|
aiUnguidedEstimateDays: input.aiUnguidedEstimateDays,
|
|
27
|
+
aiGuidedEstimateDays: input.aiGuidedEstimateDays,
|
|
26
28
|
confidence: input.confidence,
|
|
27
29
|
declaredBy: input.declaredBy,
|
|
28
30
|
declaredAt: now,
|
|
@@ -34,17 +36,64 @@ export async function recordEstimate(root, input) {
|
|
|
34
36
|
type: "ESTIMATE_RECORDED",
|
|
35
37
|
taskId: input.taskId,
|
|
36
38
|
actor: input.declaredBy,
|
|
37
|
-
summary: `Estimate recorded: solo=${input.soloEstimateDays}d AI=${input.aiUnguidedEstimateDays}d sizing=${input.sizingLabel}`,
|
|
39
|
+
summary: `Estimate recorded: solo=${input.soloEstimateDays}d AI-unguided=${input.aiUnguidedEstimateDays}d AI-guided=${input.aiGuidedEstimateDays}d sizing=${input.sizingLabel}`,
|
|
38
40
|
metadata: {
|
|
39
41
|
estimateId: record.id,
|
|
40
42
|
sizingLabel: input.sizingLabel,
|
|
41
43
|
soloEstimateDays: input.soloEstimateDays,
|
|
42
44
|
aiUnguidedEstimateDays: input.aiUnguidedEstimateDays,
|
|
45
|
+
aiGuidedEstimateDays: input.aiGuidedEstimateDays,
|
|
43
46
|
confidence: input.confidence,
|
|
44
47
|
},
|
|
45
48
|
});
|
|
46
49
|
return record;
|
|
47
50
|
}
|
|
51
|
+
export async function calibrateEstimate(root, input, options = {}) {
|
|
52
|
+
const baselineEstimateDays = input.aiGuidedEstimateDays;
|
|
53
|
+
if (options.ignoreHistory) {
|
|
54
|
+
return {
|
|
55
|
+
baselineEstimateDays,
|
|
56
|
+
historicalMedian: null,
|
|
57
|
+
variance: null,
|
|
58
|
+
calibrationNote: "Historical calibration ignored by --ignore-history.",
|
|
59
|
+
sampleSize: 0,
|
|
60
|
+
ignored: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const estimates = await listEstimates(root);
|
|
64
|
+
const actuals = [];
|
|
65
|
+
for (const estimate of estimates) {
|
|
66
|
+
if (estimate.taskId === input.taskId)
|
|
67
|
+
continue;
|
|
68
|
+
if (estimate.sizingLabel !== input.sizingLabel)
|
|
69
|
+
continue;
|
|
70
|
+
const benchmark = await computeBenchmark(root, estimate.taskId).catch(() => null);
|
|
71
|
+
if (benchmark?.status === "complete" && benchmark.actualDays !== null) {
|
|
72
|
+
actuals.push(benchmark.actualDays);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (actuals.length < 2) {
|
|
76
|
+
return {
|
|
77
|
+
baselineEstimateDays,
|
|
78
|
+
historicalMedian: null,
|
|
79
|
+
variance: null,
|
|
80
|
+
calibrationNote: `Insufficient comparable benchmark history (${actuals.length}/2).`,
|
|
81
|
+
sampleSize: actuals.length,
|
|
82
|
+
ignored: false,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const historicalMedian = median(actuals);
|
|
86
|
+
const variance = Math.round(((baselineEstimateDays - historicalMedian) / historicalMedian) * 100);
|
|
87
|
+
const direction = variance === 0 ? "matches" : variance > 0 ? "above" : "below";
|
|
88
|
+
return {
|
|
89
|
+
baselineEstimateDays,
|
|
90
|
+
historicalMedian,
|
|
91
|
+
variance,
|
|
92
|
+
calibrationNote: `AI-guided baseline is ${Math.abs(variance)}% ${direction} historical median for ${input.sizingLabel} work.`,
|
|
93
|
+
sampleSize: actuals.length,
|
|
94
|
+
ignored: false,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
48
97
|
export async function readEstimate(root, taskId) {
|
|
49
98
|
const file = estimatesPath(root);
|
|
50
99
|
if (!existsSync(file))
|
|
@@ -55,7 +104,7 @@ export async function readEstimate(root, taskId) {
|
|
|
55
104
|
.filter(Boolean);
|
|
56
105
|
const latest = new Map();
|
|
57
106
|
for (const line of lines) {
|
|
58
|
-
const r =
|
|
107
|
+
const r = parseEstimateRecord(line);
|
|
59
108
|
latest.set(r.taskId, r);
|
|
60
109
|
}
|
|
61
110
|
return latest.get(taskId);
|
|
@@ -70,11 +119,26 @@ export async function listEstimates(root) {
|
|
|
70
119
|
.filter(Boolean);
|
|
71
120
|
const latest = new Map();
|
|
72
121
|
for (const line of lines) {
|
|
73
|
-
const r =
|
|
122
|
+
const r = parseEstimateRecord(line);
|
|
74
123
|
latest.set(r.taskId, r);
|
|
75
124
|
}
|
|
76
125
|
return [...latest.values()];
|
|
77
126
|
}
|
|
127
|
+
function parseEstimateRecord(line) {
|
|
128
|
+
const record = JSON.parse(line);
|
|
129
|
+
return {
|
|
130
|
+
...record,
|
|
131
|
+
aiGuidedEstimateDays: record.aiGuidedEstimateDays ?? record.aiUnguidedEstimateDays,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function median(values) {
|
|
135
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
136
|
+
const middle = Math.floor(sorted.length / 2);
|
|
137
|
+
const lower = sorted[Math.max(0, middle - 1)] ?? 0;
|
|
138
|
+
const upper = sorted[middle] ?? lower;
|
|
139
|
+
const value = sorted.length % 2 === 0 ? (lower + upper) / 2 : upper;
|
|
140
|
+
return Math.round(value * 100) / 100;
|
|
141
|
+
}
|
|
78
142
|
export async function computeBenchmark(root, taskId) {
|
|
79
143
|
const estimate = await readEstimate(root, taskId);
|
|
80
144
|
if (!estimate)
|
|
@@ -85,36 +149,39 @@ export async function computeBenchmark(root, taskId) {
|
|
|
85
149
|
if (!taskRun) {
|
|
86
150
|
const lifecycleActual = await computeTaskLifecycleDuration(root, taskId);
|
|
87
151
|
if (lifecycleActual !== null) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
152
|
+
return benchmarkFromTaskDuration({
|
|
153
|
+
estimate,
|
|
154
|
+
quality,
|
|
155
|
+
source: "task-lifecycle",
|
|
91
156
|
taskId,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
vsAiUnguidedPct,
|
|
100
|
-
qaIterations: 0,
|
|
101
|
-
phaseDurations: [],
|
|
157
|
+
timing: lifecycleActual,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const timestampActual = await computeTaskTimestampDuration(root, taskId);
|
|
161
|
+
if (timestampActual !== null) {
|
|
162
|
+
return benchmarkFromTaskDuration({
|
|
163
|
+
estimate,
|
|
102
164
|
quality,
|
|
103
|
-
|
|
104
|
-
|
|
165
|
+
source: "task-timestamps",
|
|
166
|
+
taskId,
|
|
167
|
+
timing: timestampActual,
|
|
168
|
+
});
|
|
105
169
|
}
|
|
106
170
|
return {
|
|
107
171
|
taskId,
|
|
108
172
|
sizingLabel: estimate.sizingLabel,
|
|
109
173
|
soloEstimateDays: estimate.soloEstimateDays,
|
|
110
174
|
aiUnguidedEstimateDays: estimate.aiUnguidedEstimateDays,
|
|
175
|
+
aiGuidedEstimateDays: estimate.aiGuidedEstimateDays,
|
|
111
176
|
actualSource: "none",
|
|
112
177
|
actualDays: null,
|
|
113
178
|
actualHours: null,
|
|
114
179
|
vsSoloPct: null,
|
|
115
180
|
vsAiUnguidedPct: null,
|
|
181
|
+
vsAiGuidedPct: null,
|
|
116
182
|
qaIterations: 0,
|
|
117
183
|
phaseDurations: [],
|
|
184
|
+
effortBreakdown: pendingEffortBreakdown(estimate),
|
|
118
185
|
quality,
|
|
119
186
|
status: "pending",
|
|
120
187
|
};
|
|
@@ -148,24 +215,31 @@ export async function computeBenchmark(root, taskId) {
|
|
|
148
215
|
: null,
|
|
149
216
|
};
|
|
150
217
|
});
|
|
218
|
+
const effortBreakdown = workflowEffortBreakdown(estimate, taskRun, phaseDurations);
|
|
151
219
|
const vsSoloPct = actualDays !== null
|
|
152
220
|
? estimateDeltaPct(actualDays, estimate.soloEstimateDays)
|
|
153
221
|
: null;
|
|
154
222
|
const vsAiUnguidedPct = actualDays !== null
|
|
155
223
|
? estimateDeltaPct(actualDays, estimate.aiUnguidedEstimateDays)
|
|
156
224
|
: null;
|
|
225
|
+
const vsAiGuidedPct = actualDays !== null
|
|
226
|
+
? estimateDeltaPct(actualDays, estimate.aiGuidedEstimateDays)
|
|
227
|
+
: null;
|
|
157
228
|
return {
|
|
158
229
|
taskId,
|
|
159
230
|
sizingLabel: estimate.sizingLabel,
|
|
160
231
|
soloEstimateDays: estimate.soloEstimateDays,
|
|
161
232
|
aiUnguidedEstimateDays: estimate.aiUnguidedEstimateDays,
|
|
233
|
+
aiGuidedEstimateDays: estimate.aiGuidedEstimateDays,
|
|
162
234
|
actualSource: actualDays !== null ? "phase-timeline" : "none",
|
|
163
235
|
actualDays,
|
|
164
236
|
actualHours,
|
|
165
237
|
vsSoloPct,
|
|
166
238
|
vsAiUnguidedPct,
|
|
239
|
+
vsAiGuidedPct,
|
|
167
240
|
qaIterations: taskRun.qaIterations,
|
|
168
241
|
phaseDurations,
|
|
242
|
+
effortBreakdown,
|
|
169
243
|
quality,
|
|
170
244
|
status: "complete",
|
|
171
245
|
};
|
|
@@ -191,6 +265,42 @@ async function computeTaskLifecycleDuration(root, taskId) {
|
|
|
191
265
|
}
|
|
192
266
|
return durationParts(doneTime - startedTime);
|
|
193
267
|
}
|
|
268
|
+
function benchmarkFromTaskDuration({ estimate, quality, source, taskId, timing, }) {
|
|
269
|
+
const vsSoloPct = estimateDeltaPct(timing.days, estimate.soloEstimateDays);
|
|
270
|
+
const vsAiUnguidedPct = estimateDeltaPct(timing.days, estimate.aiUnguidedEstimateDays);
|
|
271
|
+
const vsAiGuidedPct = estimateDeltaPct(timing.days, estimate.aiGuidedEstimateDays);
|
|
272
|
+
return {
|
|
273
|
+
taskId,
|
|
274
|
+
sizingLabel: estimate.sizingLabel,
|
|
275
|
+
soloEstimateDays: estimate.soloEstimateDays,
|
|
276
|
+
aiUnguidedEstimateDays: estimate.aiUnguidedEstimateDays,
|
|
277
|
+
aiGuidedEstimateDays: estimate.aiGuidedEstimateDays,
|
|
278
|
+
actualSource: source,
|
|
279
|
+
actualDays: timing.days,
|
|
280
|
+
actualHours: timing.hours,
|
|
281
|
+
vsSoloPct,
|
|
282
|
+
vsAiUnguidedPct,
|
|
283
|
+
vsAiGuidedPct,
|
|
284
|
+
qaIterations: 0,
|
|
285
|
+
phaseDurations: [],
|
|
286
|
+
effortBreakdown: manualEffortBreakdown(estimate, timing),
|
|
287
|
+
quality,
|
|
288
|
+
status: "complete",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
async function computeTaskTimestampDuration(root, taskId) {
|
|
292
|
+
const workspace = await loadWorkspace(root);
|
|
293
|
+
const task = workspace.tasks.find((candidate) => candidate.id === taskId);
|
|
294
|
+
if (!task || task.status !== "done" || !task.claimedAt || !task.doneAt) {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
const claimedTime = new Date(task.claimedAt).getTime();
|
|
298
|
+
const doneTime = new Date(task.doneAt).getTime();
|
|
299
|
+
if (!Number.isFinite(claimedTime) || !Number.isFinite(doneTime)) {
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
return durationParts(doneTime - claimedTime);
|
|
303
|
+
}
|
|
194
304
|
function estimateDeltaPct(actualDays, estimateDays) {
|
|
195
305
|
return Math.round(((actualDays - estimateDays) / estimateDays) * 100);
|
|
196
306
|
}
|
|
@@ -264,7 +374,17 @@ export async function summarizeBenchmark(root) {
|
|
|
264
374
|
? Math.round(withActuals.reduce((sum, s) => sum + (s.vsAiUnguidedPct ?? 0), 0) /
|
|
265
375
|
totalWithActuals)
|
|
266
376
|
: null;
|
|
267
|
-
|
|
377
|
+
const avgVsAiGuidedPct = totalWithActuals > 0
|
|
378
|
+
? Math.round(withActuals.reduce((sum, s) => sum + (s.vsAiGuidedPct ?? 0), 0) /
|
|
379
|
+
totalWithActuals)
|
|
380
|
+
: null;
|
|
381
|
+
return {
|
|
382
|
+
stories,
|
|
383
|
+
totalWithActuals,
|
|
384
|
+
avgVsSoloPct,
|
|
385
|
+
avgVsAiUnguidedPct,
|
|
386
|
+
avgVsAiGuidedPct,
|
|
387
|
+
};
|
|
268
388
|
}
|
|
269
389
|
export async function computeVelocity(root) {
|
|
270
390
|
const summary = await summarizeBenchmark(root);
|
|
@@ -307,6 +427,7 @@ export async function computeVelocity(root) {
|
|
|
307
427
|
avgActualDaysPerStory: avgActualDays,
|
|
308
428
|
avgVsSoloPct: summary.avgVsSoloPct,
|
|
309
429
|
avgVsAiUnguidedPct: summary.avgVsAiUnguidedPct,
|
|
430
|
+
avgVsAiGuidedPct: summary.avgVsAiGuidedPct,
|
|
310
431
|
weeks,
|
|
311
432
|
trend,
|
|
312
433
|
};
|