Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGESET.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Newest first. Each entry names the upstream range brought in.

### Fork maintenance and CI

- **#349** Record the 2026-10-23 source-pinned native release `v1.18.32-swxtch.774d90c7` carrying the V2 env-config and egress default-model fix (#347) for Abbe B-16.10, with its native arm64/x64 acceptance, focused tests, downloaded-byte verification, Abbe/SaaS wake-log delivery and committed raw evidence. See `RELEASE-CUT-3-EVIDENCE.md`. _Fork-only._
- **#345** Record the 2026-10-22 source-pinned native release carrying independently configured small models (#338, #342), its new native acceptance, focused tests and downloaded-byte verification, and committed raw evidence. SaaS delivery is confirmed; the Abbe artifact handoff is delivered and durable via firstmate, while the direct task wake-log append is firstmate-owned pending with no direct Abbe receipt claimed. See `RELEASE-CUT-2-EVIDENCE.md`. _Fork-only._
- **#329** Harden the fast-suite observer (swxtchio/swx-opencode#324): use Linux procfs/ptrace with Python 3 to capture the loaded interpreter identity and kernel-expanded argv at exec stops, preserving successful launches across temporary cwd cleanup and detecting scripts replaced or symlinks repointed after execution. Preserve job-control stops until SIGCONT using seized tracing and PTRACE_LISTEN. Share position- and value-aware Bun/Node option tables between the shim and audit, refusing unclassified options so values cannot masquerade as worker modes or scripts and user-code arguments cannot masquerade as test flags. Refuse the version-dependent bare Node config-file alias while retaining attached paths. Keep the declared-help check compatible with Node 24 per-alias/optional spellings and explicit refusal of future unclassified Node options; executable regressions bind actual runtime behavior. Refuse incomplete observation, invalidate unobserved Bun tests and Node `--test` launches, and refuse Bun `--bun` delegation even when its caller ignores failure. Correct optional inspector parsing and preserve child-tool flags. Pin non-build prerequisite admission and producer-derived wrong-owner Turbo plans before execution. Qualify public execution-set claims; see `docs/fast-suite-observer.md` and PR #329 for runtime evidence. _Fork-only._
- **#331** Record the 2026-10-21 published linux-x64 V2 admission/wait/native-history/restart/reconnect verification and explicit post-crash join-only/pending controls in an isolated full-system x64 guest, including raw producer evidence, SQLite backup and TCG/JIT qualifications. Hold Abbe cutover for the observed tool-locality mismatch (#1559), V2 replacement proof (#1556) and unestablished cohort inventory. See `docs/verification/native-history-2026-10-21/README.md`. _Fork-only._
Expand Down
51 changes: 51 additions & 0 deletions RELEASE-CUT-3-EVIDENCE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Release-cut execution evidence: 774d90c7

