Commit Graph
100 Commits
Author SHA1 Message Date
Brandon ThomasandClaude Opus 5.5 e3873ae92f CI: pushes to main no longer cancel the FreeBSD / Windows ARM64 run in progress
Merges land faster than the hour-long FreeBSD job, so every main run was
cancelled and main went unverified. Only PR pushes cancel now.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 11:37:20 -04:00
Brandon Thomas 9144eef269 Merge remote-tracking branch 'origin/main' into integrate5
# Conflicts:
#	docs/preferences.md
2026-10-09 10:33:41 -04:00
Brandon ThomasandClaude Opus 5.5 f1a31fb9eb i18n: drop the Ukrainian row for the removed Ease Presets panel (#401 follow-up)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 10:33:17 -04:00
Brandon Thomas 4047ea94ea Merge pull request #398 from FeiLiuEM/ui-i18n
i18n: translate the interface below the menu bar (panels, dialogs, tooltips)

# Conflicts:
#	crates/ui-egui/src/lib.rs
#	docs/preferences.md
2026-10-09 10:22:32 -04:00
Brandon Thomas a0c6a6e96e Merge pull request #401 from dmatviichuk/i18n/ukrainian
i18n: add Ukrainian (uk) menu translation

# Conflicts:
#	crates/text/src/fonts.rs
#	docs/preferences.md
2026-10-09 10:22:14 -04:00
Brandon ThomasandClaude Opus 5.5 ea785355cd GPU: note why Posterize's division correction is an fma (#405 follow-up)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 10:22:01 -04:00
Brandon Thomas 9b852b62af Merge pull request #405 from sanyamsingh001/fix/gpu-threshold-parity
Fix GPU Posterize threshold parity

# Conflicts:
#	contributors/people.toml
2026-10-09 10:21:53 -04:00
Brandon Thomas 9b62a4a833 Merge pull request #402 from cdinhoo/codex/parameter-row-spacing
UI: Compact and align effect parameter rows
2026-10-09 10:21:43 -04:00
Brandon Thomas e12bf5ca7d Merge pull request #289 from storytold/fix/227-shape-effect-points
Effects: effect points on shape layers start at the layer centre (#227)

# Conflicts:
#	crates/ui-egui/src/panels/puppet_tool.rs
#	crates/ui-egui/src/panels/viewer.rs
2026-10-09 09:32:13 -04:00
Brandon Thomas 2c199d55f8 Merge pull request #384 from storytold/feat/297-image-sequences
Import: image sequences with a Sequence option, ranges, folders and missing frames (#297)

# Conflicts:
#	docs/parity.md
2026-10-09 09:31:51 -04:00
Brandon Thomas 14417c0400 Merge pull request #354 from thanhcong2k7/fix/ui-dock-focus-outline-zorder
UI: Draw panel focus outline after panel body to prevent clipping
2026-10-09 09:31:43 -04:00
Brandon Thomas 3d1b87f0d4 Merge pull request #345 from thanhcong2k7/fix/ui-commit-text-on-tool-switch
UI: Commit text edit session when switching away from Type tool
2026-10-09 09:31:42 -04:00
Brandon Thomas e52ff9ab95 Merge pull request #342 from HEOJUNFO/fix-313-single-pin-jump
Puppet: the first pin no longer turns the layer about it (#313)
2026-10-09 09:31:41 -04:00
Brandon Thomas d5beb4b3c4 Merge pull request #344 from MindlessRuff/fix/exr-over-range
fix(export): keep values above 1.0 in EXR output (#339)
2026-10-09 09:31:40 -04:00
Brandon Thomas f87f3b3e1a Merge pull request #357 from HEOJUNFO/fix-317-aiff-float
Export: AIFF 32-bit float writes AIFF-C fl32 instead of 24-bit (#317)
2026-10-09 09:31:38 -04:00
Brandon Thomas b6ba84d828 Merge pull request #353 from cjcwwww/i18n/zh-hans-terminology
i18n: match the Simplified Chinese labels to the installed 26.5.0 UI
2026-10-09 09:28:40 -04:00
Brandon Thomas a990432962 Merge pull request #312 from FeiLiuEM/font/cjk-locale
text, ui: the CJK fallback fonts follow the interface language
2026-10-09 09:28:38 -04:00
Brandon Thomas 64d1965648 Merge pull request #319 from thanhcong2k7/main
fix: rewrite Audio Spectrum to match After Effects linear frequency/amplitude model
2026-10-09 09:28:36 -04:00
Brandon ThomasandClaude Opus 5.5 3df56ce9d9 MCP: describe_command and execute_command accept id again (#365 follow-up)
#365 rejects arguments missing from a tool's schema; both tools read `id`
as an alias of `command`, so declare it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 09:25:25 -04:00
Brandon Thomas 7b41793ab4 Merge pull request #365 from storybored379/feat/mcp-conventions
MCP: core tools, resources, render progress and cancellation
2026-10-09 09:25:25 -04:00
Brandon Thomas 754e998989 Merge pull request #374 from storytold/fix/368-tflite-budgets
Fix #368: tflite rejects models whose scratch or work exceeds a budget
2026-10-09 09:25:24 -04:00
Brandon Thomas a3cfc3e014 Merge pull request #388 from KazW/fix/mediapipe-crop-sampling
segment: sample crops like MediaPipe's ImageToTensor; no overflow in crop
2026-10-09 09:25:23 -04:00
Brandon Thomas d3684216e4 Merge pull request #373 from storytold/fix/367-nms-degenerate
Fix #367: weighted_nms terminates on NaN or zero-area boxes
2026-10-09 09:25:22 -04:00
Brandon Thomas 68d94b8031 Merge pull request #281 from XusBadia/dmg-background
macOS DMG: branded window background and icon layout
2026-10-09 09:20:44 -04:00
Brandon ThomasandClaude Opus 5.5 29c4d3ad15 Revert #200 (text always continuously rasterised): breaks kinetic_typography
The QA test's time-remapped precomp no longer matches the precomp rendered
directly (crates/automation/tests/qa/kinetic.rs:78); FreeBSD CI has been red
since. Reverting until the PR is reworked against that test.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 08:22:58 -04:00
Brandon ThomasandClaude Opus 5.5 cae67546dd Media: checked offset and as_chunks_mut in the stereo interleave (#305 follow-up)
clippy 1.99 flags chunks_exact_mut with a constant size; the skip offset
was also an unchecked slice.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:45:44 -04:00
Brandon Thomas 48dc1ec4e5 Merge pull request #200 from EthanSuquet/fix/text-scale-continuous-raster
Render: text layers are always continuously rasterised
2026-10-09 00:21:56 -04:00
Brandon Thomas 7434cfb798 Merge pull request #305 from storytold/fix/274-audio-stutter
Media: footage audio at another sample rate no longer stutters (#274)
2026-10-09 00:21:54 -04:00
Brandon ThomasandClaude Opus 5.5 e4d1a4494f G3: audio scrub test waits on the clock, not a step count (flaky under load)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:17:53 -04:00
Brandon ThomasandClaude Opus 5.5 742833bfa4 i18n: rustfmt the language table (#309 follow-up)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:15:20 -04:00
Brandon Thomas 1f5218378c Merge pull request #298 from midasdf/fix/vertical-japanese-punctuation
M9: place Japanese vertical punctuation using font metrics
2026-10-09 00:04:52 -04:00
Brandon Thomas f43b956382 Merge pull request #310 from DWAA1660/fix/285-empty-glyph-fallback
Text: fallback skips a font whose glyph for the character is empty (#285)
2026-10-09 00:04:50 -04:00
Brandon Thomas 2a968c4d0e Merge pull request #309 from FeiLiuEM/i18n/zh-hans
i18n: add Simplified and Traditional Chinese (zh-hans, zh-hant) UI translation
2026-10-09 00:04:49 -04:00
Brandon ThomasandClaude Opus 5.5 5cb3ee5b8a Docs: headless pitfalls point at mcp --autosave (#266 follow-up)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:04:47 -04:00
Brandon ThomasandClaude Opus 5.5 459c8987fe MCP: add the autosave _meta without IndexMut (#280 follow-up)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:04:47 -04:00
Brandon ThomasandClaude Opus 5.5 11848da0a1 App: only a held lock means another launch is starting (#283 follow-up)
A filesystem without lock support returned an error from try_lock, which
read as 'held' and disabled crash detection for good.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 00:04:47 -04:00
Brandon Thomas 5cce817d4d Merge pull request #266 from pat-the-wizard/docs/agent-pitfalls
Docs: pitfalls for agents driving EffectCraft over MCP
2026-10-08 23:51:24 -04:00
Brandon Thomas 5d5da086c8 Merge pull request #283 from prekabreki/fix/launch-guard-concurrent-and-gl-stuck
App: a second copy opening, or OpenGL that fails, no longer strands Window Graphics
2026-10-08 23:51:22 -04:00
Brandon Thomas 6c838325fa Merge pull request #280 from jonassneu/fix/mcp-autosave
MCP: preserve unsaved work across server restarts (#258)

# Conflicts:
#	apps/effectcraft-cli/tests/cli.rs
#	contributors/people.toml
2026-10-08 23:51:21 -04:00
Brandon Thomas db4f6df89d Merge pull request #213 from midasdf/fix/type-tool-long-press
M9: open grouped tool flyouts on long press

# Conflicts:
#	ROADMAP.md
2026-10-08 23:50:55 -04:00
Brandon Thomas 12689aa288 Merge pull request #294 from pat-the-wizard/docs/261-environment-light
3D: layer.newLight lists the Environment light and how to set its source; parity notes reflections (#261)
2026-10-08 23:50:36 -04:00
Brandon Thomas cb2779255b Merge pull request #256 from switch87/readme-gentoo
README: install on Gentoo from the ::snakebyte overlay
2026-10-08 23:50:33 -04:00
Brandon Thomas a3c5c1ef0d Merge pull request #323 from Oldrich333/fix/300-render-out-cwd
CLI: render --out is relative to the working directory (#300)
2026-10-08 23:50:31 -04:00
Brandon ThomasandClaude Opus 5.5 254192be57 G3: GL adapters pass the WebGL2-limits decline test (FreeBSD CI)
On FreeBSD the only adapter is llvmpipe over GL, which GpuContext::new
declines for its backend before checking limits; accept either reason.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 23:19:24 -04:00
0f2814de8c README Downloads: where to get it first, then builds with Windows before macOS (#291)
Co-authored-by: Brandon Thomas <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-08 09:50:59 -04:00
e2a5c99a26 Release: FreeBSD x86_64, Flatpak x86_64 + aarch64, AppImage zsync updates; README Downloads (#287)
- release.yml: `freebsd` job (FreeBSD 14.3 VM, the freebsd.yml packages) running the new
  packaging/freebsd/package.sh; `flatpak` matrix (x86_64 on ubuntu-24.04, aarch64 on
  ubuntu-24.04-arm) repackaging the Linux tarball with packaging/linux/flatpak-bundle.sh and the
  new ai.storyteller.effectcraft.bundle.yml; both added to the draft release's needs.
- AppImages embed gh-releases-zsync update information and ship a .zsync beside them; the Linux
  job installs zsync and checks both.
- version, Linux and web jobs drop `environment: release` (they read no secrets), so a dispatch on
  a branch is a full dry run of every unsigned job; the draft release still needs the signed jobs.
- Flatpak finish-args documented and shared by the bundle and Flathub manifests (lint checks they
  match); audio, GPU, portals, xdg-pictures/videos/documents, network for the optional model
  downloads. The Flathub manifest now also installs effectcraft-cli.
- packaging-lint runs the FreeBSD layout dry run.
- README: Downloads section (every file a release ships) and nav entry; docs/releasing.md updated.

Co-authored-by: Brandon Thomas <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-08 09:48:00 -04:00
Brandon ThomasandClaude Opus 5.5 172b7cfcc0 Release CI: macOS job on macos-15-xlarge
Custom macOS larger runners in a runner group do not pick up jobs; the
built-in M2 Pro label does. Only release.yml uses it, and the
actions_macos_xl budget caps the monthly spend.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 22:08:03 -04:00
Brandon ThomasandClaude Opus 5.5 904c0671b1 Release CI: macOS job on the org macos-release runner
The standard macOS runners are shared with all CI and queue for an hour or
more. The macos-release runner (GitHub-hosted M2 Pro) is in a runner group
usable only by release.yml on the release branch, with a monthly spend cap
on the actions_macos_xl SKU.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-07 21:54:58 -04:00
Brandon ThomasandClaude Opus 5.5 ab5ebfbae1 About: contributor and model credits compiled in (grab bag + table, self-submitted names) (#228)
* About: contributors compiled in from contributors.json (grab bag + table, sortable, name toggle)

About EffectCraft now has tabs About · Contributors · Models, following the craftrules standard
(standards/contributors.md): contributors/contributors.json is generated by
craftrules/scripts/contributors.py and baked into the binary by crates/ui-egui/build.rs as static
tables. Each contributor line: @username, opt-in display/real name, PRs, commits, lines +/−/Δ,
binary assets +/−, first/last commit. Sortable by every column; alphabetical ignores case and
the leading @. Every control registers an automation id (about.tab.*, about.credits.*).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Contributors: self-submitted names in contributors/people.toml; AGENTS.md credit-yourself section

build.rs reads contributors/people.toml next to the generated contributors.json and shows a name only
for entries the generator verified as written by that person (craftrules standards/contributors.md).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Contributors: regenerate (verified people.toml entries)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-07 21:16:47 -04:00
Brandon ThomasandClaude Opus 5.5 3af4649429 Rename PrintCraft to PdfCraft (storytold/pdfcraft) (#207)
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-07 15:37:26 -04:00
Brandon Thomas 588d269d29 Effects: adding an effect brings up Effect Controls (#87)
effect.apply / effect.applyLast run through the menu dispatcher (Effect
menu, Last Effect, an effect dropped on a Timeline layer or on Effect
Controls) now bring up Effect Controls, opened if closed and brought to
the front without taking the focus, on the layer the effect went to
(selecting it if it was dropped on an unselected layer, keeping the new
effect selected). Double-clicking an effect's name in the Timeline opens
it in Effect Controls (layer.select, prop.select, window.panel) instead
of twirling it, as in After Effects.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 04bd305b9dccbb34d8c70fe870513208cdae0b7b)
2026-10-06 11:34:27 -04:00
Brandon Thomas aa31ffc2fb Project: opening a comp brings up its Composition panel (#90)
Opening a comp (Project double-click, Open Composition, a Timeline tab)
now reopens the Composition panel if it was closed and brings it (and
the Timeline) to the front, as in After Effects. A closed Composition
panel also reopens in the centre (with the Layer panel or other viewers,
else above the Timeline) instead of beside Effects & Presets, which also
fixes Window > Composition.

App::raise_panel opens/fronts a panel without moving the focus;
show_panel builds on it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit adf2c6dac78ce426ea0bf6b4199b7238d8ad99dd)
2026-10-06 11:34:27 -04:00
Brandon Thomas a46ebf4dc7 Puppet: selected pins are filled and ringed, unselected hollow (#96)
A selected pin was drawn only 1 px bigger and slightly brighter. Now, like
selected and unselected mask vertices in the viewer, a selected pin is
filled with its kind colour and ringed in white, and an unselected pin is
hollow (dark centre, coloured outline). Drawing only; hit-testing is
unchanged.

Regression test: selected_puppet_pins_are_filled_and_unselected_hollow.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 103b5c41e9e8ea84008593e05af50b01a2800b3e)
2026-10-06 11:09:41 -04:00
Brandon Thomas 7002c92632 Timeline: selected effect rows highlight (#91, #97)
Clicking an effect's name selected it (prop.select with the effect's group
uid) but group rows never painted the selection, so there was no feedback.
Group rows (effects, masks, shape groups...) now fill with row_selected when
selected, exactly like selected property rows.

Regression test: timeline_selected_effect_row_highlights.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 8b140428b39a24c3e1207ffde0430e759e316112)
2026-10-06 11:09:41 -04:00
Brandon Thomas 4b9e701223 Merge remote-tracking branch 'origin/main' into land-prs 2026-10-06 10:33:00 -04:00
Brandon ThomasandClaude Opus 5.5 d4e310b252 Merge fixes for #95 + #71 on current main
- Project panel Clear (#95's focus routing) goes through invoke, so deleting
  items that compositions use still asks first (M3.16).
- ui_project_delete: let a dialog finish egui::Modal's sizing frame before
  clicking its buttons (#95 moved dialogs to egui::Modal).
- #71's i18n / theme tests clear the frame's texture delta; egui asserts on
  unhandled deltas in debug builds.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 10:22:15 -04:00
Brandon Thomas 0e27c845f7 Merge pull request #101 from storytold/pr/windows-arm64
Windows on ARM64: release builds, PE header check, install test on ARM64 hardware
2026-10-06 10:21:02 -04:00
Brandon ThomasandClaude Opus 5.5 7e1c2d0329 Windows ARM64 workflow: pin third-party actions by commit
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 09:51:09 -04:00
Brandon ThomasandClaude Opus 5.5 370a7a5131 Windows on ARM64: release builds, PE header check, install test on ARM64 hardware
Release builds add an arm64 MSI and portable zip, cross-compiled on the x64
runner (signing and WiX as for x64). package.ps1 checks each binary's PE
header before packaging: Machine must match -Arch, the app must be a GUI
program and the CLI a console program. It skips the CLI smoke run when an
ARM64 build can't run on the host. A new Windows ARM64 workflow packages the
ARM64 MSI, installs it on a Windows 11 ARM64 runner, checks both installed
exes are ARM64, runs the CLI, and uninstalls. Ported from printcraft#66.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 09:38:55 -04:00
Brandon ThomasandClaude Opus 5.5 dc96725725 audio: allow the deprecated fetch_update while rust-version is 1.95
Rust 1.99 renamed AtomicU32::fetch_update to try_update; try_update is not
available on the workspace's minimum Rust (1.95).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 08:46:22 -04:00
Brandon Thomas 633fbcfaeb Merge PR #71: Persist Japanese menu language in General settings 2026-10-06 08:42:00 -04:00
Brandon Thomas dfd8aac431 keyframe: never-crash deny lints (craftrules standards/never-crash.md)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
(cherry picked from commit 2232354b902238827b2e80a29ef266c2e5bde272)
(cherry picked from commit 95da7943454ca5b2575993d11f9ba046822ce255)
2026-10-06 08:41:33 -04:00
Brandon Thomas 98872a4690 Merge PR #95: Improve AE-style editing, easing fidelity and Windows GPU rendering 2026-10-06 08:41:33 -04:00
Brandon Thomas e6c817bb3f Merge pull request #99 from storytold/pr/release-0.3.1
Release: EffectCraft v0.3.1
2026-10-06 08:04:15 -04:00
Brandon ThomasandClaude Opus 5.5 e1e0a78be5 Release: EffectCraft v0.3.1
Fixes the Windows installer: the Start Menu shortcut and Add/Remove Programs icon were blank. The shortcut description was wrong. Release builds no longer open a console window behind the app.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 08:04:07 -04:00
Brandon Thomas 722d7d673c Merge pull request #98 from storytold/pr/windows-packaging
Windows packaging: Start Menu/Add-Remove icon, no console window, correct description
2026-10-06 07:54:09 -04:00
Brandon ThomasandClaude Opus 5.5 17b17bcce3 Windows packaging: Start Menu/Add-Remove icon, no console window, correct description
The MSI Icon id had no .ico/.exe extension, which Windows Installer needs for
advertised shortcuts and ARPPRODUCTICON, so both showed a blank icon. Release
builds of the desktop app are now GUI-subsystem (no console window; the CLI stays
a console program), the shortcut/summary description names what EffectCraft does, and
packaging-lint rejects an Icon id without an extension. Found in printcraft#57.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-06 07:51:06 -04:00
Brandon Thomas e5c58600fd Merge pull request #60 from storytold/pr/freebsd
FreeBSD: system info reports memory, CPU model and OS version
2026-10-05 11:33:17 -04:00
Brandon ThomasandClaude Opus 5.5 b70c808d60 FreeBSD: system info reports memory, CPU model and OS version
sysctl hw.physmem / hw.pagesize / vm free+inactive page counts, hw.model,
and freebsd-version, with a unit test for the sysctl parser. The FreeBSD
CI workflow itself landed with #69.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 11:33:06 -04:00
Brandon Thomas 7f3caeea70 Merge pull request #69 from storytold/pr/gpu-gl-fallback
GPU on wgpu's OpenGL backend (FreeBSD / Linux without Vulkan)
2026-10-05 11:29:02 -04:00
Brandon ThomasandClaude Opus 5.5 3767332efd GPU compositor declines devices whose limits its pipelines exceed
egui-wgpu creates its device on GL with WebGL2's limits (no storage buffers), so the desktop
app on FreeBSD built the compositor's pipelines on it: validation errors (only logged in
release builds) and wrong frames. GpuContext::new now checks the limits its pipelines bind
(storage buffers and textures per stage, bind groups, workgroup sizes) and returns Err, which
keeps the app on the CPU. ui_gpu skips its GPU-vs-CPU comparison when that happens on GL.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 10:52:04 -04:00
Brandon ThomasandClaude Opus 5.5 6eedf8e2c5 GPU on wgpu's OpenGL backend: renderable depth target, portable shaders, serialised tests
FreeBSD's CI VM (Mesa llvmpipe over GL) failed 22 effectcraft-gpu tests:

- Advanced 3D's camera-depth target was R32Float, which GLES can't render to without
  EXT_color_buffer_float: create_render_pipeline failed validation (release builds only log
  that and draw nothing). The target is now R32Uint holding the f32 bits (renderable on every
  backend, lossless), and GpuContext checks the adapter's format features (render attachment,
  blendable colour) and independent blending up front; when they're missing the render
  pipelines are never built and Advanced 3D renders on the CPU.
- Signed `%` in the shaders: naga emits GLSL `%`, undefined for negative operands, which broke
  the VR effects' horizontal wrap and Cell Pattern's tiling. A shared `imod` never takes `%` of
  a negative number.
- asin/acos: Mesa's are coarse approximations (~1e-4 rad), visible in every lens/sphere/cylinder
  mapping. `asin_p`/`acos_p` (Cephes' asinf polynomial) are f32-accurate on every backend.
- "Could not lock adapter context": the GL backend has one context lock per adapter with a
  timeout, so tests driving devices concurrently panic. Every gpu test helper that hands out a
  device holds one process-wide lock for the calling test; ui_web_job_gpu's two device tests
  share a lock too.
- On GL, up to 1 % of pixels may flip across a decision boundary (division through a
  reciprocal, unfused fma); the GPU-vs-CPU comparisons allow that there only.

Also adds the FreeBSD workflow (from the FreeBSD CI PR) so this branch is checked there.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 10:08:21 -04:00
Brandon ThomasandClaude Opus 5.5 e2f027f374 docs: point agents to the shared test corpora (#59)
Real-file test oracles live in storytold/photocraft-corpus, explained in
craftrules standards/test-corpora.md. Never commit large binary fixtures
here; fetch them pinned and sha256-verified.

Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-05 08:24:13 -04:00
Brandon ThomasandClaude Opus 5.5 aa4656b543 Docs: honest gap assessment (docs/gaps.md), roadmap workstreams G1–G9, README status
parity.md's ≈99% measures breadth only. docs/gaps.md assesses real-world
readiness by dimension (fidelity, .aep interop, stability, platform
reliability, performance, media, AI tools, maturity) with evidence, and
sets prioritised workstreams with done criteria. ROADMAP, README, parity.md,
AGENTS.md and CLAUDE.md point agents at it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 06:32:19 -04:00
Brandon Thomas 0bb8baf4da Merge pull request #52 from storytold/pr/release-0.2.0
Release: EffectCraft v0.2.0
2026-10-05 02:46:06 -04:00
Brandon ThomasandClaude Opus 5.5 3f7250043d Release: EffectCraft v0.2.0
Bump the workspace version 0.1.1 -> 0.2.0 (cargo xtask version set 0.2.0).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-05 02:45:53 -04:00
Brandon Thomas 339a05d771 Merge pull request #37 from storytold/pr/never-crash-clean-crates
Never crash: deny panic lints in the already-clean crates and apps
2026-10-04 15:34:52 -04:00
Brandon Thomas 7f1e2df862 Merge pull request #24 from storytold/pr/never-crash-opus-vp9
Never crash: Opus and VP9 encoders without expect()
2026-10-04 15:34:33 -04:00
Brandon Thomas 61e859e3de Merge pull request #23 from storytold/pr/never-crash-hevcenc
Never crash: HEVC encoder without expect()/unreachable!()
2026-10-04 15:34:15 -04:00
Brandon Thomas 6aa490b826 Merge pull request #22 from storytold/pr/never-crash-av1enc
Never crash: AV1 encoder without expect()/unreachable!()
2026-10-04 15:33:56 -04:00
Brandon Thomas c6b8f5412f Merge pull request #36 from storytold/pr/never-crash-ui
Never crash: frame-pool panic handler and ui-egui without expect()
2026-10-04 15:33:38 -04:00
Brandon Thomas 4926dd2c4c Merge pull request #35 from storytold/pr/never-crash-render-gpu
Never crash: render and gpu crates without panic!()
2026-10-04 15:33:18 -04:00
Brandon Thomas fc0eee53dc Merge pull request #31 from storytold/pr/never-crash-raster-path
Never crash: raster and path crates without expect()/unwrap()/unreachable!()
2026-10-04 15:32:58 -04:00
Brandon Thomas 5d716c2f5a Merge pull request #29 from storytold/pr/never-crash-text
Never crash: text layout and font resolution without expect()
2026-10-04 15:32:39 -04:00
Brandon Thomas f82ac49855 Merge pull request #26 from storytold/pr/never-crash-track
Never crash: trackers and camera solver without expect()
2026-10-04 15:32:18 -04:00
Brandon Thomas 64531e4aac Merge pull request #33 from storytold/pr/never-crash-effects
Never crash: effects crate without expect()
2026-10-04 15:32:00 -04:00
Brandon Thomas c6488d0cd4 Merge pull request #30 from storytold/pr/never-crash-engine
Never crash: engine without expect() (job polling, commands, menus)
2026-10-04 15:31:40 -04:00
Brandon Thomas f864b29549 Merge pull request #27 from storytold/pr/never-crash-script
Never crash: scripts nested too deeply return an error instead of overflowing the stack
2026-10-04 15:31:21 -04:00
Brandon Thomas 46cd757f99 Merge pull request #21 from storytold/pr/never-crash-expr
Never crash: reject deeply nested expressions instead of overflowing the stack
2026-10-04 15:31:01 -04:00
Brandon Thomas a3976913c2 Merge pull request #34 from storytold/pr/never-crash-time
Never crash: Tick and timecode arithmetic can't overflow or divide by zero
2026-10-04 15:30:42 -04:00
Brandon Thomas 6f52a0aab8 Merge pull request #19 from storytold/pr/never-crash-project
Never crash: project crate without expect()
2026-10-04 15:30:22 -04:00
Brandon Thomas 010cb8129f Merge pull request #17 from storytold/pr/never-crash-media
Never crash: media crate without expect()
2026-10-04 15:29:59 -04:00
Brandon Thomas 43c485e31e Merge pull request #14 from storytold/pr/never-crash-interchange
Never crash: interchange import/export (bad precomp refs, deep XML) without panics
2026-10-04 15:29:41 -04:00
Brandon Thomas d350f4e7ac Merge pull request #25 from storytold/pr/never-crash-lottie
Never crash: Lottie enum values can't overflow
2026-10-04 15:29:22 -04:00
Brandon Thomas a792844d7e Merge pull request #16 from storytold/pr/never-crash-pdf
Never crash: PDF/EPS close-path, CFF outlines and PostScript radix numbers
2026-10-04 15:29:03 -04:00
Brandon Thomas e171c33686 Merge pull request #15 from storytold/pr/never-crash-svg
Never crash: SVG path data loop and deep nesting
2026-10-04 15:28:44 -04:00
Brandon Thomas 91a3b14cb2 Merge pull request #18 from storytold/pr/never-crash-psd
Never crash: PSD reader bounds overflow and input-sized allocations
2026-10-04 15:28:25 -04:00
Brandon Thomas a69f417d63 Merge pull request #28 from storytold/pr/never-crash-guard
Never crash: last-resort guard around command execution, and a logging panic hook
2026-10-04 15:28:05 -04:00
Brandon Thomas e6bda37e80 Merge pull request #12 from storytold/pr/never-crash-steering
Never crash: steering rules, clippy.toml, forbid unsafe
2026-10-04 15:27:45 -04:00
Brandon ThomasandClaude Opus 5.5 c5e33f1a02 Never crash: deny panic lints in the already-clean crates and apps
These crates have no production panic sites: add the deny attribute so they stay clean
(geom, color, model, automation, host, export, plugin, and the desktop, CLI and web apps). The
plugin's wasm-only test module gets a separate cfg(test) attribute so clippy recognises it as
test code.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-04 14:52:39 -04:00