# Neon RiddleNode Full Sequencer Loop

- status: `intent_matrix_ready_for_review`
- target: `https://riddlenode.com/neon-lab/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass`
- public app bundle: `https://riddlenode.com/neon-lab/`
- command: `npm run proof:sequencer:riddlenode-fast-loop`
- execution mode: `single_browser_intents`
- shared gate mode: `parallel_profile_gates`
- supported intents: `3`
- rejected candidates: `0`
- findings: `0`
- review warnings: `0`
- surrogate status: `approved_for_development_review`
- surrogate recommendation: `guitar -0.02`

## What Changed

The fast Neon loop now has a single command that publishes the complete `/neon-lab/` Step Sequencer bundle before running public RiddleNode proof.

Before this, it was easy to run the public intent matrix against whatever RiddleNode bundle was already mounted. That was fast, but it made the loop ergonomically risky after app-contract or sequencer-source changes: the proof could be current while the public app bundle was stale.

The new loop keeps promotion separate from iteration, but makes the full app refresh explicit:

1. Build the full Vite app with `/neon-lab/` as the base path.
2. Sync the bundle to the fast S3/CloudFront preview prefix.
3. Invalidate `/preview/riddlenode/neon-lab/*`.
4. Run the public RiddleNode parallel shared gates and single-browser intent matrix.

## Result

| Intent | Recommendation | Supported | Rejected | Findings | Ranking Role |
| --- | --- | --- | --- | --- | --- |
| turn the bass part down a little | bass -0.05 | 3 | 0 | 0 | review_order_only |
| turn the guitar part down a little | guitar -0.02 | 3 | 0 | 0 | review_order_only |
| turn the chord part down a little | chord -0.035 | 3 | 0 | 0 | review_order_only |

The mixing-canon surrogate approved all three candidates for development review and selected `guitar -0.02` as the most conservative approved candidate.

## Good Catch Card

Plain-English title:
RiddleNode stopped the fast loop from proving a stale sequencer bundle.

One-sentence summary:
The public Neon proof lane now refreshes the entire Step Sequencer on RiddleNode before running the matrix, so app-contract and sequencer changes are tested against the bundle that was just built.

What went wrong:
The previous fast command could rerun proof against an already-published RiddleNode bundle. That is useful when only proof code changed, but risky when the actual app changed.

What Riddle caught:
The workflow boundary was too implicit: proof freshness and app-bundle freshness were different concerns, but the command names did not force the distinction.

What changed:
LilArcade added `proof:sequencer:riddlenode-prelim-loop` and `proof:sequencer:riddlenode-fast-loop`. Both publish the full `/neon-lab/` bundle before public proof. The old already-published-target command remains available for deliberate reuse.

What this does not prove:
It does not prove any candidate sounds better. It proves the public RiddleNode loop can refresh the full app target, pass deterministic browser/audio gates, produce review packets, and preserve the proof/taste boundary.

## Boundary

This does not prove subjective mix quality, listener preference, or that `guitar -0.02` is the best musical choice. It proves that the public Neon lab loop can refresh the full Step Sequencer target, run objective guardrails, write review packets, and keep candidate ranking as review order only.

## Validation

- `node --test scripts/__tests__/publishNeonPreview.test.mjs`: passed, 4 tests.
- `npm run test:neon`: passed, 99 tests.
- GitHub CI for LilArcade PR #534 at `6425660`: passed.
- `npm run proof:sequencer:riddlenode-fast-loop`: passed end-to-end.
- CloudFront invalidation: `I904GR4HS8LMNITA5J7V25ES1C`.
