@riddledc/riddle-proof-packs 0.2.2 → 0.4.0

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 (33) hide show
  1. package/README.md +13 -0
  2. package/dist/index.cjs +1176 -6
  3. package/dist/index.js +1176 -6
  4. package/package.json +1 -1
  5. package/packs/audio-mix/README.md +30 -0
  6. package/packs/audio-mix/authoring-guide.md +35 -0
  7. package/packs/audio-mix/human-review-rubric.md +31 -0
  8. package/packs/audio-mix/metrics-schema.json +30 -0
  9. package/packs/audio-mix/profile.template.json +130 -0
  10. package/packs/audio-mix/ratchet-method.md +26 -0
  11. package/packs/neon-step-sequencer/README.md +49 -0
  12. package/packs/neon-step-sequencer/case-study/findings.md +113 -0
  13. package/packs/neon-step-sequencer/case-study/ratchet-card.md +40 -0
  14. package/packs/neon-step-sequencer/case-study/ratchet-log.md +235 -0
  15. package/packs/neon-step-sequencer/case-study/reusable-lessons.md +31 -0
  16. package/packs/neon-step-sequencer/examples/README.md +22 -0
  17. package/packs/neon-step-sequencer/examples/run-001-fast-mix-health/profile-result.json +5010 -0
  18. package/packs/neon-step-sequencer/examples/run-001-fast-mix-health/summary.md +37 -0
  19. package/packs/neon-step-sequencer/examples/run-002-mix-change/profile-result.json +6816 -0
  20. package/packs/neon-step-sequencer/examples/run-002-mix-change/summary.md +37 -0
  21. package/packs/neon-step-sequencer/examples/run-003-full-matrix/profile-result.json +18490 -0
  22. package/packs/neon-step-sequencer/examples/run-003-full-matrix/summary.md +33 -0
  23. package/packs/neon-step-sequencer/examples/run-004-ratchet-loop-mix-level-search/profile-result.json +7003 -0
  24. package/packs/neon-step-sequencer/examples/run-004-ratchet-loop-mix-level-search/summary.md +39 -0
  25. package/packs/neon-step-sequencer/profile.template.json +75 -0
  26. package/packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json +112 -0
  27. package/packs/neon-step-sequencer/profiles/fast-mix-health.json +181 -0
  28. package/packs/neon-step-sequencer/profiles/full-mix-health-matrix.json +154 -0
  29. package/packs/neon-step-sequencer/profiles/mix-change-before-after.json +202 -0
  30. package/packs/neon-step-sequencer/profiles/mobile-trainer-layout.json +109 -0
  31. package/packs/neon-step-sequencer/profiles/playback-sync.json +126 -0
  32. package/packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json +137 -0
  33. package/packs/neon-step-sequencer/profiles/source-readiness.json +114 -0
package/dist/index.js CHANGED
@@ -695,6 +695,1157 @@ var profile_default6 = {
695
695
  }
696
696
  };
697
697
 