Recorded 2026-10-23 for task `opencode-release-cut-3` and [draft PR #349](https://github.com/swxtchio/swx-opencode/pull/349). This urgent cut ships [#347](https://github.com/swxtchio/swx-opencode/pull/347), the V2 env-supplied config and egress default-model fix, which Abbe B-16.10 (swxtchio/swx-abbe#1951) needs to restore DEV chat (swxtchio/swx-abbe#2030). Refs swxtchio/swx-opencode#338. The binary source is immutable `774d90c7fb02b9f0962620971630a4f09c1a886b`; the pickup identity and ancestry record is in `plans/release-cut-3.md`. `RELEASE-CUT-3-NOTES.md` is the complete published release body. No production or release/probe tooling was changed. Raw observations are under `docs/verification/release-cut-3/`.

## Pickup decisions

The task brief was retargeted from `opencode-release-cut-2` and still named that task's branch and wake log. Firstmate's ruling, recorded in `/home/byates/fm-llmrouter/data/opencode-release-cut-3/firstmate-decisions.md`, confirmed branch `fm/opencode-release-cut-3`, wake log `state/opencode-release-cut-3.wake-events` and one new draft PR. The same ruling granted VM14 write authority for `vm14-001:/home/byates/vm14-builds/opencode-release-774d90c7`, covering staging, install, cache, build, transport, test and proof of this source only. Work that needed no grant ran before the ruling: the x64 Actions dispatch, the ancestry checks and the focused tests. Firstmate's ruling confirmed that dispatch.

## Native x64 (GitHub Actions)

```sh
gh-axi workflow run opencode-arm-release-x64.yml -R swxtchio/swx-opencode --ref swxtch --field source_commit=774d90c7fb02b9f0962620971630a4f09c1a886b --field release_tag=v1.18.32-swxtch.774d90c7 --field version=1.18.32-swxtch.774d90c7 --field candidate=true
```

[Run 39983517672](https://github.com/swxtchio/swx-opencode/actions/runs/39983517672) succeeded. Its `release-candidate` job (120516656992) passed, and `release-proof` was skipped as intended for an unpublished candidate. Because the dispatch ref was `swxtch` at the release source, the harness revision equals the source revision. Provenance records `x86_64`, Bun `1.4.2`, the selected lockfile digest, catalog digest `713b2cb3…17d9`, clean source before and after, and no overlays. [Artifact 12515386562](https://github.com/swxtchio/swx-opencode/actions/runs/39983517672/artifacts/12515386562) has transport ZIP digest `d119880b…c3d46a` and expires on 2026-11-06. It was downloaded with `gh run download`, its companion passed locally, and local extraction reproduced the provenance's executable and sidecar digests.

## Native arm64 (vm14-001)

The lease README (convention v3) was read before admission. At pickup, `ACTIVE` was held by `opencode-v2-provider-1952`, then by fm-abbe `native-store-custody-1550`, whose owner process was live. The task paused and polled with atomic `mkdir`; `lease/acquire-attempts.log` records 53 refused attempts. Acquisition succeeded at 2026-10-23T16:35:05Z. `lease.json` names home `/home/byates/fm-llmrouter`, task `opencode-release-cut-3`, owner box `vm001` and owner PID `3106855`, which is this session's Claude process.

`supervise.sh` ran `arm-build.sh` under the granted root. It touched the lease heartbeat every 30 seconds while the build lived, then recorded result `0`. The script redirects HOME, XDG, Bun/npm cache and TMPDIR beneath the root. It then:

1. clones the fork and checks out the source detached;
2. checks the Bun pin and all ancestry;
3. runs the source's `release-probe-target.ts --candidate` with a synthetic dispatch event (it printed the expected tag, source, version and Bun `1.4.2`);
4. installs with `bun install --frozen-lockfile --os=linux --cpu=arm64`;
5. fetches and hashes the catalog, then builds with `OPENCODE_VERSION`, absolute `MODELS_DEV_API_JSON` and `OPENCODE_BUILD_DIST` using `build.ts --single --skip-install`;
6. packages exactly `opencode` and its sidecar, validates the companion, extracts and checks `--version`;
7. runs the source's unchanged `release-probe.ts arm64` on the extracted executable.

Source status was empty before the build, after install, after the build and after the probe. The run lasted from 16:35:18Z to 16:40:35Z.

A procfs scan of the task root, matching both command line and cwd, returned `remaining_processes: []`. `release-lease.sh /home/byates/fm-llmrouter opencode-release-cut-3` returned `released: lease matched`, and `ACTIVE` was then absent (16:41:03Z). The transport bundle's SHA-256 is `df16aae9…7e97067`, and it matched after the copy. The archive companion passed again after transport, and local extraction reproduced the executable and sidecar digests.

## Focused source tests

From `packages/opencode`, on the task's x64 host at the release source with Bun `1.4.2`, the `plans/small-model-verification.md` focused command passed 59 tests, with 632 filtered out and zero failures. From `packages/core`, #347's `test/config/config.test.ts`, `test/config/environment.test.ts`, `test/config/provider.test.ts` and `test/location-layer.test.ts` passed 28 tests with zero failures. No test was added or rewritten; these unchanged tests keep their existing roles.

## Publication and read-back

Before creating the release, the exact `swxtchio/swx-opencode` entry was confirmed in `/home/byates/fm-llmrouter/config/gh-repo-allowlist`, the remote tag was absent, and `release view` reported none. The release was created with `gh-axi release create v1.18.32-swxtch.774d90c7 -R swxtchio/swx-opencode --target 774d90c7fb02b9f0962620971630a4f09c1a886b --latest --notes-file RELEASE-CUT-3-NOTES.md`, attaching both validated archive/companion pairs.

The tag-specific and `/releases/latest` APIs both returned release `422085166` with the intended tag and name, `target_commitish` equal to the source, `draft: false`, `prerelease: false`, and the four assets with GitHub digests matching the archives. `git ls-remote` resolved the tag to the source. The published body is byte-identical to `RELEASE-CUT-3-NOTES.md`. All four assets were downloaded with `gh-axi release download`. Both companions passed, `cmp` found each archive identical to its native-tested candidate, and extraction reproduced both executable and sidecar digests.

## Delivery

The recipients were revalidated from current records. Abbe's B-16.10 task is `mvp-b16-10`: it is the live task with a current meta file in `/home/byates/fm-abbe/state/`, and `data/backlog.md` lists it against swxtchio/swx-abbe#1712. The historical lead `abbe-jail-swx-opencode-441` is not the current B-16.10 owner. SaaS's producer/image handoff task remains `opencode-arm-release`, recorded in `/home/byates/fm-saas/data/done-archive.md` with its retained brief.

At 2026-10-23T16:43:53Z, one verified notice line was appended with `>>` to `/home/byates/fm-abbe/state/mvp-b16-10.wake-events` (13 to 14 lines) and to `/home/byates/fm-saas/state/opencode-arm-release.wake-events` (2 to 3 lines). Read-back confirmed each file's last line equals the notice. The notice gives the release URL, version, source, the #347 reason, both archive URLs and SHA-256 values, both checksum URLs, and the native and published-byte results.

Supplemental peer notifications through `bin/fm-send.sh peer:<home> --no-reply` reached both homes. Their sender-owned outbox records are `p1792773840-2738195-53a3` (Abbe) and `p1792773849-2763976-1834` (SaaS), each `phase=sent`, `transport=terminal`, `message_kind=one-way`, `disposition=delivered-no-reply`. These receipts are separate from the required wake-log appends.
54 changes: 54 additions & 0 deletions RELEASE-CUT-3-NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# OpenCode fork binary release

Evidence collected 2026-10-23. This release exists to ship [#347](https://github.com/swxtchio/swx-opencode/pull/347), the V2 env-supplied config and egress default-model fix, which Abbe B-16.10 ([swxtchio/swx-abbe#1951](https://github.com/swxtchio/swx-abbe/issues/1951)) adopts to restore DEV chat ([swxtchio/swx-abbe#2030](https://github.com/swxtchio/swx-abbe/issues/2030)). It also carries, through source ancestry, [small-model independence #338](https://github.com/swxtchio/swx-opencode/issues/338) resolved by [#342](https://github.com/swxtchio/swx-opencode/pull/342), [output-limit continuation #325](https://github.com/swxtchio/swx-opencode/pull/325), [fast-suite observer hardening #329](https://github.com/swxtchio/swx-opencode/pull/329), and [published-native V2-history verification #331](https://github.com/swxtchio/swx-opencode/pull/331). Every one of these merge commits passed the required ancestry check against this release's captured source.

Functionality from earlier releases is inherited through source ancestry. The builds, focused tests and native acceptance observations below are new executions for this release. This producer release supplies the artifact for Abbe B-16.10; consumer image adoption, deployment and live-store migration remain downstream duties. The #331 distinction between completed-history restart durability and ambiguous in-flight recovery still applies.

## Release identity

- Tag: `v1.18.32-swxtch.774d90c7`.
- Immutable source: `774d90c7fb02b9f0962620971630a4f09c1a886b`, captured by `git fetch origin swxtch` at task pickup on 2026-10-23. Later evidence-branch commits are not binary inputs.
- Version: `1.18.32-swxtch.774d90c7`, printed by both extracted native candidates. This follows `local-release.sh`'s `<packages/opencode/package.json version>-swxtch.<source sha8>` convention, with `OPENCODE_VERSION` pinned for both builds.
- Required landed commits: #347 `774d90c7fb02b9f0962620971630a4f09c1a886b`; #342 `bce37c276f4070e3c9d343baa61ce5f35ca38dc9`; #329 `9340c4d4a88b3c9f1f5274e69e72bd8c631a5053`; #325 `05a4d4194ca4306ae9f11758f66e56d8fb1cf295`; #331 `cbfcad62a6fe04475dae23545c6296976f53fa5d`. Each passed `git merge-base --is-ancestor <commit> <source>`, both at pickup and in the VM14 source clone.
- Existing V2-wait ancestry requirement: `git merge-base --is-ancestor 4b87478ddf 774d90c7fb02b9f0962620971630a4f09c1a886b` passed. The selected source's `release-probe-target.ts --candidate` resolved the same tag, source, version and Bun on both builders.
- Both candidate source trees were unmodified and clean before installation and build, and again after the build and native probe.
- Actual Bun: `1.4.2` on both builders, matching the selected source's `packageManager`. Selected `bun.lock` SHA-256: `2c6631f22941c4367a66410ae866c07fa8d4d141798dfba728e46d4c3c400151`.

## Build provenance

| Target | Native builder and install | Build command | Actual supplied models.dev snapshot SHA-256 |
| --- | --- | --- | --- |
| linux/arm64 | `vm14-001`, Linux `aarch64`, Bun `linux-arm64`; frozen `--os=linux --cpu=arm64` install | `OPENCODE_VERSION=1.18.32-swxtch.774d90c7 bun run packages/opencode/script/build.ts --single --skip-install` | `dbddc622f4de27634523d8115d82c2d24d2b6660a6d197082cd19e1da91a1e64` |
| linux/x64 | GitHub Actions `ubuntu-latest`, Linux `x86_64`, Bun `linux-x64`; frozen `--os=linux --cpu=x64` install; [run 39983517672](https://github.com/swxtchio/swx-opencode/actions/runs/39983517672), [artifact 12515386562](https://github.com/swxtchio/swx-opencode/actions/runs/39983517672/artifacts/12515386562) | `OPENCODE_VERSION=1.18.32-swxtch.774d90c7 bun run packages/opencode/script/build.ts --single --skip-install` | `713b2cb37cbfe8881f52e9ce305e79226fbb95ad5ba1aba06e192e1ddf3917d9` |

Each builder fetched its own catalog snapshot, so the two snapshots have different digests. Each was consumed through an absolute `MODELS_DEV_API_JSON` selector and retained with its build logs. Build outputs went to task-isolated absolute `OPENCODE_BUILD_DIST` roots. Both release candidates were built from the clean selected source, without overlays or proof instrumentation. The x64 workflow was dispatched from `swxtch` at the release source, so its harness revision is `774d90c7fb02b9f0962620971630a4f09c1a886b`, separately recorded in the candidate provenance. The evidence branch is [draft PR #349](https://github.com/swxtchio/swx-opencode/pull/349). GitHub's Actions transport ZIP digest is `d119880bc50301f8c100b417c52e86080881915b3da672eda6cc6800e8c3d46a`, which is distinct from the release archive digest.

The VM14 build used firstmate's task-specific grant for this source, recorded in `/home/byates/fm-llmrouter/data/opencode-release-cut-3/firstmate-decisions.md`, with staging, install/cache, runtime, transport and proof isolated below `/home/byates/vm14-builds/opencode-release-774d90c7`. The lease convention was read before admitting the workload. The single atomic `ACTIVE` lease was acquired at 2026-10-23T16:35:05Z with owner/task metadata, and a heartbeat ran while the build lived. The final task-process scan found no remaining processes, and `release-lease.sh` confirmed the owner-matched release at 16:41:03Z.

## Release assets

| Target | Archive | Archive SHA-256 | Archive bytes | Extracted executable SHA-256 | Actual FFF sidecar |
| --- | --- | --- | ---: | --- | --- |
| linux/arm64 | `opencode-linux-arm64.tar.gz` | `b76f22f3ef849717c773eb1502f21de211d32f134e491bbbfd370a75740d9434` | 64243974 | `74f1e72900f83ca13fc70a20bb24a2d7ca248ea155230012d053ad0ac4436e3f` | `libfff_c-0459657eb78fc6a73a358105f2a6ed06aa9920b28bbe83f2d7ff7b72eae2be42.so` |
| linux/x64 | `opencode-linux-x64.tar.gz` | `fc9cce6c1e649f72aa2d6af0de04e9dfe962b27361c3d71fa79e07ba5cca49b8` | 64714546 | `20f3ed62b6d919a5b241212485c2e4ded6c58f8a3e9f4b0e66eca70d396994f9` | `libfff_c-977a96fc9911edd8cabacb098e90229c6a2dde7384f3291e5beccaf1ee93fef5.so` |

Actual packaged sidecar SHA-256: ARM64 `0459657eb78fc6a73a358105f2a6ed06aa9920b28bbe83f2d7ff7b72eae2be42`; x64 `977a96fc9911edd8cabacb098e90229c6a2dde7384f3291e5beccaf1ee93fef5`. Each archive contains exactly `opencode` and its matching named sidecar. Companion assets are `opencode-linux-arm64.tar.gz.sha256` and `opencode-linux-x64.tar.gz.sha256`. Both companions validated against their archives on the native builders and again after transport to the task worktree.

## Runtime verification

- Both exact packaged candidates were extracted and executed on their matching native builders. Each printed `1.18.32-swxtch.774d90c7`. The packaged FFF sidecar loaded, and `debug file search needle-target` returned `src/nested/needle-target.ts`.
- The unchanged controlled-provider native HTTP acceptance probe established `idle`, admit-only `pending`, `completed`, terminal-tool `failed`, and `interrupted` on both architectures. The completed wait stayed unresolved while the local Bash tool was independently held, and again while the required final provider continuation was independently held, under one producer wait registration.
- Producer-emitted `session.wait.registered` and `session.wait.resolved` observations bind the same wait ID, session, admitted message and sequence to each held wait and its terminal outcome. Every terminal case below used admitted sequence `1`. The full native JSON and raw server logs were retained.
- Restart on each builder's same isolated absolute `OPENCODE_DB` preserved the completed user/assistant identities. Exclusive replay after admission sequence `1` returned identical durable event IDs in strictly increasing sequence order `2` through `12`, with no additional page. Completed user/assistant identities: ARM64 `msg_169a2a263001KUrN957oulQLQS` / `msg_169a2a451001PvixpHTvki9sXV`; x64 `msg_1698a547e001d4gzHmFQr2i3gn` / `msg_1698a59eb001itm5ptTQ0jwpe8`.
- On each builder, two absolute `OPENCODE_DB` selectors over a conflicting `XDG_DATA_HOME` opened distinct physical SQLite stores using `db path` and `db 'SELECT 1'`. The conflicting root contained no database, and the unset selector matched the `latest` channel default. ARM64 stores had device/inode `64770/1076028` and `64770/1076700`; x64 stores had `66305/9986215` and `66305/9986221`.
- Each native probe recorded two completed-case provider requests, two failed-case requests and one interrupted request, with zero title calls.
- Source-owned focused tests were rerun at this exact source with Bun `1.4.2`, on the task's x64 development host rather than the native builders. The carried V1 small-model controlled-boundary command from `plans/small-model-verification.md` passed **59 tests with zero failures** across the provider, config, V2-compatibility, prompt, compaction, session and HTTP-session boundaries. #347's own `packages/core` config tests (`config`, `environment`, `provider`, `location-layer`) passed **28 tests with zero failures**. These are source-test runs, separate from the packaged native V2 battery. No new production or release/probe behavior was authored for this release.

| Native target and terminal outcome | Session ID | Admitted message ID | Producer wait ID |
| --- | --- | --- | --- |
| ARM64 completed | `ses_e965d5da8ffeJSmrf2hiUl2pV9` | `msg_169a2a263001KUrN957oulQLQS` | `acb6a28b-c5d9-440b-8de5-a92b3ee5be84` |
| ARM64 failed | `ses_e965d5251ffeoaeH2orFIIhEaq` | `msg_169a2adcb0013kReW12hBD39sI` | `f5e153e2-b1d2-4f7b-a6c8-9b2a0fc3b6e0` |
| ARM64 interrupted | `ses_e965d49d8ffeH0xPqfBw6dsbIw` | `msg_169a2b636001SWK3mvZYBuelmF` | `d8800283-8c33-4ff4-afc6-6bdbd6a62961` |
| x64 completed | `ses_e9675ab95ffeasi7O3DEcx9UwF` | `msg_1698a547e001d4gzHmFQr2i3gn` | `12353483-a943-45d4-a2b1-a1e53cc555dd` |
| x64 failed | `ses_e96759d55ffefz2tAgTi0TPK09` | `msg_1698a62b9001sDIDIQNOoHTGO2` | `1c46f0e1-661d-4f8f-bb38-eb1a8d445a64` |
| x64 interrupted | `ses_e9675949dffeJNs78cdZCD8bcx` | `msg_1698a6b6e001QFwa40MYXk4v1W` | `32e7ab15-2be0-46ab-a057-17caefed4611` |
Loading
Loading