Merge origin/main (v1.64.1.0) into garrytan/time-attack-fork-review

The code-smell wave refactored the tunnel start into the staged
startTunnel helper; the merge adopts that structure and threads this
branch's truthful consent strings through its consent parameter (the
receipt now names the isPairAgentEnabled gate at both call sites). The
eng-review PTY warmup takes both improvements: main's resolveClaudeBinary
fallback and this branch's resolveEvalModel kind. Resolver imports
union; carve budgets take the larger of both waves' measured values
(parity suite green on the merged tree); conflicted generated SKILL.md
files regenerated from resolved sources. VERSION stays 1.65.0.0 over
main's 1.64.1.0; CHANGELOG stacks 1.65.0.0 > 1.64.1.0 > 1.64.0.0.
This commit is contained in:
Garry Tan
2026-08-15 10:01:18 -07:00
187 changed files with 2744 additions and 22778 deletions
+7 -2
View File
@@ -227,9 +227,14 @@ describe("gstack-decision-search --recent / --scope / datamark", () => {
expect(out).toContain("alpha"); // NaN slice is a no-op → returns all
});
test("--scope filters by scope", () => {
// Explicit branch on both sides: CI checks out a detached HEAD, where
// gitBranch() returns undefined on log AND search, so an implicit
// branch-scoped decision can never surface (filterByScope requires a
// matching non-empty ctx.branch). The filter logic is what's under test,
// not git branch detection.
log('{"decision":"repo-call","scope":"repo","source":"user"}');
log('{"decision":"branch-call","scope":"branch","source":"user"}');
const out = search("--scope branch");
log('{"decision":"branch-call","scope":"branch","branch":"feature-x","source":"user"}');
const out = search("--scope branch --branch feature-x");
expect(out).toContain("branch-call");
expect(out).not.toContain("repo-call");
});