You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
sync: merge master into main (deploys workflow self-counting fix)
Mirrors the main-sync step that auto-publish-stable.yml normally
runs after a successful PyPI publish, but done manually here
because the publish step failed earlier (PYPI_API_TOKEN secret
unset). Bringing main forward now so:
- The workflow self-counting fix (02b902a) is registered as the
active version on the default branch, unblocking future
dev → testing → review → master cycles.
- The 0.1.21 version bump (03dcc56, c20a854) is reflected on
main for parity with the publish-failed master state.
When PyPI_API_TOKEN is configured and the failed run is re-tried,
auto-publish-stable's main-sync will be a no-op (idempotent).
Conflict strategy = -X theirs (master wins on every conflict).
Copy file name to clipboardExpand all lines: CONTRIBUTING.md
+11-3Lines changed: 11 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -148,13 +148,21 @@ fonts and exercises every release-blocking path:
148
148
```
149
149
150
150
It runs T1–T10 (Node/Puppeteer auto-install), T_setup/T11 (svg-bbox
151
-
harness + `--text2path` end-to-end), T12 (byte-exact FBF compare against
152
-
the golden) and T13 (per-frame visual diff of the FBF against the input
153
-
fixtures, budget < 3 % `diffPercentage`).
151
+
harness + `--text2path` end-to-end), T12 (per-frame visual diff of the
152
+
freshly-produced FBF against the committed golden FBF, budget < 3 %
153
+
`diffPercentage` per frame) and T13 (per-frame visual diff of the FBF
154
+
against the input fixture SVGs, budget < 3 % `diffPercentage`).
155
+
156
+
T12 used to be a byte-exact compare, but the system DejaVu glyph table
157
+
drifts by sub-pixel amounts across fresh `apt-get install fonts-dejavu`
158
+
runs even on the same architecture, making byte-exact comparison
159
+
non-deterministic. A pixel-level visual invariant ("the FBF still
160
+
LOOKS like the golden") is the right invariant for this lane.
154
161
155
162
Relevant scripts and fixtures:
156
163
157
164
-`tests/fixtures/e2e/text_frames/` — 5 deterministic text fixture SVGs (DejaVu Sans/Serif + Liberation Mono only) and the golden `expected.fbf.svg`. The `*.fbf.svg` ignore rule has an explicit exception for this golden in `tests/.gitignore`; if you regenerate the golden, the exception is what keeps it tracked.
165
+
-`scripts/visual_diff_fbf_vs_golden.py` — T12 harness (extracts each frame from BOTH the produced FBF and the golden FBF, then runs `sbb-compare --json` per pair).
158
166
-`scripts/visual_diff_text_frames.py` — T13 harness (cwd-stages inputs and runs `sbb-compare --json`).
159
167
-`scripts/extract_fbf_frame.py` — XML-level extraction of one frame from an FBF.
160
168
-`scripts/pin_fbf_frame_to_png.py` — calibration utility: pins PROSKENION to frame N and renders the full FBF wrapper to PNG via `sbb-svg2png`. Useful when calibrating the T13 thresholds.
Copy file name to clipboardExpand all lines: docs/FBF_FRAME_COMPARATOR.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -257,9 +257,10 @@ The comparator shares infrastructure with `test_frame_rendering.py`:
257
257
-**testrunner.py** - Session-based testing for svg2fbf
258
258
-**scripts/extract_fbf_frame.py** - XML-level lift of `<g id="FRAME0000N">` + `<g id="SHARED_DEFINITIONS">` from an FBF.SVG into a fresh standalone SVG. Used by the T13 Docker E2E harness for per-frame comparison without playing back the animation timeline. Loses ancestor inheritance from `ANIMATION_BACKDROP > ANIMATION_STAGE > ANIMATED_GROUP > PROSKENION` and any `STAGE_FOREGROUND` / `OVERLAY_LAYER` content (empty by default).
259
259
-**scripts/pin_fbf_frame_to_png.py** - Calibration utility. Mutates a copy of an FBF.SVG (pin PROSKENION's `xlink:href`, drop the `<animate>` child) and renders to PNG via `sbb-svg2png`. Preserves the full FBF wrapper — ancestor inheritance, foreground/overlay layers, root SVG attrs — so the rendered PNG matches what a viewer truly sees at frame N. First-class FBF→PNG frame export is tracked upstream as [Emasoft/SVG-BBOX#3](https://github.com/Emasoft/SVG-BBOX/issues/3); when that lands, the pin-and-render workaround in this script becomes obsolete.
260
+
-**scripts/visual_diff_fbf_vs_golden.py** - T12 harness in the Docker E2E suite. Extracts each frame from BOTH the produced FBF and the committed golden FBF (via `extract_fbf_frame.py`), then runs `sbb-compare --json` per pair with the same defaults as T13. Pass requires every frame at or below the image-wide budget (default 3 %).
260
261
-**scripts/visual_diff_text_frames.py** - T13 harness in the Docker E2E suite. Stages input fixtures into `--workdir` and runs `sbb-compare --json` with `cwd=workdir` (sbb tools v1.0.14 sandbox file paths to `process.cwd()` and have no `--allow-paths` flag). Defaults: per-pixel-channel threshold 32/256, image-wide diffPercentage budget 3 %.
261
262
-**scripts/regen_e2e_reference.sh** - Regenerate the non-text byte-exact golden (`tests/fixtures/e2e/expected/animation.fbf.svg`) on the host. Use only when input frames or the CLI invocation in `tests/fixtures/e2e/expected/COMMAND.txt` change intentionally — version bumps are absorbed by the version-strip in the byte-exact test, so they don't require a regen.
262
-
-**scripts/regen_text_frames_golden.sh** - Regenerate the text→path byte-exact golden (`tests/fixtures/e2e/text_frames/expected.fbf.svg`) **inside Docker**. The text→path golden is platform-dependent (Linux vs macOS DejaVu Sans have different glyph metric tables), so this script always builds the same `python:3.12-slim` + `fonts-dejavu` + `fonts-liberation` image as `test_release_clean.sh` and runs `svg2fbf --text2path` inside it, ensuring byte-identical glyph paths to what T12 compares against. Never regenerate this golden on the host directly.
263
+
-**scripts/regen_text_frames_golden.sh** - Regenerate the text→path golden (`tests/fixtures/e2e/text_frames/expected.fbf.svg`) **inside Docker**. T12 is now visual-diff (not byte-exact), but the golden is still platform-pinned: a Linux-generated golden keeps the calibrated baseline near 0 % rather than the ~1-2 % cross-platform AA drift floor. The script always builds the same `python:3.12-slim` + `fonts-dejavu` + `fonts-liberation` image as `test_release_clean.sh` and runs `svg2fbf --text2path` inside it. Never regenerate this golden on the host directly.
0 commit comments