-module(lightspeed@ops@durable_backend_harness). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/lightspeed/ops/durable_backend_harness.gleam"). -export([run_scenario/1, run_matrix/0, budget_version_label/0, scenario_label/1, pass_fail_label/1, signature/1, scenario/1, deterministic/1, outcomes/1, failed_scenarios/1, nondeterministic_failures/1, report_signature/1, snapshot_signature/0, snapshot_report_markdown/0]). -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(" Deterministic durable-backend conformance harness for M49.\n"). -type scenario() :: expanded_durable_backend_matrix | takeover_fencing_recovery_semantics | external_dependency_pressure_evidence | continuity_slo_budget_certification | certification_artifact_determinism. -type scenario_outcome() :: {scenario_outcome, scenario(), boolean(), boolean(), binary()}. -type report() :: {report, list(scenario_outcome()), integer(), integer()}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 314). -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/durable_backend_harness.gleam", 303). -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/durable_backend_harness.gleam", 332). -spec join_with(binary(), list(binary())) -> binary(). join_with(Separator, Values) -> case Values of [] -> <<""/utf8>>; [Value] -> Value; [Value@1 | Rest] -> <<<>/binary, (join_with(Separator, Rest))/binary>> end. -file("src/lightspeed/ops/durable_backend_harness.gleam", 257). -spec evaluate_certification_artifact_determinism() -> {boolean(), binary()}. evaluate_certification_artifact_determinism() -> First = join_with( <<";"/utf8>>, gleam@list:map( lightspeed@cluster@durable_backend:expanded_backends(), fun(Backend) -> <<<<(lightspeed@cluster@durable_backend:name(Backend))/binary, "|"/utf8>>/binary, (lightspeed@cluster@durable_backend:artifact_signature( lightspeed@cluster@durable_backend:artifact(Backend) ))/binary>> end ) ), Second = join_with( <<";"/utf8>>, gleam@list:map( lightspeed@cluster@durable_backend:expanded_backends(), fun(Backend@1) -> <<<<(lightspeed@cluster@durable_backend:name(Backend@1))/binary, "|"/utf8>>/binary, (lightspeed@cluster@durable_backend:artifact_signature( lightspeed@cluster@durable_backend:artifact(Backend@1) ))/binary>> end ) ), Passed = First =:= Second, {Passed, First}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 237). -spec evaluate_continuity_slo_budget_certification() -> {boolean(), binary()}. evaluate_continuity_slo_budget_certification() -> Observations = lightspeed@cluster@durable_backend:run_pressure_matrix(), Budgets = lightspeed@cluster@durable_backend:default_slo_budgets(), Results = lightspeed@cluster@durable_backend:evaluate_slo_budget( Observations, Budgets ), Passed = lightspeed@cluster@durable_backend:budget_failures(Results) =:= 0, Signature = <<<<<<"observations="/utf8, (join_with( <<";"/utf8>>, gleam@list:map( Observations, fun lightspeed@cluster@durable_backend:observation_signature/1 ) ))/binary>>/binary, "|budget_results="/utf8>>/binary, (join_with( <<";"/utf8>>, gleam@list:map( Results, fun lightspeed@cluster@durable_backend:budget_result_signature/1 ) ))/binary>>, {Passed, Signature}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 281). -spec pressure_labels_signature( list(lightspeed@cluster@durable_backend:observation()) ) -> binary(). pressure_labels_signature(Observations) -> Labels = gleam@list:map( Observations, fun(Observation) -> lightspeed@cluster@durable_backend:pressure_label( erlang:element(3, Observation) ) end ), join_with(<<","/utf8>>, Labels). -file("src/lightspeed/ops/durable_backend_harness.gleam", 292). -spec has_pressure( list(lightspeed@cluster@durable_backend:observation()), lightspeed@cluster@durable_backend:pressure_profile() ) -> boolean(). has_pressure(Observations, Pressure) -> case Observations of [] -> false; [Observation | Rest] -> (erlang:element(3, Observation) =:= Pressure) orelse has_pressure( Rest, Pressure ) end. -file("src/lightspeed/ops/durable_backend_harness.gleam", 222). -spec evaluate_external_dependency_pressure_evidence() -> {boolean(), binary()}. evaluate_external_dependency_pressure_evidence() -> Observations = lightspeed@cluster@durable_backend:run_pressure_matrix(), Passed = (has_pressure(Observations, nominal) andalso has_pressure( Observations, dependency_degraded )) andalso has_pressure(Observations, dependency_partitioned), Signature = <<<<<<"observations="/utf8, (erlang:integer_to_binary(erlang:length(Observations)))/binary>>/binary, "|pressure_labels="/utf8>>/binary, (pressure_labels_signature(Observations))/binary>>, {Passed, Signature}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 210). -spec evaluate_takeover_fencing_recovery_semantics() -> {boolean(), binary()}. evaluate_takeover_fencing_recovery_semantics() -> Observations = lightspeed@cluster@durable_backend:run_pressure_matrix(), Passed = lightspeed@cluster@durable_backend:takeover_fencing_recovery_certified( ), Signature = join_with( <<";"/utf8>>, gleam@list:map( Observations, fun lightspeed@cluster@durable_backend:observation_signature/1 ) ), {Passed, Signature}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 201). -spec evaluate_expanded_durable_backend_matrix() -> {boolean(), binary()}. evaluate_expanded_durable_backend_matrix() -> Backends = lightspeed@cluster@durable_backend:expanded_backends(), Passed = lightspeed@cluster@durable_backend:backend_matrix_certified() andalso (erlang:length(Backends) =:= 4), Signature = lightspeed@cluster@durable_backend:matrix_signature(), {Passed, Signature}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 187). -spec evaluate(scenario()) -> {boolean(), binary()}. evaluate(Scenario) -> case Scenario of expanded_durable_backend_matrix -> evaluate_expanded_durable_backend_matrix(); takeover_fencing_recovery_semantics -> evaluate_takeover_fencing_recovery_semantics(); external_dependency_pressure_evidence -> evaluate_external_dependency_pressure_evidence(); continuity_slo_budget_certification -> evaluate_continuity_slo_budget_certification(); certification_artifact_determinism -> evaluate_certification_artifact_determinism() end. -file("src/lightspeed/ops/durable_backend_harness.gleam", 59). ?DOC(" Run one M49 scenario twice and require deterministic 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/durable_backend_harness.gleam", 40). ?DOC(" Run all M49 scenarios.\n"). -spec run_matrix() -> report(). run_matrix() -> Outcomes = begin _pipe = [expanded_durable_backend_matrix, takeover_fencing_recovery_semantics, external_dependency_pressure_evidence, continuity_slo_budget_certification, certification_artifact_determinism], gleam@list:map(_pipe, fun run_scenario/1) end, {report, Outcomes, count_failed(Outcomes), count_nondeterministic(Outcomes)}. -file("src/lightspeed/ops/durable_backend_harness.gleam", 75). ?DOC(" M49 budget profile version label.\n"). -spec budget_version_label() -> binary(). budget_version_label() -> <<"m49.budget.v"/utf8, (erlang:integer_to_binary(1))/binary>>. -file("src/lightspeed/ops/durable_backend_harness.gleam", 80). ?DOC(" Scenario label.\n"). -spec scenario_label(scenario()) -> binary(). scenario_label(Scenario) -> case Scenario of expanded_durable_backend_matrix -> <<"expanded_durable_backend_matrix"/utf8>>; takeover_fencing_recovery_semantics -> <<"takeover_fencing_recovery_semantics"/utf8>>; external_dependency_pressure_evidence -> <<"external_dependency_pressure_evidence"/utf8>>; continuity_slo_budget_certification -> <<"continuity_slo_budget_certification"/utf8>>; certification_artifact_determinism -> <<"certification_artifact_determinism"/utf8>> end. -file("src/lightspeed/ops/durable_backend_harness.gleam", 92). ?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/durable_backend_harness.gleam", 100). ?DOC(" Scenario signature accessor.\n"). -spec signature(scenario_outcome()) -> binary(). signature(Outcome) -> erlang:element(5, Outcome). -file("src/lightspeed/ops/durable_backend_harness.gleam", 105). ?DOC(" Scenario accessor.\n"). -spec scenario(scenario_outcome()) -> scenario(). scenario(Outcome) -> erlang:element(2, Outcome). -file("src/lightspeed/ops/durable_backend_harness.gleam", 110). ?DOC(" Determinism accessor.\n"). -spec deterministic(scenario_outcome()) -> boolean(). deterministic(Outcome) -> erlang:element(4, Outcome). -file("src/lightspeed/ops/durable_backend_harness.gleam", 115). ?DOC(" Report outcomes accessor.\n"). -spec outcomes(report()) -> list(scenario_outcome()). outcomes(Report) -> erlang:element(2, Report). -file("src/lightspeed/ops/durable_backend_harness.gleam", 120). ?DOC(" Failed scenario count.\n"). -spec failed_scenarios(report()) -> integer(). failed_scenarios(Report) -> erlang:element(3, Report). -file("src/lightspeed/ops/durable_backend_harness.gleam", 125). ?DOC(" Nondeterministic scenario count.\n"). -spec nondeterministic_failures(report()) -> integer(). nondeterministic_failures(Report) -> erlang:element(4, Report). -file("src/lightspeed/ops/durable_backend_harness.gleam", 325). -spec bool_label(boolean()) -> binary(). bool_label(Value) -> case Value of true -> <<"true"/utf8>>; false -> <<"false"/utf8>> end. -file("src/lightspeed/ops/durable_backend_harness.gleam", 130). ?DOC(" Stable report signature.\n"). -spec report_signature(report()) -> binary(). report_signature(Report) -> Entries = gleam@list:map( erlang:element(2, Report), 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(<<";"/utf8>>, Entries). -file("src/lightspeed/ops/durable_backend_harness.gleam", 146). ?DOC(" Deterministic snapshot signature for M49 fixture drift gates.\n"). -spec snapshot_signature() -> binary(). snapshot_signature() -> <<<<<<"m49.snapshot.v"/utf8, (erlang:integer_to_binary(1))/binary>>/binary, "|"/utf8>>/binary, (report_signature(run_matrix()))/binary>>. -file("src/lightspeed/ops/durable_backend_harness.gleam", 154). ?DOC(" Deterministic markdown report for M49 fixture scripts.\n"). -spec snapshot_report_markdown() -> binary(). snapshot_report_markdown() -> Report = run_matrix(), Failed = failed_scenarios(Report), Nondeterministic = nondeterministic_failures(Report), Status = case (Failed =:= 0) andalso (Nondeterministic =:= 0) of true -> <<"OK"/utf8>>; false -> <<"FAIL"/utf8>> end, <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"# Durable Backend Fixture Report\n\n"/utf8, "snapshot_version: "/utf8>>/binary, (erlang:integer_to_binary( 1 ))/binary>>/binary, "\n"/utf8>>/binary, "budget_version: "/utf8>>/binary, (budget_version_label( ))/binary>>/binary, "\n"/utf8>>/binary, "status: "/utf8>>/binary, Status/binary>>/binary, "\n"/utf8>>/binary, "failed_scenarios: "/utf8>>/binary, (erlang:integer_to_binary( Failed ))/binary>>/binary, "\n"/utf8>>/binary, "nondeterministic_failures: "/utf8>>/binary, (erlang:integer_to_binary(Nondeterministic))/binary>>/binary, "\n\n"/utf8>>/binary, "snapshot_signature: "/utf8>>/binary, (snapshot_signature())/binary>>/binary, "\n\n"/utf8>>/binary, "report_signature: "/utf8>>/binary, (report_signature(Report))/binary>>/binary, "\n"/utf8>>.