Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
42bbc2b
feat(python-sdk): log stream
letv1nnn Sep 25, 2026
d51c243
fix(python-sdk): end watch_logs on clean stream close and isolate its…
letv1nnn Oct 5, 2026
77c5ff6
fix(cli): name the sandbox in service not-found errors (#3798)
ericcurtin Oct 12, 2026
ca18712
feat(gateway): add gRPC server reflection (#3161)
2000krysztof Oct 12, 2026
c4dc30d
test(conformance): run driver suites with cargo (#3866)
elezar Oct 12, 2026
e585b49
feat(providers): support stable credential placeholders (#3339)
shiju-nv Oct 12, 2026
e0eabae
fix(gator): surface PR-owned security regressions in reviews (#4338)
johntmyers Oct 12, 2026
775d907
feat(sdk/ts): add createdAtMs to SandboxRef (#4347)
ericcurtin Oct 12, 2026
749d09e
fix(server): retry stop lifecycle writes after concurrent updates (#4…
pimlock Oct 12, 2026
16c8ca5
fix(docs): use lowercase "snap" as it is not a proper noun (#4387)
olivercalder Oct 12, 2026
66696eb
feat(python): expose sandbox status conditions in the SDK (#4436)
maxdubrinsky Oct 12, 2026
e326c10
fix(python): close client when Sandbox entry fails (#4367)
ericcurtin Oct 12, 2026
f6a3983
fix(network): enforce consistent HTTP framing (#4414)
alangou Oct 12, 2026
f01a664
docs: clarify vouch timing, DCO vs signing, and PR checklist guidance…
politerealism Oct 12, 2026
cfe9850
fix(sandbox): name Landlock ABI in startup error (#4413)
ericcurtin Oct 12, 2026
473b5f9
fix(server): return SQLite write versions atomically (#4408)
ericcurtin Oct 12, 2026
cc4b9c7
fix(cli): disable ssh connection sharing for sandbox sessions (#4157)
ericcurtin Oct 12, 2026
28add89
fix(cli): preserve external TLS for SSH forwarding (#4344)
danehans Oct 12, 2026
3495c8e
fix(kubernetes): refresh sandbox runtime image on start (#4376)
lunarwhite Oct 12, 2026
36c4c03
docs(runtimes): show required schema version in gateway TOML examples…
fede-kamel Oct 12, 2026
6b7a00e
docs(extensibility): name extension base capabilities (#4405)
ericcurtin Oct 12, 2026
fc8d0d7
test(tmachine): add a K3s HA conformance lane with PostgreSQL and mTL…
matthewgrossman Oct 12, 2026
dc967d8
chore(ci): close stale issues after 14 additional days (#3985)
purp Oct 12, 2026
85c2c64
chore(codeowners): remove wildcard ownership rule (#3168)
purp Oct 12, 2026
2f9ce1d
test(vm): avoid inherited lease race in restart cleanup test (#4316)
grs Oct 12, 2026
ef863ec
fix(windows): restore MSVC lint for CLI and MXC (#4194)
feloy Oct 12, 2026
01c249f
chore(deps): bump astral-sh/setup-uv from 10.0.0 to 10.0.1 (#2767)
dependabot[bot] Oct 12, 2026
fe31606
feat(sdk-ts): add watchLogs with loss-aware resume (#3778)
letv1nnn Oct 12, 2026
3f12bdc
fix(server): audit proposal rejections in the gateway (#4281)
ericcurtin Oct 13, 2026
5e414ea
test(e2e): remove stale policy retries (#4453)
TaylorMutch Oct 13, 2026
2ffc3d2
ci: require accepted issues for community pull requests (#4340)
elezar Oct 13, 2026
cf6ec17
refactor(vm): source runtime pins only from pins.env (#4373)
benoitf Oct 13, 2026
a9a635a
fix(release): qualify prerelease tag pushes (#4335)
SDAChess Oct 13, 2026
8c67c27
test(oci): add a shared Docker and Podman suite for image USER and WO…
matthewgrossman Oct 13, 2026
fe743a3
fix(kubernetes): time out kube requests per request instead of per id…
matthewgrossman Oct 13, 2026
c608c13
fix(prover): distinguish sibling endpoints and fail closed on solver …
alangou Oct 13, 2026
ea74f2b
fix(vm): bind cached registry images to verified manifest digests (#4…
alangou Oct 13, 2026
db94c17
test(podman): run the e2e binaries that pass in the tmachine guest (#…
politerealism Oct 13, 2026
fd95354
refactor(prover): remove legacy unused reachability constraints (#2441)
eviehoward Oct 13, 2026
6a6401b
fix(cli): backpressure sandbox uploads (#4448)
shiju-nv Oct 13, 2026
dfb0f4f
ci(security): temporarily remove Codex from release scans (#4469)
alangou Oct 13, 2026
fce4e5a
fix(sandbox): release broker-owned listening sockets (#4444)
johntmyers Oct 13, 2026
0b1f6f8
feat(providers): add CLI label creation and filtering (#4265)
johntmyers Oct 13, 2026
0d4d22e
refactor(prover): separate outcome evaluation from rendering (#2632)
eviehoward Oct 13, 2026
b9dc1f6
fix(sdk-ts): preserve rpc errors for out-of-range responses (#4495)
SDAChess Oct 13, 2026
d3e6a35
ci(compatibility): review PR breaks and acknowledge release risks (#4…
SDAChess Oct 13, 2026
5a7728c
fix(ci): skip maintainer approval in merge queue (#4496)
purp Oct 13, 2026
2f6c691
fix(core): retry transiently busy e2fsprogs probes (#4315)
grs Oct 13, 2026
82977e2
fix(otel): enable gzip and https OTLP export (#4399)
ericcurtin Oct 13, 2026
90161fb
feat(kubernetes): add operator allowlists for sandbox pod annotations…
matthewgrossman Oct 13, 2026
a2f0520
docs(rfc): propose sandbox service exposure architecture (#4267)
drew Oct 13, 2026
e30c938
feat(server): scope mutation locks and bound lock waits (#4147)
EmilienM Oct 13, 2026
b4baf23
fix(compute): allow stopping errored sandboxes for recovery (#4231)
shiju-nv Oct 13, 2026
58fdb40
docs(sandboxes): add IPv6 loopback example to Port Forwarding (#2449)
andrewwhitecdw Oct 13, 2026
39b13d1
docs(cli): document sandbox create size limits (#4447)
ericcurtin Oct 13, 2026
6e69360
refactor(runtime): extract portable driver and isolation foundations …
drew Oct 14, 2026
fc0e9db
ci: replace stale issue exemptions with explicit frozen labels (#4534)
elezar Oct 14, 2026
d3bb266
docs(triage): add triage duty tooling (#3082)
elezar Oct 14, 2026
1d8101d
fix(sandbox): report the real seccomp probe launcher error (#4051)
russellb Oct 14, 2026
42e0d00
fix(supervisor): rename OCSF log files from `.log` to `.jsonl` (#4263)
matthewgrossman Oct 14, 2026
3f66c26
fix(helm): render Restricted-compatible security contexts (#3340)
lunarwhite Oct 14, 2026
7225bae
test(oci): cover default and policy identities in the oci-image suite…
matthewgrossman Oct 14, 2026
8b774e2
fix(driver-kubernetes): wait for operator namespace listing before wo…
mrunalp Oct 14, 2026
64c5bcd
fix(build): honor PROTOC when generating protobuf code (#4441)
politerealism Oct 14, 2026
f739283
fix(deps): scope rcgen's x509-parser feature to the supervisor (#4468)
politerealism Oct 14, 2026
4d9a1d2
chore(deps): bump github/codeql-action/upload-sarif (#4552)
dependabot[bot] Oct 14, 2026
36ee06f
fix(rpm): build the Python SDK from older protoc and install every SD…
politerealism Oct 14, 2026
07fd238
feat(server): export gateway OCSF events as OTLP log records (#4500)
krishicks Oct 14, 2026
91385f4
test(sandbox): isolate Landlock descriptor-limit regression (#4457)
grs Oct 14, 2026
6dbe4ad
feat(supervisor): export OCSF events as OTLP log records (#4545)
krishicks Oct 14, 2026
2f415e4
chore(deps): bump actions/attest from 4.2.1 to 4.2.2 (#2625)
dependabot[bot] Oct 14, 2026
68b1082
chore(deps): bump github/codeql-action/init from 4.37.7 to 4.37.9 (#3…
dependabot[bot] Oct 14, 2026
e28321b
fix(deps): bump rustls to 0.23.46 for RUSTSEC-2026-0346..0349 (#4568)
matthewgrossman Oct 14, 2026
d20c090
docs(observability): add observability overview and traces pages (#4560)
krishicks Oct 14, 2026
4dd6151
test(cli): retry forward tests when another process takes the port (#…
matthewgrossman Oct 14, 2026
909f336
fix(kubernetes): validate runtime control mount paths (#4522)
johntmyers Oct 14, 2026
6ab87ce
docs(readme): remove grpcurl walkthrough (#4585)
drew Oct 15, 2026
ef718a4
fix(vm): harden guest sandbox startup (#4539)
alangou Oct 15, 2026
8a67c46
test(tmachine): pin k3s to Kubernetes 1.29 (#4463)
SDAChess Oct 15, 2026
10c6319
ci(compatibility): require explicit risk acceptance (#4595)
SDAChess Oct 15, 2026
2c8f30f
ci: install Determinate Nix in shared setup action (#4593)
SDAChess Oct 15, 2026
59ddef6
feat(tmachine): build local Debian artifacts (#4598)
elezar Oct 15, 2026
05050a6
refactor(ci): extract release qualification and serialize Codex revie…
SDAChess Oct 15, 2026
c06ba10
ci: disable Determinate Nix job summaries (#4601)
SDAChess Oct 15, 2026
2804f68
fix(server): send Accept json on OAuth token refresh (#4530)
ericcurtin Oct 15, 2026
c3ca45f
ci(release): notify Slack when a prerelease succeeds (#4605)
matthewgrossman Oct 15, 2026
2538844
ci(release): decouple prerelease publication from qualification (#4420)
SDAChess Oct 15, 2026
c5519ea
fix(network): bind hostname policy to supervisor DNS (#4602)
alangou Oct 15, 2026
01087a4
fix(sandbox): distinguish descriptor lookup outcomes (#4494)
johntmyers Oct 15, 2026
29a2b8e
feat(providers): report bounded token-grant failures (#4427)
shiju-nv Oct 15, 2026
6546691
docs(kubernetes): document managed workspaces setup (#4622)
drew Oct 15, 2026
10241ab
fix(podman): trust an operator-supplied additional CA for direct egre…
politerealism Oct 15, 2026
44c07da
feat(helm): make gateway PVC size and StorageClass configurable (#3854)
lunarwhite Oct 15, 2026
b2069a2
feat(docker): support host and bridge supervisor networking (#4016)
drew Oct 16, 2026
5add9df
feat(sdk/go)!: replace positional labels with functional Create optio…
rhuss Oct 16, 2026
a4c848a
feat(vm): add host bind mount support via virtiofs (libkrun) (#3463)
benoitf Oct 16, 2026
9c6867c
feat(auth): emit OCSF events for credential-less gateway requests (#4…
krishicks Oct 16, 2026
b8526eb
fix(server): install the metrics recorder before startup reconciliati…
EmilienM Oct 16, 2026
8fcba28
feat(cli): add --annotation to sandbox create (#4325)
ericcurtin Oct 16, 2026
a2982bf
fix(ci): restore default e2e coverage with a Kubernetes recovery waiv…
elezar Oct 16, 2026
633cc6d
perf(server): drop async_trait from mutation replay and supervisor ga…
matthewgrossman Oct 16, 2026
77929d9
feat(sandbox): publish and activate sandbox backend protocol (#3898)
drew Oct 16, 2026
35a3390
feat(auth): classify rejected gateway credentials in authentication e…
krishicks Oct 16, 2026
41c518f
fix(agents): validate sandbox names before Gator launch setup (#4660)
TaylorMutch Oct 16, 2026
604b9f6
feat(config): deliver gateway configuration over the supervisor sessi…
pimlock Oct 16, 2026
744b889
fix(ci): paginate required gate job lookups (#4663)
pimlock Oct 16, 2026
f41f24b
feat(auth): record peer address and request ID on authentication even…
krishicks Oct 16, 2026
fdfbf84
fix(ocsf): report the required device.os.type_id (#4677)
krishicks Oct 17, 2026
b58e24c
fix(supervisor): report plaintext scheme to middleware (#4397)
ericcurtin Oct 17, 2026
55bf786
feat(tmachine): build local RPM artifacts (#4651)
elezar Oct 17, 2026
b1cfc91
ci(release): promote qualified prereleases to stable (#4611)
SDAChess Oct 19, 2026
b4cf1dd
chore(deps): accept build-only zip advisories (#4710)
SDAChess Oct 19, 2026
1a5220c
fix(deps): update setuptools to 83.0.0 (#4711)
SDAChess Oct 19, 2026
740c8fe
fix(deps): patch TypeScript test dependencies (#4712)
SDAChess Oct 19, 2026
0bfa1e8
fix(deps): update pytest to 9.0.3 (#4713)
SDAChess Oct 19, 2026
c38e279
ci(release): list failed jobs in pre-release failure notices (#4719)
matthewgrossman Oct 19, 2026
834b14f
ci(helm): retry chart pushes when GHCR briefly misses a new manifest …
matthewgrossman Oct 19, 2026
1cb9ef8
refactor(crypto): introduce a generic interface for crypto libraries …
varshaprasad96 Oct 19, 2026
50b7fcd
ci(release): generate PR-based stable release notes (#4654)
drew Oct 19, 2026
b01dd62
fix(server): warn on dangling provider refs at startup (#4661)
ericcurtin Oct 19, 2026
2798108
fix(ocsf): report https scheme for TLS-terminated requests (#4684)
ericcurtin Oct 19, 2026
d2a3508
fix(server): reject reserved annotation keys (#4626)
ericcurtin Oct 19, 2026
d4ad1bb
fix(snap): only enable gateway user service for one user (#4615)
olivercalder Oct 20, 2026
7417f75
fix(ci): wait for controller reconciliation before Kubernetes conform…
pimlock Oct 20, 2026
292c9c8
fix(vm): flush guest filesystem before a planned sandbox stop (#4195)
shiju-nv Oct 20, 2026
d97709f
chore(deps): update Mermaid lint dependencies (#4743)
SDAChess Oct 20, 2026
bdb956f
fix(ci): grant prerelease publish pull request read permission (#4747)
SDAChess Oct 20, 2026
30492bc
fix(deps): update russh to 0.64.1 (#4742)
SDAChess Oct 20, 2026
92f3a41
ci: update setup-buildx action to v4.4.1 (#4741)
SDAChess Oct 20, 2026
a24340b
feat(auth): emit OCSF events for gateway authorization denials (#4728)
krishicks Oct 20, 2026
a476b09
Merge remote-tracking branch 'upstream-tmp/main' into feat/python-sdk
letv1nnn Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
47 changes: 47 additions & 0 deletions .agents/skills/apply-triage-action/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
name: apply-triage-action
description: Apply, reject, or defer exactly one issue or CI recommendation from a local triage queue report. Use when the on-duty engineer explicitly supplies an item ID.
metadata:
internal: true
---

# Apply Triage Action

Process exactly one item ID from a queue-review report. Do not accept a natural-language approval without an ID. PRs are informational in v1.

## Locate and validate

1. Read the checkpoint and action records under `.agents/triage-duty/`; reconcile dispositions using the [local-state rules](../review-triage-queue/SKILL.md#local-state).
2. Use the named report, or the latest report containing the ID. Read the recommendation and current disposition. Material changes to a previously selected recommendation require fresh review and selection.
3. Reject missing, superseded, already-final, or ambiguous recommendations without making a write. Never substitute another item.
4. Append every explicit disposition or attempted action to a dated local action record. Record repository, target, source report, ID, timestamp, disposition, reason, confirmed payload, and outcome; update the checkpoint afterward. Keep sensitive content out of the record; use `private reason withheld` for private reasons.

## Reject or defer

For **reject** or **defer**, require the engineer to give a reason. Record the local disposition.

- **Reject** is terminal locally. Do not recommend the item again unless material new evidence changes the case.
- **Defer** is non-terminal. Preserve its original priority and carry it into the next review's carried **Needs your decision** section.

For shareable deferrals, draft a GitHub issue comment with reason, public links, and next step, or link existing waiting context. Use the confirmation rule below; declined posting leaves a local-only deferral. Keep private reasons out of external payloads and committable files. For missing reporter evidence, also propose the awaiting-information assessment state using `triage-issue`; unrelated dependency waits do not change lifecycle labels.

## Apply

Before any external write, re-read the target and determine whether it materially changed. Follow [Label Discovery](../../../CONTRIBUTING.md#label-discovery), retrieving all pages of current definitions before proposing a label change; use [`triage-issue`](../triage-issue/SKILL.md) for assessment states and maintainer authority.

- If the action is already complete or would be a harmless no-op, make no external write and record the reason.
- If new information makes the action unsafe or substantially different, stop and request a fresh review/selection.

You MUST ALWAYS preview the exact payload, item ID, source report, and canonical target, then receive explicit confirmation for each individual external write. Selecting or deferring an item is not confirmation; comments, label changes, and closures require separate confirmations. Revalidate immediately before execution; changed payloads require a new preview and confirmation. Never reuse confirmation for a later invocation.

After confirmation, perform only the approved action and record its outcome and public URL; mark applied only after success.

Supported v1 actions:

- Add the discovered triage-queue label to an open substantive community issue; recheck the [intake eligibility rules](../review-triage-queue/SKILL.md#gather-intake) and exclude duplicates, spam, and security disclosures.
- Create one GitHub issue using [`create-github-issue`](../create-github-issue/SKILL.md).
- Post one public issue comment, including waiting context or a duplicate explanation.
- Change an issue's assessment state to awaiting information.
- Close one issue with an evidenced reason; identify the canonical issue for duplicates.

Never create a public GitHub issue for a security finding. Follow [SECURITY.md](../../../SECURITY.md).
4 changes: 3 additions & 1 deletion .agents/skills/build-from-issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ Use a single issue comment beginning with `> **🏗️ build-plan**` when a plan
1. Check the current branch and working tree. Preserve unrelated work. Create an issue-specific branch or worktree as needed, following Branch Names in `CONTRIBUTING.md`.
2. Implement the smallest coherent change that fulfills the acceptance criteria. Update relevant skills when behavior or commands change. Keep published documentation minimal: explain exactly what users need, avoid duplication across pages, and omit internal details with no user impact.
3. Add meaningful tests for changed behavior and follow the verification guidance in `CONTRIBUTING.md`. Select format, lint, compile or type checks, and tests for affected components and their dependencies. Run the relevant E2E lane for infrastructure, sandbox, or policy changes. Guidance and template edits need applicable Markdown, YAML, link, and consistency checks. Do not require full Rust, SDK, or repository CI solely because a commit or PR is being created; broaden checks only for a concrete remaining risk or failed check.
4. Review the diff, use a signed-off Conventional Commit, and prepare a PR following `create-github-pr`.
4. Before pushing, apply the contributor access and issue acceptance check in `create-github-pr`. If blocked, preserve local work and report the reason. Review the diff, use a signed-off Conventional Commit, and prepare the PR.

Every PR from this issue-backed workflow must have its own existing issue and use `Closes #<id>` in its Related Issue section. For work needing multiple PRs, split the scope into a closable issue per PR. A high-level issue may track those issues but should not be closed by an incomplete PR. Report the implementation, verification, and any remaining limitation in the PR description, rather than copying earlier issue diagnostics.

Do not apply acceptance or roadmap decisions on behalf of a maintainer. Do not introduce `agent:*` workflow labels.

For first-party security-sensitive crypto, use `openshell-crypto` and extend its facade/backend contracts when needed. Follow the [crypto architecture](../../../crates/openshell-crypto/CRYPTO.md) for compatibility, failure handling, and explicit coverage exceptions.
12 changes: 12 additions & 0 deletions .agents/skills/build-openshell-mxc-windows/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,18 @@ Windows MSVC for the supported deliverables:
It intentionally does not make Windows a Docker, Kubernetes, Podman, or VM
runtime host.

The supervisor and supervisor-process libraries participate in native Windows
checks and tests. Their gateway session, boundary attachment, and TCP readiness
are portable; only the optional Unix SSH/readiness socket adapters are gated.
This is compile and control-plane coverage, not Windows isolation qualification.
Preserve readiness gating on authenticated gateway acceptance and reconnection.
The supervisor process-access multiplexer consumes boundary-provided streams;
do not restore local PID, PTY, or process-group operations there. Native process
mechanics belong to the sandbox or isolation backend. Keep the optional Unix
SSH access adapter separate from portable session orchestration.
Shared Sandbox Protocol audit validation defaults to strict Linux evidence;
concrete platform validators must be selected by the implementing backend.

## Current Repository Shape

The Windows build lane is implemented by these tracked files:
Expand Down
6 changes: 4 additions & 2 deletions .agents/skills/build-openshell-mxc-windows/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,6 @@ top-level workspace targets for check/test:
--exclude openshell-driver-vault
--exclude openshell-driver-vm
--exclude openshell-sandbox
--exclude openshell-supervisor
--exclude openshell-supervisor-process
--exclude openshell-vfio
```

Expand All @@ -124,6 +122,10 @@ egress proxy. The Kubernetes Secrets and Vault libraries still compile as
gateway dependencies; only their standalone Unix-socket binaries and
package-level tests are excluded as top-level targets.

The supervisor and supervisor-process packages now participate as top-level
native check/test targets. Their portable session, attachment, and TCP readiness
coverage does not enable a Windows isolation runtime.

## Common Errors

### Unix imports leak into Windows builds
Expand Down
32 changes: 32 additions & 0 deletions .agents/skills/create-github-pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,26 @@ Create pull requests on GitHub using the `gh` CLI.

## Before Creating a PR

### Verify Contributor Access and Issue Acceptance

Before pushing or creating a PR (including a draft), verify the author's access
to the target repository, not their fork. For the authenticated `gh` user:

```bash
gh repo view OWNER/REPO --json nameWithOwner,viewerPermission
gh issue view ISSUE_NUMBER --repo OWNER/REPO --json number,url,labels
```

Authors with verified `WRITE`, `MAINTAIN`, or `ADMIN` access may proceed without
`state:accepted`; keep the issue link and note the missing label. Everyone else
must link at least one target-repository issue and have `state:accepted` on each.
Otherwise, preserve local work and report which issue needs acceptance. A direct
request, roadmap placement, other labels, or vouch status does not bypass this gate.

When acting for another author, verify their permissions. Resolve failed lookups
before proceeding; retry sandbox network failures outside the sandbox before
reporting an authentication problem. Vouch requirements still apply separately.

### Check Config Documentation

If the branch changes gateway TOML parsing, `[openshell.gateway]` fields,
Expand Down Expand Up @@ -156,6 +176,9 @@ PR descriptions must follow the project's [PR template](.github/PULL_REQUEST_TEM
## Changes
<!-- Bullet list of key changes -->

## Release Notes
<!-- Optional: a few short, easy-to-read sentences about the user-facing change -->

## Testing
<!-- What testing was done? -->
- [ ] Checks appropriate to the affected code and behavior pass
Expand All @@ -168,6 +191,8 @@ PR descriptions must follow the project's [PR template](.github/PULL_REQUEST_TEM
```

Populate the testing checklist based on what was actually run. Check boxes for steps that were completed.
Keep the Release Notes section concise, with only a few easy-to-read sentences.
Leave it empty when the summary already captures the user-facing change.

## Example PR (Complete)

Expand All @@ -189,6 +214,10 @@ Closes #456
- Default page size is 100, max is 1,000
- Structured responses include `next_page_token`

## Release Notes

Sandbox list results can now be paged through with `--page-size` and `--page-token`.

## Testing

- [x] Relevant CLI format, lint, and unit checks pass
Expand Down Expand Up @@ -220,6 +249,9 @@ EOF

The command outputs the PR URL and number.

Rerun `PR Issue Acceptance` after linked issue labels change; it does not refresh
automatically on issue-label events.

**Display the URL using markdown link syntax** so it's easily clickable:

```
Expand Down
2 changes: 2 additions & 0 deletions .agents/skills/fix-security-issue/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ Use this skill after an authorized `review-security-issue` review identifies an
5. Follow `create-github-pr` and use `Closes #<id>` for the reviewed issue. Every PR from this issue-backed remediation workflow must close its own issue; split multi-PR remediations into separate issues in the authorized security workflow. Keep the PR description appropriately scoped to its disclosure venue.

Begin any fix comments with `> **🔧 security-fix-agent**`. Do not change human disposition or introduce `agent:*` workflow labels.

For first-party security-sensitive crypto, use `openshell-crypto` and extend its facade/backend contracts when needed. Follow the [crypto architecture](../../../crates/openshell-crypto/CRYPTO.md) for compatibility, failure handling, and explicit coverage exceptions.
46 changes: 28 additions & 18 deletions .agents/skills/launch-openshell-gator/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ gateway_name="<selected-gateway-name>"
openshell --gateway "$gateway_name" sandbox list
```

Look for names like `gator-pr-<number>-supervised`. If one exists, inspect its log before deleting or relaunching.
Look for names like `gtr-pr-<number>-watch`. If one exists, inspect its log before deleting or relaunching.

## Input Normalization

Expand All @@ -129,11 +129,14 @@ pr_number="<digits-only>"
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
```

Use the portable Kubernetes DNS-1123 sandbox-name format even when the selected gateway currently uses another driver:
Sandbox names must be DNS-1123 labels of at most **19 characters**, including
any suffix. The gateway reserves room for workspace, sandbox, and service
segments in one DNS label; this limit applies to every compute driver. Use
short names and validate them before launching:

```bash
sandbox_name="gator-pr-${pr_number}-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-watch"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
```

For local image contexts passed to `--from`, use an agent-created path such as `mktemp -d`; do not pass raw user-supplied paths without validating that they are expected local Dockerfile contexts.
Expand All @@ -149,8 +152,8 @@ gateway_name="<selected-gateway-name>"
pr_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
sandbox_name="gator-pr-${pr_number}-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-watch"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

./scripts/agents/run.sh \
--agent gator \
Expand All @@ -171,8 +174,8 @@ gateway_name="<selected-gateway-name>"
issue_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$issue_number" =~ ^[0-9]+$ ]] || { echo "invalid issue number" >&2; exit 1; }
sandbox_name="gator-issue-${issue_number}-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-i-${issue_number}-watch"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

./scripts/agents/run.sh \
--agent gator \
Expand All @@ -191,8 +194,8 @@ issue_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
[[ "$issue_number" =~ ^[0-9]+$ ]] || { echo "invalid issue number" >&2; exit 1; }
sandbox_name="gator-pr-${pr_number}-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-watch"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

./scripts/agents/run.sh \
--agent gator \
Expand All @@ -211,8 +214,8 @@ gateway_name="<selected-gateway-name>"
pr_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
sandbox_name="gator-pr-${pr_number}-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-watch"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

./scripts/agents/run.sh \
--agent gator \
Expand All @@ -231,8 +234,8 @@ gateway_name="<selected-gateway-name>"
pr_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
sandbox_name="gator-pr-${pr_number}-gpt56sol-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-exp"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

CODEX_MODEL=gpt-5.6-sol \
./scripts/agents/run.sh \
Expand All @@ -244,6 +247,8 @@ CODEX_MODEL=gpt-5.6-sol \
```

If the installed Codex CLI is too old for a model, create a temporary copy of `scripts/agents/gator/`, adjust only that temporary Dockerfile, and launch with that generated context. Keep the repo Dockerfile unchanged unless the version bump is the intended code change.
The short `-exp` suffix below identifies an experimental watcher; keep its full
name within 19 characters.

Example shape:

Expand All @@ -252,8 +257,8 @@ gateway_name="<selected-gateway-name>"
pr_number="<digits-only>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$pr_number" =~ ^[0-9]+$ ]] || { echo "invalid PR number" >&2; exit 1; }
sandbox_name="gator-pr-${pr_number}-gpt56sol-supervised"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
sandbox_name="gtr-pr-${pr_number}-exp"
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
tmp_context="$(mktemp -d "${TMPDIR:-/tmp}/gator-codex-XXXXXX")"
cp -R scripts/agents/gator/. "$tmp_context"/

Expand Down Expand Up @@ -286,14 +291,19 @@ The launcher streams image-build and provisioning output to the terminal. Import
size-limited full-diff endpoint. An unavailable patch ID alone does not block
the ledger; it disables rebase-equivalence shortcuts. Reviewers should inspect
oversized changes file-by-file locally.
- Security regressions introduced or newly exposed by an unmerged PR belong
in its normal review findings. Private follow-up under `SECURITY.md` is for
pre-existing vulnerabilities independent of the PR; security classification
alone is not a private-triage or test-dispatch gate. Gator must not initiate
external security reporting without explicit operator authorization.

### Inspect Active Sandboxes

```bash
gateway_name="<selected-gateway-name>"
sandbox_name="<safe-sandbox-name>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

openshell --gateway "$gateway_name" sandbox list
openshell --gateway "$gateway_name" sandbox get "$sandbox_name"
Expand Down Expand Up @@ -333,7 +343,7 @@ Before deleting, check that the sandbox is truly stale or that the operator aske
gateway_name="<selected-gateway-name>"
sandbox_name="<safe-sandbox-name>"
[[ "$gateway_name" =~ ^[A-Za-z0-9_.-]+$ ]] || { echo "invalid gateway name" >&2; exit 1; }
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }
[[ "$sandbox_name" =~ ^[a-z0-9]([a-z0-9-]{0,17}[a-z0-9])?$ ]] || { echo "invalid sandbox name" >&2; exit 1; }

openshell --gateway "$gateway_name" sandbox delete "$sandbox_name"
./scripts/agents/run.sh \
Expand Down
Loading