Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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