wai-vector: the independent checker, written from the extension text alone, and a text fix (D7-4) #219

Merged
dcharlot merged 5 commits from wai/d7-4-vector-checker into main 2026-10-11 16:59:32 -04:00
Owner

D7-4 of D7: the independent conformance checker for wai.graphics.vector, wai/tools/wai_vector_check.py, written from the extension text alone; its CI job; and a text fix to graphics-vector.md for five places the checker had to infer. Stacked on nothing; based on main at 3af82118, which has #217's frame vectors.

How it was written

  • Read: wai/extensions/graphics-vector.md §1–§3 as merged; the notation of integer-operators.md §2 and SPEC §7 Digests, which that text cites; and the builder brief's §22.6 D7-4 entry for the deliverable list, CI and tests only.
  • Never opened: wai/wai-vector/; the D7-2 and D7-3 PR bodies and commits; review A's core.py; the design prototypes.
  • Order of the commits.
    1. 99c12e84 is the checker. I committed it before reading any corpus file's contents; until then I had seen only file names.
    2. dfa4d5d4 is the corpus driver. I wrote it from vector-conformance/README.md's layout and committed it before the first comparison run.
    3. Every later change to the checker is listed under Disagreements.
  • One input read from an expected file. The alpha arithmetic vector's input is {"op":"alpha"}, and the v values it probes are listed only in expected/arith/alpha.json. The driver reads those v values and recomputes both quantisers at them.

What it does

Python ≥ 3.11, standard library only, run with python3 -I. It shares no code with the crate.

  • Formats. It parses WOS1 and WVG1 and writes each back from its fields, with every count derived and every zero field written as 0. It parses the §2.10 sidecar with a strict parser, re-serialises it, and compares bytes.

  • Refusals. It applies §2.7's steps 1–9 and §2.1's checks 1–11, and reports the code and step of the first failure.

  • Load-time arithmetic. It computes the §3.4(a) interval check and the §3.4(b) cost, using a sweep in which ends come before starts at equal ticks.

  • Rendering. It renders R(P, S, z, r, g) using the closed forms in Python's big integers:

    • flattening by the closed form, ⌊(…)/4^n⌋ and ⌊(…)/8^n⌋;
    • the row crossing X(y) = xt + ⌊(y − yt)·dx/dy⌋;
    • the column crossing ya + ⌊(xc − xa)(yb − ya)/(xb − xa)⌋.

    It never uses the 32-bit forward-difference forms, so agreement on every frame confirms the DDA identity of §3.5–§3.6 on the corpus.

  • Bounds. It asserts §3.12's bounds on every value it forms, and in addition §3.7's per-fill D_r ≤ 256·p and |d|, |v| ≤ 512·D_r.

  • Self-test. It first recomputes the text's own worked examples and claims:

    • the §3.8 triangle gives 1280 and 512;
    • div255 is half-up over [0, 65025], and div255(255x) = x;
    • R_rat's quotient–remainder form;
    • the WOS1 length at the caps is 31,457,312;
    • the reversal identity P1.

    Separately, the stated largest sidecar, 111,715 bytes, reproduces with each field at its own cap.

  • CI. The job checker in wai-vector.yml runs on linux with Python 3.11. wai/tools/wai_vector_*.py was already in both path filters. The concurrency block is unchanged, and the job runs check-workflow-concurrency.sh.

Agreement

python3 -I tools/wai_vector_check.py corpus vector-conformance under Python 3.11.17 on the dev Mac, 2 min 43 s:

what agreement
expected files recomputed byte for byte: every group, every frame at every listed size and rate, the 3840 × 2160 clock frames included (none sampled) 319 of 319
payloads and outline sets rewritten to their own bytes 74 of 74
refusal steps that a vector's name or description pins (sN-, "check N", "(step X before …)"), reported at that step 196 of 196
sha256.json entries recomputed (the div255 table, every frame list and clip) 66 of 66
digest sidecars built from the frames of every rendering payload, parsed, rewritten and checked in verify mode, plus three corruptions each giving sidecar_malformed, sidecar_mismatch and layer_mismatch 50

The corpus carries no §2.10 sidecar, so the sidecar row exercises the checker's sidecar code against real payloads. It is not a comparison with the crate.

Disagreements

