mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-31 22:14:25 +01:00
e8793e59e8f41679f0d7bd121bd954853f1f2efa
531
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
e8793e59e8 |
fix(pregate): treat planning and evidence markdown as an empty lane
A docs-only diff with no .gstack/pregate.json failed lanes as PREGATE_NO_LANE. Planning and evidence Markdown is now a docs/no-tests empty lane. Unmapped source files still fail closed. Co-authored-by: Nick <surlymo@apache.org> |
||
|
|
421e66d2a4 |
feat(update-check): an equal VERSION with a moved main is an upgrade, via the compare API (W12)
When VERSION matches but ls-remote's main SHA differs from this checkout's HEAD, bin/gstack-update-check asks the GitHub compare API (status, ahead_by) through the existing receipted curl and prints UPGRADE_AVAILABLE <ver> <ver>+<n> <sha>; a diverged or unreadable compare is CHECK_FAILED (unknown), and behind/identical is up to date. Never fetches. The cache gains an IDENTITY line (head, compared remote SHA, upstream): an outcome replays only for the same HEAD and upstream, a same-remote refresh reuses it without another compare, and a git checkout ignores a legacy one-line cache (non-git installs keep the one-line format). The snooze is keyed by the SHA. gstack-upgrade's question, snooze note and What's New step handle the four-field line; gstack-skill-end reports it. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
a3b86b10b2 |
feat(pregate): timing check flags elapsed-time bounds and sleep-then-assert in added test lines (W4)
lib/pregate/checks/timing.ts prints TIMING_ASSERTION: <file>:<line> <pattern> and a TIMING_ASSERTIONS summary; gstack-timing-ok: <reason> in any comment syntax on the line or the line above escapes one. It warns (PREGATE_TIMING_ASSERTION): measured on gstack (9 of 47 test-touching commits, 263 hits in the tree) and gbrain (37 of 95 commits; 31 of 38 sites of the five timing-flake fixes), blocking would stop a fifth to two fifths of test changes. Adds the /review checklist rule and the /investigate timing-flake playbook. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
4185aa8bd1 |
test(autoplan-guard-pty): say Phase 2 starts without waiting for user input
On eval-slices (1), haiku published Phase 1 and then ended its turn with 'Waiting for next invocation to continue with step 8'. Step 5 tells it to end its turn while the reviewer runs, so step 8's 'In a later message' read as a later user turn. Phase 2 never started, the guard logged 2 of the 4 expected allows, and the run hit its deadline. Step 8 now says to continue in the next assistant message, still separate from the step 7 publication message. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
7d68dedae9 |
test(qa-functional): disable auto gc and maintenance in the fixture repo
On eval-slices (9), qa-functional-webhook-fix failed mid-run with 100+ 'directory watch lost: .git/objects/..' entries and forbidden writes to .git/info/refs and .git/objects/pack. That is git's detached auto maintenance repacking the fixture under the write observer. This applies the same gc.auto=0 / maintenance.auto=false config qa-callers-fixture uses. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
03968f0a7c |
fix(pregate): spawn the supervised shell through lib/script-invocation (#3197 tripwire)
The supervisor now resolves bash via bashCommandInvocation, so Windows uses Git Bash instead of a PATH bash, and an unresolvable bash reports spawn-failed. guards.ts and lanes.ts no longer spawn bash (they run through supervise.ts), so their KNOWN_SITES entries are removed. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
daf9f1b450 |
Merge origin/main (v1.91.106.0, #3209) into capy/next-wave; keep 1.91.107.0
Resolves the setup-hook harness conflict (keep _setup_ready_line, take main's gstack_canonical_claude_root slice) and treats main's new _gstack_bun_below status 2 (unparseable) as not satisfying a >= pin in the installer's jq fallback. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
+7 |
3e8b34d892 |
v1.91.106.0 fix: the 2026-10-15 issue wave (#3209)
* docs(designs): add fix wave 2026-10-15 plan (revision 3, approved) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> * fix(cso): invoke docker as argv0 docker so OrbStack's multicall binary dispatches executable() returns the canonical path, and OrbStack installs docker as a symlink to docker-tools, which dispatches on argv[0] and exits 127 with 'unsupported argv0 "docker-tools"'. Every Docker call failed, so doctor reported local-docker-isolation and every scanner missing and setup could not preload the qualified images. runProcess takes an argv0 option; docker.ts routes every Docker call through runDocker, which passes 'docker'. The native watchdog's execve calls pass "docker" as argv[0] too, so its container cleanup works on the same installs. The executed file is still the verified canonical path. Fixes #3187 * test(cso): cover Docker and watchdog invocation through a multicall binary A compiled fake that refuses any argv[0] but docker stands in for OrbStack's docker-tools. Both behavior tests fail on the previous code. Refs #3187 * fix(cso): bound the argv0 test's socket helper and probe images through OrbStack's multicall docker (#3187) Follow-up to #3188 by Bryan Stone (@aegixx): - the python3 spawnSync that binds the fake daemon socket gets a 30 s timeout; without it test/spawnsync-timeout-tripwire.test.ts fails. - reviewer test: dockerExactImagePresent, a production probe, admits an image when the endpoint's canonical executable is a multicall binary that refuses any argv0 other than "docker". It fails on |
||
|
|
42fd17e91a |
chore: restamp 1.91.107.0 (1.91.106.0 is claimed by #3209)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
e9182b1289 |
Merge origin/main (v1.91.105.0) into capy/next-wave; restamp 1.91.106.0
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
a889ef9393 |
v1.91.105.0 fix(tests): the free suite stops needing its retry pass; test:health tells the truth (#3154) (#3212)
* test: turn git auto-maintenance off in free fixtures, with a runner backstop git 2.29+ starts a detached `git maintenance run --auto` after every commit; it creates and deletes .git/objects/maintenance.lock after the commit returns. Diagnosed on |
||
|
|
bf82c0d529 |
test: run the Capy wrapper and shim doctor-row tests on POSIX only (Git Bash prints MSYS paths)
Files: test/gstack-doctor.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
5d41392b65 |
fix(pregate): read bun test's GitHub Actions group headers; exclude pregate-remote from the Windows subset; give quick-bun-default the free suite's flake policy
Files: lib/pregate/supervise.ts, test/pregate-supervise.test.ts, scripts/lib/windows-curation.ts, .github/workflows/free-tests.yml Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
86387a30f9 |
ci: run quick-bun-default on the ubicloud-standard-8 class the free suite uses
The ubuntu-24.04 runner timed out two Swift typecheck tests at 30 s (render @Observable marker, ios-qa-regen); both pass on Bun 1.4.3 on Ubicloud. Files: .github/workflows/free-tests.yml Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
cad87246fd |
test: supply _setup_ready_line to setup-tail harnesses, register the pairing fixture, make the admission test runner-Bun independent; announce shim writes
Files: test/setup-hook-syntax-gate.test.ts, test/redact-prepush-hook.test.ts, test/setup-playwright-best-effort.test.ts, test/helpers/free-fixtures-data.ts, test/pregate-guards.test.ts, bin/gstack-capy-install Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
e957b2194c |
chore: release 1.91.102.0 (tentative stamp) — GBRA-40 field list
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
31318907f1 |
chore: budget the Capy skill's autoplan checklist and trim its install notes
Files: capy/skill/gstack/SKILL.md, test/fixtures/context-budget.json (capy/skill/gstack ceiling only: 2364 tok x 1.10) Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
2d80d444bf | Merge remote-tracking branch 'origin/capy/next-wave-fix-d' into capy/next-wave | ||
|
|
d940633623 | Merge remote-tracking branch 'origin/capy/next-wave-fix-c' into capy/next-wave | ||
|
|
d5f3501cba | Merge remote-tracking branch 'origin/capy/next-wave-fix-b' into capy/next-wave | ||
|
|
34c2411cf5 |
fix(autoplan): checkpoints never touch the live run; generations, newest-valid restore, validated staging (integration items 2-6)
2. checkpointRun canonicalizes the collection and the run directory (symlinks resolved through the deepest existing ancestor) and refuses, before touching anything, when they are the same or one contains the other (CHECKPOINT_OVERLAP); restore applies the same check to source, target and staging. Before, <root>/<run> equal to the live run replaced it. 3. Publication writes an immutable generation (generations/g<revision>-…), renames it into place complete, then switches current.json with one rename; the previous generation is kept, so an interruption at the publish boundary (fault hook checkpoint-before-pointer) leaves the last checkpoint current. A generation never replaces a newer one (higher run revision): "CHECKPOINT: skipped … newer". Publication and restore hold the collection's .lock; restore also holds <out>.lock. 4. Restore checks every listed file's real path stays inside the generation (an ancestor symlink no longer copies outside files), parses run.json and runs validateRun on the staged run before publishing; a refusal leaves --out absent. readState reroots plan_input and plan_source for moved runs, and a restore with the owner's plan file gone points both at the restored copy, so a second restore cycle and a later revise work. 5. A checkpoint failure after a committed command prints "CHECKPOINT: failed for <run>: … ; the command's result stands" on stderr and keeps the command's exit code. 6. `gstack-autoplan checkpoints --from <dir>` lists generations newest first (run, gate_rev, status, revision, time, hash ok|bad, current). `resume --from <collection or root>` restores the newest generation that verifies, printing each corrupt newer one it skipped; a root holding several runs must name one. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
419325fd79 |
fix(autoplan): settle after or with a revise, title pairs need the same remedy, legacy gates refuse rec (integration items 1, 7, 8)
1. A gate with a scope change (uc1) and a packaging change (uc2) answered `rec` deadlocked: after `revise --plan v2 --incorporates uc1` reopened the phases, `revise --settle uc2` compared against the first phase snapshot (now undefined) and was refused forever. Settle evidence is now the plan hash recorded when the owner accepted the change (Amendment.plan_sha256) or a later plan_revised hash, plus "the plan file has no unrevised edits". `--settle` may ride the same revise as `--plan/--incorporates` and binds to the revision's hash. Settling the last amendment after a reopen leaves the run `running` (the reopened phases rerun) instead of approving it. NEXT and PLAN_AMEND_PENDING list the settle step before the edit step. 7. A title association alone no longer confirms: the same remedy confirms, opposite remedies (one keeps, drops or negates what the other changes) disagree, different or missing remedies stay `unverified`. The pairing fixture gains same-title negative controls (opposite and different remedies) and a same-remedy positive, for ordinary findings and user challenges. 8. A gate.json without rec_rev (written by 1.91.101.0, whose render said `all` leaves b items pending) refuses rec/all/approve all/`all except` with GATE_REC_STALE until a re-render binds --rec-hash; explicit tokens still answer. New gates carry rec_rev: 0. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
479a3ea96a |
docs: CI pin alternatives, shim order and containment, drift note, wrapper WARN, final ready line
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
63c068a412 |
fix(pregate): lanes and guards validate the install verdict like admission and return incomplete (INSTALL_UNVERIFIED, BUN_RESOLUTION_DRIFT) before launching; the checkout binds the 'none' verdict (integration item 8)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
79604e718f |
fix(install): one final 'gstack ready (claude, codex)' after both host setups (integration item 7)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
109c4022c9 |
fix(install): --check fails BUN_RESOLUTION_DRIFT only when the recorded Bun is gone, changed or no longer satisfies the pins; a newer candidate is a note and the recorded Bun stays the launch Bun (integration item 5)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
52f499e5d3 |
fix(shim): validate and contain store pins, read the 'none' record outside projects and in the checkout, fall back in the resolver's order, stay quiet without a pin; quote baked paths; publish bunx and replace store entries without a window (integration items 3, 4, 6, 9)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
d0afbe9c4d |
fix(wrapper): GSTACK_CAPY_MIN_WRAPPER back to 1; an active wrapper below the minimum is a WARN; gstack-upgrade never leaves a pending marker for the wrapper row and maps every installer stop to a trailer (integration items 2, 9)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
962747fdc8 |
fix(issue-links): derive this PR's author when gh runs as an app, so handoff and pr-body exclude the owner's own PRs (Lane D fix 1)
The handoff ran gstack-issue-links without --author, and the pr-body step only
asked the agent to pass one, so under Capy's app identity (viewer
`capy-ai[bot]`) the owner's own open PRs were listed as `Related:`. The bin now
derives the author itself: --author, else the gh viewer, else (for a `…[bot]`
viewer) the HEAD commit's GitHub user, else the owner of a user-owned
repository; with none it keeps every PR and reports ISSUE_LOOKUP_FAILED.
`--json` gains `author: {login, source}`; the stderr preview names it. Both ship
steps work unchanged, so the pr-body `--author` clause is dropped (union
309,487 -> 309,435 bytes, under the unchanged 1.6488 cap; skeleton 80,998).
Files: bin/gstack-issue-links, lib/result-codes.ts (ISSUE_LOOKUP_FAILED row),
docs/troubleshooting.md (#issue-lookup-failed), docs/pregate.md,
ship/sections/pr-body.md.tmpl, ship/sections/pr-body.md,
test/helpers/pregate-fixture.ts (gh stub: PR-author query),
test/ship-issue-intent.test.ts.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
||
|
|
1f7b003fba |
fix(pregate): clear validates the remote gate receipt; test_backend run URLs are attested
`gstack-pregate clear` accepted any --run-url for a small machine's obligation. A pregate.json/remote_gate obligation now clears only with --receipt <file> holding the gate's PREGATE_REMOTE: line, validated as --remote validates it (tree equals the tested tree, tests > 0, failed = 0; shared parseRemoteReport/remoteReportProblem); a run URL is usage (exit 2) and a bad receipt is PREGATE_RECEIPT_INVALID (exit 1, obligation unchanged). A test_backend/<backend> obligation has no machine-checkable receipt: its --run-url is recorded as attested:<url> and the output says attested, not validated. Platform lanes are unchanged. Hints name the right clear form. New code PREGATE_RECEIPT_INVALID: result-codes row, troubleshooting anchor, installer-form error line, regenerated doctor components. Files (G2): lib/pregate/index.ts, lib/pregate/checks/lanes.ts, bin/gstack-pregate, lib/result-codes.ts, bin/gstack-doctor-components.sh (generated), docs/pregate.md, docs/troubleshooting.md, test/pregate-remote.test.ts. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
5630ea3c34 |
fix(pins): CI exact pins for this platform are alternatives; the installer prefers a non-CI exact pin, else the install default among CI alternatives, else the highest verified (integration item 1)
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
b235af1184 |
fix(pregate): --timeout bounds each runner process again, not the whole lanes check
Lane C made --timeout a deadline for the whole lanes check, so a repo whose unit group and serial files each fit in 600 s but exceed it together ended incomplete and blocked /ship. --timeout is per runner process again (unit group, each serial file); the stall timeout still catches hung or silent processes. A timed-out process is incomplete naming its last file, and the next serial file still runs. Regression: three 1.5 s serial files under --timeout 3 pass; one 5 s file is incomplete. Files (G2): lib/pregate/checks/lanes.ts, bin/gstack-pregate (help), docs/pregate.md, test/pregate-supervise.test.ts. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
ba887cc7ce | Merge remote-tracking branch 'origin/capy/next-wave-lane-d' into capy/next-wave | ||
|
|
8860d6f974 | Merge remote-tracking branch 'origin/capy/next-wave-lane-c' into capy/next-wave | ||
|
|
db9f098958 | Merge remote-tracking branch 'origin/capy/next-wave-lane-b' into capy/next-wave | ||
|
|
ef8dce11df |
docs/capy-install: resolver, versioned store, bun shim, trailer notes; wrapper minimum 2
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
46df7eb03f |
docs(autoplan): unattended contract and reply-unparsed fix move to rec, sealed results, settle and checkpoints (Lane B)
docs/unattended.md: rec/as-is/rec except grammar, --owner-reply and recommend/--rec-hash, unverified pairing and the shared-proposal rule for b, amend_pending and revise --settle, attempt-owned result paths with the sealed .bound.md copy, render --all, and the checkpoint/resume --from paragraph. GATE_REPLY_UNPARSED's fix names rec/as-is (DRIVER.md regenerated). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
db9fdbd0e6 |
A-g: run the quick free tier on GSTACK_BUN_DEFAULT in CI; drift test pins it
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
8eba8b322e |
feat(autoplan): durable checkpoint and resume --from; Capy checklist (Lane B: B12)
With GSTACK_AUTOPLAN_CHECKPOINT_DIR set, every command that leaves a run at rest (gate_pending, amend_pending, complete, incomplete) publishes <dir>/<run>/: checkpoint.json listing every file's sha256, the run under run/, the owner's plan file under plan-input/ when it lives outside the run, and restore.md as the human index. Publication swaps in a fully written sibling. Checkpointing at every rest state, not only gate_pending, keeps accepted decisions from rolling back on restore. `gstack-autoplan resume --out <new dir> --from <checkpoint>` checks containment (no absolute or .. paths, regular files only) and every hash before publishing the run with one rename. It restores a missing plan file into the run, journals `restored` with both hosts, and takes the lock. CHECKPOINT_INVALID and CHECKPOINT_TARGET_EXISTS each get a result-codes row and a troubleshooting anchor. Journal and revise staging paths are now run-relative, so a moved run recovers. DRIVER.md and the Capy skill's autoplan section get a short Capy checklist: always drive gstack-autoplan, never present a hand review as an autoplan run, relay every gate page with rec as the default, pass --owner-reply, and point the checkpoint at the private project-user Drive folder. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
77ab139675 |
fix(autoplan): one-word rec, verified pairing, sealed attempt results, deferred reopen (Lane B: B1 B2 B4 B5)
B1/B-b/B-c `rec` (aliases: all, approve all, accept all, take all recommendations)
takes every recommendation, plan changes included; `as-is` keeps every
direction. The render offers `rec` first and prints what it resolves to
with gate_rev and rec_hash. `gstack-autoplan recommend` changes one
recommendation before relay (provenance recorded, p1 and decisions follow)
and bumps rec_rev, so a `rec` without the new --rec-hash is refused
(GATE_REC_STALE). An agent answer needs the owner's words verbatim
(--owner-reply <text>|-, --owner-reply-file; OWNER_REPLY_REQUIRED); a
parseable owner reply that resolves differently from the relay is refused
(GATE_OWNER_REPLY_MISMATCH). Supersedes field-wave R1 per the owner's
gate_rev 1 decision.
B2/B-a reconcile associates by title first; a file:line-only match is
`unverified` (associated, never confirmed). `b` is recommended only for a
confirmed pair with the same `changes` and one shared proposal (override)
or the same normalized remedy; the basis says which. Negative control and
positives copied from run-20261014225954 (test/fixtures/autoplan-pairing).
B4/B-e each attempt writes <phase>-<voice>.<attempt>.md; submit refuses another
attempt's file (ATTEMPT_MISMATCH) and binds a sealed 0444
<phase>-<voice>.<attempt>.bound.md copy, so a late write changes nothing
bound; reopen keeps sealed copies in place.
B5/B-d answer records accepted changes as amendments (status amend_pending) and
reopens nothing; revise reopens what changed. `revise --settle <id|d4>`
discharges a packaging/ordering change on an unchanged plan
(AMENDMENT_NOT_SETTLEABLE otherwise). APPLY/NEXT/status lines say which.
DRIVER.md and the reply table move to the rec grammar.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
||
|
|
3b83032837 |
fix(pregate): --remote runs the gate only when local tests are selected (Lane C4)
With only platform lanes selected, --remote no longer launches the remote gate with an empty file list; the existing no-local-lane path applies. Files (G2): lib/pregate/checks/lanes.ts. Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
d008757e87 |
fix(install): fresh-install log lines name the clone and every host installed (A10)
gstack-capy-install prints `cloned <repo> at <sha> (<version>)` for a checkout it cloned, or one the bootstrapper (revision 2, GSTACK_CAPY_CLONED) cloned in this run, instead of `reusing`. setup's final line is `gstack ready (<hosts>)` from the same rows as its summary table, including the --refresh-registered upgrade summary. Files: bin/gstack-capy-install, bin/gstack-capy-session, capy/skill/gstack/scripts/install.sh, setup, test/gstack-capy-install.test.ts, test/host-conformance.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
9c4635b221 |
fix(upgrade): every success path certifies the caller's project; a pins failure keeps the move, ends on gstack: fail pins, exit 1, no pending marker (A7, A-b)
gstack-upgrade captures the caller's directory and git toplevel before any cd. Already-current, fast-forwarded and resumed-pending paths run bin/gstack-capy-install --project <it> on Capy (installing a verified pinned Bun) or gstack-doctor --check --require runtime,pins elsewhere. The reinstall's own trailer is held back when a project certification follows, so no ok precedes a pins failure; a RUNTIME_PIN_CONFLICT stop becomes gstack: fail pins — <conflict>. --check and --ff-only-no-reinstall certify nothing. Files: bin/gstack-upgrade, test/gstack-upgrade-bin.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
266ebb1301 |
fix(install): one ok-trailer grammar with requested, pins-skipped and latest notes; bootstrapper revision 2 exports origin's VERSION (A9, A-a)
Notes ride only on the ok trailer in fixed order; the failure head is unchanged, pinned by a test that runs the Capy skill's dispatch examples against real doctor output. The latest note comes only from GSTACK_CAPY_REMOTE_VERSION, which the bootstrapper sets from a fetch in this run and unsets otherwise (a stale FETCH_HEAD never reaches the installer). Files: bin/gstack-capy-install, bin/gstack-capy-session, capy/skill/gstack/scripts/install.sh, capy/skill/gstack/SKILL.md, test/gstack-capy-install.test.ts, test/capy-skill-wrapper.test.ts, test/gstack-doctor.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
4c2d3fe011 |
docs(ship): Step 5 pre-gate text for stalls and the small-machine remote gate (Lane C-c)
The pre-gate paragraph now says `incomplete` blocks (a stall is incomplete) and that `requires-remote` covers the remote gate under 8 cores, cleared by `gstack-pregate clear` or `--remote --spend-cap <usd>` only under a cap the user gave. Kept within the ship parity size cap (union 308,771 of 308,776 bytes; base 308,767), so the `--explain` hint moved to docs/pregate.md. The handoff's escalation line already names any `requires-remote` lane; unchanged. Files (G2): ship/sections/tests.md.tmpl, ship/sections/tests.md (generated). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
d6f4ea9f12 |
fix(pregate): test stage never hangs silently; small machines record the remote gate (Lane C, GBRA-95)
C1 diagnosis (gbrain 92f0ea87, a core edit selecting 3,683 local files, 358 serial; Bun 1.4.2 and 1.4.3 identical): --timeout was applied per runner spawn (unit group plus one per serial file), so the check was unbounded, and spawnSync buffered all output until it returned: 360 s with 0 bytes on stdout and stderr. A backgrounded child holding stdout made spawnSync wait the full timeout and then report exit 0 (a silent wait, then green). Not the Bun 1.4.2 spawnSync hang. C2/C-b: test-tier commands (lanes runner, guards, the --remote gate) run via lib/pregate/supervise.ts: own process group (setsid), stdout/stderr appended to a log file (no pipes), async supervision; CheckDef.run may return a promise and runPregate/withFingerprint await it (a rejection is incomplete). Leftover group members are killed after exit; SIGINT/SIGTERM to pregate SIGKILLs running groups, writes no pregate.json, exits 130/143. Windows: taskkill /T /F (reparented or detached descendants can survive; documented). C3/C-a: --timeout bounds the whole check; groups past the deadline are not started. --stall-timeout <s> (default stall_timeout_s, else 300; 0 disables) kills a group whose log stops growing and records PREGATE_STALLED naming the last file started. Live stderr: PREGATE_TEST per file (bun test adapter; any runner for one-file runs), PREGATE_HEARTBEAT after 60 s without progress, PREGATE: tests <verdict>. --json stdout unchanged. C4/C-c: under 8 cores, a base-branch remote_gate or a non-local test_backend records the local tier as a requires-remote obligation with its command (pregate.json/remote_gate or test_backend/<backend>). --remote runs the declared remote_gate now (needs --allow-repo-commands, never --policy-from head) under --spend-cap/GSTACK_SPEND_CAP_USD; it clears only on PREGATE_REMOTE: tree=<tested tree> tests>0 failed=0 with exit 0, and reports spent/reserved/unknown. G1: new code PREGATE_STALLED has its result-codes row, troubleshooting anchor and the installer-form error line (CODE; url#anchor). Files (G2): lib/pregate/supervise.ts (new), lib/pregate/types.ts, lib/pregate/context.ts, lib/pregate/index.ts, lib/pregate/checks/lanes.ts, lib/pregate/checks/guards.ts, lib/pregate/config.ts, lib/headless-artifacts.ts, lib/result-codes.ts, bin/gstack-pregate, bin/gstack-doctor-components.sh (generated), docs/pregate.md, docs/troubleshooting.md, test/pregate-supervise.test.ts (new), test/pregate-remote.test.ts (new). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
cafb39dd12 |
feat(install): marked per-directory bun and bunx shims for fresh Capy shells (A4, A-e)
gstack-capy-install (install mode, Capy machines only, GSTACK_BUN_SHIM=0 opts out) writes ~/.local/bin/bun and bunx under ~/.gstack-runtime.lock. The shim bakes the store, verdict directory, checkout and install default, walks up to .git without spawning git, runs the Bun the (checkout, project) verdict recorded, else a store Bun matching the .bun-version/package.json subset (stderr names the --check to run when none matches), else the install default, else the next unmarked bun on PATH. A foreign file or dangling link is never touched. GSTACK_BUN_SHIM_EXPLAIN=1 prints project, record, choice and rule; the doctor's runtime row shows the shim and its target. Files: bin/gstack-capy-install, test/gstack-capy-install.test.ts, test/gstack-doctor.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
9b96457dde |
docs(troubleshooting): BUN_RESOLUTION_DRIFT and BUN_INSTALL_VERSION_INVALID anchors; CAPY_WRAPPER_STALE covers the wrapper row (A5, A8, A-f, G1)
Files: docs/troubleshooting.md, bin/gstack-capy-install, bin/gstack-doctor-check.sh, test/gstack-capy-install.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
abae03714e |
fix(issue-links): --author for the Related lookup when gh runs as an app (Lane D: D2)
On a Capy machine the gh viewer is `capy-ai[bot]`, not the owner (checked live against garrytan/gbrain #6252), so "other authors" needs the PR author named: `--author <login>` overrides the viewer; the pr-body Issue links step says to pass it when gh runs as an app. Files: bin/gstack-issue-links, docs/pregate.md, ship/sections/pr-body.md.tmpl, ship/sections/pr-body.md, test/ship-issue-intent.test.ts, test/helpers/carve-guards.ts (ship maxSizeRatio re-measured: 309,483 / 187,706 = 1.6488). Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |
||
|
|
360e7bc627 |
fix(install): one Bun resolution contract, versioned runtime store, verdict per (checkout, project), drift and wrapper rows (A1-A3, A5, A6, A8, A-c, A-d, A-f, A-h, A-i)
- bin/gstack-bun-version.sh: GSTACK_BUN_DEFAULT=1.4.3 beside the 1.4.2 floor, gstack_bun_install_version (GSTACK_BUN_INSTALL_VERSION override), gstack_bun_store, portable gstack_realpath, and gstack_bun_resolve (pin and default in the store, $BUN_INSTALL/bin, ~/.bun/bin, PATH; first candidate satisfying every pin; shim-marked files never returned). gstack_bun_launch_dir is replaced by it. - lib/pregate/runtime.ts: resolveBun, the TypeScript twin; launchRuntime runs the Bun the install verdict recorded under the admission condition and explains the skip otherwise. - bin/gstack-capy-install: install and --check resolve through the contract; verified archives publish atomically to <state root>/runtimes/bun/<v>/bun under ~/.gstack-runtime.lock and ~/.bun/bin is never written; the "no Bun satisfies" line names the candidates judged; --check reports BUN_RESOLUTION_DRIFT with one converging fix. - bin/gstack-install-verdict.sh, lib/install-verdict.ts: schema 2 verdicts keyed by (checkout, project) with pin, bun_path, bun_version, bun_rule; schema 1 path still read; admission binds test-running workflows to the project and refuses a running Bun the verdict did not record. - bin/gstack-doctor-check.sh, lib/doctor-components.ts: wrapper core row (CAPY_WRAPPER_STALE by active provenance, WARN for stale Drive copies), runtime drift row, shim note, install-version note. - lib/result-codes.ts: BUN_RESOLUTION_DRIFT, BUN_INSTALL_VERSION_INVALID; CAPY_WRAPPER_STALE fix names the workaround and the owner action. Files: bin/gstack-bun-version.sh, bin/gstack-capy-install, bin/gstack-doctor-check.sh, bin/gstack-doctor-components.sh (generated), bin/gstack-install-verdict.sh, lib/doctor-components.ts, lib/install-verdict.ts, lib/pregate/runtime.ts, lib/result-codes.ts, test/bun-resolve.test.ts, test/gstack-capy-install.test.ts, test/gstack-doctor.test.ts, test/install-verdict.test.ts, test/pregate-guards.test.ts Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> |