698
+ // packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json
699
+ var explore_songs_and_mixes_default = {
700
+ version: "riddle-proof.profile.v1",
701
+ name: "neon-step-sequencer-explore-songs-and-mixes",
702
+ target: {
703
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
704
+ viewports: [
705
+ {
706
+ name: "desktop",
707
+ width: 1440,
708
+ height: 1e3
709
+ }
710
+ ],
711
+ timeout_sec: 360,
712
+ wait_for_selector: ".drum-sequencer h1",
713
+ setup_actions: [
714
+ {
715
+ type: "window_eval",
716
+ label: "install-neon-exploration-proof",
717
+ timeout_ms: 1e4,
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};",
720
+ return_summary_fields: [
721
+ {
722
+ path: "available"
723
+ },
724
+ {
725
+ path: "selectedSong"
726
+ }
727
+ ]
728
+ },
729
+ {
730
+ type: "assert_window_value",
731
+ path: "__neonProof.install.available",
732
+ expected_value: true,
733
+ timeout_ms: 1e4
734
+ },
735
+ {
736
+ type: "window_call",
737
+ label: "render-proof-windows",
738
+ path: "__neonProofWindows",
739
+ store_return_to: "__neonProof.exploration",
740
+ capture_return: true,
741
+ timeout_ms: 18e4,
742
+ return_summary_fields: [
743
+ {
744
+ path: "ok"
745
+ },
746
+ {
747
+ path: "proofKind"
748
+ },
749
+ {
750
+ path: "windows.length"
751
+ }
752
+ ]
753
+ },
754
+ {
755
+ type: "assert_window_value",
756
+ path: "__neonProof.exploration.ok",
757
+ expected_value: true,
758
+ timeout_ms: 1e4
759
+ },
760
+ {
761
+ type: "screenshot",
762
+ label: "neon-explore-songs-and-mixes",
763
+ mode: "viewport"
764
+ }
765
+ ]
766
+ },
767
+ checks: [
768
+ {
769
+ type: "route_loaded",
770
+ expected_path: "/games/drum-sequencer"
771
+ },
772
+ {
773
+ type: "selector_visible",
774
+ selector: ".drum-sequencer h1"
775
+ },
776
+ {
777
+ type: "no_fatal_console_errors"
778
+ }
779
+ ],
780
+ artifacts: [
781
+ "screenshot",
782
+ "console",
783
+ "dom_summary",
784
+ "proof_json"
785
+ ],
786
+ baseline_policy: "invariant_only",
787
+ failure_policy: {
788
+ environment_blocked: "neutral",
789
+ proof_insufficient: "review",
790
+ product_regression: "fail",
791
+ needs_human_review: "review"
792
+ },
793
+ metadata: {
794
+ pack_id: "neon_step_sequencer",
795
+ pack_public_name: "Neon Step Sequencer Pack",
796
+ evidence_role_pattern: "current_target",
797
+ purpose: "Exploration sweep over the app-provided proof windows for prioritizing the next weakest song/mix combination.",
798
+ required_receipts: [
799
+ "proof-window set returns ok",
800
+ "window receipts are captured",
801
+ "browser health is clean",
802
+ "screenshot is captured"
803
+ ],
804
+ does_not_prove: [
805
+ "every possible song/mix combination",
806
+ "subjective listening quality",
807
+ "mobile layout"
808
+ ]
809
+ }
810
+ };
811
+
812
+ // packs/neon-step-sequencer/profiles/fast-mix-health.json
813
+ var fast_mix_health_default = {
814
+ version: "riddle-proof.profile.v1",
815
+ name: "neon-step-sequencer-fast-mix-health",
816
+ target: {
817
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
818
+ viewports: [
819
+ {
820
+ name: "desktop",
821
+ width: 1440,
822
+ height: 1e3
823
+ }
824
+ ],
825
+ timeout_sec: 240,
826
+ wait_for_selector: ".drum-sequencer h1",
827
+ setup_actions: [
828
+ {
829
+ type: "wait_for_selector",
830
+ selector: ".drum-sequencer h1",
831
+ timeout_ms: 2e4
832
+ },
833
+ {
834
+ type: "window_eval",
835
+ label: "install-neon-proof-helpers",
836
+ timeout_ms: 1e4,
837
+ store_return_to: "__neonProof.install",
838
+ script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofRead=()=>{const api=window.__neonProofApi(); const diagnostic=api?.captureDiagnostic?.(); const state=api?.getState?.()||api?.getSummary?.()||diagnostic?.state||null; window.__neonProof={...(window.__neonProof||{}),state}; return {available:Boolean(api),route:state?.route||location.pathname,selectedSong:state?.selectedSong||state?.selected_song||null,hasMixer:Boolean(state?.profile?.mixerLevels||state?.mixerState?.levels)};}; window.__neonProofPrepare=async(options={})=>{const api=window.__neonProofApi(); return await (api?.prepareForAudioProof?.(options)||api?.prepareSampleSourcesForProof?.(options)||{ok:false,error:'missing prepareForAudioProof'});}; window.__neonProofRender=async(options={})=>{const api=window.__neonProofApi(); return await (api?.renderOfflineMetrics?.(options)||{ok:false,error:'missing renderOfflineMetrics'});}; return window.__neonProofRead();",
839
+ return_summary_fields: [
840
+ {
841
+ path: "available"
842
+ },
843
+ {
844
+ path: "selectedSong"
845
+ },
846
+ {
847
+ path: "hasMixer"
848
+ }
849
+ ]
850
+ },
851
+ {
852
+ type: "assert_window_value",
853
+ path: "__neonProof.install.available",
854
+ expected_value: true,
855
+ timeout_ms: 1e4
856
+ },
857
+ {
858
+ type: "window_call",
859
+ label: "prepare-audio-proof",
860
+ path: "__neonProofPrepare",
861
+ args: [
862
+ {
863
+ loadAll: false
864
+ }
865
+ ],
866
+ store_return_to: "__neonProof.sources",
867
+ capture_return: true,
868
+ timeout_ms: 9e4,
869
+ return_summary_fields: [
870
+ {
871
+ path: "ok"
872
+ },
873
+ {
874
+ path: "sources.drums"
875
+ },
876
+ {
877
+ path: "sources.bass"
878
+ }
879
+ ]
880
+ },
881
+ {
882
+ type: "window_call",
883
+ label: "render-baseline-metrics",
884
+ path: "__neonProofRender",
885
+ args: [
886
+ {
887
+ bars: 1,
888
+ seed: "neon-fast-mix-health",
889
+ monitorProfile: "smallSpeaker"
890
+ }
891
+ ],
892
+ store_return_to: "__neonProof.baseline",
893
+ capture_return: true,
894
+ timeout_ms: 12e4,
895
+ return_summary_fields: [
896
+ {
897
+ path: "ok"
898
+ },
899
+ {
900
+ path: "mixHealth.peak"
901
+ },
902
+ {
903
+ path: "mixHealth.rms"
904
+ },
905
+ {
906
+ path: "mixHealth.clipping"
907
+ }
908
+ ]
909
+ },
910
+ {
911
+ type: "assert_window_value",
912
+ path: "__neonProof.baseline.ok",
913
+ expected_value: true,
914
+ timeout_ms: 1e4
915
+ },
916
+ {
917
+ type: "assert_window_number",
918
+ path: "__neonProof.baseline.mixHealth.peak",
919
+ max_value: 0.98,
920
+ timeout_ms: 1e4
921
+ },
922
+ {
923
+ type: "assert_window_number",
924
+ path: "__neonProof.baseline.mixHealth.rms",
925
+ min_value: 5e-3,
926
+ timeout_ms: 1e4
927
+ },
928
+ {
929
+ type: "screenshot",
930
+ label: "neon-fast-mix-health",
931
+ mode: "viewport"
932
+ }
933
+ ]
934
+ },
935
+ checks: [
936
+ {
937
+ type: "route_loaded",
938
+ expected_path: "/games/drum-sequencer"
939
+ },
940
+ {
941
+ type: "selector_visible",
942
+ selector: ".drum-sequencer h1"
943
+ },
944
+ {
945
+ type: "text_visible",
946
+ text: "Neon Step Sequencer"
947
+ },
948
+ {
949
+ type: "selector_visible",
950
+ selector: ".drum-sequencer"
951
+ },
952
+ {
953
+ type: "no_horizontal_overflow",
954
+ max_overflow_px: 1
955
+ },
956
+ {
957
+ type: "no_fatal_console_errors"
958
+ }
959
+ ],
960
+ artifacts: [
961
+ "screenshot",
962
+ "console",
963
+ "dom_summary",
964
+ "proof_json"
965
+ ],
966
+ baseline_policy: "invariant_only",
967
+ failure_policy: {
968
+ environment_blocked: "neutral",
969
+ proof_insufficient: "review",
970
+ product_regression: "fail",
971
+ needs_human_review: "review"
972
+ },
973
+ metadata: {
974
+ pack_id: "neon_step_sequencer",
975
+ pack_public_name: "Neon Step Sequencer Pack",
976
+ evidence_role_pattern: "current_target",
977
+ purpose: "Fast current-target audit for Neon mixer state and one rendered audio-health receipt.",
978
+ required_receipts: [
979
+ "Neon route is loaded",
980
+ "app proof contract is available",
981
+ "selected song and mixer state are readable",
982
+ "audio proof preparation returns a receipt",
983
+ "offline render metrics return ok",
984
+ "mix peak is below clipping threshold",
985
+ "mix RMS is above silence threshold"
986
+ ],
987
+ does_not_prove: [
988
+ "subjective mix quality",
989
+ "that a visible mix edit affects rendered audio",
990
+ "full viewport or song/mix matrix coverage"
991
+ ]
992
+ }
993
+ };
994
+
995
+ // packs/neon-step-sequencer/profiles/full-mix-health-matrix.json
996
+ var full_mix_health_matrix_default = {
997
+ version: "riddle-proof.profile.v1",
998
+ name: "neon-step-sequencer-full-mix-health-matrix",
999
+ target: {
1000
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1001
+ viewports: [
1002
+ {
1003
+ name: "desktop",
1004
+ width: 1440,
1005
+ height: 1e3
1006
+ },
1007
+ {
1008
+ name: "phone",
1009
+ width: 390,
1010
+ height: 844
1011
+ },
1012
+ {
1013
+ name: "ipad-mini",
1014
+ width: 768,
1015
+ height: 1024
1016
+ },
1017
+ {
1018
+ name: "ipad",
1019
+ width: 820,
1020
+ height: 1180
1021
+ }
1022
+ ],
1023
+ timeout_sec: 300,
1024
+ wait_for_selector: ".drum-sequencer h1",
1025
+ setup_actions: [
1026
+ {
1027
+ type: "window_eval",
1028
+ label: "install-neon-matrix-proof",
1029
+ timeout_ms: 1e4,
1030
+ store_return_to: "__neonProof.install",
1031
+ script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofRender=async(options={})=>{const api=window.__neonProofApi(); return await (api?.renderOfflineMetrics?.(options)||{ok:false,error:'missing renderOfflineMetrics'});}; const api=window.__neonProofApi(); const state=api?.getState?.()||api?.getSummary?.()||{}; window.__neonProof={...(window.__neonProof||{}),state}; return {available:Boolean(api),route:state.route||location.pathname,selectedSong:state.selectedSong||null};",
1032
+ return_summary_fields: [
1033
+ {
1034
+ path: "available"
1035
+ },
1036
+ {
1037
+ path: "selectedSong"
1038
+ }
1039
+ ]
1040
+ },
1041
+ {
1042
+ type: "assert_window_value",
1043
+ path: "__neonProof.install.available",
1044
+ expected_value: true,
1045
+ timeout_ms: 1e4
1046
+ },
1047
+ {
1048
+ type: "window_call",
1049
+ label: "render-matrix-metrics",
1050
+ path: "__neonProofRender",
1051
+ args: [
1052
+ {
1053
+ bars: 1,
1054
+ seed: "neon-full-mix-health-matrix",
1055
+ monitorProfile: "smallSpeaker"
1056
+ }
1057
+ ],
1058
+ store_return_to: "__neonProof.matrixMetrics",
1059
+ capture_return: true,
1060
+ timeout_ms: 12e4,
1061
+ return_summary_fields: [
1062
+ {
1063
+ path: "ok"
1064
+ },
1065
+ {
1066
+ path: "mixHealth.peak"
1067
+ },
1068
+ {
1069
+ path: "mixHealth.rms"
1070
+ }
1071
+ ]
1072
+ },
1073
+ {
1074
+ type: "assert_window_value",
1075
+ path: "__neonProof.matrixMetrics.ok",
1076
+ expected_value: true,
1077
+ timeout_ms: 1e4
1078
+ },
1079
+ {
1080
+ type: "assert_window_number",
1081
+ path: "__neonProof.matrixMetrics.mixHealth.peak",
1082
+ max_value: 0.98,
1083
+ timeout_ms: 1e4
1084
+ },
1085
+ {
1086
+ type: "assert_window_number",
1087
+ path: "__neonProof.matrixMetrics.mixHealth.rms",
1088
+ min_value: 5e-3,
1089
+ timeout_ms: 1e4
1090
+ },
1091
+ {
1092
+ type: "screenshot",
1093
+ label: "neon-full-mix-health-matrix",
1094
+ mode: "viewport"
1095
+ }
1096
+ ]
1097
+ },
1098
+ checks: [
1099
+ {
1100
+ type: "route_loaded",
1101
+ expected_path: "/games/drum-sequencer"
1102
+ },
1103
+ {
1104
+ type: "selector_visible",
1105
+ selector: ".drum-sequencer h1"
1106
+ },
1107
+ {
1108
+ type: "selector_visible",
1109
+ selector: ".drum-sequencer"
1110
+ },
1111
+ {
1112
+ type: "no_mobile_horizontal_overflow"
1113
+ },
1114
+ {
1115
+ type: "no_fatal_console_errors"
1116
+ }
1117
+ ],
1118
+ artifacts: [
1119
+ "screenshot",
1120
+ "console",
1121
+ "dom_summary",
1122
+ "proof_json"
1123
+ ],
1124
+ baseline_policy: "invariant_only",
1125
+ failure_policy: {
1126
+ environment_blocked: "neutral",
1127
+ proof_insufficient: "review",
1128
+ product_regression: "fail"
1129
+ },
1130
+ metadata: {
1131
+ pack_id: "neon_step_sequencer",
1132
+ pack_public_name: "Neon Step Sequencer Pack",
1133
+ evidence_role_pattern: "current_target",
1134
+ purpose: "Current-target matrix for Neon route, layout, proof contract, and one rendered mix-health receipt across device-shaped viewports.",
1135
+ required_receipts: [
1136
+ "desktop, phone, iPad Mini, and iPad viewport evidence",
1137
+ "proof contract available in every selected viewport",
1138
+ "offline render metrics ok",
1139
+ "no clipping",
1140
+ "no low-level/silence regression",
1141
+ "mobile overflow is clean"
1142
+ ],
1143
+ does_not_prove: [
1144
+ "subjective listening quality",
1145
+ "every song/mix pair",
1146
+ "long-running transport behavior"
1147
+ ]
1148
+ }
1149
+ };
1150
+
1151
+ // packs/neon-step-sequencer/profiles/mix-change-before-after.json
1152
+ var mix_change_before_after_default = {
1153
+ version: "riddle-proof.profile.v1",
1154
+ name: "neon-step-sequencer-mix-change-before-after",
1155
+ target: {
1156
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1157
+ viewports: [
1158
+ {
1159
+ name: "desktop",
1160
+ width: 1440,
1161
+ height: 1e3
1162
+ }
1163
+ ],
1164
+ timeout_sec: 300,
1165
+ wait_for_selector: ".drum-sequencer h1",
1166
+ setup_actions: [
1167
+ {
1168
+ type: "window_eval",
1169
+ label: "install-neon-mix-change-proof",
1170
+ timeout_ms: 1e4,
1171
+ store_return_to: "__neonProof.install",
1172
+ script: `window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofRead=()=>{const api=window.__neonProofApi(); const diagnostic=api?.captureDiagnostic?.(); return api?.getState?.()||api?.getSummary?.()||diagnostic?.state||null;}; window.__neonProofRender=async(options={})=>{const api=window.__neonProofApi(); return await (api?.renderOfflineMetrics?.(options)||{ok:false,error:'missing renderOfflineMetrics'});}; window.__neonProofSetMixer=async(track,value)=>{const api=window.__neonProofApi(); if(api?.setMixerLevelForProof){return await api.setMixerLevelForProof(track,value);} const selector='.instrument-lane-'+track+' .instrument-lane-slider input[type="range"]'; const input=document.querySelector(selector); if(!input) return {ok:false,track,value,error:'missing slider'}; const setter=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value')?.set; if(setter) setter.call(input,String(value)); else input.value=String(value); input.dispatchEvent(new Event('input',{bubbles:true})); input.dispatchEvent(new Event('change',{bubbles:true})); return {ok:true,track,value:Number(input.value)};}; return {available:Boolean(window.__neonProofApi())};`
1173
+ },
1174
+ {
1175
+ type: "assert_window_value",
1176
+ path: "__neonProof.install.available",
1177
+ expected_value: true,
1178
+ timeout_ms: 1e4
1179
+ },
1180
+ {
1181
+ type: "window_call",
1182
+ label: "render-pre-action-metrics",
1183
+ path: "__neonProofRender",
1184
+ args: [
1185
+ {
1186
+ bars: 1,
1187
+ seed: "neon-mix-change-pre-action",
1188
+ monitorProfile: "smallSpeaker"
1189
+ }
1190
+ ],
1191
+ store_return_to: "__neonProof.preAction",
1192
+ capture_return: true,
1193
+ timeout_ms: 12e4,
1194
+ return_summary_fields: [
1195
+ {
1196
+ path: "ok"
1197
+ },
1198
+ {
1199
+ path: "mixHealth.peak"
1200
+ },
1201
+ {
1202
+ path: "mixHealth.rms"
1203
+ }
1204
+ ]
1205
+ },
1206
+ {
1207
+ type: "window_call",
1208
+ label: "apply-bass-focus-change",
1209
+ path: "__neonProofSetMixer",
1210
+ args: [
1211
+ "bass",
1212
+ 1.35
1213
+ ],
1214
+ store_return_to: "__neonProof.mixEdit",
1215
+ capture_return: true,
1216
+ timeout_ms: 1e4,
1217
+ return_summary_fields: [
1218
+ {
1219
+ path: "ok"
1220
+ },
1221
+ {
1222
+ path: "track"
1223
+ },
1224
+ {
1225
+ path: "value"
1226
+ }
1227
+ ]
1228
+ },
1229
+ {
1230
+ type: "wait",
1231
+ ms: 400
1232
+ },
1233
+ {
1234
+ type: "window_call",
1235
+ label: "render-post-action-metrics",
1236
+ path: "__neonProofRender",
1237
+ args: [
1238
+ {
1239
+ bars: 1,
1240
+ seed: "neon-mix-change-post-action",
1241
+ monitorProfile: "smallSpeaker"
1242
+ }
1243
+ ],
1244
+ store_return_to: "__neonProof.postAction",
1245
+ capture_return: true,
1246
+ timeout_ms: 12e4,
1247
+ return_summary_fields: [
1248
+ {
1249
+ path: "ok"
1250
+ },
1251
+ {
1252
+ path: "mixHealth.peak"
1253
+ },
1254
+ {
1255
+ path: "mixHealth.rms"
1256
+ }
1257
+ ]
1258
+ },
1259
+ {
1260
+ type: "window_eval",
1261
+ label: "classify-mix-change",
1262
+ timeout_ms: 1e4,
1263
+ store_return_to: "__neonProof.mixChange",
1264
+ script: "const pre=window.__neonProof?.preAction||{}; const post=window.__neonProof?.postAction||{}; const edit=window.__neonProof?.mixEdit||{}; const preRms=Number(pre.mixHealth?.rms||0); const postRms=Number(post.mixHealth?.rms||0); const peak=Number(post.mixHealth?.peak||0); const metricMoved=Math.abs(postRms-preRms)>0.00001||Math.abs(Number(post.mixHealth?.peak||0)-Number(pre.mixHealth?.peak||0))>0.00001; const out={ok:Boolean(pre.ok&&post.ok&&edit.ok&&metricMoved&&peak<0.98),levelChanged:Boolean(edit.ok),metricMoved,preRms,postRms,postPeak:peak}; window.__neonProof.mixChange=out; return out;",
1265
+ return_summary_fields: [
1266
+ {
1267
+ path: "ok"
1268
+ },
1269
+ {
1270
+ path: "levelChanged"
1271
+ },
1272
+ {
1273
+ path: "metricMoved"
1274
+ },
1275
+ {
1276
+ path: "postPeak"
1277
+ }
1278
+ ]
1279
+ },
1280
+ {
1281
+ type: "assert_window_value",
1282
+ path: "__neonProof.mixChange.levelChanged",
1283
+ expected_value: true,
1284
+ timeout_ms: 1e4
1285
+ },
1286
+ {
1287
+ type: "assert_window_value",
1288
+ path: "__neonProof.mixChange.metricMoved",
1289
+ expected_value: true,
1290
+ timeout_ms: 1e4
1291
+ },
1292
+ {
1293
+ type: "assert_window_number",
1294
+ path: "__neonProof.mixChange.postPeak",
1295
+ max_value: 0.98,
1296
+ timeout_ms: 1e4
1297
+ },
1298
+ {
1299
+ type: "screenshot",
1300
+ label: "neon-mix-change-post-action",
1301
+ mode: "viewport"
1302
+ }
1303
+ ]
1304
+ },
1305
+ checks: [
1306
+ {
1307
+ type: "route_loaded",
1308
+ expected_path: "/games/drum-sequencer"
1309
+ },
1310
+ {
1311
+ type: "selector_visible",
1312
+ selector: ".drum-sequencer h1"
1313
+ },
1314
+ {
1315
+ type: "no_horizontal_overflow",
1316
+ max_overflow_px: 1
1317
+ },
1318
+ {
1319
+ type: "no_fatal_console_errors"
1320
+ }
1321
+ ],
1322
+ artifacts: [
1323
+ "screenshot",
1324
+ "console",
1325
+ "dom_summary",
1326
+ "proof_json"
1327
+ ],
1328
+ baseline_policy: "invariant_only",
1329
+ failure_policy: {
1330
+ environment_blocked: "neutral",
1331
+ proof_insufficient: "review",
1332
+ product_regression: "fail",
1333
+ needs_human_review: "review"
1334
+ },
1335
+ metadata: {
1336
+ pack_id: "neon_step_sequencer",
1337
+ pack_public_name: "Neon Step Sequencer Pack",
1338
+ evidence_role_pattern: "interaction_snapshots",
1339
+ purpose: "Interaction proof that a pre-action/post-action mix edit changes objective audio metrics without clipping.",
1340
+ required_receipts: [
1341
+ "pre-action offline render metrics",
1342
+ "visible/user-like bass mix change",
1343
+ "post-action offline render metrics",
1344
+ "metric movement classification",
1345
+ "post-action clipping guardrail"
1346
+ ],
1347
+ does_not_prove: [
1348
+ "that the change sounds better",
1349
+ "that every mix control affects every render window",
1350
+ "cross-device control reachability"
1351
+ ]
1352
+ }
1353
+ };
1354
+
1355
+ // packs/neon-step-sequencer/profiles/mobile-trainer-layout.json
1356
+ var mobile_trainer_layout_default = {
1357
+ version: "riddle-proof.profile.v1",
1358
+ name: "neon-step-sequencer-mobile-trainer-layout",
1359
+ target: {
1360
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1361
+ viewports: [
1362
+ {
1363
+ name: "phone",
1364
+ width: 390,
1365
+ height: 844
1366
+ },
1367
+ {
1368
+ name: "ipad-mini",
1369
+ width: 768,
1370
+ height: 1024
1371
+ }
1372
+ ],
1373
+ timeout_sec: 180,
1374
+ wait_for_selector: ".drum-sequencer h1",
1375
+ setup_actions: [
1376
+ {
1377
+ type: "window_eval",
1378
+ label: "capture-mobile-trainer-state",
1379
+ timeout_ms: 1e4,
1380
+ store_return_to: "__neonProof.mobile",
1381
+ script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const state=api?.getState?.()||api?.getSummary?.()||{}; const trainer=document.querySelector('.instrument-trainer')||document.querySelector('[class*=trainer]'); const mix=document.querySelector('.mix-board')||document.querySelector('[class*=mix]'); const out={available:Boolean(api),route:state.route||location.pathname,selectedSong:state.selectedSong||null,trainerVisible:Boolean(trainer),mixVisible:Boolean(mix),scrollWidth:document.documentElement.scrollWidth,clientWidth:document.documentElement.clientWidth}; window.__neonProof={...(window.__neonProof||{}),mobile:out}; return out;",
1382
+ return_summary_fields: [
1383
+ {
1384
+ path: "available"
1385
+ },
1386
+ {
1387
+ path: "trainerVisible"
1388
+ },
1389
+ {
1390
+ path: "mixVisible"
1391
+ },
1392
+ {
1393
+ path: "scrollWidth"
1394
+ },
1395
+ {
1396
+ path: "clientWidth"
1397
+ }
1398
+ ]
1399
+ },
1400
+ {
1401
+ type: "assert_window_value",
1402
+ path: "__neonProof.mobile.available",
1403
+ expected_value: true,
1404
+ timeout_ms: 1e4
1405
+ },
1406
+ {
1407
+ type: "assert_window_value",
1408
+ path: "__neonProof.mobile.trainerVisible",
1409
+ expected_value: true,
1410
+ timeout_ms: 1e4
1411
+ },
1412
+ {
1413
+ type: "screenshot",
1414
+ label: "neon-mobile-trainer-layout",
1415
+ mode: "viewport"
1416
+ }
1417
+ ]
1418
+ },
1419
+ checks: [
1420
+ {
1421
+ type: "route_loaded",
1422
+ expected_path: "/games/drum-sequencer"
1423
+ },
1424
+ {
1425
+ type: "selector_visible",
1426
+ selector: ".drum-sequencer h1"
1427
+ },
1428
+ {
1429
+ type: "no_mobile_horizontal_overflow"
1430
+ },
1431
+ {
1432
+ type: "no_fatal_console_errors"
1433
+ }
1434
+ ],
1435
+ artifacts: [
1436
+ "screenshot",
1437
+ "console",
1438
+ "dom_summary",
1439
+ "proof_json"
1440
+ ],
1441
+ baseline_policy: "invariant_only",
1442
+ failure_policy: {
1443
+ environment_blocked: "neutral",
1444
+ proof_insufficient: "review",
1445
+ product_regression: "fail"
1446
+ },
1447
+ metadata: {
1448
+ pack_id: "neon_step_sequencer",
1449
+ pack_public_name: "Neon Step Sequencer Pack",
1450
+ evidence_role_pattern: "current_target",
1451
+ purpose: "Phone/tablet current-target audit for trainer reachability and overflow.",
1452
+ required_receipts: [
1453
+ "mobile trainer state is readable",
1454
+ "trainer surface is visible",
1455
+ "viewport screenshot is captured",
1456
+ "mobile overflow is clean"
1457
+ ],
1458
+ does_not_prove: [
1459
+ "all mixer controls are comfortable to use",
1460
+ "audio output quality",
1461
+ "desktop layout"
1462
+ ]
1463
+ }
1464
+ };
1465
+
1466
+ // packs/neon-step-sequencer/profiles/playback-sync.json
1467
+ var playback_sync_default = {
1468
+ version: "riddle-proof.profile.v1",
1469
+ name: "neon-step-sequencer-playback-sync",
1470
+ target: {
1471
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1472
+ viewports: [
1473
+ {
1474
+ name: "desktop",
1475
+ width: 1440,
1476
+ height: 1e3
1477
+ }
1478
+ ],
1479
+ timeout_sec: 180,
1480
+ wait_for_selector: ".drum-sequencer h1",
1481
+ setup_actions: [
1482
+ {
1483
+ type: "window_eval",
1484
+ label: "capture-pre-playback-state",
1485
+ timeout_ms: 1e4,
1486
+ store_return_to: "__neonProof.prePlayback",
1487
+ script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const state=api?.getPlaybackState?.()||api?.getSummary?.()?.trainer||null; window.__neonProof={...(window.__neonProof||{}),prePlayback:{available:Boolean(api),state}}; return window.__neonProof.prePlayback;",
1488
+ return_summary_fields: [
1489
+ {
1490
+ path: "available"
1491
+ },
1492
+ {
1493
+ path: "state.selectedInstrument"
1494
+ },
1495
+ {
1496
+ path: "state.currentStep"
1497
+ }
1498
+ ]
1499
+ },
1500
+ {
1501
+ type: "assert_window_value",
1502
+ path: "__neonProof.prePlayback.available",
1503
+ expected_value: true,
1504
+ timeout_ms: 1e4
1505
+ },
1506
+ {
1507
+ type: "click",
1508
+ selector: "button.drum-play",
1509
+ timeout_ms: 1e4
1510
+ },
1511
+ {
1512
+ type: "wait",
1513
+ ms: 900
1514
+ },
1515
+ {
1516
+ type: "window_eval",
1517
+ label: "capture-post-playback-state",
1518
+ timeout_ms: 1e4,
1519
+ store_return_to: "__neonProof.postPlayback",
1520
+ script: "const api=window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; const state=api?.getPlaybackState?.()||api?.getSummary?.()?.trainer||null; const summary=api?.getState?.()||api?.getSummary?.()||{}; const out={available:Boolean(api),isPlaying:Boolean(summary.isPlaying),state}; window.__neonProof={...(window.__neonProof||{}),postPlayback:out}; return out;",
1521
+ return_summary_fields: [
1522
+ {
1523
+ path: "isPlaying"
1524
+ },
1525
+ {
1526
+ path: "state.currentStep"
1527
+ },
1528
+ {
1529
+ path: "state.selectedInstrument"
1530
+ }
1531
+ ]
1532
+ },
1533
+ {
1534
+ type: "assert_window_value",
1535
+ path: "__neonProof.postPlayback.available",
1536
+ expected_value: true,
1537
+ timeout_ms: 1e4
1538
+ },
1539
+ {
1540
+ type: "screenshot",
1541
+ label: "neon-playback-sync",
1542
+ mode: "viewport"
1543
+ }
1544
+ ]
1545
+ },
1546
+ checks: [
1547
+ {
1548
+ type: "route_loaded",
1549
+ expected_path: "/games/drum-sequencer"
1550
+ },
1551
+ {
1552
+ type: "selector_visible",
1553
+ selector: ".drum-sequencer h1"
1554
+ },
1555
+ {
1556
+ type: "selector_visible",
1557
+ selector: "button.drum-play"
1558
+ },
1559
+ {
1560
+ type: "no_fatal_console_errors"
1561
+ }
1562
+ ],
1563
+ artifacts: [
1564
+ "screenshot",
1565
+ "console",
1566
+ "dom_summary",
1567
+ "proof_json"
1568
+ ],
1569
+ baseline_policy: "invariant_only",
1570
+ failure_policy: {
1571
+ environment_blocked: "neutral",
1572
+ proof_insufficient: "review",
1573
+ product_regression: "fail"
1574
+ },
1575
+ metadata: {
1576
+ pack_id: "neon_step_sequencer",
1577
+ pack_public_name: "Neon Step Sequencer Pack",
1578
+ evidence_role_pattern: "interaction_snapshots",
1579
+ purpose: "Interaction proof that visible playback state and proof-contract playback state can be captured together.",
1580
+ required_receipts: [
1581
+ "pre-action playback state",
1582
+ "play button interaction",
1583
+ "post-action playback state",
1584
+ "screenshot after interaction"
1585
+ ],
1586
+ does_not_prove: [
1587
+ "long-running transport timing",
1588
+ "audio output quality",
1589
+ "song-wide playback correctness"
1590
+ ]
1591
+ }
1592
+ };
1593
+
1594
+ // packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json
1595
+ var ratchet_loop_mix_level_search_default = {
1596
+ version: "riddle-proof.profile.v1",
1597
+ name: "neon-step-sequencer-ratchet-loop-mix-level-search",
1598
+ target: {
1599
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1600
+ viewports: [
1601
+ {
1602
+ name: "desktop",
1603
+ width: 1440,
1604
+ height: 1e3
1605
+ }
1606
+ ],
1607
+ timeout_sec: 360,
1608
+ wait_for_selector: ".drum-sequencer h1",
1609
+ setup_actions: [
1610
+ {
1611
+ type: "window_eval",
1612
+ label: "capture-neon-contract",
1613
+ timeout_ms: 1e4,
1614
+ store_return_to: "__neonMixProof.contract",
1615
+ script: "const contract=window.__NEON_MIX_PROOF__; const diagnostic=contract?.captureDiagnostic?.(); window.__neonMixProof={...(window.__neonMixProof||{}),contract:{available:Boolean(contract),diagnostic}}; return window.__neonMixProof.contract;",
1616
+ return_summary_fields: [
1617
+ {
1618
+ path: "available"
1619
+ },
1620
+ {
1621
+ path: "diagnostic.selectedSong.selectedSong"
1622
+ }
1623
+ ]
1624
+ },
1625
+ {
1626
+ type: "assert_window_value",
1627
+ path: "__neonMixProof.contract.available",
1628
+ expected_value: true,
1629
+ timeout_ms: 1e4
1630
+ },
1631
+ {
1632
+ type: "window_call",
1633
+ label: "run-ratchet-loop-mix-level-search",
1634
+ path: "__NEON_MIX_PROOF__.runRatchetLoop",
1635
+ args: [
1636
+ {
1637
+ strategy: "mix-level-search",
1638
+ focusTracks: [
1639
+ "bass",
1640
+ "chord",
1641
+ "guitar",
1642
+ "rhythmSynth"
1643
+ ],
1644
+ maxIterations: 6,
1645
+ monitorProfile: "smallSpeaker",
1646
+ restore: true,
1647
+ applyBest: false,
1648
+ minImprovement: 0.1
1649
+ }
1650
+ ],
1651
+ store_return_to: "__neonMixProof.ratchetLoop",
1652
+ capture_return: true,
1653
+ timeout_ms: 24e4,
1654
+ return_summary_fields: [
1655
+ {
1656
+ path: "ok"
1657
+ },
1658
+ {
1659
+ path: "status"
1660
+ },
1661
+ {
1662
+ path: "strategy"
1663
+ },
1664
+ {
1665
+ path: "improvement"
1666
+ },
1667
+ {
1668
+ path: "best.candidate.track"
1669
+ }
1670
+ ]
1671
+ },
1672
+ {
1673
+ type: "assert_window_value",
1674
+ path: "__neonMixProof.ratchetLoop.ok",
1675
+ expected_value: true,
1676
+ timeout_ms: 1e4
1677
+ },
1678
+ {
1679
+ type: "screenshot",
1680
+ label: "neon-ratchet-loop-mix-level-search",
1681
+ mode: "viewport"
1682
+ }
1683
+ ]
1684
+ },
1685
+ checks: [
1686
+ {
1687
+ type: "route_loaded",
1688
+ expected_path: "/games/drum-sequencer"
1689
+ },
1690
+ {
1691
+ type: "selector_visible",
1692
+ selector: ".drum-sequencer h1"
1693
+ },
1694
+ {
1695
+ type: "no_horizontal_overflow"
1696
+ },
1697
+ {
1698
+ type: "no_fatal_console_errors"
1699
+ }
1700
+ ],
1701
+ artifacts: [
1702
+ "screenshot",
1703
+ "console",
1704
+ "dom_summary",
1705
+ "proof_json"
1706
+ ],
1707
+ baseline_policy: "invariant_only",
1708
+ failure_policy: {
1709
+ environment_blocked: "neutral",
1710
+ proof_insufficient: "review",
1711
+ needs_human_review: "review",
1712
+ product_regression: "fail"
1713
+ },
1714
+ metadata: {
1715
+ pack_id: "neon_step_sequencer",
1716
+ pack_public_name: "Neon Step Sequencer Pack",
1717
+ evidence_role_pattern: "interaction_snapshots",
1718
+ purpose: "Run a bounded automated ratchet loop using the Neon mix-level-search strategy.",
1719
+ required_receipts: [
1720
+ "ratchet loop returns ok",
1721
+ "baseline proof-window summary is captured",
1722
+ "candidate attempts are captured",
1723
+ "best candidate or human-review status is captured"
1724
+ ],
1725
+ does_not_prove: [
1726
+ "subjective mix quality",
1727
+ "that the best objective candidate should be kept",
1728
+ "all possible mix edits"
1729
+ ]
1730
+ }
1731
+ };
1732
+
1733
+ // packs/neon-step-sequencer/profiles/source-readiness.json
1734
+ var source_readiness_default = {
1735
+ version: "riddle-proof.profile.v1",
1736
+ name: "neon-step-sequencer-source-readiness",
1737
+ target: {
1738
+ route: "/games/drum-sequencer?song=monkberry-moon-delight-tab&mix=profile&view=trainer&instrument=bass",
1739
+ viewports: [
1740
+ {
1741
+ name: "desktop",
1742
+ width: 1440,
1743
+ height: 1e3
1744
+ }
1745
+ ],
1746
+ timeout_sec: 300,
1747
+ wait_for_selector: ".drum-sequencer h1",
1748
+ setup_actions: [
1749
+ {
1750
+ type: "window_eval",
1751
+ label: "install-neon-source-proof",
1752
+ timeout_ms: 1e4,
1753
+ store_return_to: "__neonProof.install",
1754
+ script: "window.__neonProofApi=()=>window.__NEON_MIX_PROOF__||window.__RIDDLE_SEQUENCER_PROOF__; window.__neonProofPrepare=async(options={})=>{const api=window.__neonProofApi(); return await (api?.prepareForAudioProof?.(options)||api?.prepareSampleSourcesForProof?.(options)||{ok:false,error:'missing prepareForAudioProof'});}; return {available:Boolean(window.__neonProofApi())};"
1755
+ },
1756
+ {
1757
+ type: "assert_window_value",
1758
+ path: "__neonProof.install.available",
1759
+ expected_value: true,
1760
+ timeout_ms: 1e4
1761
+ },
1762
+ {
1763
+ type: "window_call",
1764
+ label: "load-required-sources",
1765
+ path: "__neonProofPrepare",
1766
+ args: [
1767
+ {
1768
+ loadAll: true
1769
+ }
1770
+ ],
1771
+ store_return_to: "__neonProof.sources",
1772
+ capture_return: true,
1773
+ timeout_ms: 12e4,
1774
+ return_summary_fields: [
1775
+ {
1776
+ path: "ok"
1777
+ },
1778
+ {
1779
+ path: "states.drums.status"
1780
+ },
1781
+ {
1782
+ path: "states.bass.status"
1783
+ },
1784
+ {
1785
+ path: "states.guitar.status"
1786
+ },
1787
+ {
1788
+ path: "states.vocal.status"
1789
+ }
1790
+ ]
1791
+ },
1792
+ {
1793
+ type: "assert_window_value",
1794
+ path: "__neonProof.sources.ok",
1795
+ expected_value: true,
1796
+ timeout_ms: 1e4
1797
+ },
1798
+ {
1799
+ type: "screenshot",
1800
+ label: "neon-source-readiness",
1801
+ mode: "viewport"
1802
+ }
1803
+ ]
1804
+ },
1805
+ checks: [
1806
+ {
1807
+ type: "route_loaded",
1808
+ expected_path: "/games/drum-sequencer"
1809
+ },
1810
+ {
1811
+ type: "selector_visible",
1812
+ selector: ".drum-sequencer h1"
1813
+ },
1814
+ {
1815
+ type: "no_fatal_console_errors"
1816
+ }
1817
+ ],
1818
+ artifacts: [
1819
+ "screenshot",
1820
+ "console",
1821
+ "dom_summary",
1822
+ "proof_json"
1823
+ ],
1824
+ baseline_policy: "invariant_only",
1825
+ failure_policy: {
1826
+ environment_blocked: "neutral",
1827
+ proof_insufficient: "review",
1828
+ product_regression: "fail"
1829
+ },
1830
+ metadata: {
1831
+ pack_id: "neon_step_sequencer",
1832
+ pack_public_name: "Neon Step Sequencer Pack",
1833
+ evidence_role_pattern: "current_target",
1834
+ purpose: "Current-target audit for sample/source readiness before metric claims.",
1835
+ required_receipts: [
1836
+ "source proof helper is available",
1837
+ "required source loaders complete",
1838
+ "sample/source states are captured",
1839
+ "console health is clean"
1840
+ ],
1841
+ does_not_prove: [
1842
+ "offline metric quality",
1843
+ "subjective source quality",
1844
+ "full song playback"
1845
+ ]
1846
+ }
1847
+ };
1848
+
698
1849
  // packs/page-content-basic/profile.json
