@riddledc/riddle-proof-packs 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/README.md +2 -1
  2. package/dist/index.cjs +62 -7
  3. package/dist/index.js +62 -7
  4. package/package.json +1 -1
  5. package/packs/neon-step-sequencer/README.md +4 -2
  6. package/packs/neon-step-sequencer/case-study/findings.md +22 -0
  7. package/packs/neon-step-sequencer/case-study/ratchet-card.md +3 -1
  8. package/packs/neon-step-sequencer/case-study/ratchet-log.md +110 -0
  9. package/packs/neon-step-sequencer/case-study/reusable-lessons.md +4 -0
  10. package/packs/neon-step-sequencer/examples/README.md +4 -1
  11. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/artifact-manifest.json +32 -0
  12. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/console.json +4 -0
  13. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/dom-summary.json +40 -0
  14. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/profile-result.json +2917 -0
  15. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/proof.json +2917 -0
  16. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/screenshots/neon-step-sequencer-explore-songs-and-mixes-desktop-neon-explore-songs-and-mixes.png +0 -0
  17. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/screenshots/neon-step-sequencer-explore-songs-and-mixes-desktop.png +0 -0
  18. package/packs/neon-step-sequencer/examples/run-005-explore-songs-and-mixes-final/summary.md +52 -0
  19. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/artifact-manifest.json +32 -0
  20. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/console.json +4 -0
  21. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/dom-summary.json +40 -0
  22. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/profile-result.json +11786 -0
  23. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/proof.json +11786 -0
  24. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/screenshots/lilarcade-neon-ratchet-loop-mix-level-search-desktop-neon-ratchet-loop-mix-level-search.png +0 -0
  25. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/screenshots/lilarcade-neon-ratchet-loop-mix-level-search-desktop.png +0 -0
  26. package/packs/neon-step-sequencer/examples/run-006-ratchet-loop-human-review-packet/summary.md +44 -0
  27. package/packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json +33 -7
  28. package/packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json +29 -0
package/README.md CHANGED
@@ -90,12 +90,13 @@ Profiles are stored under `packs/<slug>/profile.json` and mirrored into the runt
90
90
  - `neon-step-sequencer-mobile-trainer-layout`
91
91
  - `neon-step-sequencer-full-mix-health-matrix`
92
92
  - `neon-step-sequencer-explore-songs-and-mixes`
93
+ - `neon-step-sequencer-ratchet-loop-mix-level-search`
93
94
 
94
95
  ## Audio and Neon ratchet packs
95
96
 
96
97
  The `audio-mix` directory contains reusable audio-proof authoring guidance, a profile template, a metrics schema, a ratchet method, and a human-review rubric.
97
98
 
98
- The `neon-step-sequencer` directory contains the first app-specific ratchet lab under the new architecture. Its profiles declare `current_target` or `interaction_snapshots` evidence-role patterns and explicitly state what they do not prove. The case-study files record the claim, evidence, failure classification, smallest layer changed, and next sharper question for each run.
99
+ The `neon-step-sequencer` directory contains the first app-specific ratchet lab under the new architecture. Its profiles declare `current_target` or `interaction_snapshots` evidence-role patterns and explicitly state what they do not prove. The ratchet-loop profile now expects a compact `humanReviewPacket` for listening handoff: supported/rejected candidates, objective guardrails, state restoration, review-order ranking, and taste caveats. The case-study files record the claim, evidence, failure classification, smallest layer changed, and next sharper question for each run.
99
100
 
100
101
  ## Usage
101
102
 