The first comparison run produced two, and both were faults in the checker. The text is clear at each.

  1. A crash. The run crashed at the first accepted payload that names a set. The Wos1 record lacked the slot that the load stores a set's bytes in. This is a checker bug, fixed in fd3de87f.
  2. text_hash, 20 vectors. The field was text_hash; every other field of these files agreed.
    • The vectors:
      • canonical/{clusters, every-table, groups, groups-in-order, held, minimal, ruby, shared, sizes-rates};
      • cost/{attack-b-one-item, ceiling, group, reused-path, touching-windows};
      • geometry/{empty-glyph-edge, x-high-edge, x-low-edge, y-high-edge};
      • refusals/{rich, s5f-string-newline}.
    • An example: on canonical/minimal the checker gave a980ddb4…, and the expected value is e3b0c442…, the SHA-256 of nothing, since that payload has no blocks.
    • The clause is §2.11: "the SHA-256 of the TEXTS table followed by the STRINGS area, exactly as carried".
    • Classification: a checker bug. I hashed from the TEXTS offset up to STRINGS, which also takes in ITEMS, GLYPHS and CLUSTERS. The text says the table, and is clear. Fixed in fd3de87f. I did not copy the expected value: the fix is the slice §2.11 names.

There are no crate bugs, and no disagreement caused by the text. After the fix, every file agrees, and the rendering groups were first compared after it.

Text fix (9b6a4c58, a separate commit)

There are five places where the checker had to infer a rule the text does not state. For the first four, the corpus pins the same reading the checker took. The fifth no vector reaches.

  1. §2.7 step 1 and §2.1 check 1. A payload shorter than its 80-byte header, or a set shorter than its 32-byte header, is refused at the first step. The text named only the fields such a file cannot hold. refusals/s1-short and wos1-short pin this.
  2. §2.1 check 2. The counts are taken one at a time, each against its whole range. So n_glyphs = 0 with points_total past its cap is outline_malformed, which wos1-zero-glyphs-before-points-cap pins. The old sentence set the cap rule and the zero rule apart, which reads as two passes.
  3. §2.3 PATH. n_contours's upper bound, n_points, is a later field, and step 4 says no field's rule reads one. The text now says n_contours ≥ 1 at n_contours, and n_contours ≤ n_points at n_points, as §2.0 places them.
  4. §2.4, group begin. "rule 0 with no clip" is now stated as checked at ref, the later field. refusals/s4-item-rule-no-clip pins "at ref".
  5. §2.10, the probe set. Level 1 took the first and last frame even at a rate where the document has no frame, that is where the first exceeds the last. The sidecar's own range check then refuses the tool's sidecar.
    • I found this by construction: canonical/minimal with t0 = 1 and dur = 100 at 25 fps loads, and gets level-1 probes g = 0 and g = 1, both out of range.
    • Level 1 now applies only when the document has a frame at that rate.
    • A document with no frame at any pair the tool covers has no sidecar, because probes holds at least one entry.

The checker implements fix 5. No corpus vector has an empty range, so fix 5 changes no comparison.

Falsifications

The checker was committed before these. Each one is a scratch copy of the committed checker with one rule broken, run against the worktree corpus.

# rule broken result
F1 §3.6 RS3: the column crossing rounded up instead of floored (brief (a)) The self-test stops first: the text's §3.8 triangle gives [256, 1024], not [512, 1280]. Run past the self-test, 29 of 49 rendering files differ, among them fills/{triangle-af5, curves, star-*, random-*, negative, left-fold, comb-16382}, runs/{marks, run-4096}, composite/{clip-*, groups-depth-4, overlap-opacity}, motion/lower-third and all four slicing/*
F2 §3.7's D_r ≤ 256·p, tightened by one (brief (b)) Over the whole corpus, fills/comb-16382 and its sha256.json entry fail, at the bound, and nothing else does (318 of 319). The comb attains D_r = 256·p exactly (gap 0)
F3 §2.7: the exact length (step 3) checked before the caps (step 2) 19 of 207 refusal files differ, every s2-* vector, which give payload_malformed where too_large is expected; 19 pinned steps are reported as 3, not 2
F4 §3.4(b) step 5: starts before ends at equal ticks cost/touching-windows is refused as payload_malformed at step 9; the cost of the other 310 files does not change
F5 §3.9: the opacity applied after the coverage composite/j3-triples and composite/overlap-opacity differ in their RGBA8P, RGBA8S and clip digests

