Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
665637d
D0 retention-truth close-out: unpin compile-clean memo, register all-…
claude Jul 24, 2026
14682ee
D3 mechanism: two-tier CI placement axis (PrTier | Gauntlet) with fai…
claude Jul 24, 2026
488d982
D5 DiffBaseline: dissolve the origin/main literal into a typed single…
claude Jul 24, 2026
bf94e5f
Progress/observation P0: the event model, five laws, one glyph authority
Jul 24, 2026
8cbf49c
Review 42157: collapse the duplicate display tables into one authority
Jul 24, 2026
d26d5e0
Review 42166: ground PSI avg10 on std.measure.BasisPoint
Jul 24, 2026
d1987c6
Piece 3: derived per-batch floor clamp — delete the static wall-budge…
claude Jul 24, 2026
f5c29ad
Merge origin/main into #7162: adopt #7146's landed DiffBaseline, drop…
claude Jul 24, 2026
0a23ed6
Finish #7146 adoption: regen ci.yml from merged authority, drop orpha…
claude Jul 24, 2026
f682d33
P1: the CI-log renderer, with the captured crawl window as its accept…
Jul 24, 2026
122aaec
Merge remote-tracking branch 'origin/main' into claude/ci-executor-ev…
claude Jul 24, 2026
12e1cff
Merge remote-tracking branch 'origin/main' into session/sleek-ibex-634
Jul 24, 2026
6a4c9d1
P2: the interactive TTY renderer, a sibling projection of the same ca…
Jul 24, 2026
f42e0ba
P3: the emit-site census wall
Jul 24, 2026
8255133
Piece 3: name the clamp coefficient's measurement basis (operator add…
claude Jul 24, 2026
faf64ee
Probe (①/②): emit a per-gate warm-cost TSV from the floor's existing …
claude Jul 24, 2026
9eb01da
Flagship replay as a green witness — the before/after made executable
Jul 24, 2026
47e581b
Merge remote-tracking branch 'origin/session/sleek-ibex-634' into cla…
claude Jul 24, 2026
70e6447
Wiring flip (1/n): install the output policy BEFORE the naming walk —…
claude Jul 24, 2026
ba28f21
Wiring flip (2/n): render floor phase marks through the observation a…
claude Jul 24, 2026
d05c078
Witness fix: roster the observation stack's one wildcard site (non_fo…
claude Jul 24, 2026
d658526
Wiring flip (4a/n): the floor-memory heartbeat's seed oracle + golden…
claude Jul 24, 2026
b35a4b3
File finding: shell.Env.Get realized as a printenv subprocess (transp…
claude Jul 24, 2026
60a4496
Wiring flip (5/n): shell-echo §5 split — routine Ambient, failure Ano…
claude Jul 24, 2026
d595163
Revert "Wiring flip (5/n): shell-echo §5 split" — approach was wrong,…
claude Jul 25, 2026
7e77b92
Wiring flip (4b/n): floor-memory heartbeat via render_heartbeat_line_…
cursoragent Jul 25, 2026
ef702c5
Merge origin/main into #7162: keep D0 Ephemeral share + main's compil…
cursoragent Jul 25, 2026
9cb5077
cargo fmt: claim_executor + cli_run after floor-memory 4b / main merge
cursoragent Jul 25, 2026
d11f584
Wiring flip: [gantt] → Begin/Concluded PhaseSegment observation proje…
cursoragent Jul 25, 2026
d4b1bed
Wiring flip: [governor] → ci_hold_cause_text / StatusBlocked observat…
cursoragent Jul 25, 2026
5c47842
cargo fmt: claim_executor after governor hold oracle RED
cursoragent Jul 25, 2026
650f33d
Fix runtime_rust.dag: escape Rust format braces for daglang parse
cursoragent Jul 25, 2026
3d2d342
Wiring flip: [typecheck-attribution] → ModuleSegment+PhaseSegment obs…
cursoragent Jul 25, 2026
fc75cc3
Wiring flip: [measurement] + shell-echo → ObservationEvents (one pass)
cursoragent Jul 25, 2026
60a3d3c
Fix GeneratedArtifact name collision in observation_model witnesses
cursoragent Jul 25, 2026
b613b3f
Observation aesthetics: named-intent shell, glyph discipline, census …
cursoragent Jul 25, 2026
d52e6b5
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
4cb92a3
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
3082752
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
86318c1
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
7c2b01c
Merge origin/main into CI observation lane
cursoragent Jul 25, 2026
7783c48
Merge #7205: memoize per-module exported type-name sets for resolve r…
cursoragent Jul 25, 2026
7f208f0
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
2bf2297
Silence Ambient shell on gunbc run; roster #7205 resolve/assembly spl…
cursoragent Jul 25, 2026
0b8bb67
WIP: Floor #6848: memoize the per-entry bare-reference fixpoint so po…
briansrls Jul 25, 2026
0b28aca
Re-merge #7205 tip: further bare-reference / rewire resolve cost fixes
cursoragent Jul 25, 2026
4a4fcc0
Re-merge #7205 tip + native shell.Env.Get (kill printenv Anomaly clut…
cursoragent Jul 25, 2026
82184ae
Merge origin/main: resolve #7205 conflicts
cursoragent Jul 25, 2026
129b7fe
infer_semantics: unstale the slice control after #7196 admitted list …
claude Jul 25, 2026
c097928
gunbc run: add --arg name=value, the missing parameter channel at the…
claude Jul 25, 2026
7311a09
Merge remote-tracking branch 'origin/main' into claude/pr-7162-debug-…
claude Jul 25, 2026
619bba5
Merge origin/main into the observation lane
claude Jul 25, 2026
9f87967
Merge origin/main (#7222 slice-control fix, already present on this l…
claude Jul 25, 2026
779e9dc
CI floor: give re-homed witnesses a real scheduled lane (FalsifierCad…
claude Jul 25, 2026
e7b661f
Merge origin/main into the observation lane (picks up #7217 resolve m…
claude Jul 25, 2026
e80ddae
CI floor: operator-signed interim clamp raise, batch 4 420s -> 540s
claude Jul 25, 2026
0841b1b
Extend the falsifier batch-count pin for the FalsifierCadenceJob batch
claude Jul 25, 2026
47f6b5b
Decode \xNN in .dag string literals — no authored colour had ever ren…
claude Jul 25, 2026
9037507
Merge origin/main — thread both new falsifier batches, extend the cou…
claude Jul 25, 2026
ffc1eec
Layer 1: bind ExpectedOutcome from the call site, not the transport
claude Jul 25, 2026
30ca929
Delete the expectation probe — it was an enrollment orphan
claude Jul 25, 2026
ea74cb7
Counter-sign the batch-4 clamp raise, correcting its stated mechanism
claude Jul 25, 2026
e23bf3e
Declare the perturb compiles' expectation — first use of the layer-1 …
claude Jul 25, 2026
6dac194
Merge origin/main — re-point the cadence pin at the lane main moved i…
claude Jul 25, 2026
5e9793b
Merge origin/main again — third contributor to the falsifier batch chain
claude Jul 25, 2026
18e3234
Restore the dropped falsifier-failure call site; add the OutcomeIsDat…
claude Jul 25, 2026
9c4e491
Annotate both blocked clusters OutcomeIsData — 7 of 7 now silent
claude Jul 25, 2026
88819bf
Convert the typed_witness_invocation red controls — 15 of ~24 now silent
claude Jul 25, 2026
ab313b6
The wall: a passing run's default-verbosity log must carry zero anoma…
claude Jul 25, 2026
b2411f0
Annotate the install-media probes — 18 of ~24, and a census correction
claude Jul 25, 2026
c390986
Re-home the anomaly wall onto the wet lane — it is Wet by construction
claude Jul 25, 2026
caf0048
Annotate the grub idempotence probe — 19 of ~24, two left as judgment…
claude Jul 25, 2026
f8adc46
Merge origin/main — adopt the FrontierRow field rename, drop a redund…
claude Jul 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,4 +116,4 @@ hollow alias (minimality ≠ grounding) · state-space conflation (an `Option`/`

- `cargo test --workspace` · `cargo clippy --all-targets -- -D warnings` · `cargo fmt --all --check`
- one-time: `git config core.hooksPath .githooks` (pre-push runs `cargo fmt`)
- CI (`gunbc ci` generates `.github/workflows/ci.yml`; all `v1-compiler` seed bins, no shell gate): **one** composed floor pass — `claim_executor --source-root src/v2 --source-root dag --plan-entry src/v2/workflow/ci_floor_plan.dag --plan-function gunbc_ci_floor_batches`. The v2 scheduler decides the batches from the single-authority spec (`gunbc.ci_spec`); the only structural fact the plan adds is *compile-clean gates the rest* (batch-1 `dag_compile_clean_gate` → batch-2 everything else, a dependency edge). Witness enrollment: **discovery shrunk by the affected set** (operator acceptance 2026-07-09, firing the 2026-07-04 opt-in inversion's dissolve-on — see `gunbc.ci_spec` `ci_spec_discovery_flip_note`): the corpus batch scans `CiSpec.discovery_scan_dirs` (plus the source-root `*_test.dag` walk) with `SelectionApplied`, so a PR runs the tree-wide witness corpus (~1,721 rows at flip time) shrunk to the diff's affected set; selection is fail-closed (a provenance gap refuses, never widens; host-scaffold/live-tree rows never predict-skip) and the scheduled `affected-set-falsifier` (every 4 hours) runs the corpus cold with predictions recorded, so a missing selection edge surfaces as a counted divergence within one cadence window. `CiSpec.witness_entries` (`CommitWitnessClaim` rows on the `GithubActionsCiJob` surface, projected by `project_ci_floor_witness_entries`) remains the explicit-entry roster — execution-kind rows with their own resource profile, and any row that must run as declared. Empty entries AND empty discovery dirs = zero witness-corpus nodes (the regen spec's shape). Naming hygiene stays fail-closed (a `test fn` outside `*_test.dag` is still a violation — the executor runs the zero-enrollment naming walk when no discovery batch is scheduled), and tree-wide unselected discovery remains the **local** path (`claim_batch --roster-from-discovery --source-root dag --source-root src/v2 --scan-dir dag/test/claim --scan-dir src/v2/test/claim/manual`). Batch-2 also carries the effectful gates: the rust fmt gate (when a `.rs` changes; nextest was removed from CI 2026-07-11 — operator ruling recorded in `gunbc.commit_workflow` `rust_tests_removed_disposition`, the suite runs locally only; clippy removed from CI 2026-07-08 — crate-wide `#![allow(clippy::all)]` made it zero-signal over ~44m/run, still available as a local dev check), emit-host MVP smokes, source-root-ingest, and the `ci.yml` drift+parse gate (ci.yml == `gunbc ci` output). The compile-clean gate is `--target dag`, and its per-PR scope is the same import-closure authority (2026-07-16, channel 2 of the 2026-07-10 grain fork): an all-`.dag`/docs diff compiles only the affected shard-entry closures (`tools.dag_compile_clean_scope`, host fast path `entry_file_touched_via_import_closure`); any non-selectable touched path (`.rs`, workflow yml, manifests), any non-docs departed path, or any selection refusal keeps the whole-tree baseline, loudly; the falsifier cadence carries the deterministic whole-tree cold control (`GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL=1`, widen-only). The regen step (self-host fixed-point) is scoped the same way at its own closure (#6732 + this change's departed-path guard): `regen_floor_skip_witness` skips the pull_request step only when a non-empty merge-base diff is provably disjoint from the regen input set (`cli_run::regen_input_sources` — the SAME closure authority `regen_stage0` compiles — plus the src/v1/** prefix and Cargo/toolchain config); empty diffs, departed non-docs paths, and every failure arm run regen, and the skip is shell-gated to pull_request events so main pushes stay the unconditional cold control. Parse is grammar-owned: `ingest_yaml_source` (`dag/extdeps/languages/yaml/ingest.dag`), no shell/host parser.
- CI (`gunbc ci` generates `.github/workflows/ci.yml`; all `v1-compiler` seed bins, no shell gate): **one** composed floor pass — `claim_executor --source-root src/v2 --source-root dag --plan-entry src/v2/workflow/ci_floor_plan.dag --plan-function gunbc_ci_floor_batches`. The v2 scheduler decides the batches from the single-authority spec (`gunbc.ci_spec`); the only structural fact the plan adds is *compile-clean gates the rest* (batch-1 `dag_compile_clean_gate` → batch-2 everything else, a dependency edge). Witness enrollment: **discovery shrunk by the affected set** (operator acceptance 2026-07-09, firing the 2026-07-04 opt-in inversion's dissolve-on — see `gunbc.ci_spec` `ci_spec_discovery_flip_note`): the corpus batch scans `CiSpec.discovery_scan_dirs` (plus the source-root `*_test.dag` walk) with `SelectionApplied`, so a PR runs the tree-wide witness corpus (~1,721 rows at flip time) shrunk to the diff's affected set; selection is fail-closed (a provenance gap refuses, never widens; host-scaffold/live-tree rows never predict-skip) and the scheduled `affected-set-falsifier` (every 4 hours) runs the corpus cold with predictions recorded, so a missing selection edge surfaces as a counted divergence within one cadence window. `CiSpec.witness_entries` (`CommitWitnessClaim` rows on the `GithubActionsCiJob` surface, projected by `project_ci_floor_witness_entries`) remains the explicit-entry roster — execution-kind rows with their own resource profile, and any row that must run as declared. Empty entries AND empty discovery dirs = zero witness-corpus nodes (the regen spec's shape). Naming hygiene stays fail-closed (a `test fn` outside `*_test.dag` is still a violation — the executor runs the zero-enrollment naming walk when no discovery batch is scheduled), and tree-wide unselected discovery remains the **local** path (`claim_batch --roster-from-discovery --source-root dag --source-root src/v2 --scan-dir dag/test/claim --scan-dir src/v2/test/claim/manual`). Batch-2 also carries the effectful gates: the rust fmt gate (when a `.rs` changes; nextest was removed from CI 2026-07-11 — operator ruling recorded in `gunbc.commit_workflow` `commit_gate_rust_suite_removed_disposition`, the suite runs locally only; clippy removed from CI 2026-07-08 — crate-wide `#![allow(clippy::all)]` made it zero-signal over ~44m/run, still available as a local dev check), emit-host MVP smokes, source-root-ingest, and the `ci.yml` drift+parse gate (ci.yml == `gunbc ci` output). The compile-clean gate is `--target dag`, and its per-PR scope is the same import-closure authority (2026-07-16, channel 2 of the 2026-07-10 grain fork): an all-`.dag`/docs diff compiles only the affected shard-entry closures (`tools.dag_compile_clean_scope`, host fast path `entry_file_touched_via_import_closure`); any non-selectable touched path (`.rs`, workflow yml, manifests), any non-docs departed path, or any selection refusal keeps the whole-tree baseline, loudly; the falsifier cadence carries the deterministic whole-tree cold control (`GUNBC_CI_COMPILE_CLEAN_COLD_CONTROL=1`, widen-only). The regen step (self-host fixed-point) is scoped the same way at its own closure (#6732 + this change's departed-path guard): `regen_floor_skip_witness` skips the pull_request step only when a non-empty merge-base diff is provably disjoint from the regen input set (`cli_run::regen_input_sources` — the SAME closure authority `regen_stage0` compiles — plus the src/v1/** prefix and Cargo/toolchain config); empty diffs, departed non-docs paths, and every failure arm run regen, and the skip is shell-gated to pull_request events so main pushes stay the unconditional cold control. Parse is grammar-owned: `ingest_yaml_source` (`dag/extdeps/languages/yaml/ingest.dag`), no shell/host parser.
5 changes: 4 additions & 1 deletion dag/extdeps/provisioning/ubuntu_install_media_fetch.dag
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import std.disposition { Disposition, Terminal }
import std.types { NonEmptyStr, List, String, Bool, FilePath }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }
import gunbc.output_policy { OutcomeIsData }
import extdeps.shell
import extdeps.http.client
import extdeps.tools.sha256sum { sha256sum_verify_via_shell, Sha256Matches, Sha256Mismatch, Sha256VerifyInfraFailure }
Expand Down Expand Up @@ -51,8 +52,10 @@ type MirrorFoldAcc = MirrorFoldAcc { terminal: InstallMediaFetchReconcileOutcome

data mirror_fold_refusal_doc: String = "DESIGN §5 fix (cursor review, PR #6596): install_media_fetch_try_mirror previously returned `none` for BOTH an unreachable mirror (transport miss, keep trying) AND a Sha256Mismatch (a genuine digest failure), so a run where every mirror downloaded but none verified fell through the fold to 'all mirrors unreachable' - a state-space conflation between reachability and digest correctness. MirrorAttempt now names the three outcomes distinctly, and the fold tracks saw_mismatch so the final refusal reads 'digest verification failed' when that's what actually happened."

data observe_install_media_fetch_outcome_is_data_note: String = "The presence probe is OutcomeIsData: a non-zero `test -f` here means the media is ABSENT, which is one of this fn's four declared answers (InstallMediaFetchAbsent), not a fault. The type already draws the distinction the arm formalises — InstallMediaFetchVerifyInfraFailure is the separate 'the probe itself broke' arm — so subject-state and probe-breakage were never conflated here; only the effect layer's glyph conflated them. Admissible under the §5 guard: this fn returns InstallMediaFetchObservation, a typed observation whose arms ARE the adjudication, and the exit selects among them."

fn observe_install_media_fetch(path: NonEmptyStr, expected_hash: NonEmptyStr) -> InstallMediaFetchObservation {
let present = shell.Test.IsFile(path: path as FilePath)
let present = shell.Test.IsFile(path: path as FilePath, expect: OutcomeIsData)
if present.is_file == false {
InstallMediaFetchAbsent
} else {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module extdeps.provisioning.ubuntu_seeded_install_media_remaster

import gunbc.output_policy { OutcomeIsData }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }
import extdeps.shell
Expand Down Expand Up @@ -140,8 +141,10 @@ fn observe_install_media_remaster(artifact: UbuntuSeededInstallMediaArtifactRow)
}
}

data ensure_grub_cmdline_probe_note: String = "grep exits non-zero when the pattern is ABSENT, and absence is precisely the question this fn asks — it is the idempotence probe that decides whether to substitute or leave the file alone. Both answers are ordinary: on a fresh image the cmdline is missing and gets inserted, on a re-run it is present and nothing happens. The §5 guard holds on the belt_program_available shape: the Bool is consumed as the branch discriminator, never discarded. A grep that could not RUN is a different event and does not travel this arm."

fn install_media_remaster_ensure_grub_cmdline(grub_cfg: NonEmptyStr, cmdline: NonEmptyStr) -> Bool {
let already_present = grep.Grep.MatchesFixedString(pattern: cmdline, path: grub_cfg).matches
let already_present = grep.Grep.MatchesFixedString(pattern: cmdline, path: grub_cfg, expect: OutcomeIsData).matches
let substituted = if already_present {
true
} else {
Expand Down
51 changes: 50 additions & 1 deletion dag/extdeps/render/glyphs.dag
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ data standard_symbols: List<SymbolEntry> = [
{ id: NodeRunning, glyphs: glyphs_for_tiers(emoji: glyph(text: "🔄"), unicode: glyph(text: "◐"), ascii: glyph(text: "[~]")), color: Active },
{ id: NodeCompleted, glyphs: glyphs_for_tiers(emoji: glyph(text: "✅"), unicode: glyph(text: "✓"), ascii: glyph(text: "[x]")), color: Success },
{ id: NodeFailed, glyphs: glyphs_for_tiers(emoji: glyph(text: "❌"), unicode: glyph(text: "✗"), ascii: glyph(text: "[!]")), color: Error },
{ id: NodeSkipped, glyphs: glyphs_for_tiers(emoji: glyph(text: "⏩"), unicode: glyph(text: "⊘"), ascii: glyph(text: "[-]")), color: Dim },
{ id: NodeSkipped, glyphs: glyphs_for_tiers(emoji: glyph(text: "⏭️"), unicode: glyph(text: "⊘"), ascii: glyph(text: "[-]")), color: Dim },
{ id: NodeIntercepted, glyphs: glyphs_for_tiers(emoji: glyph(text: "🔍"), unicode: glyph(text: "◆"), ascii: glyph(text: "[m]")), color: Info },

{ id: EdgeIdle, glyphs: glyphs_for_tiers(emoji: glyph(text: "┄"), unicode: glyph(text: "┄"), ascii: glyph(text: "-")), color: Dim },
Expand Down Expand Up @@ -56,6 +56,17 @@ data standard_symbols: List<SymbolEntry> = [
{ id: StatusWarning, glyphs: glyphs_for_tiers(emoji: glyph(text: "⚠"), unicode: glyph(text: "⚠"), ascii: glyph(text: "WARN")), color: Warning },
{ id: StatusInfo, glyphs: glyphs_for_tiers(emoji: glyph(text: "💡"), unicode: glyph(text: "ℹ"), ascii: glyph(text: "INFO")), color: Info },

{ id: StatusRefused, glyphs: glyphs_for_tiers(emoji: glyph(text: "🚫"), unicode: glyph(text: "⛔"), ascii: glyph(text: "REFUSED")), color: Error },
{ id: StatusBlocked, glyphs: glyphs_for_tiers(emoji: glyph(text: "⏳"), unicode: glyph(text: "◷"), ascii: glyph(text: "BLOCKED")), color: Warning },
{ id: StatusTimedOut, glyphs: glyphs_for_tiers(emoji: glyph(text: "⌛"), unicode: glyph(text: "⏱"), ascii: glyph(text: "TIMEOUT")), color: Error },
{ id: StatusDwell, glyphs: glyphs_for_tiers(emoji: glyph(text: "⏱"), unicode: glyph(text: "◴"), ascii: glyph(text: "DWELL")), color: Warning },
{ id: StatusFinal, glyphs: glyphs_for_tiers(emoji: glyph(text: "✦"), unicode: glyph(text: "✦"), ascii: glyph(text: "DONE")), color: Success },
{ id: StatusPulse, glyphs: glyphs_for_tiers(emoji: glyph(text: "🕐"), unicode: glyph(text: "◷"), ascii: glyph(text: "STATUS")), color: Dim },

{ id: ChangeAdded, glyphs: glyphs_for_tiers(emoji: glyph(text: "+"), unicode: glyph(text: "+"), ascii: glyph(text: "+")), color: Success },
{ id: ChangeModified, glyphs: glyphs_for_tiers(emoji: glyph(text: "~"), unicode: glyph(text: "~"), ascii: glyph(text: "~")), color: Warning },
{ id: ChangeRemoved, glyphs: glyphs_for_tiers(emoji: glyph(text: "-"), unicode: glyph(text: "-"), ascii: glyph(text: "-")), color: Error },

{ id: DataList, glyphs: glyphs_for_tiers(emoji: glyph(text: "☰"), unicode: glyph(text: "☰"), ascii: glyph(text: "[L]")), color: Default },
{ id: DataMap, glyphs: glyphs_for_tiers(emoji: glyph(text: "⊞"), unicode: glyph(text: "⊞"), ascii: glyph(text: "[M]")), color: Default },
{ id: DataSecret, glyphs: glyphs_for_tiers(emoji: glyph(text: "🔒"), unicode: glyph(text: "✱"), ascii: glyph(text: "[*]")), color: Warning },
Expand Down Expand Up @@ -105,3 +116,41 @@ fn symbol_color(id: SymbolId) -> SemanticColor? {
Absent => none
}
}

data reward_animal_note: String = "The reward animal shown on a terminal success lands as ROWS in the one glyph authority, never as a hardcoded function in a renderer — the reference implementation studied for this lane keeps its emoji table mirrored by hand between Go and shell, which is the maintained dual representation we are here to not have. Selection is DETERMINISTIC: the index is derived from the run's own identity, so replaying a captured run reproduces its animal exactly and the event stream stays replayable by construction. A random draw would make the stream unreplayable and would be a non-determinism root of precisely the kind the determinism gate walls."

data reward_animals: List<TierGlyphs> = [
glyphs_for_tiers(emoji: glyph(text: "🦦"), unicode: glyph(text: "✦"), ascii: glyph(text: "otter")),
glyphs_for_tiers(emoji: glyph(text: "🦊"), unicode: glyph(text: "✦"), ascii: glyph(text: "fox")),
glyphs_for_tiers(emoji: glyph(text: "🦉"), unicode: glyph(text: "✦"), ascii: glyph(text: "owl")),
glyphs_for_tiers(emoji: glyph(text: "🐢"), unicode: glyph(text: "✦"), ascii: glyph(text: "turtle")),
glyphs_for_tiers(emoji: glyph(text: "🦫"), unicode: glyph(text: "✦"), ascii: glyph(text: "beaver")),
glyphs_for_tiers(emoji: glyph(text: "🐋"), unicode: glyph(text: "✦"), ascii: glyph(text: "whale"))
]

type RewardPick {
idx: Int
found: TierGlyphs?
}

fn reward_animal_at(index: Int, tier: Tier) -> String? {
let n = count(reward_animals)
if n == 0 {
none
} else {
let target = index % n
let picked = fold(reward_animals,
init: RewardPick { idx: 0, found: none },
f: (acc, g) =>
if acc.idx == target {
RewardPick { idx: acc.idx + 1, found: Present { value: g } }
} else {
RewardPick { idx: acc.idx + 1, found: acc.found }
}
)
match picked.found {
Present { value: g } => Present { value: glyph_at(glyphs: g, tier: tier) }
Absent => none
}
}
}
5 changes: 4 additions & 1 deletion dag/extdeps/tools/sha256sum.dag
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import std.types { NonEmptyStr, String, Bool }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }
import extdeps.tools { CliTool, SourceCoreutils }
import gunbc.output_policy { OutcomeIsData }
import extdeps.shell
import extdeps.filesystem.filesystem_io
import std.roster_frontier {
Expand Down Expand Up @@ -65,6 +66,8 @@ data sha256_verify_native_transport_frontier_rows: List<FrontierRow> = [
)
]

data sha256_check_outcome_is_data_note: String = "sha256sum --check exits non-zero on DIGEST MISMATCH, which is this fn's Sha256Mismatch answer, not a fault — so the check call is OutcomeIsData. The guard holds on the same evidence as the caller: Sha256VerifyVerdict already separates the two content answers (Matches / Mismatch) from Sha256VerifyInfraFailure, the arm for the verification machinery itself breaking, so annotating the content comparison cannot silence an infra failure — that arm is reached by different conditions entirely."

fn sha256sum_verify_via_shell(path: NonEmptyStr, expected_digest: NonEmptyStr) -> Sha256VerifyVerdict {
let checksum_dir = shell.Mktemp.Dir()
if checksum_dir.success == false {
Expand All @@ -77,7 +80,7 @@ fn sha256sum_verify_via_shell(path: NonEmptyStr, expected_digest: NonEmptyStr) -
let cleaned = shell.Remove.RecursiveForce(path: checksum_dir.path)
Sha256VerifyInfraFailure { reason: "checksum file write failed" as NonEmptyStr }
} else {
let checked = sha256sum.Sha256.CheckFile(checksum_file: checksum_path)
let checked = sha256sum.Sha256.CheckFile(checksum_file: checksum_path, expect: OutcomeIsData)
let cleaned = shell.Remove.RecursiveForce(path: checksum_dir.path)
if checked.matches {
Sha256Matches
Expand Down
Loading
Loading