@@ -16,6 +16,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.Receipt do
1616 :aitrace_exports ,
1717 :replay_bundle ,
1818 :evidence_status ,
19+ :persistence_profiles ,
20+ :persistence_status ,
1921 :node_lab_run ,
2022 :distributed_envelope_scan ,
2123 :node_placement ,
@@ -38,6 +40,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.Receipt do
3840 aitrace_exports: [ map ( ) ] ,
3941 replay_bundle: map ( ) ,
4042 evidence_status: String . t ( ) ,
43+ persistence_profiles: map ( ) ,
44+ persistence_status: String . t ( ) ,
4145 node_lab_run: map ( ) ,
4246 distributed_envelope_scan: map ( ) ,
4347 node_placement: map ( ) ,
@@ -71,6 +75,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.RouterModelReceipt do
7175 :aitrace_exports ,
7276 :replay_bundle ,
7377 :evidence_status ,
78+ :persistence_profiles ,
79+ :persistence_status ,
7480 :node_lab_run ,
7581 :distributed_envelope_scan ,
7682 :node_placement ,
@@ -101,6 +107,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.RouterModelReceipt do
101107 aitrace_exports: [ map ( ) ] ,
102108 replay_bundle: map ( ) ,
103109 evidence_status: String . t ( ) ,
110+ persistence_profiles: map ( ) ,
111+ persistence_status: String . t ( ) ,
104112 node_lab_run: map ( ) ,
105113 distributed_envelope_scan: map ( ) ,
106114 node_placement: map ( ) ,
@@ -120,6 +128,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.FaultRecoveryReceipt do
120128 :baseline_receipt_ref ,
121129 :fault_receipts ,
122130 :owner_recovery_evidence ,
131+ :persistence_profiles ,
132+ :persistence_status ,
123133 :trace_refs ,
124134 :node_lab_run ,
125135 :does_not_prove
@@ -135,6 +145,8 @@ defmodule StackLab.Examples.GnTenDistributedStack.FaultRecoveryReceipt do
135145 baseline_receipt_ref: String . t ( ) ,
136146 fault_receipts: [ map ( ) ] ,
137147 owner_recovery_evidence: [ map ( ) ] ,
148+ persistence_profiles: map ( ) ,
149+ persistence_status: String . t ( ) ,
138150 trace_refs: [ String . t ( ) ] ,
139151 node_lab_run: map ( ) ,
140152 does_not_prove: [ String . t ( ) ]
@@ -161,6 +173,7 @@ defmodule StackLab.Examples.GnTenDistributedStack do
161173 @ envelope_schema_version "stack_lab.distributed_envelope.v1"
162174 @ context_roundtrip Module . concat ( [ StackLab , Examples , ContextABIRoundtrip ] )
163175 @ router_roundtrip Module . concat ( [ StackLab , Examples , NSHKRRouterFabricRoundtrip ] )
176+ @ persistence_roundtrip Module . concat ( [ StackLab , Examples , PersistenceModeRoundtrip ] )
164177 @ aitrace_evidence Module . concat ( [ AITrace , RemoteFacade , Evidence ] )
165178 @ aitrace_fixture_transport Module . concat ( [ AITrace , NSHKR , ExportTransport , Fixture ] )
166179 @ replay_bundle Module . concat ( [ AITrace , Trace , ReplayBundle ] )
@@ -195,12 +208,14 @@ defmodule StackLab.Examples.GnTenDistributedStack do
195208 node_trace_refs = node_trace_refs ( baseline , node_lab_run , :context )
196209 aitrace_exports = export_trace_evidence ( node_trace_refs , :context , evidence_opts )
197210 replay_bundle = replay_bundle ( baseline , :context )
211+ persistence_profiles = persistence_profiles ( )
198212
199213 { :ok ,
200214 % Receipt {
201215 receipt_ref: receipt_ref ( baseline ) ,
202216 schema_version: @ context_schema_version ,
203- status: status ( baseline , node_lab_run , envelope_scan , aitrace_exports ) ,
217+ status:
218+ status ( baseline , node_lab_run , envelope_scan , aitrace_exports , persistence_profiles ) ,
204219 profile: @ context_profile ,
205220 topology_ref: node_lab_run [ "topology_ref" ] ,
206221 monolith_baseline_receipt_ref: baseline . receipt_ref ,
@@ -212,6 +227,8 @@ defmodule StackLab.Examples.GnTenDistributedStack do
212227 aitrace_exports: aitrace_exports ,
213228 replay_bundle: replay_bundle ,
214229 evidence_status: evidence_status ( aitrace_exports ) ,
230+ persistence_profiles: persistence_profiles ,
231+ persistence_status: persistence_status ( persistence_profiles ) ,
215232 node_lab_run: node_lab_run ,
216233 distributed_envelope_scan: envelope_scan ,
217234 node_placement: node_placement ( node_lab_run ) ,
@@ -253,12 +270,20 @@ defmodule StackLab.Examples.GnTenDistributedStack do
253270 node_trace_refs = node_trace_refs ( baseline , node_lab_run , :router_model )
254271 aitrace_exports = export_trace_evidence ( node_trace_refs , :router_model , evidence_opts )
255272 replay_bundle = replay_bundle ( baseline , :router_model )
273+ persistence_profiles = persistence_profiles ( )
256274
257275 { :ok ,
258276 % RouterModelReceipt {
259277 receipt_ref: router_model_receipt_ref ( baseline ) ,
260278 schema_version: @ router_model_schema_version ,
261- status: router_model_status ( baseline , node_lab_run , envelope_scan , aitrace_exports ) ,
279+ status:
280+ router_model_status (
281+ baseline ,
282+ node_lab_run ,
283+ envelope_scan ,
284+ aitrace_exports ,
285+ persistence_profiles
286+ ) ,
262287 profile: @ router_model_profile ,
263288 topology_ref: node_lab_run [ "topology_ref" ] ,
264289 monolith_baseline_receipt_ref: baseline . receipt_ref ,
@@ -278,6 +303,8 @@ defmodule StackLab.Examples.GnTenDistributedStack do
278303 aitrace_exports: aitrace_exports ,
279304 replay_bundle: replay_bundle ,
280305 evidence_status: evidence_status ( aitrace_exports ) ,
306+ persistence_profiles: persistence_profiles ,
307+ persistence_status: persistence_status ( persistence_profiles ) ,
281308 node_lab_run: node_lab_run ,
282309 distributed_envelope_scan: envelope_scan ,
283310 node_placement: node_placement ( node_lab_run ) ,
@@ -308,6 +335,8 @@ defmodule StackLab.Examples.GnTenDistributedStack do
308335 baseline_receipt_ref: baseline . receipt_ref ,
309336 fault_receipts: fault_receipts ,
310337 owner_recovery_evidence: owner_recovery_evidence ( ) ,
338+ persistence_profiles: baseline . persistence_profiles ,
339+ persistence_status: baseline . persistence_status ,
311340 trace_refs: baseline . trace_refs ,
312341 node_lab_run: baseline . node_lab_run ,
313342 does_not_prove: [
@@ -398,19 +427,27 @@ defmodule StackLab.Examples.GnTenDistributedStack do
398427 }
399428 end
400429
401- defp status ( baseline , node_lab_run , envelope_scan , aitrace_exports ) do
430+ defp status ( baseline , node_lab_run , envelope_scan , aitrace_exports , persistence_profiles ) do
402431 if baseline . status == :pass and node_lab_run [ "status" ] == "pass" and
403- envelope_scan [ "status" ] == "pass" and evidence_status ( aitrace_exports ) == "pass" do
432+ envelope_scan [ "status" ] == "pass" and evidence_status ( aitrace_exports ) == "pass" and
433+ persistence_status ( persistence_profiles ) == "pass" do
404434 :pass
405435 else
406436 :open_defect
407437 end
408438 end
409439
410- defp router_model_status ( baseline , node_lab_run , envelope_scan , aitrace_exports ) do
440+ defp router_model_status (
441+ baseline ,
442+ node_lab_run ,
443+ envelope_scan ,
444+ aitrace_exports ,
445+ persistence_profiles
446+ ) do
411447 if baseline . status == :pass and node_lab_run [ "status" ] == "pass" and
412448 envelope_scan [ "status" ] == "pass" and route_and_model_refs_present? ( baseline ) and
413- model_accounting_present? ( baseline ) and evidence_status ( aitrace_exports ) == "pass" do
449+ model_accounting_present? ( baseline ) and evidence_status ( aitrace_exports ) == "pass" and
450+ persistence_status ( persistence_profiles ) == "pass" do
414451 :pass
415452 else
416453 :open_defect
@@ -518,6 +555,104 @@ defmodule StackLab.Examples.GnTenDistributedStack do
518555 if Enum . all? ( exports , & ( Map . get ( & 1 , "status" ) == "pass" ) ) , do: "pass" , else: "open_defect"
519556 end
520557
558+ defp persistence_profiles do
559+ case call ( @ persistence_roundtrip , :run , [ ] ) do
560+ { :ok , receipt } ->
561+ profile_receipts = Enum . map ( receipt . profile_receipts , & profile_receipt_fact / 1 )
562+ deterministic_profile_ids = [ "mickey_mouse" , "memory_debug" ]
563+
564+ deterministic_profiles =
565+ Enum . filter ( profile_receipts , & ( & 1 [ "profile_id" ] in deterministic_profile_ids ) )
566+
567+ % {
568+ "status" => Atom . to_string ( receipt . status ) ,
569+ "source_receipt_ref" => receipt . receipt_ref ,
570+ "deterministic_profiles" => deterministic_profiles ,
571+ "opt_in_external_profiles" => opt_in_external_profiles ( profile_receipts ) ,
572+ "matrix_scan" => json_safe ( receipt . matrix_scan ) ,
573+ "substrate_started_by_stack_lab?" => false ,
574+ "temporal_started_by_stack_lab?" => false ,
575+ "postgres_started_by_stack_lab?" => false ,
576+ "raw_debug_payloads_persisted?" => false
577+ }
578+
579+ { :error , reason } ->
580+ % {
581+ "status" => "open_defect" ,
582+ "reason" => inspect ( reason ) ,
583+ "deterministic_profiles" => [ ] ,
584+ "opt_in_external_profiles" => [ ] ,
585+ "substrate_started_by_stack_lab?" => false ,
586+ "temporal_started_by_stack_lab?" => false ,
587+ "postgres_started_by_stack_lab?" => false ,
588+ "raw_debug_payloads_persisted?" => false
589+ }
590+ end
591+ end
592+
593+ defp persistence_status ( % {
594+ "status" => "pass" ,
595+ "deterministic_profiles" => deterministic_profiles
596+ } ) do
597+ profile_ids =
598+ deterministic_profiles
599+ |> Enum . map ( & Map . fetch! ( & 1 , "profile_id" ) )
600+ |> MapSet . new ( )
601+
602+ if MapSet . subset? ( MapSet . new ( [ "mickey_mouse" , "memory_debug" ] ) , profile_ids ) do
603+ "pass"
604+ else
605+ "open_defect"
606+ end
607+ end
608+
609+ defp persistence_status ( _profiles ) , do: "open_defect"
610+
611+ defp profile_receipt_fact ( profile_receipt ) do
612+ % {
613+ "profile_id" => profile_receipt . profile_id |> Atom . to_string ( ) ,
614+ "selected_tier" => profile_receipt . selected_tier |> Atom . to_string ( ) ,
615+ "store_set_id" => profile_receipt . store_set_id |> Atom . to_string ( ) ,
616+ "capture_level" => profile_receipt . capture_level |> Atom . to_string ( ) ,
617+ "restart_claim" => profile_receipt . restart_claim |> Atom . to_string ( ) ,
618+ "durable_opt_in?" => profile_receipt . durable_opt_in? ,
619+ "durable_tag" => profile_receipt . durable_tag ,
620+ "proof_command" => profile_receipt . proof_command ,
621+ "storage_behavior_ref" => profile_receipt . storage_behavior_ref ,
622+ "authority_semantics_ref" => profile_receipt . authority_semantics_ref
623+ }
624+ end
625+
626+ defp opt_in_external_profiles ( profile_receipts ) do
627+ postgres_profiles =
628+ profile_receipts
629+ |> Enum . filter ( & ( & 1 [ "profile_id" ] in [ "integration_postgres" , "full_debug_tracked" ] ) )
630+ |> Enum . map ( fn profile ->
631+ Map . merge ( profile , % {
632+ "proof_mode" => "opt_in_preflight_only" ,
633+ "compose_ref" => "tools/compose/multi-node.yml" ,
634+ "toxiproxy_ref" => "tools/toxiproxy/toxiproxy.json" ,
635+ "substrate_started_by_stack_lab?" => false
636+ } )
637+ end )
638+
639+ postgres_profiles ++
640+ [
641+ % {
642+ "profile_id" => "ops_durable_temporal" ,
643+ "selected_tier" => "ops_durable" ,
644+ "store_set_id" => "temporal_workflow_runtime" ,
645+ "capture_level" => "metadata" ,
646+ "restart_claim" => "durable_restart" ,
647+ "durable_opt_in?" => true ,
648+ "durable_tag" => "persistence-durable-opt-in" ,
649+ "proof_mode" => "blocked_until_repo_owned_just" ,
650+ "just_command" => "cd /home/home/p/g/n/mezzanine && just dev-status" ,
651+ "substrate_started_by_stack_lab?" => false
652+ }
653+ ]
654+ end
655+
521656 defp replay_bundle ( baseline , scenario ) do
522657 attrs =
523658 % {
0 commit comments