@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.
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +3 -55
- package/README.md +1 -1
- package/dist/application/evaluation/candidate.js +6 -23
- package/dist/application/evaluation/types.js +0 -522
- package/dist/cli/command-definitions.js +3 -19
- package/dist/commands/eval.js +13 -1176
- package/dist/commands/init.js +1 -4
- package/dist/executors/dag-pi-executor.js +44 -4
- package/dist/worker/delivery/verification-bundle.js +2 -13
- package/dist/worker/feature/review.js +2 -3
- package/dist/worker/outcomes/adapters.js +1 -4
- package/dist/worker/outcomes/gate.js +11 -10
- package/dist/worker/outcomes/projector.js +1 -10
- package/dist/worker/outcomes/types.js +0 -3
- package/dist/worker/run-task/run-task.js +4 -23
- package/dist/worker/task-graph/ready-planner.js +8 -14
- package/dist/worker/task-graph/task-graph-schema.js +3 -5
- package/dist/workflows/dag/init-hybrid.js +3 -2
- package/dist/workflows/dag/knowledge-curator.js +0 -3
- package/dist/workflows/dag/node-execution.js +4 -11
- package/dist/workflows/dag/prompt.js +1 -1
- package/dist/workflows/dag/runner.js +16 -43
- package/dist/workflows/dag/skill-snapshot.js +7 -11
- package/dist/workflows/dag/types.js +1 -18
- package/docs/init-surface.manifest.json +0 -3
- package/docs/templates/agent-dag.schema.json +5 -0
- package/docs/templates/product-line/AGENTS.md +0 -1
- package/docs/templates/product-line/README.md +0 -17
- package/docs/templates/product-line/acceptance.yaml +0 -9
- package/docs/templates/product-line/task-graph.yaml +0 -8
- package/docs/templates/product-line/task.yaml +0 -4
- package/package.json +1 -1
- package/skills/frontend-implementation/references/node-contracts.md +2 -2
- package/skills/loop-agent/references/hybrid-dag.md +1 -1
- package/dist/application/evaluation/alias.js +0 -184
- package/dist/application/evaluation/budget.js +0 -192
- package/dist/application/evaluation/campaign-hash.js +0 -47
- package/dist/application/evaluation/campaign-matrix.js +0 -372
- package/dist/application/evaluation/campaign-scorecard.js +0 -135
- package/dist/application/evaluation/campaign.js +0 -370
- package/dist/application/evaluation/corpus-hash.js +0 -38
- package/dist/application/evaluation/corpus.js +0 -56
- package/dist/application/evaluation/experiment.js +0 -294
- package/dist/application/evaluation/ignition.js +0 -198
- package/dist/application/evaluation/integrity-audit.js +0 -162
- package/dist/application/evaluation/outer-loop.js +0 -132
- package/dist/application/evaluation/pi-cell-executor.js +0 -39
- package/dist/application/evaluation/private-verifier.js +0 -46
- package/dist/application/evaluation/promotion-policy.js +0 -151
- package/dist/application/evaluation/proposer.js +0 -98
- package/dist/infrastructure/evaluation/alias-store.js +0 -199
- package/dist/infrastructure/evaluation/campaign-store.js +0 -154
- package/dist/infrastructure/evaluation/corpus-store.js +0 -181
- package/dist/infrastructure/evaluation/experiment-store.js +0 -124
- package/dist/infrastructure/evaluation/ignition-store.js +0 -82
- package/dist/infrastructure/evaluation/private-verifier-store.js +0 -145
- package/dist/infrastructure/evaluation/proposer-store.js +0 -78
- package/dist/worker/outcomes/evidence-tokens.js +0 -29
- package/dist/workflows/dag/budget-enforcement.js +0 -67
- package/dist/workflows/dag/context-policy.js +0 -137
- package/docs/templates/evaluation/campaign-budget-v1.json +0 -12
- package/docs/templates/evaluation/campaign-dogfood-v0.json +0 -24
- package/docs/templates/evaluation/campaign-evidence-v1.json +0 -44
- package/docs/templates/evaluation/context-policy-baseline-v1.json +0 -17
- package/docs/templates/evaluation/context-policy-role-specialized-v1.json +0 -28
- package/docs/templates/evaluation/corpus-dogfood-v0.manifest.json +0 -118
- package/docs/templates/evaluation/matrix-dag-dry-run-v1.json +0 -21
- package/docs/templates/evaluation/matrix-fixture-v1.json +0 -10
- package/docs/templates/evaluation/private-verifier-dogfood-v0.json +0 -16
- 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,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,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
|