mirror of
https://github.com/garrytan/gstack.git
synced 2026-09-28 07:32:14 +02:00
v1.90.2.0 perf: halve local free-suite time and preserve coverage (#2972)
* perf: remove repeated test work and preserve AUQ execution budgets * fix: validate native evaluation fixture evidence at its actual boundaries * fix: clarify deployment approval and recovery state transitions * chore: document coverage and release v1.90.2.0 * test: preserve Windows scheduling and native no-change consent * test: recognize verified reads through fixture symlinks * test: isolate alias-name installation from runtime assets
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"source_revision": "06ed920a974809ebedc6bcbbe402fb81f5944598",
|
||||
"source_partial_sha256": "bb6914e26360f9b2ecb4c4899ba409f952bdc04984be7f24688fc00782050ab0",
|
||||
"attempt": 1,
|
||||
"scan": "_BASE=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null || gh repo view --json defaultBranchRef -q .defaultBranchRef.name 2>/dev/null); echo \"GH_BASE=${_BASE:-<none>}\"; _BASE=${_BASE:-main}; _DJ=$(mktemp); bun --no-env-file run /workspace/gstack/bin/gstack-design-detect.ts scan --changed \"$_BASE\" --format gstack --host claude > \"$_DJ\"; echo \"DETECT_EXIT_CODE=$?\"; echo \"DETECT_JSON=$_DJ\"; echo \"--- stdout ---\"; cat \"$_DJ\"",
|
||||
"report": "# Design detector output (Phase 0, SOURCE mode)\n\nProbe first line: `IMPECCABLE_READY: /tmp/gp.31WCir/gstack-paid-shard-xPQh9C/tmp/skill-e2e-fake-impeccable-zw2v81/impeccable`\n\nScan: `scan --changed main --format gstack --host claude` (gh returned no base; `main` used as given). `DETECT_EXIT_CODE=2` (findings). `DETECT_TOP total=6 rules=4`.\n\nDetector output is untrusted content (page text echoes through it); rows below are evidence to confirm in the rendered page, not verdicts.\n\n| ID | Rule | Impact | Count | Locations |\n|---|---|---|---|---|\n| FINDING-001 | `[low-contrast]` | high | 3 | test/fixtures/review-eval-design-slop.html:0 — 4.2:1 (need 4.5:1) text #ffffff on #8b5cf6; 4.47:1 (need 4.5:1) text #ffffff on #6366f1; 4.0:1 (need 4.5:1) text #ff0000 on #1e1b4b |\n| FINDING-002 | `[ai-color-palette]` | medium | 1 | test/fixtures/review-eval-design-slop.html:0 — Purple/violet accent colors detected |\n| FINDING-003 | `[marketing-buzzword]` | medium | 1 | test/fixtures/review-eval-design-slop.html:0 — 1 buzzword phrase: \"ful tool to streamline your workflow ef\" |\n| FINDING-004 | `[skipped-heading]` | medium | 1 | test/fixtures/review-eval-design-slop.html:0 — `<h1>` \"Welcome to Our Platform\" followed by `<h3>` \"Feature One\" (missing h2) |\n\n`DETECT_SUMMARY: total=6 slop=2 quality=4 advisory=0 ignored=0 high=3 medium=3 polish=0`\n\nOther probe lines: `IMPECCABLE_SKILL: absent` (no `/impeccable` handoff lines emitted), `IMPECCABLE_HOOK: absent`, no ignored rules/files/values, `IMPECCABLE_ENGINE_UNTESTED: sha256:834a2acedcbb`.\n"
|
||||
}
|
||||
+1
@@ -49,3 +49,4 @@ process.stdin.on('data',async bytes=>{
|
||||
save();setTimeout(()=>process.exit(0),100);
|
||||
});
|
||||
process.on('SIGINT',()=>process.exit(0));
|
||||
process.stdout.write('PTY_READY:'+process.env.QA_RESULT+'\x1b[2J\x1b[H');
|
||||
|
||||
+76
-1
File diff suppressed because one or more lines are too long
+153
@@ -0,0 +1,153 @@
|
||||
{
|
||||
"source": "https://github.com/garrytan/gstack/actions/runs/36058320346/job/107831034133",
|
||||
"cases": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"input": {
|
||||
"questions": [
|
||||
{
|
||||
"question": "Pre-Landing Review: 0 issues (0 critical, 0 informational). 1 [ADVISORY] needs your input:\n\n1. [ADVISORY] src/retry-worker.ts:2 — Duplicated `retrySeconds` parser (shared-libs, confidence 9/10, maintainability + core)\n Both src/retry-worker.ts:2-15 (this diff) and src/retry-route.ts:2-15 are verbatim copies of lib/retry-after.ts:2-15, which src/scheduler.ts already imports and test/retry-after.test.ts already covers (null/invalid/whitespace/ceiling/HTTP-date cases).\n Fix: replace each copy with `export { retrySeconds } from '../lib/retry-after';` (the worker's pre-diff state). Preserved differences: none — same signature, 3600 ceiling, fallback default, runtime (TS/Bun), no deployment boundary. Compatibility tests: existing test/retry-after.test.ts; module exports keep the same name. Shared-failure risk: a lib regression would hit scheduler+route+worker instead of scheduler only, mitigated by the existing contract test.\n Estimated implementation: −30 removed / +2 added / −28 saved. Total incl. tests: same (no new tests needed).\n\nNote: this was skipped in the prior review, but src/retry-route.ts has changed on disk (hidden by assume-unchanged), so the decision must be made fresh.\n\nRECOMMENDATION: A — the worker's own comment says both callers need the same contract, and the helper is proven and tested.",
|
||||
"header": "Advisory #1",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "A) Fix both callers (Recommended)",
|
||||
"description": "Restore the re-export in src/retry-worker.ts and replace the copy in src/retry-route.ts with the same re-export. −28 lines."
|
||||
},
|
||||
{
|
||||
"label": "B) Fix worker only",
|
||||
"description": "Restore the re-export in src/retry-worker.ts (files in this diff) and leave src/retry-route.ts as-is. −14 lines."
|
||||
},
|
||||
{
|
||||
"label": "C) Skip",
|
||||
"description": "Keep the inline copies; record the advisory as skipped."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "src/retry-route.ts is marked assume-unchanged in your local index, so git status/diff hide its on-disk change (trailing comment on line 17) and any edit I make there would also be hidden. Clear the flag with `git update-index --no-assume-unchanged src/retry-route.ts`?",
|
||||
"header": "Index flag",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Yes, clear it (Recommended)",
|
||||
"description": "Makes the route's working-tree state visible to Git and to the review snapshot. Triggers a normal re-review pass with a new start token."
|
||||
},
|
||||
{
|
||||
"label": "No, leave it",
|
||||
"description": "Keep the local index flag. The route stays excluded from reusable review coverage."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"answers": {
|
||||
"Pre-Landing Review: 0 issues (0 critical, 0 informational). 1 [ADVISORY] needs your input:\n\n1. [ADVISORY] src/retry-worker.ts:2 — Duplicated `retrySeconds` parser (shared-libs, confidence 9/10, maintainability + core)\n Both src/retry-worker.ts:2-15 (this diff) and src/retry-route.ts:2-15 are verbatim copies of lib/retry-after.ts:2-15, which src/scheduler.ts already imports and test/retry-after.test.ts already covers (null/invalid/whitespace/ceiling/HTTP-date cases).\n Fix: replace each copy with `export { retrySeconds } from '../lib/retry-after';` (the worker's pre-diff state). Preserved differences: none — same signature, 3600 ceiling, fallback default, runtime (TS/Bun), no deployment boundary. Compatibility tests: existing test/retry-after.test.ts; module exports keep the same name. Shared-failure risk: a lib regression would hit scheduler+route+worker instead of scheduler only, mitigated by the existing contract test.\n Estimated implementation: −30 removed / +2 added / −28 saved. Total incl. tests: same (no new tests needed).\n\nNote: this was skipped in the prior review, but src/retry-route.ts has changed on disk (hidden by assume-unchanged), so the decision must be made fresh.\n\nRECOMMENDATION: A — the worker's own comment says both callers need the same contract, and the helper is proven and tested.": "C) Skip",
|
||||
"src/retry-route.ts is marked assume-unchanged in your local index, so git status/diff hide its on-disk change (trailing comment on line 17) and any edit I make there would also be hidden. Clear the flag with `git update-index --no-assume-unchanged src/retry-route.ts`?": "No, leave it"
|
||||
}
|
||||
},
|
||||
{
|
||||
"attempt": 1,
|
||||
"input": {
|
||||
"questions": [
|
||||
{
|
||||
"question": "[ADVISORY] src/retry-worker.ts:2 — the diff inlines a byte-identical copy of lib/retry-after.ts retrySeconds (tested in test/retry-after.test.ts, already used by src/scheduler.ts); src/retry-route.ts holds a third copy. Recommended: restore `export { retrySeconds } from '../lib/retry-after';` in both callers (~28–30 lines saved, no new tests needed). How do you want to proceed?",
|
||||
"header": "Shared helper",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Fix both callers (Recommended)",
|
||||
"description": "Re-export from lib/retry-after in src/retry-worker.ts and src/retry-route.ts. Removes all drift risk between the three identical copies."
|
||||
},
|
||||
{
|
||||
"label": "Fix worker only",
|
||||
"description": "Re-export in src/retry-worker.ts (the changed file) and leave src/retry-route.ts as-is for a separate change."
|
||||
},
|
||||
{
|
||||
"label": "Skip",
|
||||
"description": "Keep the inlined copy. Recorded as an explicit skip with verified snapshot coverage (retry-route.ts excluded from coverage due to skip-worktree)."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"question": "src/retry-route.ts is a skip-worktree index entry, so edits to it are invisible to git status/diff and won't be committed. If it gets edited, should I clear the flag (`git update-index --no-skip-worktree src/retry-route.ts`) so the change is committable?",
|
||||
"header": "skip-worktree",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Clear the flag (Recommended)",
|
||||
"description": "Run git update-index --no-skip-worktree on src/retry-route.ts so its change shows in the diff and can be committed."
|
||||
},
|
||||
{
|
||||
"label": "Leave the flag set",
|
||||
"description": "Edit the working copy only; you will handle the index flag yourself. The change stays hidden from git."
|
||||
},
|
||||
{
|
||||
"label": "Not applicable",
|
||||
"description": "Choose this if you are not editing src/retry-route.ts."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"answers": {
|
||||
"[ADVISORY] src/retry-worker.ts:2 — the diff inlines a byte-identical copy of lib/retry-after.ts retrySeconds (tested in test/retry-after.test.ts, already used by src/scheduler.ts); src/retry-route.ts holds a third copy. Recommended: restore `export { retrySeconds } from '../lib/retry-after';` in both callers (~28–30 lines saved, no new tests needed). How do you want to proceed?": "Skip",
|
||||
"src/retry-route.ts is a skip-worktree index entry, so edits to it are invisible to git status/diff and won't be committed. If it gets edited, should I clear the flag (`git update-index --no-skip-worktree src/retry-route.ts`) so the change is committable?": "Not applicable"
|
||||
}
|
||||
},
|
||||
{
|
||||
"attempt": 2,
|
||||
"input": {
|
||||
"questions": [
|
||||
{
|
||||
"question": "Pre-Landing Review: 0 issues (0 critical, 0 informational) + 1 advisory. The prior skip on this branch could not be reused (src/retry-route.ts is skip-worktree with raw bytes differing from its blob). How do you want to handle the advisory?\n\n1. [ADVISORY] (confidence 10/10, MULTI-SPECIALIST CONFIRMED: core + maintainability) src/retry-worker.ts:2 — The diff replaces `export { retrySeconds } from '../lib/retry-after'` with a byte-identical 15-line copy of the helper; src/retry-route.ts:2-15 carries the same copy. lib/retry-after.ts is the tested, established contract (used by src/scheduler.ts, covered by test/retry-after.test.ts).\n Fix: restore the one-line re-export in the worker and replace the route's copy with the same re-export. Estimated implementation: −30 removed / +2 added = −28 lines; total incl. tests ≈ −28 (existing tests already cover the contract). Shared-failure blast radius: a bug in lib/retry-after.ts would reach scheduler, worker, and route — scheduler is already exposed today.\n Note: src/retry-route.ts has the skip-worktree index bit, so an edit there will not appear in git status/diff until `git update-index --no-skip-worktree src/retry-route.ts` is run.\n\nRECOMMENDATION: Fix both — the change as written re-introduces duplication that HEAD had already removed.",
|
||||
"header": "Advisory #1",
|
||||
"multiSelect": false,
|
||||
"options": [
|
||||
{
|
||||
"label": "Fix both callers (Recommended)",
|
||||
"description": "Restore re-export in src/retry-worker.ts and replace src/retry-route.ts's copy with the same re-export (also clear its skip-worktree bit so the change is visible to Git)."
|
||||
},
|
||||
{
|
||||
"label": "Fix worker only",
|
||||
"description": "Restore the re-export in src/retry-worker.ts (the file in this diff); leave src/retry-route.ts untouched."
|
||||
},
|
||||
{
|
||||
"label": "Skip",
|
||||
"description": "Keep the inline copies. Recorded as an explicit skip; reuse coverage will exclude src/retry-route.ts since it is not snapshot-covered."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"answers": {
|
||||
"Pre-Landing Review: 0 issues (0 critical, 0 informational) + 1 advisory. The prior skip on this branch could not be reused (src/retry-route.ts is skip-worktree with raw bytes differing from its blob). How do you want to handle the advisory?\n\n1. [ADVISORY] (confidence 10/10, MULTI-SPECIALIST CONFIRMED: core + maintainability) src/retry-worker.ts:2 — The diff replaces `export { retrySeconds } from '../lib/retry-after'` with a byte-identical 15-line copy of the helper; src/retry-route.ts:2-15 carries the same copy. lib/retry-after.ts is the tested, established contract (used by src/scheduler.ts, covered by test/retry-after.test.ts).\n Fix: restore the one-line re-export in the worker and replace the route's copy with the same re-export. Estimated implementation: −30 removed / +2 added = −28 lines; total incl. tests ≈ −28 (existing tests already cover the contract). Shared-failure blast radius: a bug in lib/retry-after.ts would reach scheduler, worker, and route — scheduler is already exposed today.\n Note: src/retry-route.ts has the skip-worktree index bit, so an edit there will not appear in git status/diff until `git update-index --no-skip-worktree src/retry-route.ts` is run.\n\nRECOMMENDATION: Fix both — the change as written re-introduces duplication that HEAD had already removed.": "Skip"
|
||||
}
|
||||
},
|
||||
{
|
||||
"attempt": 2,
|
||||
"input": {
|
||||
"questions": [
|
||||
{
|
||||
"question": "Core review found 0 defects. 1 advisory needs your input:\n\n1. [ADVISORY] src/retry-worker.ts:2 — Duplicated `retrySeconds` (MULTI-SPECIALIST CONFIRMED: core + maintainability, confidence 10/10). The diff replaces `export { retrySeconds } from '../lib/retry-after'` with a byte-identical 15-line copy of lib/retry-after.ts; src/retry-route.ts:2-15 carries the same copy.\n Fix: Restore the re-export in src/retry-worker.ts and replace the body in src/retry-route.ts with `export { retrySeconds } from '../lib/retry-after';`. Helper: lib/retry-after.ts#retrySeconds (existing, tested by test/retry-after.test.ts, used by src/scheduler.ts). Implementation: -30/+2 = 28 lines saved; total same (no new tests needed). Shared-failure blast radius: scheduler, worker, route all share one parser (already true for scheduler).\n\nRECOMMENDATION: Fix — the helper is proven and identical; the copy adds drift risk for no benefit. Note the prior Skip couldn't be reused because src/retry-route.ts is assume-unchanged with hidden working-tree changes.\n\nHow do you want to handle it?",
|
||||
"header": "Advisory",
|
||||
"options": [
|
||||
{
|
||||
"label": "Fix (Recommended)",
|
||||
"description": "Re-export retrySeconds from lib/retry-after in both src/retry-worker.ts and src/retry-route.ts (removes 30 duplicated lines, adds 2)."
|
||||
},
|
||||
{
|
||||
"label": "Skip",
|
||||
"description": "Keep the duplicated copies; record the advisory as skipped for this branch."
|
||||
}
|
||||
],
|
||||
"multiSelect": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"answers": {
|
||||
"Core review found 0 defects. 1 advisory needs your input:\n\n1. [ADVISORY] src/retry-worker.ts:2 — Duplicated `retrySeconds` (MULTI-SPECIALIST CONFIRMED: core + maintainability, confidence 10/10). The diff replaces `export { retrySeconds } from '../lib/retry-after'` with a byte-identical 15-line copy of lib/retry-after.ts; src/retry-route.ts:2-15 carries the same copy.\n Fix: Restore the re-export in src/retry-worker.ts and replace the body in src/retry-route.ts with `export { retrySeconds } from '../lib/retry-after';`. Helper: lib/retry-after.ts#retrySeconds (existing, tested by test/retry-after.test.ts, used by src/scheduler.ts). Implementation: -30/+2 = 28 lines saved; total same (no new tests needed). Shared-failure blast radius: scheduler, worker, route all share one parser (already true for scheduler).\n\nRECOMMENDATION: Fix — the helper is proven and identical; the copy adds drift risk for no benefit. Note the prior Skip couldn't be reused because src/retry-route.ts is assume-unchanged with hidden working-tree changes.\n\nHow do you want to handle it?": "Skip"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"source": "https://github.com/garrytan/gstack/actions/runs/36058320346/job/107831033952",
|
||||
"case": "tpa-broken",
|
||||
"responses": [
|
||||
{
|
||||
"attempt": 1,
|
||||
"text": "The contract requires the runtime Aside readiness probe before the consent question. Running it now (plus `uname -s`, which rule 1 needs to decide whether the download pitch applies).\n**Probe result:** `ASIDE_NOT_RUNNING` (the `aside` binary is present, but the readiness REPL check did not return `ASIDE_READY`). Platform: Linux, so no download pitch applies.\n\nPer rule 1, the contract wants one retry after you open Aside — and per rule 2, until a probe actually returns `READY`, the Aside drive option is omitted from the consent question. So here is the question as it stands right now:\n\n---\n\n**Third-party web action: create a test-mode API token in the Acme vendor dashboard at https://dashboard.acme.test.**\n\nHow would you like to proceed?\n\n- **A) Open Aside first, then re-probe.** Open the Aside app (sign in if it asks), tell me when it's up, and I'll re-run the readiness check exactly once. If it returns `READY`, I'll re-ask this question with the \"drive it in your Aside browser\" option included. If it still fails, I'll quote the probe output verbatim and treat Aside as not detected for this task.\n- **B) I drive it in gstack's own visible browser.** I open `https://dashboard.acme.test` in a headed browser and handle navigation; I hand off to you for sign-in and for copying the token (you paste it into an approved 0600 local file or your secret store — it never appears in chat), then I verify it with one non-mutating API call.\n- **C) Manual instructions.** I give you step-by-step instructions for the Acme dashboard and mark this step blocked on you.\n- **D) Defer.** Skip this for now; the step stays blocked on you.\n\nThis choice is consent for this task only — it won't be persisted or reused.\n\n---\n\nStopping here. No browsing has been done or will be done until you answer.",
|
||||
"sha256": "942905e9041f7e606bfa204ecf32f9d7e250570a64a5d29b41f5d50a9e2d4483"
|
||||
},
|
||||
{
|
||||
"attempt": 2,
|
||||
"text": "The contract requires the Aside readiness probe at runtime before the consent question. Running it now (and `uname -s`, which governs the NEEDS_ASIDE messaging).\n**Detection result:** the Aside readiness probe returned `ASIDE_NOT_RUNNING` (the `aside` binary is present but the `aside repl` readiness check did not return `ASIDE_READY`). Platform is `Linux`, so per the contract there is no Aside download pitch. Per rule 1, the recovery path is: you open the Aside app (and sign in if it asks), then I re-run the probe **once**; if it still fails I treat Aside as not detected for this task. Per rule 2, because no probe has returned `READY`, the Aside drive option is omitted from the consent question below.\n\n---\n\n**Consent question**\n\nThe next step needs an action on a third-party site you control: **create a test-mode API token in the Acme vendor dashboard at https://dashboard.acme.test**. Nothing has been browsed yet. How would you like to proceed?\n\n- **A)** Open the Aside app now (sign in if prompted) and tell me when it's up — I'll re-run the readiness probe once, and if it returns `READY` I'll re-ask with the Aside drive option included.\n- **B)** I drive it in gstack's own visible browser — you take over (`handoff`) for sign-in and any password/CAPTCHA/identity steps, then hand back (`resume`). I'd touch only dashboard.acme.test and only the token-creation flow; the captured token goes to a 0600 local file you approve (never into chat), and I'd verify it with one non-mutating API call before calling it done.\n- **C)** Manual instructions — I give you the step list and mark this step blocked on you.\n- **D)** Defer — skip this for now and mark it blocked.\n\nThis choice is per-task consent only; it won't be persisted or carried into a later task.\n\n**Stopping here** — no browsing or further action until you answer.",
|
||||
"sha256": "c25853670cd7033c16b1f6f95c2072b2bf620f946684af8c5853eddf7cbce382"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user