Skip to content

browse: keep tunnel-paired agents on web URLs and away from the daemon's disk - #4116

Merged
capy-ai[bot] merged 5 commits into
mainfrom
capy/keep-tunnel-paired-agents
Nov 7, 2026
Merged

capy-ai[bot] merged 5 commits into
mainfrom
capy/keep-tunnel-paired-agents

Conversation

@garrytan

@garrytan garrytan commented Nov 7, 2026 •

Copy link
Copy Markdown
Owner
{
  "schema_version": 1,
  "pr": 4116,
  "head": "6574c9da14af0d4b8a581a546ef13c2a415b9bac",
  "version": "1.97.0.0",
  "base": "main",
  "gate": {
    "bun run test": {
      "pass": 1627,
      "fail": 0,
      "skip": 0
    }
  },
  "ci_carried": [
    {
      "lane": "bun_run_test",
      "run": 42348464341,
      "attempt": 1,
      "tree": "681cd61eebd59c66e16c27ec525e8ace7f9787eb"
    }
  ],
  "session_kind": "unattended",
  "head_tree": "681cd61eebd59c66e16c27ec525e8ace7f9787eb",
  "product_patch_id": "499edce6b0101ac11c49db52eca31966fbb3ad2b",
  "gstack_version": "1.97.0.0",
  "review_depth": {
    "depth": "full",
    "class": "code",
    "runtime_lines": 197,
    "rules": "70895942bb8a8ee2",
    "base": "94392a61ecba8ad674b750b1e93bcc9eeb14bd84",
    "registry": "94392a61ecba8ad674b750b1e93bcc9eeb14bd84",
    "gate_scan": {
      "tagged": 0,
      "head": "6574c9da14af0d4b8a581a546ef13c2a415b9bac"
    },
    "reasons": [
      "risk:security",
      "runtime=197"
    ],
    "risk": [
      "security"
    ],
    "mode": "panel"
  },
  "pregate": "requires-remote cleared @681cd61eebd5 (8 checks, current for 6574c9da14af)",
  "requires_remote": [
    "free-tests.yml/cso-macos-launcher: https://github.com/garrytan/gstack/actions/runs/42348464341/attempts/1",
    "free-tests.yml/macos-named-regressions: https://github.com/garrytan/gstack/actions/runs/42348464341/attempts/1",
    "windows-smoke.yml/windows-smoke: https://github.com/garrytan/gstack/actions/runs/42347925029/attempts/1",
    "pregate.json/remote_gate: remote-gate tree=681cd61eebd5 tests=36185 skipped=111 runs=42348464341/1 profiles=ci-reuse/free-tests heads=6574c9da14af verified=2026-11-07T06:54:18.569Z"
  ],
  "issues": {
    "fixes": [],
    "refs": [],
    "flakes": []
  },
  "docs": {
    "status": "current",
    "scope": "docs/, BROWSER.md, pair-agent/ (read-only audit docs-4116-a1 at aaff474..6574c9d)"
  },
  "review_loop": {
    "passes": 2,
    "blocking_found": 4,
    "deferred": 0,
    "noted": 2,
    "fixed": 8,
    "scope": "frozen",
    "fix_checks": 2,
    "rounds": 4,
    "ledgers_read": 6,
    "dispatches": {
      "specialist": 8,
      "red-team": 2
    }
  }
}

What changed

pair-agent now tells remote agents what the tunnel refuses: non-web URLs, screenshots without --base64, image-writing snapshot flags, and eval

pair-agent now tells remote agents what the tunnel refuses: non-web URLs, screenshots without --base64, image-writing snapshot flags, and eval.

Before/after as text: pair-agent now tells remote agents what the tunnel refuses: non-web URLs, screenshots without --base64, image-writing snapshot flags, and eval
--- Before · pair-agent/SKILL.md.tmpl § What the remote agent can do at aaff474 · source text
+++ After · pair-agent/SKILL.md.tmpl § What the remote agent can do on this branch · source text
 ## What the remote agent can do
 Default access is read+write+admin+meta. The trust boundary is the pairing
 ceremony, not the scope:
+- Navigate to http(s) URLs, click elements, fill forms, take screenshots
-- Navigate to URLs, click elements, fill forms, take screenshots
 - Read page content (text, HTML, snapshot)
 - Create new tabs (each agent gets its own)
