[PASS] ProfileScoreEngine sums scores per profile correctly [PASS] ProfileScoreEngine returns empty array for empty input [PASS] ProfileScoreEngine handles a zero score explicitly (floor=0 rule, PRD ยง4.6) [PASS] WinnerSelector single mode: clear winner has reason "top" [PASS] WinnerSelector single mode: clear winner picks the highest score [PASS] WinnerSelector single mode: clear winner has no secondary [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 0) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 0) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 1) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 1) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 2) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 2) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 3) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 3) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 4) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 4) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 5) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 5) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 6) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 6) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 7) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 7) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 8) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 8) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 9) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 9) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 10) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 10) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 11) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 11) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 12) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 12) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 13) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 13) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 14) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 14) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 15) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 15) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 16) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 16) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 17) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 17) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 18) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 18) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 19) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 19) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 20) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 20) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 21) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 21) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 22) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 22) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 23) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 23) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 24) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 24) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 25) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 25) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 26) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 26) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 27) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 27) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 28) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 28) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 29) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 29) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 30) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 30) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 31) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 31) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 32) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 32) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 33) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 33) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 34) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 34) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 35) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 35) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 36) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 36) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 37) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 37) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 38) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 38) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 39) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 39) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 40) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 40) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 41) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 41) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 42) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 42) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 43) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 43) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 44) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 44) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 45) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 45) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 46) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 46) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 47) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 47) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 48) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 48) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 49) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 49) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 50) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 50) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 51) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 51) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 52) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 52) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 53) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 53) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 54) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 54) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 55) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 55) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 56) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 56) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 57) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 57) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 58) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 58) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 59) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 59) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 60) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 60) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 61) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 61) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 62) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 62) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 63) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 63) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 64) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 64) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 65) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 65) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 66) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 66) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 67) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 67) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 68) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 68) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 69) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 69) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 70) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 70) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 71) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 71) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 72) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 72) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 73) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 73) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 74) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 74) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 75) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 75) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 76) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 76) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 77) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 77) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 78) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 78) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 79) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 79) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 80) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 80) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 81) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 81) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 82) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 82) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 83) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 83) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 84) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 84) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 85) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 85) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 86) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 86) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 87) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 87) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 88) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 88) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 89) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 89) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 90) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 90) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 91) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 91) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 92) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 92) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 93) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 93) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 94) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 94) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 95) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 95) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 96) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 96) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 97) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 97) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 98) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 98) [PASS] WinnerSelector single-mode tie always reports reason=tie_random (run 99) [PASS] WinnerSelector single-mode tie always picks one of the tied profiles (run 99) [PASS] WinnerSelector single-mode tie distribution picks BOTH tied profiles across 100 runs (not always the same one) [PASS] WinnerSelector single_only reason when the test has exactly one profile [PASS] WinnerSelector single_only still returns that one profile as primary [PASS] WinnerSelector dual_on_close within threshold: reason=dual_close [PASS] WinnerSelector dual_on_close within threshold: shows both profiles [PASS] WinnerSelector dual_on_close beyond threshold: reason=dual_far [PASS] WinnerSelector dual_on_close beyond threshold: only primary shown, no secondary [PASS] WinnerSelector dual_on_close exact tie: reason=dual_tie [PASS] WinnerSelector dual_on_close exact tie: shows both tied profiles [PASS] WinnerSelector dual_on_close with threshold=0 and gap=1 is "far" (single shown) [PASS] Selection::toMeta() is JSON-encodable without error [PASS] Selection::toMeta() contains the selection reason [PASS] CallbackCodec encodes an option callback under 64 bytes [PASS] CallbackCodec decodes its own encoded option payload [PASS] CallbackCodec rejects non-numeric fields [PASS] CallbackCodec rejects wrong namespace [PASS] CallbackCodec rejects wrong field count [PASS] CallbackCodec rejects empty string [PASS] CallbackCodec rejects oversized garbage [PASS] CallbackCodec encodes/decodes a test-action callback [PASS] CallbackCodec rejects an unknown test action [PASS] StartPayloadParser: empty payload has no slug/campaign [PASS] StartPayloadParser: "t_{slug}" parses the slug [PASS] StartPayloadParser: "t_{slug}" has no campaign [PASS] StartPayloadParser: "t_{slug}__c_{campaign}" parses both fields [PASS] StartPayloadParser: "c_{campaign}" parses campaign only [PASS] StartPayloadParser: garbage payload never crashes and yields no slug/campaign PHASE 5 SCORE ENGINE TEST RESULT: OK (0 failures)