The artifacts/**/*.zip glob overlaps artifacts/**/velopack/**/*, so a
zip inside a velopack dir would be uploaded twice and fail the release
create. Track seen paths and append each file once.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The mac vpk pack emitted feedback-osx-arm64-nightly-Portable.zip
alongside the manual tester zip — same duplication as Windows. Updates
use the -full.nupkg feed, so the portable zip is redundant.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
vpk pack emitted a Portable.zip (Update.exe stub wrapping win-unpacked)
alongside the plain feedback-windows-x64.zip, so testers saw two
different portable downloads. Pass --noPortable to suppress it and add
artifacts/**/*.zip to the publish globs so the plain zip (and the macOS
tester zip) land on the rolling nightly release instead of only in
workflow artifacts.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
getDisplayMedia (renderer-bus whole-app loopback capture) rides the
'media' permission request with EMPTY mediaTypes. The audio-only rule
denied it, so the display-media handler never ran and exclusive/ASIO
output lost all page audio (song previews, element-song fallback).
Allow media requests unless they explicitly ask for 'video' (camera
stays blocked; getDisplayMedia video is the app's own frame), mirror
the policy in the permission-check handler, and add [asio-diag] logs
to every deny path plus the display-media handler so future denials
name their stage in tester logs.
Verified packaged: display-media granted → renderer-bus engaged,
engine busEnabled/busFlowing=true on ASIO.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cumulative pushed/consumed never regress, so '> 0' stayed true forever
after the first frame — a stalled renderer bus (one of the states this
diagnostic exists to expose) would still report flowing. First sample
after enable reports false (no baseline yet).
Addresses CodeRabbit review on #95.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Testers report song/game audio on the default WASAPI device while the
guitar rides the selected ASIO output. The renderer-side reroute chain
([feedpak-route]/[renderer-bus]) has change-gated logs, but the native
side of the story (what the engine actually opened, whether the backing
transport/renderer bus is live) was invisible in tester logs.
- audio-bridge: debug-gated 2s engine snapshot, change-gated + 30s
heartbeat: device types/names, duplex, backing, renderer-bus health
- debug:isEnabled IPC + preload audio.debugEnabled() so the static
bundle can gate its verbose lines on --debug
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
core#834 extracted routes into a new top-level routers/ package; the
bundle script only copied lib/, so the packaged backend would die with
ModuleNotFoundError: No module named 'routers'. Copy every top-level
package (dir with __init__.py) except plugins/ (bundled selectively
below) and tests/ (never ships), so the ongoing R3 extraction series
can't keep breaking packaged builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Core added appstate.py (core#833); bundle-slopsmith.sh's whitelist only
copied server.py, so packaged builds crashed on startup with
ModuleNotFoundError: No module named 'appstate'. Glob top-level *.py so
future sibling modules can't repeat this.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Nightly run 29093119570 failed:
--signEntitlements does not have an .entitlements extension
vpk validates the file extension. Rename
resources/entitlements.mac.plist -> entitlements.mac.entitlements
and update all references (electron-builder config, sign-macos-binaries.sh,
both workflows). Content unchanged; codesign/electron-builder accept any
extension.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same gap as nightly.yml: vpk pack --signAppIdentity without
--signEntitlements strips electron-builder's entitlements
(audio-input, allow-jit, ...) from the release feed's .app.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
vpk pack re-signs the .app; without --signEntitlements the codesign
strips electron-builder's entitlements (com.apple.security.device.audio-input
et al). Hardened-runtime app then gets microphone auto-denied by TCC with
no prompt — root cause of silent-input nightly reports.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every decision point in the macOS microphone permission path now logs its
status and context to the debug log, including the previously silent
'granted' early-return path — which is the prime suspect for the stale-
grant bug (TCC reports 'granted' for a signature-keyed entry that no
longer matches the running binary).
Also logs:
- platform gate skip
- app.isPackaged === false skip (and why it matters re: NSMicrophoneUsageDescription)
- getMediaAccessStatus return value in all branches
- app identity (name, version, exe path) on 'granted' early return
- askForMediaAccess result + extra warning on user denial
- full error stack on exceptions (not just the message)
Co-Authored-By: Claude <noreply@anthropic.com>
Playlists are integrated into the core app, so the setlist plugin is
obsolete and its repo is being archived.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
nightly.yml still globbed for the old Slopsmith.app bundle name and
failed every night. Find the .app dynamically (name-agnostic *.app glob
- the new name contains [dB], which a shell glob reads as a character
class) and derive zip names from the bundle, matching the fix already
on main in rc.yml/build.yml. Also refresh stale Slopsmith comments in
build.yml.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>