Good Catch Lab

Neon Ratchet Lab

A running case study for app contracts, audio proof packs, bounded candidate loops, and proof-backed review packets.

Neon Ratchet Lab

Neon Step Sequencer tested the new Riddle Proof architecture by building reusable audio-mix proof packs, a tiny app contract, and live proof runs against a running browser target.

Starting claim:

When the user applies a mix change in Neon Step Sequencer, the visible mixer state, app proof contract, and rendered offline audio metrics should agree.

Run 001 used the current_target pattern. It loaded /games/drum-sequencer, captured the Neon proof contract, prepared audio sources, rendered offline metrics, and passed with mix RMS 0.1234, peak 0.8321, no clipping, zero fatal console errors, and zero horizontal overflow.

Run 002 used interaction_snapshots. It captured pre-action metrics, changed the bass level from 0.62 to 1.35, captured post-action metrics, and passed because bass RMS moved from 0.0507 to 0.1071 while mix RMS moved from 0.073 to 0.1264 without clipping.

Run 003 used current_target again as a viewport matrix. Desktop, phone, iPad Mini, and iPad all matched /games/drum-sequencer, reported 0px horizontal overflow, rendered RMS 0.0732 and peak 0.5402, and had no fatal console errors.

Run 004 used RiddleNode as the fast public lab target. The broader candidate sweep loaded https://riddlenode.com/neon-lab/, sampled 2 songs, 4 parts, and 4 windows with 0 deterministic findings, and produced a compact human-review packet recommending chord -0.035 for listening review. The same run surfaced Yakety Yak (Dark) / Hook as a non-failing low-headroom review warning: 0.28 dB headroom, clipping false, peak about 0.9682. That warning is not a taste verdict or a clipping failure; it is a deterministic cue for a human reviewer and a reusable proof-pack helper.

Run 005 checked whether the loop generalized beyond the chord example. The live RiddleNode request "turn the bass part down a little" produced a supported bass -0.05 candidate with 3 supported candidates, 0 rejected candidates, state restoration, and the same proof/taste caveat.

Run 006 batched the small-intent loop. One RiddleNode matrix run reused shared fast gates, then tested bass, guitar, and chord "down a little" requests against the same live Neon lab target. It passed with 0 findings and 0 review warnings, returned bass -0.05 with 3 supported candidates, guitar -0.02 with 3 supported candidates, and chord -0.035 with 2 supported candidates and 1 rejected candidate. The output is a review-order packet, not an automatic mix decision.

Run 007 added a conservative mixing-canon surrogate to that same matrix, then tightened subtle default candidates for quiet mixer lanes. The live RiddleNode run again returned bass -0.05, guitar -0.02, and chord -0.035 packets with 0 findings and 0 review warnings; after the level-aware cap, chord moved to 3 supported candidates and 0 rejected candidates. The surrogate approved all 3 intent packets for development review and recommended guitar -0.02 as the most conservative approved candidate. That approval is only a development surrogate, not a listener preference or proof of better sound.

Run 008 shortened the public loop again. The fast RiddleNode matrix ran bass, guitar, and chord "down a little" claim-candidate loops through one browser/profile call instead of one profile launch per intent, while still writing separate human-review packets for each intent. The single-browser profile passed setup, route, selector, overflow, and fatal-console checks; the matrix returned bass -0.05, guitar -0.02, and chord -0.035 with 3 supported candidates and 0 rejected candidates for each intent. The surrogate still recommended guitar -0.02 for development review only.

Run 009 cleaned up the fast lane. The reusable audio intent-matrix summary and Markdown now come from @riddledc/riddle-proof-packs@0.8.1, and the RiddleNode fast command can run the independent fast/layout/playback gates concurrently with --parallel-profile-gates. The live parallel-gate run still passed local_gate_ready, then passed the same single_browser_intents matrix with bass -0.05, guitar -0.02, and chord -0.035, all with 3 supported candidates, 0 rejected candidates, 0 findings, and 0 review warnings. The point is faster evidence gathering with isolated outputs, not a claim that parallelism proves better sound.

Run 010 closed the stale-target gap in the fast loop. LilArcade added proof:sequencer:riddlenode-prelim-loop and proof:sequencer:riddlenode-fast-loop so source changes publish the complete /neon-lab/ Step Sequencer bundle to RiddleNode before public proof runs. The live end-to-end loop published https://riddlenode.com/neon-lab/, invalidated CloudFront, passed the fast/layout/playback gates, then returned the same bass -0.05, guitar -0.02, and chord -0.035 review packets with 3 supported candidates each, 0 rejected candidates, 0 findings, and 0 review warnings. This is a workflow proof, not a mix-taste proof: it proves we are testing the freshly built full sequencer target instead of accidentally proving a stale public bundle.

Run 011 caught a mounted current-target audit gap. After the surrogate-approved guitar -0.02 candidate became a durable branch override, the first RiddleNode current-target audit failed both active overrides because the generated profiles still pointed at /games/drum-sequencer on the RiddleNode root. That route serves the RiddleNode shell, not the full Step Sequencer. LilArcade added durable route-prefix support and proof:sequencer:riddlenode-current-target, which runs the audit with /neon-lab. The fixed public audit passed with 2 active overrides, 0 findings, chord 0.16 at 2.5 dB headroom, and guitar 0.53 at 2.46 dB headroom. This proves the mounted public app picked up and rendered the durable overrides; it still does not prove the guitar move sounds better.

