@tea-agent/loop-agent 0.16.0 → 0.16.1-beta.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.
Files changed (71) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +3 -55
  3. package/README.md +1 -1
  4. package/dist/application/evaluation/candidate.js +6 -23
  5. package/dist/application/evaluation/types.js +0 -522
  6. package/dist/cli/command-definitions.js +3 -19
  7. package/dist/commands/eval.js +13 -1176
  8. package/dist/commands/init.js +1 -4
  9. package/dist/executors/dag-pi-executor.js +44 -4
  10. package/dist/worker/delivery/verification-bundle.js +2 -13
  11. package/dist/worker/feature/review.js +2 -3
  12. package/dist/worker/outcomes/adapters.js +1 -4
  13. package/dist/worker/outcomes/gate.js +11 -10
  14. package/dist/worker/outcomes/projector.js +1 -10
  15. package/dist/worker/outcomes/types.js +0 -3
  16. package/dist/worker/run-task/run-task.js +4 -23
  17. package/dist/worker/task-graph/ready-planner.js +8 -14
  18. package/dist/worker/task-graph/task-graph-schema.js +3 -5
  19. package/dist/workflows/dag/init-hybrid.js +3 -2
  20. package/dist/workflows/dag/knowledge-curator.js +0 -3
  21. package/dist/workflows/dag/node-execution.js +4 -11
  22. package/dist/workflows/dag/prompt.js +1 -1
  23. package/dist/workflows/dag/runner.js +16 -43
  24. package/dist/workflows/dag/skill-snapshot.js +7 -11
  25. package/dist/workflows/dag/types.js +1 -18
  26. package/docs/init-surface.manifest.json +0 -3
  27. package/docs/templates/agent-dag.schema.json +5 -0
  28. package/docs/templates/product-line/AGENTS.md +0 -1
  29. package/docs/templates/product-line/README.md +0 -17
  30. package/docs/templates/product-line/acceptance.yaml +0 -9
  31. package/docs/templates/product-line/task-graph.yaml +0 -8
  32. package/docs/templates/product-line/task.yaml +0 -4
  33. package/package.json +1 -1
  34. package/skills/frontend-implementation/references/node-contracts.md +2 -2
  35. package/skills/loop-agent/references/hybrid-dag.md +1 -1
  36. package/dist/application/evaluation/alias.js +0 -184
  37. package/dist/application/evaluation/budget.js +0 -192
  38. package/dist/application/evaluation/campaign-hash.js +0 -47
  39. package/dist/application/evaluation/campaign-matrix.js +0 -372
  40. package/dist/application/evaluation/campaign-scorecard.js +0 -135
  41. package/dist/application/evaluation/campaign.js +0 -370
  42. package/dist/application/evaluation/corpus-hash.js +0 -38
  43. package/dist/application/evaluation/corpus.js +0 -56
  44. package/dist/application/evaluation/experiment.js +0 -294
  45. package/dist/application/evaluation/ignition.js +0 -198
  46. package/dist/application/evaluation/integrity-audit.js +0 -162
  47. package/dist/application/evaluation/outer-loop.js +0 -132
  48. package/dist/application/evaluation/pi-cell-executor.js +0 -39
  49. package/dist/application/evaluation/private-verifier.js +0 -46
  50. package/dist/application/evaluation/promotion-policy.js +0 -151
  51. package/dist/application/evaluation/proposer.js +0 -98
  52. package/dist/infrastructure/evaluation/alias-store.js +0 -199
  53. package/dist/infrastructure/evaluation/campaign-store.js +0 -154
  54. package/dist/infrastructure/evaluation/corpus-store.js +0 -181
  55. package/dist/infrastructure/evaluation/experiment-store.js +0 -124
  56. package/dist/infrastructure/evaluation/ignition-store.js +0 -82
  57. package/dist/infrastructure/evaluation/private-verifier-store.js +0 -145
  58. package/dist/infrastructure/evaluation/proposer-store.js +0 -78
  59. package/dist/worker/outcomes/evidence-tokens.js +0 -29
  60. package/dist/workflows/dag/budget-enforcement.js +0 -67
  61. package/dist/workflows/dag/context-policy.js +0 -137
  62. package/docs/templates/evaluation/campaign-budget-v1.json +0 -12
  63. package/docs/templates/evaluation/campaign-dogfood-v0.json +0 -24
  64. package/docs/templates/evaluation/campaign-evidence-v1.json +0 -44
  65. package/docs/templates/evaluation/context-policy-baseline-v1.json +0 -17
  66. package/docs/templates/evaluation/context-policy-role-specialized-v1.json +0 -28
  67. package/docs/templates/evaluation/corpus-dogfood-v0.manifest.json +0 -118
  68. package/docs/templates/evaluation/matrix-dag-dry-run-v1.json +0 -21
  69. package/docs/templates/evaluation/matrix-fixture-v1.json +0 -10
  70. package/docs/templates/evaluation/private-verifier-dogfood-v0.json +0 -16
  71. package/docs/templates/product-line/feature.yaml +0 -11