-- Execute JavaScript via `eval`
 - Cannot stop or restart the browser, or disconnect headed mode (needs --control)
 
+Remote agents go through the tunnel command allowlist, so they can't read local
+files, can't choose a path on this machine's disk, and can't make the daemon
+save screenshot or snapshot images: `goto`/`newtab` take http(s) URLs only,
+`screenshot` needs `--base64` and cannot name an output path, `snapshot`
+refuses `-a`, `-H` and `-o`, and
+`eval`, `js`, `cookies`, and `storage` are not dispatchable over the tunnel
+even with admin scope. Agents paired with `--local` get all of them.
-Remote agents go through the tunnel command allowlist: `eval` works, but the
-`js`, `cookies`, and `storage` commands are not dispatchable over the tunnel
-even with admin scope. Agents paired with `--local` get all four.
 
 With --restrict (`--restrict read`, `--restrict "read,write"`):
 - Sandboxed sessions: read-only, or read+write with no JS, cookie, or storage
   access. Pair this way when the remote agent will read untrusted web content:
   a trusted agent can be prompt-injected by pages it reads, and scope caps the
+  blast radius.
-  blast radius (eval works over the tunnel).
 - `--restrict` never grants `control`; that scope stays behind --control.
 - To tighten an agent that is ALREADY paired, re-pair it with the **same
   `--client` name** and the narrower `--restrict`/`--domain`. A reducing re-pair

The tunnel dispatch gate (canDispatchOverTunnel in browse/src/routes/commands.ts) now reads command args on the pair-agent tunnel surface:

  • goto and newtab accept only http(s) URLs over the tunnel. file:, data:, javascript:, view-source:, chrome: and about: targets get a 403. newtab checks the URL its handler opens, so newtab --json <url> works.
  • screenshot must include --base64 and cannot name an output path. snapshot refuses -a/--annotate, -H/--heatmap and -o.
  • eval leaves TUNNEL_COMMANDS (now 25 commands), because it always runs a file from the daemon's disk.
  • The /command route gates a body with no args field as [], the same default the handler uses. null, non-array args and arrays with a non-string element get the logged 403.
  • The 403 hint names these limits, including screenshot --base64 --selector <css> for targeting an element.
  • The instruction block remote agents receive now shows screenshot --base64 as its screenshot example.

parseScreenshotArgs moves out of the screenshot handler in meta-commands.ts so the handler and the gate share one parser. The handler's behavior is unchanged.

Docs match: BROWSER.md, docs/BROWSER_INTERNALS.md, docs/REMOTE_BROWSER_ACCESS.md and pair-agent/SKILL.md.tmpl plus the regenerated SKILL.md. Over the tunnel a paired agent can't read local files, can't choose a path on the daemon's disk, and can't make the daemon save screenshot or snapshot images.

Why

The tunnel allowlist comment said paired remote agents never get disk access, but navigation and screenshot args let a tunnel token open local files and have images saved under the daemon's working directory and /tmp. The gate now checks the args, so tunnel agents stay on web pages and get screenshots back in the response.

Blast radius

Only requests on the tunnel surface change. Local CLI, skill-spawned, root and extension clients go through the same code as before; local surface dispatches the same commands unchanged and a screenshot with no args field is gated like args: [] (tunnel refuses, local dispatches) in browse/test/dual-listener.test.ts drive the real /command handler on both surfaces (script ran). canDispatchOverTunnel with omitted args keeps its command-only answer for its other callers (server.ts re-export and tests; read).

Approvals

Approved: yes (record r-9084c1af180d). The full approval record stays private: this repository is public or its visibility is unknown.

Summary

Tunnel-paired browse agents get web navigation and in-response screenshots, and nothing more from the daemon's disk. Review found the remaining ways a tunnel request could save a temp image or skip the args check; all are closed here with tests.

Test Coverage

Step 7 audit: 13/13 changed code paths tested (100%), 0 gaps. Since then, review fixes added 7 tests across browse/test/tunnel-gate-unit.test.ts, browse/test/tab-isolation.test.ts and browse/test/dual-listener.test.ts; each failed on the previous head and passes now.
Tests ran: focused 696 (local lane at fc0da49)
Tests ran: bun run test 1627 (files; carried from CI run 42348464341/1 at tree 681cd61eebd5)

