Skip to content

Campaign: retire Nix-mirror across consumer repos (Guix-primary ruling) #102

@hyperpolymath

Description

@hyperpolymath

Tracked dedicated channel for the consumer-repo side of the Guix-primary ruling. Refs #101 (policy MERGED; LANGUAGE-POLICY.adoc §Package Management + debt.a2ml SHOULD item). This issue is the parent tracker; do not close #101 against it.

Why this is a campaign, not a sweep

Background-agent triage (2026-05-18) established:

  • Scale: ~330 estate repos scanned; ~270 have BOTH a top-level flake.nix and a Guix-manifest match. Plus monorepos (developer-ecosystem, repos-monorepo, affinescript, reposystem, ambientops, gitbot-fleet, julia-ecosystem, polystack, panll, social-media-tools) carrying nested flakes.
  • Background sub-agents cannot bulk-execute this: a hard sandbox layer (not the permission prompt) denies Write /tmp, output redirection, and $(...)/piped compounds. Per-repo clone→edit→commit→PR must run supervised.
  • Matches the user-endorsed triage-over-partial-hack rule: judgement-gated, too big for one safe automated pass.

The gate (apply per repo, never mechanically)

The real test is flake vs (Guix ∪ sealed-container), not flake-vs-Guix:

  1. In scope only if the repo has BOTH a Guix manifest (guix.scm/manifest.scm) AND a flake.nix.
  2. Pure mirror = every dep flake.nix provides is in the Guix manifest or provisioned by the repo's sealed container → remove flake.nix+flake.lock, reconcile docs (link policy, never copy).
  3. Load-bearing = flake.nix is the sole source of any named dep not in Guix/containers → KEEP; add a one-line top comment naming that dep. (The echidna chore: Item 9 — retire ReScript guidance → AffineScript #73 exemplar flake was itself load-bearing — lean4/dafny/cvc5 — deletable only because chore: Item 9 — retire ReScript guidance → AffineScript #73 simultaneously stood up the container escape.)
  4. .guix-channel-only (no guix.scm/manifest.scm, e.g. my-lang): a channel pin is not a package manifest → 'pure mirror' undefined → KEEP + flag, never delete.
  5. Monorepo nested flakes: usually vendored copies → fix at the source repo, not the aggregator.
  6. Unsure → KEEP + flag. Never delete on uncertainty.

Execution model

  • Hand-verified waves of ~20 single-package repos, each a child issue of this tracker (native sub-issues).
  • One PR per repo: fix(pkg): retire Nix-mirror per Guix-primary ruling (standards#101); body uses Refs, never Closes; squash; --squash --auto; never --admin. Use the repo's configured git identity; never a gmail address.
  • Exclusions: hyperpolymath/standards (done), hyperpolymath/echidna (pilot chore: Item 9 — retire ReScript guidance → AffineScript #73).
  • Do not duplicate policy text into consumer repos — link back to standards.

Wave 0 (next actionable)

The triage inventory lived only in the sub-agent transcript. Wave 0 = regenerate the canonical per-repo repo | flake-paths | guix-paths | sealed-container? inventory as a durable committed worklist artifact, then slice waves 1..N from it.

Refs #101

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions