@urateam/core 0.1.8 → 0.1.10

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 (34) hide show
  1. package/dist/__tests__/agent-profiles.test.d.ts +2 -0
  2. package/dist/__tests__/agent-profiles.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-profiles.test.js +120 -0
  4. package/dist/__tests__/agent-profiles.test.js.map +1 -0
  5. package/dist/__tests__/executor.test.js +3 -1
  6. package/dist/__tests__/executor.test.js.map +1 -1
  7. package/dist/__tests__/extract-handoff.test.js +202 -0
  8. package/dist/__tests__/extract-handoff.test.js.map +1 -1
  9. package/dist/__tests__/stage-models.test.js.map +1 -1
  10. package/dist/executor/executor.d.ts.map +1 -1
  11. package/dist/executor/executor.js +9 -3
  12. package/dist/executor/executor.js.map +1 -1
  13. package/dist/executor/extract-handoff.d.ts +18 -2
  14. package/dist/executor/extract-handoff.d.ts.map +1 -1
  15. package/dist/executor/extract-handoff.js +106 -18
  16. package/dist/executor/extract-handoff.js.map +1 -1
  17. package/dist/executor/handoff.d.ts.map +1 -1
  18. package/dist/executor/handoff.js +6 -0
  19. package/dist/executor/handoff.js.map +1 -1
  20. package/dist/executor/index.d.ts +1 -1
  21. package/dist/executor/index.d.ts.map +1 -1
  22. package/dist/executor/index.js +1 -1
  23. package/dist/executor/index.js.map +1 -1
  24. package/dist/executor/profiles.d.ts +42 -0
  25. package/dist/executor/profiles.d.ts.map +1 -1
  26. package/dist/executor/profiles.js +147 -2
  27. package/dist/executor/profiles.js.map +1 -1
  28. package/dist/pipeline/runner.d.ts.map +1 -1
  29. package/dist/pipeline/runner.js +6 -2
  30. package/dist/pipeline/runner.js.map +1 -1
  31. package/dist/webhook/handler.d.ts.map +1 -1
  32. package/dist/webhook/handler.js +6 -1
  33. package/dist/webhook/handler.js.map +1 -1
  34. package/package.json +1 -1
@@ -2,21 +2,111 @@ import { parseHandoffArtifact, buildFallback } from "./handoff.js";
2
2
  import { gitExecSafe, gitExecRaw } from "../repo/git.js";
3
3
  import { createLogger } from "../logger.js";
4
4
  const log = createLogger({ component: "ExtractHandoff" });