Pre-Landing Review

Pre-Landing Review: 8 issues — 8 fixed (pass 1 auto-fixes plus the owner-granted rounds), 0 asked, 0 deferred, 2 noted
REVIEW_LOOP: passes=2 blocking_found=4 deferred=0 noted=2 fixed=8 scope=frozen ledgers_read=6 fix_checks=2 dispatches=10
Gate edits: none detected (6 listed, 3 read; patterns: RH-1,RH-3,RH-4,RH-12,RH-13,RH-14,RH-15,RH-16; unlisted idioms: none)
Outside review: unavailable (Codex CLI not installed on this machine); missing coverage, not a pass. The in-host adversarial pass ran on both rounds.

Deferred findings

Blocking findings in code this PR did not change (review scope: frozen); filed as issues and not closed by this PR.

Review notes

Below the blocking floor (advisory, informational, test-gap or wording items); recorded here and not fixed in this PR.

  • INFORMATIONAL browse/src/browser-manager.ts Browser downloads triggered by a tunnel click use Playwright defaults; unverified where they land. Pre-existing. Reader: INVESTIGATE, Low, Blocks: no.
  • INFORMATIONAL changelog.d/capy-gst-1747-tunnel-web-urls.md:4 The restored claim was broader than what the gate enforces; narrowed in the five places.
  • INFORMATIONAL browse/src/routes/commands.ts:56 newtab with --json before the URL is refused for domain-scoped tokens.

The deferred item #4120 was filed by the defer step for the 403-hint wording, which dd6c3d2 already changed (the hint now names screenshot --base64 --selector <css>); it can be closed.

Exploratory QA