Bounds reached

These are the largest values the checker formed over the corpus, against §3.12:

  • D_r = 4,193,792 = 256 × 16,382, on the comb;
  • the cubic flattening numerator 9.0 × 10^15, below 2^57, at level 10;
  • the quadratic flattening numerator 2.2 × 10^12, below 2^43, at level 9;
  • linear interpolation 3.6 × 10^16, below 2^56;
  • |L| 2^24, against its bound of 2^30;
  • the run cost 4.3 × 10^9, below 2^40;
  • compositing products reach 65,025.

Checks

  • scripts/check-public-names.sh, with the private denylist from the environment: clean, over the whole tree and over the changed files.
  • scripts/check-comparative-prose.sh: clean.
  • scripts/check-wai-section-refs.py: clean, after the text fix.
  • scripts/check-no-vanity-metrics.sh: clean.
  • scripts/check-workflow-concurrency.sh: 22 workflows, each grouped per ref.

Not covered

  • The JSON authoring form (§2.12) is informative, and the text does not define it, so the checker does not parse it.
  • §4–§6 are headings in this revision. The checker computes block identities and text_hash (§2.11), but no projection or transcript.

🤖 Generated with Claude Code

D7-4 of D7: the independent conformance checker for `wai.graphics.vector`, `wai/tools/wai_vector_check.py`, written from the extension text alone; its CI job; and a text fix to `graphics-vector.md` for five places the checker had to infer. Stacked on nothing; based on `main` at 3af82118, which has #217's frame vectors. ## How it was written - **Read:** `wai/extensions/graphics-vector.md` §1–§3 as merged; the notation of `integer-operators.md` §2 and SPEC §7 *Digests*, which that text cites; and the builder brief's §22.6 D7-4 entry for the deliverable list, CI and tests only. - **Never opened:** `wai/wai-vector/`; the D7-2 and D7-3 PR bodies and commits; review A's `core.py`; the design prototypes. - **Order of the commits.** 1. 99c12e84 is the checker. I committed it before reading any corpus file's contents; until then I had seen only file names. 2. dfa4d5d4 is the corpus driver. I wrote it from `vector-conformance/README.md`'s layout and committed it before the first comparison run. 3. Every later change to the checker is listed under *Disagreements*. - **One input read from an expected file.** The `alpha` arithmetic vector's input is `{"op":"alpha"}`, and the `v` values it probes are listed only in `expected/arith/alpha.json`. The driver reads those `v` values and recomputes both quantisers at them. ## What it does Python ≥ 3.11, standard library only, run with `python3 -I`. It shares no code with the crate. - **Formats.** It parses `WOS1` and `WVG1` and writes each back from its fields, with every count derived and every zero field written as 0. It parses the §2.10 sidecar with a strict parser, re-serialises it, and compares bytes. - **Refusals.** It applies §2.7's steps 1–9 and §2.1's checks 1–11, and reports the code and step of the first failure. - **Load-time arithmetic.** It computes the §3.4(a) interval check and the §3.4(b) cost, using a sweep in which ends come before starts at equal ticks. - **Rendering.** It renders R(P, S, z, r, g) using the closed forms in Python's big integers: - flattening by the closed form, `⌊(…)/4^n⌋` and `⌊(…)/8^n⌋`; - the row crossing `X(y) = xt + ⌊(y − yt)·dx/dy⌋`; - the column crossing `ya + ⌊(xc − xa)(yb − ya)/(xb − xa)⌋`. It never uses the 32-bit forward-difference forms, so agreement on every frame confirms the DDA identity of §3.5–§3.6 on the corpus. - **Bounds.** It asserts §3.12's bounds on every value it forms, and in addition §3.7's per-fill `D_r ≤ 256·p` and `|d|, |v| ≤ 512·D_r`. - **Self-test.** It first recomputes the text's own worked examples and claims: - the §3.8 triangle gives 1280 and 512; - `div255` is half-up over [0, 65025], and `div255(255x) = x`; - `R_rat`'s quotient–remainder form; - the `WOS1` length at the caps is 31,457,312; - the reversal identity P1. Separately, the stated largest sidecar, 111,715 bytes, reproduces with each field at its own cap. - **CI.** The job `checker` in `wai-vector.yml` runs on `linux` with Python 3.11. `wai/tools/wai_vector_*.py` was already in both path filters. The concurrency block is unchanged, and the job runs `check-workflow-concurrency.sh`. ## Agreement `python3 -I tools/wai_vector_check.py corpus vector-conformance` under Python 3.11.17 on the dev Mac, 2 min 43 s: | what | agreement | |---|---| | expected files recomputed byte for byte: every group, every frame at every listed size and rate, the 3840 × 2160 clock frames included (none sampled) | **319 of 319** | | payloads and outline sets rewritten to their own bytes | 74 of 74 | | refusal steps that a vector's name or description pins (`sN-`, "check N", "(step X before …)"), reported at that step | 196 of 196 | | `sha256.json` entries recomputed (the `div255` table, every frame list and clip) | 66 of 66 | | digest sidecars built from the frames of every rendering payload, parsed, rewritten and checked in verify mode, plus three corruptions each giving `sidecar_malformed`, `sidecar_mismatch` and `layer_mismatch` | 50 | The corpus carries no §2.10 sidecar, so the sidecar row exercises the checker's sidecar code against real payloads. It is not a comparison with the crate. ## Disagreements The first comparison run produced two, and both were faults in the checker. The text is clear at each. 1. **A crash.** The run crashed at the first accepted payload that names a set. The `Wos1` record lacked the slot that the load stores a set's bytes in. This is a checker bug, fixed in fd3de87f. 2. **`text_hash`, 20 vectors.** The field was `text_hash`; every other field of these files agreed. - The vectors: - `canonical/{clusters, every-table, groups, groups-in-order, held, minimal, ruby, shared, sizes-rates}`; - `cost/{attack-b-one-item, ceiling, group, reused-path, touching-windows}`; - `geometry/{empty-glyph-edge, x-high-edge, x-low-edge, y-high-edge}`; - `refusals/{rich, s5f-string-newline}`. - An example: on `canonical/minimal` the checker gave `a980ddb4…`, and the expected value is `e3b0c442…`, the SHA-256 of nothing, since that payload has no blocks. - The clause is §2.11: "the SHA-256 of the `TEXTS` table followed by the `STRINGS` area, exactly as carried". - **Classification: a checker bug.** I hashed from the `TEXTS` offset up to `STRINGS`, which also takes in `ITEMS`, `GLYPHS` and `CLUSTERS`. The text says the table, and is clear. Fixed in fd3de87f. I did not copy the expected value: the fix is the slice §2.11 names. There are **no crate bugs**, and **no disagreement caused by the text**. After the fix, every file agrees, and the rendering groups were first compared after it. ## Text fix (9b6a4c58, a separate commit) There are five places where the checker had to infer a rule the text does not state. For the first four, the corpus pins the same reading the checker took. The fifth no vector reaches. 1. **§2.7 step 1 and §2.1 check 1.** A payload shorter than its 80-byte header, or a set shorter than its 32-byte header, is refused at the first step. The text named only the fields such a file cannot hold. `refusals/s1-short` and `wos1-short` pin this. 2. **§2.1 check 2.** The counts are taken one at a time, each against its whole range. So `n_glyphs = 0` with `points_total` past its cap is `outline_malformed`, which `wos1-zero-glyphs-before-points-cap` pins. The old sentence set the cap rule and the zero rule apart, which reads as two passes. 3. **§2.3 `PATH`.** `n_contours`'s upper bound, `n_points`, is a later field, and step 4 says no field's rule reads one. The text now says `n_contours ≥ 1` at `n_contours`, and `n_contours ≤ n_points` at `n_points`, as §2.0 places them. 4. **§2.4, group begin.** "`rule` 0 with no clip" is now stated as checked at `ref`, the later field. `refusals/s4-item-rule-no-clip` pins "at ref". 5. **§2.10, the probe set.** Level 1 took the first and last frame even at a rate where the document has no frame, that is where the first exceeds the last. The sidecar's own range check then refuses the tool's sidecar. - I found this by construction: `canonical/minimal` with `t0 = 1` and `dur = 100` at 25 fps loads, and gets level-1 probes `g = 0` and `g = 1`, both out of range. - Level 1 now applies only when the document has a frame at that rate. - A document with no frame at any pair the tool covers has no sidecar, because `probes` holds at least one entry. The checker implements fix 5. No corpus vector has an empty range, so fix 5 changes no comparison. ## Falsifications The checker was committed before these. Each one is a scratch copy of the committed checker with one rule broken, run against the worktree corpus. | # | rule broken | result | |---|---|---| | F1 | §3.6 RS3: the column crossing rounded up instead of floored (brief (a)) | The self-test stops first: the text's §3.8 triangle gives [256, 1024], not [512, 1280]. Run past the self-test, **29 of 49** rendering files differ, among them `fills/{triangle-af5, curves, star-*, random-*, negative, left-fold, comb-16382}`, `runs/{marks, run-4096}`, `composite/{clip-*, groups-depth-4, overlap-opacity}`, `motion/lower-third` and all four `slicing/*` | | F2 | §3.7's `D_r ≤ 256·p`, tightened by one (brief (b)) | Over the whole corpus, `fills/comb-16382` and its `sha256.json` entry fail, at the bound, and nothing else does (318 of 319). The comb attains `D_r = 256·p` exactly (gap 0) | | F3 | §2.7: the exact length (step 3) checked before the caps (step 2) | **19 of 207** refusal files differ, every `s2-*` vector, which give `payload_malformed` where `too_large` is expected; 19 pinned steps are reported as 3, not 2 | | F4 | §3.4(b) step 5: starts before ends at equal ticks | `cost/touching-windows` is refused as `payload_malformed` at step 9; the cost of the other 310 files does not change | | F5 | §3.9: the opacity applied after the coverage | `composite/j3-triples` and `composite/overlap-opacity` differ in their `RGBA8P`, `RGBA8S` and clip digests | ## Bounds reached These are the largest values the checker formed over the corpus, against §3.12: - `D_r` = 4,193,792 = 256 × 16,382, on the comb; - the cubic flattening numerator 9.0 × 10^15, below 2^57, at level 10; - the quadratic flattening numerator 2.2 × 10^12, below 2^43, at level 9; - linear interpolation 3.6 × 10^16, below 2^56; - `|L|` 2^24, against its bound of 2^30; - the run cost 4.3 × 10^9, below 2^40; - compositing products reach 65,025. ## Checks - `scripts/check-public-names.sh`, with the private denylist from the environment: clean, over the whole tree and over the changed files. - `scripts/check-comparative-prose.sh`: clean. - `scripts/check-wai-section-refs.py`: clean, after the text fix. - `scripts/check-no-vanity-metrics.sh`: clean. - `scripts/check-workflow-concurrency.sh`: 22 workflows, each grouped per ref. ## Not covered - The JSON authoring form (§2.12) is informative, and the text does not define it, so the checker does not parse it. - §4–§6 are headings in this revision. The checker computes block identities and `text_hash` (§2.11), but no projection or transcript. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
wai/tools/wai_vector_check.py, Python 3.11+, standard library only, run with
python3 -I. Written from wai/extensions/graphics-vector.md sections 1-3, the
notation of integer-operators section 2 and SPEC section 7's digests, before any
comparison with the corpus and without reading the reference crate.

