* feat(electron): sign and notarize mac release builds when Apple credentials are present
* fix(electron): work around codesign PID parsing for digit-leading app name in @electron/notarize
codesign interprets a bare '5chan.app' argument as process ID 5, so
@electron/notarize 2.5.0's pre-upload signature check fails with 'No such
process'. Backport the './' basename prefix from electron/notarize#245 as
a yarn patch until forge depends on notarize >= 3.x.
* docs(agent-playbooks): record codesign PID parsing surprise for digit-leading app name
* fix(ci): keep mac signing env consistent with certificate availability
Prefer the best available YouTube thumbnail, fall back cleanly when high-resolution images are unavailable, and keep the React Doctor PR gate scoped to newly introduced issues.
Adds the official react-doctor GitHub Action (millionco/react-doctor@v1),
which posts inline review comments + a sticky summary for issues a PR
INTRODUCES (diffed against the merge-base) -- more visible than the
previous CLI '--annotations' markers.
Removes the now-redundant react-doctor steps from ci.yml (the
detect-changes/diff-annotations/skip steps and the push-time full scan)
so react-doctor runs once per PR, not twice. It reads doctor.config.jsonc,
so the React-Compiler rules we don't enforce stay suppressed.
* fix(react-doctor): correctly exclude test files from scoring
The intended test-file ignore in react-doctor.config.json was never
applied: react-doctor's config precedence reads the "reactDoctor" key
in package.json (which had no ignore), shadowing the config file. On
top of that, react-doctor 0.4.0's ignore.files matcher is broken — any
non-empty value collapses scan scope and drops real product files, not
just tests.
Consolidate to a single canonical doctor.config.json using
ignore.overrides (which works correctly): only test files are excluded
while all product code is still scored. Remove the shadowing
package.json key and the dead react-doctor.config.json.
Product-code baseline is 55 (92 errors, 515 warnings, 118 files).
* chore(react-doctor): add long-running task tracking for score effort
* refactor(react): remove compiler-redundant memoization in verified files
Delete manual useMemo/useCallback/memo that the React Compiler already
handles, in 7 files validated to be behavior-preserving (factories are
pure functions of compiler-trackable reactive inputs). Kept memos whose
factories read external mutable DOM/theme state with load-bearing deps
(e.g. use-reply-height-estimates metrics). Also hoists a regex and reads
a localStorage value once.
Note: this is code-quality cleanup; react-doctor's score is error-
weighted, so warning cleanup like this does not move the score. See
docs/agent-runs/react-doctor-score/progress.md.
* fix(react-doctor): adopt React-Compiler lint policy + fix one state-sync bug
react-doctor's score is dominated by React-Compiler optimizability
diagnostics that flag intentional patterns (the latest-ref idiom) and
current compiler limitations (try/finally, throw-in-try/catch the
compiler can't lower yet), not bugs. Rewriting that working code to
satisfy them would degrade it.
- Replace doctor.config.json with a documented doctor.config.jsonc that
does not enforce the react-hooks-js (React Compiler) rules or
react-compiler-no-manual-memoization. All real code-quality, a11y, and
performance rules stay enforced.
- Fix one genuine state-sync bug: use-now-seconds refreshed 'now' via a
synchronous setState inside an effect (an extra render with a stale
value); move it to a render-time prev-prop comparison (React's
adjust-during-render pattern), behavior-equivalent.
Score 54 (broken config) -> 63. type-check/lint/1051 tests pass; browser
smoke confirms timestamps render with no re-render regression. The
remaining no-adjust-state-on-prop-change diagnostics are real bugs but
entangled with legitimate side effects (navigate/ref-cancel/async) in
critical flows; left for careful follow-up.
* chore(react-doctor): remove the vanity score badge, keep PR-diff review
The single 0-100 react-doctor score mostly reflects React-Compiler
optimizability and isn't a meaningful health grade to display (see
docs/agent-runs/react-doctor-score). Remove the README badge and its now-
dead generation infra (CI write/upload/publish steps + the
write-react-doctor-badge.mjs script + doctor:badge package script).
Kept: react-doctor's actual value -- the PR step that runs
'yarn doctor --diff <base> --annotations' on pull requests touching React
files, surfacing newly-introduced issues inline. Coverage badge untouched.
* docs(react-doctor): document why the score is not a target to chase
Record the reasoning so future agents/contributors don't re-attempt to
grind the react-doctor score: it overwhelmingly reflects React-Compiler
optimizability (most 'errors' flag intentional patterns and current
compiler limitations, not bugs) and saturates on the fraction of clean
files, so ~63 is the honest ceiling and 90 only comes from disabling the
linter.
- Add a known-surprises entry with the full reasoning + mitigation.
- Reframe the AGENTS.md react-doctor verification line: it's a PR-diff
reviewer for newly-introduced issues, not an aggregate score to raise.
* fix(electron): restore packaged desktop app loading
Rebuild and verify Electron native modules before packaging and use the Vite base URL for packaged asset preloads.
* test(preload-utils): cover non-root base urls
Spaces in Electron Forge filenames (e.g. "5chan Setup.exe") broke
markdown download links in the release body. Also add allowUpdates
to finalize-release so it succeeds when a release already exists.
Restructure the release workflow so build jobs upload workflow artifacts
instead of creating GitHub releases directly. A single finalize-release
job downloads all artifacts and creates the release only when every
platform build succeeds. Also removes the unused gradle bundle step
from the Android job and adds retry logic to gradlew assembleRelease.
Replaced test.yml with ci.yml, added a built-app smoke runner in scripts/smoke-web-app.js, and inserted a release preflight so tags run the same core checks before packaging.
Remove unnecessary rename steps that were adding duplicate architecture suffixes to AppImage and ZIP filenames. Electron Forge already includes architecture in AppImage filenames, and ZIPs include it in the darwin-arch pattern.
Fix Android Capacitor compatibility by downgrading tar to 6.2.1. Add Windows-specific icon file for Squirrel installer. Update electron-forge to 7.8.0 and change DMG format to ULFO for macOS Sequoia compatibility. Add retry logic for transient SSL errors on Mac Intel runners.
Fix route parameter name in use-initial-theme hook (communityAddress -> boardIdentifier), correct release workflow artifact paths (dist -> out/make), add BUILD_ARCH env var for Linux arm64 builds, fix macOS app name dev check, and update capacitor webDir to match vite output.