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