CI — WASM: getrandom needs the wasm_js backend for wasm32-unknown-unknown #11

Closed
opened 2026-09-04 19:14:05 +00:00 by fabi · 6 comments
Owner

The WASM — Web job fails at cargo check --target wasm32-unknown-unknown:

error: The wasm32-unknown-unknown targets are not supported by default;
       you may need to enable the "wasm_js" configuration flag.
  --> getrandom-0.3.4/src/backends.rs:194:17
error: could not compile `getrandom` (lib) due to 1 previous error

Pre-existing and unrelated to any current PR — main fails identically. getrandom 0.3 removed the implicit wasm fallback: it needs both --cfg getrandom_backend="wasm_js" in RUSTFLAGS and the wasm_js feature enabled on the crate, and the feature alone is explicitly not enough.

Pass: cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats clean, and trunk build --release producing a dist/.
Fail: a workflow edit that stops the job running. The check is correct; the build is broken.

⚠️ A second break is waiting behind this one. jetli/trunk-action downloads trunk-x86_64-unknown-linux-gnu.tar.gz, and the runner is aarch64. It has never been reached because the check above fails first, and it will bite the moment this is fixed. Fix both in one go or the next run just moves the red one step to the right.

The `WASM — Web` job fails at `cargo check --target wasm32-unknown-unknown`: ``` error: The wasm32-unknown-unknown targets are not supported by default; you may need to enable the "wasm_js" configuration flag. --> getrandom-0.3.4/src/backends.rs:194:17 error: could not compile `getrandom` (lib) due to 1 previous error ``` Pre-existing and unrelated to any current PR — `main` fails identically. getrandom 0.3 removed the implicit wasm fallback: it needs **both** `--cfg getrandom_backend="wasm_js"` in RUSTFLAGS **and** the `wasm_js` feature enabled on the crate, and the feature alone is explicitly not enough. **Pass:** `cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats` clean, and `trunk build --release` producing a `dist/`. **Fail:** a workflow edit that stops the job running. The check is correct; the build is broken. ⚠️ **A second break is waiting behind this one.** `jetli/trunk-action` downloads `trunk-x86_64-unknown-linux-gnu.tar.gz`, and the runner is **aarch64**. It has never been reached because the check above fails first, and it will bite the moment this is fixed. Fix both in one go or the next run just moves the red one step to the right.
fabi added this to the Infrastructure milestone 2026-09-04 19:14:05 +00:00
fabi added the kind/defectagent/portkind/itemstate/proposed labels 2026-09-04 19:14:05 +00:00
Author
Owner

Check WASM compile now exits 0. It was three blockers, not one.

ba6c5da, bundle /tmp/sylph-wasm-compile.bundle (base d8807c4, verifies clean). Each blocker was invisible until the one before it was gone — the same cascade shape as the clippy pass, where clearing sylpheed-formats revealed two crates that had never been linted.

error cause
1 The wasm32-unknown-unknown targets are not supported by default getrandom 0.3 needs --cfg getrandom_backend="wasm_js" and the wasm_js feature. Its own message says either alone is insufficient. Reached only through ahash, in sylpheed-viewer only.
2 This wasm target is unsupported by mio. sylpheed-formats declared tokio as a normal dependency it never used.
3 bevy_egui uses unstable APIs to support clipboard on web. needs --cfg web_sys_unstable_apis.

The middle one is a real defect, independent of WASM

Every tokio reference in sylpheed-formats/src/ is inside a mod tests — three runtime builders in ship.rs, one #[tokio::test] in xiso.rs — and tokio was already declared in [dev-dependencies]. The normal dependency was dead weight that pulled tokio/full, whose net feature drags in mio, which does not build for wasm32. Removing it is correct on its own terms; the WASM job is only what exposed it.

This is the one change here that is not CI configuration, and it is the one worth looking at rather than waving through.

Verified

wasm    cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats   exit 0
native  cargo check  --workspace                                                             exit 0
        cargo test   --workspace                                          exit 0, 207/0/14, 30 suites
        cargo clippy --workspace -- -D warnings                                              exit 0
        cargo fmt    --all -- --check                                          774 == baseline

Both cfgs are scoped to [target.wasm32-unknown-unknown], so native builds are untouched — the numbers above confirm it rather than assume it.

This does not make the job green, and the next failure is already identified

The two steps after this have never executed in this repository's history. Install Trunk uses jetli/trunk-action@v0.5.0, and its bundled dist/index.js contains:

x86_64-unknown-linux-gnu   1 occurrence
aarch64                    0 occurrences
os.arch()                  5 calls, with no mapping for it

On this aarch64 runner it will fetch an x86_64 binary. The asset it should be fetching does exist — upstream publishes trunk-aarch64-unknown-linux-gnu.tar.gz — so only the action's selection is wrong, which narrows my earlier claim: this is not "trunk is unavailable on arm", it is "this action cannot find it".

I stopped there deliberately. Replacing the install step means choosing a trunk version to pin and an install method, and after #15 that is exactly the sort of choice that should be a decision rather than something I slipped in. Two obvious shapes: a run: step fetching the aarch64 asset for $(uname -m) with a pinned version, or cargo install trunk at the cost of a long build.

Scope

#11 was written around the getrandom error alone. This goes past that shape, and one change touches a crate's dependencies rather than CI config. It is a bundle, not a push, and #11 remains state/proposed.

## `Check WASM compile` now exits 0. It was three blockers, not one. `ba6c5da`, bundle `/tmp/sylph-wasm-compile.bundle` (base `d8807c4`, verifies clean). Each blocker was invisible until the one before it was gone — the same cascade shape as the clippy pass, where clearing `sylpheed-formats` revealed two crates that had never been linted. | | error | cause | |---|---|---| | 1 | `The wasm32-unknown-unknown targets are not supported by default` | getrandom 0.3 needs `--cfg getrandom_backend="wasm_js"` **and** the `wasm_js` feature. Its own message says either alone is insufficient. Reached only through `ahash`, in `sylpheed-viewer` only. | | 2 | `This wasm target is unsupported by mio.` | `sylpheed-formats` declared `tokio` as a **normal dependency it never used**. | | 3 | `bevy_egui uses unstable APIs to support clipboard on web.` | needs `--cfg web_sys_unstable_apis`. | ### The middle one is a real defect, independent of WASM Every tokio reference in `sylpheed-formats/src/` is inside a `mod tests` — three runtime builders in `ship.rs`, one `#[tokio::test]` in `xiso.rs` — and **tokio was already declared in `[dev-dependencies]`**. The normal dependency was dead weight that pulled `tokio/full`, whose `net` feature drags in `mio`, which does not build for wasm32. Removing it is correct on its own terms; the WASM job is only what exposed it. **This is the one change here that is not CI configuration**, and it is the one worth looking at rather than waving through. ### Verified ``` wasm cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats exit 0 native cargo check --workspace exit 0 cargo test --workspace exit 0, 207/0/14, 30 suites cargo clippy --workspace -- -D warnings exit 0 cargo fmt --all -- --check 774 == baseline ``` Both cfgs are scoped to `[target.wasm32-unknown-unknown]`, so native builds are untouched — the numbers above confirm it rather than assume it. ### This does not make the job green, and the next failure is already identified The two steps after this have never executed in this repository's history. `Install Trunk` uses `jetli/trunk-action@v0.5.0`, and its bundled `dist/index.js` contains: ``` x86_64-unknown-linux-gnu 1 occurrence aarch64 0 occurrences os.arch() 5 calls, with no mapping for it ``` On this aarch64 runner it will fetch an x86_64 binary. **The asset it should be fetching does exist** — upstream publishes `trunk-aarch64-unknown-linux-gnu.tar.gz` — so only the action's selection is wrong, which narrows my earlier claim: this is not "trunk is unavailable on arm", it is "this action cannot find it". I stopped there deliberately. Replacing the install step means choosing a trunk version to pin and an install method, and after #15 that is exactly the sort of choice that should be a decision rather than something I slipped in. Two obvious shapes: a `run:` step fetching the aarch64 asset for `$(uname -m)` with a pinned version, or `cargo install trunk` at the cost of a long build. ### Scope #11 was written around the getrandom error alone. This goes past that shape, and one change touches a crate's dependencies rather than CI config. It is a bundle, not a push, and #11 remains `state/proposed`.
Author
Owner

ba6c5da25092f3, rebased onto 885b4d4

Answering the desktop session's five asks in order.

(a) Out of /tmp. Done first, before anything else. The bundle now lives in
/home/fabi/, alongside the five earlier ones — the established durable home on
this box, not a new invention.

(b) Rebased, and re-verified from scratch.
d8807c4..885b4d4 touches exactly one file (docs/agents/HANDOFF-2026-09-06.md,
+397, measured here, not quoted); ba6c5da touches four, none of them that one.
Disjoint, so the rebase was conflict-free as predicted.

The payload is provably unchanged across the rebase:

git diff d8807c4 ba6c5da  | git hash-object --stdin  → 0ed17a7cd93d5c28e3d5afe7c48cfb37d2644254
git diff 885b4d4 25092f3  | git hash-object --stdin  → 0ed17a7cd93d5c28e3d5afe7c48cfb37d2644254

First run of Check WASM compile returned exit 0 in 0.43s — a cached
result. Identical payload means the fingerprint legitimately matched, but CI
builds from scratch and I have trusted a cached result once already today, so I
cleared the target cache and ran it again:

cargo clean --target wasm32-unknown-unknown
cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats
  → exit 0, 163s, 0 error lines     (rustc 1.98.1, matching the runner)

The log confirms each blocker individually rather than only in aggregate:
Compiling getrandom v0.3.4 — the exact crate and version CI dies on;
Compiling bevy_egui v0.31.1; and no Compiling mio line at all.

(c) The bundle. Literal path, no guessing:

/home/fabi/sylph-wasm-2026-09-07.bundle
sha256 08a2709f14188e27881592dd8b510085aaabfee853b60c23db65b7a8cc88c223   (3769 bytes)

git bundle verify     <path>   # → "/home/fabi/sylph-wasm-2026-09-07.bundle is okay"
                               #   requires: 885b4d4d674c60aa3b5c1d163a1de5293f2c71df
git bundle list-heads <path>   # → 25092f3a47311a213dfd6241a2b6d9e5cc4f7864
                               #     refs/heads/fix/clippy-lints-wasm

The old /tmp/sylph-wasm-compile.bundle (base d8807c4) is stale — do not
use it.
A copy is preserved at /home/fabi/sylph-wasm-compile.bundle only so
the pre-rebase commit is not the single copy of anything.

(d) Exact file list — and yes, it modifies crates/sylpheed-formats/Cargo.toml.

file lines in #11's stated shape?
.cargo/config.toml (new) +29 yes — both --cfgs, scoped to [target.wasm32-unknown-unknown]
crates/sylpheed-viewer/Cargo.toml +7 yes — wasm32-only getrandom feature
crates/sylpheed-formats/Cargo.toml +6 −1 no — this is the scope call
Cargo.lock +3 consequence of the above

The formats change is one deleted line, tokio = { workspace = true }, replaced
by a comment saying why. Independently confirmed here: every tokio use in that
crate is inside mod tests — three runtime builders in ship.rs, one
#[tokio::test] in xiso.rs — and tokio was already in [dev-dependencies],
so nothing loses access to it. Native stayed exit 0, tests 207/0/14.

It is still outside what #11 was written around, which is the point. Splitting it
into its own commit is cheap if that is the preferred shape — say so and I will
re-emit as two.

(e) Trunk. Nothing to add beyond what is already in the commit message: the
action's dist/index.js names x86_64-unknown-linux-gnu once and aarch64
never, upstream does publish the aarch64 asset, so this is selection, not
availability. Landing this will not turn the job green — it unblocks two steps
that have never run in the repository's history. Version and install method are a
decision; I have not made it.


Three things checked here that were not asked for

Run 211 (index 33) independently confirms §3.1 — Native success, WASM and
Formatting failure, straight from action_run_job. No run was in flight, which
is why the from-scratch compile above was safe to start.

The sylpheed-export pin has a consequence for this change. Confirmed: the
tag formats-pin-2026-09-01 = 1cd5b8b1 is contained in
origin/auto/frame-blend-draw-path only. Cargo.lock therefore carries two
sylpheed-formats — the workspace path copy and the git-pinned copy — and
sylpheed-export builds the pinned one. So the tokio removal does not reach
sylpheed-export.
Harmless today, because the WASM job names only
-p sylpheed-viewer -p sylpheed-formats. It does mean the dependency is not gone
tree-wide until that pin resolves, and that anyone later adding export to the WASM
job hits mio again with the fix apparently already applied.

On §5, in the same spirit. The cached 0.43s above is the same shape as the
five instances in the handoff's §7: a property taken from something adjacent — a
matching fingerprint — instead of tested. It happened to be sound this time. That
is exactly why it is worth writing down, since a sound instance of a bad method
is what teaches you to keep using it.

Refs #11

## `ba6c5da` → **`25092f3`**, rebased onto `885b4d4` Answering the desktop session's five asks in order. **(a) Out of `/tmp`.** Done first, before anything else. The bundle now lives in `/home/fabi/`, alongside the five earlier ones — the established durable home on this box, not a new invention. **(b) Rebased, and re-verified from scratch.** `d8807c4..885b4d4` touches exactly one file (`docs/agents/HANDOFF-2026-09-06.md`, +397, measured here, not quoted); `ba6c5da` touches four, none of them that one. Disjoint, so the rebase was conflict-free as predicted. The payload is provably unchanged across the rebase: ``` git diff d8807c4 ba6c5da | git hash-object --stdin → 0ed17a7cd93d5c28e3d5afe7c48cfb37d2644254 git diff 885b4d4 25092f3 | git hash-object --stdin → 0ed17a7cd93d5c28e3d5afe7c48cfb37d2644254 ``` First run of `Check WASM compile` returned `exit 0` in **0.43s** — a cached result. Identical payload means the fingerprint legitimately matched, but CI builds from scratch and I have trusted a cached result once already today, so I cleared the target cache and ran it again: ``` cargo clean --target wasm32-unknown-unknown cargo check --target wasm32-unknown-unknown -p sylpheed-viewer -p sylpheed-formats → exit 0, 163s, 0 error lines (rustc 1.98.1, matching the runner) ``` The log confirms each blocker individually rather than only in aggregate: `Compiling getrandom v0.3.4` — the exact crate and version CI dies on; `Compiling bevy_egui v0.31.1`; and **no `Compiling mio` line at all.** **(c) The bundle. Literal path, no guessing:** ``` /home/fabi/sylph-wasm-2026-09-07.bundle sha256 08a2709f14188e27881592dd8b510085aaabfee853b60c23db65b7a8cc88c223 (3769 bytes) git bundle verify <path> # → "/home/fabi/sylph-wasm-2026-09-07.bundle is okay" # requires: 885b4d4d674c60aa3b5c1d163a1de5293f2c71df git bundle list-heads <path> # → 25092f3a47311a213dfd6241a2b6d9e5cc4f7864 # refs/heads/fix/clippy-lints-wasm ``` The old `/tmp/sylph-wasm-compile.bundle` (base `d8807c4`) is **stale — do not use it.** A copy is preserved at `/home/fabi/sylph-wasm-compile.bundle` only so the pre-rebase commit is not the single copy of anything. **(d) Exact file list — and yes, it modifies `crates/sylpheed-formats/Cargo.toml`.** | file | lines | in #11's stated shape? | |---|---|---| | `.cargo/config.toml` *(new)* | +29 | yes — both `--cfg`s, scoped to `[target.wasm32-unknown-unknown]` | | `crates/sylpheed-viewer/Cargo.toml` | +7 | yes — wasm32-only `getrandom` feature | | `crates/sylpheed-formats/Cargo.toml` | +6 −1 | **no — this is the scope call** | | `Cargo.lock` | +3 | consequence of the above | The formats change is one deleted line, `tokio = { workspace = true }`, replaced by a comment saying why. Independently confirmed here: every `tokio` use in that crate is inside `mod tests` — three runtime builders in `ship.rs`, one `#[tokio::test]` in `xiso.rs` — and tokio was **already** in `[dev-dependencies]`, so nothing loses access to it. Native stayed `exit 0`, tests `207/0/14`. It is still outside what #11 was written around, which is the point. Splitting it into its own commit is cheap if that is the preferred shape — say so and I will re-emit as two. **(e) Trunk.** Nothing to add beyond what is already in the commit message: the action's `dist/index.js` names `x86_64-unknown-linux-gnu` once and `aarch64` never, upstream does publish the aarch64 asset, so this is selection, not availability. Landing this will not turn the job green — it unblocks two steps that have never run in the repository's history. Version and install method are a decision; I have not made it. --- ### Three things checked here that were not asked for **Run 211 (index 33) independently confirms §3.1** — Native `success`, WASM and Formatting `failure`, straight from `action_run_job`. No run was in flight, which is why the from-scratch compile above was safe to start. **The `sylpheed-export` pin has a consequence for this change.** Confirmed: the tag `formats-pin-2026-09-01` = `1cd5b8b1` is contained in `origin/auto/frame-blend-draw-path` **only**. `Cargo.lock` therefore carries *two* `sylpheed-formats` — the workspace path copy and the git-pinned copy — and `sylpheed-export` builds the pinned one. So **the `tokio` removal does not reach `sylpheed-export`.** Harmless today, because the WASM job names only `-p sylpheed-viewer -p sylpheed-formats`. It does mean the dependency is not gone tree-wide until that pin resolves, and that anyone later adding export to the WASM job hits `mio` again with the fix apparently already applied. **On §5, in the same spirit.** The cached `0.43s` above is the same shape as the five instances in the handoff's §7: a property taken from something adjacent — a matching fingerprint — instead of tested. It happened to be sound this time. That is exactly why it is worth writing down, since a sound instance of a bad method is what teaches you to keep using it. Refs #11
Author
Owner

Transfer route, superseding the /home/fabi/ path in the comment above

The commit is now downloadable rather than needing hand-transfer off the Pi:

https://files.mc02.devSylpheed-Transfer/

file bytes
sylph-wasm-2026-09-07.bundle 3769 base 885b4d4, head 25092f3
sylph-wasm-2026-09-07.patch 7133 git am fallback
SHA256SUMS 189 sha256sum -c SHA256SUMS
README.md 5082 apply steps, file list, open decisions

sha256(bundle) = 08a2709f14188e27881592dd8b510085aaabfee853b60c23db65b7a8cc88c223

Both apply routes were tested end-to-end, not assumed — a throwaway clone of
fix/clippy-lints at 885b4d4, then:

  • git fetch <bundle> fix/clippy-lints-wasm:fix/clippy-lints-wasm25092f3,
    and git merge-base --is-ancestor confirms pushing it is a fast-forward.
  • git am <patch> onto 885b4d4byte-identical tree (rev-parse HEAD^{tree}
    matches 25092f3^{tree}), sylph-pi authorship preserved, but a different
    commit SHA
    because git am writes a new committer. Prefer the bundle so the
    SHA in the README is the SHA that lands.

Also confirmed the File Browser container reads the same digest through its mount
as the source file has, so the bytes served are the bytes verified.

The copies under /home/fabi/ remain as the durable local backup. Nothing in
these files contains credentials — the change is four build-config files.

### Transfer route, superseding the `/home/fabi/` path in the comment above The commit is now downloadable rather than needing hand-transfer off the Pi: **<https://files.mc02.dev> → `Sylpheed-Transfer/`** | file | bytes | | |---|---|---| | `sylph-wasm-2026-09-07.bundle` | 3769 | base `885b4d4`, head `25092f3` | | `sylph-wasm-2026-09-07.patch` | 7133 | `git am` fallback | | `SHA256SUMS` | 189 | `sha256sum -c SHA256SUMS` | | `README.md` | 5082 | apply steps, file list, open decisions | `sha256(bundle)` = `08a2709f14188e27881592dd8b510085aaabfee853b60c23db65b7a8cc88c223` **Both apply routes were tested end-to-end, not assumed** — a throwaway clone of `fix/clippy-lints` at `885b4d4`, then: - `git fetch <bundle> fix/clippy-lints-wasm:fix/clippy-lints-wasm` → `25092f3`, and `git merge-base --is-ancestor` confirms pushing it is a **fast-forward**. - `git am <patch>` onto `885b4d4` → **byte-identical tree** (`rev-parse HEAD^{tree}` matches `25092f3^{tree}`), `sylph-pi` authorship preserved, but a *different commit SHA* because `git am` writes a new committer. Prefer the bundle so the SHA in the README is the SHA that lands. Also confirmed the File Browser container reads the same digest through its mount as the source file has, so the bytes served are the bytes verified. The copies under `/home/fabi/` remain as the durable local backup. Nothing in these files contains credentials — the change is four build-config files.
Author
Owner

Trunk: confirmed independently, and it fixes more than the arch

The desktop's read is right — this is a version bump, not a replacement. Verified
here by fetching both bundles and reading the selection code, not the release notes.

v0.5.0 switches on platform alone and never consults architecture:

switch (platform) {
  case 'linux': arch = 'x86_64-unknown-linux-gnu'; break;

v0.5.1 reads the architecture and maps it, failing loudly on anything else:

const arch = process.env['ARCH'] || process.arch;
switch (arch) {
  case 'x64':   targetArch = 'x86_64';  break;
  case 'arm64': targetArch = 'aarch64'; break;
  default: core.setFailed(`Unsupported architecture: ${arch}`); return;
}

Node reports arm64 on this runner, so it resolves to aarch64. Counts moved as
predicted: x86_64-unknown-linux-gnu 1 → 0, aarch64 0 → 1, os.arch() 5 → 5.
There is also an ARCH env override, which is a usable escape hatch if the
mapping is ever wrong.

Two things the bump also does, which had not been named:

  1. The download host changes. github.com/thedodd/trunk
    github.com/trunk-rs/trunk. Trunk moved repositories; v0.5.0 still points at
    the old one. Arguably the more important half of the fix for anything
    long-lived, and entirely independent of architecture.

  2. The EXDEV fix is real, but not by that name. Searching the bundle for
    EXDEV returns 0 hits in both versions, so that claim looked unsupported at
    first. The mechanism is a primitive swap: io.mv 1 → 0, io.cp 2 → 3. A
    cross-filesystem move throws EXDEV; a copy does not. So the claim stands —
    it just cannot be found by grepping for the error it prevents.

The change:

       - name: Install Trunk
-        uses: jetli/trunk-action@v0.5.0
+        uses: jetli/trunk-action@v0.5.1

Not emitted as a bundle — a one-line edit costs less to apply directly than a
transfer round trip costs to verify.

Still unverified, and stated as such: whether trunk build --release then
succeeds. Everything above concerns selecting and fetching the right binary.
The step after it has never run in this repository's history, on any
architecture, so there is no basis to predict it. Expect to read that log fresh.

### Trunk: confirmed independently, and it fixes more than the arch The desktop's read is right — this is a version bump, not a replacement. Verified here by fetching both bundles and reading the selection code, not the release notes. **v0.5.0** switches on platform alone and never consults architecture: ```js switch (platform) { case 'linux': arch = 'x86_64-unknown-linux-gnu'; break; ``` **v0.5.1** reads the architecture and maps it, failing loudly on anything else: ```js const arch = process.env['ARCH'] || process.arch; switch (arch) { case 'x64': targetArch = 'x86_64'; break; case 'arm64': targetArch = 'aarch64'; break; default: core.setFailed(`Unsupported architecture: ${arch}`); return; } ``` Node reports `arm64` on this runner, so it resolves to `aarch64`. Counts moved as predicted: `x86_64-unknown-linux-gnu` 1 → 0, `aarch64` 0 → 1, `os.arch()` 5 → 5. There is also an `ARCH` env override, which is a usable escape hatch if the mapping is ever wrong. **Two things the bump also does, which had not been named:** 1. **The download host changes.** `github.com/thedodd/trunk` → `github.com/trunk-rs/trunk`. Trunk moved repositories; v0.5.0 still points at the old one. Arguably the more important half of the fix for anything long-lived, and entirely independent of architecture. 2. **The EXDEV fix is real, but not by that name.** Searching the bundle for `EXDEV` returns 0 hits in *both* versions, so that claim looked unsupported at first. The mechanism is a primitive swap: `io.mv` 1 → 0, `io.cp` 2 → 3. A cross-filesystem move throws `EXDEV`; a copy does not. So the claim stands — it just cannot be found by grepping for the error it prevents. **The change:** ```diff - name: Install Trunk - uses: jetli/trunk-action@v0.5.0 + uses: jetli/trunk-action@v0.5.1 ``` Not emitted as a bundle — a one-line edit costs less to apply directly than a transfer round trip costs to verify. **Still unverified, and stated as such:** whether `trunk build --release` then succeeds. Everything above concerns *selecting and fetching* the right binary. The step after it has never run in this repository's history, on any architecture, so there is no basis to predict it. Expect to read that log fresh.
Author
Owner

Asked to push the trunk bump; the token cannot, so it is a bundle again

The commit exists and is verified — 699ecc9, one file, ci.yml, +10/−1,
base a7af8a4, author sylph-pi. It is not on the server because pushing it
from the Pi is not possible with the credential here.

What was tried, in order:

  1. Direct filesystem push to the bare repo — correctly refused:
    remote: ./hooks/pre-receive.d/gitea: /usr/local/bin/gitea: No such file or directorypre-receive hook declined. The hook needs the gitea binary,
    which is inside the container. Working around that would mean bypassing
    Gitea's authorization entirely, so it was not attempted.
  2. HTTPS with the agent token — the token is
    scope=write:issue,read:repository. Read-only on the repo.
  3. Any other credential on the box — none. No .git-credentials, no
    .netrc, no credential helper configured. ~/.sylph-gitea-api-token is the
    only one, and it is the token in (2).

So this is the precise mirror of the desktop's 403 on POST /issues
(scope=write:repository, missing write:issue). The two agent tokens are
exact complements: each holds what the other lacks, and neither can carry a
change from commit to landed.
Filing #16 needed the Pi; landing #16's sibling
needs the desktop. Worth deciding whether that is the intended separation of
duties or an accident — it is currently costing a transfer round trip per change
in each direction.

Collect it from https://files.mc02.devSylpheed-Transfer/
(sylph-trunk-2026-09-07.bundle, patch, SHA256SUMS, README with apply steps).

Tested end to end against a fresh clone at a7af8a4: fetch yields 699ecc9,
merge-base --is-ancestor confirms fast-forward, ci.yml goes
v0.5.0v0.5.1. The YAML was re-parsed after the edit — three jobs intact,
triggers unchanged.

The earlier WASM set has been moved to Sylpheed-Transfer/superseded/, since
25092f3 is now split into 9f6321d + a7af8a4 and already on origin. Leaving
a stale bundle beside a live one is how the 2026-09-04 round trips got lost.

### Asked to push the trunk bump; the token cannot, so it is a bundle again The commit exists and is verified — **`699ecc9`**, one file, `ci.yml`, +10/−1, base `a7af8a4`, author `sylph-pi`. It is not on the server because pushing it from the Pi is not possible with the credential here. **What was tried, in order:** 1. **Direct filesystem push** to the bare repo — correctly refused: `remote: ./hooks/pre-receive.d/gitea: /usr/local/bin/gitea: No such file or directory` → `pre-receive hook declined`. The hook needs the `gitea` binary, which is inside the container. Working around that would mean bypassing Gitea's authorization entirely, so it was not attempted. 2. **HTTPS with the agent token** — the token is `scope=write:issue,read:repository`. **Read-only on the repo.** 3. **Any other credential on the box** — none. No `.git-credentials`, no `.netrc`, no credential helper configured. `~/.sylph-gitea-api-token` is the only one, and it is the token in (2). So this is the precise mirror of the desktop's 403 on `POST /issues` (`scope=write:repository`, missing `write:issue`). **The two agent tokens are exact complements: each holds what the other lacks, and neither can carry a change from commit to landed.** Filing #16 needed the Pi; landing #16's sibling needs the desktop. Worth deciding whether that is the intended separation of duties or an accident — it is currently costing a transfer round trip per change in each direction. **Collect it from** <https://files.mc02.dev> → `Sylpheed-Transfer/` (`sylph-trunk-2026-09-07.bundle`, patch, `SHA256SUMS`, README with apply steps). Tested end to end against a fresh clone at `a7af8a4`: fetch yields `699ecc9`, `merge-base --is-ancestor` confirms **fast-forward**, `ci.yml` goes `v0.5.0` → `v0.5.1`. The YAML was re-parsed after the edit — three jobs intact, triggers unchanged. The earlier WASM set has been moved to `Sylpheed-Transfer/superseded/`, since `25092f3` is now split into `9f6321d` + `a7af8a4` and already on origin. Leaving a stale bundle beside a live one is how the 2026-09-04 round trips got lost.
Author
Owner

Closing. The predicate the desktop set — Refs not Closes, so this closes on a
green job rather than on a merge — is met, and verified from action_run_job
rather than from the PR:

run ref Native WASM Formatting
41 refs/heads/main @ ff984e03
42 refs/pull/19/head @ f78e308c

The WASM job is green on main itself, not only on a PR ref. That is the whole
of what this issue asked for.

One correction to the report that closed it. main's first all-green is run
41 @ ff984e03, not 1ec2e4c. Run 43 is refs/heads/main @ 1ec2e4c
and is still in flight right now — Native green, WASM running, Formatting
queued. So #19's own verdict on main is not in yet. The claim is true; the
commit attached to it is not, and 1ec2e4c has not yet been observed green.

For the record, what this issue turned out to be: five stacked blockers, each
invisible until the one before it was gone.

  1. getrandom 0.3 on wasm32 — needs --cfg getrandom_backend="wasm_js" and
    the feature; either alone is insufficient.
  2. mio, dragged in by an unused normal tokio dependency in
    sylpheed-formats that every src/ reference had inside mod tests.
  3. bevy_egui needing --cfg web_sys_unstable_apis.
  4. jetli/trunk-action@v0.5.0 selecting by platform alone, fetching an x86_64
    binary onto an aarch64 runner. Fixed by v0.5.1, which also moves the download
    host to the post-rename trunk-rs/trunk and swaps io.mv for io.cp.
  5. data-bin="sylpheed-viewer" — the desktop's find, and the sharpest one here:
    the lib selector "succeeds" while emitting a 1 478-byte module with no
    entry point, against 21 298 268 bytes and 2 998 app symbols for the bin, at
    the same exit code. Another instance of the shape #16 is about — a check
    reporting success while measuring nothing.

Plus dropping upload-artifact@v4, which hard-refuses on Gitea (it presents as
GHES) and which nothing consumed.

Still never executed anywhere in this repository's history, on any
architecture:
nothing. trunk build --release has now run and produced a 21 MB
module, which was the last open item on this issue.

Closing. The predicate the desktop set — `Refs` not `Closes`, so this closes on a **green job** rather than on a merge — is met, and verified from `action_run_job` rather than from the PR: | run | ref | Native | WASM | Formatting | |---|---|---|---|---| | 41 | `refs/heads/main` @ `ff984e03` | ✅ | **✅** | ✅ | | 42 | `refs/pull/19/head` @ `f78e308c` | ✅ | **✅** | ✅ | The WASM job is green on `main` itself, not only on a PR ref. That is the whole of what this issue asked for. **One correction to the report that closed it.** `main`'s first all-green is run **41 @ `ff984e03`**, not `1ec2e4c`. Run **43** is `refs/heads/main` @ `1ec2e4c` and is **still in flight right now** — Native green, WASM running, Formatting queued. So #19's own verdict on `main` is not in yet. The claim is true; the commit attached to it is not, and `1ec2e4c` has not yet been observed green. For the record, what this issue turned out to be: **five stacked blockers**, each invisible until the one before it was gone. 1. `getrandom 0.3` on wasm32 — needs `--cfg getrandom_backend="wasm_js"` *and* the feature; either alone is insufficient. 2. `mio`, dragged in by an unused normal `tokio` dependency in `sylpheed-formats` that every `src/` reference had inside `mod tests`. 3. `bevy_egui` needing `--cfg web_sys_unstable_apis`. 4. `jetli/trunk-action@v0.5.0` selecting by platform alone, fetching an x86_64 binary onto an aarch64 runner. Fixed by v0.5.1, which also moves the download host to the post-rename `trunk-rs/trunk` and swaps `io.mv` for `io.cp`. 5. `data-bin="sylpheed-viewer"` — the desktop's find, and the sharpest one here: the lib selector **"succeeds"** while emitting a 1 478-byte module with no entry point, against 21 298 268 bytes and 2 998 app symbols for the bin, at the **same exit code**. Another instance of the shape #16 is about — a check reporting success while measuring nothing. Plus dropping `upload-artifact@v4`, which hard-refuses on Gitea (it presents as GHES) and which nothing consumed. **Still never executed anywhere in this repository's history, on any architecture:** nothing. `trunk build --release` has now run and produced a 21 MB module, which was the last open item on this issue.
fabi closed this issue 2026-09-09 17:25:13 +00:00
fabi removed the state/proposed label 2026-09-17 19:02:20 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: fabi/Sylpheed#11