package/dist/index.cjs CHANGED
@@ -751,11 +751,14 @@ var explore_songs_and_mixes_default = {
751
751
  label: "install-neon-exploration-proof",
752
752
  timeout_ms: 1e4,
753
753
  store_return_to: "__neonProof.install",
754
- script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofWindows=async()=>{const api=window.__neonProofApi(); if(api?.renderProofWindows) return await api.renderProofWindows({}); if(api?.renderOfflineMetrics) return {ok:true,proofKind:'offline-audio-window-set',windows:[await api.renderOfflineMetrics({bars:1,seed:'neon-explore-fallback',monitorProfile:'smallSpeaker'})]}; return {ok:false,error:'missing renderProofWindows'};}; const api=window.__neonProofApi(); const state=api?.getState?.()||api?.getSummary?.()||{}; return {available:Boolean(api),selectedSong:state.selectedSong||null};",
754
+ script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const api=window.__neonProofApi(); const state=api?.getState?.()||api?.getSummary?.()||{}; return {available:Boolean(api),hasExplorationSweep:typeof api?.runExplorationSweep==='function',selectedSong:state.selectedSong||null};",
755
755
  return_summary_fields: [
756
756
  {
757
757
  path: "available"
758
758
  },
759
+ {
760
+ path: "hasExplorationSweep"
761
+ },
759
762
  {
760
763
  path: "selectedSong"
761
764
  }
@@ -769,8 +772,17 @@ var explore_songs_and_mixes_default = {
769
772
  },
770
773
  {
771
774
  type: "window_call",
772
- label: "render-proof-windows",
773
- path: "__neonProofWindows",
775
+ label: "run-exploration-sweep",
776
+ path: "__NEON_MIX_PROOF__.runExplorationSweep",
777
+ args: [
778
+ {
779
+ maxSongs: 4,
780
+ maxPartsPerSong: 2,
781
+ maxWindowsPerPart: 2,
782
+ monitorProfile: "smallSpeaker",
783
+ loadAllSources: true
784
+ }
785
+ ],
774
786
  store_return_to: "__neonProof.exploration",
775
787
  capture_return: true,
776
788
  timeout_ms: 18e4,
@@ -778,14 +790,26 @@ var explore_songs_and_mixes_default = {
778
790
  {
779
791
  path: "ok"
780
792
  },
793
+ {
794
+ path: "status"
795
+ },
781
796
  {
782
797
  path: "proofKind"
783
798
  },
784
799
  {
785
- path: "windows.length"
800
+ path: "entryCount"
801
+ },
802
+ {
803
+ path: "findingCount"
786
804
  }
787
805
  ]
788
806
  },
807
+ {
808
+ type: "assert_window_value",
809
+ path: "__neonProof.exploration.proofKind",
810
+ expected_value: "neon-exploration-sweep",
811
+ timeout_ms: 1e4
812
+ },
789
813
  {
790
814
  type: "assert_window_value",
791
815
  path: "__neonProof.exploration.ok",
@@ -829,10 +853,12 @@ var explore_songs_and_mixes_default = {
829
853
  pack_id: "neon_step_sequencer",
830
854
  pack_public_name: "Neon Step Sequencer Pack",
831
855
  evidence_role_pattern: "current_target",
832
- purpose: "Exploration sweep over the app-provided proof windows for prioritizing the next weakest song/mix combination.",
856
+ purpose: "Bounded exploration sweep over Neon songs, parts, mix profiles, and proof windows for prioritizing the next weakest review target.",
833
857
  required_receipts: [
834
- "proof-window set returns ok",
835
- "window receipts are captured",
858
+ "exploration sweep contract is available",
859
+ "song/part entries are captured",
860
+ "all sampled entries pass objective guardrails",
861
+ "prioritized findings are captured",
836
862
  "browser health is clean",
837
863
  "screenshot is captured"
838
864
  ],
@@ -1669,6 +1695,7 @@ var ratchet_loop_mix_level_search_default = {
1669
1695
  path: "__NEON_MIX_PROOF__.runRatchetLoop",
1670
1696
  args: [
1671
1697
  {
1698
+ intent: "turn the chord part down a little",
1672
1699
  strategy: "mix-level-search",
1673
1700
  focusTracks: [
1674
1701
  "bass",
@@ -1703,6 +1730,15 @@ var ratchet_loop_mix_level_search_default = {
1703
1730
  },
1704
1731
  {
1705
1732
  path: "supportedClaimCandidateCount"
1733
+ },
1734
+ {
1735
+ path: "humanReviewPacket.status"
1736
+ },
1737
+ {
1738
+ path: "humanReviewPacket.recommendation.candidate.action.track"
1739
+ },
1740
+ {
1741
+ path: "humanReviewPacket.ranking.role"
1706
1742
  }
1707
1743
  ]
1708
1744
  },
@@ -1712,6 +1748,24 @@ var ratchet_loop_mix_level_search_default = {
1712
1748
  expected_value: true,
1713
1749
  timeout_ms: 1e4
1714
1750
  },
1751
+ {
1752
+ type: "assert_window_value",
1753
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.kind",
1754
+ expected_value: "human_review_packet",
1755
+ timeout_ms: 1e4
1756
+ },
1757
+ {
1758
+ type: "assert_window_value",
1759
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.ranking.role",
1760
+ expected_value: "review_order_only",
1761
+ timeout_ms: 1e4
1762
+ },
1763
+ {
1764
+ type: "assert_window_value",
1765
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.request.candidateActionsAreTransient",
1766
+ expected_value: true,
1767
+ timeout_ms: 1e4
1768
+ },
1715
1769
  {
1716
1770
  type: "screenshot",
1717
1771
  label: "neon-ratchet-loop-mix-level-search",
@@ -1759,6 +1813,7 @@ var ratchet_loop_mix_level_search_default = {
1759
1813
  "claim candidates are captured",
1760
1814
  "each candidate records claim receipts",
1761
1815
  "best supported claim candidate or human-review status is captured",
1816
+ "compact human-review packet is captured",
1762
1817
  "state restoration receipt is captured"
1763
1818
  ],
1764
1819
  does_not_prove: [
package/dist/index.js CHANGED
@@ -716,11 +716,14 @@ var explore_songs_and_mixes_default = {
716
716
  label: "install-neon-exploration-proof",
717
717
  timeout_ms: 1e4,
718
718
  store_return_to: "__neonProof.install",
719
- script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofWindows=async()=>{const api=window.__neonProofApi(); if(api?.renderProofWindows) return await api.renderProofWindows({}); if(api?.renderOfflineMetrics) return {ok:true,proofKind:'offline-audio-window-set',windows:[await api.renderOfflineMetrics({bars:1,seed:'neon-explore-fallback',monitorProfile:'smallSpeaker'})]}; return {ok:false,error:'missing renderProofWindows'};}; const api=window.__neonProofApi(); const state=api?.getState?.()||api?.getSummary?.()||{}; return {available:Boolean(api),selectedSong:state.selectedSong||null};",
719
+ script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const api=window.__neonProofApi(); const state=api?.getState?.()||api?.getSummary?.()||{}; return {available:Boolean(api),hasExplorationSweep:typeof api?.runExplorationSweep==='function',selectedSong:state.selectedSong||null};",
720
720
  return_summary_fields: [
721
721
  {
722
722
  path: "available"
723
723
  },
724
+ {
725
+ path: "hasExplorationSweep"
726
+ },
724
727
  {
725
728
  path: "selectedSong"
726
729
  }
@@ -734,8 +737,17 @@ var explore_songs_and_mixes_default = {
734
737
  },
735
738
  {
736
739
  type: "window_call",
737
- label: "render-proof-windows",
738
- path: "__neonProofWindows",
740
+ label: "run-exploration-sweep",
741
+ path: "__NEON_MIX_PROOF__.runExplorationSweep",
742
+ args: [
743
+ {
744
+ maxSongs: 4,
745
+ maxPartsPerSong: 2,
746
+ maxWindowsPerPart: 2,
747
+ monitorProfile: "smallSpeaker",
748
+ loadAllSources: true
749
+ }
750
+ ],
739
751
  store_return_to: "__neonProof.exploration",
740
752
  capture_return: true,
741
753
  timeout_ms: 18e4,
@@ -743,14 +755,26 @@ var explore_songs_and_mixes_default = {
743
755
  {
744
756
  path: "ok"
745
757
  },
758
+ {
759
+ path: "status"
760
+ },
746
761
  {
747
762
  path: "proofKind"
748
763
  },
749
764
  {
750
- path: "windows.length"
765
+ path: "entryCount"
766
+ },
767
+ {
768
+ path: "findingCount"
751
769
  }
752
770
  ]
753
771
  },
772
+ {
773
+ type: "assert_window_value",
774
+ path: "__neonProof.exploration.proofKind",
775
+ expected_value: "neon-exploration-sweep",
776
+ timeout_ms: 1e4
777
+ },
754
778
  {
755
779
  type: "assert_window_value",
756
780
  path: "__neonProof.exploration.ok",
@@ -794,10 +818,12 @@ var explore_songs_and_mixes_default = {
794
818
  pack_id: "neon_step_sequencer",
795
819
  pack_public_name: "Neon Step Sequencer Pack",
796
820
  evidence_role_pattern: "current_target",
797
- purpose: "Exploration sweep over the app-provided proof windows for prioritizing the next weakest song/mix combination.",
821
+ purpose: "Bounded exploration sweep over Neon songs, parts, mix profiles, and proof windows for prioritizing the next weakest review target.",
798
822
  required_receipts: [
799
- "proof-window set returns ok",
800
- "window receipts are captured",
823
+ "exploration sweep contract is available",
824
+ "song/part entries are captured",
825
+ "all sampled entries pass objective guardrails",
826
+ "prioritized findings are captured",
801
827
  "browser health is clean",
802
828
  "screenshot is captured"
803
829
  ],
@@ -1634,6 +1660,7 @@ var ratchet_loop_mix_level_search_default = {
1634
1660
  path: "__NEON_MIX_PROOF__.runRatchetLoop",
1635
1661
  args: [
1636
1662
  {
1663
+ intent: "turn the chord part down a little",
1637
1664
  strategy: "mix-level-search",
1638
1665
  focusTracks: [
1639
1666
  "bass",
@@ -1668,6 +1695,15 @@ var ratchet_loop_mix_level_search_default = {
1668
1695
  },
1669
1696
  {
1670
1697
  path: "supportedClaimCandidateCount"
1698
+ },
1699
+ {
1700
+ path: "humanReviewPacket.status"
1701
+ },
1702
+ {
1703
+ path: "humanReviewPacket.recommendation.candidate.action.track"
1704
+ },
1705
+ {
1706
+ path: "humanReviewPacket.ranking.role"
1671
1707
  }
1672
1708
  ]
1673
1709
  },
@@ -1677,6 +1713,24 @@ var ratchet_loop_mix_level_search_default = {
1677
1713
  expected_value: true,
1678
1714
  timeout_ms: 1e4
1679
1715
  },
1716
+ {
1717
+ type: "assert_window_value",
1718
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.kind",
1719
+ expected_value: "human_review_packet",
1720
+ timeout_ms: 1e4
1721
+ },
1722
+ {
1723
+ type: "assert_window_value",
1724
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.ranking.role",
1725
+ expected_value: "review_order_only",
1726
+ timeout_ms: 1e4
1727
+ },
1728
+ {
1729
+ type: "assert_window_value",
1730
+ path: "__neonMixProof.ratchetLoop.humanReviewPacket.request.candidateActionsAreTransient",
1731
+ expected_value: true,
1732
+ timeout_ms: 1e4
1733
+ },
1680
1734
  {
1681
1735
  type: "screenshot",
1682
1736
  label: "neon-ratchet-loop-mix-level-search",
@@ -1724,6 +1778,7 @@ var ratchet_loop_mix_level_search_default = {
1724
1778
  "claim candidates are captured",
1725
1779
  "each candidate records claim receipts",
1726
1780
  "best supported claim candidate or human-review status is captured",
1781
+ "compact human-review packet is captured",
1727
1782
  "state restoration receipt is captured"
1728
1783
  ],
1729
1784
  does_not_prove: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof-packs",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "description": "Reusable proof pack profiles and metadata helpers for the Riddle proof framework.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",
@@ -33,16 +33,18 @@ This pack is the first app-specific lab for the open Riddle Proof architecture.
33
33
 
34
34
  The loop is not mix-specific as a proof concept. The proof concept is a bounded ratchet loop: propose a candidate, apply it, collect evidence, classify the result, restore or keep state, and repeat until the budget is exhausted.
35
35
 
36
- This pack's first concrete strategy is `mix-level-search`, which turns small level edits into change-claim candidates. Each candidate says what action will be attempted, what receipts must support the claim, and what evidence should be reviewed afterward. The loop may include a ranking metric to order review, but the verdict comes from receipts and invariants, not from a universal mix-quality number. It still does not decide subjective mix taste; the output is a listening and review packet.
36
+ This pack's first concrete strategy is `mix-level-search`, which turns small level edits into change-claim candidates. Each candidate says what action will be attempted, what receipts must support the claim, and what evidence should be reviewed afterward. The loop may include a ranking metric to order review, but the verdict comes from receipts and invariants, not from a universal mix-quality number. It still does not decide subjective mix taste; the output is a `humanReviewPacket` for listening handoff.
37
37
 
38
38
  ## Example evidence
39
39
 
40
- The `examples/` directory contains four local Playwright proof results captured against LilArcade Neon Step Sequencer on May 24, 2026:
40
+ The `examples/` directory contains local Playwright proof results captured against LilArcade Neon Step Sequencer on May 24, 2026:
41
41
 
42
42
  - `run-001-fast-mix-health`: passing `current_target` audit with proof contract, source readiness, mix RMS `0.1234`, peak `0.8321`, and no clipping.
43
43
  - `run-002-mix-change`: passing `interaction_snapshots` proof where a bass-level edit moved bass RMS from `0.0507` to `0.1071` and mix RMS from `0.073` to `0.1264` without clipping.
44
44
  - `run-003-full-matrix`: passing `current_target` viewport matrix across desktop, phone, iPad Mini, and iPad with `0 px` horizontal overflow.
45
45
  - `run-004-ratchet-loop-mix-level-search`: passing `interaction_snapshots` proof where a bounded loop tested six mix-level change-claim candidates, found a supported `chord -0.10` candidate, recorded receipt-level verdicts, and restored app state without keeping the edit.
46
+ - `run-005-explore-songs-and-mixes-final`: passing `current_target` exploration sweep across four songs and eight song/part entries, with `8` passing entries, `0` prioritized findings, and no clipping after the local app-contract and mix-headroom ratchet.
47
+ - `run-006-ratchet-loop-human-review-packet`: passing `interaction_snapshots` proof where the same bounded loop returned a compact `humanReviewPacket` with the recommended `chord -0.10` candidate, objective guardrails, `review_order_only` ranking, state restoration, and explicit listening caveats.
46
48
 
47
49
  ## Naming note
48
50
 
@@ -101,6 +101,28 @@ Pack summary guidance first; Riddle Proof core only if a general display primiti
101
101
  - rerun: passed on May 24, 2026.
102
102
  - next sharper question: can the loop run multiple strategy classes without changing the proof primitive?
103
103
 
104
+ ### Run 005 restored the exploration flywheel
105
+
106
+ - run: `run-005-explore-songs-and-mixes-final`
107
+ - claim: a bounded current-target sweep can explore multiple Neon songs/parts, classify findings, and end with a useful confidence map.
108
+ - observed evidence: final run sampled `4` songs and `8` song/part entries; all `8` entries passed; prioritized findings dropped to `0`; source preparation loaded drums `samples`, bass/chord/guitar `hybrid`, and vocal `voice_oohs`; final sampled peaks stayed below the clipping threshold; console fatal count was `0`.
109
+ - classification: resolved chain of `proof_insufficient`, `app_contract_gap`, and `product_regression` findings during the local ratchet.
110
+ - smallest layer changed: app proof contract, app snapshot normalization, app fixture/mix data, and profile JSON.
111
+ - change made: made the exploration profile call `runExplorationSweep`; added the app-contract sweep method; normalized arbitrary song/part tempo and bar count; preserved bass/chord/guitar lane enable flags in song snapshots; lowered only hot built-in Yakety and Monkberry Sheet mix data enough to clear clipping receipts.
112
+ - rerun: passed on May 24, 2026 with `8` entries, `8` passed, and `0` findings.
113
+ - next sharper question: can this exploration workflow become the normal local pack/profile loop before any changeset or npm release?
114
+
115
+ ### Run 006 made the listening handoff compact
116
+
117
+ - run: `run-006-ratchet-loop-human-review-packet`
118
+ - claim: a bounded ratchet loop can return a compact human-review packet that summarizes supported candidates, objective guardrails, state restoration, ranking-as-review-order, and listening caveats.
119
+ - observed evidence: loop status was `claim_candidate_supported`; the packet kind was `human_review_packet`; packet status was `candidate_ready_for_listening_review`; the recommended candidate was `chord -0.10`; supported candidate count was `6`; rejected candidate count was `0`; ranking role was `review_order_only`; app state was restored after the loop; permanent edit was not kept.
120
+ - classification: none; passing `interaction_snapshots` proof with subjective listening caveat.
121
+ - smallest layer changed: app proof contract and proof-pack profile assertions.
122
+ - change made: added `humanReviewPacket` to the Neon ratchet-loop result and updated the pack profile to assert the packet shape.
123
+ - rerun: passed on May 24, 2026 with local Playwright.
124
+ - next sharper question: can the packet become the standard output shape for one-off and background candidate operators across more than `mix-level-search`?
125
+
104
126
  ### Local runner shutdown needs a small ergonomics follow-up
105
127
 
106
128
  - run: `run-002-mix-change`, `run-003-full-matrix`, `run-004-ratchet-loop-mix-level-search`
@@ -34,7 +34,9 @@ The project shows that a complex audio app can improve proof confidence mostly b
34
34
  - Run 002: an `interaction_snapshots` proof showed a bass-level edit moving bass RMS from `0.0507` to `0.1071` and mix RMS from `0.073` to `0.1264` without clipping.
35
35
  - Run 003: a `current_target` matrix passed across desktop, phone, iPad Mini, and iPad with `0 px` horizontal overflow.
36
36
  - Run 004: a bounded loop tested six `mix-level-search` change-claim candidates, returned `chord -0.10` as a supported review candidate with receipt-level evidence, and restored app state.
37
+ - Run 005: a `current_target` exploration sweep sampled four songs and eight song/part entries. The first real sweep exposed app-contract normalization gaps and hot built-in song presets; after the local ratchet fixes it passed with `8` entries, `0` findings, and no clipping.
38
+ - Run 006: the bounded loop returned a compact `humanReviewPacket` with the supported `chord -0.10` candidate, objective guardrails, state restoration, review-order ranking, and listening caveats.
37
39
 
38
40
  ## Honest boundary
39
41
 
40
- These runs prove objective claims about a running app target. They do not prove that the mix is tasteful, that every song section is healthy, or that a release candidate is better than production. The ratchet loop is a generic proof-loop shape; `mix-level-search` is only the first Neon strategy plugged into it.
42
+ These runs prove objective claims about a running app target. They do not prove that the mix is tasteful, that every song section is healthy, or that a release candidate is better than production. Run 005 is still bounded to configured song/part limits. Run 006 makes the human handoff explicit: the packet is a compact review object, not an automated taste verdict. The ratchet loop is a generic proof-loop shape; `mix-level-search` is only the first Neon strategy plugged into it.
@@ -227,6 +227,116 @@ Next sharper question:
227
227
 
228
228
  Can the pack explore song/mix combinations and produce a prioritized confidence map?
229
229
 
230
+ ## Run 005 - Bounded song/mix exploration sweep
231
+
232
+ Claim:
233
+
234
+ Neon can run a bounded current-target exploration sweep across multiple songs and parts, produce a confidence map, classify weak layers, and close the loop after small user-controlled changes.
235
+
236
+ Profile:
237
+
238
+ `profiles/explore-songs-and-mixes.json`
239
+
240
+ Evidence to capture:
241
+
242
+ - route and proof-contract availability
243
+ - sample/source preparation receipt
244
+ - bounded song/part entries
245
+ - per-window active-instrument, peak, headroom, and clipping receipts
246
+ - prioritized findings
247
+ - screenshot, console health, and layout health
248
+
249
+ Possible outcomes:
250
+
251
+ - `app_contract_gap`: the app cannot render arbitrary song/part proof states yet.
252
+ - `proof_insufficient`: the exploration profile runs but cannot support the claim.
253
+ - `profile_calibration`: proof windows or required-active receipts target the wrong musical window.
254
+ - `product_regression`: a sampled song/part clips or violates objective guardrails.
255
+
256
+ Observed status:
257
+
258
+ Passed on May 24, 2026 with `local-playwright` after three local ratchet iterations.
259
+
260
+ Observed evidence:
261
+
262
+ - final run sampled `4` songs and `8` song/part entries
263
+ - final run passed `8` entries with `0` prioritized findings
264
+ - source preparation loaded drums `samples`, bass/chord/guitar `hybrid`, and vocal `voice_oohs`
265
+ - final sampled peaks stayed below the clipping threshold: Yakety `0.9589` and `0.9756`, Monkberry Sheet `0.9734` and `0.9550`, Monkberry Full OMR `0.8345` and `0.8327`, Monkberry Tab proof windows `0.8328` to `0.8423`
266
+ - console fatal count `0`
267
+ - horizontal overflow `0 px`
268
+
269
+ Failure classification:
270
+
271
+ Resolved during the ratchet:
272
+
273
+ - `proof_insufficient`: the first corrected sweep hit an `OfflineAudioContext` zero-frame error because historical song/part proof states did not normalize tempo/bar count.
274
+ - `app_contract_gap`: the next sweep showed saved/song snapshots preserved `rhythmSynthEnabled` but not bass/chord/guitar enable flags.
275
+ - `product_regression`: after lane flags were fixed, the sweep found clipping in Yakety Dark and Monkberry Sheet presets.
276
+
277
+ Smallest layer changed:
278
+
279
+ App proof contract, app snapshot normalization, app fixture/mix data, and the local exploration profile. Riddle Proof core did not need a change.
280
+
281
+ Next sharper question:
282
+
283
+ Can the same exploration shape become a reusable pack/profile workflow where a user can choose a bounded target set, run locally during iteration, and publish only after the evidence is worth sharing?
284
+
285
+ ## Run 006 - Human-review packet handoff
286
+
287
+ Claim:
288
+
289
+ Neon can turn the bounded `mix-level-search` loop into a compact handoff object that a human or follow-on agent can review without reading the full proof JSON.
290
+
291
+ Profile:
292
+
293
+ `profiles/ratchet-loop-mix-level-search.json`
294
+
295
+ Evidence to capture:
296
+
297
+ - loop status and supported candidate count
298
+ - recommended candidate action
299
+ - per-candidate objective guardrail summary
300
+ - state restoration receipt
301
+ - ranking role as review order only
302
+ - listening-review caveats
303
+
304
+ Possible outcomes:
305
+
306
+ - `claim_candidate_supported`: at least one candidate has the receipts needed to support its change claim and the packet can recommend it for listening review.
307
+ - `needs_human_review`: evidence is valid but no candidate satisfies every objective receipt.
308
+ - `proof_insufficient`: the app contract does not expose a packet or enough candidate receipts.
309
+ - `profile_calibration`: the packet exists but points to the wrong window, target, or candidate set.
310
+
311
+ Observed status:
312
+
313
+ Passed on May 24, 2026 with `local-playwright`.
314
+
315
+ Observed evidence:
316
+
317
+ - loop status `claim_candidate_supported`
318
+ - packet kind `human_review_packet`
319
+ - packet status `candidate_ready_for_listening_review`
320
+ - recommended candidate `chord -0.10`
321
+ - recommended action `set_mixer_level chord 0.38 -> 0.28`
322
+ - supported candidates `6`
323
+ - rejected candidates `0`
324
+ - ranking role `review_order_only`
325
+ - state restored after loop `true`
326
+ - permanent edit kept `false`
327
+
328
+ Failure classification:
329
+
330
+ None. This was a passing `interaction_snapshots` proof with an explicit listening-review caveat.
331
+
332
+ Smallest layer changed:
333
+
334
+ App proof contract and proof-pack profile. Riddle Proof core did not need a change.
335
+
336
+ Next sharper question:
337
+
338
+ Can one-off commands and background runs use this packet as their common output surface while strategy-specific code remains behind the app contract?
339
+
230
340
  ## Project note
231
341
 
232
342
  The ratchet is not a pass. The ratchet is the next sharper question.
@@ -22,6 +22,10 @@ Large metrics belong in artifacts. The summary should answer:
22
22
  - did the intended metric move?
23
23
  - what should a human review next?
24
24
 
25
+ ## Handoff packets beat raw JSON spelunking
26
+
27
+ The full proof result should remain auditable, but one-off and background loops need a compact handoff object. A good `humanReviewPacket` lists supported and rejected candidates, objective guardrails, restoration status, review-order ranking, and caveats that separate proof from taste.
28
+
25
29
  ## Core changes are last
26
30
 
27
31
  Most ratchet steps should change profile JSON, pack docs, app proof contracts, or app fixtures. Riddle Proof core changes are justified only when the missing primitive applies beyond Neon.
@@ -12,12 +12,15 @@ The raw `profile-result.json` files are real runner outputs. They intentionally
12
12
  | `run-002-mix-change` | `interaction_snapshots` | passed | A bass-level edit changes rendered bass and mix metrics without clipping. |
13
13
  | `run-003-full-matrix` | `current_target` | passed | The mix-health proof holds across desktop, phone, iPad Mini, and iPad viewports. |
14
14
  | `run-004-ratchet-loop-mix-level-search` | `interaction_snapshots` | passed | A bounded ratchet loop tests mix-level change-claim candidates, records receipt verdicts, chooses a supported candidate for review, and restores app state. |
15
+ | `run-005-explore-songs-and-mixes-final` | `current_target` | passed | A bounded exploration sweep samples four songs and eight song/part entries, producing a zero-finding confidence map after app-contract and mix-headroom fixes. |
16
+ | `run-006-ratchet-loop-human-review-packet` | `interaction_snapshots` | passed | A bounded ratchet loop returns a compact `humanReviewPacket` for handoff: supported candidates, objective guardrails, state restoration, review-order ranking, and listening caveats. |
15
17
 
16
18
  ## What these examples do not prove
17
19
 
18
20
  - They do not prove subjective mix taste.
19
- - They do not prove every song, section, or mix preset.
21
+ - They do not prove every song, section, or mix preset. Run 005 is bounded to the configured song, part, and proof-window limits.
20
22
  - They do not prove production CDN asset availability; these were local dev-server runs.
21
23
  - They do not prove a reference/candidate release delta. The mix-change run uses pre-action/post-action snapshots inside one proof run, not a separate baseline deployment.
22
24
  - The ratchet-loop run does not prove that the loop primitive is mix-specific; `mix-level-search` is only this pack's first concrete strategy.
23
25
  - The ratchet-loop run does not prove that the supported candidate should be kept. Its ranking metric is a review-order hint, not a taste verdict.
26
+ - The human-review packet does not replace listening judgment. It compresses objective receipts and caveats so a person or follow-on agent can decide what to review next.
@@ -0,0 +1,32 @@
1
+ {
2
+ "version": "riddle-proof-local-runner-manifest.v1",
3
+ "runner": "local-playwright",
4
+ "profile_name": "neon-step-sequencer-explore-songs-and-mixes",
5
+ "captured_at": "2026-05-24T05:09:43.225Z",
6
+ "artifacts": [
7
+ {
8
+ "name": "proof.json",
9
+ "path": "proof.json",
10
+ "kind": "text",
11
+ "bytes": 118797
12
+ },
13
+ {
14
+ "name": "console.json",
15
+ "path": "console.json",
16
+ "kind": "text",
17
+ "bytes": 38
18
+ },
19
+ {
20
+ "name": "dom-summary.json",
21
+ "path": "dom-summary.json",
22
+ "kind": "text",
23
+ "bytes": 815
24
+ },
25
+ {
26
+ "name": "profile-result.json",
27
+ "path": "profile-result.json",
28
+ "kind": "text",
29
+ "bytes": 118797
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "events": [],
3
+ "fatal_count": 0
4
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "expected_viewport_count": 1,
3
+ "viewport_count": 1,
4
+ "partial": false,
5
+ "routes": [
6
+ {
7
+ "requested": "http://127.0.0.1:5173/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
8
+ "observed": "/games/drum-sequencer",
9
+ "expected_path": "/games/drum-sequencer",
10
+ "matched": true,
11
+ "http_status": 200
12
+ }
13
+ ],
14
+ "titles": [
15
+ "LilArcade"
16
+ ],
17
+ "overflow_px": [
18
+ 0
19
+ ],
20
+ "bounds_overflow_px": [
21
+ 0
22
+ ],
23
+ "overflow_offender_counts": [
24
+ 0
25
+ ],
26
+ "frames": [
27
+ {
28
+ "viewport": "desktop",
29
+ "selectors": []
30
+ }
31
+ ],
32
+ "http_status": [],
33
+ "link_status": [],
34
+ "route_inventory": [],
35
+ "network_mock_count": 0,
36
+ "network_mock_hit_count": 0,
37
+ "dialog_count": 0,
38
+ "dialog_accept_count": 0,
39
+ "dialog_dismiss_count": 0
40
+ }