It parses and rewrites WOS1 and WVG1 from their fields, applies section 2.7's
refusal order with the code and step of the first failure, computes section
3.4(a)'s interval check and 3.4(b)'s cost, renders R(P, S, z, r, g) by the
closed-form crossings in big integers, checks the digest sidecar, and asserts
section 3.12's bounds on every value it forms. The corpus driver follows in its
own commit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Maps each file under vector-conformance/ to the computations of the previous
commit, from the corpus README's layout: the expected file's JSON for every
payload, outline set, arithmetic input and curve list, written canonically and
compared byte for byte; the rewrite of every payload and set to its own bytes;
each refusal's step where the vector's name or description pins one; and every
digest of sha256.json. Committed before the first comparison run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The first comparison run found two faults in the checker, both mine; the text is
clear on each:
  - text_hash hashed from the TEXTS offset up to STRINGS, taking in ITEMS, GLYPHS
    and CLUSTERS. Section 2.11: the TEXTS table followed by the STRINGS area. Fixed.
  - the Wos1 record lacked the slot the load stores a set's bytes in (a crash).

Also:
  - section 3.7's per-fill bound D_r <= 256*p is asserted for every fill, with p its
    stored point count; fills/comb-16382 attains it (gap 0);
  - the corpus carries no section 2.10 sidecar, so for every accepted payload that
    renders, the driver builds the authoring tool's sidecar from the frames, parses
    and rewrites it, checks every probe and clip, and requires sidecar_malformed,
    sidecar_mismatch and layer_mismatch from three corruptions;
  - the probe set's level 1 takes the first and last frame only when the document
    has a frame at that rate, per the text fix that follows.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Found by writing the independent checker (D7-4) from this text alone. In each