5
+ /**
6
+ * Parse `git status --porcelain` output into a list of changed file paths.
7
+ * Handles renames ("XY old -> new" — emit `new`).
8
+ */
9
+ function parseGitPorcelain(statusOutput) {
10
+ if (!statusOutput)
11
+ return [];
12
+ return statusOutput
13
+ .split("\n")
14
+ .filter(Boolean)
15
+ .map((line) => {
16
+ const path = line.substring(3);
17
+ const arrowIdx = path.indexOf(" -> ");
18
+ return arrowIdx >= 0 ? path.substring(arrowIdx + 4) : path;
19
+ })
20
+ .filter(Boolean);
21
+ }
22
+ /**
23
+ * Parse `git diff --name-only` output into a list of changed file paths.
24
+ * Newline-separated; one path per line.
25
+ */
26
+ function parseGitDiffNames(output) {
27
+ if (!output)
28
+ return [];
29
+ return output.split("\n").map((p) => p.trim()).filter(Boolean);
30
+ }
31
+ /**
32
+ * Compute "what did the agent change in this branch" by combining the
33
+ * uncommitted worktree state (`git status --porcelain`) with the
34
+ * already-committed-on-the-branch diff against `baseRef` (`git diff
35
+ * --name-only baseRef...HEAD`).
36
+ *
37
+ * Both signals are needed because the runner runs `autoCommitChanges`
38
+ * between stages — which means a review-stage handoff sees a clean
39
+ * worktree, even though the implement stage just modified 15 files. Status
40
+ * alone misses those committed-then-rewound changes.
41
+ *
42
+ * fail-open: gitExecRaw resolves to "" on error, so a missing baseRef
43
+ * (e.g., no `origin/main` configured in a test repo) is silent.
44
+ */
45
+ async function gitChangedFilesAcross(workdir, baseRef) {
46
+ const statusOutput = await gitExecRaw(["status", "--porcelain"], workdir);
47
+ const fromStatus = parseGitPorcelain(statusOutput);
48
+ if (!baseRef)
49
+ return fromStatus;
50
+ const diffOutput = await gitExecRaw(["diff", "--name-only", `${baseRef}...HEAD`], workdir);
51
+ const fromDiff = parseGitDiffNames(diffOutput);
52
+ // Dedupe in case a file shows up in both (unlikely but possible if the
53
+ // agent partially committed and then made more edits).
54
+ return Array.from(new Set([...fromStatus, ...fromDiff]));
55
+ }
5
56
  /**
6
57
  * Extract a structured handoff artifact from the stage agent's raw output
7
58
  * and the actual worktree state.
8
59
  *
9
60
  * Strategy:
10
- * 1. Fast path: if the agent already produced valid JSON, use it directly
61
+ * 1. Fast path: if the agent already produced valid JSON, use it — but
62
+ * cross-check against the union of `git status --porcelain` (uncommitted)
63
+ * and `git diff --name-only baseRef...HEAD` (committed on this branch
64
+ * since it diverged from baseRef). Override an empty `filesChanged`
65
+ * list when git shows real changes (urateam#35). The committed-half
66
+ * of that union is load-bearing: the runner runs autoCommitChanges
67
+ * between stages, so by review-stage time the worktree is clean even
68
+ * though the implement stage modified N files. Status alone misses
69
+ * that case (gap from PR #95).
11
70
  * 2. Otherwise, run git commands to get actual file changes and build the
12
71
  * handoff programmatically from the diff + agent's raw text output
13
72
  *
14
73
  * No agent subprocess needed — this is fast and deterministic.
15
74
  */