699
1850
  var profile_default7 = {
700
1851
  version: "riddle-proof.profile.v1",
@@ -1001,8 +2152,26 @@ var rawProfiles = {
1001
2152
  "terminal-result-partial-evidence": profile_default10,
1002
2153
  "gameplay-window-call-until": profile_default3,
1003
2154
  "canvas-gameplay": profile_default2,
1004
- "auth-smoke": profile_default
2155
+ "auth-smoke": profile_default,
2156
+ "neon-step-sequencer-fast-mix-health": fast_mix_health_default,
2157
+ "neon-step-sequencer-source-readiness": source_readiness_default,
2158
+ "neon-step-sequencer-playback-sync": playback_sync_default,
2159
+ "neon-step-sequencer-mix-change-before-after": mix_change_before_after_default,
2160
+ "neon-step-sequencer-mobile-trainer-layout": mobile_trainer_layout_default,
2161
+ "neon-step-sequencer-full-mix-health-matrix": full_mix_health_matrix_default,
2162
+ "neon-step-sequencer-explore-songs-and-mixes": explore_songs_and_mixes_default,
2163
+ "neon-step-sequencer-ratchet-loop-mix-level-search": ratchet_loop_mix_level_search_default
1005
2164
  };
2165
+ var sourcePathOverrides = Object.freeze({
2166
+ "neon-step-sequencer-fast-mix-health": "packs/neon-step-sequencer/profiles/fast-mix-health.json",
2167
+ "neon-step-sequencer-source-readiness": "packs/neon-step-sequencer/profiles/source-readiness.json",
2168
+ "neon-step-sequencer-playback-sync": "packs/neon-step-sequencer/profiles/playback-sync.json",
2169
+ "neon-step-sequencer-mix-change-before-after": "packs/neon-step-sequencer/profiles/mix-change-before-after.json",
2170
+ "neon-step-sequencer-mobile-trainer-layout": "packs/neon-step-sequencer/profiles/mobile-trainer-layout.json",
2171
+ "neon-step-sequencer-full-mix-health-matrix": "packs/neon-step-sequencer/profiles/full-mix-health-matrix.json",
2172
+ "neon-step-sequencer-explore-songs-and-mixes": "packs/neon-step-sequencer/profiles/explore-songs-and-mixes.json",
2173
+ "neon-step-sequencer-ratchet-loop-mix-level-search": "packs/neon-step-sequencer/profiles/ratchet-loop-mix-level-search.json"
2174
+ });
1006
2175
  var RIDDLE_PROOF_PACK_PROFILES = Object.freeze(
1007
2176
  Object.fromEntries(
1008
2177
  Object.entries(rawProfiles).map(([slug, raw]) => {
@@ -1020,7 +2189,7 @@ var RIDDLE_PROOF_PACK_MANIFEST = Object.freeze(
1020
2189
  name: profile.name,
1021
2190
  profile,
1022
2191
  slug,
1023
- sourcePath: `packs/${slug}/profile.json`,
2192
+ sourcePath: sourcePathOverrides[slug] || `packs/${slug}/profile.json`,
1024
2193
  ...metadata
1025
2194
  });
1026
2195
  })
@@ -1066,14 +2235,15 @@ import { normalizeRiddleProofProfile as normalizeRiddleProofProfile2 } from "@ri
1066
2235
  function instantiateRiddleProofProfile(profileName, options = {}) {
1067
2236
  const manifest = getRiddleProofPackProfileManifest(profileName);
1068
2237
  if (!manifest) throw new Error(`Unknown proof pack profile: ${profileName}`);
2238
+ const profile = JSON.parse(JSON.stringify(manifest.profile));
1069
2239
  const targetOverride = {
1070
- ...manifest.profile.target,
2240
+ ...profile.target,
1071
2241
  ...options.target || {},
1072
- url: options.url ?? manifest.profile.target.url,
1073
- route: options.route ?? manifest.profile.target.route
2242
+ url: options.url ?? profile.target.url,
2243
+ route: options.route ?? profile.target.route
1074
2244
  };
1075
2245
  return normalizeRiddleProofProfile2(
1076
- { ...manifest.profile, target: targetOverride },
2246
+ { ...profile, target: targetOverride },
1077
2247
  {
1078
2248
  url: targetOverride.url,
1079
2249
  route: targetOverride.route,