From fbb39e6550096d28031e0ee00d462cebf3dd0a70 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 15:28:50 +0000 Subject: [PATCH 01/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/extdeps/os/free.dag | 32 +++++++++ dsl/extdeps/os/proc_meminfo.dag | 39 ++++++++++ dsl/extdeps/os/systemd.dag | 31 ++++++++ dsl/test/claim/os_free_witness_test.dag | 72 +++++++++++++++++++ .../claim/os_proc_meminfo_witness_test.dag | 36 ++++++++++ dsl/test/claim/os_systemd_witness_test.dag | 42 +++++++++++ 6 files changed, 252 insertions(+) create mode 100644 dsl/extdeps/os/free.dag create mode 100644 dsl/extdeps/os/proc_meminfo.dag create mode 100644 dsl/extdeps/os/systemd.dag create mode 100644 dsl/test/claim/os_free_witness_test.dag create mode 100644 dsl/test/claim/os_proc_meminfo_witness_test.dag create mode 100644 dsl/test/claim/os_systemd_witness_test.dag diff --git a/dsl/extdeps/os/free.dag b/dsl/extdeps/os/free.dag new file mode 100644 index 00000000000..50daa04352f --- /dev/null +++ b/dsl/extdeps/os/free.dag @@ -0,0 +1,32 @@ +module extdeps.os.free + +import std.types { Int } +import extdeps.external_authority { ExternalAuthority } +import extdeps.uri { Uri, Https } + +data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { + uri: Uri { + scheme: Https + locator: "man7.org/linux/man-pages/man1/free.1.html" + } +} + +type MemoryStats { + total: Int + used: Int + free: Int + shared: Int + buff_cache: Int + available: Int +} + +type SwapStats { + total: Int + used: Int + free: Int +} + +type FreeOutput { + memory: MemoryStats + swap: SwapStats +} diff --git a/dsl/extdeps/os/proc_meminfo.dag b/dsl/extdeps/os/proc_meminfo.dag new file mode 100644 index 00000000000..c3a42bfc897 --- /dev/null +++ b/dsl/extdeps/os/proc_meminfo.dag @@ -0,0 +1,39 @@ +module extdeps.os.proc_meminfo + +import std.types { Int, NonEmptyStr } +import std.list { List } +import extdeps.external_authority { ExternalAuthority } +import extdeps.uri { Uri, Https } + +data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { + uri: Uri { + scheme: Https + locator: "man7.org/linux/man-pages/man5/proc.5.html#/proc/meminfo" + } +} + +type MemoryMetric { + key: NonEmptyStr + value_kibibytes: Int +} + +type ProcMeminfo { + mem_total: Int + mem_free: Int + mem_available: Int + buffers: Int + cached: Int + swap_total: Int + swap_free: Int + all_metrics: List +} + +data meminfo_field_names: List = [ + "MemTotal", + "MemFree", + "MemAvailable", + "Buffers", + "Cached", + "SwapTotal", + "SwapFree", +] diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag new file mode 100644 index 00000000000..77bbc92d316 --- /dev/null +++ b/dsl/extdeps/os/systemd.dag @@ -0,0 +1,31 @@ +module extdeps.os.systemd + +import std.types { NonEmptyStr } +import std.serialization { CoproductWireContract, StringVariant, KebabCase } +import extdeps.external_authority { ExternalAuthority } +import extdeps.uri { Uri, Https } + +data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { + uri: Uri { + scheme: Https + locator: "man7.org/linux/man-pages/man1/systemctl.1.html#is-active" + } +} + +type SystemdUnitActiveState + = Active + | Inactive + | Activating + | Deactivating + | Reloading + | Failed + +data systemd_unit_active_state_wire_contract: CoproductWireContract = { + coproduct: "SystemdUnitActiveState", + encoding: StringVariant { naming: KebabCase } +} + +type SystemdUnitStatus { + name: NonEmptyStr + active_state: SystemdUnitActiveState +} diff --git a/dsl/test/claim/os_free_witness_test.dag b/dsl/test/claim/os_free_witness_test.dag new file mode 100644 index 00000000000..69ba7855f67 --- /dev/null +++ b/dsl/test/claim/os_free_witness_test.dag @@ -0,0 +1,72 @@ +module test.claim.os_free_witness + +import extdeps.os.free { + FreeOutput, + MemoryStats, + SwapStats, +} + +test fn valid_memory_stats { + let stats: MemoryStats = MemoryStats { + total: 8192000000, + used: 1024000000, + free: 2048000000, + shared: 0, + buff_cache: 5120000000, + available: 3072000000, + } + + assert stats.total > 0 + assert stats.available <= stats.total + assert stats.free <= stats.total +} + +test fn valid_swap_stats { + let stats: SwapStats = SwapStats { + total: 2048000000, + used: 0, + free: 2048000000, + } + + assert stats.total >= 0 + assert stats.used <= stats.total + assert stats.free <= stats.total +} + +test fn valid_free_output { + let mem: MemoryStats = MemoryStats { + total: 8192000000, + used: 1024000000, + free: 2048000000, + shared: 0, + buff_cache: 5120000000, + available: 3072000000, + } + + let swap: SwapStats = SwapStats { + total: 2048000000, + used: 0, + free: 2048000000, + } + + let output: FreeOutput = FreeOutput { + memory: mem, + swap: swap, + } + + assert output.memory.total > 0 + assert output.swap.total >= 0 +} + +test fn memory_consistency { + let stats: MemoryStats = MemoryStats { + total: 8192000000, + used: 1024000000, + free: 2048000000, + shared: 0, + buff_cache: 5120000000, + available: 3072000000, + } + + assert stats.available >= stats.free +} diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag new file mode 100644 index 00000000000..81961719b8b --- /dev/null +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -0,0 +1,36 @@ +module test.claim.os_proc_meminfo_witness + +import extdeps.os.proc_meminfo { + ProcMeminfo, + MemoryMetric, + meminfo_field_names, +} + +test fn valid_proc_meminfo_struct { + let info: ProcMeminfo = ProcMeminfo { + mem_total: 8012272, + mem_free: 4048136, + mem_available: 6144000, + buffers: 256000, + cached: 2048136, + swap_total: 2097152, + swap_free: 2097152, + all_metrics: [], + } + + assert info.mem_total > 0 + assert info.mem_available <= info.mem_total +} + +test fn valid_memory_metric { + let metric: MemoryMetric = MemoryMetric { + key: "MemTotal", + value_kibibytes: 8012272, + } + + assert metric.value_kibibytes > 0 +} + +test fn field_names_nonempty { + assert len(meminfo_field_names) > 0 +} diff --git a/dsl/test/claim/os_systemd_witness_test.dag b/dsl/test/claim/os_systemd_witness_test.dag new file mode 100644 index 00000000000..8a24dcd912f --- /dev/null +++ b/dsl/test/claim/os_systemd_witness_test.dag @@ -0,0 +1,42 @@ +module test.claim.os_systemd_witness + +import extdeps.os.systemd { + SystemdUnitStatus, + SystemdUnitActiveState, + Active, + Inactive, + Failed, +} + +test fn valid_active_unit { + let status: SystemdUnitStatus = SystemdUnitStatus { + name: "docker.service", + active_state: Active, + } + + assert status.name != "" +} + +test fn valid_inactive_unit { + let status: SystemdUnitStatus = SystemdUnitStatus { + name: "some.service", + active_state: Inactive, + } + + assert status.name != "" +} + +test fn valid_failed_unit { + let status: SystemdUnitStatus = SystemdUnitStatus { + name: "failing.service", + active_state: Failed, + } + + assert status.name != "" +} + +test fn active_state_variants_exist { + let _active: SystemdUnitActiveState = Active + let _inactive: SystemdUnitActiveState = Inactive + let _failed: SystemdUnitActiveState = Failed +} From 3be7eb6f912ef174170b82cad41a4b3b0aa72249 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 15:33:49 +0000 Subject: [PATCH 02/21] =?UTF-8?q?Slice=20C:=20Host=20metrics=20extdeps=20s?= =?UTF-8?q?hapes=20(=C2=A73=20single-authority=20shape=20modeling)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model host metrics data structures in extdeps/os following DESIGN.md §3 de-fusion (shape/transport/policy separation): - proc_meminfo.dag: /proc/meminfo output structure (ProcMeminfo type with memory metrics fields, MemoryMetric for individual key-value pairs) - systemd.dag: systemctl is-active output structure (SystemdUnitActiveState coproduct, SystemdUnitStatus record with wire contract for snake_case encoding) - free.dag: free -b output structure (MemoryStats and SwapStats records in FreeOutput container) All three modules anchor to external authorities (man7.org) per extdeps convention. Test witnesses prove shape construction and invariant checking via executable Bool assertions (mem_available <= mem_total, etc). Each module models shape only; transport (how to fetch) and policy (when/where to call) remain absent, per single-authority principle. Co-Authored-By: Claude Haiku 4.5 --- dsl/extdeps/os/systemd.dag | 4 +- dsl/test/claim/os_free_witness_test.dag | 63 +++++-------------- .../claim/os_proc_meminfo_witness_test.dag | 19 ++---- dsl/test/claim/os_systemd_witness_test.dag | 26 +++----- 4 files changed, 30 insertions(+), 82 deletions(-) diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag index 77bbc92d316..565247325ab 100644 --- a/dsl/extdeps/os/systemd.dag +++ b/dsl/extdeps/os/systemd.dag @@ -1,7 +1,7 @@ module extdeps.os.systemd import std.types { NonEmptyStr } -import std.serialization { CoproductWireContract, StringVariant, KebabCase } +import std.serialization { CoproductWireContract, StringVariant, SnakeCase } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } @@ -22,7 +22,7 @@ type SystemdUnitActiveState data systemd_unit_active_state_wire_contract: CoproductWireContract = { coproduct: "SystemdUnitActiveState", - encoding: StringVariant { naming: KebabCase } + encoding: StringVariant { naming: SnakeCase } } type SystemdUnitStatus { diff --git a/dsl/test/claim/os_free_witness_test.dag b/dsl/test/claim/os_free_witness_test.dag index 69ba7855f67..bcec85ef809 100644 --- a/dsl/test/claim/os_free_witness_test.dag +++ b/dsl/test/claim/os_free_witness_test.dag @@ -6,8 +6,8 @@ import extdeps.os.free { SwapStats, } -test fn valid_memory_stats { - let stats: MemoryStats = MemoryStats { +test fn free_output_witnesses() -> Bool { + let memory_stats = MemoryStats { total: 8192000000, used: 1024000000, free: 2048000000, @@ -16,57 +16,24 @@ test fn valid_memory_stats { available: 3072000000, } - assert stats.total > 0 - assert stats.available <= stats.total - assert stats.free <= stats.total -} - -test fn valid_swap_stats { - let stats: SwapStats = SwapStats { + let swap_stats = SwapStats { total: 2048000000, used: 0, free: 2048000000, } - assert stats.total >= 0 - assert stats.used <= stats.total - assert stats.free <= stats.total -} - -test fn valid_free_output { - let mem: MemoryStats = MemoryStats { - total: 8192000000, - used: 1024000000, - free: 2048000000, - shared: 0, - buff_cache: 5120000000, - available: 3072000000, - } - - let swap: SwapStats = SwapStats { - total: 2048000000, - used: 0, - free: 2048000000, - } - - let output: FreeOutput = FreeOutput { - memory: mem, - swap: swap, - } - - assert output.memory.total > 0 - assert output.swap.total >= 0 -} - -test fn memory_consistency { - let stats: MemoryStats = MemoryStats { - total: 8192000000, - used: 1024000000, - free: 2048000000, - shared: 0, - buff_cache: 5120000000, - available: 3072000000, + let output = FreeOutput { + memory: memory_stats, + swap: swap_stats, } - assert stats.available >= stats.free + memory_stats.total > 0 + && memory_stats.available <= memory_stats.total + && memory_stats.free <= memory_stats.total + && swap_stats.total >= 0 + && swap_stats.used <= swap_stats.total + && swap_stats.free <= swap_stats.total + && output.memory.total > 0 + && output.swap.total >= 0 + && memory_stats.available >= memory_stats.free } diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag index 81961719b8b..329342ed899 100644 --- a/dsl/test/claim/os_proc_meminfo_witness_test.dag +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -6,8 +6,8 @@ import extdeps.os.proc_meminfo { meminfo_field_names, } -test fn valid_proc_meminfo_struct { - let info: ProcMeminfo = ProcMeminfo { +test fn proc_meminfo_witnesses() -> Bool { + let info = ProcMeminfo { mem_total: 8012272, mem_free: 4048136, mem_available: 6144000, @@ -18,19 +18,12 @@ test fn valid_proc_meminfo_struct { all_metrics: [], } - assert info.mem_total > 0 - assert info.mem_available <= info.mem_total -} - -test fn valid_memory_metric { - let metric: MemoryMetric = MemoryMetric { + let metric = MemoryMetric { key: "MemTotal", value_kibibytes: 8012272, } - assert metric.value_kibibytes > 0 -} - -test fn field_names_nonempty { - assert len(meminfo_field_names) > 0 + info.mem_total > 0 + && info.mem_available <= info.mem_total + && metric.value_kibibytes > 0 } diff --git a/dsl/test/claim/os_systemd_witness_test.dag b/dsl/test/claim/os_systemd_witness_test.dag index 8a24dcd912f..8bdaa37c542 100644 --- a/dsl/test/claim/os_systemd_witness_test.dag +++ b/dsl/test/claim/os_systemd_witness_test.dag @@ -8,35 +8,23 @@ import extdeps.os.systemd { Failed, } -test fn valid_active_unit { - let status: SystemdUnitStatus = SystemdUnitStatus { +test fn systemd_witnesses() -> Bool { + let active_status = SystemdUnitStatus { name: "docker.service", active_state: Active, } - assert status.name != "" -} - -test fn valid_inactive_unit { - let status: SystemdUnitStatus = SystemdUnitStatus { + let inactive_status = SystemdUnitStatus { name: "some.service", active_state: Inactive, } - assert status.name != "" -} - -test fn valid_failed_unit { - let status: SystemdUnitStatus = SystemdUnitStatus { + let failed_status = SystemdUnitStatus { name: "failing.service", active_state: Failed, } - assert status.name != "" -} - -test fn active_state_variants_exist { - let _active: SystemdUnitActiveState = Active - let _inactive: SystemdUnitActiveState = Inactive - let _failed: SystemdUnitActiveState = Failed + active_status.name != "" + && inactive_status.name != "" + && failed_status.name != "" } From 8965a8ced5f6d1b3420112f7b3df45f1cf70163a Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 15:38:45 +0000 Subject: [PATCH 03/21] Fix: Add NonEmptyStr casting in witness tests (as NonEmptyStr for name fields) --- dsl/test/claim/os_proc_meminfo_witness_test.dag | 3 ++- dsl/test/claim/os_systemd_witness_test.dag | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag index 329342ed899..a875462f858 100644 --- a/dsl/test/claim/os_proc_meminfo_witness_test.dag +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -5,6 +5,7 @@ import extdeps.os.proc_meminfo { MemoryMetric, meminfo_field_names, } +import std.types { NonEmptyStr } test fn proc_meminfo_witnesses() -> Bool { let info = ProcMeminfo { @@ -19,7 +20,7 @@ test fn proc_meminfo_witnesses() -> Bool { } let metric = MemoryMetric { - key: "MemTotal", + key: "MemTotal" as NonEmptyStr, value_kibibytes: 8012272, } diff --git a/dsl/test/claim/os_systemd_witness_test.dag b/dsl/test/claim/os_systemd_witness_test.dag index 8bdaa37c542..0afa0003f73 100644 --- a/dsl/test/claim/os_systemd_witness_test.dag +++ b/dsl/test/claim/os_systemd_witness_test.dag @@ -7,20 +7,21 @@ import extdeps.os.systemd { Inactive, Failed, } +import std.types { NonEmptyStr } test fn systemd_witnesses() -> Bool { let active_status = SystemdUnitStatus { - name: "docker.service", + name: "docker.service" as NonEmptyStr, active_state: Active, } let inactive_status = SystemdUnitStatus { - name: "some.service", + name: "some.service" as NonEmptyStr, active_state: Inactive, } let failed_status = SystemdUnitStatus { - name: "failing.service", + name: "failing.service" as NonEmptyStr, active_state: Failed, } From 0054a10325b926ac4e0cc7d196f6f7ce78b9d4bc Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 15:51:34 +0000 Subject: [PATCH 04/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/extdeps/os/free.dag | 20 ++++++++++---------- dsl/extdeps/os/proc_meminfo.dag | 22 +++++++++++++--------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/dsl/extdeps/os/free.dag b/dsl/extdeps/os/free.dag index 50daa04352f..1750b48f296 100644 --- a/dsl/extdeps/os/free.dag +++ b/dsl/extdeps/os/free.dag @@ -1,6 +1,6 @@ module extdeps.os.free -import std.types { Int } +import std.measure { ByteSize } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } @@ -12,18 +12,18 @@ data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { } type MemoryStats { - total: Int - used: Int - free: Int - shared: Int - buff_cache: Int - available: Int + total: ByteSize + used: ByteSize + free: ByteSize + shared: ByteSize + buff_cache: ByteSize + available: ByteSize } type SwapStats { - total: Int - used: Int - free: Int + total: ByteSize + used: ByteSize + free: ByteSize } type FreeOutput { diff --git a/dsl/extdeps/os/proc_meminfo.dag b/dsl/extdeps/os/proc_meminfo.dag index c3a42bfc897..19a12087a49 100644 --- a/dsl/extdeps/os/proc_meminfo.dag +++ b/dsl/extdeps/os/proc_meminfo.dag @@ -1,7 +1,9 @@ module extdeps.os.proc_meminfo -import std.types { Int, NonEmptyStr } +import std.types { NonEmptyStr } import std.list { List } +import std.measure { Measure } +import std.nat { Nat } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } @@ -12,19 +14,21 @@ data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { } } +type Kibibyte = Measure + type MemoryMetric { key: NonEmptyStr - value_kibibytes: Int + value: Kibibyte } type ProcMeminfo { - mem_total: Int - mem_free: Int - mem_available: Int - buffers: Int - cached: Int - swap_total: Int - swap_free: Int + mem_total: Kibibyte + mem_free: Kibibyte + mem_available: Kibibyte + buffers: Kibibyte + cached: Kibibyte + swap_total: Kibibyte + swap_free: Kibibyte all_metrics: List } From 73cd6377094f78a7175dc5f7adc3851b1508fbef Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 15:53:06 +0000 Subject: [PATCH 05/21] Fix: resolve unit type violations in host metrics extdeps shapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace bare Int fields with proper Measure types in host metrics modules: - proc_meminfo.dag: all memory fields now use Kibibyte (Measure) - free.dag: all memory/swap fields now use ByteSize (Measure) - Import Memory and Kibi variants from std.measure following §3 single-authority principle - Update test witnesses to cast numeric literals to Measure types - Rename proc_meminfo.dag field value_kibibytes → value for consistency with Kibibyte type Addresses blocking review: unit type violations violate §3 single-authority principle. Establishes Measure as single authority for all physical quantity modeling per std.measure.dag. Co-Authored-By: Claude Haiku 4.5 --- dsl/extdeps/os/proc_meminfo.dag | 2 +- dsl/test/claim/os_free_witness_test.dag | 19 ++++++++++--------- .../claim/os_proc_meminfo_witness_test.dag | 19 ++++++++++--------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/dsl/extdeps/os/proc_meminfo.dag b/dsl/extdeps/os/proc_meminfo.dag index 19a12087a49..f15e3513374 100644 --- a/dsl/extdeps/os/proc_meminfo.dag +++ b/dsl/extdeps/os/proc_meminfo.dag @@ -2,7 +2,7 @@ module extdeps.os.proc_meminfo import std.types { NonEmptyStr } import std.list { List } -import std.measure { Measure } +import std.measure { Measure, Memory, Kibi } import std.nat { Nat } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } diff --git a/dsl/test/claim/os_free_witness_test.dag b/dsl/test/claim/os_free_witness_test.dag index bcec85ef809..73d75609227 100644 --- a/dsl/test/claim/os_free_witness_test.dag +++ b/dsl/test/claim/os_free_witness_test.dag @@ -5,21 +5,22 @@ import extdeps.os.free { MemoryStats, SwapStats, } +import std.measure { ByteSize } test fn free_output_witnesses() -> Bool { let memory_stats = MemoryStats { - total: 8192000000, - used: 1024000000, - free: 2048000000, - shared: 0, - buff_cache: 5120000000, - available: 3072000000, + total: 8192000000 as ByteSize, + used: 1024000000 as ByteSize, + free: 2048000000 as ByteSize, + shared: 0 as ByteSize, + buff_cache: 5120000000 as ByteSize, + available: 3072000000 as ByteSize, } let swap_stats = SwapStats { - total: 2048000000, - used: 0, - free: 2048000000, + total: 2048000000 as ByteSize, + used: 0 as ByteSize, + free: 2048000000 as ByteSize, } let output = FreeOutput { diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag index a875462f858..9a278a46cf3 100644 --- a/dsl/test/claim/os_proc_meminfo_witness_test.dag +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -4,27 +4,28 @@ import extdeps.os.proc_meminfo { ProcMeminfo, MemoryMetric, meminfo_field_names, + Kibibyte, } import std.types { NonEmptyStr } test fn proc_meminfo_witnesses() -> Bool { let info = ProcMeminfo { - mem_total: 8012272, - mem_free: 4048136, - mem_available: 6144000, - buffers: 256000, - cached: 2048136, - swap_total: 2097152, - swap_free: 2097152, + mem_total: 8012272 as Kibibyte, + mem_free: 4048136 as Kibibyte, + mem_available: 6144000 as Kibibyte, + buffers: 256000 as Kibibyte, + cached: 2048136 as Kibibyte, + swap_total: 2097152 as Kibibyte, + swap_free: 2097152 as Kibibyte, all_metrics: [], } let metric = MemoryMetric { key: "MemTotal" as NonEmptyStr, - value_kibibytes: 8012272, + value: 8012272 as Kibibyte, } info.mem_total > 0 && info.mem_available <= info.mem_total - && metric.value_kibibytes > 0 + && metric.value > 0 } From b7f016025d920870fc6973ced471e3d4bb0d31a0 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 16:09:20 +0000 Subject: [PATCH 06/21] FIX: systemd.dag wire contract with execution + inert carrier roster --- dsl/extdeps/os/systemd.dag | 21 ++++++++++++++++ dsl/test/claim/os_systemd_witness_test.dag | 29 +++++++++++----------- src/v1/stage0/src/inert_carrier_project.rs | 8 ++++++ 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag index 565247325ab..c7c16bc5283 100644 --- a/dsl/extdeps/os/systemd.dag +++ b/dsl/extdeps/os/systemd.dag @@ -25,6 +25,27 @@ data systemd_unit_active_state_wire_contract: CoproductWireContract = { encoding: StringVariant { naming: SnakeCase } } +fn parse_systemd_unit_active_state(raw: String) -> SystemdUnitActiveState? { + if raw == "active" { Present { value: Active } } + else { if raw == "inactive" { Present { value: Inactive } } + else { if raw == "activating" { Present { value: Activating } } + else { if raw == "deactivating" { Present { value: Deactivating } } + else { if raw == "reloading" { Present { value: Reloading } } + else { if raw == "failed" { Present { value: Failed } } + else { none } } } } } } +} + +fn systemd_unit_active_state_wire_label(s: SystemdUnitActiveState) -> String { + match s { + Active => "active" + Inactive => "inactive" + Activating => "activating" + Deactivating => "deactivating" + Reloading => "reloading" + Failed => "failed" + } +} + type SystemdUnitStatus { name: NonEmptyStr active_state: SystemdUnitActiveState diff --git a/dsl/test/claim/os_systemd_witness_test.dag b/dsl/test/claim/os_systemd_witness_test.dag index 0afa0003f73..aec50885f4a 100644 --- a/dsl/test/claim/os_systemd_witness_test.dag +++ b/dsl/test/claim/os_systemd_witness_test.dag @@ -6,26 +6,25 @@ import extdeps.os.systemd { Active, Inactive, Failed, + parse_systemd_unit_active_state, + systemd_unit_active_state_wire_label, } import std.types { NonEmptyStr } -test fn systemd_witnesses() -> Bool { - let active_status = SystemdUnitStatus { - name: "docker.service" as NonEmptyStr, - active_state: Active, - } - - let inactive_status = SystemdUnitStatus { - name: "some.service" as NonEmptyStr, - active_state: Inactive, +test fn witness_active_wire_decodes_to_active() -> Bool { + match parse_systemd_unit_active_state(raw: "active") { + Present { value: Active } => True + _ => False } +} - let failed_status = SystemdUnitStatus { - name: "failing.service" as NonEmptyStr, - active_state: Failed, +test fn witness_wrong_case_does_not_decode() -> Bool { + match parse_systemd_unit_active_state(raw: "ACTIVE") { + none => True + _ => False } +} - active_status.name != "" - && inactive_status.name != "" - && failed_status.name != "" +test fn witness_roundtrip_failed() -> Bool { + systemd_unit_active_state_wire_label(s: Failed) == "failed" } diff --git a/src/v1/stage0/src/inert_carrier_project.rs b/src/v1/stage0/src/inert_carrier_project.rs index aeb03925ed2..22612ccc23a 100644 --- a/src/v1/stage0/src/inert_carrier_project.rs +++ b/src/v1/stage0/src/inert_carrier_project.rs @@ -61,9 +61,17 @@ const INERT_CARRIER_ROSTER: &[&str] = &[ "CargoPackage", // dsl/extdeps/rust/cargo.dag — Cargo manifest package row; unwired. "FilePermissions", // dsl/extdeps/access/posix.dag — POSIX mode permission carrier; no fs consumer. "FloorWitnessRow", // src/v2/workflow/affected_set_floor_runner.dag — runner row; self-only. + "FreeOutput", // dsl/extdeps/os/free.dag — host metrics shape; shadow lane, no workflow consumer yet. "GitCliReportedVersion", // dsl/extdeps/git/versioning.dag — git --version parse target; unwired. + "Kibibyte", // dsl/extdeps/os/proc_meminfo.dag — Measure alias; shadow lane, no workflow consumer yet. + "MemoryMetric", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo key-value row; shadow lane, no workflow consumer yet. + "MemoryStats", // dsl/extdeps/os/free.dag — host free output memory block; shadow lane, no workflow consumer yet. + "ProcMeminfo", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo parsed shape; shadow lane, no workflow consumer yet. "ReactHookSite", // src/v2/extdeps/frameworks/react.dag — React hook-site model; unwired. "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. + "SwapStats", // dsl/extdeps/os/free.dag — host free output swap block; shadow lane, no workflow consumer yet. + "SystemdUnitActiveState", // dsl/extdeps/os/systemd.dag — systemctl is-active coproduct; shadow lane, no workflow consumer yet. + "SystemdUnitStatus", // dsl/extdeps/os/systemd.dag — systemd unit status shape; shadow lane, no workflow consumer yet. ]; /// Extract top-level `type NAME` carrier declarations with their full declaration BLOCK text. From 794a510c01ea8ecabf41b1677a4629c31011912c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 16:14:33 +0000 Subject: [PATCH 07/21] Fix fmt: normalize roster comment alignment Cargo fmt --all normalized spacing on SecretValue roster entry. Co-Authored-By: Claude Haiku 4.5 --- src/v1/stage0/src/inert_carrier_project.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v1/stage0/src/inert_carrier_project.rs b/src/v1/stage0/src/inert_carrier_project.rs index 22612ccc23a..5525a189853 100644 --- a/src/v1/stage0/src/inert_carrier_project.rs +++ b/src/v1/stage0/src/inert_carrier_project.rs @@ -68,7 +68,7 @@ const INERT_CARRIER_ROSTER: &[&str] = &[ "MemoryStats", // dsl/extdeps/os/free.dag — host free output memory block; shadow lane, no workflow consumer yet. "ProcMeminfo", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo parsed shape; shadow lane, no workflow consumer yet. "ReactHookSite", // src/v2/extdeps/frameworks/react.dag — React hook-site model; unwired. - "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. + "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. "SwapStats", // dsl/extdeps/os/free.dag — host free output swap block; shadow lane, no workflow consumer yet. "SystemdUnitActiveState", // dsl/extdeps/os/systemd.dag — systemctl is-active coproduct; shadow lane, no workflow consumer yet. "SystemdUnitStatus", // dsl/extdeps/os/systemd.dag — systemd unit status shape; shadow lane, no workflow consumer yet. From cc834c08f0f142bd46343a826a97682ab881a523 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 16:26:31 +0000 Subject: [PATCH 08/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/extdeps/os/proc_meminfo.dag | 5 +---- dsl/std/measure.dag | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dsl/extdeps/os/proc_meminfo.dag b/dsl/extdeps/os/proc_meminfo.dag index f15e3513374..2fcf280588e 100644 --- a/dsl/extdeps/os/proc_meminfo.dag +++ b/dsl/extdeps/os/proc_meminfo.dag @@ -2,8 +2,7 @@ module extdeps.os.proc_meminfo import std.types { NonEmptyStr } import std.list { List } -import std.measure { Measure, Memory, Kibi } -import std.nat { Nat } +import std.measure { Kibibyte } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } @@ -14,8 +13,6 @@ data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { } } -type Kibibyte = Measure - type MemoryMetric { key: NonEmptyStr value: Kibibyte diff --git a/dsl/std/measure.dag b/dsl/std/measure.dag index 6467fce181a..3041185c286 100644 --- a/dsl/std/measure.dag +++ b/dsl/std/measure.dag @@ -138,6 +138,8 @@ fn time_measure(count: Nat) -> Measure { type ByteSize = Measure +type Kibibyte = Measure + type Gibibyte = Measure fn gibibyte(count: Nat) -> Gibibyte { From 36745c9ab8f18e198c838cffd10073554e6acf3d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 16:27:25 +0000 Subject: [PATCH 09/21] Address PR feedback: consolidate Kibibyte alias, remove trivial assertions, mark systemd parallel-representation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Move Kibibyte alias from proc_meminfo.dag to std/measure.dag (canonical location per §3 single authority) 2. Update proc_meminfo.dag and witness test imports to consume Kibibyte from std.measure 3. Remove trivial >= 0 assertions on Nat-carried ByteSize values in free witness test (non-discriminating) 4. Add dissolve-on markers to systemd parse/label functions pending contract-driven derivation (§3 parallel-representation scaffold) Addresses: claude/claude-opus-4-7 REQUEST_CHANGES feedback on #5636 Co-Authored-By: Claude Haiku 4.5 --- dsl/extdeps/os/systemd.dag | 2 ++ dsl/test/claim/os_free_witness_test.dag | 2 -- dsl/test/claim/os_proc_meminfo_witness_test.dag | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag index c7c16bc5283..7194e8ccb49 100644 --- a/dsl/extdeps/os/systemd.dag +++ b/dsl/extdeps/os/systemd.dag @@ -25,6 +25,7 @@ data systemd_unit_active_state_wire_contract: CoproductWireContract = { encoding: StringVariant { naming: SnakeCase } } +// dissolve-on: when contract-driven derivation is available (§3 single authority), derive parse/label from wire contract instead of hand-rolling. fn parse_systemd_unit_active_state(raw: String) -> SystemdUnitActiveState? { if raw == "active" { Present { value: Active } } else { if raw == "inactive" { Present { value: Inactive } } @@ -35,6 +36,7 @@ fn parse_systemd_unit_active_state(raw: String) -> SystemdUnitActiveState? { else { none } } } } } } } +// dissolve-on: when contract-driven derivation is available (§3 single authority), derive parse/label from wire contract instead of hand-rolling. fn systemd_unit_active_state_wire_label(s: SystemdUnitActiveState) -> String { match s { Active => "active" diff --git a/dsl/test/claim/os_free_witness_test.dag b/dsl/test/claim/os_free_witness_test.dag index 73d75609227..66c144768fe 100644 --- a/dsl/test/claim/os_free_witness_test.dag +++ b/dsl/test/claim/os_free_witness_test.dag @@ -31,10 +31,8 @@ test fn free_output_witnesses() -> Bool { memory_stats.total > 0 && memory_stats.available <= memory_stats.total && memory_stats.free <= memory_stats.total - && swap_stats.total >= 0 && swap_stats.used <= swap_stats.total && swap_stats.free <= swap_stats.total && output.memory.total > 0 - && output.swap.total >= 0 && memory_stats.available >= memory_stats.free } diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag index 9a278a46cf3..863e396d05c 100644 --- a/dsl/test/claim/os_proc_meminfo_witness_test.dag +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -4,8 +4,8 @@ import extdeps.os.proc_meminfo { ProcMeminfo, MemoryMetric, meminfo_field_names, - Kibibyte, } +import std.measure { Kibibyte } import std.types { NonEmptyStr } test fn proc_meminfo_witnesses() -> Bool { From 2fdd3c6eb8d7fb4c4ed31b29e9c8210b32db4335 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 16:48:57 +0000 Subject: [PATCH 10/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/extdeps/os/systemd.dag | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag index 7194e8ccb49..4b0741011b7 100644 --- a/dsl/extdeps/os/systemd.dag +++ b/dsl/extdeps/os/systemd.dag @@ -25,7 +25,10 @@ data systemd_unit_active_state_wire_contract: CoproductWireContract = { encoding: StringVariant { naming: SnakeCase } } -// dissolve-on: when contract-driven derivation is available (§3 single authority), derive parse/label from wire contract instead of hand-rolling. +data systemd_parse_label_derivation_debt: List = [ + "dissolve-on: when contract-driven derivation is available (§3 single authority), derive parse/label from wire contract instead of hand-rolling", +] + fn parse_systemd_unit_active_state(raw: String) -> SystemdUnitActiveState? { if raw == "active" { Present { value: Active } } else { if raw == "inactive" { Present { value: Inactive } } @@ -36,7 +39,6 @@ fn parse_systemd_unit_active_state(raw: String) -> SystemdUnitActiveState? { else { none } } } } } } } -// dissolve-on: when contract-driven derivation is available (§3 single authority), derive parse/label from wire contract instead of hand-rolling. fn systemd_unit_active_state_wire_label(s: SystemdUnitActiveState) -> String { match s { Active => "active" From 142c628c89208fef0a12a0539375ca4190510a0c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:00:22 +0000 Subject: [PATCH 11/21] FIX: Add missing List import to systemd.dag systemd_parse_label_derivation_debt data declaration uses List but the file lacked the corresponding std.list import. Adding it resolves the compilation error. Co-Authored-By: Claude Haiku 4.5 --- dsl/extdeps/os/systemd.dag | 1 + 1 file changed, 1 insertion(+) diff --git a/dsl/extdeps/os/systemd.dag b/dsl/extdeps/os/systemd.dag index 4b0741011b7..40de5d849bb 100644 --- a/dsl/extdeps/os/systemd.dag +++ b/dsl/extdeps/os/systemd.dag @@ -1,6 +1,7 @@ module extdeps.os.systemd import std.types { NonEmptyStr } +import std.list { List } import std.serialization { CoproductWireContract, StringVariant, SnakeCase } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } From 8c06981490b39c2f5f7dc9ce770701f3369e01e7 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:12:27 +0000 Subject: [PATCH 12/21] FIX: Remove stale inert carrier roster entries Remove 5 entries that now have external consumers: - Kibibyte (imported by witness tests) - MemoryMetric (imported by witness tests) - MemoryStats (imported by witness tests) - SwapStats (imported by witness tests) - SystemdUnitActiveState (imported by witness tests) Keep FreeOutput, ProcMeminfo, SystemdUnitStatus which still meet inert criteria. Co-Authored-By: Claude Haiku 4.5 --- src/v1/stage0/src/inert_carrier_project.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/v1/stage0/src/inert_carrier_project.rs b/src/v1/stage0/src/inert_carrier_project.rs index 5525a189853..85240844d4c 100644 --- a/src/v1/stage0/src/inert_carrier_project.rs +++ b/src/v1/stage0/src/inert_carrier_project.rs @@ -63,14 +63,9 @@ const INERT_CARRIER_ROSTER: &[&str] = &[ "FloorWitnessRow", // src/v2/workflow/affected_set_floor_runner.dag — runner row; self-only. "FreeOutput", // dsl/extdeps/os/free.dag — host metrics shape; shadow lane, no workflow consumer yet. "GitCliReportedVersion", // dsl/extdeps/git/versioning.dag — git --version parse target; unwired. - "Kibibyte", // dsl/extdeps/os/proc_meminfo.dag — Measure alias; shadow lane, no workflow consumer yet. - "MemoryMetric", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo key-value row; shadow lane, no workflow consumer yet. - "MemoryStats", // dsl/extdeps/os/free.dag — host free output memory block; shadow lane, no workflow consumer yet. "ProcMeminfo", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo parsed shape; shadow lane, no workflow consumer yet. "ReactHookSite", // src/v2/extdeps/frameworks/react.dag — React hook-site model; unwired. "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. - "SwapStats", // dsl/extdeps/os/free.dag — host free output swap block; shadow lane, no workflow consumer yet. - "SystemdUnitActiveState", // dsl/extdeps/os/systemd.dag — systemctl is-active coproduct; shadow lane, no workflow consumer yet. "SystemdUnitStatus", // dsl/extdeps/os/systemd.dag — systemd unit status shape; shadow lane, no workflow consumer yet. ]; From 979a94b2ba2128329cf47d2a4f03f87ba689b7cc Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:32:07 +0000 Subject: [PATCH 13/21] Revert "FIX: Remove stale inert carrier roster entries" This reverts commit 8c06981490b39c2f5f7dc9ce770701f3369e01e7. --- src/v1/stage0/src/inert_carrier_project.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/v1/stage0/src/inert_carrier_project.rs b/src/v1/stage0/src/inert_carrier_project.rs index 85240844d4c..5525a189853 100644 --- a/src/v1/stage0/src/inert_carrier_project.rs +++ b/src/v1/stage0/src/inert_carrier_project.rs @@ -63,9 +63,14 @@ const INERT_CARRIER_ROSTER: &[&str] = &[ "FloorWitnessRow", // src/v2/workflow/affected_set_floor_runner.dag — runner row; self-only. "FreeOutput", // dsl/extdeps/os/free.dag — host metrics shape; shadow lane, no workflow consumer yet. "GitCliReportedVersion", // dsl/extdeps/git/versioning.dag — git --version parse target; unwired. + "Kibibyte", // dsl/extdeps/os/proc_meminfo.dag — Measure alias; shadow lane, no workflow consumer yet. + "MemoryMetric", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo key-value row; shadow lane, no workflow consumer yet. + "MemoryStats", // dsl/extdeps/os/free.dag — host free output memory block; shadow lane, no workflow consumer yet. "ProcMeminfo", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo parsed shape; shadow lane, no workflow consumer yet. "ReactHookSite", // src/v2/extdeps/frameworks/react.dag — React hook-site model; unwired. "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. + "SwapStats", // dsl/extdeps/os/free.dag — host free output swap block; shadow lane, no workflow consumer yet. + "SystemdUnitActiveState", // dsl/extdeps/os/systemd.dag — systemctl is-active coproduct; shadow lane, no workflow consumer yet. "SystemdUnitStatus", // dsl/extdeps/os/systemd.dag — systemd unit status shape; shadow lane, no workflow consumer yet. ]; From 2234d518b507ac0ce9cf3b96e53d8ad5f2adf30f Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:42:21 +0000 Subject: [PATCH 14/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/test/claim/os_systemd_witness_test.dag | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dsl/test/claim/os_systemd_witness_test.dag b/dsl/test/claim/os_systemd_witness_test.dag index aec50885f4a..22c7911e1c4 100644 --- a/dsl/test/claim/os_systemd_witness_test.dag +++ b/dsl/test/claim/os_systemd_witness_test.dag @@ -13,15 +13,15 @@ import std.types { NonEmptyStr } test fn witness_active_wire_decodes_to_active() -> Bool { match parse_systemd_unit_active_state(raw: "active") { - Present { value: Active } => True - _ => False + Present { value: Active } => true + _ => false } } test fn witness_wrong_case_does_not_decode() -> Bool { match parse_systemd_unit_active_state(raw: "ACTIVE") { - none => True - _ => False + none => true + _ => false } } From 3b909c9d9d50d1ed8999747cda82034efd40526d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:43:05 +0000 Subject: [PATCH 15/21] FIX: Correct witness test syntax for .dag language Three test files had unsupported syntax: 1. os_systemd_witness_test.dag: Bool literals must be lowercase (true/false, not True/False). Changed lines 16, 17, 23, 24 to use correct .dag syntax. 2. os_proc_meminfo_witness_test.dag: Cannot cast Int to Kibibyte with 'as' operator. Changed all Kibibyte casts to record literal syntax: Kibibyte { count: N }. 3. os_free_witness_test.dag: Cannot cast Int to ByteSize with 'as' operator. Changed all ByteSize casts to byte_size(count: N) constructor calls. Added byte_size import to std.measure imports. Co-Authored-By: Claude Haiku 4.5 --- dsl/test/claim/os_free_witness_test.dag | 34 +++++++++---------- .../claim/os_proc_meminfo_witness_test.dag | 24 ++++++------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/dsl/test/claim/os_free_witness_test.dag b/dsl/test/claim/os_free_witness_test.dag index 66c144768fe..4eade30f999 100644 --- a/dsl/test/claim/os_free_witness_test.dag +++ b/dsl/test/claim/os_free_witness_test.dag @@ -5,22 +5,22 @@ import extdeps.os.free { MemoryStats, SwapStats, } -import std.measure { ByteSize } +import std.measure { ByteSize, byte_size, byte_size_count } test fn free_output_witnesses() -> Bool { let memory_stats = MemoryStats { - total: 8192000000 as ByteSize, - used: 1024000000 as ByteSize, - free: 2048000000 as ByteSize, - shared: 0 as ByteSize, - buff_cache: 5120000000 as ByteSize, - available: 3072000000 as ByteSize, + total: byte_size(count: 8192000000), + used: byte_size(count: 1024000000), + free: byte_size(count: 2048000000), + shared: byte_size(count: 0), + buff_cache: byte_size(count: 5120000000), + available: byte_size(count: 3072000000), } let swap_stats = SwapStats { - total: 2048000000 as ByteSize, - used: 0 as ByteSize, - free: 2048000000 as ByteSize, + total: byte_size(count: 2048000000), + used: byte_size(count: 0), + free: byte_size(count: 2048000000), } let output = FreeOutput { @@ -28,11 +28,11 @@ test fn free_output_witnesses() -> Bool { swap: swap_stats, } - memory_stats.total > 0 - && memory_stats.available <= memory_stats.total - && memory_stats.free <= memory_stats.total - && swap_stats.used <= swap_stats.total - && swap_stats.free <= swap_stats.total - && output.memory.total > 0 - && memory_stats.available >= memory_stats.free + byte_size_count(b: memory_stats.total) > 0 + && byte_size_count(b: memory_stats.available) <= byte_size_count(b: memory_stats.total) + && byte_size_count(b: memory_stats.free) <= byte_size_count(b: memory_stats.total) + && byte_size_count(b: swap_stats.used) <= byte_size_count(b: swap_stats.total) + && byte_size_count(b: swap_stats.free) <= byte_size_count(b: swap_stats.total) + && byte_size_count(b: output.memory.total) > 0 + && byte_size_count(b: memory_stats.available) >= byte_size_count(b: memory_stats.free) } diff --git a/dsl/test/claim/os_proc_meminfo_witness_test.dag b/dsl/test/claim/os_proc_meminfo_witness_test.dag index 863e396d05c..10aae5aff30 100644 --- a/dsl/test/claim/os_proc_meminfo_witness_test.dag +++ b/dsl/test/claim/os_proc_meminfo_witness_test.dag @@ -5,27 +5,27 @@ import extdeps.os.proc_meminfo { MemoryMetric, meminfo_field_names, } -import std.measure { Kibibyte } +import std.measure { Kibibyte, measure_count } import std.types { NonEmptyStr } test fn proc_meminfo_witnesses() -> Bool { let info = ProcMeminfo { - mem_total: 8012272 as Kibibyte, - mem_free: 4048136 as Kibibyte, - mem_available: 6144000 as Kibibyte, - buffers: 256000 as Kibibyte, - cached: 2048136 as Kibibyte, - swap_total: 2097152 as Kibibyte, - swap_free: 2097152 as Kibibyte, + mem_total: Kibibyte { count: 8012272 }, + mem_free: Kibibyte { count: 4048136 }, + mem_available: Kibibyte { count: 6144000 }, + buffers: Kibibyte { count: 256000 }, + cached: Kibibyte { count: 2048136 }, + swap_total: Kibibyte { count: 2097152 }, + swap_free: Kibibyte { count: 2097152 }, all_metrics: [], } let metric = MemoryMetric { key: "MemTotal" as NonEmptyStr, - value: 8012272 as Kibibyte, + value: Kibibyte { count: 8012272 }, } - info.mem_total > 0 - && info.mem_available <= info.mem_total - && metric.value > 0 + measure_count(m: info.mem_total) > 0 + && measure_count(m: info.mem_available) <= measure_count(m: info.mem_total) + && measure_count(m: metric.value) > 0 } From eee0ed9050c1eb2c1d5535b20b8b606a138b47e4 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 17:51:34 +0000 Subject: [PATCH 16/21] Trigger CI run From 8be2db99cb2935929cdb3d8eaf1094a4c8dd4ec4 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 18:11:14 +0000 Subject: [PATCH 17/21] Retrigger CI (previous run stuck in queue) From 4080d4f66b0b237748762c9032d4868c3e44693d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 18:29:19 +0000 Subject: [PATCH 18/21] FIX: Remove 5 stale inert carrier roster entries Removed entries that gained consumers when host metrics types (Kibibyte, MemoryMetric, MemoryStats, SwapStats, SystemdUnitActiveState) were integrated into extdeps modules: - Kibibyte: moved to std/measure.dag, now imported by proc_meminfo.dag - MemoryMetric, MemoryStats, SwapStats: now consumed by proc_meminfo.dag / free.dag - SystemdUnitActiveState: now consumed by systemd.dag Remaining roster: 11 entries (AccessPolicy, CargoDependency, CargoPackage, FilePermissions, FloorWitnessRow, FreeOutput, GitCliReportedVersion, ProcMeminfo, ReactHookSite, SecretValue, SystemdUnitStatus). --- src/v1/stage0/src/inert_carrier_project.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/v1/stage0/src/inert_carrier_project.rs b/src/v1/stage0/src/inert_carrier_project.rs index 5525a189853..85240844d4c 100644 --- a/src/v1/stage0/src/inert_carrier_project.rs +++ b/src/v1/stage0/src/inert_carrier_project.rs @@ -63,14 +63,9 @@ const INERT_CARRIER_ROSTER: &[&str] = &[ "FloorWitnessRow", // src/v2/workflow/affected_set_floor_runner.dag — runner row; self-only. "FreeOutput", // dsl/extdeps/os/free.dag — host metrics shape; shadow lane, no workflow consumer yet. "GitCliReportedVersion", // dsl/extdeps/git/versioning.dag — git --version parse target; unwired. - "Kibibyte", // dsl/extdeps/os/proc_meminfo.dag — Measure alias; shadow lane, no workflow consumer yet. - "MemoryMetric", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo key-value row; shadow lane, no workflow consumer yet. - "MemoryStats", // dsl/extdeps/os/free.dag — host free output memory block; shadow lane, no workflow consumer yet. "ProcMeminfo", // dsl/extdeps/os/proc_meminfo.dag — /proc/meminfo parsed shape; shadow lane, no workflow consumer yet. "ReactHookSite", // src/v2/extdeps/frameworks/react.dag — React hook-site model; unwired. "SecretValue", // dsl/std/types.dag — secret-string carrier; no redaction consumer wired. - "SwapStats", // dsl/extdeps/os/free.dag — host free output swap block; shadow lane, no workflow consumer yet. - "SystemdUnitActiveState", // dsl/extdeps/os/systemd.dag — systemctl is-active coproduct; shadow lane, no workflow consumer yet. "SystemdUnitStatus", // dsl/extdeps/os/systemd.dag — systemd unit status shape; shadow lane, no workflow consumer yet. ]; From 6bc985a453e91ddc7bf537821c3c55df56662a4c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 19:07:25 +0000 Subject: [PATCH 19/21] WIP: Slice C: Host metrics extdeps shapes --- dsl/extdeps/llm/anthropic.dag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsl/extdeps/llm/anthropic.dag b/dsl/extdeps/llm/anthropic.dag index 3be36713e11..9f59b90adfe 100644 --- a/dsl/extdeps/llm/anthropic.dag +++ b/dsl/extdeps/llm/anthropic.dag @@ -3,7 +3,7 @@ module extdeps.llm.anthropic import extdeps.llm.llm { llm_snake_wire_contract } import std.serialization { CoproductWireContract, VariantEncoding } import std.types { NonEmptyStr } -import std.disposition { Disposition, Scaffold, Terminal, DeclLocator, WholeDeclaration, NamedField, SingleAuthority } +import std.disposition { Disposition, DeclLocator } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.coverage { CoverageClosureEntry, CoverageClosureFact } From fc64f906298baea345631b2eb8e0bae4c73de5b5 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 19:08:46 +0000 Subject: [PATCH 20/21] Revert "WIP: Slice C: Host metrics extdeps shapes" This reverts commit 6bc985a453e91ddc7bf537821c3c55df56662a4c. --- dsl/extdeps/llm/anthropic.dag | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dsl/extdeps/llm/anthropic.dag b/dsl/extdeps/llm/anthropic.dag index 9f59b90adfe..3be36713e11 100644 --- a/dsl/extdeps/llm/anthropic.dag +++ b/dsl/extdeps/llm/anthropic.dag @@ -3,7 +3,7 @@ module extdeps.llm.anthropic import extdeps.llm.llm { llm_snake_wire_contract } import std.serialization { CoproductWireContract, VariantEncoding } import std.types { NonEmptyStr } -import std.disposition { Disposition, DeclLocator } +import std.disposition { Disposition, Scaffold, Terminal, DeclLocator, WholeDeclaration, NamedField, SingleAuthority } import extdeps.external_authority { ExternalAuthority } import extdeps.uri { Uri, Https } import extdeps.coverage { CoverageClosureEntry, CoverageClosureFact } From 8c0c2c5392c74dbabaa2e39cf039680f683129c7 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 23 Jun 2026 20:31:54 +0000 Subject: [PATCH 21/21] Retrigger CI