16
- export async function extractHandoff(agentOutput, runId, issueId, stage, workdir) {
75
+ export async function extractHandoff(agentOutput, runId, issueId, stage, workdir,
76
+ /**
77
+ * Optional base ref (e.g., "origin/main") to compare HEAD against for the
78
+ * "agent committed work on the branch" portion of the empty-filesChanged
79
+ * override. When absent, only the worktree (`git status --porcelain`) is
80
+ * consulted — i.e., the PR #95 behavior. Pass the full ref form including
81
+ * any `origin/` prefix the caller wants.
82
+ */
83
+ baseRef) {
17
84
  // Fast path: if the agent already produced valid structured JSON, use it
18
85
  const fastResult = parseHandoffArtifact(agentOutput, runId, issueId, stage);
19
86
  if (fastResult.structured) {
87
+ // Sanity check against git: an empty `filesChanged` from the agent is
88
+ // the symptom of urateam#35 — the agent's structured output can be
89
+ // malformed (e.g., self-critique JSON leaks into `summary` and
90
+ // `filesChanged: []` is emitted alongside) while the diff is real.
91
+ // Trust git as the authoritative source only when the agent says
92
+ // nothing changed.
93
+ //
94
+ // We deliberately do NOT override a non-empty agent list, even when it
95
+ // disagrees with git — agents may legitimately filter their list (e.g.,
96
+ // exclude generated files), and the rotulus PR #7 symptom that drives
97
+ // this fix is specifically the empty-on-multi-file case.
98
+ //
99
+ // gitExecRaw fails-open to "" on error rather than rejecting, so a
100
+ // missing remote/baseRef is silent. Mutation of fastResult.artifact
101
+ // is safe — fastResult is a local var produced by parseHandoffArtifact
102
+ // and not aliased anywhere else before we return it.
103
+ if (fastResult.artifact.filesChanged.length === 0) {
104
+ const gitFilesChanged = await gitChangedFilesAcross(workdir, baseRef);
105
+ if (gitFilesChanged.length > 0) {
106
+ log.warn({ stage, gitFilesChanged: gitFilesChanged.length, baseRef: baseRef ?? "(worktree only)" }, "agent reported empty filesChanged but git shows real changes — overriding (urateam#35)");
107
+ fastResult.artifact.filesChanged = gitFilesChanged;
108
+ }
109
+ }
20
110
  return fastResult;
21
111
  }
22
112
  log.info({ stage }, "building handoff from git diff");
@@ -27,23 +117,21 @@ export async function extractHandoff(agentOutput, runId, issueId, stage, workdir
27
117
  timestamp: new Date().toISOString(),
28
118
  };
29
119
  try {
30
- // Run both git commands in parallel they're independent
31
- const [statusOutput, diffStat] = await Promise.all([
32
- gitExecRaw(["status", "--porcelain"], workdir),
33
- gitExecSafe(["diff", "--stat", "HEAD"], workdir),
120
+ // Slow path uses the same union helper. Necessary for the RALPH call
121
+ // sites in pipeline/runner.ts which always take the slow path
122
+ // (they invoke extractHandoff with agentOutput="" so parseJsonBlock
123
+ // returns null). The fast-path override in PR #95 + this PR's widening
124
+ // were the load-bearing fix for the rotulus#16 PR-body bug; the slow
125
+ // path benefits incidentally.
126
+ //
127
+ // diffStat must scan the same range as filesChanged or the "Modified
128
+ // N files: <stat tail>" approach string can be misleading (empty stat
129
+ // alongside non-empty files when the worktree is autoCommit-clean).
130
+ const statRange = baseRef ? `${baseRef}...HEAD` : "HEAD";
131
+ const [filesChanged, diffStat] = await Promise.all([
132
+ gitChangedFilesAcross(workdir, baseRef),
133
+ gitExecSafe(["diff", "--stat", statRange], workdir),
34
134
  ]);
35
- // Parse porcelain output: "XY filename" — 2 status chars + 1 space + path
36
- // For renames: "XY old -> new"
37
- const filesChanged = statusOutput
38
- ? statusOutput.split("\n")
39
- .filter(Boolean)
40
- .map((line) => {
41
- const path = line.substring(3);
42
- const arrowIdx = path.indexOf(" -> ");
43
- return arrowIdx >= 0 ? path.substring(arrowIdx + 4) : path;
44
- })
45
- .filter(Boolean)
46
- : [];
47
135
  // Best-effort summary from agent output. The last few lines often contain
48
136
  // tool noise rather than meaningful prose. filesChanged is the reliable signal.
49
137
  const lines = agentOutput.split("\n").filter((l) => l.trim().length > 0);
@@ -1 +1 @@
1
- {"version":3,"file":"extract-handoff.js","sourceRoot":"","sources":["../../src/executor/extract-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract-handoff.js","sourceRoot":"","sources":["../../src/executor/extract-handoff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/executor/handoff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9E,OAAO,EAAE,MAAM,GACd,eAAe,CAgBjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,kBAAkB,CAqCpB"}
1
+ {"version":3,"file":"handoff.d.ts","sourceRoot":"","sources":["../../src/executor/handoff.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAMnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,eAAe,CAAC;IAC1B,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9E,OAAO,EAAE,MAAM,GACd,eAAe,CAsBjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,kBAAkB,CAqCpB"}
@@ -3,6 +3,12 @@ import { parseJsonBlock } from "./agent-stream.js";
3
3
  import { createLogger } from "../logger.js";
4
4
  const log = createLogger({ component: "Handoff" });
5
5
  export function buildFallback(metadata, summary) {
6
+ // Note (urateam#35 Bug 1): if `summary` here is the agent's raw output
7
+ // truncated to 500 chars, it may contain JSON fragments from a self-
8
+ // critique block the agent leaked instead of structured prose. The fix
9
+ // for that is upstream prompt engineering (constraining the agent's
10
+ // structured-output instructions) — not summary sanitization here, which
11
+ // would be fragile regex hacks.
6
12
  return {
7
13
  ...metadata,
8
14
  summary: summary || `Stage ${metadata.stage} completed without structured output`,
@@ -1 +1 @@
1
- {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/executor/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AAQnD,MAAM,UAAU,aAAa,CAC3B,QAA8E,EAC9E,OAAe;IAEf,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,OAAO,IAAI,SAAS,QAAQ,CAAC,KAAK,sCAAsC;QACjF,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE;YACP,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;SAChB;QACD,WAAW,EAAE;YACX,iBAAiB,EAAE,CAAC;YACpB,mBAAmB,EAAE,EAAE;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,QAAQ,GAAG;QACf,KAAK;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,qDAAqD,CAAC,CAAC;QAC5E,OAAO;YACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,YAAY,GAAG;QACnB,GAAI,MAAkC;QACtC,GAAG,QAAQ;KACZ,CAAC;IAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3G,yCAAyC,CAC1C,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../../src/executor/handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AAQnD,MAAM,UAAU,aAAa,CAC3B,QAA8E,EAC9E,OAAe;IAEf,uEAAuE;IACvE,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,yEAAyE;IACzE,gCAAgC;IAChC,OAAO;QACL,GAAG,QAAQ;QACX,OAAO,EAAE,OAAO,IAAI,SAAS,QAAQ,CAAC,KAAK,sCAAsC;QACjF,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE;YACP,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;SAChB;QACD,WAAW,EAAE;YACX,iBAAiB,EAAE,CAAC;YACpB,mBAAmB,EAAE,EAAE;SACxB;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,WAAmB,EACnB,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,QAAQ,GAAG;QACf,KAAK;QACL,OAAO;QACP,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IAEF,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,qDAAqD,CAAC,CAAC;QAC5E,OAAO;YACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,YAAY,GAAG;QACnB,GAAI,MAAkC;QACtC,GAAG,QAAQ;KACZ,CAAC;IAEF,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3G,yCAAyC,CAC1C,CAAC;QACF,OAAO;YACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5D,UAAU,EAAE,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC"}
@@ -1,4 +1,4 @@
1
- export { agentProfiles } from "./profiles.js";
1
+ export { agentProfiles, getAgentProfiles, DEFAULT_AGENT_PROFILES } from "./profiles.js";
2
2
  export { checkTestQuality, analyzeTestFile, isTestFile, extractTestBlocks, TRIVIAL_MATCHERS, BEHAVIORAL_MATCHERS, TRIVIAL_THRESHOLD, type TestFileAnalysis, type TestQualityResult, } from "./test-quality.js";
3
3
  export { parseHandoffArtifact } from "./handoff.js";
4
4
  export { executeStage, type ExecuteStageContext } from "./executor.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,4 @@
1
- export { agentProfiles } from "./profiles.js";
1
+ export { agentProfiles, getAgentProfiles, DEFAULT_AGENT_PROFILES } from "./profiles.js";
2
2
  export { checkTestQuality, analyzeTestFile, isTestFile, extractTestBlocks, TRIVIAL_MATCHERS, BEHAVIORAL_MATCHERS, TRIVIAL_THRESHOLD, } from "./test-quality.js";
3
3
  export { parseHandoffArtifact } from "./handoff.js";
4
4
  export { executeStage } from "./executor.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC"}
@@ -1,5 +1,47 @@
1
1
  import type { AgentProfile } from "../types.js";
2
2
  export declare const DEFAULT_MODEL = "claude-sonnet-4-6";
3
3
  export declare const HAIKU_MODEL = "claude-haiku-4-5";
4
+ /**
5
+ * Default budget + tool surface for each pipeline stage. The defaults are
6
+ * sized for a "mature repo" — implement stage does real work, test stage
7
+ * runs an existing test suite, etc. They are intentionally NOT sized for
8
+ * bootstrapping new infrastructure (e.g., adding vitest + RN test setup
9
+ * from scratch in the test stage), which can blow through the default
10
+ * budget; see urateam#38.
11
+ *
12
+ * Operators with bootstrapping needs can override individual fields per
13
+ * stage via the URATEAM_AGENT_PROFILES env var (see `getAgentProfiles`).
14
+ *
15
+ * Deep-frozen so accidental mutation by a caller (e.g., a test that does
16
+ * `getAgentProfiles().test.maxTurns = 999`) throws instead of silently
17
+ * corrupting the shared defaults for the rest of process lifetime.
18
+ */
19
+ export declare const DEFAULT_AGENT_PROFILES: Record<string, AgentProfile>;
20
+ /**
21
+ * Backward-compat re-export. Prefer `getAgentProfiles()` so per-process
22
+ * env-var overrides are honored.
23
+ *
24
+ * @deprecated Use `getAgentProfiles()` for active profiles (env-var-merged).
25
+ * This alias only ever returns the unmerged defaults — useful for
26
+ * asserting the default shape in tests, but wrong for any consumer
27
+ * that wants the runtime-effective values.
28
+ */
4
29
  export declare const agentProfiles: Record<string, AgentProfile>;
30
+ /**
31
+ * Return the active per-stage agent profiles. Defaults can be overridden
32
+ * for the current process via the `URATEAM_AGENT_PROFILES` env var, which
33
+ * is parsed as JSON and merged on top of the defaults stage-by-stage:
34
+ *
35
+ * URATEAM_AGENT_PROFILES='{"test":{"maxTurns":50,"maxInputTokens":80000}}'
36
+ *
37
+ * Only the fields named in the override are changed; everything else keeps
38
+ * its default. Unknown stage names log a warn and are ignored. Malformed
39
+ * fields log a warn and are ignored without dropping the rest of the stage.
40
+ *
41
+ * Result is cached for process lifetime. Call `_resetAgentProfilesCache()`
42
+ * (test-only) to re-read the env var.
43
+ */
44
+ export declare function getAgentProfiles(): Record<string, AgentProfile>;
45
+ /** Test-only: reset the cached profiles so a new env var value takes effect. */
46
+ export declare function _resetAgentProfilesCache(): void;
5
47
  //# sourceMappingURL=profiles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/executor/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAE9C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA+BtD,CAAC"}
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/executor/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,eAAO,MAAM,aAAa,sBAAsB,CAAC;AACjD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAgB9C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CA+B9D,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,8BAAyB,CAAC;AAwEpD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAuD/D;AAED,gFAAgF;AAChF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
@@ -1,6 +1,37 @@
1
+ import { createLogger } from "../logger.js";
2
+ const log = createLogger({ component: "executor.profiles" });
1
3
  export const DEFAULT_MODEL = "claude-sonnet-4-6";
2
4
  export const HAIKU_MODEL = "claude-haiku-4-5";
3
- export const agentProfiles = {
5
+ /**
6
+ * Recursively freeze an object so accidental mutation by callers throws
7
+ * (in strict mode) rather than silently corrupting the shared defaults.
8
+ */
9
+ function deepFreeze(o) {
10
+ if (o === null || typeof o !== "object")
11
+ return o;
12
+ for (const v of Object.values(o))
13
+ deepFreeze(v);
14
+ return Object.freeze(o);
15
+ }
16
+ /** Upper bounds for env-var overrides — protect against fat-finger like {"maxTurns": 999999}. */
17
+ const MAX_TURNS_CEILING = 500;
18
+ const MAX_INPUT_TOKENS_CEILING = 500_000;
19
+ /**
20
+ * Default budget + tool surface for each pipeline stage. The defaults are
21
+ * sized for a "mature repo" — implement stage does real work, test stage
22
+ * runs an existing test suite, etc. They are intentionally NOT sized for
23
+ * bootstrapping new infrastructure (e.g., adding vitest + RN test setup
24
+ * from scratch in the test stage), which can blow through the default
25
+ * budget; see urateam#38.
26
+ *
27
+ * Operators with bootstrapping needs can override individual fields per
28
+ * stage via the URATEAM_AGENT_PROFILES env var (see `getAgentProfiles`).
29
+ *
30
+ * Deep-frozen so accidental mutation by a caller (e.g., a test that does
31
+ * `getAgentProfiles().test.maxTurns = 999`) throws instead of silently
32
+ * corrupting the shared defaults for the rest of process lifetime.
33
+ */
34
+ export const DEFAULT_AGENT_PROFILES = deepFreeze({
4
35
  triage: {
5
36
  tools: ["Read", "Glob", "Grep", "WebSearch"],
6
37
  maxInputTokens: 30_000,
@@ -31,5 +62,119 @@ export const agentProfiles = {
31
62
  maxTurns: 20,
32
63
  model: DEFAULT_MODEL,
33
64
  },
34
- };
65
+ });
66
+ /**
67
+ * Backward-compat re-export. Prefer `getAgentProfiles()` so per-process
68
+ * env-var overrides are honored.
69
+ *
70
+ * @deprecated Use `getAgentProfiles()` for active profiles (env-var-merged).
71
+ * This alias only ever returns the unmerged defaults — useful for
72
+ * asserting the default shape in tests, but wrong for any consumer
73
+ * that wants the runtime-effective values.
74
+ */
75
+ export const agentProfiles = DEFAULT_AGENT_PROFILES;
76
+ let cachedProfiles = null;
77
+ function isStringArray(v) {
78
+ return Array.isArray(v) && v.every((x) => typeof x === "string");
79
+ }
80
+ function isPositiveIntegerWithin(v, max) {
81
+ return typeof v === "number" && Number.isInteger(v) && v > 0 && v <= max;
82
+ }
83
+ /**
84
+ * Apply a single override object on top of a base profile. Unknown stages
85
+ * are dropped with a warn (op-side typo protection). Known stages with
86
+ * malformed fields are dropped field-by-field (don't let one bad field
87
+ * tank the whole stage). The stage name is included in every warn payload
88
+ * so operators can pinpoint which stage triggered each warning.
89
+ *
90
+ * Returns a fresh object — never mutates `base`. The `tools` array is
91
+ * copied either from the override or from a fresh `[...base.tools]` copy
92
+ * so callers cannot reach back into DEFAULT_AGENT_PROFILES via the
93
+ * returned reference.
94
+ */
95
+ function mergeOverride(base, override, stage) {
96
+ const merged = { ...base, tools: [...base.tools] };
97
+ if (isStringArray(override.tools)) {
98
+ merged.tools = override.tools.slice();
99
+ }
100
+ else if (override.tools !== undefined) {
101
+ log.warn({ stage, field: "tools", got: typeof override.tools }, "URATEAM_AGENT_PROFILES override: tools must be a string array — ignoring this field");
102
+ }
103
+ if (isPositiveIntegerWithin(override.maxInputTokens, MAX_INPUT_TOKENS_CEILING)) {
104
+ merged.maxInputTokens = override.maxInputTokens;
105
+ }
106
+ else if (override.maxInputTokens !== undefined) {
107
+ log.warn({ stage, field: "maxInputTokens", got: override.maxInputTokens, ceiling: MAX_INPUT_TOKENS_CEILING }, "URATEAM_AGENT_PROFILES override: maxInputTokens must be a positive integer ≤ ceiling — ignoring this field");
108
+ }
109
+ if (isPositiveIntegerWithin(override.maxTurns, MAX_TURNS_CEILING)) {
110
+ merged.maxTurns = override.maxTurns;
111
+ }
112
+ else if (override.maxTurns !== undefined) {
113
+ log.warn({ stage, field: "maxTurns", got: override.maxTurns, ceiling: MAX_TURNS_CEILING }, "URATEAM_AGENT_PROFILES override: maxTurns must be a positive integer ≤ ceiling — ignoring this field");
114
+ }
115
+ if (typeof override.model === "string" && override.model.length > 0) {
116
+ merged.model = override.model;
117
+ }
118
+ else if (override.model !== undefined) {
119
+ log.warn({ stage, field: "model", got: override.model }, "URATEAM_AGENT_PROFILES override: model must be a non-empty string — ignoring this field");
120
+ }
121
+ return merged;
122
+ }
123
+ /**
124
+ * Return the active per-stage agent profiles. Defaults can be overridden
125
+ * for the current process via the `URATEAM_AGENT_PROFILES` env var, which
126
+ * is parsed as JSON and merged on top of the defaults stage-by-stage:
127
+ *
128
+ * URATEAM_AGENT_PROFILES='{"test":{"maxTurns":50,"maxInputTokens":80000}}'
129
+ *
130
+ * Only the fields named in the override are changed; everything else keeps
131
+ * its default. Unknown stage names log a warn and are ignored. Malformed
132
+ * fields log a warn and are ignored without dropping the rest of the stage.
133
+ *
134
+ * Result is cached for process lifetime. Call `_resetAgentProfilesCache()`
135
+ * (test-only) to re-read the env var.
136
+ */
137
+ export function getAgentProfiles() {
138
+ if (cachedProfiles)
139
+ return cachedProfiles;
140
+ const raw = process.env.URATEAM_AGENT_PROFILES;
141
+ if (!raw) {
142
+ cachedProfiles = DEFAULT_AGENT_PROFILES;
143
+ return cachedProfiles;
144
+ }
145
+ let parsed;
146
+ try {
147
+ parsed = JSON.parse(raw);
148
+ }
149
+ catch (err) {
150
+ log.warn({ err: err.message }, "URATEAM_AGENT_PROFILES is not valid JSON — falling back to defaults");
151
+ cachedProfiles = DEFAULT_AGENT_PROFILES;
152
+ return cachedProfiles;
153
+ }
154
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
155
+ log.warn("URATEAM_AGENT_PROFILES must be a JSON object keyed by stage name — falling back to defaults");
156
+ cachedProfiles = DEFAULT_AGENT_PROFILES;
157
+ return cachedProfiles;
158
+ }
159
+ const overrides = parsed;
160
+ const result = { ...DEFAULT_AGENT_PROFILES };
161
+ for (const [stage, override] of Object.entries(overrides)) {
162
+ if (!(stage in DEFAULT_AGENT_PROFILES)) {
163
+ log.warn({ stage, knownStages: Object.keys(DEFAULT_AGENT_PROFILES) }, "URATEAM_AGENT_PROFILES override targets unknown stage — ignoring");
164
+ continue;
165
+ }
166
+ if (!override || typeof override !== "object" || Array.isArray(override)) {
167
+ log.warn({ stage, got: typeof override }, "URATEAM_AGENT_PROFILES per-stage value must be an object — ignoring");
168
+ continue;
169
+ }
170
+ result[stage] = mergeOverride(DEFAULT_AGENT_PROFILES[stage], override, stage);
171
+ log.info({ stage, profile: result[stage] }, "URATEAM_AGENT_PROFILES override applied");
172
+ }
173
+ cachedProfiles = result;
174
+ return cachedProfiles;
175
+ }
176
+ /** Test-only: reset the cached profiles so a new env var value takes effect. */
177
+ export function _resetAgentProfilesCache() {
178
+ cachedProfiles = null;
179
+ }
35
180
  //# sourceMappingURL=profiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/executor/profiles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC;QAC5C,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,aAAa;KACrB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACxD,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,aAAa;KACrB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACxD,cAAc,EAAE,OAAO;QACvB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,aAAa;KACrB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACxD,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,WAAW;KACnB;IACD,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACvC,cAAc,EAAE,MAAM;QACtB,QAAQ,EAAE,EAAE;QACZ,KAAK,EAAE,aAAa;KACrB;CACF,CAAC"}
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/executor/profiles.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,UAAU,EAEV,QAAQ,EAGR,cAAc,EAIf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AAyCjD,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAiC1E,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAY;IACzB;;2EAEuE;IACvE,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,4EAA4E;IAC5E,OAAO,CAAC,kBAAkB,CAA6B;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,eAAe,CAAS;gBAEpB,MAAM,EAAE,oBAAoB;IAalC,KAAK,CACT,KAAK,EAAE,WAAW,EAClB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,YAAY,GAAE,MAAM,GAAG,IAAW,GACjC,OAAO,CAAC,IAAI,CAAC;IA4EV,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0MtC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlC,yFAAyF;IACzF,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;;;OAQG;IACG,aAAa,CAAC,MAAM,EAAE;QAC1B,KAAK,EAAE,WAAW,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,cAAc,CAAC;QAC/B,UAAU,EAAE,UAAU,CAAC;QACvB,cAAc,EAAE,cAAc,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,qBAAqB,EAAE,CAAC;QAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAmGjB;;;;OAIG;YACW,iBAAiB;YAajB,eAAe;YAw4Cf,YAAY;IAiF1B;;;OAGG;YACW,gBAAgB;IAoC9B;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyEvC;;;;OAIG;YACW,oBAAoB;IAiBlC;;;OAGG;IACG,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAqCvD;;;;;;;;;OASG;YACW,uBAAuB;IA2UrC,OAAO,CAAC,gBAAgB;CAoBzB"}
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/pipeline/runner.ts"],"names":[],"mappings":"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"}
@@ -587,7 +587,9 @@ export class PipelineRunner {
587
587
  run.totalOutputTokens += result.outputTokens;
588
588
  for (let iteration = 1; iteration <= ralphIterations; iteration++) {
589
589
  const handoffResult = await extractHandoff("", // extractHandoff reads git diff from worktree, no agent output needed
590
- runId, sanitizedIssue.id, stage, worktreePath);
590
+ runId, sanitizedIssue.id, stage, worktreePath,
591
+ // Full ref form (extractHandoff doesn't prepend `origin/`).
592
+ `origin/${repoConfig.defaultBranch}`);
591
593
  runLog.info({ iteration, maxIterations: ralphIterations }, "RALPH: checking requirements");
592
594
  const check = await checkRequirements(sanitizedIssue, handoffResult, worktreePath);
593
595
  if (check.satisfied) {
@@ -882,7 +884,9 @@ export class PipelineRunner {
882
884
  // (b) unnecessary draft when re-implement actually fixes the gaps.
883
885
  if (fixStage === "implement" && ralphIterations > 0 && fixResult.status === "completed" && fixResult.handoffArtifact) {
884
886
  const rfHandoffResult = await extractHandoff("", // extractHandoff reads git diff from worktree, no agent output needed
885
- runId, sanitizedIssue.id, fixStage, worktreePath);
887
+ runId, sanitizedIssue.id, fixStage, worktreePath,
888
+ // Full ref form (extractHandoff doesn't prepend `origin/`).
889
+ `origin/${repoConfig.defaultBranch}`);
886
890
  runLog.info({ rfIteration }, "RALPH: re-checking requirements after review-fix implement");
887
891
  const rfCheck = await checkRequirements(sanitizedIssue, rfHandoffResult, worktreePath);
888
892
  ralphSatisfied = rfCheck.satisfied;