@captain_z/zsk 1.8.7 → 1.8.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/README.md +34 -16
- package/dist/bin.js +6 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/prepare.js +3 -0
- package/dist/commands/prepare.js.map +1 -1
- package/dist/core/anchor-drift.d.ts +79 -0
- package/dist/core/anchor-drift.js +198 -0
- package/dist/core/anchor-drift.js.map +1 -0
- package/dist/core/decoupling-eval.d.ts +53 -0
- package/dist/core/decoupling-eval.js +260 -0
- package/dist/core/decoupling-eval.js.map +1 -0
- package/dist/core/installer.js +2 -2
- package/dist/core/installer.js.map +1 -1
- package/dist/core/issue-publish-adapter.d.ts +50 -0
- package/dist/core/issue-publish-adapter.js +371 -0
- package/dist/core/issue-publish-adapter.js.map +1 -0
- package/dist/core/prepare-artifacts.d.ts +2 -0
- package/dist/core/prepare-artifacts.js +2 -0
- package/dist/core/prepare-artifacts.js.map +1 -1
- package/dist/core/prepare-readiness.d.ts +40 -0
- package/dist/core/prepare-readiness.js +268 -0
- package/dist/core/prepare-readiness.js.map +1 -0
- package/dist/core/prepare-sync.d.ts +2 -0
- package/dist/core/prepare-sync.js +8 -16
- package/dist/core/prepare-sync.js.map +1 -1
- package/dist/core/review-skill-policy.d.ts +74 -0
- package/dist/core/review-skill-policy.js +278 -0
- package/dist/core/review-skill-policy.js.map +1 -0
- package/dist/core/skills.js +38 -14
- package/dist/core/skills.js.map +1 -1
- package/dist/core/source-snapshot-adapters.d.ts +3 -0
- package/dist/core/source-snapshot-adapters.js.map +1 -1
- package/dist/core/stage-clarity-verification.js +30 -16
- package/dist/core/stage-clarity-verification.js.map +1 -1
- package/dist/core/task-decomposition.d.ts +64 -0
- package/dist/core/task-decomposition.js +325 -0
- package/dist/core/task-decomposition.js.map +1 -0
- package/dist/core/task-plan-adapter.d.ts +57 -0
- package/dist/core/task-plan-adapter.js +298 -0
- package/dist/core/task-plan-adapter.js.map +1 -0
- package/dist/core/validation-packet.d.ts +86 -0
- package/dist/core/validation-packet.js +313 -0
- package/dist/core/validation-packet.js.map +1 -0
- package/dist/core/workflow-orchestration-policy.d.ts +92 -0
- package/dist/core/workflow-orchestration-policy.js +215 -0
- package/dist/core/workflow-orchestration-policy.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export type TaskDecompositionSourceKind = "plan" | "prd" | "spec" | "conversation-summary" | "issue";
|
|
2
|
+
export type TaskPriority = "P0" | "P1" | "P2" | "P3";
|
|
3
|
+
export type TaskWorkMode = "AFK" | "HITL";
|
|
4
|
+
export type TaskCandidateType = "feature" | "bugfix" | "implementation" | "validation" | "documentation" | "migration" | "spike" | "decision";
|
|
5
|
+
export type TaskCheckpointMap = {
|
|
6
|
+
ready: string;
|
|
7
|
+
red?: string;
|
|
8
|
+
green: string;
|
|
9
|
+
refactor?: string;
|
|
10
|
+
review: string;
|
|
11
|
+
verify: string;
|
|
12
|
+
done?: string;
|
|
13
|
+
};
|
|
14
|
+
export type TaskValidationHook = string | {
|
|
15
|
+
kind: "unit" | "integration" | "smoke" | "static" | "manual" | "review" | "eval";
|
|
16
|
+
command?: string;
|
|
17
|
+
expected: string;
|
|
18
|
+
};
|
|
19
|
+
export type TaskCandidate = {
|
|
20
|
+
id: string;
|
|
21
|
+
title: string;
|
|
22
|
+
group: string;
|
|
23
|
+
priority: TaskPriority;
|
|
24
|
+
type: TaskCandidateType;
|
|
25
|
+
workMode: TaskWorkMode;
|
|
26
|
+
hitlReason?: "human-decision" | "credentials" | "external-environment" | "destructive-operation";
|
|
27
|
+
blockedBy: string[];
|
|
28
|
+
unblocks: string[];
|
|
29
|
+
acceptanceCriteria: string[];
|
|
30
|
+
todo: string[];
|
|
31
|
+
checkpoints: TaskCheckpointMap;
|
|
32
|
+
validation: TaskValidationHook[];
|
|
33
|
+
sourceRefs?: string[];
|
|
34
|
+
};
|
|
35
|
+
export type TaskDecompositionInput = {
|
|
36
|
+
kind: TaskDecompositionSourceKind;
|
|
37
|
+
title?: string;
|
|
38
|
+
body?: string;
|
|
39
|
+
candidates?: TaskCandidate[];
|
|
40
|
+
};
|
|
41
|
+
export type TaskDecompositionResult = {
|
|
42
|
+
version: 1;
|
|
43
|
+
source: {
|
|
44
|
+
kind: TaskDecompositionSourceKind;
|
|
45
|
+
title?: string;
|
|
46
|
+
};
|
|
47
|
+
candidates: TaskCandidate[];
|
|
48
|
+
};
|
|
49
|
+
export type TaskDecompositionDiagnosticSeverity = "warning" | "failure";
|
|
50
|
+
export type TaskDecompositionDiagnostic = {
|
|
51
|
+
code: string;
|
|
52
|
+
severity: TaskDecompositionDiagnosticSeverity;
|
|
53
|
+
candidateId?: string;
|
|
54
|
+
message: string;
|
|
55
|
+
evidence: string[];
|
|
56
|
+
};
|
|
57
|
+
export type TaskDecompositionAssessment = {
|
|
58
|
+
status: "valid" | "warning" | "invalid";
|
|
59
|
+
targetScore: 100;
|
|
60
|
+
score: number;
|
|
61
|
+
diagnostics: TaskDecompositionDiagnostic[];
|
|
62
|
+
};
|
|
63
|
+
export declare function createTaskDecomposition(input: TaskDecompositionInput): TaskDecompositionResult;
|
|
64
|
+
export declare function evaluateTaskDecomposition(result: TaskDecompositionResult): TaskDecompositionAssessment;
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
const TARGET_SCORE = 100;
|
|
2
|
+
const SIDE_EFFECT_FIELDS = new Set([
|
|
3
|
+
"issuePath",
|
|
4
|
+
"publish",
|
|
5
|
+
"writeIssue",
|
|
6
|
+
"gate",
|
|
7
|
+
"dispatch",
|
|
8
|
+
"agent",
|
|
9
|
+
"nextSkill",
|
|
10
|
+
"workflowNext",
|
|
11
|
+
"route",
|
|
12
|
+
]);
|
|
13
|
+
const LAYER_ONLY_PATTERNS = [
|
|
14
|
+
/\bdata\s+layer\b/i,
|
|
15
|
+
/\bapi\s+layer\b/i,
|
|
16
|
+
/\bui\s+layer\b/i,
|
|
17
|
+
/\bfrontend\s+layer\b/i,
|
|
18
|
+
/\bbackend\s+layer\b/i,
|
|
19
|
+
/\bmodels?\b/i,
|
|
20
|
+
/\brepositories\b/i,
|
|
21
|
+
/\bcontrollers\b/i,
|
|
22
|
+
/\broutes\b/i,
|
|
23
|
+
/\bscreens\b/i,
|
|
24
|
+
/\bservices?\b/i,
|
|
25
|
+
];
|
|
26
|
+
const OBSERVABLE_BEHAVIOR_PATTERNS = [
|
|
27
|
+
/\buser\b/i,
|
|
28
|
+
/\bworkflow\b/i,
|
|
29
|
+
/\bbehavior\b/i,
|
|
30
|
+
/\bscenario\b/i,
|
|
31
|
+
/\baccepts?\b/i,
|
|
32
|
+
/\brejects?\b/i,
|
|
33
|
+
/\bshows?\b/i,
|
|
34
|
+
/\breturns?\b/i,
|
|
35
|
+
/\bpersists?\b/i,
|
|
36
|
+
/\breports?\b/i,
|
|
37
|
+
/\bcan\b/i,
|
|
38
|
+
/\bwhen\b/i,
|
|
39
|
+
/\bgiven\b/i,
|
|
40
|
+
/\bthen\b/i,
|
|
41
|
+
];
|
|
42
|
+
const ORDERING_PATTERNS = [
|
|
43
|
+
/\bdepends?\b/i,
|
|
44
|
+
/\bafter\b/i,
|
|
45
|
+
/\bbefore\b/i,
|
|
46
|
+
/\bfirst\b/i,
|
|
47
|
+
/\bthen\b/i,
|
|
48
|
+
/\bnext\b/i,
|
|
49
|
+
/\bexists\b/i,
|
|
50
|
+
/\blayer\b/i,
|
|
51
|
+
/\bunblocks?\b/i,
|
|
52
|
+
];
|
|
53
|
+
export function createTaskDecomposition(input) {
|
|
54
|
+
return {
|
|
55
|
+
version: 1,
|
|
56
|
+
source: {
|
|
57
|
+
kind: input.kind,
|
|
58
|
+
title: input.title,
|
|
59
|
+
},
|
|
60
|
+
candidates: input.candidates?.map(normalizeCandidate) ?? [fallbackClarificationCandidate(input)],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function evaluateTaskDecomposition(result) {
|
|
64
|
+
const diagnostics = [
|
|
65
|
+
...diagnoseResultShape(result),
|
|
66
|
+
...diagnoseCandidateCompleteness(result.candidates),
|
|
67
|
+
...diagnoseHorizontalSlicing(result.candidates),
|
|
68
|
+
...diagnoseDependencyClarity(result.candidates),
|
|
69
|
+
...diagnoseHitlBoundaries(result.candidates),
|
|
70
|
+
...diagnoseSideEffects(result),
|
|
71
|
+
];
|
|
72
|
+
const status = diagnostics.some((diagnostic) => diagnostic.severity === "failure")
|
|
73
|
+
? "invalid"
|
|
74
|
+
: diagnostics.length > 0
|
|
75
|
+
? "warning"
|
|
76
|
+
: "valid";
|
|
77
|
+
return {
|
|
78
|
+
status,
|
|
79
|
+
targetScore: TARGET_SCORE,
|
|
80
|
+
score: scoreDiagnostics(diagnostics),
|
|
81
|
+
diagnostics,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function normalizeCandidate(candidate) {
|
|
85
|
+
return {
|
|
86
|
+
...candidate,
|
|
87
|
+
blockedBy: candidate.blockedBy ?? [],
|
|
88
|
+
unblocks: candidate.unblocks ?? [],
|
|
89
|
+
acceptanceCriteria: candidate.acceptanceCriteria ?? [],
|
|
90
|
+
todo: candidate.todo ?? [],
|
|
91
|
+
validation: candidate.validation ?? [],
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function fallbackClarificationCandidate(input) {
|
|
95
|
+
const title = input.title ? `Clarify vertical slices for ${input.title}` : "Clarify vertical slices";
|
|
96
|
+
return {
|
|
97
|
+
id: "task-decomposition-clarification",
|
|
98
|
+
title,
|
|
99
|
+
group: "task-decomposition",
|
|
100
|
+
priority: "P0",
|
|
101
|
+
type: "spike",
|
|
102
|
+
workMode: "HITL",
|
|
103
|
+
hitlReason: "human-decision",
|
|
104
|
+
blockedBy: [],
|
|
105
|
+
unblocks: [],
|
|
106
|
+
acceptanceCriteria: [
|
|
107
|
+
"A reviewed vertical-slice task list exists with observable acceptance criteria and explicit dependencies.",
|
|
108
|
+
],
|
|
109
|
+
todo: [
|
|
110
|
+
"Ready: collect the source plan, PRD, spec, conversation summary, or issue body.",
|
|
111
|
+
"Red: identify any horizontal, unverifiable, or dependency-ambiguous slices.",
|
|
112
|
+
"Green: rewrite into independently verifiable task candidates.",
|
|
113
|
+
"Verify: run the task decomposition assessment and record remaining gaps.",
|
|
114
|
+
],
|
|
115
|
+
checkpoints: {
|
|
116
|
+
ready: "Source material is available for task decomposition.",
|
|
117
|
+
red: "Quality gaps are identified before publishing tasks.",
|
|
118
|
+
green: "Candidates are rewritten as vertical slices.",
|
|
119
|
+
review: "No workflow side effects are embedded in the candidates.",
|
|
120
|
+
verify: "Task decomposition assessment is valid or gaps are explicit.",
|
|
121
|
+
},
|
|
122
|
+
validation: [
|
|
123
|
+
{
|
|
124
|
+
kind: "eval",
|
|
125
|
+
expected: "evaluateTaskDecomposition reports valid candidates or explicit diagnostics.",
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
sourceRefs: input.body ? ["input.body"] : [],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
function diagnoseResultShape(result) {
|
|
132
|
+
const diagnostics = [];
|
|
133
|
+
if (result.version !== 1) {
|
|
134
|
+
diagnostics.push(diagnostic({
|
|
135
|
+
code: "unsupported-version",
|
|
136
|
+
severity: "failure",
|
|
137
|
+
message: "Task decomposition result must use version 1.",
|
|
138
|
+
evidence: [String(result.version)],
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
if (!result.source?.kind) {
|
|
142
|
+
diagnostics.push(diagnostic({
|
|
143
|
+
code: "missing-source-kind",
|
|
144
|
+
severity: "failure",
|
|
145
|
+
message: "Task decomposition result must record the consumed source kind.",
|
|
146
|
+
evidence: [],
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
if (!Array.isArray(result.candidates) || result.candidates.length === 0) {
|
|
150
|
+
diagnostics.push(diagnostic({
|
|
151
|
+
code: "missing-candidates",
|
|
152
|
+
severity: "failure",
|
|
153
|
+
message: "Task decomposition must output at least one task candidate.",
|
|
154
|
+
evidence: [],
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
return diagnostics;
|
|
158
|
+
}
|
|
159
|
+
function diagnoseCandidateCompleteness(candidates) {
|
|
160
|
+
return candidates.flatMap((candidate) => {
|
|
161
|
+
const diagnostics = [];
|
|
162
|
+
const requiredStrings = [
|
|
163
|
+
["id", "missing-id"],
|
|
164
|
+
["title", "missing-title"],
|
|
165
|
+
["group", "missing-group"],
|
|
166
|
+
["priority", "missing-priority"],
|
|
167
|
+
["type", "missing-type"],
|
|
168
|
+
["workMode", "missing-work-mode"],
|
|
169
|
+
];
|
|
170
|
+
for (const [field, code] of requiredStrings) {
|
|
171
|
+
const value = candidate[field];
|
|
172
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
173
|
+
diagnostics.push(candidateDiagnostic(candidate, code, "failure", `Candidate is missing ${String(field)}.`, []));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!Array.isArray(candidate.blockedBy)) {
|
|
177
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-dependency-metadata", "failure", "Candidate must include blockedBy dependency metadata.", []));
|
|
178
|
+
}
|
|
179
|
+
if (!Array.isArray(candidate.unblocks)) {
|
|
180
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-unblock-metadata", "failure", "Candidate must include unblocks relationship metadata.", []));
|
|
181
|
+
}
|
|
182
|
+
if (!Array.isArray(candidate.acceptanceCriteria) || candidate.acceptanceCriteria.length === 0) {
|
|
183
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-acceptance-criteria", "failure", "Candidate must include observable acceptance criteria.", []));
|
|
184
|
+
}
|
|
185
|
+
if (!Array.isArray(candidate.todo) || candidate.todo.length === 0) {
|
|
186
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-todo", "failure", "Candidate must include executable todo steps.", []));
|
|
187
|
+
}
|
|
188
|
+
if (!hasRequiredCheckpoints(candidate.checkpoints)) {
|
|
189
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-checkpoints", "failure", "Candidate must include ready, green, review, and verify checkpoints.", []));
|
|
190
|
+
}
|
|
191
|
+
if (!Array.isArray(candidate.validation) || candidate.validation.length === 0) {
|
|
192
|
+
diagnostics.push(candidateDiagnostic(candidate, "missing-validation", "failure", "Candidate must include validation hooks.", []));
|
|
193
|
+
}
|
|
194
|
+
return diagnostics;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
function diagnoseHorizontalSlicing(candidates) {
|
|
198
|
+
return candidates.flatMap((candidate) => {
|
|
199
|
+
const titleAndGroup = `${candidate.title} ${candidate.group} ${candidate.todo?.join(" ") ?? ""}`;
|
|
200
|
+
const layerOnlySignals = LAYER_ONLY_PATTERNS.filter((pattern) => pattern.test(titleAndGroup)).length;
|
|
201
|
+
const observableSignals = [
|
|
202
|
+
candidate.title,
|
|
203
|
+
...candidate.acceptanceCriteria,
|
|
204
|
+
...candidate.todo,
|
|
205
|
+
].filter((text) => OBSERVABLE_BEHAVIOR_PATTERNS.some((pattern) => pattern.test(text))).length;
|
|
206
|
+
if (layerOnlySignals >= 2 && observableSignals === 0) {
|
|
207
|
+
return [
|
|
208
|
+
candidateDiagnostic(candidate, "horizontal-slice", "failure", "Candidate is sliced by implementation layer instead of a thin, independently verifiable behavior.", [candidate.title]),
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
return [];
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
function diagnoseDependencyClarity(candidates) {
|
|
215
|
+
if (candidates.length <= 1)
|
|
216
|
+
return [];
|
|
217
|
+
const ids = new Set(candidates.map((candidate) => candidate.id));
|
|
218
|
+
const diagnostics = [];
|
|
219
|
+
const linkedCandidateCount = candidates.filter((candidate) => candidate.blockedBy.length > 0 || candidate.unblocks.length > 0).length;
|
|
220
|
+
if (linkedCandidateCount === 0 && candidates.some(hasOrderingSignal)) {
|
|
221
|
+
diagnostics.push(diagnostic({
|
|
222
|
+
code: "dependency-ambiguous",
|
|
223
|
+
severity: "failure",
|
|
224
|
+
message: "Task candidates imply ordering but do not make dependencies or unblock relationships explicit.",
|
|
225
|
+
evidence: candidates.map((candidate) => candidate.id),
|
|
226
|
+
}));
|
|
227
|
+
}
|
|
228
|
+
for (const candidate of candidates) {
|
|
229
|
+
for (const dependency of candidate.blockedBy) {
|
|
230
|
+
if (!ids.has(dependency)) {
|
|
231
|
+
diagnostics.push(candidateDiagnostic(candidate, "unknown-dependency", "failure", "Candidate depends on an unknown task id.", [dependency]));
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
for (const unblocked of candidate.unblocks) {
|
|
235
|
+
if (!ids.has(unblocked)) {
|
|
236
|
+
diagnostics.push(candidateDiagnostic(candidate, "unknown-unblock", "failure", "Candidate unblocks an unknown task id.", [unblocked]));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return diagnostics;
|
|
241
|
+
}
|
|
242
|
+
function hasOrderingSignal(candidate) {
|
|
243
|
+
const checkpointText = candidate.checkpoints
|
|
244
|
+
? Object.values(candidate.checkpoints).filter((value) => typeof value === "string")
|
|
245
|
+
: [];
|
|
246
|
+
const validationText = candidate.validation.map((hook) => (typeof hook === "string" ? hook : hook.expected));
|
|
247
|
+
const text = [
|
|
248
|
+
candidate.title,
|
|
249
|
+
candidate.group,
|
|
250
|
+
candidate.type,
|
|
251
|
+
...candidate.todo,
|
|
252
|
+
...candidate.acceptanceCriteria,
|
|
253
|
+
...checkpointText,
|
|
254
|
+
...validationText,
|
|
255
|
+
].join(" ");
|
|
256
|
+
return ORDERING_PATTERNS.some((pattern) => pattern.test(text));
|
|
257
|
+
}
|
|
258
|
+
function diagnoseHitlBoundaries(candidates) {
|
|
259
|
+
return candidates.flatMap((candidate) => {
|
|
260
|
+
if (candidate.workMode === "AFK")
|
|
261
|
+
return [];
|
|
262
|
+
if (candidate.workMode !== "HITL") {
|
|
263
|
+
return [
|
|
264
|
+
candidateDiagnostic(candidate, "invalid-work-mode", "failure", "Candidate workMode must be AFK or HITL.", [String(candidate.workMode)]),
|
|
265
|
+
];
|
|
266
|
+
}
|
|
267
|
+
if (!candidate.hitlReason) {
|
|
268
|
+
return [
|
|
269
|
+
candidateDiagnostic(candidate, "missing-hitl-reason", "failure", "HITL candidates must be limited to human decision, credentials, external environment, or destructive operation.", []),
|
|
270
|
+
];
|
|
271
|
+
}
|
|
272
|
+
return [];
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
function diagnoseSideEffects(result) {
|
|
276
|
+
const diagnostics = [];
|
|
277
|
+
for (const field of Object.keys(result)) {
|
|
278
|
+
if (SIDE_EFFECT_FIELDS.has(field)) {
|
|
279
|
+
diagnostics.push(diagnostic({
|
|
280
|
+
code: "workflow-side-effect",
|
|
281
|
+
severity: "failure",
|
|
282
|
+
message: `Task decomposition result must not include workflow side-effect field ${field}.`,
|
|
283
|
+
evidence: [field],
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
for (const candidate of result.candidates) {
|
|
288
|
+
for (const field of Object.keys(candidate)) {
|
|
289
|
+
if (SIDE_EFFECT_FIELDS.has(field)) {
|
|
290
|
+
diagnostics.push(candidateDiagnostic(candidate, "workflow-side-effect", "failure", `Task candidate must not include workflow side-effect field ${field}.`, [field]));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return diagnostics;
|
|
295
|
+
}
|
|
296
|
+
function hasRequiredCheckpoints(checkpoints) {
|
|
297
|
+
if (!checkpoints)
|
|
298
|
+
return false;
|
|
299
|
+
return ["ready", "green", "review", "verify"].every((key) => {
|
|
300
|
+
const value = checkpoints[key];
|
|
301
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
function scoreDiagnostics(diagnostics) {
|
|
305
|
+
const penalty = diagnostics.reduce((total, diagnostic) => {
|
|
306
|
+
return total + (diagnostic.severity === "failure" ? 20 : 10);
|
|
307
|
+
}, 0);
|
|
308
|
+
return Math.max(0, TARGET_SCORE - penalty);
|
|
309
|
+
}
|
|
310
|
+
function diagnostic(input) {
|
|
311
|
+
return {
|
|
312
|
+
evidence: [],
|
|
313
|
+
...input,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
function candidateDiagnostic(candidate, code, severity, message, evidence) {
|
|
317
|
+
return diagnostic({
|
|
318
|
+
code,
|
|
319
|
+
severity,
|
|
320
|
+
candidateId: candidate.id,
|
|
321
|
+
message,
|
|
322
|
+
evidence,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=task-decomposition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-decomposition.js","sourceRoot":"","sources":["../../src/core/task-decomposition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type TaskCandidate, type TaskDecompositionAssessment, type TaskDecompositionResult, type TaskValidationHook } from "./task-decomposition.js";
|
|
2
|
+
export type TaskPlanVerticalSlice = {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
priority: TaskCandidate["priority"];
|
|
6
|
+
type: TaskCandidate["type"];
|
|
7
|
+
workMode: TaskCandidate["workMode"];
|
|
8
|
+
hitlReason?: TaskCandidate["hitlReason"];
|
|
9
|
+
blockedBy: string[];
|
|
10
|
+
unblocks: string[];
|
|
11
|
+
acceptanceCriteria: string[];
|
|
12
|
+
todo: string[];
|
|
13
|
+
checkpoints: TaskCandidate["checkpoints"];
|
|
14
|
+
validation: TaskValidationHook[];
|
|
15
|
+
sourceRefs: string[];
|
|
16
|
+
};
|
|
17
|
+
export type TaskPlanGroup = {
|
|
18
|
+
id: string;
|
|
19
|
+
title: string;
|
|
20
|
+
priority: TaskCandidate["priority"];
|
|
21
|
+
workMode: TaskCandidate["workMode"];
|
|
22
|
+
verticalSlices: TaskPlanVerticalSlice[];
|
|
23
|
+
};
|
|
24
|
+
export type BoundedTaskSpike = {
|
|
25
|
+
candidateId: string;
|
|
26
|
+
timebox: "30m";
|
|
27
|
+
problem: string;
|
|
28
|
+
output: string;
|
|
29
|
+
acceptanceCriteria: string[];
|
|
30
|
+
};
|
|
31
|
+
export type TaskPlanArtifact = {
|
|
32
|
+
version: 1;
|
|
33
|
+
kind: "task-plan";
|
|
34
|
+
sourceEngine: "task-decomposition";
|
|
35
|
+
source: TaskDecompositionResult["source"];
|
|
36
|
+
assessment: TaskDecompositionAssessment;
|
|
37
|
+
localSideEffects: "none";
|
|
38
|
+
workflowSideEffects: [];
|
|
39
|
+
taskGroups: TaskPlanGroup[];
|
|
40
|
+
boundedSpikes: BoundedTaskSpike[];
|
|
41
|
+
};
|
|
42
|
+
export type TaskPlanDiagnostic = {
|
|
43
|
+
code: string;
|
|
44
|
+
severity: "warning" | "failure";
|
|
45
|
+
groupId?: string;
|
|
46
|
+
sliceId?: string;
|
|
47
|
+
message: string;
|
|
48
|
+
evidence: string[];
|
|
49
|
+
};
|
|
50
|
+
export type TaskPlanAssessment = {
|
|
51
|
+
status: "valid" | "warning" | "invalid";
|
|
52
|
+
targetScore: 100;
|
|
53
|
+
score: number;
|
|
54
|
+
diagnostics: TaskPlanDiagnostic[];
|
|
55
|
+
};
|
|
56
|
+
export declare function createTaskPlan(decomposition: TaskDecompositionResult): TaskPlanArtifact;
|
|
57
|
+
export declare function evaluateTaskPlan(plan: TaskPlanArtifact): TaskPlanAssessment;
|