-module(lightspeed@platform@convention_profile). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/lightspeed/platform/convention_profile.gleam"). -export([default_profile/0, websocket_fallback_hatch/0, data_partition_hatch/0, template_diagnostics_hatch/0, escape_hatch/4, with_escape_hatch/2, name/1, escape_hatches/1, hidden_runtime_behavior/1, has_stable_override_seams/1, valid/1, quick_start_ready/1, configuration_surface/1, configuration_surface_size/1, configuration_surface_signature/1, override_seam_signature/1, signature/1, reference_profiles/0, fixture_snapshots/0, snapshot_signature/0]). -export_type([runtime_convention/0, data_convention/0, template_convention/0, escape_seam/0, escape_hatch/0, core_profile/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(" Convention-over-configuration core profile contracts for M45.\n"). -type runtime_convention() :: {runtime_convention, binary(), binary(), binary(), binary(), binary()}. -type data_convention() :: {data_convention, binary(), binary(), binary(), boolean()}. -type template_convention() :: {template_convention, binary(), binary(), binary(), binary()}. -type escape_seam() :: runtime_seam | data_seam | template_seam. -type escape_hatch() :: {escape_hatch, escape_seam(), binary(), binary(), binary()}. -type core_profile() :: {core_profile, binary(), runtime_convention(), data_convention(), template_convention(), list(escape_hatch()), boolean()}. -file("src/lightspeed/platform/convention_profile.gleam", 64). ?DOC(" Narrow M45 default profile for common runtime/data/template workflows.\n"). -spec default_profile() -> core_profile(). default_profile() -> {core_profile, <<"core_default"/utf8>>, {runtime_convention, <<"MyApp.Web.Endpoint"/utf8>>, <<"MyApp.Web.Router"/utf8>>, <<"websocket_primary"/utf8>>, <<"MyApp.Session.Store"/utf8>>, <<"explicit_supervision_plan"/utf8>>}, {data_convention, <<"MyApp.Data.Scope"/utf8>>, <<"MyApp.Data.Repository"/utf8>>, <<"sql_migrations"/utf8>>, true}, {template_convention, <<"MyApp.Web.TemplateErgonomics"/utf8>>, <<"MyApp.Web.TemplateCompiler"/utf8>>, <<"explicit_slot_defaults"/utf8>>, <<"strict_deterministic"/utf8>>}, [], false}. -file("src/lightspeed/platform/convention_profile.gleam", 92). ?DOC(" Predefined runtime seam escape hatch.\n"). -spec websocket_fallback_hatch() -> escape_hatch(). websocket_fallback_hatch() -> {escape_hatch, runtime_seam, <<"MyApp.Runtime.TransportHooks"/utf8>>, <<"override_transport_fallback"/utf8>>, <<"enable websocket+sse fallback profile for constrained networks"/utf8>>}. -file("src/lightspeed/platform/convention_profile.gleam", 102). ?DOC(" Predefined data seam escape hatch.\n"). -spec data_partition_hatch() -> escape_hatch(). data_partition_hatch() -> {escape_hatch, data_seam, <<"MyApp.Data.PartitionHooks"/utf8>>, <<"resolve_partition_for_tenant"/utf8>>, <<"route selected tenants to non-default shard topology"/utf8>>}. -file("src/lightspeed/platform/convention_profile.gleam", 112). ?DOC(" Predefined template seam escape hatch.\n"). -spec template_diagnostics_hatch() -> escape_hatch(). template_diagnostics_hatch() -> {escape_hatch, template_seam, <<"MyApp.Web.TemplateHooks"/utf8>>, <<"customize_diagnostic_hints"/utf8>>, <<"add domain-specific migration hints for legacy templates"/utf8>>}. -file("src/lightspeed/platform/convention_profile.gleam", 122). ?DOC(" Build one explicit escape hatch.\n"). -spec escape_hatch(escape_seam(), binary(), binary(), binary()) -> escape_hatch(). escape_hatch(Seam, Module, Hook, Rationale) -> {escape_hatch, Seam, Module, Hook, Rationale}. -file("src/lightspeed/platform/convention_profile.gleam", 351). -spec append_hatch(list(escape_hatch()), escape_hatch()) -> list(escape_hatch()). append_hatch(Hatches, Hatch) -> case Hatches of [] -> [Hatch]; [Entry | Rest] -> [Entry | append_hatch(Rest, Hatch)] end. -file("src/lightspeed/platform/convention_profile.gleam", 372). -spec seam_label(escape_seam()) -> binary(). seam_label(Seam) -> case Seam of runtime_seam -> <<"runtime"/utf8>>; data_seam -> <<"data"/utf8>>; template_seam -> <<"template"/utf8>> end. -file("src/lightspeed/platform/convention_profile.gleam", 337). -spec hatch_contract_key(escape_hatch()) -> binary(). hatch_contract_key(Hatch) -> <<<<<<<<(seam_label(erlang:element(2, Hatch)))/binary, ":"/utf8>>/binary, (erlang:element(3, Hatch))/binary>>/binary, ":"/utf8>>/binary, (erlang:element(4, Hatch))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 326). -spec contains_hatch_contract(list(escape_hatch()), binary()) -> boolean(). contains_hatch_contract(Hatches, Key) -> case Hatches of [] -> false; [Hatch | Rest] -> case hatch_contract_key(Hatch) =:= Key of true -> true; false -> contains_hatch_contract(Rest, Key) end end. -file("src/lightspeed/platform/convention_profile.gleam", 341). -spec append_hatch_if_missing(list(escape_hatch()), escape_hatch()) -> list(escape_hatch()). append_hatch_if_missing(Hatches, Hatch) -> case contains_hatch_contract(Hatches, hatch_contract_key(Hatch)) of true -> Hatches; false -> append_hatch(Hatches, Hatch) end. -file("src/lightspeed/platform/convention_profile.gleam", 132). ?DOC(" Append one escape hatch when missing.\n"). -spec with_escape_hatch(core_profile(), escape_hatch()) -> core_profile(). with_escape_hatch(Profile, Hatch) -> {core_profile, erlang:element(2, Profile), erlang:element(3, Profile), erlang:element(4, Profile), erlang:element(5, Profile), append_hatch_if_missing(erlang:element(6, Profile), Hatch), erlang:element(7, Profile)}. -file("src/lightspeed/platform/convention_profile.gleam", 143). ?DOC(" Profile name accessor.\n"). -spec name(core_profile()) -> binary(). name(Profile) -> erlang:element(2, Profile). -file("src/lightspeed/platform/convention_profile.gleam", 148). ?DOC(" Escape-hatch accessor.\n"). -spec escape_hatches(core_profile()) -> list(escape_hatch()). escape_hatches(Profile) -> erlang:element(6, Profile). -file("src/lightspeed/platform/convention_profile.gleam", 153). ?DOC(" Hidden-runtime-behavior accessor.\n"). -spec hidden_runtime_behavior(core_profile()) -> boolean(). hidden_runtime_behavior(Profile) -> erlang:element(7, Profile). -file("src/lightspeed/platform/convention_profile.gleam", 317). -spec unique_hatch_contracts(list(escape_hatch())) -> boolean(). unique_hatch_contracts(Hatches) -> case Hatches of [] -> true; [Hatch | Rest] -> not contains_hatch_contract(Rest, hatch_contract_key(Hatch)) andalso unique_hatch_contracts( Rest ) end. -file("src/lightspeed/platform/convention_profile.gleam", 313). -spec hatch_valid(escape_hatch()) -> boolean(). hatch_valid(Hatch) -> ((erlang:element(3, Hatch) /= <<""/utf8>>) andalso (erlang:element(4, Hatch) /= <<""/utf8>>)) andalso (erlang:element(5, Hatch) /= <<""/utf8>>). -file("src/lightspeed/platform/convention_profile.gleam", 306). -spec hatches_valid(list(escape_hatch())) -> boolean(). hatches_valid(Hatches) -> case Hatches of [] -> true; [Hatch | Rest] -> hatch_valid(Hatch) andalso hatches_valid(Rest) end. -file("src/lightspeed/platform/convention_profile.gleam", 178). ?DOC(" Stable override seam contract verification.\n"). -spec has_stable_override_seams(core_profile()) -> boolean(). has_stable_override_seams(Profile) -> hatches_valid(erlang:element(6, Profile)) andalso unique_hatch_contracts( erlang:element(6, Profile) ). -file("src/lightspeed/platform/convention_profile.gleam", 299). -spec template_valid(template_convention()) -> boolean(). template_valid(Template) -> (((erlang:element(2, Template) /= <<""/utf8>>) andalso (erlang:element( 3, Template ) /= <<""/utf8>>)) andalso (erlang:element(4, Template) /= <<""/utf8>>)) andalso (erlang:element(5, Template) /= <<""/utf8>>). -file("src/lightspeed/platform/convention_profile.gleam", 292). -spec data_valid(data_convention()) -> boolean(). data_valid(Data) -> (((erlang:element(2, Data) /= <<""/utf8>>) andalso (erlang:element(3, Data) /= <<""/utf8>>)) andalso (erlang:element(4, Data) /= <<""/utf8>>)) andalso erlang:element(5, Data). -file("src/lightspeed/platform/convention_profile.gleam", 284). -spec runtime_valid(runtime_convention()) -> boolean(). runtime_valid(Runtime) -> ((((erlang:element(2, Runtime) /= <<""/utf8>>) andalso (erlang:element( 3, Runtime ) /= <<""/utf8>>)) andalso (erlang:element(4, Runtime) /= <<""/utf8>>)) andalso (erlang:element(5, Runtime) /= <<""/utf8>>)) andalso (erlang:element(6, Runtime) /= <<""/utf8>>). -file("src/lightspeed/platform/convention_profile.gleam", 158). ?DOC(" Validate profile contract.\n"). -spec valid(core_profile()) -> boolean(). valid(Profile) -> (((((erlang:element(2, Profile) /= <<""/utf8>>) andalso runtime_valid( erlang:element(3, Profile) )) andalso data_valid(erlang:element(4, Profile))) andalso template_valid(erlang:element(5, Profile))) andalso hatches_valid(erlang:element(6, Profile))) andalso has_stable_override_seams(Profile). -file("src/lightspeed/platform/convention_profile.gleam", 168). ?DOC(" Quick-start readiness for narrow default profile usage.\n"). -spec quick_start_ready(core_profile()) -> boolean(). quick_start_ready(Profile) -> ((((valid(Profile) andalso not erlang:element(7, Profile)) andalso (erlang:element( 6, Profile ) =:= [])) andalso (erlang:element(6, erlang:element(3, Profile)) =:= <<"explicit_supervision_plan"/utf8>>)) andalso erlang:element(5, erlang:element(4, Profile))) andalso (erlang:element(5, erlang:element(5, Profile)) =:= <<"strict_deterministic"/utf8>>). -file("src/lightspeed/platform/convention_profile.gleam", 422). -spec concat(list(binary()), list(binary())) -> list(binary()). concat(Left, Right) -> case Left of [] -> Right; [Value | Rest] -> [Value | concat(Rest, Right)] end. -file("src/lightspeed/platform/convention_profile.gleam", 184). ?DOC(" Flattened configuration surface for runtime/data/template workflows.\n"). -spec configuration_surface(core_profile()) -> list(binary()). configuration_surface(Profile) -> Base = [<<"runtime.endpoint_module="/utf8, (erlang:element(2, erlang:element(3, Profile)))/binary>>, <<"runtime.router_module="/utf8, (erlang:element(3, erlang:element(3, Profile)))/binary>>, <<"runtime.transport_profile="/utf8, (erlang:element(4, erlang:element(3, Profile)))/binary>>, <<"data.scope_module="/utf8, (erlang:element(2, erlang:element(4, Profile)))/binary>>, <<"data.repository_module="/utf8, (erlang:element(3, erlang:element(4, Profile)))/binary>>, <<"template.ergonomics_module="/utf8, (erlang:element(2, erlang:element(5, Profile)))/binary>>], Hatch_entries = gleam@list:map( erlang:element(6, Profile), fun(Hatch) -> <<<<<<<<<<"escape_hatch."/utf8, (seam_label(erlang:element(2, Hatch)))/binary>>/binary, "="/utf8>>/binary, (erlang:element(3, Hatch))/binary>>/binary, "#"/utf8>>/binary, (erlang:element(4, Hatch))/binary>> end ), concat(Base, Hatch_entries). -file("src/lightspeed/platform/convention_profile.gleam", 207). ?DOC(" Configuration surface size accessor.\n"). -spec configuration_surface_size(core_profile()) -> integer(). configuration_surface_size(Profile) -> erlang:length(configuration_surface(Profile)). -file("src/lightspeed/platform/convention_profile.gleam", 429). -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/platform/convention_profile.gleam", 212). ?DOC(" Stable configuration-surface signature.\n"). -spec configuration_surface_signature(core_profile()) -> binary(). configuration_surface_signature(Profile) -> <<"surface:"/utf8, (join_with(<<";"/utf8>>, configuration_surface(Profile)))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 361). -spec seam_hooks(list(escape_hatch()), escape_seam()) -> list(binary()). seam_hooks(Hatches, Seam) -> case Hatches of [] -> []; [Hatch | Rest] -> case erlang:element(2, Hatch) =:= Seam of true -> [<<<<(erlang:element(3, Hatch))/binary, "#"/utf8>>/binary, (erlang:element(4, Hatch))/binary>> | seam_hooks(Rest, Seam)]; false -> seam_hooks(Rest, Seam) end end. -file("src/lightspeed/platform/convention_profile.gleam", 217). ?DOC(" Stable override-seam signature.\n"). -spec override_seam_signature(core_profile()) -> binary(). override_seam_signature(Profile) -> <<<<<<<<<<"runtime="/utf8, (join_with( <<","/utf8>>, seam_hooks(erlang:element(6, Profile), runtime_seam) ))/binary>>/binary, "|data="/utf8>>/binary, (join_with( <<","/utf8>>, seam_hooks(erlang:element(6, Profile), data_seam) ))/binary>>/binary, "|template="/utf8>>/binary, (join_with( <<","/utf8>>, seam_hooks(erlang:element(6, Profile), template_seam) ))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 415). -spec bool_label(boolean()) -> binary(). bool_label(Value) -> case Value of true -> <<"true"/utf8>>; false -> <<"false"/utf8>> end. -file("src/lightspeed/platform/convention_profile.gleam", 404). -spec template_signature(template_convention()) -> binary(). template_signature(Template) -> <<<<<<<<<<<<<<"ergonomics="/utf8, (erlang:element(2, Template))/binary>>/binary, "|compiler="/utf8>>/binary, (erlang:element(3, Template))/binary>>/binary, "|slot_defaults="/utf8>>/binary, (erlang:element(4, Template))/binary>>/binary, "|diagnostics="/utf8>>/binary, (erlang:element(5, Template))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 393). -spec data_signature(data_convention()) -> binary(). data_signature(Data) -> <<<<<<<<<<<<<<"scope="/utf8, (erlang:element(2, Data))/binary>>/binary, "|repository="/utf8>>/binary, (erlang:element(3, Data))/binary>>/binary, "|migration="/utf8>>/binary, (erlang:element(4, Data))/binary>>/binary, "|tenant_scope_required="/utf8>>/binary, (bool_label(erlang:element(5, Data)))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 380). -spec runtime_signature(runtime_convention()) -> binary(). runtime_signature(Runtime) -> <<<<<<<<<<<<<<<<<<"endpoint="/utf8, (erlang:element(2, Runtime))/binary>>/binary, "|router="/utf8>>/binary, (erlang:element(3, Runtime))/binary>>/binary, "|transport="/utf8>>/binary, (erlang:element(4, Runtime))/binary>>/binary, "|session_store="/utf8>>/binary, (erlang:element(5, Runtime))/binary>>/binary, "|boot="/utf8>>/binary, (erlang:element(6, Runtime))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 227). ?DOC(" Stable profile signature.\n"). -spec signature(core_profile()) -> binary(). signature(Profile) -> <<<<<<<<<<<<<<<<<<<<<<"profile:"/utf8, (erlang:element(2, Profile))/binary>>/binary, "|runtime="/utf8>>/binary, (runtime_signature( erlang:element(3, Profile) ))/binary>>/binary, "|data="/utf8>>/binary, (data_signature(erlang:element(4, Profile)))/binary>>/binary, "|template="/utf8>>/binary, (template_signature(erlang:element(5, Profile)))/binary>>/binary, "|hidden_runtime_behavior="/utf8>>/binary, (bool_label(erlang:element(7, Profile)))/binary>>/binary, "|overrides="/utf8>>/binary, (override_seam_signature(Profile))/binary>>. -file("src/lightspeed/platform/convention_profile.gleam", 243). ?DOC(" Reference fixture profiles for deterministic M45 certification.\n"). -spec reference_profiles() -> list(core_profile()). reference_profiles() -> Baseline = default_profile(), Runtime_override = with_escape_hatch(Baseline, websocket_fallback_hatch()), Multi_override = begin _pipe = Baseline, _pipe@1 = with_escape_hatch(_pipe, websocket_fallback_hatch()), _pipe@2 = with_escape_hatch(_pipe@1, data_partition_hatch()), with_escape_hatch(_pipe@2, template_diagnostics_hatch()) end, [Baseline, Runtime_override, Multi_override]. -file("src/lightspeed/platform/convention_profile.gleam", 256). ?DOC(" Deterministic fixture signatures for CI drift gates.\n"). -spec fixture_snapshots() -> list({binary(), binary()}). fixture_snapshots() -> Profiles = reference_profiles(), case Profiles of [Baseline, Runtime_override, Multi_override] -> [{<<"default_profile"/utf8>>, signature(Baseline)}, {<<"runtime_override_profile"/utf8>>, signature(Runtime_override)}, {<<"multi_override_profile"/utf8>>, signature(Multi_override)}]; _ -> [] end. -file("src/lightspeed/platform/convention_profile.gleam", 270). ?DOC(" Deterministic M45 fixture snapshot signature.\n"). -spec snapshot_signature() -> binary(). snapshot_signature() -> Entries = begin _pipe = fixture_snapshots(), gleam@list:map( _pipe, fun(Entry) -> {Label, Value} = Entry, <<<