place the corpus already pins the reading the checker took; the text now states it.

  - section 2.7 step 1 and section 2.1 check 1: a payload shorter than its 80-byte
    header, and a set shorter than its 32-byte header, are refused at the first
    step (refusals/s1-short and wos1-short pin this). The text named only the
    fields such a file cannot hold.
  - section 2.1 check 2: the counts are taken one at a time, each against its whole
    range, so n_glyphs = 0 with points_total past its cap is outline_malformed
    (wos1-zero-glyphs-before-points-cap). The sentence listed the cap rule and the
    zero rule apart, which reads as two passes.
  - section 2.3 PATH: n_contours' upper bound n_points is a later field, which step
    4 says no field's rule reads. It is now stated as n_contours >= 1 at n_contours
    and n_contours <= n_points at n_points, as section 2.0 places it.
  - section 2.4 ITEM, group begin: 'rule 0 with no clip' is checked at ref, the
    later field (refusals/s4-item-rule-no-clip pins 'at ref').
  - section 2.10, the probe set: level 1 took the first and last frame even for a
    rate at which the document has none (the first exceeding the last), and the
    sidecar's own range check then refuses the tool's sidecar. No corpus vector has
    an empty range, so this one was found only by construction: canonical/minimal
    with t0 = 1 and dur = 100 at 25 fps loads, and gets level-1 probes g = 0 and 1.
    Level 1 now applies when the document has a frame at the rate, and a document
    with no frame at any covered pair has no sidecar, since probes holds at least
    one entry.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
