From 6ecbc8ce377879ff45304f443a8eff8a5a83cd7c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 2 Jul 2026 07:06:27 +0000 Subject: [PATCH 1/4] =?UTF-8?q?WIP:=202-emit-partition=20=E2=80=94=20shell?= =?UTF-8?q?/json/yaml=20as=20grammar=20rows,=20zero=20language=20knowle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extdeps/languages/bash_program_fold.dag | 96 +++++++++++++++++++ src/v2/test/claim/bash_program_fold_test.dag | 47 +++++++++ 2 files changed, 143 insertions(+) create mode 100644 src/v2/extdeps/languages/bash_program_fold.dag create mode 100644 src/v2/test/claim/bash_program_fold_test.dag diff --git a/src/v2/extdeps/languages/bash_program_fold.dag b/src/v2/extdeps/languages/bash_program_fold.dag new file mode 100644 index 00000000000..14b46758944 --- /dev/null +++ b/src/v2/extdeps/languages/bash_program_fold.dag @@ -0,0 +1,96 @@ +module v2.extdeps.languages.bash_program_fold + +import extdeps.languages.bash.program { ShellProgram, ShellStmt } +import v2.compiler.emit { emit } +import v2.compiler.infer { InferredFacts, InferredTree } +import v2.extdeps.languages.bash_command_fold { + bash_fold_stmt_emitted_witness, + bash_fold_target_model_for_stmt_witness +} +import v2.std.algebra { list_head, list_tail, HeadFound, HeadAbsent, TailFound, TailAbsent } +import v2.std.collection { List, Map } +import v2.std.diagnostic { + Accepted, + Diagnostic, + ExternalContractUnknown, + None, + Outcome, + Rejected, + Some, + Unavailable, + bind_outcome, + node_locus +} +import v2.std.node { Node } +import v2.std.text { String } +import v2.std.witness { Holds, Violates, Witness } + +fn bash_program_fold_facts_lookup(key: Node) -> Witness { + Violates { + diagnostic: Diagnostic { + reason: ^bash_program_fold_facts_unexpected_consultation, + at: node_locus(node: key), + correction: Unavailable { reason: ExternalContractUnknown } + } + } +} + +fn bash_program_fold_serialize_stmt(stmt: ShellStmt) -> Outcome { + match bash_fold_stmt_emitted_witness(stmt: stmt) { + Holds { value: emitted } => + match bash_fold_target_model_for_stmt_witness(stmt: stmt) { + Holds { value: target } => + match emit( + tree: InferredTree { + root: emitted, + facts: Map { lookup: bash_program_fold_facts_lookup } + }, + target: target + ) { + Accepted { value: source, diagnostics: d } => + match d { + None => Accepted { value: source.carried, diagnostics: None } + Some { diagnostics: r } => Rejected { diagnostics: r } + } + Rejected { diagnostics: r } => Rejected { diagnostics: r } + } + Violates { diagnostic: dd } => Rejected { diagnostics: Some { diagnostics: [dd] } } + } + Violates { diagnostic: dd } => Rejected { diagnostics: Some { diagnostics: [dd] } } + } +} + +fn bash_program_serialize_body(stmts: List) -> Outcome { + match list_head(xs: stmts) { + HeadAbsent => Accepted { value: "", diagnostics: None } + HeadFound { value: s } => + bind_outcome( + o: bash_program_fold_serialize_stmt(stmt: s), + f: fn(part) { + match list_tail(xs: stmts) { + TailFound { tail: t } => + bind_outcome( + o: bash_program_serialize_body(stmts: t), + f: fn(rest) { + Accepted { value: concat(concat(part, "\n"), rest), diagnostics: None } + } + ) + TailAbsent => Accepted { value: concat(part, "\n"), diagnostics: None } + } + } + ) + } +} + +fn bash_program_serialize(p: ShellProgram) -> Outcome { + bind_outcome( + o: bash_program_serialize_body(stmts: p.statements), + f: fn(body) { + if p.set_e { + Accepted { value: concat("set -e\n", body), diagnostics: None } + } else { + Accepted { value: body, diagnostics: None } + } + } + ) +} diff --git a/src/v2/test/claim/bash_program_fold_test.dag b/src/v2/test/claim/bash_program_fold_test.dag new file mode 100644 index 00000000000..aefa14cbeea --- /dev/null +++ b/src/v2/test/claim/bash_program_fold_test.dag @@ -0,0 +1,47 @@ +module v2.test.claim.bash_program_fold + +import extdeps.languages.bash.program { + ShellProgram, + assign, + command, + lit, + serialize_bash +} +import v2.extdeps.languages.bash_program_fold { bash_program_serialize } +import v2.std.diagnostic { Accepted, Rejected } + +fn bash_program_fold_sample() -> ShellProgram { + ShellProgram { + set_e: true, + statements: [ + command(words: [lit(text: "echo"), lit(text: "hi")]), + assign(name: "X", value: lit(text: "1")) + ] + } +} + +fn bash_program_fold_sample_no_set_e() -> ShellProgram { + ShellProgram { + set_e: false, + statements: [ + command(words: [lit(text: "echo"), lit(text: "hi")]), + assign(name: "X", value: lit(text: "1")) + ] + } +} + +test fn bash_program_serialize_matches_oracle_holds() -> Bool { + match bash_program_serialize(p: bash_program_fold_sample()) { + Accepted { value: folded, diagnostics: _ } => + folded == serialize_bash(p: bash_program_fold_sample()) + Rejected { diagnostics: _ } => false + } +} + +test fn bash_program_serialize_set_e_has_teeth_holds() -> Bool { + match bash_program_serialize(p: bash_program_fold_sample()) { + Accepted { value: folded, diagnostics: _ } => + folded != serialize_bash(p: bash_program_fold_sample_no_set_e()) + Rejected { diagnostics: _ } => false + } +} From ad734fa715078d85a9ba631f20d881fc3ca68ed5 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 2 Jul 2026 07:06:34 +0000 Subject: [PATCH 2/4] wip(b1): bash whole-program serialize driver + byte-oracle test --- src/v2/workflow/zz_bprog_verify_plan.dag | 35 ++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/v2/workflow/zz_bprog_verify_plan.dag diff --git a/src/v2/workflow/zz_bprog_verify_plan.dag b/src/v2/workflow/zz_bprog_verify_plan.dag new file mode 100644 index 00000000000..9b74aea0582 --- /dev/null +++ b/src/v2/workflow/zz_bprog_verify_plan.dag @@ -0,0 +1,35 @@ +module v2.workflow.zz_bprog_verify_plan + +import gunbc.ci_layer_roots { witness_layer_roots } +import std.realization_schedule { + Runnable, + RunnableDiscoveryBatch, + ScheduleWitnessEntry, + runnable_resource_profile_negligible +} +import std.measure { HardwareThreadCount, hardware_thread_count } +import std.types { List } + +data zz_bprog_entry: String = "src/v2/test/claim/bash_program_fold_test.dag" + +fn zz_bprog_verify_batches() -> List> { + [[ + RunnableDiscoveryBatch { + source_roots: witness_layer_roots, + scan_dirs: [], + explicit_entries: [ + ScheduleWitnessEntry { entry: zz_bprog_entry, function: "bash_program_serialize_matches_oracle_holds" }, + ScheduleWitnessEntry { entry: zz_bprog_entry, function: "bash_program_serialize_set_e_has_teeth_holds" } + ], + skip_unaffected_node_frontier: false, + exclude_substrings: [], + discovery_scope_dirs: [], + spawn_width_cap: 1, + profile: runnable_resource_profile_negligible() + } + ]] +} + +fn zz_bprog_verify_plan_spawn_width() -> HardwareThreadCount { + hardware_thread_count(count: 1) +} From 52058900e40baf243d25d76cc07373b07ee13f8d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 2 Jul 2026 07:10:24 +0000 Subject: [PATCH 3/4] remove throwaway verify plan --- src/v2/workflow/zz_bprog_verify_plan.dag | 35 ------------------------ 1 file changed, 35 deletions(-) delete mode 100644 src/v2/workflow/zz_bprog_verify_plan.dag diff --git a/src/v2/workflow/zz_bprog_verify_plan.dag b/src/v2/workflow/zz_bprog_verify_plan.dag deleted file mode 100644 index 9b74aea0582..00000000000 --- a/src/v2/workflow/zz_bprog_verify_plan.dag +++ /dev/null @@ -1,35 +0,0 @@ -module v2.workflow.zz_bprog_verify_plan - -import gunbc.ci_layer_roots { witness_layer_roots } -import std.realization_schedule { - Runnable, - RunnableDiscoveryBatch, - ScheduleWitnessEntry, - runnable_resource_profile_negligible -} -import std.measure { HardwareThreadCount, hardware_thread_count } -import std.types { List } - -data zz_bprog_entry: String = "src/v2/test/claim/bash_program_fold_test.dag" - -fn zz_bprog_verify_batches() -> List> { - [[ - RunnableDiscoveryBatch { - source_roots: witness_layer_roots, - scan_dirs: [], - explicit_entries: [ - ScheduleWitnessEntry { entry: zz_bprog_entry, function: "bash_program_serialize_matches_oracle_holds" }, - ScheduleWitnessEntry { entry: zz_bprog_entry, function: "bash_program_serialize_set_e_has_teeth_holds" } - ], - skip_unaffected_node_frontier: false, - exclude_substrings: [], - discovery_scope_dirs: [], - spawn_width_cap: 1, - profile: runnable_resource_profile_negligible() - } - ]] -} - -fn zz_bprog_verify_plan_spawn_width() -> HardwareThreadCount { - hardware_thread_count(count: 1) -} From 987da7b09fd31d976f85ab945021acaf80efbb02 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 2 Jul 2026 07:18:35 +0000 Subject: [PATCH 4/4] =?UTF-8?q?WIP:=202-emit-partition=20=E2=80=94=20shell?= =?UTF-8?q?/json/yaml=20as=20grammar=20rows,=20zero=20language=20knowle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v2/test/claim/bash_program_fold_test.dag | 2 +- .../bash_program_fold.dag => workflow/bash_program_emit.dag} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/v2/{extdeps/languages/bash_program_fold.dag => workflow/bash_program_emit.dag} (98%) diff --git a/src/v2/test/claim/bash_program_fold_test.dag b/src/v2/test/claim/bash_program_fold_test.dag index aefa14cbeea..fa1abd99458 100644 --- a/src/v2/test/claim/bash_program_fold_test.dag +++ b/src/v2/test/claim/bash_program_fold_test.dag @@ -7,7 +7,7 @@ import extdeps.languages.bash.program { lit, serialize_bash } -import v2.extdeps.languages.bash_program_fold { bash_program_serialize } +import v2.workflow.bash_program_emit { bash_program_serialize } import v2.std.diagnostic { Accepted, Rejected } fn bash_program_fold_sample() -> ShellProgram { diff --git a/src/v2/extdeps/languages/bash_program_fold.dag b/src/v2/workflow/bash_program_emit.dag similarity index 98% rename from src/v2/extdeps/languages/bash_program_fold.dag rename to src/v2/workflow/bash_program_emit.dag index 14b46758944..69fa1ab3e94 100644 --- a/src/v2/extdeps/languages/bash_program_fold.dag +++ b/src/v2/workflow/bash_program_emit.dag @@ -1,4 +1,4 @@ -module v2.extdeps.languages.bash_program_fold +module v2.workflow.bash_program_emit import extdeps.languages.bash.program { ShellProgram, ShellStmt } import v2.compiler.emit { emit }