src/lightspeed@ops@render_churn_harness.erl

-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>>.