@tea-agent/loop-agent 0.15.0 → 0.16.0
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 +1 -1
- package/CHANGELOG.md +59 -11
- package/README.md +1 -1
- package/dist/application/evaluation/alias.js +184 -0
- package/dist/application/evaluation/budget.js +192 -0
- package/dist/application/evaluation/campaign-hash.js +47 -0
- package/dist/application/evaluation/campaign-matrix.js +372 -0
- package/dist/application/evaluation/campaign-scorecard.js +135 -0
- package/dist/application/evaluation/campaign.js +370 -0
- package/dist/application/evaluation/candidate.js +23 -6
- package/dist/application/evaluation/corpus-hash.js +38 -0
- package/dist/application/evaluation/corpus.js +56 -0
- package/dist/application/evaluation/experiment.js +294 -0
- package/dist/application/evaluation/ignition.js +198 -0
- package/dist/application/evaluation/integrity-audit.js +162 -0
- package/dist/application/evaluation/outer-loop.js +132 -0
- package/dist/application/evaluation/pi-cell-executor.js +39 -0
- package/dist/application/evaluation/private-verifier.js +46 -0
- package/dist/application/evaluation/promotion-policy.js +151 -0
- package/dist/application/evaluation/proposer.js +98 -0
- package/dist/application/evaluation/types.js +522 -0
- package/dist/cli/command-definitions.js +19 -3
- package/dist/commands/eval.js +1176 -13
- package/dist/commands/init.js +4 -1
- package/dist/infrastructure/evaluation/alias-store.js +199 -0
- package/dist/infrastructure/evaluation/campaign-store.js +154 -0
- package/dist/infrastructure/evaluation/corpus-store.js +181 -0
- package/dist/infrastructure/evaluation/experiment-store.js +124 -0
- package/dist/infrastructure/evaluation/ignition-store.js +82 -0
- package/dist/infrastructure/evaluation/private-verifier-store.js +145 -0
- package/dist/infrastructure/evaluation/proposer-store.js +78 -0
- package/dist/worker/cli.js +6 -3
- package/dist/worker/delivery/final-verification.js +96 -8
- package/dist/worker/delivery/package.js +23 -4
- package/dist/worker/delivery/verification-bundle.js +521 -0
- package/dist/worker/feature/fullstack-validate.js +337 -0
- package/dist/worker/feature/profile-schema.js +44 -0
- package/dist/worker/feature/ready-plan-projection.js +1 -0
- package/dist/worker/feature/reducer.js +2 -0
- package/dist/worker/feature/review.js +106 -11
- package/dist/worker/materialize/harness-task-materializer.js +5 -0
- package/dist/worker/observability/read-model.js +7 -0
- package/dist/worker/observe/static/views/task.js +1 -0
- package/dist/worker/outcomes/adapters.js +144 -0
- package/dist/worker/outcomes/evidence-tokens.js +29 -0
- package/dist/worker/outcomes/gate.js +40 -0
- package/dist/worker/outcomes/projector.js +185 -0
- package/dist/worker/outcomes/registry.js +1 -0
- package/dist/worker/outcomes/store.js +131 -0
- package/dist/worker/outcomes/types.js +79 -0
- package/dist/worker/report/morning-report.js +4 -3
- package/dist/worker/run-task/run-task.js +85 -2
- package/dist/worker/runner/run-ready.js +32 -1
- package/dist/worker/task-graph/acceptance-schema.js +12 -0
- package/dist/worker/task-graph/ready-planner.js +131 -0
- package/dist/worker/task-graph/task-graph-schema.js +31 -0
- package/dist/worker/task-graph/validate.js +44 -4
- package/dist/worker/task-spec/schema.js +9 -0
- package/dist/worker/task-spec/validate.js +39 -0
- package/dist/worker/task-spec/workflow-routing.js +149 -0
- package/dist/workflows/dag/budget-enforcement.js +67 -0
- package/dist/workflows/dag/context-policy.js +137 -0
- package/dist/workflows/dag/knowledge-curator.js +3 -0
- package/dist/workflows/dag/node-execution.js +11 -4
- package/dist/workflows/dag/prompt.js +1 -1
- package/dist/workflows/dag/runner.js +43 -16
- package/dist/workflows/dag/skill-snapshot.js +11 -7
- package/dist/workflows/dag/types.js +18 -0
- package/docs/init-surface.manifest.json +3 -0
- package/docs/templates/evaluation/campaign-budget-v1.json +12 -0
- package/docs/templates/evaluation/campaign-dogfood-v0.json +24 -0
- package/docs/templates/evaluation/campaign-evidence-v1.json +44 -0
- package/docs/templates/evaluation/context-policy-baseline-v1.json +17 -0
- package/docs/templates/evaluation/context-policy-role-specialized-v1.json +28 -0
- package/docs/templates/evaluation/corpus-dogfood-v0.manifest.json +118 -0
- package/docs/templates/evaluation/matrix-dag-dry-run-v1.json +21 -0
- package/docs/templates/evaluation/matrix-fixture-v1.json +10 -0
- package/docs/templates/evaluation/private-verifier-dogfood-v0.json +16 -0
- package/docs/templates/product-line/AGENTS.md +1 -0
- package/docs/templates/product-line/README.md +17 -0
- package/docs/templates/product-line/acceptance.yaml +9 -0
- package/docs/templates/product-line/feature.yaml +11 -0
- package/docs/templates/product-line/task-graph.yaml +8 -0
- package/docs/templates/product-line/task.yaml +4 -0
- package/harness.json +1 -1
- package/package.json +1 -1
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"docs/templates/product-line/test-plan.md",
|
|
40
40
|
"docs/templates/product-line/task-graph.yaml",
|
|
41
41
|
"docs/templates/product-line/task.yaml",
|
|
42
|
+
"docs/templates/product-line/feature.yaml",
|
|
42
43
|
"docs/templates/product-line/closeout.yaml",
|
|
43
44
|
"docs/templates/product-line/links.md",
|
|
44
45
|
"scripts/kb-bootstrap-init-skeleton.sh",
|
|
@@ -106,6 +107,7 @@
|
|
|
106
107
|
"docs/templates/product-line/test-plan.md",
|
|
107
108
|
"docs/templates/product-line/task-graph.yaml",
|
|
108
109
|
"docs/templates/product-line/task.yaml",
|
|
110
|
+
"docs/templates/product-line/feature.yaml",
|
|
109
111
|
"docs/templates/product-line/closeout.yaml",
|
|
110
112
|
"docs/templates/product-line/links.md",
|
|
111
113
|
"scripts/check-skill-entry.sh",
|
|
@@ -175,6 +177,7 @@
|
|
|
175
177
|
"docs/templates/product-line/test-plan.md": "copied",
|
|
176
178
|
"docs/templates/product-line/task-graph.yaml": "copied",
|
|
177
179
|
"docs/templates/product-line/task.yaml": "copied",
|
|
180
|
+
"docs/templates/product-line/feature.yaml": "copied",
|
|
178
181
|
"docs/templates/product-line/closeout.yaml": "copied",
|
|
179
182
|
"docs/templates/product-line/links.md": "copied",
|
|
180
183
|
"scripts/check-skill-entry.sh": "generated",
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"campaignId": "camp-dogfood-context-policy-ab",
|
|
4
|
+
"createdAt": "2026-07-19T00:00:00.000Z",
|
|
5
|
+
"status": "prepared",
|
|
6
|
+
"policyVersion": "promotion-policy-v1",
|
|
7
|
+
"incumbentCandidateId": "REPLACE_INCUMBENT_CANDIDATE_ID",
|
|
8
|
+
"challengerCandidateIds": ["REPLACE_CHALLENGER_CANDIDATE_ID"],
|
|
9
|
+
"corpusId": "corpus-dogfood-v0",
|
|
10
|
+
"corpusHash": "REPLACE_AFTER_CORPUS_REGISTER",
|
|
11
|
+
"privateVerifierId": "pv-dogfood-v0",
|
|
12
|
+
"privateVerifierManifestHash": "REPLACE_AFTER_PRIVATE_VERIFIER_REGISTER",
|
|
13
|
+
"budget": {
|
|
14
|
+
"schemaVersion": 1,
|
|
15
|
+
"mode": "hard",
|
|
16
|
+
"limits": {
|
|
17
|
+
"maxExecutorCalls": 500,
|
|
18
|
+
"maxWallTimeMs": 86400000,
|
|
19
|
+
"maxRepairPasses": 50,
|
|
20
|
+
"maxConcurrency": 2
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"notes": "M4 dogfood: single-variable Context Policy A/B. Replace candidate/corpus/privateVerifier hashes after register. held_out cells are promotion_gate_only."
|
|
24
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"campaignId": "campaign-dogfood-v0",
|
|
4
|
+
"challengerCandidateId": "cand-challenger-example",
|
|
5
|
+
"cells": [
|
|
6
|
+
{
|
|
7
|
+
"candidateId": "cand-baseline-example",
|
|
8
|
+
"taskRef": "synthetic/private-1",
|
|
9
|
+
"seed": 1,
|
|
10
|
+
"split": "private",
|
|
11
|
+
"verifyPassed": false
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"candidateId": "cand-challenger-example",
|
|
15
|
+
"taskRef": "synthetic/private-1",
|
|
16
|
+
"seed": 1,
|
|
17
|
+
"split": "private",
|
|
18
|
+
"verifyPassed": true
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"candidateId": "cand-baseline-example",
|
|
22
|
+
"taskRef": "synthetic/heldout-1",
|
|
23
|
+
"seed": 1,
|
|
24
|
+
"split": "held_out",
|
|
25
|
+
"verifyPassed": true
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"candidateId": "cand-challenger-example",
|
|
29
|
+
"taskRef": "synthetic/heldout-1",
|
|
30
|
+
"seed": 1,
|
|
31
|
+
"split": "held_out",
|
|
32
|
+
"verifyPassed": true
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"diffs": [],
|
|
36
|
+
"verifyCommands": {
|
|
37
|
+
"incumbent": ["npm test", "npm run typecheck"],
|
|
38
|
+
"challenger": ["npm test", "npm run typecheck"]
|
|
39
|
+
},
|
|
40
|
+
"budgetStatus": {
|
|
41
|
+
"incumbent": "ok",
|
|
42
|
+
"challenger": "ok"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"policyId": "baseline-v1",
|
|
4
|
+
"description": "Current DAG context assembly: shared upstream char budget, role skill defaults, learned patterns only for implementer.",
|
|
5
|
+
"knobs": {
|
|
6
|
+
"maxUpstreamCharsByRole": {
|
|
7
|
+
"default": 2000
|
|
8
|
+
},
|
|
9
|
+
"includeLearnedPatternsRoles": ["implementer"],
|
|
10
|
+
"perSkillMaxCharsByRole": {
|
|
11
|
+
"default": 3000
|
|
12
|
+
},
|
|
13
|
+
"totalMaxCharsByRole": {
|
|
14
|
+
"default": 12000
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"policyId": "role-specialized-v1",
|
|
4
|
+
"description": "Role-specialized upstream and skill-instruction budgets; skill names still resolve via baseline merge order.",
|
|
5
|
+
"knobs": {
|
|
6
|
+
"maxUpstreamCharsByRole": {
|
|
7
|
+
"default": 2000,
|
|
8
|
+
"scout": 1200,
|
|
9
|
+
"reviewer": 1200,
|
|
10
|
+
"implementer": 3000,
|
|
11
|
+
"verifier": 1600,
|
|
12
|
+
"closeout": 1600,
|
|
13
|
+
"planner": 2000,
|
|
14
|
+
"supervisor": 2000
|
|
15
|
+
},
|
|
16
|
+
"includeLearnedPatternsRoles": ["implementer", "closeout"],
|
|
17
|
+
"perSkillMaxCharsByRole": {
|
|
18
|
+
"default": 3000,
|
|
19
|
+
"scout": 2500,
|
|
20
|
+
"implementer": 3500
|
|
21
|
+
},
|
|
22
|
+
"totalMaxCharsByRole": {
|
|
23
|
+
"default": 12000,
|
|
24
|
+
"scout": 10000,
|
|
25
|
+
"implementer": 14000
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"corpusId": "corpus-dogfood-v0",
|
|
4
|
+
"createdAt": "2026-07-19T00:00:00.000Z",
|
|
5
|
+
"description": "W1.5 initial dogfood corpus contract: 15 heterogeneous tasks with public/private/held_out splits. Contract-only; not live campaign evidence.",
|
|
6
|
+
"tasks": [
|
|
7
|
+
{
|
|
8
|
+
"taskRef": "features/F-2026-001/login-flow",
|
|
9
|
+
"class": "fullstack",
|
|
10
|
+
"split": "public",
|
|
11
|
+
"seeds": [1, 2, 3],
|
|
12
|
+
"featureId": "F-2026-001",
|
|
13
|
+
"description": "Dogfood login Feature packet (public feedback allowed)."
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"taskRef": "features/F-2026-002/profile-filter",
|
|
17
|
+
"class": "implement",
|
|
18
|
+
"split": "public",
|
|
19
|
+
"seeds": [1, 2],
|
|
20
|
+
"featureId": "F-2026-002",
|
|
21
|
+
"description": "Profile filter implementation path."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"taskRef": "features/F-2026-005/welcome-banner",
|
|
25
|
+
"class": "fullstack",
|
|
26
|
+
"split": "public",
|
|
27
|
+
"seeds": [1, 2, 3],
|
|
28
|
+
"featureId": "F-2026-005",
|
|
29
|
+
"description": "fullstack-v1 welcome sample (public)."
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"taskRef": "synthetic/docs-agents-converge",
|
|
33
|
+
"class": "docs",
|
|
34
|
+
"split": "public",
|
|
35
|
+
"seeds": [1, 2],
|
|
36
|
+
"description": "Docs/AGENTS converge style task (synthetic contract slot)."
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"taskRef": "synthetic/docs-changelog-summary",
|
|
40
|
+
"class": "docs",
|
|
41
|
+
"split": "public",
|
|
42
|
+
"seeds": [1, 2, 3],
|
|
43
|
+
"description": "Changelog-style documentation task."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"taskRef": "synthetic/frontend-welcome-render",
|
|
47
|
+
"class": "frontend",
|
|
48
|
+
"split": "public",
|
|
49
|
+
"seeds": [1, 2],
|
|
50
|
+
"description": "Frontend render/accessibility contract slot."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"taskRef": "features/F-2026-003/empty-profile-regression",
|
|
54
|
+
"class": "bugfix",
|
|
55
|
+
"split": "private",
|
|
56
|
+
"seeds": [1, 2, 3],
|
|
57
|
+
"featureId": "F-2026-003",
|
|
58
|
+
"description": "Empty profile id/displayName regression (private selection)."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"taskRef": "features/F-2026-004/versioned-bootstrap",
|
|
62
|
+
"class": "bootstrap",
|
|
63
|
+
"split": "private",
|
|
64
|
+
"seeds": [1, 2],
|
|
65
|
+
"featureId": "F-2026-004",
|
|
66
|
+
"description": "Versioned self-host bootstrap canary (private)."
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"taskRef": "synthetic/backend-test-welcome-api",
|
|
70
|
+
"class": "backend-test",
|
|
71
|
+
"split": "private",
|
|
72
|
+
"seeds": [1, 2, 3],
|
|
73
|
+
"description": "Backend API test workflow contract slot."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"taskRef": "synthetic/refactor-outcome-tokens",
|
|
77
|
+
"class": "refactor",
|
|
78
|
+
"split": "private",
|
|
79
|
+
"seeds": [1, 2],
|
|
80
|
+
"description": "Bounded refactor around evidence token naming."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"taskRef": "synthetic/implement-ready-planner-gate",
|
|
84
|
+
"class": "implement",
|
|
85
|
+
"split": "private",
|
|
86
|
+
"seeds": [1, 2, 3],
|
|
87
|
+
"description": "Ready Planner artifact-gate implementation slot."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"taskRef": "synthetic/heldout-docs-handoff",
|
|
91
|
+
"class": "docs",
|
|
92
|
+
"split": "held_out",
|
|
93
|
+
"seeds": [1, 2],
|
|
94
|
+
"description": "Held-out docs/handoff generalization slot; never used for candidate generation."
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"taskRef": "synthetic/heldout-bugfix-gate",
|
|
98
|
+
"class": "bugfix",
|
|
99
|
+
"split": "held_out",
|
|
100
|
+
"seeds": [1, 2, 3],
|
|
101
|
+
"description": "Held-out bugfix gate; promotion-only signal."
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"taskRef": "synthetic/heldout-fullstack-smoke",
|
|
105
|
+
"class": "fullstack",
|
|
106
|
+
"split": "held_out",
|
|
107
|
+
"seeds": [1, 2],
|
|
108
|
+
"description": "Held-out fullstack smoke; not for public feedback."
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
"taskRef": "synthetic/heldout-bootstrap-slot",
|
|
112
|
+
"class": "bootstrap",
|
|
113
|
+
"split": "held_out",
|
|
114
|
+
"seeds": [1, 2, 3],
|
|
115
|
+
"description": "Held-out bootstrap identity/slot discipline."
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"title": "eval-matrix-cell-dry-run",
|
|
4
|
+
"runtimeContract": {
|
|
5
|
+
"schemaVersion": 1,
|
|
6
|
+
"agentRuntime": "pi-only",
|
|
7
|
+
"repairWriterProtocol": "explicit-node-v1"
|
|
8
|
+
},
|
|
9
|
+
"tasks": [
|
|
10
|
+
{
|
|
11
|
+
"id": "matrix-cell-static",
|
|
12
|
+
"depends_on": [],
|
|
13
|
+
"complexity": "LOW",
|
|
14
|
+
"executor": "static",
|
|
15
|
+
"subtask_prompt": "Matrix cell placeholder; evaluation binding is injected by campaign matrix.",
|
|
16
|
+
"static": {
|
|
17
|
+
"resultMarkdown": "matrix cell dry-run placeholder"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"privateVerifierId": "pv-dogfood-v0",
|
|
4
|
+
"createdAt": "2026-07-19T00:00:00.000Z",
|
|
5
|
+
"description": "M4 dogfood private verifier. Controller-only; never enter candidate contentRefs/prompts/skill snapshots.",
|
|
6
|
+
"checks": [
|
|
7
|
+
{
|
|
8
|
+
"checkId": "node-version-ok",
|
|
9
|
+
"kind": "shell",
|
|
10
|
+
"command": ["node", "-e", "process.exit(process.versions.node ? 0 : 1)"],
|
|
11
|
+
"cwd": ".",
|
|
12
|
+
"timeoutMs": 15000,
|
|
13
|
+
"expectedExitCode": 0
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -4,5 +4,6 @@
|
|
|
4
4
|
- Treat `constraints.allowed_paths` and `constraints.forbidden_paths` as machine-enforced write boundaries; review DAG writer `writeSet` before execution.
|
|
5
5
|
- Advance only tasks whose dependencies are complete. Preserve failed run records; retries receive new worker run IDs.
|
|
6
6
|
- A Ready task must have acceptance references, non-empty allowed/forbidden paths, and deterministic verification commands.
|
|
7
|
+
- For `fullstack-v1` packets (`feature.yaml`), every TaskSpec should declare `execution.workflow`; required ACs need implementation/verification refs, `required_evidence`, and integration policy. Parallel writers must not share overlapping `allowed_paths`.
|
|
7
8
|
- QA records an independent verdict and evidence. Do not write `status: success` closeout until `qa_verdict: pass` and non-empty `qa_evidence` exist.
|
|
8
9
|
- Human gates remain human decisions. Record owner, time, reason, evidence, and follow-up without rewriting failed history.
|
|
@@ -7,3 +7,20 @@ agent-worker task validate-feature <feature-dir>
|
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
The validator checks acceptance ID uniqueness, task references and dependencies, cycles, TaskSpec/path/verification completeness, and QA evidence before a successful closeout.
|
|
10
|
+
|
|
11
|
+
## Profiles
|
|
12
|
+
|
|
13
|
+
| Profile | How to declare | Behavior |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| `generic`(默认) | 省略 `feature.yaml`,或 `profile: generic` | 保持 legacy 校验;不强制 `execution.workflow` / 双覆盖 AC |
|
|
16
|
+
| `fullstack-v1` | `feature.yaml` 中 `profile: fullstack-v1` 并声明 `scope` | 强制显式 workflow、required AC 双覆盖、frontend-test 依赖、writer writeSet 串行等结构门禁 |
|
|
17
|
+
|
|
18
|
+
端到端全栈 dogfood 样板见仓库 `features/F-2026-005/`(欢迎语链路:契约 → BE/FE 实现 → backend-test / frontend-test → Final Verification)。
|
|
19
|
+
|
|
20
|
+
## Minimal files
|
|
21
|
+
|
|
22
|
+
- `feature.yaml`(可选;fullstack 必填)
|
|
23
|
+
- `requirement.md` / `design.md` / `test-plan.md`
|
|
24
|
+
- `acceptance.yaml`
|
|
25
|
+
- `tasks/task-graph.yaml` + `tasks/*.yaml`
|
|
26
|
+
- `links.md` / `closeout.yaml`(按交付阶段)
|
|
@@ -12,3 +12,12 @@ acceptance:
|
|
|
12
12
|
expected_task_refs:
|
|
13
13
|
- BE-001
|
|
14
14
|
- QA-001
|
|
15
|
+
# fullstack-v1 required AC fields (optional for generic packets):
|
|
16
|
+
# implementation_task_refs:
|
|
17
|
+
# - BE-001
|
|
18
|
+
# verification_task_refs:
|
|
19
|
+
# - BE-TEST-001
|
|
20
|
+
# required_evidence:
|
|
21
|
+
# - backend-test-result-v1
|
|
22
|
+
# - shell_verification
|
|
23
|
+
# integration: real-required
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
feature_id: F-YYYY-NNN
|
|
3
|
+
# generic = legacy/simple packet (default when this file is absent)
|
|
4
|
+
# fullstack-v1 = enable structural gates for explicit workflows + dual-coverage ACs
|
|
5
|
+
profile: generic
|
|
6
|
+
# Uncomment and set true flags when profile is fullstack-v1:
|
|
7
|
+
# scope:
|
|
8
|
+
# backend: true
|
|
9
|
+
# frontend: true
|
|
10
|
+
# backendVerification: true
|
|
11
|
+
# frontendVerification: true
|
|
@@ -5,11 +5,19 @@ nodes:
|
|
|
5
5
|
task: BE-001.yaml
|
|
6
6
|
type: backend-feature
|
|
7
7
|
depends_on: []
|
|
8
|
+
# Optional artifact-aware edges (Ready Planner envelope-level gate):
|
|
9
|
+
# produces:
|
|
10
|
+
# - kind: backend-impl
|
|
11
|
+
# schemaId: backend-impl-v1
|
|
8
12
|
- id: QA-001
|
|
9
13
|
task: QA-001.yaml
|
|
10
14
|
type: qa-execute
|
|
11
15
|
depends_on:
|
|
12
16
|
- BE-001
|
|
17
|
+
# consumes:
|
|
18
|
+
# - kind: backend-impl
|
|
19
|
+
# schemaId: backend-impl-v1
|
|
20
|
+
# producerTaskId: BE-001
|
|
13
21
|
parallel_policy:
|
|
14
22
|
max_parallel_tasks: 2
|
|
15
23
|
disallow_same_file_parallel_writes: true
|
|
@@ -30,6 +30,10 @@ constraints:
|
|
|
30
30
|
- <protected/path/**>
|
|
31
31
|
hard_constraints:
|
|
32
32
|
- Do not access production secrets
|
|
33
|
+
# Explicit runtime workflow → taskKind. For fullstack-v1 packets this should be set
|
|
34
|
+
# on every TaskSpec. Allowed: agent-dag | frontend-implementation | backend-test | frontend-test
|
|
35
|
+
execution:
|
|
36
|
+
workflow: agent-dag
|
|
33
37
|
verify:
|
|
34
38
|
preset: standard
|
|
35
39
|
mode: serial
|
package/harness.json
CHANGED