Casey Tunturi

August 23, 2026

August 23, 2026

65 recorded commits · 8 named repos · 6 private repos

Work threads
work54custody3retrigger2deps2publication2cireadmepublic
  • Private work 6 private repos

    Activity was recorded across 6 private repos. Names, subjects, counts, and links stay private.

  • statelog20 changes
    • new repocreated repo Fimeg/statelog
      7:51 p.m. · forge event · internal Gitea record only
    • make the host port a deploy variable
      7:04 p.m. · 5b7e9f6 · internal Gitea record only

      RedFlag holds 3302 on the deploy host and appears in no compose file here, so the sweep that called 3302 free could not have seen it. The tree cannot answer this question; ss on the host can.

    • bind the host address and rejoin the pangolin network
      6:59 p.m. · 59dc63e · internal Gitea record only

      Pangolin runs on a different machine, so a loopback bind is unreachable from it -- forgejo-public binds its host address explicitly and joins the network for exactly this reason. An earlier commit removed the network block by reading a service that Pangolin does not front.

    • record that neither repository is a publication candidate
      5:23 p.m. · 999bc74 · internal Gitea record only

      A sweep classifying repos for the public forge must not pick these up. The site is a rendered projection; serving it is a different act from publishing the source or the archive, and custody may never leave raw.

    • rename custody to main before the first push, not after
      5:21 p.m. · 42d8778 · internal Gitea record only

      The custody repo is on master while the source repo, both workflows and forge-init's default_branch are on main. Renaming after a push leaves a stray branch and an empty default on the forge.

    • check custody from a clone, not the copy that wrote it
      5:20 p.m. · 624dd7c · internal Gitea record only

      The clone found the second checkpoint uncommitted -- it seals 104 observations where the working store has 173, so a forge capture would have chained from cf5f8d6b and orphaned 374c8822. forge-verify.py reads deploy-key permissions back rather than trusting the create request.

    • write the migration off the laptop
      12:28 p.m. · 2a30d19 · internal Gitea record only

      Twelve steps, six of which stop at a credential or a live host. The acceptance test is that the laptop can be powered off and custody still grows; until step 8 is green the timer stays on, because Canada cannot be reconstructed backwards.

    • render read-only, deploy through restricted verbs
      12:28 p.m. · 3d6766b · internal Gitea record only

      A capture push cannot trigger this workflow, so it carries its own schedule rather than widening the capture identity to defeat that. The image is built on the runner and shipped by docker save; the host builds nothing and holds no forge credential.

    • capture appends under a key scoped to custody alone
      12:28 p.m. · d0b7f5b · internal Gitea record only

      Write deploy key, one repository, not an account token and not Casey. The runner image is bare, so python3, git and ssh install first. Clone, sweep, checkpoint and push are one step, so the key's lifetime is one step and the trap fires on failure too.

    • drop the pangolin network from compose
      12:28 p.m. · 95b0bfa · internal Gitea record only

      Samaritan Portal has no network block -- Pangolin reaches it through the host port. caseytunturi attaches one; the newer pattern is the one to follow, and an external network that does not exist fails the container at start.

    • restore the deploy pattern and the port record
      12:28 p.m. · 9c06024 · internal Gitea record only

      Samaritan Portal binds 3304 and is the pattern this follows; the repo I read instead was a superseded dev tree. Both the wrong correction and the sweep that missed every variable-prefixed bind are recorded in the file rather than quietly replaced.

    • enable linger so the sweep survives logout
      12:10 p.m. · 7006c8d · internal Gitea record only

      Without it the user manager dies with the login session and the timer only exists while someone is signed in. On a laptop that travels, a day nobody logs in is a hole Canada cannot backfill.

    • correct the deploy pattern and the port claim
      12:10 p.m. · 4b4cf5e · internal Gitea record only

      The pattern came from caseytunturi.com and souveraine-website. Samaritan runs a React dev server and was never it, and nothing in the tree binds 3304, the port 3302 was said to clear.

    • name the custody remote and split its two credentials
      12:10 p.m. · 45b5892 · internal Gitea record only

      Read for the site build, write for the sweep. The site renders evidence and must never be able to alter it. forge-init.py creates both repositories -- push-to-create is off on this installation.

    • deploy the tree CI verified, not a rebuild of it
      12:10 p.m. · de60f75 · internal Gitea record only

      The host gets dist/ and its build context in one tar, so it holds no forge credential. CI reads /.build-sha and /.custody-checkpoint back off the running container and fails unless both match what it built.

    • stamp each page with its build and custody checkpoint
      12:10 p.m. · 9a376ec · internal Gitea record only

      Two identifiers a reader can check without asking: which code rendered the page, which custody state it was rendered against. The footer also names the gap -- no digest published outside the authority holding custody -- so "verifies" cannot read as "tamper-proof".

    • render the public site from custody; containerise for statelog subdomain
      11:48 a.m. · 83e13a1 · internal Gitea record only

      Site is a projection: counts, hashes, diffs and provenance are read from the capture store at build time, so a claim without a capture cannot render. nginx-alpine behind Pangolin, loopback bind, build-sha verified. Route, port and runner remain Casey's to set.

    • custody checkpoints, notice determination, relational projection
      11:18 a.m. · 25c9184 · internal Gitea record only

      Split the agency's own label from a determination about the record: 18 of 35 final rules touching 8 CFR 1208 have no prior proposed rule under the same RIN. Parser v2 disambiguates 9 duplicate provision paths, rederived from held bytes with no refetch. Projection rebuilds byte-identical from custody alone.

    • custody store, canadian capture loop, federal register join
      11:11 a.m. · 75cd7ba · internal Gitea record only

      Every fetch now preserves raw bytes, retrieval time, hash, and a derivative keyed to parser version; rederive reparses held objects with no refetch. First Canadian custody point: 26 acts and regs, 13,545 provisions. The join resolves 31 of 33 amendment dates for 8 CFR 1208 and prints what it cannot match.

    • statelog: source register, core schema, ecfr diff engine, first two pages
      11:11 a.m. · 29d3b43 · internal Gitea record only

      eCFR versioner gives point-in-time federal text with no key; Canada serves only current consolidation, so archive-on-ingest is mandatory. First artifact page renders the 8 CFR 1208.3 asylum fee change with full provenance.

  • souveraine-viewtop14 changes
    • survive a transient lookup while assembling the sysroot
      9:30 p.m. · 4a54f06 · internal Gitea record only

      The gate failed on name resolution for the package archive after apt had already succeeded in the same job -- intermittent, not configuration.

    • project the tested ref onto the public forge
      9:10 p.m. · d277802 · internal Gitea record only
    • add the cross libc the aarch64 link needs
      9:07 p.m. · 8ec3aa5 · internal Gitea record only

      gcc-aarch64-linux-gnu ships the compiler, not the target startup files; without libc6-dev-arm64-cross ld cannot find Scrt1.o.

    • retrigger: the smithay dependency is now public
      8:59 p.m. · 493322d · internal Gitea record only
    • prove the phone binary carries nothing from the build host
      6:53 p.m. · 4b1d8a0 · internal Gitea record only

      Eight checks after the link: AArch64 ELF, expected loader, no embedded RPATH, and every DT_NEEDED resolving to an aarch64 object inside the constructed sysroot. CI builds that sysroot in runner temp from empty, so nothing survives between runs to become part of the contract again.

    • assemble the phone sysroot from declared inputs
      6:43 p.m. · 9aca46f · internal Gitea record only

      It was a directory on one machine with no record of its contents, which made the only build that can take the panel reproducible by one person. 155 arm64 packages now resolve from 12 requirements derived from the kms feature, each verified against the archive index.

    • stop tracking the mechanism's bytecode
      6:00 p.m. · 9e9e433 · internal Gitea record only

      Compiled copies of the scanner carry its rule literals into the tree as bytes no reviewer reads, and they change on every run. Ignored.

    • run the public gate on the ordinary runner class
      6:00 p.m. · 684e456 · internal Gitea record only

      Toolchain, aarch64 target, cross linker and smithay's dependency list are declared here instead of assumed from the build host. The phone KMS build is named as absent and why -- it needs a target sysroot no workflow can declare.

    • mechanism v1, matrix-capable gate evaluator
      5:47 p.m. · 505a322 · internal Gitea record only

      Selection for matrix gates is an explicit enumeration; the prefix count is a tripwire only. The pinned digest moves with it, so an un-updated copy stops the job rather than changing what "checked" means.

    • deps: pin the fork tip that explains itself
      11:44 a.m. · 18d3781 · internal Gitea record only

      Same code; the revision now lands on the commit carrying the fork rationale, so a reader following the dependency arrives at the explanation.

    • publication: bless the gate's own install commit
      11:39 a.m. · dd9f5ea · internal Gitea record only
    • publication: install the gate and bless the history
      11:39 a.m. · e1bf4d9 · internal Gitea record only

      Twenty commits carry internal topology in their diffs and two in their subjects. No secrets, and the tree at HEAD is clean, so the accepted history cannot excuse anything live.

    • public: cut the internal half out of the projection
      11:38 a.m. · 4adf8c0 · internal Gitea record only

      Build and test stay; packaging, signing and archive publication do not, and neither does the operator harness. Four references to the build host become generic, package URLs point at the public forge, checkout is SHA-pinned.

    • deps: point smithay at the published fork
      11:38 a.m. · a6859d8 · internal Gitea record only

      The dependency was pinned to a host no one outside the house can reach, so a public clone could not resolve it. Same five patches, same tree; the revision moved because two commit identities were corrected before first publication.

  • souveraine8 changes
    • project the tested ref onto the public forge
      9:21 p.m. · db593a2 · internal Gitea record only
    • flush the pending queue before returning
      9:20 p.m. · 1216373 · internal Gitea record only

      tokio's File buffers; an append that returned Ok could still be in memory when the next take() read the file. Caught by multiple_appends_accumulate on a runner, never on a developer machine.

    • retrigger: runner could not pull its image
      8:42 p.m. · 12235cf · internal Gitea record only

      The previous run failed resolving docker.gitea.com; nothing in the tree changed.

    • run the gates on the public branch too
      8:10 p.m. · 57898f8 · internal Gitea record only

      The candidate ref never triggered anything, so a push to public produced no run and therefore no gate proof.

    • review the commit that installs the gate
      8:08 p.m. · 18144e2 · internal Gitea record only

      The mechanism carries the credential patterns it enforces, so the diff that adds it matches its own rules. The tree is exempted by manifest; the commit is reviewed here.

    • install the publication mechanism
      8:07 p.m. · e1eede9 · internal Gitea record only
    • keep the packaging half off the public branch
      7:43 p.m. · 2f685fa · internal Gitea record only

      primary still carries the whole workflow; the public projection carries the three portable gates and nothing that names the build host.

    • split the public gates from the internal packaging half
      7:42 p.m. · 76846fe · internal Gitea record only

      The three portable jobs stay; the [host] packaging and archive publish move to packages.yml, which the public branch does not carry. The handoff document is operator archaeology and does not travel.

  • smithay8 changes
    • project the tested ref onto the public forge
      8:54 p.m. · 2e2dfc3 · internal Gitea record only

      Fast-forward checked before the push, exact SHA read back after. Gitea is the only thing that publishes.

    • take instead of drain-collect, twice
      8:40 p.m. · 73a3bea · internal Gitea record only

      clippy's drain_collect fires under -D warnings on a newer toolchain than upstream pins. Two lines, same semantics.

    • rustfmt the fork's own patches
      8:20 p.m. · 53c6f45 · internal Gitea record only

      The gate runs cargo fmt --check and the five patches were not formatted to upstream's style.

    • run the public gate on the ordinary runner class
      6:00 p.m. · dbb6cf1 · internal Gitea record only

      builder was a placeholder invented to keep an internal host name out of a public tree, and nothing serves it. The workflow now declares the toolchain and upstream's own dependency list for test_all_features, so the build contract is in the file rather than on one machine.

    • review the one commit the gate flags
      5:49 p.m. · 20ddbd0 · internal Gitea record only

      The mechanism install carries the scanner's own rule definitions; a gate cannot enter a repository it protects without its patterns appearing in that diff. The tree is exempted by manifest, the commit is reviewed here.

    • install the publication mechanism, pinned
      5:48 p.m. · aeb3c97 · internal Gitea record only

      The gate travels with the repository because this installation cannot read a reusable workflow from a private repo. The pin makes drift a hard stop rather than a silent change in what "checked" means.

    • ci: one gate that validates the five patches
      11:56 a.m. · 9945db1 · internal Gitea record only

      Upstream checks with test_all_features and the patches live in the paths that flag compiles, so the fork borrows that choice rather than inventing one. Anvil, Smallvil and the cache dance stay upstream's problem.

    • readme: say why this fork exists
      11:43 a.m. · 227c7e4 · internal Gitea record only

      Five patches on a named upstream base, each with the failure it fixes. A reader should not have to diff 4000 commits to find 332 lines.

  • upower5 changes
    • project the tested ref onto the public forge
      8:55 p.m. · 4a53185 · internal Gitea record only

      Fast-forward checked before the push, exact SHA read back after.

    • add gettext for msgfmt
      8:23 p.m. · ca47424 · internal Gitea record only

      meson's policy/meson.build needs msgfmt to build the polkit policy file.

    • review the commit that installs the gate
      8:15 p.m. · 58d4e88 · internal Gitea record only
    • carry the publication gate on the candidate ref
      8:15 p.m. · 3a63993 · internal Gitea record only
    • add the publication gate this fork lacked
      7:41 p.m. · 9617021 · internal Gitea record only

      Upstream ships no CI in this tree, so the gate is meson's own contract: configure, build, test, with the optional introspection and idevice halves switched off so every run proves the same thing.

  • SouveraineOS4 changes
    • gate every push to the candidate ref
      2 distinct commits share this description9:01 p.m. · 03ec301 · internal Gitea record only9:00 p.m. · ce6c4d0 · internal Gitea record only

      A paths filter meant a push touching only the gate itself ran nothing.

    • review the commit that installs the gate
      8:59 p.m. · a1d0b27 · internal Gitea record only
    • carry the publication gate on the candidate ref
      8:43 p.m. · 6bcc308 · internal Gitea record only
  • souveraine-updater4 changes
    • project the tested ref onto the public forge
      8:55 p.m. · a818692 · internal Gitea record only

      Fast-forward checked before the push, exact SHA read back after.

    • review the commit that installs the gate
      8:15 p.m. · ec226b4 · internal Gitea record only
    • carry the publication gate on the candidate ref
      8:14 p.m. · 07aed52 · internal Gitea record only
    • describe the updater and point its urls at the public forge
      7:39 p.m. · 14481d9 · internal Gitea record only

      The repository had no README, which policy requires, and both Cargo.toml and the package recipe named the internal forge -- a current-tree finding the candidate scan cannot forgive.

  • statelog-custody4 changes
    • custody: seal the second checkpoint before the repository leaves this machine
      7:51 p.m. · 244655d · internal Gitea record only
    • new repocreated repo Fimeg/statelog-custody
      7:51 p.m. · forge event · internal Gitea record only
    • custody: sweep 2026-08-23, parser v2 derivatives
      11:18 a.m. · 2011658 · internal Gitea record only

      172 observations, 75 objects, first checkpoint cf5f8d6ba5ba.

    • custody: first archive, canada and us federal
      11:14 a.m. · fcf5b6d · internal Gitea record only

      26 canadian acts and regulations, us federal captures, 104 observations.