v1.91.70.0 feat(unattended): artifact contract + validator, `unattended` session kind, findings-derived review log, gate list (multi-agent wave B-core) by garrytan · Pull Request #3115 · garrytan/gstack · GitHub
Skip to content

v1.91.70.0 feat(unattended): artifact contract + validator, unattended session kind, findings-derived review log, gate list (multi-agent wave B-core) - #3115

Merged
capy-ai[bot] merged 2 commits into
mainfrom
capy/v191700-featunattended-artifact
Oct 10, 2026
Merged

capy-ai[bot] merged 2 commits into
mainfrom
capy/v191700-featunattended-artifact

Conversation

@garrytan

Copy link
Copy Markdown
Owner

First implementation PR of the multi-agent wave (docs/designs/MULTI_AGENT_WAVE_2026_10_10.md, plan PR #3113, owner-approved on every recommended option). This is B-core: items B0, B1, B7, B9, B10, B12 and the gstack-skill-start half of A3. B-runner (the next/submit runner, outside-voice runner, checklists, spend ledger) stacks on this branch next.

What a parent agent gets

  • GSTACK_SESSION_KIND=unattended: a fourth session kind, explicit override only, outranks GSTACK_HEADLESS; headless keeps BLOCK semantics so no eval case changes meaning. Suppresses every prompt like spawned, and additionally skips the telemetry writer, artifacts sync and brain spool at the entrypoints with an explicit line each, whatever settings or queue the machine inherited. Unknown kinds coerce to interactive but say so (SESSION_KIND: interactive (unknown kind 'x')).
  • STATE_ROOT: <path> durable=yes|no once per session from the GSTACK_EPHEMERAL=1 marker; unattended on an ephemeral root prints learnings: skipped (…; set GSTACK_STATE_ROOT) instead of writing silently.
  • One artifact contract (lib/headless-artifacts.ts): run.json, decisions.jsonl, findings.jsonl, tasks.jsonl v2, timing.json, pregate, ship-receipt, each with schema_version. bin/gstack-artifact validate run.json is the deterministic completion check: fails on interrupted run, missing reviewer, stale artifact hash, count mismatch, duplicate ids, dependency cycles, malformed JSONL tails, paths escaping the run dir (symlinks included). GSTACK_RESULT: terminal line + shared exit table (0 ok · 1 fail · 2 usage · 3 refused). docs/unattended.md has the six-step parent flow with jq/grep.
  • Reason codes in lib/result-codes.ts (sibling of gate-outcomes.ts), each with a docs/troubleshooting.md anchor and fix: clause; test/troubleshooting-anchors.test.ts covers both tables.
  • Gate list (lib/gate-list.ts, bin/gstack-gate render|parse|decisions): stable ids across pages of 7, auto vs approval, gate_rev binding; stale or unparsed replies are rejected with no writes; grammar all / <id><option> / all except …, bare yes/no rejected. Unattended autoplan ends with GSTACK_RESULT: skill=autoplan status=gate_pending run=<dir> and never approves.
  • ## URGENT, outside this plan is the fixed first block of the report and plan (None. form when empty), with a placement test.
  • Review log derived from findings (B7): bindReview(--findings) validates before consuming the start token, derives status/unresolved/issues_found/critical_gaps plus findings_total/open/resolved, rejects disagreeing rows (REVIEW_STATUS_MISMATCH, exit 1; usage exit 2); reviewFreshness reads findings_open; legacy counters stay conservative.
  • Timing (B10): bin/gstack-autoplan-timing writes timing.json and <state root>/analytics/autoplan-timing.jsonl (skipped with a line on ephemeral roots); Phase 0 prints a median-of-last-10 estimate or no history.
  • /autoplan on hosts that do not execute hooks prints autoplan guard: not enforced by this host; publication order is unverified (GUARD_NOT_INSTALLED) once; Claude Code's deny-on-absent hook is untouched.

Byte budgets

Union bytes shrank on every skill; autoplan −163 (ratio 1.1275 vs 1.1305 cap), ship/review/qa −5 each. CARVE_GUARDS autoplan gateAfterStop marker now keys on the gate file write. Golden ship renders refreshed (AUQ-format compression only).

Deviations from the plan text

  • run.json.status enum is complete|gate_pending|incomplete|interrupted|refused|awaiting_result|running (the hand-written reference run's approved became complete); artifact paths are run-dir-relative; findings.native_counterpart nullable.
  • EXECUTION_UNKNOWN is not in result-codes.ts yet: its only emitter is the B-runner resume, which adds it with its anchor.
  • The guard line is keyed on --skill autoplan so it does not print in every unattended skill.
  • gstack-session-kind ignores unknown GSTACK_SESSION_KIND values before skill-start sees them, so the loud note also reads the raw env var.

Validation

typecheck, typecheck:test (no new diagnostics), gen:skill-docs --host all idempotent, parity suite, module-size ratchet (4 new libs registered), state-root ratchet, spawnsync tripwire, troubleshooting anchors, host-config goldens, context-budget ratchet, agents-digest freshness: pass. New suites: headless-artifacts 23, review-log-findings 14, gate-list, autoplan-timing 6, gstack-session-kind 16, skill-start egress test (zero sink calls under unattended, all three under interactive). Last combined run of suites touching changed files: 886 pass / 0 fail. test:quick failures are the same Chromium/PTY/CSO-native/Windows-only files that fail identically on base 91bbd9e; the full bun run test was not run on the 4-core machine.

Version 1.91.70.0 (PATCH, clean bump from base per bin/gstack-next-version).

Open in Capy

@trunk-io

trunk-io Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

…nd, findings-derived review log, gate list

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…umer: headless-artifacts.test.ts)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

E2E Evals: ✅ PASS

[test:paid] VERDICT GREEN — lane gate/pr, attempt 1
  rule 108/108 · behavior 0/0 · judge 24/24 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 8m18s · cost $89.87 known + 54 of 132 trial(s) cost unknown

121 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $89.87 rule/judge cost | reconcile exit: 0

Profile: pr / mode full-fallback; selected behaviors: 108, judges: 24. Deferred to scheduled/release coverage: 136 behaviors and 13 changed prompt files. Deferred checks did not run and receive no PR-pass credit.

Derived dependents (scripts/pr-dependencies.ts):

  • bin/gstack-artifact: 227 case(s), 24 judge(s)
  • bin/gstack-autoplan-timing: 30 case(s), 0 judge(s)
  • bin/gstack-gate: 227 case(s), 24 judge(s)
  • lib/gate-list.ts: 227 case(s), 24 judge(s)
  • lib/headless-artifacts.ts: 227 case(s), 24 judge(s)
  • lib/result-codes.ts: 227 case(s), 24 judge(s)
Rule and judge shards
Shard Automated result Manual/unscored Executed Reused Status Cost
e2e/skill-e2e-workflow 4/4 0 4 0 ✅ $2.93
e2e-deploy/skill-e2e-deploy--land-and-deploy-workflow 1/1 0 1 0 ✅ $1.54
e2e-safety-codex-consult/skill-e2e-safety-codex-consult 1/1 0 1 0 ✅ $0.9
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-stale-before 1/1 0 1 0 ✅ $1.08
e2e-review-attribution/skill-e2e-review-attribution 3/3 0 3 0 ✅ $0.92
e2e/skill-e2e-shared-libs--shared-libs-review-lifecycle 1/1 0 1 0 ✅ $2.41
e2e-qa-workflow/skill-e2e-qa-workflow--qa-quick 1/1 0 1 0 ✅ $1.47
e2e/skill-e2e-shared-libs-paths--shared-libs-review-prior-coverage 1/1 0 1 0 ✅ $2.51
e2e/skill-e2e-ship-skip 1/1 0 1 0 ✅ $0.63
e2e-qa-callers/skill-e2e-qa-callers--review-exploratory-small-cli 1/1 0 1 0 ✅ $1.94
e2e/skill-e2e-test-value 3/3 0 3 0 ✅ $2.36
e2e-qa-workflow/skill-e2e-qa-workflow--qa-only-no-fix 1/1 0 1 0 ✅ $1.76
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-plan-checks 1/1 0 1 0 ✅ $1.78
e2e/skill-e2e-shared-libs--shared-libs-review-revalidation 1/1 0 1 0 ✅ $4.8
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-recovery 1/1 0 1 0 ✅ $0.86
e2e-review/skill-e2e-review 2/2 0 2 0 ✅ $1.12
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-failure 1/1 0 1 0 ✅ $1.9
e2e-skillify/skill-e2e-skillify 3/3 0 3 0 ✅ $2.57
e2e/skill-e2e-shared-libs-paths--shared-libs-review-path-eligibility 1/1 0 1 0 ✅ $3.83
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-current 1/1 0 1 0 ✅ $3.13
llm-judge/skill-llm-eval 24/24 0 24 0 ✅ $1.44
e2e/skill-e2e-coverage-audit 2/2 0 2 0 ✅ $0.68
e2e-deploy/skill-e2e-deploy--setup-deploy-workflow 1/1 0 1 0 ✅ $0.44
e2e-review-army/skill-e2e-review-army--review-army-perf-n-plus-one 1/1 0 1 0 ✅ $0.99
e2e/skill-e2e-shared-libs-paths--shared-libs-review-index-flags 1/1 0 1 0 ✅ $2.53
e2e/skill-e2e-investigate-owned-completion 1/1 0 1 0 ✅ $0.23
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-late-result 1/1 0 1 0 ✅ $0.89
e2e-review-army/skill-e2e-review-army--review-army-json-findings 1/1 0 1 0 ✅ $0.2
e2e-deploy/skill-e2e-deploy--benchmark-workflow 1/1 0 1 0 ✅ $0.6
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-small-cli 1/1 0 1 0 ✅ $1.88
e2e-learnings/skill-e2e-learnings 1/1 0 1 0 ✅ $0.41
e2e-deploy/skill-e2e-deploy--land-and-deploy-review-gate 1/1 0 1 0 ✅ $0.94
e2e-review-army/skill-e2e-review-army--review-army-migration-safety 1/1 0 1 0 ✅ $1.23
e2e/skill-e2e-shared-libs--shared-libs-read-only 1/1 0 1 0 ✅ $0.92
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-stale-after 1/1 0 1 0 ✅ $1.17
e2e-deploy/skill-e2e-deploy--land-and-deploy-first-run 1/1 0 1 0 ✅ $1.35
e2e-docsync-spawned/skill-e2e-docsync-spawned 1/1 0 1 0 ✅ $1.15
e2e-qa-functional-fix/skill-e2e-qa-functional-fix 2/2 0 2 0 ✅ $2.71
e2e/skill-e2e-plan--plan-review-report 1/1 0 1 0 ✅ $1.19
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-unavailable 1/1 0 1 0 ✅ $1.78
e2e-retro/skill-e2e-retro 1/1 0 1 0 ✅ $1.14
e2e-qa-functional/skill-e2e-qa-functional 2/2 0 2 0 ✅ $2.81
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-late-input 1/1 0 1 0 ✅ $2.11
e2e-cso/skill-e2e-cso 1/1 0 1 0 ✅ $1.09
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-store 1/1 0 1 0 ✅ $3.22
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-completion 1/1 0 1 0 ✅ $3.36
e2e-design/skill-e2e-design--design-review-detector-shim-dom 1/1 0 1 0 ✅ $0.7
e2e/skill-e2e-shared-libs--shared-libs-unsupported-git 1/1 0 1 0 ✅ $0.67
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-missing-asset 1/1 0 1 0 ✅ $1.39
e2e-review-army/skill-e2e-review-army--review-army-quality-score 1/1 0 1 0 ✅ $0.33
e2e-safety-ship-evidence/skill-e2e-safety-ship-evidence 1/1 0 1 0 ✅ $0.6
e2e-hermetic/skill-e2e-hermetic-canary 2/2 0 2 0 ✅ $0.04
e2e-design/skill-e2e-design--design-review-plugin-handoff 1/1 0 1 0 ✅ $0.57
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-missing-marker 1/1 0 1 0 ✅ $0.5
e2e-browse/skill-e2e-bws 6/6 0 6 0 ✅ $0.85
e2e-third-party-actions/skill-e2e-third-party-actions 5/5 0 5 0 ✅ $1.2
e2e-plan-tune/skill-e2e-plan-tune 1/1 0 1 0 ✅ $0.45
e2e-session-intelligence/skill-e2e-session-intelligence 4/4 0 4 0 ✅ $0.76
e2e-safety-pair-agent/skill-e2e-safety-pair-agent 1/1 0 1 0 ✅ $0.31
e2e-design/skill-e2e-design--design-review-detector-shim 1/1 0 1 0 ✅ $0.4
e2e-qa-workflow/skill-e2e-qa-workflow--qa-bootstrap 1/1 0 1 0 ✅ $0.23
e2e-triage/skill-e2e-triage 1/1 0 1 0 ✅ $0.44
e2e/skill-e2e-ship-hook-consent 2/2 0 2 0 ✅ $0.69
e2e-review-army/skill-e2e-review-army--review-army-delivery-audit 1/1 0 1 0 ✅ $0.34
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-timeout-unsettled 1/1 0 1 0 ✅ $0.48
e2e/skill-e2e-ship-hook-refresh 1/1 0 1 0 ✅ $0.28
e2e/skill-e2e-investigate-owned-termination 2/2 0 2 0 ✅ $0.5
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-launch-failure 1/1 0 1 0 ✅ $0.46
e2e-deploy/skill-e2e-deploy--canary-workflow 1/1 0 1 0 ✅ $0.38
e2e-design/skill-e2e-design--plan-design-review-no-ui-scope 1/1 0 1 0 ✅ $0.4
Fail-closed reconciliation
7s  test/skill-e2e-qa-callers.test.ts#ship-exploratory-small-cli
  slice 12  passed            179s  test/skill-e2e-shared-libs-paths.test.ts#shared-libs-review-index-flags
  slice 12  passed            107s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-late-result
  slice 12  passed             90s  test/skill-e2e-deploy.test.ts#benchmark-workflow
  slice 12  passed            119s  test/skill-e2e-review-army.test.ts#review-army-perf-n-plus-one
  slice 12  passed            110s  test/skill-e2e-plan-ceo-plan-mode.test.ts
  slice 12  passed             46s  test/skill-e2e-investigate-owned-completion.test.ts
  slice 12  passed             23s  test/skill-e2e-review-army.test.ts#review-army-json-findings
  slice 13  passed            138s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-missing-asset
  slice 13  passed            112s  test/skill-e2e-plan-devex-plan-mode.test.ts
  slice 13  passed             76s  test/skill-e2e-safety-ship-evidence.test.ts
  slice 13  passed             92s  test/skill-e2e-design.test.ts#design-review-detector-shim-dom
  slice 13  passed             99s  test/skill-e2e-shared-libs.test.ts#shared-libs-unsupported-git
  slice 13  passed             61s  test/skill-e2e-office-hours-auto-mode.test.ts
  slice 13  passed             74s  test/skill-e2e-design.test.ts#design-review-plugin-handoff
  slice 13  passed             58s  test/skill-e2e-bws.test.ts
  slice 13  passed             61s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-missing-marker
  slice 13  passed             44s  test/skill-e2e-review-army.test.ts#review-army-quality-score
  slice 13  passed              8s  test/skill-e2e-hermetic-canary.test.ts
  slice 14  passed             72s  test/skill-e2e-third-party-actions.test.ts
  slice 14  passed             53s  test/skill-e2e-plan-tune.test.ts
  slice 14  passed             41s  test/skill-e2e-triage.test.ts
  slice 14  passed             61s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-timeout-unsettled
  slice 14  passed             50s  test/skill-e2e-ask-user-question-format-compliance.test.ts
  slice 14  passed             53s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-launch-failure
  slice 14  passed             53s  test/skill-e2e-session-intelligence.test.ts
  slice 14  passed             45s  test/skill-e2e-ship-hook-consent.test.ts
  slice 14  passed             42s  test/skill-e2e-investigate-owned-termination.test.ts
  slice 14  passed             40s  test/skill-e2e-design.test.ts#design-review-detector-shim
  slice 14  passed             45s  test/skill-e2e-deploy.test.ts#canary-workflow
  slice 14  passed             40s  test/skill-e2e-ship-hook-refresh.test.ts
  slice 14  passed             58s  test/skill-e2e-design.test.ts#plan-design-review-no-ui-scope
  slice 14  passed             30s  test/skill-e2e-review-army.test.ts#review-army-delivery-audit
  slice 14  passed             32s  test/skill-e2e-safety-pair-agent.test.ts
  slice 14  passed             41s  test/skill-e2e-qa-workflow.test.ts#qa-bootstrap
  slice 15  passed             33s  test/skill-e2e-learnings.test.ts
  slice 15  passed             22s  test/skill-e2e-diagram.test.ts
[test:paid] collector final outcomes: 121 executed, 0 reused; 121 passed, 0 failed, 0 manual accepted (unscored; no score-cache credit) (121 attempt records from 70 collectors; every record counts)
[test:paid] deselected testcases, zero credit (307):
[test:paid]    293  sibling case of a case shard (its own shard runs it)
[test:paid]      8  periodic-tier case (this lane runs gate)
[test:paid]      6  Bun hook placeholder of a skipped describe block (not a test)
[test:paid] VERDICT GREEN — lane gate/pr, attempt 1
  rule 108/108 · behavior 0/0 · judge 24/24 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 8m18s · cost $89.87 known + 54 of 132 trial(s) cost unknown
[test:paid] report: every planned shard accounted and passed

Sliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry.

@capy-ai
capy-ai Bot merged commit 45a6783 into main Oct 10, 2026
67 checks passed
@capy-ai
capy-ai Bot deleted the capy/v191700-featunattended-artifact branch October 10, 2026 23:26
levi85 pushed a commit to levi85/gstack that referenced this pull request Oct 14, 2026
…ed` session kind, findings-derived review log, gate list (multi-agent wave B-core) (garrytan#3115)

* v1.91.70.0 feat(unattended): artifact contract, unattended session kind, findings-derived review log, gate list

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test: register test/fixtures/multi-agent-wave as a free fixture (consumer: headless-artifacts.test.ts)

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant