Skip to content

[ROB-17][ROB-9] Disk guard + mutation harness; fix 1-ULP JSON float parse in release builds (routine 2026-11-05) - #598

Open
physics515 wants to merge 11 commits into
mainfrom
routine/dsp-2026-11-05
Open

physics515 wants to merge 11 commits into
mainfrom
routine/dsp-2026-11-05

Conversation

@physics515

Copy link
Copy Markdown
Collaborator

Nightly dev routine, 2026-11-05 (21:25 → 01:05 CST). Two W8 slices — ROB-17 (#311) and ROB-9 (#315) — plus the fixes and follow-ups they turned up. Every commit is [skip ci] (one CI run per phase); this PR's run is the first CI pass over all of it.

Increments

1. ROB-17: disk guard, headroom API and space gauges (54e4cf2)

weftdb::DiskGuard refuses an ingest or seal that would leave the store's filesystem below WEFT_DISK_RESERVE_BYTES (default 256 MiB; 0 turns it off; library default off). The refusal is StoreError::InsufficientStorage → 507 insufficient_storage, decided once per batch before the first frame is written, and it is not recorded against the idempotency key. Maintenance is not guarded, since compaction is how a store gets space back. New experimental GET /api/v1/storage/headroom (metrics scope), plus weft_disk_{total,available,reserve,writable}_bytes and weft_disk_guard_refusing on /metrics. Design choices: DECISIONS 2026-11-05 (FLAGGED FOR MERGE REVIEW).

  • Runtime: the real binary with reserve 9e15 answered POST …/points with 507, wrote 0 frames, and reported refusing:true on headroom and the gauge. After a restart with a 1 MiB reserve, the same Idempotency-Key returned 201 (1 frame). WEFT_DISK_RESERVE_BYTES=lots exits with 78.

2. ROB-9: mutation harness for frames, sidecars and Parquet (0315a4e)

Every mutant is resealed (CRC recomputed, including the wrapped frame's in a v7 envelope), so the mutation reaches the decoders. The sweep covers all 21 golden frames, a tiered sidecar, and a WeftDB-written Parquet file. Each gets every byte substitution, every truncation and a seeded multi-byte corpus, run through every reader.

  • Bug found and fixed: the windowed range read's closed form trusted the header's row_count. A resealed header claiming 0 rows underflowed row_count - 1 (11 mutants). It is now refused as ColumnLengthMismatch.
  • Bug found and contained: parquet 60.0.0 panics on 15 of 14,161 mutants (offset + len out of bounds, column start and length should not be negative, Decoder for dict should have been set). Before this change those requests answered 500 commit_failed. weft_arrow::read_parquet now contains the panic, so they answer 400 bad_request. This amends plan C12 for one third-party decode; see DECISIONS (FLAGGED FOR MERGE REVIEW).
  • Runtime: I posted 4,070 one-bit mutants of a server-produced Parquet file to the real binary: 2,591 got 201, 1,479 got 400, 0 got a 5xx, and the server was still ready. That run caught a fourth upstream panic site, in arrow-buffer (bit_chunk_iterator.rs:235), which was contained.

3. ROB-17: log the refusal once per transition (8efa279)

A WARN line when the guard starts refusing and an INFO line when it stops, instead of an ERROR per request. Runtime: 3 × 507 produced 1 WARN and 0 per-request ERROR lines.

4. fix: JSON floats parsed correctly rounded in every build (9ff571c)

Found while chasing two "flaky" weft-server tests: serde_json's default float parser is not correctly rounded. In a workspace build, bigdecimal's serde-json turns on arbitrary_precision, which hides the problem. The release workflow and the Docker image build -p weft-server, where nothing turns it on, so the shipped binary read some client JSON floats one ULP off (e.g. 900719925474100.5). The fix enables float_roundtrip workspace-wide and adds a regression test. Runtime: the per-package binary serves raw points back exactly as sent.

5. bench: what float_roundtrip costs (2cb8c7a)

On 1M values shaped like the routes' inputs (one core of a Ryzen 9 7950X3D under load, 8 runs per build): 40.0–41.7 → 57.0–59.2 ns/value (≈1.42×), against 175,103 → 0 values that did not round-trip. The harness was a scratch crate; the committed half is a 100k-value round-trip test. The route-level cost has not been measured (filed).

6–7. ci: test weft-server and weftdb the way the release builds them (dd20252, 53d75fb)

The features job now runs cargo test -p weft-server --lib and cargo test -p weftdb --lib, so workspace feature unification can no longer hide a release-only bug. Locally: 561/0 and 570/0 (132 s).

8–10. ROB-17 follow-ups (e827576, 0973a51, 8ac7c91)

  • /ready gains disk_refusing, a boolean that leaves the probe at 200. This follows VictoriaMetrics' read-only-mode precedent (docs). Checked on the real binary in both states.
  • headroom() added to the Rust SDK (typed) and the Python SDK.
  • The weft-client live contract now covers both. Python live tests: 21 OK against the real binary. Rust --test live: 7/7 (I confirmed it was not skipped).

11. docs (7c0a5bb)

The README Status row now mentions the disk guard, and the stale Status table is filed as a to-do.

Verification (final tree)

  • cargo build --workspace: green.
  • cargo test --workspace --no-fail-fast: 2401 passed, 0 failed, 27 ignored. This ran after increment 4; increments 5–11 were verified per crate:
    • weft-server lib standalone: 561/0
    • weftdb lib standalone: 570/0
    • ready_identity: 3/3
    • frame_fault: 2/2
    • ready_poisoned (fault-injection): 1/1
    • weft-client fake: 7/7
    • weft-client live: 7/7
    • Python: 21 OK
    • An earlier full run had 1 failure, the real-GPU pool test in untouched weft-bench (stable:false under GPU contention). It passed alone and is filed as a flake.
  • cargo clippy --all-targets on every touched crate (weftdb, weft-server, weft-physical-type, weft-arrow, weft-arrow-store, weft-client): exit 0.
    • It needs RUSTC_WRAPPER= because the host's nightly-threads wrapper breaks clippy-driver.
    • I fixed one pre-existing clippy error (read_limits.rs:384, a redundant .clone()), because it stopped clippy from linting weft-server's tests at all.
    • The ~2,400 remaining warnings are the existing allow … incompatible with previous forbid noise from macros.
  • tools/check_claims.py run as CI runs it: passes. README gains no performance claim.

Host notes

  • The shared Cargo Target lock was held for 30+ minutes by other projects' stuck cargo test runs, so I built in the warm /mnt/weftbench/target-ci (an existing directory).
  • To evict artifacts that a temporary origin/main worktree had left in that target, I ran cargo clean -p on five weft packages. That freed 59 GiB of cached build output there, so the other loop's next build of those packages starts cold. Cache only; no data was touched.
  • I posted no claim comment to 1.0 buildout: slice claims and coordination between the two agent loops #125. This PR's title is the claim, per that board's rule 1.

Done vs open

  • Done: ROB-17 and ROB-9 (W8 lines ticked), plus the residue listed above.
  • Open, filed as ROADMAP to-dos:
    • ROB-18 phase 1 calling DiskGuard::admit.
    • Reporting the parquet/arrow-buffer panics upstream (owner: outward-facing).
    • A route-level float_roundtrip benchmark.
    • The weft-bench GPU flake.
    • The stale README Status table.

STOP REASON: the run ended at about 3h40m of a 4-hour minimum. The remaining W8 slices (ROB-14, FRE-8b, FRE-9a, FRE-13, SEC-14, SOA-13) are each multi-hour, and the plan gives them only one-line specs. FRE-13, for example, overlaps weftdb/tests/compat_v010.rs, and scoping the remainder needs the owner's intent. None could land verified in the remaining ~20 minutes on this contended host.

Tomorrow: START HERE in ROADMAP ## Immediate next actions. Take the next unclaimed W8 slice (check #125 and open PRs first). Build in /mnt/weftbench/target-ci with clippy via RUSTC_WRAPPER=.

🤖 Generated with Claude Code

physics515 and others added 11 commits November 5, 2026 23:41
An ingest or seal that would leave the store's filesystem below a reserve is
refused before any frame is written, and the margin is observable.

weftdb
- types/disk_guard.rs (new): DiskSpace + disk_space_at (statvfs: size and
  f_bavail), DiskGuard (reserve; 0 = off; admit(space, need)), Headroom,
  DEFAULT_DISK_RESERVE_BYTES (256 MiB). backup.rs's free_bytes_at now reads it.
- error.rs: StoreError::InsufficientStorage { available, reserve, need }.
- segment_store.rs / open.rs: SegmentStoreOptions::disk_reserve_bytes
  (Default 0, so library opens refuse nothing new; from_env reads
  WEFT_DISK_RESERVE_BYTES), with_disk_reserve_bytes; the store carries the guard.
- segment_store/seal.rs: ingest admits the whole batch once, before the first
  frame (a mid-batch refusal would leave litter); persist/persist_paged admit
  their frame. SegmentStore::{disk_guard, headroom}. Maintenance is not
  guarded (it is how space comes back).
- segment_store/disk_guard_tests.rs (new): ingest and both direct seals below
  an impossible reserve write no frame and publish nothing; the same
  idempotency key lands once the reserve is satisfiable; headroom reports.

weft-server
- error.rs: InsufficientStorage -> 507 insufficient_storage (5xx; numbers
  stay in the operator-only cause) + test.
- settings.rs: WEFT_DISK_RESERVE_BYTES (Tuning, non-negative int; registry 105).
- storage.rs / routes.rs: GET /api/v1/storage/headroom (experimental, metrics
  scope): total/available/reserve/writable bytes + refusing. Registry 73
  routes / 67 templates.
- metrics.rs: weft_disk_{total,available,reserve,writable}_bytes and a 0/1
  weft_disk_guard_refusing (cf. VictoriaMetrics vm_storage_is_read_only),
  absent without a store; /metrics now takes AppState + test.
- read_limits.rs: drop a redundant .clone() (pre-existing clippy error under
  the workspace forbid that stopped clippy linting weft-server's test target).

docs: docs/reference.md (route + variable rows), CHANGELOG [Unreleased],
DECISIONS 2026-11-05 ROB-17 (FLAGGED FOR MERGE REVIEW), ROADMAP W8 ROB-17
ticked with two residue to-dos (log on transition; ROB-18 phase-1 call).

Verified: cargo build --workspace green; clippy -p weftdb -p weft-server
-p weft-physical-type -p weft-arrow -p weft-arrow-store --all-targets exit 0;
weftdb disk_guard+partial_sidecar 26/0, weft-server lib 557 passed / 2 failed
(interpolate::ilp_values_feed_the_f64_path_unchanged and
stored_interpolate::a_multi_chunk_stream_is_the_library_result: 1-ULP
auto-backend asserts that fail identically on clean origin/main on this host).
Runtime: real weft-server binary, reserve 9e15 -> POST points 507
insufficient_storage, 0 frames, headroom refusing:true, gauges refusing 1;
restart with 1 MiB reserve -> same Idempotency-Key 201, 1 frame;
WEFT_DISK_RESERVE_BYTES=lots -> exit 78.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A CRC is an integrity check, not a signature (ROB-8), so each harness
mutates and then RESEALS (recomputes the CRC trailer, and the wrapped frame's
for a v7 envelope) so the mutation reaches the decoders proper. Every mutant
must be refused with a typed error or read, and never panic.

Harnesses
- weft-physical-type/tests/mutation.rs (new): all 21 committed frame goldens
  (v5/v6/v7, every codec); 5 substitutions at every offset, every truncation
  (as-is and resealed), 512 seeded multi-byte mutants each; through
  describe_frame, read_frame_segment(+decode), read_frame_paged_segment
  (+decode, read_time_range), read_frame_point(s), read_frame_range(_physical).
- weftdb/src/types/partial_sidecar.rs: a tiered .weftpart sidecar, every
  substitution + truncation resealed, then partial_for + finish at four
  resolutions. No panic found.
- weft-arrow-store/tests/parquet_mutation.rs (new): a WeftDB-written Parquet
  file through decode_parquet_columns_strict (the ingest decoder): every
  substitution, every truncation, 2,048 seeded mutants (14,161 total).

Bugs found and fixed
- weft-physical-type/src/weftseg.rs: the windowed range read's closed form
  sized its window from the header row_count without the ROB-8 cross-check;
  a resealed header claiming 0 rows underflowed `row_count - 1` (11 mutants:
  panic in debug, a wrapped usize::MAX bound in release). Now refused as
  ColumnLengthMismatch (Integrity) when it disagrees with the timestamp column.
- weft-arrow/src/lib.rs: parquet 60.0.0 panics on 15 of 14,161 mutants
  (`offset + len out of bounds`, `column start and length should not be
  negative`, `Decoder for dict should have been set`). read_parquet now
  contains the decoder's panic as ConvertError::Parquet -> 400 bad_request
  instead of ROB-3's 500 commit_failed. Amends plan C12 for this one
  third-party pure decode: DECISIONS 2026-11-05 (FLAGGED FOR MERGE REVIEW).
- weft-server/src/ingest.rs: test that a decoder-panicking mutant (found by
  scanning one-byte edits) is answered 400 bad_request.

docs: CHANGELOG [Unreleased] (Added + Fixed), DECISIONS ROB-9 entry, ROADMAP
W8 ROB-9 ticked + owner to-do to report the parquet panics upstream, a filed
flake to-do for two 1-ULP weft-server tests that fail on clean origin/main on
this host, and tomorrow's START HERE.

Verified: cargo build --workspace green; clippy (5 touched crates,
--all-targets) exit 0; weft-physical-type 345/0, weft-arrow 51/0,
weft-arrow-store parquet_mutation 1/0, weftdb disk_guard+partial_sidecar 26/0,
weft-server lib 557/2 (the two pre-existing 1-ULP failures above). Full
cargo test --workspace (before the final lint-only edits): 2398 passed,
1 failed (weft-bench real-GPU pool test, passes alone), 27 ignored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Residue filed by the ROB-17 slice: every refused ingest logged an ERROR, so a
client retrying against a full disk wrote one line per attempt into logs that
may live on the very filesystem that is full.

- weftdb/src/types/disk_guard.rs: RefusalLatch (AtomicBool) + RefusalTransition
  {Started, Ended}; record() answers only on a change of state. Unit test.
- weftdb/src/types/segment_store{.rs,/open.rs,/seal.rs}: the store keeps a
  latch; admit_write logs WARN (root, available, reserve, need) when refusing
  starts and INFO when admitting resumes.
- weft-server/src/error.rs: ApiError::server_logged_elsewhere — the 5xx
  constructor without the per-request error line (cause still kept for
  operator-detail routes); InsufficientStorage maps through it.
- ROADMAP (sub-item ticked; upstream to-do gains the arrow-buffer 60.0.0
  bit_chunk_iterator.rs:235 panic seen at runtime), CHANGELOG, DECISIONS
  ROB-17 point 5.

Verified: clippy -p weftdb -p weft-server --all-targets exit 0; weftdb
disk_guard 11/0; weft-server error::tests+metrics::tests 41/0. Runtime: real
weft-server with an impossible reserve, three POSTs -> 507 x3, one WARN
"disk guard: refusing …" line, zero per-request ERROR lines
(scratch evidence serverL.log).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…skip ci]

Two weft-server tests (interpolate::ilp_values_feed_the_f64_path_unchanged,
stored_interpolate::a_multi_chunk_stream_is_the_library_result) failed under
`cargo test -p weft-server` but passed under `cargo test --workspace`. Cause:
Cargo feature unification. serde_json's default float parser is not correctly
rounded; in a workspace build bigdecimal's `serde-json` feature turns on
serde_json's `arbitrary_precision`, which parses floats exactly, but a
per-package build has neither. The release workflow (`cargo build -p
weft-server`) and the Docker image build per package, so the shipped binary
read some client JSON floats one ULP off — e.g. 900719925474100.5 and
0.009999999999990905 (probe: serde_json -> ...019 / ...431, str::parse ->
...020 / ...432). Silent precision loss at the API boundary.

- Cargo.toml: serde_json = { version = "1", features = ["float_roundtrip"] }
  (workspace dependency; Cargo.lock unchanged).
- weft-server/src/num.rs: json_float_parse_tests pins serde_json::from_str
  and Value::as_f64 to str::parse for six boundary values.
- ROADMAP: the flake to-do becomes [x] with the diagnosis, plus two to-dos
  (measure the parse-cost of float_roundtrip on the JSON routes — not
  benchmarked; run -p weft-server / -p weftdb standalone in CI), a separate
  GPU-contention flake to-do, and research to-dos (VictoriaMetrics read-only
  precedent for a /ready signal; arrow-rs #9839/#9992 to check before filing).
- CHANGELOG [Unreleased] Fixed entry.

Verified: cargo build --workspace green; clippy (5 touched crates,
--all-targets) exit 0; cargo test -p weft-server --lib 560 passed / 0 failed
(standalone, the build mode that hid the bug); cargo test --workspace
--no-fail-fast 2401 passed / 0 failed / 27 ignored. Runtime: per-package
weft-server binary, POST /api/v1/interpolate with those two values -> raw
points served back exactly as sent. Not done: no throughput number for the
feature (filed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ample [skip ci]

Follow-up to the float_roundtrip fix: the governing rule wants a number.

Measurement (scratch harness, not committed): serde_json 1.0.151, release,
1,000,000 values shaped like the compute routes' inputs (magnitudes
1e-19..1e15, ryu-formatted; 20.7 MB body), parsed as Vec<f64>, 9 timed
parses per run, median reported; taskset to one core of a Ryzen 9 7950X3D
under ~35 load, 8 runs per build on cores 2 and 9:
- without float_roundtrip: 40.0–41.7 ns/value, 175,103 values not round-tripped
- with float_roundtrip:    57.0–59.2 ns/value, 0 not round-tripped
=> about +17 ns/value (~1.42x) on the float parse alone. Route-level cost not
measured (filed).

- weft-server/src/num.rs: a_seeded_sample_of_json_floats_round_trips_exactly
  (100,000 seeded values; 0 may come back off) — the committed correctness half.
- ROADMAP: the measurement to-do is split into [x] parse-level (numbers above)
  and [ ] route-level weft-bench run. CHANGELOG states the measured scale.

Verified: clippy -p weft-server --all-targets exit 0; cargo test -p
weft-server --lib (standalone) all passed (count in PR).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release workflow and the Docker image build `-p weft-server`, whose
feature set differs from the workspace's: the serde_json float misread fixed
in 9ff571c existed only in the per-package build and every workspace-wide
test missed it. The `features` job — already the place for "default
features alone (no workspace feature unification)" — now also runs
`cargo test -p weft-server --lib --locked` (SKIP_SLOW_TESTS outside the
nightly schedule, as the job's other steps).

- .github/workflows/ci.yml: one step in `features`.
- ROADMAP: to-do ticked; a follow-up to-do for weftdb's standalone tests
  (only `cargo check`ed per package today; weigh against the 60-min budget).

Verified: the YAML parses; the exact command run locally
(SKIP_SLOW_TESTS=1 cargo test -p weft-server --lib --locked --
--test-threads=4): 561 passed, 0 failed. Not run in CI (pushes are
[skip ci] per the one-CI-run-per-phase rule; the PR's CI run exercises it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ip ci]

Research-driven residue: VictoriaMetrics' vmstorage goes read-only below
-storage.minFreeDiskSpaceBytes and vminsert re-routes writes to the other
nodes (Cluster-VictoriaMetrics.md#readonly-mode). WeftDB's probe now says the
same thing, so a balancer or ingest router can steer writes elsewhere while
reads keep being served.

- weft-server/src/lib.rs: ReadyResponse gains a flattened DiskGuardState
  { disk_refusing } (a sub-struct: clippy's struct_excessive_bools forbids a
  fourth bool; the wire shape is a top-level `disk_refusing`).
- weft-server/src/routes.rs: /ready reads the store's headroom off the async
  runtime (spawn_blocking; an undescribable filesystem reports false). A
  boolean only — the probe is unauthenticated; byte counts stay on the
  metrics-scoped headroom route. `ready` stays true.
- weft-server/tests/ready_identity.rs: impossible reserve -> 200, ready true,
  disk_refusing true; reserve 0 -> false; no store -> false.
- docs/reference.md (/ready row), CHANGELOG, DECISIONS ROB-17 point 6,
  ROADMAP sub-item ticked.

Verified: clippy -p weft-server --all-targets exit 0; ready_identity 3/3,
frame_fault 2/2, ready_poisoned (fault-injection) 1/1, weft-server lib
561/0. Runtime: real binary, reserve 9e15 -> /ready 200 with
"disk_refusing":true; reserve 1 MiB -> "disk_refusing":false.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both SDKs promise every route; ROB-17 added GET /api/v1/storage/headroom.

- weft-client: Client::headroom() -> typed Headroom { total_bytes,
  available_bytes, reserve_bytes, writable_bytes, refusing } (non_exhaustive,
  re-exported); tests/fake.rs pins the decode.
- clients/python: Client.headroom() -> dict; unit test against the fake.
- `ready()` already returns the raw body in both, so `disk_refusing` needs no
  change. CHANGELOG notes the SDK calls.

Verified: cargo test -p weft-client --test fake 7/7; clippy -p weft-client
--all-targets exit 0; python3 -m unittest discover -s clients/python/tests
21 OK (7 live skipped), and with WEFT_SERVER_BIN set to the real binary
21 OK (1 skipped). Runtime: Python Client.headroom() against a running
weft-server returned the live numbers with the default 268,435,456-byte
reserve. Not run: weft-client's live contract test (tests/live.rs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Follow-up to dd20252: the `features` job now also runs
`cargo test -p weftdb --lib --locked` outside workspace feature unification
(weftdb was only `cargo check`ed per package before).

Verified locally with the job's settings (SKIP_SLOW_TESTS=1,
--test-threads=4, shared warm target): 570 passed, 0 failed, 132 s
including the per-package compile — well inside the job's 60-minute budget.
YAML parses. Not run in CI ([skip ci]; the PR's run exercises it).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…headroom [skip ci]

weft-client/tests/live.rs `probes`: against a real weft-server, `/ready`
carries `disk_refusing: false`, and `Client::headroom()` returns a coherent
margin (total >= available > 0, writable = available - reserve, not
refusing). This is the contract CI runs on Linux after the build.

Verified: WEFT_SERVER_BIN=<debug weft-server> cargo test -p weft-client
--features arrow --test live: 7 passed (confirmed not skipped: the skip path
prints a message, which a bogus WEFT_SERVER_BIN produces and the real binary
does not); clippy -p weft-client --features arrow --all-targets exit 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… [skip ci]

- README.md `## Status`: the crash-safety row says writes are refused (507)
  before they would fill the disk past a reserve (ROB-17). The endpoint and
  variable catalog entries are in docs/reference.md (54e4cf2, e827576).
- ROADMAP: to-do that the Status table is stale today (says v0.2.1; lists
  tags and client SDKs as "Not started", though B-tags and the Python, Rust
  and R clients shipped) — owner-facing wording, left unedited here.

Verified: python3 tools/check_claims.py --registry bench/claims.json
--readme docs/reference.md --root . (the CI invocation): 11 figures, all
paired.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@physics515

Copy link
Copy Markdown
Collaborator Author

Two observations from the W8 lane, from outside this slice — no review of the change itself is implied.

1. The only red job is test (windows-latest), step "Test", and it is a new unit test:

---- metrics::tests::metrics_relabel_ingest_still_counts_bytes stdout ----

thread 'metrics::tests::metrics_relabel_ingest_still_counts_bytes' (11766) panicked at weft-server/src/metrics.rs:857:50:
Set parameter error: TryFromIntError(())
test metrics::tests::metrics_relabel_ingest_still_counts_bytes ... FAILED

That test name does not exist on main (git grep metrics_relabel_ingest_still_counts_bytes origin/main is empty), so it arrives with this PR, and the failing conversion is inside it rather than in code Linux also exercises. Everything else on the run is green — rustfmt, clippy, msrv 1.95, feature matrix, cargo-deny, cargo package, crate metadata, weft-xbench lock, claims registry, actionlint + shellcheck, rustdoc, contribution-terms checker, check (nightly, advisory) — so it is one platform and one assertion, not the shape of the change. A TryFromIntError on u64 -> u32/usize at a .set(...) call usually means a number that only overflows on the other target, or a counter that Linux leaves at zero and Windows does not.

For the record: run 42343114641 is a workflow_dispatch I fired at this head (7c0a5bb) at 06:10Z, because the head commit's message ends [skip ci] and therefore no workflow ran for the push — [skip ci] suppresses pull_request runs as well, which is why this PR has looked un-CI'd.

2. The PR is mergeable=CONFLICTING (mergeStateStatus=DIRTY), and that silently switches off most of its CI. GitHub produced no CI, Host install, Container or crash matrix run for this head at all — not queued, not action_required, absent. Only Contribution terms ran, because that one is a pull_request_target workflow. We hit the identical thing on #596: merging origin/main in and resolving the CHANGELOG.md conflict started all four within seconds, and origin/main has moved twice since 11-05 (the 0.3.1 release and the publish fix), so ## [Unreleased] in CHANGELOG.md is the likely collision.

Worth fixing (1) before (2): the moment this branch stops conflicting it gets a full roll, and that roll will show the same windows failure.

This branch has not been deployed

No deployments
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