Run 012 proved the real UI control path, not just the proof API helper. The new proof:sequencer:riddlenode-mixer-control lane moved the actual guitar range input without calling setMixerLevelForProof. It caught that the durable 0.53 guitar level could be represented by the contract but not restored exactly by the UI while the slider used step 0.05; the browser rounded that level to 0.55. After changing mixer level sliders to step 0.01, the public RiddleNode proof passed with proofApiEditUsed false, guitar 0.53 to 0.50, restoration back to 0.53, clipping false, lowLevel false, peak 0.4347, 7.24 dB headroom, and 0 findings. This proves real-control precision and restoration, not that any guitar level sounds better.

Run 013 used RiddleNode as the normal fast-lane target for another bounded guitar-down iteration. The fast intent matrix recommended the conservative guitar -0.02 candidate, the approved-candidate lane applied the mixing-canon surrogate boundary, and the durable patch moved Monkberry guitar from 0.53 to 0.51 on the branch. The Neon-only bundle was published to https://riddlenode.com/neon-lab/ without treating LilArcade production promotion as part of the loop. The deployed current-target audit passed with 2 active overrides, 0 findings, chord 0.16 at peak 0.7452 / RMS 0.0959, and guitar 0.51 at peak 0.7446 / RMS 0.0955. The deployed UI-control proof then moved the real guitar slider from 0.51 to 0.50 with proofApiEditUsed false, restored back to 0.51, and passed clipping, low-level, and headroom guardrails. This proves the fast lane can apply a small reviewable candidate and re-prove the public lab target; it still does not prove the guitar cut sounds better.

Run 014 made missing active lanes visible in the compact human-review packet. The active-lane receipt now shows whether declared required musical lanes stayed measurable in each proof window, and required_instruments_preserved depends on that receipt. A deterministic fixture rejects a candidate with missing_required_active_lanes when the required chord lane is inactive. The live RiddleNode fast loop passed with bass, guitar, and chord packets all reporting active_lanes_preserved, 2 / 2 required windows, required tracks bass, chord, guitar, rhythmSynth, and no missing required lanes. This makes a deterministic guardrail easier to review; it still does not prove any candidate sounds better.

Run 015 made the fast lane more observable and easier to smoke before a full matrix run. The single-browser intent matrix had moved proof work off Amplify, but the browser proof call could still run silently long enough to feel stuck. LilArcade added repeated --intent-id filtering, proof:sequencer:riddlenode-intent-smoke, proof:sequencer:riddlenode-smoke-loop, and heartbeat progress messages while the single-browser runner is active. The live RiddleNode smoke loop published the Neon-only bundle, ran the shared gates, then selected only guitar-down-little with a two-candidate budget. It returned guitar -0.02, 2 supported candidates, 0 rejected candidates, 0 findings, 0 review warnings, and mixing-canon surrogate status approved_for_development_review, while printing heartbeat progress at 15s and 30s. This proves the lab target can produce a compact observable review packet quickly; it does not replace the full matrix or prove the candidate sounds better.

Run 016 moved smoke/full intent selection into the reusable proof-pack layer. The fast smoke path still selects only guitar-down-little, but the selection now comes from @riddledc/riddle-proof-packs@0.8.4 via selectAudioMixIntentSet(), which emits riddle-proof.audio-mix-intent-selection.v1. The live plan records requestedIntentIds guitar-down-little, selectedIntentIds guitar-down-little, unknownIntentIds none, totalIntentCount 3, selectedIntentCount 1, and the explicit boundary that selection scopes objective claim-candidate loops without proving subjective mix quality. The RiddleNode smoke loop still passed through the shared path with guitar -0.02, 2 supported candidates, 0 rejected candidates, 0 findings, and mixing-canon surrogate status approved_for_development_review. This makes smoke/full lane selection a reusable workflow receipt instead of LilArcade-only script behavior; it still does not choose the best-sounding mix or promote anything to production.

Run 017 made that intent-selection receipt readable before candidate review. @riddledc/riddle-proof-packs@0.8.5 added formatAudioMixIntentSelectionMarkdown(), and the Neon intent matrix now writes intent-selection.json, intent-selection.md, and embeds a Reusable Audio Mix Intent Selection section in intent-matrix-summary.md. The live RiddleNode smoke still selected guitar-down-little, returned guitar -0.02, 2 supported candidates, 0 rejected candidates, 0 findings, and mixing-canon surrogate status approved_for_development_review. This makes the selected claim scope obvious to humans and agents before review-order ranking begins; it still does not prove subjective mix quality or promote the candidate automatically.

Run 018 aligned the browser route to the selected single-intent claim. The fast RiddleNode smoke selected guitar-down-little, but the default route still focused the trainer on instrument=bass. LilArcade now records routeIntentAlignment and changes the default effective route to instrument=guitar for a narrow single-intent run, while preserving explicit --route values and shared multi-intent routes. The live RiddleNode smoke passed with route_instrument_aligned_to_single_intent, requested route instrument=bass, effective route instrument=guitar, selected intent metadata level_change / subtle / a little, recommendation guitar -0.02, 2 supported candidates, 0 rejected candidates, 0 findings, and mixing-canon surrogate status approved_for_development_review. This proves target hygiene for the claim-candidate loop; it still does not prove subjective mix quality.

The useful boundary was not a Riddle Proof core change. The useful boundary was a small app proof contract, pack profiles, thresholds, examples, and a human-review rubric.

These runs do not prove subjective mix taste, every song section, production CDN availability, or a reference/candidate release delta. They prove narrower objective claims about a running app target and show what the next sharper proof should ask.