-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] ->
<<<<Value@1/binary, Separator/binary>>/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>>.