ci(wai-vector): the independent checker as its own job (D7-4)
All checks were successful
standards workspaces build + test / arl-rs (pull_request) Successful in 1m11s
standards workspaces build + test / eoc-rs (pull_request) Successful in 2m5s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m31s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 1m12s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 1m10s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m17s
standards workspaces build + test / sense-rs (pull_request) Successful in 1m14s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m24s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 2m32s
WAI section references / cited sections exist (pull_request) Successful in 10s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 4m21s
wai-vector vector graphics / linux-x86_64 (pull_request) Successful in 54s
wai-vector vector graphics / wasm32 under Node (pull_request) Successful in 22s
wai-vector vector graphics / wasm32-wasip2 (wasmtime) (pull_request) Successful in 31s
wai-vector vector graphics / fuzz, peak allocation, comparison count (pull_request) Successful in 16s
workflow hygiene / every workflow supersedes its own queue (pull_request) Successful in 4s
wai-vector vector graphics / independent checker (Python) (pull_request) Successful in 2m19s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 5m13s
standards workspaces build + test / aac-rs (pull_request) Successful in 3m48s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 1m30s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 43s
standards workspaces build + test / map-rs (pull_request) Successful in 43s
standards workspaces build + test / mesh-rs (pull_request) Successful in 45s
standards workspaces build + test / openpay (pull_request) Successful in 3m18s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 3m11s
wai-vector vector graphics / linux-aarch64 (pull_request) Successful in 1m12s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 3m18s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 8m22s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 3m45s
wai-vector vector graphics / macos-arm64 (pull_request) Successful in 1m43s
ca88e15bc6
The job `checker` runs wai/tools/wai_vector_check.py under Python 3.11 on the linux
runner: every expected file of vector-conformance/ recomputed byte for byte, every
frame rendered, every payload and set rewritten to its own bytes, every digest of
sha256.json recomputed. The path filters already name wai/tools/wai_vector_*.py; the
concurrency block is unchanged, and the job runs check-workflow-concurrency.sh.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Transaction-Science/open-standards!219
No description provided.