-module(lightspeed@ops@quality_harness). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/lightspeed/ops/quality_harness.gleam"). -export([run_scenario/1, run_matrix/0, scenario_label/1, pass_fail_label/1, signature/1, deterministic/1, scenario/1, outcomes/1, failed_scenarios/1, nondeterministic_failures/1, report_signature/1]). -export_type([scenario/0, scenario_outcome/0, report/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(" Quality parity harness for M10 compatibility and determinism gates.\n"). -type scenario() :: mount_conformance | bad_frame_fault | stale_ref_fault | throttled_client_fault | replay_reconnect_crash. -type scenario_outcome() :: {scenario_outcome, scenario(), boolean(), boolean(), binary()}. -type report() :: {report, list(scenario_outcome()), integer(), integer()}. -file("src/lightspeed/ops/quality_harness.gleam", 495). -spec count_nondeterministic(list(scenario_outcome())) -> integer(). count_nondeterministic(Outcomes) -> case Outcomes of [] -> 0; [Outcome | Rest] -> case erlang:element(4, Outcome) of true -> count_nondeterministic(Rest); false -> 1 + count_nondeterministic(Rest) end end. -file("src/lightspeed/ops/quality_harness.gleam", 484). -spec count_failed(list(scenario_outcome())) -> integer(). count_failed(Outcomes) -> case Outcomes of [] -> 0; [Outcome | Rest] -> case erlang:element(3, Outcome) of true -> count_failed(Rest); false -> 1 + count_failed(Rest) end end. -file("src/lightspeed/ops/quality_harness.gleam", 442). -spec lifecycle_label_from_session(lightspeed@agent@session:session()) -> binary(). lifecycle_label_from_session(State) -> _pipe = State, _pipe@1 = lightspeed@agent@session:lifecycle(_pipe), lightspeed@agent@typestate:lifecycle_to_string(_pipe@1). -file("src/lightspeed/ops/quality_harness.gleam", 459). -spec telemetry_labels( list(lightspeed@agent@session:telemetry_event()), list(binary()) ) -> list(binary()). telemetry_labels(Events, Labels_rev) -> case Events of [] -> lists:reverse(Labels_rev); [Event | Rest] -> telemetry_labels( Rest, [lightspeed@agent@session:telemetry_label(Event) | Labels_rev] ) end. -file("src/lightspeed/ops/quality_harness.gleam", 513). -spec join_with_loop(list(binary()), binary(), binary()) -> binary(). join_with_loop(Values, Separator, Acc) -> case Values of [] -> Acc; [Entry | Rest] -> join_with_loop( Rest, Separator, <<<>/binary, Entry/binary>> ) end. -file("src/lightspeed/ops/quality_harness.gleam", 506). -spec join_with(list(binary()), binary()) -> binary(). join_with(Values, Separator) -> case Values of [] -> <<""/utf8>>; [First | Rest] -> join_with_loop(Rest, Separator, First) end. -file("src/lightspeed/ops/quality_harness.gleam", 448). -spec session_signature(lightspeed@agent@session:session()) -> binary(). session_signature(State) -> <<<<<<<<<<<<<<"lifecycle="/utf8, (lifecycle_label_from_session(State))/binary>>/binary, ",counter="/utf8>>/binary, (erlang:integer_to_binary( lightspeed@agent@session:counter(State) ))/binary>>/binary, ",pending="/utf8>>/binary, (erlang:integer_to_binary( erlang:length( lightspeed@agent@session:pending_patches(State) ) ))/binary>>/binary, ",telemetry="/utf8>>/binary, (join_with( telemetry_labels(lightspeed@agent@session:telemetry(State), []), <<","/utf8>> ))/binary>>. -file("src/lightspeed/ops/quality_harness.gleam", 308). -spec replay_loop( lightspeed@agent@session:session(), binary(), list(lightspeed@agent@session:inbox_event()) ) -> lightspeed@agent@session:session(). replay_loop(State, Owner, Events) -> case Events of [] -> State; [Event | Rest] -> replay_loop( lightspeed@agent@session:handle( State, {inbox_message, Owner, Event} ), Owner, Rest ) end. -file("src/lightspeed/ops/quality_harness.gleam", 300). -spec replay_events(list(lightspeed@agent@session:inbox_event())) -> lightspeed@agent@session:session(). replay_events(Events) -> replay_loop( lightspeed@agent@session:start( <<"replay-1"/utf8>>, <<"proc-a"/utf8>>, rehydrate, 0, 100 ), <<"proc-a"/utf8>>, Events ). -file("src/lightspeed/ops/quality_harness.gleam", 276). -spec evaluate_replay_reconnect_crash() -> {boolean(), binary()}. evaluate_replay_reconnect_crash() -> Events = [{connect, <<"/counter"/utf8>>, <<"csrf"/utf8>>, 0}, increment, increment, {crash, <<"boom"/utf8>>}, {restart, 5}, {reconnect, <<"/counter"/utf8>>, 10}, increment, {ack, <<"stale-ref"/utf8>>}], First = replay_events(Events), Second = replay_events(Events), Signature_1 = session_signature(First), Signature_2 = session_signature(Second), Passed = ((Signature_1 =:= Signature_2) andalso (lifecycle_label_from_session( First ) =:= <<"live"/utf8>>)) andalso (lightspeed@agent@session:counter(First) =:= 3), {Passed, Signature_1}. -file("src/lightspeed/ops/quality_harness.gleam", 423). -spec first_failure_reason(list(binary())) -> binary(). first_failure_reason(Frames) -> case Frames of [] -> <<"missing_failure"/utf8>>; [Payload | Rest] -> case lightspeed@protocol:decode(Payload) of {ok, {failure, _, Reason}} -> Reason; {ok, _} -> first_failure_reason(Rest); {error, Error} -> <<"frame_decode_error:"/utf8, (lightspeed@protocol:decode_error_to_string(Error))/binary>> end end. -file("src/lightspeed/ops/quality_harness.gleam", 324). -spec connect_default(integer()) -> {ok, {lightspeed@transport@wisp_websocket:adapter_state(), list(binary())}} | {error, binary()}. connect_default(Now_ms) -> Result = lightspeed@transport@wisp_websocket:connect( lightspeed@agent@session:start( <<"s-1"/utf8>>, <<"proc-a"/utf8>>, rehydrate, 0, 100 ), {web_socket_request, <<"/counter"/utf8>>, <<"csrf"/utf8>>, <<"https://example.test"/utf8>>, Now_ms}, lightspeed@transport@contract:allow_all(<<"proc-a"/utf8>>) ), case Result of {connected, State, Outbound_frames} -> {ok, {State, Outbound_frames}}; {rejected, Error} -> {error, lightspeed@transport@contract:error_to_string(Error)} end. -file("src/lightspeed/ops/quality_harness.gleam", 250). -spec evaluate_throttled_client_fault() -> {boolean(), binary()}. evaluate_throttled_client_fault() -> case connect_default(0) of {error, Reason} -> {false, <<"connect_error:"/utf8, Reason/binary>>}; {ok, {State, _}} -> Result = lightspeed@transport@wisp_websocket:receive_with_hooks( State, lightspeed@protocol:encode( {event, <<"e-1"/utf8>>, <<"increment"/utf8>>, <<"{}"/utf8>>} ), 5, lightspeed@transport@contract:deny_rate_limit( <<"throttled"/utf8>>, 120 ) ), Reason@1 = first_failure_reason(erlang:element(3, Result)), Counter = lightspeed@agent@session:counter( lightspeed@transport@wisp_websocket:session_state( erlang:element(2, Result) ) ), Passed = (Reason@1 =:= <<"rate_limited:throttled:120"/utf8>>) andalso (Counter =:= 0), {Passed, <<<<<<"reason="/utf8, Reason@1/binary>>/binary, ",counter="/utf8>>/binary, (erlang:integer_to_binary(Counter))/binary>>} end. -file("src/lightspeed/ops/quality_harness.gleam", 470). -spec count_telemetry_label( list(lightspeed@agent@session:telemetry_event()), binary() ) -> integer(). count_telemetry_label(Events, Label) -> case Events of [] -> 0; [Event | Rest] -> case lightspeed@agent@session:telemetry_label(Event) =:= Label of true -> 1 + count_telemetry_label(Rest, Label); false -> count_telemetry_label(Rest, Label) end end. -file("src/lightspeed/ops/quality_harness.gleam", 218). -spec evaluate_stale_ref_fault() -> {boolean(), binary()}. evaluate_stale_ref_fault() -> case connect_default(0) of {error, Reason} -> {false, <<"connect_error:"/utf8, Reason/binary>>}; {ok, {State, _}} -> Stale = lightspeed@transport@wisp_websocket:'receive'( State, lightspeed@protocol:encode({ack, <<"stale-ref"/utf8>>}), 1 ), Session_state = lightspeed@transport@wisp_websocket:session_state( erlang:element(2, Stale) ), Pending = erlang:length( lightspeed@agent@session:pending_patches(Session_state) ), Emitted = erlang:length(erlang:element(3, Stale)), Ignored = count_telemetry_label( lightspeed@agent@session:telemetry(Session_state), <<"event_ignored"/utf8>> ), Passed = ((Pending =:= 1) andalso (Emitted =:= 0)) andalso (Ignored >= 1), {Passed, <<<<<<<<<<"pending="/utf8, (erlang:integer_to_binary(Pending))/binary>>/binary, ",outbound_frames="/utf8>>/binary, (erlang:integer_to_binary(Emitted))/binary>>/binary, ",ignored="/utf8>>/binary, (erlang:integer_to_binary(Ignored))/binary>>} end. -file("src/lightspeed/ops/quality_harness.gleam", 198). -spec evaluate_bad_frame_fault() -> {boolean(), binary()}. evaluate_bad_frame_fault() -> case connect_default(0) of {error, Reason} -> {false, <<"connect_error:"/utf8, Reason/binary>>}; {ok, {State, _}} -> Result = lightspeed@transport@wisp_websocket:'receive'( State, <<"event|1|save|abc\\"/utf8>>, 1 ), Failure_reason = first_failure_reason(erlang:element(3, Result)), Counter = lightspeed@agent@session:counter( lightspeed@transport@wisp_websocket:session_state( erlang:element(2, Result) ) ), Passed = (Failure_reason =:= <<"protocol_decode_failed:invalid_escape_sequence"/utf8>>) andalso (Counter =:= 0), {Passed, <<<<<<"reason="/utf8, Failure_reason/binary>>/binary, ",counter="/utf8>>/binary, (erlang:integer_to_binary(Counter))/binary>>} end. -file("src/lightspeed/ops/quality_harness.gleam", 436). -spec lifecycle_label(lightspeed@transport@wisp_websocket:adapter_state()) -> binary(). lifecycle_label(State) -> _pipe = State, _pipe@1 = lightspeed@transport@wisp_websocket:session_state(_pipe), lifecycle_label_from_session(_pipe@1). -file("src/lightspeed/ops/quality_harness.gleam", 404). -spec first_diff_operation(list(binary())) -> binary(). first_diff_operation(Frames) -> case Frames of [] -> <<"missing_diff"/utf8>>; [Payload | Rest] -> case lightspeed@protocol:decode(Payload) of {ok, {diff, _, Html}} -> case lightspeed@diff:decode(Html) of {ok, Patch} -> lightspeed@diff:operation(Patch); {error, Error} -> <<"diff_decode_error:"/utf8, (lightspeed@diff:decode_error_to_string(Error))/binary>> end; {ok, _} -> first_diff_operation(Rest); {error, Error@1} -> <<"frame_decode_error:"/utf8, (lightspeed@protocol:decode_error_to_string(Error@1))/binary>> end end. -file("src/lightspeed/ops/quality_harness.gleam", 394). -spec frame_label(lightspeed@protocol:frame()) -> binary(). frame_label(Frame) -> case Frame of {hello, _, _} -> <<"hello"/utf8>>; {event, _, _, _} -> <<"event"/utf8>>; {diff, _, _} -> <<"diff"/utf8>>; {ack, _} -> <<"ack"/utf8>>; {failure, _, _} -> <<"failure"/utf8>> end. -file("src/lightspeed/ops/quality_harness.gleam", 376). -spec decode_frames(list(binary()), list(lightspeed@protocol:frame())) -> list(lightspeed@protocol:frame()). decode_frames(Frames, Decoded_rev) -> case Frames of [] -> lists:reverse(Decoded_rev); [Payload | Rest] -> case lightspeed@protocol:decode(Payload) of {ok, Frame} -> decode_frames(Rest, [Frame | Decoded_rev]); {error, _} -> decode_frames( Rest, [{failure, <<""/utf8>>, <<"decode_error"/utf8>>} | Decoded_rev] ) end end. -file("src/lightspeed/ops/quality_harness.gleam", 369). -spec frame_labels(list(binary())) -> binary(). frame_labels(Frames) -> _pipe = Frames, _pipe@1 = decode_frames(_pipe, []), _pipe@2 = gleam@list:map(_pipe@1, fun frame_label/1), join_with(_pipe@2, <<","/utf8>>). -file("src/lightspeed/ops/quality_harness.gleam", 346). -spec reconnect_default( lightspeed@transport@wisp_websocket:adapter_state(), integer() ) -> {ok, {lightspeed@transport@wisp_websocket:adapter_state(), list(binary())}} | {error, binary()}. reconnect_default(State, Now_ms) -> Result = lightspeed@transport@wisp_websocket:reconnect( State, {web_socket_request, <<"/counter"/utf8>>, <<"csrf"/utf8>>, <<"https://example.test"/utf8>>, Now_ms}, lightspeed@transport@contract:allow_all(<<"proc-a"/utf8>>) ), case Result of {connected, State@1, Outbound_frames} -> {ok, {State@1, Outbound_frames}}; {rejected, Error} -> {error, lightspeed@transport@contract:error_to_string(Error)} end. -file("src/lightspeed/ops/quality_harness.gleam", 148). -spec evaluate_mount_conformance() -> {boolean(), binary()}. evaluate_mount_conformance() -> Connect_result = connect_default(0), case Connect_result of {error, Reason} -> {false, <<"connect_error:"/utf8, Reason/binary>>}; {ok, {State, Frames}} -> Connect_labels = frame_labels(Frames), Connect_patch_op = first_diff_operation(Frames), Connect_live = lifecycle_label(State), Reconnect_result = reconnect_default(State, 10), case Reconnect_result of {error, Reason@1} -> {false, <<"reconnect_error:"/utf8, Reason@1/binary>>}; {ok, {Reconnected, Reconnect_frames}} -> Reconnect_labels = frame_labels(Reconnect_frames), Reconnect_patch_op = first_diff_operation(Reconnect_frames), Reconnect_live = lifecycle_label(Reconnected), Passed = (((((Connect_labels =:= <<"hello,diff"/utf8>>) andalso (Connect_patch_op =:= <<"replace_segments"/utf8>>)) andalso (Connect_live =:= <<"live"/utf8>>)) andalso (Reconnect_labels =:= <<"hello,diff"/utf8>>)) andalso (Reconnect_patch_op =:= <<"replace_segments"/utf8>>)) andalso (Reconnect_live =:= <<"live"/utf8>>), {Passed, <<<<<<<<<<<<<<<<<<<<<<"connect_labels="/utf8, Connect_labels/binary>>/binary, ",connect_op="/utf8>>/binary, Connect_patch_op/binary>>/binary, ",connect_lifecycle="/utf8>>/binary, Connect_live/binary>>/binary, ",reconnect_labels="/utf8>>/binary, Reconnect_labels/binary>>/binary, ",reconnect_op="/utf8>>/binary, Reconnect_patch_op/binary>>/binary, ",reconnect_lifecycle="/utf8>>/binary, Reconnect_live/binary>>} end end. -file("src/lightspeed/ops/quality_harness.gleam", 138). -spec evaluate(scenario()) -> {boolean(), binary()}. evaluate(Scenario) -> case Scenario of mount_conformance -> evaluate_mount_conformance(); bad_frame_fault -> evaluate_bad_frame_fault(); stale_ref_fault -> evaluate_stale_ref_fault(); throttled_client_fault -> evaluate_throttled_client_fault(); replay_reconnect_crash -> evaluate_replay_reconnect_crash() end. -file("src/lightspeed/ops/quality_harness.gleam", 59). ?DOC(" Run one scenario twice and require stable signature parity.\n"). -spec run_scenario(scenario()) -> scenario_outcome(). run_scenario(Scenario) -> {First_passed, First_signature} = evaluate(Scenario), {Second_passed, Second_signature} = evaluate(Scenario), Deterministic = (First_passed =:= Second_passed) andalso (First_signature =:= Second_signature), Passed = (First_passed andalso Second_passed) andalso Deterministic, {scenario_outcome, Scenario, Passed, Deterministic, First_signature}. -file("src/lightspeed/ops/quality_harness.gleam", 41). ?DOC(" Run all M10 scenarios.\n"). -spec run_matrix() -> report(). run_matrix() -> Scenarios = [mount_conformance, bad_frame_fault, stale_ref_fault, throttled_client_fault, replay_reconnect_crash], Outcomes = gleam@list:map(Scenarios, fun run_scenario/1), {report, Outcomes, count_failed(Outcomes), count_nondeterministic(Outcomes)}. -file("src/lightspeed/ops/quality_harness.gleam", 75). ?DOC(" Scenario label.\n"). -spec scenario_label(scenario()) -> binary(). scenario_label(Scenario) -> case Scenario of mount_conformance -> <<"mount_conformance"/utf8>>; bad_frame_fault -> <<"fault_bad_frame"/utf8>>; stale_ref_fault -> <<"fault_stale_ref"/utf8>>; throttled_client_fault -> <<"fault_throttled_client"/utf8>>; replay_reconnect_crash -> <<"replay_reconnect_crash"/utf8>> end. -file("src/lightspeed/ops/quality_harness.gleam", 86). ?DOC(" Stable pass/fail label.\n"). -spec pass_fail_label(scenario_outcome()) -> binary(). pass_fail_label(Outcome) -> case erlang:element(3, Outcome) of true -> <<"pass"/utf8>>; false -> <<"fail"/utf8>> end. -file("src/lightspeed/ops/quality_harness.gleam", 94). ?DOC(" Scenario signature.\n"). -spec signature(scenario_outcome()) -> binary(). signature(Outcome) -> erlang:element(5, Outcome). -file("src/lightspeed/ops/quality_harness.gleam", 99). ?DOC(" Whether scenario result was deterministic across repeated runs.\n"). -spec deterministic(scenario_outcome()) -> boolean(). deterministic(Outcome) -> erlang:element(4, Outcome). -file("src/lightspeed/ops/quality_harness.gleam", 104). ?DOC(" Outcome scenario id.\n"). -spec scenario(scenario_outcome()) -> scenario(). scenario(Outcome) -> erlang:element(2, Outcome). -file("src/lightspeed/ops/quality_harness.gleam", 109). ?DOC(" Report outcomes.\n"). -spec outcomes(report()) -> list(scenario_outcome()). outcomes(Report) -> erlang:element(2, Report). -file("src/lightspeed/ops/quality_harness.gleam", 114). ?DOC(" Number of failed scenarios.\n"). -spec failed_scenarios(report()) -> integer(). failed_scenarios(Report) -> erlang:element(3, Report). -file("src/lightspeed/ops/quality_harness.gleam", 119). ?DOC(" Number of nondeterministic scenarios.\n"). -spec nondeterministic_failures(report()) -> integer(). nondeterministic_failures(Report) -> erlang:element(4, Report). -file("src/lightspeed/ops/quality_harness.gleam", 525). -spec bool_label(boolean()) -> binary(). bool_label(Value) -> case Value of true -> <<"true"/utf8>>; false -> <<"false"/utf8>> end. -file("src/lightspeed/ops/quality_harness.gleam", 124). ?DOC(" Stable report summary suitable for CI signatures.\n"). -spec report_signature(report()) -> binary(). report_signature(Report) -> _pipe = erlang:element(2, Report), _pipe@1 = gleam@list:map( _pipe, fun(Outcome) -> <<<<<<<<<<<<(scenario_label(erlang:element(2, Outcome)))/binary, "="/utf8>>/binary, (pass_fail_label(Outcome))/binary>>/binary, ":deterministic="/utf8>>/binary, (bool_label(erlang:element(4, Outcome)))/binary>>/binary, ":"/utf8>>/binary, (erlang:element(5, Outcome))/binary>> end ), join_with(_pipe@1, <<";"/utf8>>).