@@ -1,78 +0,0 @@
1
- import { access, mkdir, mkdtemp, readdir, readFile, rename, rm } from "node:fs/promises";
2
- import path from "node:path";
3
- import { proposerRunIdSchema, proposerRunSchema, } from "../../application/evaluation/types.js";
4
- import { sha256Hex } from "../../application/evaluation/candidate-hash.js";
5
- import { writeJsonAtomic, writeTextAtomic } from "../harness/atomic-write.js";
6
- import { EVALUATION_ROOT } from "./store.js";
7
- const SAFE_ID = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
8
- const MANIFEST_INTEGRITY_FILE = "manifest.sha256";
9
- export function assertProposerRunId(value) {
10
- proposerRunIdSchema.parse(value);
11
- }
12
- export function proposerRunDir(repoRoot, proposerRunId) {
13
- assertProposerRunId(proposerRunId);
14
- return path.join(repoRoot, EVALUATION_ROOT, "proposer-runs", proposerRunId);
15
- }
16
- export function proposerRunManifestPath(repoRoot, proposerRunId) {
17
- return path.join(proposerRunDir(repoRoot, proposerRunId), "manifest.json");
18
- }
19
- async function pathExists(filePath) {
20
- try {
21
- await access(filePath);
22
- return true;
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- function serialize(record) {
29
- return `${JSON.stringify(record, null, 2)}\n`;
30
- }
31
- export async function writeProposerRun(input) {
32
- const parsed = proposerRunSchema.parse(input.run);
33
- const root = path.dirname(proposerRunDir(input.repoRoot, parsed.proposerRunId));
34
- await mkdir(root, { recursive: true });
35
- const stagingDir = await mkdtemp(path.join(root, `.${parsed.proposerRunId}.register-`));
36
- const manifestPath = proposerRunManifestPath(input.repoRoot, parsed.proposerRunId);
37
- try {
38
- if (await pathExists(manifestPath)) {
39
- throw new Error(`proposer run already exists: ${parsed.proposerRunId}`);
40
- }
41
- await writeJsonAtomic(path.join(stagingDir, "manifest.json"), parsed, {
42
- repoRoot: input.repoRoot,
43
- });
44
- await writeTextAtomic(path.join(stagingDir, MANIFEST_INTEGRITY_FILE), `${sha256Hex(serialize(parsed))}\n`, { repoRoot: input.repoRoot });
45
- await rename(stagingDir, proposerRunDir(input.repoRoot, parsed.proposerRunId));
46
- }
47
- catch (error) {
48
- await rm(stagingDir, { recursive: true, force: true });
49
- throw error;
50
- }
51
- return manifestPath;
52
- }
53
- export async function readProposerRun(repoRoot, proposerRunId) {
54
- assertProposerRunId(proposerRunId);
55
- const manifestPath = proposerRunManifestPath(repoRoot, proposerRunId);
56
- const rawText = await readFile(manifestPath, "utf-8");
57
- const expected = (await readFile(path.join(proposerRunDir(repoRoot, proposerRunId), MANIFEST_INTEGRITY_FILE), "utf-8")).trim();
58
- if (sha256Hex(rawText) !== expected) {
59
- throw new Error(`proposer run integrity mismatch for ${proposerRunId}`);
60
- }
61
- return proposerRunSchema.parse(JSON.parse(rawText));
62
- }
63
- export async function listProposerRunIds(repoRoot) {
64
- const root = path.join(repoRoot, EVALUATION_ROOT, "proposer-runs");
65
- try {
66
- const entries = await readdir(root, { withFileTypes: true });
67
- return entries
68
- .filter((entry) => entry.isDirectory() && SAFE_ID.test(entry.name))
69
- .map((entry) => entry.name)
70
- .sort();
71
- }
72
- catch (error) {
73
- const code = error.code;
74
- if (code === "ENOENT")
75
- return [];
76
- throw error;
77
- }
78
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * Shared evidence / artifact identity helpers for Outcome gates, Feature review,
3
- * and Feature Verification Bundle projection.
4
- */
5
- /** Canonical required-output / required_evidence token for shell exit-zero. */
6
- export const SHELL_VERIFICATION_TOKEN = "shell_verification";
7
- /**
8
- * Accept the canonical underscore form and the legacy hyphen form used in early
9
- * fullstack packets so dual-coverage and bundle evidence stay aligned.
10
- */
11
- export function isShellVerificationToken(token) {
12
- return token === SHELL_VERIFICATION_TOKEN || token === "shell-verification";
13
- }
14
- /** Match an evidence token against artifact `kind` or `schemaId`. */
15
- export function artifactMatchesEvidenceToken(artifact, token) {
16
- return artifact.kind === token || artifact.schemaId === token;
17
- }
18
- /**
19
- * Derive stable `kind` + versioned `schemaId` from a DAG structured-artifact
20
- * schema id (e.g. `backend-test-result-v1` → kind `backend-test-result`).
21
- * Unversioned ids keep kind === schemaId.
22
- */
23
- export function splitStructuredArtifactIdentity(schemaId) {
24
- const match = /^(.*)-v\d+$/.exec(schemaId);
25
- if (match?.[1]) {
26
- return { kind: match[1], schemaId };
27
- }
28
- return { kind: schemaId, schemaId };
29
- }
@@ -1,67 +0,0 @@
1
- import { writeFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { checkBudgetPreNode, createBudgetLedger, formatBudgetReportMarkdown, isHardBudgetBreached, recordNodeBudgetSample, skipPendingNodesForBudgetBreach, } from "../../application/evaluation/budget.js";
4
- export function initRunBudgetLedger(state, budget) {
5
- if (!budget)
6
- return;
7
- state.budget = structuredClone(budget);
8
- state.budgetLedger = createBudgetLedger(budget);
9
- }
10
- function wallTimeMs(state, now = Date.now()) {
11
- return Math.max(0, now - new Date(state.startedAt).getTime());
12
- }
13
- function repairPasses(state) {
14
- return state.convergence?.currentPass ?? 0;
15
- }
16
- export function applyHardBudgetBreach(state, breach) {
17
- if (!state.budgetLedger || state.budgetLedger.mode !== "hard")
18
- return;
19
- skipPendingNodesForBudgetBreach(state.nodes, breach);
20
- state.failureCategory = "budget_breach";
21
- }
22
- export function preflightBudgetOrBreach(state) {
23
- const ledger = state.budgetLedger;
24
- if (!ledger)
25
- return undefined;
26
- const breach = checkBudgetPreNode(ledger, {
27
- wallTimeMs: wallTimeMs(state),
28
- repairPasses: repairPasses(state),
29
- });
30
- if (breach && isHardBudgetBreached(ledger)) {
31
- applyHardBudgetBreach(state, breach);
32
- }
33
- return breach;
34
- }
35
- export function recordFinishedNodeBudget(state, node, contextChars) {
36
- const ledger = state.budgetLedger;
37
- if (!ledger)
38
- return undefined;
39
- const breach = recordNodeBudgetSample(ledger, {
40
- nodeId: node.id,
41
- tokensUsed: node.tokensUsed,
42
- contextChars,
43
- wallTimeMs: wallTimeMs(state),
44
- repairPasses: repairPasses(state),
45
- });
46
- if (breach && isHardBudgetBreached(ledger)) {
47
- applyHardBudgetBreach(state, breach);
48
- }
49
- return breach;
50
- }
51
- export async function writeBudgetLedgerArtifacts(runDir, ledger) {
52
- if (!ledger)
53
- return;
54
- const jsonPath = path.join(runDir, "budget-ledger.json");
55
- const mdPath = path.join(runDir, "budget-report.md");
56
- await writeFile(jsonPath, `${JSON.stringify(ledger, null, 2)}\n`, "utf8");
57
- await writeFile(mdPath, formatBudgetReportMarkdown(ledger), "utf8");
58
- }
59
- export function assertFrozenBudget(specBudget, stateBudget, runId) {
60
- if (!specBudget && !stateBudget)
61
- return;
62
- if (!specBudget ||
63
- !stateBudget ||
64
- JSON.stringify(specBudget) !== JSON.stringify(stateBudget)) {
65
- throw new Error(`dag run ${runId} budget drifted between run.json and state.json; refuse to continue`);
66
- }
67
- }
@@ -1,137 +0,0 @@
1
- import { DEFAULT_SKILL_INSTRUCTION_MAX_CHARS, DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS, } from "./skill-instructions.js";
2
- import { MAX_UPSTREAM_CHARS } from "./prompt.js";
3
- import { resolveDagNodeSkills } from "./skills.js";
4
- export const CONTEXT_POLICY_IDS = [
5
- "baseline-v1",
6
- "role-specialized-v1",
7
- ];
8
- export const DEFAULT_CONTEXT_POLICY_ID = "baseline-v1";
9
- function roleOrUndefined(task) {
10
- return task.role;
11
- }
12
- function pickByRole(table, role) {
13
- if (role && table[role] !== undefined)
14
- return table[role];
15
- return table.default;
16
- }
17
- class BaselineContextPolicy {
18
- id = "baseline-v1";
19
- description = "Current DAG context assembly: shared upstream char budget, role skill defaults, learned patterns only for implementer.";
20
- resolveSkills(spec, task) {
21
- return resolveDagNodeSkills(spec, task);
22
- }
23
- resolveSkillInstructionBudget(task) {
24
- return {
25
- includeLearnedPatterns: task.role === "implementer",
26
- perSkillMaxChars: DEFAULT_SKILL_INSTRUCTION_MAX_CHARS,
27
- totalMaxChars: DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS,
28
- };
29
- }
30
- resolveMaxUpstreamChars(_task) {
31
- return MAX_UPSTREAM_CHARS;
32
- }
33
- toManifest() {
34
- return {
35
- schemaVersion: 1,
36
- policyId: this.id,
37
- description: this.description,
38
- knobs: {
39
- maxUpstreamCharsByRole: { default: MAX_UPSTREAM_CHARS },
40
- includeLearnedPatternsRoles: ["implementer"],
41
- perSkillMaxCharsByRole: {
42
- default: DEFAULT_SKILL_INSTRUCTION_MAX_CHARS,
43
- },
44
- totalMaxCharsByRole: {
45
- default: DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS,
46
- },
47
- },
48
- };
49
- }
50
- }
51
- /**
52
- * First A/B challenger: keep skill name resolution identical to baseline, but
53
- * specialize upstream / skill-instruction budgets by role so scouts see less
54
- * noise and implementers retain more upstream + learned patterns surface.
55
- */
56
- class RoleSpecializedContextPolicy {
57
- id = "role-specialized-v1";
58
- description = "Role-specialized upstream and skill-instruction budgets; skill names still resolve via baseline merge order.";
59
- maxUpstreamCharsByRole = {
60
- default: MAX_UPSTREAM_CHARS,
61
- scout: 1_200,
62
- reviewer: 1_200,
63
- implementer: 3_000,
64
- verifier: 1_600,
65
- closeout: 1_600,
66
- planner: MAX_UPSTREAM_CHARS,
67
- supervisor: MAX_UPSTREAM_CHARS,
68
- };
69
- perSkillMaxCharsByRole = {
70
- default: DEFAULT_SKILL_INSTRUCTION_MAX_CHARS,
71
- scout: 2_500,
72
- implementer: 3_500,
73
- };
74
- totalMaxCharsByRole = {
75
- default: DEFAULT_SKILL_INSTRUCTION_TOTAL_MAX_CHARS,
76
- scout: 10_000,
77
- implementer: 14_000,
78
- };
79
- learnedPatternRoles = new Set([
80
- "implementer",
81
- "closeout",
82
- ]);
83
- resolveSkills(spec, task) {
84
- return resolveDagNodeSkills(spec, task);
85
- }
86
- resolveSkillInstructionBudget(task) {
87
- const role = roleOrUndefined(task);
88
- return {
89
- includeLearnedPatterns: role
90
- ? this.learnedPatternRoles.has(role)
91
- : false,
92
- perSkillMaxChars: pickByRole(this.perSkillMaxCharsByRole, role),
93
- totalMaxChars: pickByRole(this.totalMaxCharsByRole, role),
94
- };
95
- }
96
- resolveMaxUpstreamChars(task) {
97
- return pickByRole(this.maxUpstreamCharsByRole, roleOrUndefined(task));
98
- }
99
- toManifest() {
100
- return {
101
- schemaVersion: 1,
102
- policyId: this.id,
103
- description: this.description,
104
- knobs: {
105
- maxUpstreamCharsByRole: this.maxUpstreamCharsByRole,
106
- includeLearnedPatternsRoles: [...this.learnedPatternRoles],
107
- perSkillMaxCharsByRole: this.perSkillMaxCharsByRole,
108
- totalMaxCharsByRole: this.totalMaxCharsByRole,
109
- },
110
- };
111
- }
112
- }
113
- const POLICIES = {
114
- "baseline-v1": new BaselineContextPolicy(),
115
- "role-specialized-v1": new RoleSpecializedContextPolicy(),
116
- };
117
- export function isContextPolicyId(value) {
118
- return CONTEXT_POLICY_IDS.includes(value);
119
- }
120
- export function getContextPolicy(policyId) {
121
- return POLICIES[policyId];
122
- }
123
- export function listContextPolicies() {
124
- return CONTEXT_POLICY_IDS.map((id) => POLICIES[id]);
125
- }
126
- export function resolveContextPolicyId(spec) {
127
- const raw = spec.defaults?.contextPolicyId;
128
- if (!raw)
129
- return DEFAULT_CONTEXT_POLICY_ID;
130
- if (!isContextPolicyId(raw)) {
131
- throw new Error(`unknown contextPolicyId "${raw}"; expected one of ${CONTEXT_POLICY_IDS.join(", ")}`);
132
- }
133
- return raw;
134
- }
135
- export function resolveContextPolicy(spec) {
136
- return getContextPolicy(resolveContextPolicyId(spec));
137
- }
@@ -1,12 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "mode": "hard",
4
- "limits": {
5
- "maxTokens": 2000000,
6
- "maxWallTimeMs": 86400000,
7
- "maxExecutorCalls": 500,
8
- "maxRepairPasses": 50,
9
- "maxConcurrency": 2,
10
- "maxContextChars": 120000
11
- }
12
- }
@@ -1,24 +0,0 @@
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
- }
@@ -1,44 +0,0 @@
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
- }
@@ -1,17 +0,0 @@
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
- }
@@ -1,28 +0,0 @@
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
- }
@@ -1,118 +0,0 @@
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
- }
@@ -1,21 +0,0 @@
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
- }
@@ -1,10 +0,0 @@
1
- {
2
- "schemaVersion": 1,
3
- "defaultVerifyPassed": false,
4
- "results": [
5
- {
6
- "split": "public",
7
- "verifyPassed": true
8
- }
9
- ]
10
- }
@@ -1,16 +0,0 @@
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
- }
@@ -1,11 +0,0 @@
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