Operator-authorized for the strictly private self-hosted Forgejo repo:
the env template (.env.ove), a baseline database snapshot
(db/custom.db.seed) and secrets/ now ride with the repo so sandbox
reprovisions can never wipe them. dev.sh self-heals at the very top
(before bun install): .env is restored from .env.ove whenever it lacks
OVE_DIRECTORY_API_KEY, and db/custom.db from the seed whenever it is
missing — verified end-to-end against a faithful reset simulation
(both [SELF-HEAL] restores fire, 106-preset library serves, directory
proxy authenticated, browser clean).
One evidence-driven deviation from the requested values: DATABASE_URL
is file:../db/custom.db, not file:./db/custom.db — Prisma resolves
relative SQLite paths against prisma/schema.prisma's directory, so the
./ form provably breaks both the CLI (would create a fresh empty db at
prisma/db/custom.db on every boot) and the runtime (cannot open); the
../ form is the portable equivalent and is documented in .env.ove's
header. secrets/ ships with a README documenting the house-cookie file
slots (the actual cookie exports are re-added by the operator).
The Directory tab's NOT_CONFIGURED message was the sandbox disk reset
wiping the untracked .env (OVE_DIRECTORY_URL/API_KEY) — not repo
corruption. Credentials restored from the project's cards; the deleted
custom.db was recovered from the running process's file handles before
restart (106 presets, 8 folders, settings intact); poisoned Turbopack
cache cleared; dev server restarted via dev.sh. secrets/ house-account
cookies remain lost (graceful fallback) — flagged for manual restore.
No code changes.
The project's Facebook page (facebook.com/openvisengine) is now linked
from the footer's right-hand group beside the version stamp — icon-only
(lucide Facebook glyph), opens in a new tab, same hover/focus treatment
as the portfolio link. The light/dark tick switch moved out of the
header into the Settings tab's Appearance section as a 'Light / dark
mode' row above the base-theme cards — identical mechanics (checked =
white theme, unchecked = the visitor's stored dark base, both persist,
mount-guarded SSR). Header is one control lighter; every appearance
control now lives in one place. Verified in-browser: link attrs + icon,
toggle absent from header, flip round trips (outline -> light -> outline,
and purple -> light -> purple proving the stored-base tracking), What's
New shows 7.15.2, sticky footer + no overflow at 1280/375, console clean.
Sustained near-digital quiet on the overall level (< 0.006 for 300 ms,
sticky until a decisive 0.015) now places an immediate HOLD on the beat
tracker: nothing fires (real or predicted -- previously the predictor
kept faking beats for up to ~2 s into any silence), the tempo estimate
and confidence freeze exactly where they are, and beatphase freezes for
scripts instead of saturating at 'beat imminent'. Decisive audio
releases the hold instantly and the grid resumes from the phase the
audio went quiet (captured before the debounce window, so a
pause/resume keeps perfect time); after a hard cut the comb + first
real beats re-align within a couple of periods. 'Set Beat' taps release
the hold outright. Waveform/band data is never gated -- it still flows
(it is simply ~0, because the audio is gone).
- BeatFrame.silent carries the state; scripts get the silent variable
(1 while held); the beat indicator shows an amber HOLD badge + amber
phase ring while held.
- rust-agent/src/beat.rs + engine.rs: same gate ported for parity (its
bass level doubles as the silence signal; NOT compile-verified -- no
cargo in this sandbox).
- Verified: headless 26/26 assertions on the real BeatTracker (music ->
silence -> in-phase resume -> onsetless pad -> tap; the pre-fix
fake-beat window 12.8-15.5 s is empty) and browser E2E on the live
app with a generated 120 BPM + silence looping WAV (HOLD badge tracks
the silent spans exactly across two loop cycles; console clean).