-module(lightspeed@ops@render_churn_harness).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/ops/render_churn_harness.gleam").
-export([budget_failures/1, default_budget/0, evaluate_budget/2, metrics_signature/1, run_scenario/1, run_matrix/0, budget_version_label/0, scenario_label/1, pass_fail_label/1, signature/1, deterministic/1, scenario/1, baseline_metrics/1, optimized_metrics/1, outcomes/1, budget_results/1, failed_scenarios/1, nondeterministic_failures/1, failed_budgets/1, report_signature/1, snapshot_signature/0, snapshot_report_markdown/0]).
-export_type([scenario/0, metrics/0, scenario_outcome/0, budget/0, budget_result/0, report/0, metric_reduction/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 render-churn reduction harness for M36.\n").
-type scenario() :: counter_burst_traffic |
stream_burst_traffic |
form_burst_traffic.
-type metrics() :: {metrics,
integer(),
integer(),
integer(),
integer(),
integer(),
integer(),
integer()}.
-type scenario_outcome() :: {scenario_outcome,
scenario(),
boolean(),
boolean(),
binary(),
metrics(),
metrics()}.
-type budget() :: {budget, scenario(), integer(), integer(), integer()}.
-type budget_result() :: {budget_result, scenario(), boolean(), binary()}.
-type report() :: {report,
list(scenario_outcome()),
list(budget_result()),
integer(),
integer(),
integer()}.
-type metric_reduction() :: {metric_reduction, integer(), integer(), integer()}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 149).
?DOC(" Count failing budgets.\n").
-spec budget_failures(list(budget_result())) -> integer().
budget_failures(Results) ->
case Results of
[] ->
0;
[Result | Rest] ->
case erlang:element(3, Result) of
true ->
budget_failures(Rest);
false ->
1 + budget_failures(Rest)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 933).
-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/render_churn_harness.gleam", 922).
-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/render_churn_harness.gleam", 117).
?DOC(" Default deterministic M36 budget profile.\n").
-spec default_budget() -> list(budget()).
default_budget() ->
[{budget, counter_burst_traffic, 500, 20, 0},
{budget, stream_burst_traffic, 2000, 0, 200},
{budget, form_burst_traffic, 500, 20, 0}].
-file("src/lightspeed/ops/render_churn_harness.gleam", 975).
-spec bool_label(boolean()) -> binary().
bool_label(Value) ->
case Value of
true ->
<<"true"/utf8>>;
false ->
<<"false"/utf8>>
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 360).
-spec metric_reductions(metrics(), metrics()) -> metric_reduction().
metric_reductions(Baseline, Optimized) ->
{metric_reduction,
erlang:element(4, Baseline) - erlang:element(4, Optimized),
erlang:element(6, Baseline) - erlang:element(6, Optimized),
erlang:element(3, Baseline) - erlang:element(3, Optimized)}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 908).
-spec find_outcome(list(scenario_outcome()), scenario()) -> {ok,
scenario_outcome()} |
{error, nil}.
find_outcome(Outcomes, Scenario) ->
case Outcomes of
[] ->
{error, nil};
[Outcome | Rest] ->
case erlang:element(2, Outcome) =:= Scenario of
true ->
{ok, Outcome};
false ->
find_outcome(Rest, Scenario)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 868).
-spec evaluate_one_budget(list(scenario_outcome()), budget()) -> budget_result().
evaluate_one_budget(Outcomes, Budget) ->
case find_outcome(Outcomes, erlang:element(2, Budget)) of
{error, nil} ->
{budget_result,
erlang:element(2, Budget),
false,
<<"missing_scenario"/utf8>>};
{ok, Outcome} ->
Reductions = metric_reductions(
erlang:element(6, Outcome),
erlang:element(7, Outcome)
),
Passed_bytes = erlang:element(2, Reductions) >= erlang:element(
3,
Budget
),
Passed_root = erlang:element(3, Reductions) >= erlang:element(
4,
Budget
),
Passed_patch_count = erlang:element(4, Reductions) >= erlang:element(
5,
Budget
),
Passed = (Passed_bytes andalso Passed_root) andalso Passed_patch_count,
{budget_result, erlang:element(2, Budget), Passed, case Passed of
true ->
<<"within_budget"/utf8>>;
false ->
<<<<<<<<<<"bytes="/utf8,
(bool_label(Passed_bytes))/binary>>/binary,
",root_churn="/utf8>>/binary,
(bool_label(Passed_root))/binary>>/binary,
",patch_count="/utf8>>/binary,
(bool_label(Passed_patch_count))/binary>>
end}
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 853).
-spec evaluate_budget_loop(
list(scenario_outcome()),
list(budget()),
list(budget_result())
) -> list(budget_result()).
evaluate_budget_loop(Outcomes, Budgets, Results_rev) ->
case Budgets of
[] ->
lists:reverse(Results_rev);
[Budget | Rest] ->
evaluate_budget_loop(
Outcomes,
Rest,
[evaluate_one_budget(Outcomes, Budget) | Results_rev]
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 141).
?DOC(" Evaluate outcomes against budgets.\n").
-spec evaluate_budget(list(scenario_outcome()), list(budget())) -> list(budget_result()).
evaluate_budget(Outcomes, Budgets) ->
evaluate_budget_loop(Outcomes, Budgets, []).
-file("src/lightspeed/ops/render_churn_harness.gleam", 228).
?DOC(" Stable metrics signature.\n").
-spec metrics_signature(metrics()) -> binary().
metrics_signature(Metrics) ->
<<<<<<<<<<<<<<<<<<<<<<<<<<"events="/utf8,
(erlang:integer_to_binary(
erlang:element(
2,
Metrics
)
))/binary>>/binary,
":patches="/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(3, Metrics)
))/binary>>/binary,
":bytes="/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(4, Metrics)
))/binary>>/binary,
":avg="/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(5, Metrics)
))/binary>>/binary,
":root_churn="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(6, Metrics)))/binary>>/binary,
":keyed="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(7, Metrics)))/binary>>/binary,
":reorder="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(8, Metrics)))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 370).
-spec scenario_improved(scenario(), metrics(), metrics(), metric_reduction()) -> boolean().
scenario_improved(Scenario, Baseline, Optimized, Reductions) ->
case Scenario of
counter_burst_traffic ->
((erlang:element(2, Reductions) > 0) andalso (erlang:element(
3,
Reductions
)
> 0))
andalso (erlang:element(5, Optimized) < erlang:element(5, Baseline));
stream_burst_traffic ->
(((erlang:element(2, Reductions) > 0) andalso (erlang:element(
4,
Reductions
)
> 0))
andalso (erlang:element(8, Optimized) > 0))
andalso (erlang:element(6, Optimized) =:= 0);
form_burst_traffic ->
((erlang:element(2, Reductions) > 0) andalso (erlang:element(
3,
Reductions
)
> 0))
andalso (erlang:element(5, Optimized) < erlang:element(5, Baseline))
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 842).
-spec count_reorder_ops(list(lightspeed@diff:patch()), integer()) -> integer().
count_reorder_ops(Patches, Count) ->
case Patches of
[] ->
Count;
[Patch | Rest] ->
case Patch of
{reorder_keyed, _, _} ->
count_reorder_ops(Rest, Count + 1);
_ ->
count_reorder_ops(Rest, Count)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 829).
-spec count_keyed_ops(list(lightspeed@diff:patch()), integer()) -> integer().
count_keyed_ops(Patches, Count) ->
case Patches of
[] ->
Count;
[Patch | Rest] ->
case Patch of
{upsert_keyed, _, _, _} ->
count_keyed_ops(Rest, Count + 1);
{remove_keyed, _, _} ->
count_keyed_ops(Rest, Count + 1);
{reorder_keyed, _, _} ->
count_keyed_ops(Rest, Count + 1);
_ ->
count_keyed_ops(Rest, Count)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 814).
-spec count_root_churn(list(lightspeed@diff:patch()), integer()) -> integer().
count_root_churn(Patches, Count) ->
case Patches of
[] ->
Count;
[Patch | Rest] ->
case Patch of
{replace, _, _} ->
count_root_churn(Rest, Count + 1);
{append, _, _} ->
count_root_churn(Rest, Count + 1);
{prepend, _, _} ->
count_root_churn(Rest, Count + 1);
{remove, _} ->
count_root_churn(Rest, Count + 1);
{replace_segments, _, _, _, _} ->
count_root_churn(Rest, Count + 1);
_ ->
count_root_churn(Rest, Count)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 961).
-spec max_int(integer(), integer()) -> integer().
max_int(Left, Right) ->
case Left >= Right of
true ->
Left;
false ->
Right
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 954).
-spec divide_safe(integer(), integer()) -> integer().
divide_safe(Numerator, Denominator) ->
case Denominator =< 0 of
true ->
0;
false ->
case Denominator of
0 -> 0;
Gleam@denominator -> Numerator div Gleam@denominator
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 806).
-spec sum_patch_bytes(list(lightspeed@diff:patch()), integer()) -> integer().
sum_patch_bytes(Patches, Total) ->
case Patches of
[] ->
Total;
[Patch | Rest] ->
sum_patch_bytes(
Rest,
Total + string:length(lightspeed@diff:encode(Patch))
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 786).
-spec metrics_from_patches(integer(), list(lightspeed@diff:patch())) -> metrics().
metrics_from_patches(Total_events, Patches) ->
Total_patches = erlang:length(Patches),
Total_patch_bytes = sum_patch_bytes(Patches, 0),
Avg_patch_bytes = divide_safe(Total_patch_bytes, max_int(Total_patches, 1)),
{metrics,
Total_events,
Total_patches,
Total_patch_bytes,
Avg_patch_bytes,
count_root_churn(Patches, 0),
count_keyed_ops(Patches, 0),
count_reorder_ops(Patches, 0)}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 720).
-spec set_form_value(
list({binary(), binary()}),
binary(),
binary(),
list({binary(), binary()})
) -> list({binary(), binary()}).
set_form_value(Values, Field, Value, Updated_rev) ->
case Values of
[] ->
lists:reverse(Updated_rev);
[{Name, Existing} | Rest] ->
case Name =:= Field of
true ->
set_form_value(
Rest,
Field,
Value,
[{Name, Value} | Updated_rev]
);
false ->
set_form_value(
Rest,
Field,
Value,
[{Name, Existing} | Updated_rev]
)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 716).
-spec form_value(binary(), integer()) -> binary().
form_value(Field, Index) ->
<<<<Field/binary, "-"/utf8>>/binary,
(erlang:integer_to_binary(Index))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 707).
-spec form_field(integer()) -> binary().
form_field(Index) ->
case Index rem 4 of
0 ->
<<"title"/utf8>>;
1 ->
<<"status"/utf8>>;
2 ->
<<"priority"/utf8>>;
_ ->
<<"search"/utf8>>
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 764).
-spec form_slots(
list({binary(), binary()}),
list(lightspeed@diff:dynamic_slot())
) -> list(lightspeed@diff:dynamic_slot()).
form_slots(Values, Slots_rev) ->
case Values of
[] ->
lists:reverse(Slots_rev);
[{Name, Value} | Rest] ->
form_slots(Rest, [lightspeed@diff:slot(Name, Value) | Slots_rev])
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 755).
-spec form_static_html() -> binary().
form_static_html() ->
<<<<<<<<<<"<form data-ls-key=\"ticket-form\">"/utf8,
"<label>title<span data-ls-slot=\"title\"></span></label>"/utf8>>/binary,
"<label>status<span data-ls-slot=\"status\"></span></label>"/utf8>>/binary,
"<label>priority<span data-ls-slot=\"priority\"></span></label>"/utf8>>/binary,
"<label>search<span data-ls-slot=\"search\"></span></label>"/utf8>>/binary,
"</form>"/utf8>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 657).
-spec optimized_form_patches(
integer(),
integer(),
list({binary(), binary()}),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
optimized_form_patches(Max_event, Index, Values, Patches_rev) ->
case Index > Max_event of
true ->
lists:reverse(Patches_rev);
false ->
case Index =:= 1 of
true ->
Field = form_field(Index),
Next_values = set_form_value(
Values,
Field,
form_value(Field, Index),
[]
),
Slot = lightspeed@diff:slot(Field, form_value(Field, Index)),
optimized_form_patches(
Max_event,
Index + 1,
Next_values,
[{update_segments,
<<"#form"/utf8>>,
<<"form.burst.v1"/utf8>>,
[Slot]},
{replace_segments,
<<"#form"/utf8>>,
<<"form.burst.v1"/utf8>>,
form_static_html(),
form_slots(Values, [])} |
Patches_rev]
);
false ->
Field@1 = form_field(Index),
Value = form_value(Field@1, Index),
Next_values@1 = set_form_value(Values, Field@1, Value, []),
optimized_form_patches(
Max_event,
Index + 1,
Next_values@1,
[{update_segments,
<<"#form"/utf8>>,
<<"form.burst.v1"/utf8>>,
[lightspeed@diff:slot(Field@1, Value)]} |
Patches_rev]
)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 632).
-spec default_form_values() -> list({binary(), binary()}).
default_form_values() ->
[{<<"title"/utf8>>, <<""/utf8>>},
{<<"status"/utf8>>, <<""/utf8>>},
{<<"priority"/utf8>>, <<""/utf8>>},
{<<"search"/utf8>>, <<""/utf8>>}].
-file("src/lightspeed/ops/render_churn_harness.gleam", 624).
-spec optimized_form_metrics() -> metrics().
optimized_form_metrics() ->
Events = 48,
Initial = default_form_values(),
Patches = optimized_form_patches(Events, 1, Initial, []),
metrics_from_patches(Events, Patches).
-file("src/lightspeed/ops/render_churn_harness.gleam", 944).
-spec prepend_patches(
list(lightspeed@diff:patch()),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
prepend_patches(Values, Acc) ->
case Values of
[] ->
Acc;
[Value | Rest] ->
prepend_patches(Rest, [Value | Acc])
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 601).
-spec stream_id(binary(), integer()) -> binary().
stream_id(Prefix, Index) ->
<<<<Prefix/binary, "-"/utf8>>/binary,
(erlang:integer_to_binary(Index))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 605).
-spec stream_html(binary(), integer()) -> binary().
stream_html(Prefix, Index) ->
<<<<<<<<"<li data-ls-key=\""/utf8, (stream_id(Prefix, Index))/binary>>/binary,
"\">"/utf8>>/binary,
(stream_id(Prefix, Index))/binary>>/binary,
"</li>"/utf8>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 540).
-spec run_stream_optimized(
integer(),
integer(),
lightspeed@stream:stream(),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
run_stream_optimized(Max_event, Index, Runtime, Patches_rev) ->
case Index > Max_event of
true ->
lists:reverse(Patches_rev);
false ->
Entry = lightspeed@stream:item(
stream_id(<<"burst"/utf8>>, Index),
stream_html(<<"burst"/utf8>>, Index)
),
{Next_runtime, Patches} = lightspeed@stream:stream_insert(
Runtime,
Entry,
0,
none
),
run_stream_optimized(
Max_event,
Index + 1,
Next_runtime,
prepend_patches(Patches, Patches_rev)
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 501).
-spec initial_stream_entries(
integer(),
integer(),
list(lightspeed@stream:stream_item())
) -> list(lightspeed@stream:stream_item()).
initial_stream_entries(Max_index, Index, Entries_rev) ->
case Index > Max_index of
true ->
lists:reverse(Entries_rev);
false ->
initial_stream_entries(
Max_index,
Index + 1,
[lightspeed@stream:item(
stream_id(<<"seed"/utf8>>, Index),
stream_html(<<"seed"/utf8>>, Index)
) |
Entries_rev]
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 487).
-spec optimized_stream_metrics() -> metrics().
optimized_stream_metrics() ->
Events = 20,
Seed = lightspeed@stream:new(<<"#feed"/utf8>>),
{Seed@1, _} = lightspeed@stream:stream(
Seed,
initial_stream_entries(40, 1, []),
begin
_pipe = lightspeed@stream:options(),
lightspeed@stream:with_reset(_pipe, true)
end
),
Patches = run_stream_optimized(Events, 1, Seed@1, []),
metrics_from_patches(Events, Patches).
-file("src/lightspeed/ops/render_churn_harness.gleam", 470).
-spec counter_static_html() -> binary().
counter_static_html() ->
<<"<section data-ls-key=\"counter\"><button><span data-ls-slot=\"counter\"></span></button></section>"/utf8>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 438).
-spec optimized_counter_patches(
integer(),
integer(),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
optimized_counter_patches(Max_step, Step, Patches_rev) ->
case Step > Max_step of
true ->
lists:reverse(Patches_rev);
false ->
case Step =:= 0 of
true ->
optimized_counter_patches(
Max_step,
1,
[{replace_segments,
<<"#counter"/utf8>>,
<<"counter.burst.v1"/utf8>>,
counter_static_html(),
[lightspeed@diff:slot(
<<"counter"/utf8>>,
<<"0"/utf8>>
)]} |
Patches_rev]
);
false ->
optimized_counter_patches(
Max_step,
Step + 1,
[{update_segments,
<<"#counter"/utf8>>,
<<"counter.burst.v1"/utf8>>,
[lightspeed@diff:slot(
<<"counter"/utf8>>,
erlang:integer_to_binary(Step)
)]} |
Patches_rev]
)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 417).
-spec optimized_counter_metrics() -> metrics().
optimized_counter_metrics() ->
Events = 64,
Patches = optimized_counter_patches(Events, 0, []),
metrics_from_patches(Events, Patches).
-file("src/lightspeed/ops/render_churn_harness.gleam", 403).
-spec optimized_metrics_for_scenario(scenario()) -> metrics().
optimized_metrics_for_scenario(Scenario) ->
case Scenario of
counter_burst_traffic ->
optimized_counter_metrics();
stream_burst_traffic ->
optimized_stream_metrics();
form_burst_traffic ->
optimized_form_metrics()
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 775).
-spec field_value(list({binary(), binary()}), binary()) -> binary().
field_value(Values, Field) ->
case Values of
[] ->
<<""/utf8>>;
[{Name, Value} | Rest] ->
case Name =:= Field of
true ->
Value;
false ->
field_value(Rest, Field)
end
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 738).
-spec form_html(list({binary(), binary()})) -> binary().
form_html(Values) ->
<<<<<<<<<<<<<<<<<<<<<<<<<<"<form data-ls-key=\"ticket-form\">"/utf8,
"<label>title<span data-ls-slot=\"title\">"/utf8>>/binary,
(field_value(
Values,
<<"title"/utf8>>
))/binary>>/binary,
"</span></label>"/utf8>>/binary,
"<label>status<span data-ls-slot=\"status\">"/utf8>>/binary,
(field_value(Values, <<"status"/utf8>>))/binary>>/binary,
"</span></label>"/utf8>>/binary,
"<label>priority<span data-ls-slot=\"priority\">"/utf8>>/binary,
(field_value(Values, <<"priority"/utf8>>))/binary>>/binary,
"</span></label>"/utf8>>/binary,
"<label>search<span data-ls-slot=\"search\">"/utf8>>/binary,
(field_value(Values, <<"search"/utf8>>))/binary>>/binary,
"</span></label>"/utf8>>/binary,
"</form>"/utf8>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 636).
-spec baseline_form_patches(
integer(),
integer(),
list({binary(), binary()}),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
baseline_form_patches(Max_event, Index, Values, Patches_rev) ->
case Index > Max_event of
true ->
lists:reverse(Patches_rev);
false ->
Field = form_field(Index),
Next_values = set_form_value(
Values,
Field,
form_value(Field, Index),
[]
),
baseline_form_patches(
Max_event,
Index + 1,
Next_values,
[{replace, <<"#form"/utf8>>, form_html(Next_values)} |
Patches_rev]
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 613).
-spec baseline_form_metrics() -> metrics().
baseline_form_metrics() ->
Events = 48,
Initial = default_form_values(),
Patches = baseline_form_patches(
Events,
1,
Initial,
[{replace, <<"#form"/utf8>>, form_html(Initial)}]
),
metrics_from_patches(Events, Patches).
-file("src/lightspeed/ops/render_churn_harness.gleam", 588).
-spec legacy_upsert_all(binary(), list(lightspeed@stream:stream_item())) -> list(lightspeed@diff:patch()).
legacy_upsert_all(Target, Current) ->
case Current of
[] ->
[];
[{stream_item, Id, Html} | Rest] ->
[{upsert_keyed, Target, Id, Html} | legacy_upsert_all(Target, Rest)]
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 575).
-spec legacy_remove_all(binary(), list(lightspeed@stream:stream_item())) -> list(lightspeed@diff:patch()).
legacy_remove_all(Target, Previous) ->
case Previous of
[] ->
[];
[{stream_item, Id, _} | Rest] ->
[{remove_keyed, Target, Id} | legacy_remove_all(Target, Rest)]
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 968).
-spec concat(list(lightspeed@diff:patch()), list(lightspeed@diff:patch())) -> list(lightspeed@diff:patch()).
concat(Left, Right) ->
case Left of
[] ->
Right;
[Head | Rest] ->
[Head | concat(Rest, Right)]
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 564).
-spec legacy_full_reset_patches(
binary(),
list(lightspeed@stream:stream_item()),
list(lightspeed@stream:stream_item())
) -> list(lightspeed@diff:patch()).
legacy_full_reset_patches(Target, Previous, Current) ->
concat(
legacy_remove_all(Target, Previous),
legacy_upsert_all(Target, Current)
).
-file("src/lightspeed/ops/render_churn_harness.gleam", 516).
-spec run_stream_baseline(
integer(),
integer(),
list(lightspeed@stream:stream_item()),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
run_stream_baseline(Max_event, Index, Previous, Patches_rev) ->
case Index > Max_event of
true ->
lists:reverse(Patches_rev);
false ->
Next_entry = lightspeed@stream:item(
stream_id(<<"burst"/utf8>>, Index),
stream_html(<<"burst"/utf8>>, Index)
),
Current = [Next_entry | Previous],
Patches = legacy_full_reset_patches(
<<"#feed"/utf8>>,
Previous,
Current
),
run_stream_baseline(
Max_event,
Index + 1,
Current,
prepend_patches(Patches, Patches_rev)
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 480).
-spec baseline_stream_metrics() -> metrics().
baseline_stream_metrics() ->
Events = 20,
Baseline = run_stream_baseline(
Events,
1,
initial_stream_entries(40, 1, []),
[]
),
metrics_from_patches(Events, Baseline).
-file("src/lightspeed/ops/render_churn_harness.gleam", 474).
-spec counter_html(integer()) -> binary().
counter_html(Value) ->
<<<<"<section data-ls-key=\"counter\"><button><span data-ls-slot=\"counter\">"/utf8,
(erlang:integer_to_binary(Value))/binary>>/binary,
"</span></button></section>"/utf8>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 423).
-spec baseline_counter_patches(
integer(),
integer(),
list(lightspeed@diff:patch())
) -> list(lightspeed@diff:patch()).
baseline_counter_patches(Max_step, Step, Patches_rev) ->
case Step > Max_step of
true ->
lists:reverse(Patches_rev);
false ->
baseline_counter_patches(
Max_step,
Step + 1,
[{replace, <<"#counter"/utf8>>, counter_html(Step)} |
Patches_rev]
)
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 411).
-spec baseline_counter_metrics() -> metrics().
baseline_counter_metrics() ->
Events = 64,
Patches = baseline_counter_patches(Events, 0, []),
metrics_from_patches(Events, Patches).
-file("src/lightspeed/ops/render_churn_harness.gleam", 395).
-spec baseline_metrics_for_scenario(scenario()) -> metrics().
baseline_metrics_for_scenario(Scenario) ->
case Scenario of
counter_burst_traffic ->
baseline_counter_metrics();
stream_burst_traffic ->
baseline_stream_metrics();
form_burst_traffic ->
baseline_form_metrics()
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 340).
-spec evaluate(scenario()) -> {boolean(), metrics(), metrics(), binary()}.
evaluate(Scenario) ->
Baseline = baseline_metrics_for_scenario(Scenario),
Optimized = optimized_metrics_for_scenario(Scenario),
Reductions = metric_reductions(Baseline, Optimized),
Passed = scenario_improved(Scenario, Baseline, Optimized, Reductions),
Signature = <<<<<<<<<<<<<<<<<<"baseline="/utf8,
(metrics_signature(Baseline))/binary>>/binary,
"|optimized="/utf8>>/binary,
(metrics_signature(Optimized))/binary>>/binary,
"|delta_bytes="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(2, Reductions)))/binary>>/binary,
"|delta_root_churn="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(3, Reductions)))/binary>>/binary,
"|delta_patches="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(4, Reductions)))/binary>>,
{Passed, Baseline, Optimized, Signature}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 89).
?DOC(" Run one scenario twice and require deterministic parity.\n").
-spec run_scenario(scenario()) -> scenario_outcome().
run_scenario(Scenario) ->
{First_passed, First_baseline, First_optimized, First_signature} = evaluate(
Scenario
),
{Second_passed, Second_baseline, Second_optimized, Second_signature} = evaluate(
Scenario
),
Deterministic = (((First_passed =:= Second_passed) andalso (First_signature
=:= Second_signature))
andalso (First_baseline =:= Second_baseline))
andalso (First_optimized =:= Second_optimized),
Passed = (First_passed andalso Second_passed) andalso Deterministic,
{scenario_outcome,
Scenario,
Passed,
Deterministic,
First_signature,
First_baseline,
First_optimized}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 73).
?DOC(" Run all M36 scenarios and evaluate budgets.\n").
-spec run_matrix() -> report().
run_matrix() ->
Outcomes = begin
_pipe = [counter_burst_traffic,
stream_burst_traffic,
form_burst_traffic],
gleam@list:map(_pipe, fun run_scenario/1)
end,
Budget_results = evaluate_budget(Outcomes, default_budget()),
{report,
Outcomes,
Budget_results,
count_failed(Outcomes),
count_nondeterministic(Outcomes),
budget_failures(Budget_results)}.
-file("src/lightspeed/ops/render_churn_harness.gleam", 112).
?DOC(" M36 budget profile version label.\n").
-spec budget_version_label() -> binary().
budget_version_label() ->
<<"m36.budget.v"/utf8, (erlang:integer_to_binary(1))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 161).
?DOC(" Scenario label.\n").
-spec scenario_label(scenario()) -> binary().
scenario_label(Scenario) ->
case Scenario of
counter_burst_traffic ->
<<"counter_burst_traffic"/utf8>>;
stream_burst_traffic ->
<<"stream_burst_traffic"/utf8>>;
form_burst_traffic ->
<<"form_burst_traffic"/utf8>>
end.
-file("src/lightspeed/ops/render_churn_harness.gleam", 170).
?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/render_churn_harness.gleam", 178).
?DOC(" Outcome signature accessor.\n").
-spec signature(scenario_outcome()) -> binary().
signature(Outcome) ->
erlang:element(5, Outcome).
-file("src/lightspeed/ops/render_churn_harness.gleam", 183).
?DOC(" Determinism accessor.\n").
-spec deterministic(scenario_outcome()) -> boolean().
deterministic(Outcome) ->
erlang:element(4, Outcome).
-file("src/lightspeed/ops/render_churn_harness.gleam", 188).
?DOC(" Scenario accessor.\n").
-spec scenario(scenario_outcome()) -> scenario().
scenario(Outcome) ->
erlang:element(2, Outcome).
-file("src/lightspeed/ops/render_churn_harness.gleam", 193).
?DOC(" Baseline metrics accessor.\n").
-spec baseline_metrics(scenario_outcome()) -> metrics().
baseline_metrics(Outcome) ->
erlang:element(6, Outcome).
-file("src/lightspeed/ops/render_churn_harness.gleam", 198).
?DOC(" Optimized metrics accessor.\n").
-spec optimized_metrics(scenario_outcome()) -> metrics().
optimized_metrics(Outcome) ->
erlang:element(7, Outcome).
-file("src/lightspeed/ops/render_churn_harness.gleam", 203).
?DOC(" Report outcomes accessor.\n").
-spec outcomes(report()) -> list(scenario_outcome()).
outcomes(Report) ->
erlang:element(2, Report).
-file("src/lightspeed/ops/render_churn_harness.gleam", 208).
?DOC(" Report budget-results accessor.\n").
-spec budget_results(report()) -> list(budget_result()).
budget_results(Report) ->
erlang:element(3, Report).
-file("src/lightspeed/ops/render_churn_harness.gleam", 213).
?DOC(" Failed scenario count.\n").
-spec failed_scenarios(report()) -> integer().
failed_scenarios(Report) ->
erlang:element(4, Report).
-file("src/lightspeed/ops/render_churn_harness.gleam", 218).
?DOC(" Nondeterministic failures count.\n").
-spec nondeterministic_failures(report()) -> integer().
nondeterministic_failures(Report) ->
erlang:element(5, Report).
-file("src/lightspeed/ops/render_churn_harness.gleam", 223).
?DOC(" Failed budget count.\n").
-spec failed_budgets(report()) -> integer().
failed_budgets(Report) ->
erlang:element(6, Report).
-file("src/lightspeed/ops/render_churn_harness.gleam", 982).
-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/render_churn_harness.gleam", 246).
?DOC(" Stable report signature.\n").
-spec report_signature(report()) -> binary().
report_signature(Report) ->
Outcome_entries = gleam@list:map(
erlang:element(2, Report),
fun(Outcome) ->
Reductions = metric_reductions(
erlang:element(6, Outcome),
erlang:element(7, 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,
":baseline="/utf8>>/binary,
(metrics_signature(
erlang:element(
6,
Outcome
)
))/binary>>/binary,
":optimized="/utf8>>/binary,
(metrics_signature(
erlang:element(7, Outcome)
))/binary>>/binary,
":delta_bytes="/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(2, Reductions)
))/binary>>/binary,
":delta_root_churn="/utf8>>/binary,
(erlang:integer_to_binary(
erlang:element(3, Reductions)
))/binary>>/binary,
":delta_patches="/utf8>>/binary,
(erlang:integer_to_binary(erlang:element(4, Reductions)))/binary>>/binary,
":"/utf8>>/binary,
(erlang:element(5, Outcome))/binary>>
end
),
Budget_entries = gleam@list:map(
erlang:element(3, Report),
fun(Result) ->
<<<<<<<<(scenario_label(erlang:element(2, Result)))/binary,
"="/utf8>>/binary,
(bool_label(erlang:element(3, Result)))/binary>>/binary,
":"/utf8>>/binary,
(erlang:element(4, Result))/binary>>
end
),
<<<<<<"outcomes="/utf8, (join_with(<<";"/utf8>>, Outcome_entries))/binary>>/binary,
"|budgets="/utf8>>/binary,
(join_with(<<";"/utf8>>, Budget_entries))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 285).
?DOC(" Deterministic snapshot signature for M36 drift gates.\n").
-spec snapshot_signature() -> binary().
snapshot_signature() ->
<<<<<<"m36.snapshot.v"/utf8, (erlang:integer_to_binary(1))/binary>>/binary,
"|"/utf8>>/binary,
(report_signature(run_matrix()))/binary>>.
-file("src/lightspeed/ops/render_churn_harness.gleam", 293).
?DOC(" Deterministic markdown report for M36 fixture scripts.\n").
-spec snapshot_report_markdown() -> binary().
snapshot_report_markdown() ->
Report = run_matrix(),
Failed = failed_scenarios(Report),
Nondeterministic = nondeterministic_failures(Report),
Failed_budget_checks = failed_budgets(Report),
Status = case ((Failed =:= 0) andalso (Nondeterministic =:= 0)) andalso (Failed_budget_checks
=:= 0) of
true ->
<<"OK"/utf8>>;
false ->
<<"FAIL"/utf8>>
end,
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"# Render Churn 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"/utf8>>/binary,
"failed_budgets: "/utf8>>/binary,
(erlang:integer_to_binary(
Failed_budget_checks
))/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>>.