Functional probes of the gate (qa/functional captures 001-006, revalidated as qa/functional2 001-004 on the final tree): verdict pass. Two defects found by probes were fixed (newtab --json refused; the instruction block's screenshot example refused). Limit: gate-function probes; the live tunnel listener is covered by browse/test/dual-listener.test.ts, not a running ngrok tunnel.

Design Review

No frontend files changed — design review skipped.

Eval Results

No paid evals ran. The selector fell back to full coverage (BROWSER.md is an unknown dependency) and labels those 153 behaviors scheduled/release coverage, not PR passes. The directly touched rule case, safety-pair-agent-block, was not run on this machine (no Claude CLI).

Plan Completion

Plan completion audit: not run (no plan is bound to this branch and no docs/designs/ file matches). Fix: add "Plan: " to the PR body, or run /autoplan.

TODOS

No TODO items completed in this PR.

Documentation

Status: current. The branch's documentation already reflects the tunnel-gate change; no edits are needed.

Scope: 12 committed files at aaff474..6574c9d on capy/keep-tunnel-paired-agents (no staged, unstaged or new files). Nested docs and authored templates were searched for tunnel allowlist claims.

Documentation health:

  • BROWSER.md: current (25-command allowlist, new location in routes/commands.ts, args gate described)
  • docs/REMOTE_BROWSER_ACCESS.md: current (count, --base64 screenshot example, eval removed from tunnel)
  • docs/BROWSER_INTERNALS.md: current (count updated)
  • pair-agent/SKILL.md.tmpl and pair-agent/SKILL.md: current (eval no longer offered over the tunnel)
  • ARCHITECTURE.md: current (no command count stated)
  • browse/sections/command-list.md: current (--out described as never allowed over the tunnel)

Coverage debt: the new tunnel argument limits (http(s)-only goto/newtab, --base64-only screenshot, snapshot -a/-H/-o refused) have reference coverage in BROWSER.md, REMOTE_BROWSER_ACCESS.md and pair-agent; there is no how-to for capturing screenshots from a remote agent (a common gap). No critical gaps.

Diagram drift: none found.

Test plan

  • bun test browse/test/tunnel-gate-unit.test.ts browse/test/dual-listener.test.ts browse/test/tab-isolation.test.ts: all green, no failures, at 6574c9d
  • bun run typecheck: clean
  • bun run test: carried from CI run 42348464341/1 at tree 681cd61eebd5 (1627 files)

(GST-1747)

Open in Capy

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

trunk-io Bot commented Nov 7, 2026 •

Copy link
Copy Markdown

😎 This pull request was merged.

garrytan and others added 4 commits November 7, 2026 06:18
Tunnel instruction block screenshot example uses --base64; newtab gates the URL its handler opens (skipping --json); Security Model bullet says 25 commands.

Review-Finding: p1/specialist-batched#1 reader=specialist-batched
Review-Finding: p1/specialist-batched#2 reader=specialist-batched
Review-Finding: p1/red-team#1 reader=red-team
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Tunnel gate refuses null args and non-string elements with the logged 403; the screenshot 403 hint names --selector <css>; docs and changelog say tunnel agents cannot read local files or choose where anything is written, and that fixed-name captures still go to the temp dir.

Review-Finding: v1/adversarial-native#2 reader=adversarial-native
Review-Finding: v1/adversarial-native#3 reader=adversarial-native
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…e tunnel

Over the pair-agent tunnel nothing is written to the daemon's disk: screenshot must include --base64, snapshot refuses -a/--annotate and -H/--heatmap as well as -o, and the 403 hint names these limits. Docs and changelog state the claim again. Approved under B1 (a-d2bdd5d079e4).

Review-Finding: v1/adversarial-native#1 reader=adversarial-native
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…l claim

The /command route passes [] to canDispatchOverTunnel when the body has no args field, matching the handler's default, so a tunnel screenshot without --base64 is refused in either form. Docs and changelog now say a paired agent can't read local files, can't choose a path on the daemon's disk, and can't make the daemon save screenshot or snapshot images. Approved under C1 (a-f778cd1e7945).

Review-Finding: p2/specialist-batched#1 reader=specialist-batched
Review-Finding: p2/red-team#1 reader=red-team
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@capy-ai capy-ai Bot changed the title browse: keep tunnel-paired agents on web URLs and off the daemon's disk browse: keep tunnel-paired agents on web URLs and away from the daemon's disk Nov 7, 2026
@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

E2E Evals: ✅ PASS

[test:paid] VERDICT GREEN — lane gate/pr, attempt 1
  rule 107/107 · behavior 1/1 · judge 0/0 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 5m10s · cost $35.71 known + 4 of 110 trial(s) cost unknown

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

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

Full gate restored by:

  • BROWSER.md (real unknown dependency): register BROWSER.md under the cases that consume it in test/helpers/touchfiles-data.ts, add it to FREE_ONLY_PR_FILES in scripts/test-pr-profile.ts if no paid case reads it, or add its directory to DERIVABLE_PREFIXES so scripts/pr-dependencies.ts derives its consumers
Rule and judge shards
Shard Automated result Manual/unscored Executed Reused Status Cost
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-current 1/1 0 1 0 ✅ $1.19
e2e-deploy/skill-e2e-deploy--setup-deploy-workflow 1/1 0 1 0 ✅ $0.1
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-recovery 1/1 0 1 0 ✅ $0.4
e2e/skill-e2e-shared-libs-paths--shared-libs-review-prior-coverage 1/1 0 1 0 ✅ $1.05
e2e-review-army/skill-e2e-review-army--review-army-quality-score 1/1 0 1 0 ✅ $0.13
e2e-qa-workflow/skill-e2e-qa-workflow--qa-quick 1/1 0 1 0 ✅ $0.46
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 ✅ $0.66
e2e/skill-e2e-ship-hook-consent 2/2 0 2 0 ✅ $0.2
e2e-review-army/skill-e2e-review-army--review-army-migration-safety 1/1 0 1 0 ✅ $0.28
e2e/skill-e2e-ship-skip 1/1 0 1 0 ✅ $0.24
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-stale-before 1/1 0 1 0 ✅ $0.43
e2e/skill-e2e-shared-libs--shared-libs-read-only 1/1 0 1 0 ✅ $0.26
e2e/skill-e2e-shared-libs--shared-libs-unsupported-git 1/1 0 1 0 ✅ $0.19
e2e/skill-e2e-shared-libs--shared-libs-review-lifecycle 1/1 0 1 0 ✅ $0.91
e2e-review-army/skill-e2e-review-army--review-army-perf-n-plus-one 1/1 0 1 0 ✅ $0.2
e2e-deploy/skill-e2e-deploy--land-and-deploy-review-gate 1/1 0 1 0 ✅ $0.32
e2e/skill-e2e-shared-libs-paths--shared-libs-review-index-flags 1/1 0 1 0 ✅ $1.06
e2e-deploy/skill-e2e-deploy--benchmark-workflow 1/1 0 1 0 ✅ $0.22
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-stale-after 1/1 0 1 0 ✅ $0.41
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-small-cli 1/1 0 1 0 ✅ $0.93
e2e-safety-codex-consult/skill-e2e-safety-codex-consult 1/1 0 1 0 ✅ $0.28
e2e/skill-e2e-workflow 4/4 0 4 0 ✅ $0.86
e2e/skill-e2e-shared-libs-paths--shared-libs-review-path-eligibility 1/1 0 1 0 ✅ $1.57
e2e-deploy/skill-e2e-deploy--land-and-deploy-first-run 1/1 0 1 0 ✅ $0.24
e2e-design/skill-e2e-design--design-review-plugin-handoff 1/1 0 1 0 ✅ $0.11
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-late-result 1/1 0 1 0 ✅ $0.35
e2e-design/skill-e2e-design--design-review-detector-shim-dom 1/1 0 1 0 ✅ $0.22
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-missing-asset 1/1 0 1 0 ✅ $0.29
e2e-docsync-spawned/skill-e2e-docsync-spawned 1/1 0 1 0 ✅ $0.45
e2e-review-army/skill-e2e-review-army--review-army-json-findings 1/1 0 1 0 ✅ $0.07
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-store 1/1 0 1 0 ✅ $0.98
e2e-review-army/skill-e2e-review-army--review-army-delivery-audit 1/1 0 1 0 ✅ $0.14
e2e-session-intelligence/skill-e2e-session-intelligence 4/4 0 4 0 ✅ $0.3
e2e-safety-pair-agent/skill-e2e-safety-pair-agent 1/1 0 1 0 ✅ $0.1
e2e-qa-workflow/skill-e2e-qa-workflow--qa-bootstrap 1/1 0 1 0 ✅ $0.09
e2e-deploy/skill-e2e-deploy--canary-workflow 1/1 0 1 0 ✅ $0.11
e2e/skill-e2e-ship-hook-refresh 1/1 0 1 0 ✅ $0.1
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-launch-failure 1/1 0 1 0 ✅ $0.17
e2e-learnings/skill-e2e-learnings 1/1 0 1 0 ✅ $0.07
e2e-design/skill-e2e-design--plan-design-review-no-ui-scope 1/1 0 1 0 ✅ $0.11
e2e-deploy/skill-e2e-deploy--land-and-deploy-workflow 1/1 0 1 0 ✅ $0.63
e2e/skill-e2e-shared-libs--shared-libs-review-revalidation 1/1 0 1 0 ✅ $1.93
e2e-review/skill-e2e-review 2/2 0 2 0 ✅ $0.37
e2e-cso/skill-e2e-cso 1/1 0 1 0 ✅ $0.4
e2e-qa-functional/skill-e2e-qa-functional 2/2 0 2 0 ✅ $0.8
e2e-qa-callers/skill-e2e-qa-callers--review-exploratory-small-cli 1/1 0 1 0 ✅ $0.78
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-plan-checks 1/1 0 1 0 ✅ $0.95
e2e-failure-routing/skill-e2e-failure-routing 2/2 0 2 0 ✅ $0.13
e2e-qa-workflow/skill-e2e-qa-workflow--qa-only-no-fix 1/1 0 1 0 ✅ $0.53
e2e-qa-functional-fix/skill-e2e-qa-functional-fix 2/2 0 2 0 ✅ $0.93
e2e/skill-e2e-test-value 3/3 0 3 0 ✅ $0.71
e2e-retro/skill-e2e-retro 1/1 0 1 0 ✅ $0.35
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-failure 1/1 0 1 0 ✅ $0.64
e2e-skillify/skill-e2e-skillify 3/3 0 3 0 ✅ $0.89
e2e-qa-callers/skill-e2e-qa-callers--ship-exploratory-late-input 1/1 0 1 0 ✅ $0.88
e2e-hermetic/skill-e2e-hermetic-canary 2/2 0 2 0 ✅ $0.02
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-completion 1/1 0 1 0 ✅ $1.01
e2e-triage/skill-e2e-triage 1/1 0 1 0 ✅ $0.1
e2e-review-attribution/skill-e2e-review-attribution 3/3 0 3 0 ✅ $0.29
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-timeout-unsettled 1/1 0 1 0 ✅ $0.21
e2e-design/skill-e2e-design--design-review-detector-shim 1/1 0 1 0 ✅ $0.12
e2e/skill-e2e-coverage-audit 2/2 0 2 0 ✅ $0.42
e2e-plan-tune/skill-e2e-plan-tune 1/1 0 1 0 ✅ $0.13
e2e-safety-ship-evidence/skill-e2e-safety-ship-evidence 1/1 0 1 0 ✅ $0.14
e2e-browse/skill-e2e-bws 6/6 0 6 0 ✅ $0.3
e2e-third-party-actions/skill-e2e-third-party-actions 5/5 0 5 0 ✅ $0.46
e2e-ship-docsync/skill-e2e-ship-docsync--ship-docsync-missing-marker 1/1 0 1 0 ✅ $0.19
Fail-closed reconciliation
eview-detector-shim
  slice 16  passed             25s  test/skill-e2e-ship-docsync.test.ts#ship-docsync-launch-failure
  slice 16  passed             30s  test/skill-e2e-session-intelligence.test.ts
  slice 16  passed             20s  test/skill-e2e-deploy.test.ts#canary-workflow
  slice 16  passed             26s  test/skill-e2e-ship-hook-refresh.test.ts
  slice 16  passed             17s  test/skill-e2e-design.test.ts#plan-design-review-no-ui-scope
  slice 16  passed             27s  test/skill-e2e-review-army.test.ts#review-army-delivery-audit
  slice 16  passed             22s  test/skill-e2e-safety-pair-agent.test.ts
  slice 16  passed             19s  test/skill-e2e-qa-workflow.test.ts#qa-bootstrap
  slice 16  passed              9s  test/skill-e2e-learnings.test.ts
  slice 16  passed             13s  test/skill-e2e-diagram.test.ts
[test:paid] collector final outcomes: 96 executed, 0 reused; 96 passed, 0 failed, 0 manual accepted (unscored; no score-cache credit) (96 attempt records from 68 collectors; every record counts)
[test:paid] deselected testcases, zero credit (316):
[test:paid]    302  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 107/107 · behavior 1/1 · judge 0/0 · quarantined 0 (0 failing the lane)
  SKIPPED 0 · INFRA 0 · INCOMPLETE 0 · unattributed 0 · ACTION REQUIRED 0
  wall 5m10s · cost $35.71 known + 4 of 110 trial(s) cost unknown
[test:paid] exercised-path map (shadow, non-blocking): 13 MAP_GAP line(s) over 100 executed case(s) with recorded commands
  MAP_GAP document-release bin/gstack-banned-terms: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP plan-ceo-finding-floor browse/dist/browse: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP plan-review-report bin/gstack-plan-reality: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP plan-review-report browse/dist/browse: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP safety-ship-stale-evidence browse/dist/browse: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP shared-libs-review-index-flags bin/gstack-approval-classes: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP shared-libs-review-prior-coverage bin/gstack-approval-classes: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP shared-libs-review-revalidation bin/gstack-approval-classes: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP ship-docsync-current bin/gstack-banned-terms: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP ship-exploratory-plan-checks bin/gstack-review-plan: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP ship-exploratory-small-cli bin/gstack-review-plan: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP test-audit-report-only design/dist/design: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
  MAP_GAP timeline-event-flow bin/gstack-skill-end: non-blocking for this PR; the next census refresh widens the map (docs/TESTING_INTERNALS.md#exercised-path-map)
[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.

Dispatched narrow screen (gstack-ship-queue ready --screen) of merge commit 901a219570df5e1523fc03429d33dfc268e360d8.

@capy-ai
capy-ai Bot merged commit de5cb24 into main Nov 7, 2026
69 checks passed
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