Record the forge branching/merging strategy — fastlane, tag horizon, steward #22

Open
opened 2026-08-04 10:50:55 +00:00 by agent.odin · 17 comments
Collaborator

Stable ID: FM-FORGE-FLOW
Source: design session 2026-08-04, owner + agent.odin, every clause ratified by the owner in chat
Source status: ratified design, unrecorded until the wiki page lands
Disposition: open — record to wiki, then build queue
Blocked by: nothing

The model

agent workspace --push--> tango/<ticket>-<slug> --PR--> fastlane --curation--> main --tag-time mirror--> origin (GitHub)

fastlane is agent-governed; main is human-anchored. The further from the human, the more mechanical the gate.

The twelve laws

  1. Single base. Every PR sits on fastlane tip, always — no epic integration branches. On any push to fastlane (merges and direct pushes alike), the steward rebases every open PR (POST /pulls/{i}/update?style=rebase). Conflicts return the PR to its agent with evidence; the steward never resolves. The forge-side rebase is authoritative; change-id headers (git.write-change-id-header) make the agent's re-sync silent.
  2. Tag horizon. History at or below the newest version tag on main is immutable; the untagged tail may be absorbed/re-curated. Tags never move — the horizon and origin's ff guarantee both rest on this. Local enforcement: jj immutable_heads() | tags(). Forge enforcement: push whitelist (law 8), force-push permitted but disciplined — Forgejo cannot express "only above the tag"; that part is law, not mechanism.
  3. Drift invariant. After every promotion, diff main fastlane is empty modulo deliberately held-back changes. Drift = fork.
  4. Backflow. Anything landing on main outside the fastlane path is committed back into fastlane immediately.
  5. Provenance by citation. Curated main commits cite their PR / fastlane source. Change-id headers give this a mechanical assist.
  6. Origin is a tag-anchored mirror. Untagged commits never leave the forge. Origin receives main at tag time, always ff (new tags always descend from old ones), plus the tags. Subscribing to forge main is consent to tail rewrites. One-time surgery queued: GitHub main is the unrelated bootstrap a430f4db; the first mirror push is a deliberate reset, ff-forever after.
  7. Tagging is a HITL signing ceremony. Owner's GPG, no auto-unlock — signing is a deliberate act. Explicit git tag -s in the colocated repo; no tag.gpgSign default. Agents never tag — no agent holds the key. Public key registered on Forgejo and GitHub.
  8. Curation seats. main push = owner + at most one agent persona per org: odin for flaky-mesh + infra, teyla for sleipnir. Enforced by the push whitelist. The steward rides the seat identity.
  9. Refs cite tickets. PR branches are tango/<ticket>-<slug>. No ticket, no branch, no PR. Local tango workspace names follow the same convention.
  10. Merge style at review. Squash raw PRs; preserve queen-curated lines. The curated label is the machine-readable verdict the steward reads. fastlane stays feature-sized either way.
  11. Approval and mechanical merge. Any collaborator may approve, except the PR's own author. The steward merges mechanically when the gate is green (approved, atop tip, no conflicts). Direct push by authority holders is the accepted bypass — authority is the bypass; abuse is a trust event made visible by laws 2 and 5.
  12. Steward scope. Forge-side conformance is the steward: branch protections, labels, PR defaults, webhooks — read via API, compared to the declared spec, remediated or alarmed. Client-side jj bootstrap (write-change-id-header, immutable_heads) belongs to the devshell/just doctor recipes — the steward only observes its effects (header presence on pushed refs). New repos: bootstrap is a declared just forgejo recipe at birth; the steward reconciles forever after.

Build queue

  • Wiki page recording this strategy (the long form of this issue)
  • Collaborator grants for agent.* accounts (approve rights, law 11)
  • Branch protections: fastlane (merge by steward+owner, no direct push otherwise), main (push owner+seat)
  • Steward service on bifrost, declared in the flake
  • Mirror job: main-only to GitHub at tag time, incl. the one-time bootstrap reset (law 6)
  • Repo jj config: write-change-id-header = true; devshell immutable_heads() | tags(); doctor recipe asserting both
  • Owner GPG public key on Forgejo + GitHub (law 7)
  • Sweep stale local lines (tango/bumble-verify-main, odin-in-the-fold) — owner act

Acceptance

  • Wiki page exists and Home indexes it.
  • Each build-queue item above is done or split into its own issue with a Blocked by row.

Provenance

Designed and ratified clause-by-clause in a 2026-08-04 session between the owner and agent.odin (Hermes, kimi-coding). Live-verified facts behind it: forge holds only main (c6816528, in sync with local); GitHub holds only the bootstrap commit; zero PRs ever on the forge; wiki confirmed present at flaky-mesh.wiki after an initial false-negative probe through the MCP contents API.

Stable ID: FM-FORGE-FLOW Source: design session 2026-08-04, owner + agent.odin, every clause ratified by the owner in chat Source status: ratified design, unrecorded until the wiki page lands Disposition: open — record to wiki, then build queue Blocked by: nothing ## The model ``` agent workspace --push--> tango/<ticket>-<slug> --PR--> fastlane --curation--> main --tag-time mirror--> origin (GitHub) ``` fastlane is agent-governed; main is human-anchored. The further from the human, the more mechanical the gate. ## The twelve laws 1. **Single base.** Every PR sits on fastlane tip, always — no epic integration branches. On any push to fastlane (merges and direct pushes alike), the steward rebases every open PR (`POST /pulls/{i}/update?style=rebase`). Conflicts return the PR to its agent with evidence; the steward never resolves. The forge-side rebase is authoritative; change-id headers (`git.write-change-id-header`) make the agent's re-sync silent. 2. **Tag horizon.** History at or below the newest version tag on main is immutable; the untagged tail may be absorbed/re-curated. Tags never move — the horizon and origin's ff guarantee both rest on this. Local enforcement: jj `immutable_heads() | tags()`. Forge enforcement: push whitelist (law 8), force-push permitted but disciplined — Forgejo cannot express "only above the tag"; that part is law, not mechanism. 3. **Drift invariant.** After every promotion, `diff main fastlane` is empty modulo deliberately held-back changes. Drift = fork. 4. **Backflow.** Anything landing on main outside the fastlane path is committed back into fastlane immediately. 5. **Provenance by citation.** Curated main commits cite their PR / fastlane source. Change-id headers give this a mechanical assist. 6. **Origin is a tag-anchored mirror.** Untagged commits never leave the forge. Origin receives main at tag time, always ff (new tags always descend from old ones), plus the tags. Subscribing to forge main is consent to tail rewrites. One-time surgery queued: GitHub main is the unrelated bootstrap `a430f4db`; the first mirror push is a deliberate reset, ff-forever after. 7. **Tagging is a HITL signing ceremony.** Owner's GPG, no auto-unlock — signing is a deliberate act. Explicit `git tag -s` in the colocated repo; no `tag.gpgSign` default. Agents never tag — no agent holds the key. Public key registered on Forgejo and GitHub. 8. **Curation seats.** main push = owner + at most one agent persona per org: **odin** for flaky-mesh + infra, **teyla** for sleipnir. Enforced by the push whitelist. The steward rides the seat identity. 9. **Refs cite tickets.** PR branches are `tango/<ticket>-<slug>`. No ticket, no branch, no PR. Local tango workspace names follow the same convention. 10. **Merge style at review.** Squash raw PRs; preserve queen-curated lines. The `curated` label is the machine-readable verdict the steward reads. fastlane stays feature-sized either way. 11. **Approval and mechanical merge.** Any collaborator may approve, except the PR's own author. The steward merges mechanically when the gate is green (approved, atop tip, no conflicts). Direct push by authority holders is the accepted bypass — authority is the bypass; abuse is a trust event made visible by laws 2 and 5. 12. **Steward scope.** Forge-side conformance is the steward: branch protections, labels, PR defaults, webhooks — read via API, compared to the declared spec, remediated or alarmed. Client-side jj bootstrap (`write-change-id-header`, `immutable_heads`) belongs to the devshell/just doctor recipes — the steward only observes its effects (header presence on pushed refs). New repos: bootstrap is a declared `just forgejo` recipe at birth; the steward reconciles forever after. ## Build queue - [ ] Wiki page recording this strategy (the long form of this issue) - [ ] Collaborator grants for `agent.*` accounts (approve rights, law 11) - [ ] Branch protections: fastlane (merge by steward+owner, no direct push otherwise), main (push owner+seat) - [ ] Steward service on bifrost, declared in the flake - [ ] Mirror job: main-only to GitHub at tag time, incl. the one-time bootstrap reset (law 6) - [ ] Repo jj config: `write-change-id-header = true`; devshell `immutable_heads() | tags()`; doctor recipe asserting both - [ ] Owner GPG public key on Forgejo + GitHub (law 7) - [ ] Sweep stale local lines (`tango/bumble-verify-main`, `odin-in-the-fold`) — owner act ## Acceptance - Wiki page exists and Home indexes it. - Each build-queue item above is done or split into its own issue with a Blocked by row. ## Provenance Designed and ratified clause-by-clause in a 2026-08-04 session between the owner and agent.odin (Hermes, kimi-coding). Live-verified facts behind it: forge holds only `main` (`c6816528`, in sync with local); GitHub holds only the bootstrap commit; zero PRs ever on the forge; wiki confirmed present at `flaky-mesh.wiki` after an initial false-negative probe through the MCP contents API.
Author
Collaborator

Wiki page landed: Forge Flow (wiki commit 80518e6, authored as odin), indexed from Home under Current authority. First build-queue item done; the remaining seven are build work, starting with the collaborator grants and branch protections the steward will later reconcile.

Wiki page landed: [Forge Flow](https://jo.et0.pw/larandar/flaky-mesh/wiki/Forge-Flow) (wiki commit `80518e6`, authored as odin), indexed from Home under Current authority. First build-queue item done; the remaining seven are build work, starting with the collaborator grants and branch protections the steward will later reconcile.
Author
Collaborator

Law 13 ratified and recorded (wiki commit 910e551): tracker lifecycle — states (in-progress / in-review / conflicted, exclusive, position) vs overlays (blocked steward-derived only, needs-decision hand-set intent, curated PR-only verdict). Tickets close at fastlane merge; a specification miss triggers a new linked ticket, never a PR bounce or a resurrection. Epics are Forgejo Projects, not issues — #9 migrates when the steward label spec lands. Two build-queue items added accordingly.

Law 13 ratified and recorded (wiki commit `910e551`): tracker lifecycle — states (`in-progress` / `in-review` / `conflicted`, exclusive, position) vs overlays (`blocked` steward-derived only, `needs-decision` hand-set intent, `curated` PR-only verdict). Tickets close at fastlane merge; a specification miss triggers a new linked ticket, never a PR bounce or a resurrection. Epics are Forgejo Projects, not issues — #9 migrates when the steward label spec lands. Two build-queue items added accordingly.
Author
Collaborator

§13 amended (wiki commit a6ca1ff) with the doctrine's rationale and its one leniency: the asymmetry is charged to who should have spoken earlier (groomer/reviewer), never to the implementer for failing to foresee complexity — seniors speak early, juniors are not required to be prophets. Leniency: an external event landing before merge may reevaluate the ticket itself (amend/rescope/supersede); mid-flight reevaluation while in review requires the dev's approval, else no-bounce applies.

§13 amended (wiki commit `a6ca1ff`) with the doctrine's rationale and its one leniency: the asymmetry is charged to who should have spoken earlier (groomer/reviewer), never to the implementer for failing to foresee complexity — seniors speak early, juniors are not required to be prophets. Leniency: an external event landing before merge may reevaluate the ticket itself (amend/rescope/supersede); mid-flight reevaluation while in review requires the dev's approval, else no-bounce applies.
Author
Collaborator

Owner ruling recorded on PR #23 (and applicable to lar.ad/modron #14/#16/#17): pre-ratification dispatched work merges owner-direct, grandfathered; the mold binds only work dispatched after ratification. Follow-up for this tracker: after the #23 merge lands, the eight sweep tickets get closed with the merge commit cited (the PR has no Closes #n lines). The transition clause should also ride into the wiki page's preamble when next amended.

Owner ruling recorded on PR #23 (and applicable to lar.ad/modron #14/#16/#17): pre-ratification dispatched work merges owner-direct, grandfathered; the mold binds only work dispatched after ratification. Follow-up for this tracker: after the #23 merge lands, the eight sweep tickets get closed with the merge commit cited (the PR has no `Closes #n` lines). The transition clause should also ride into the wiki page's preamble when next amended.
Author
Collaborator

Scope ruling recorded (wiki commit f69e56e, now in the page preamble): the law is forge-wide — every repo on jo.et0.pw, no deviation when the swarm goes live. Each repo instantiates it at birth via its declared steward spec. Consequence for this queue: lar.ad/modron (born 2026-08-04, PRs before conventions) needs its birth recipe run — fastlane, protections, label spec — and its curation seat named (law 8 named teyla for sleipnir; modron's seat is still unassigned).

Scope ruling recorded (wiki commit `f69e56e`, now in the page preamble): the law is **forge-wide** — every repo on jo.et0.pw, no deviation when the swarm goes live. Each repo instantiates it at birth via its declared steward spec. Consequence for this queue: `lar.ad/modron` (born 2026-08-04, PRs before conventions) needs its birth recipe run — fastlane, protections, label spec — and its curation seat named (law 8 named teyla for sleipnir; modron's seat is still unassigned).
Author
Collaborator

Org topology recorded (wiki commit 4f62b40, law 8 now org-shaped): larandar → odin; swarm (sleipnir's new org, moved 2026-08-04) → teyla; lar.ad (modron + the newly-landed hydramem, 27 open issues) → open, teyla de facto on modron, pending ruling. Multi-org seat holding is allowed — the cap is one persona per org, not per persona. Also observed: modron's three grandfathered PRs are merged; hydramem joined the forge today and needs the same birth recipe as modron when this queue is executed.

Org topology recorded (wiki commit `4f62b40`, law 8 now org-shaped): `larandar` → odin; `swarm` (sleipnir's new org, moved 2026-08-04) → teyla; `lar.ad` (modron + the newly-landed hydramem, 27 open issues) → **open**, teyla de facto on modron, pending ruling. Multi-org seat holding is allowed — the cap is one persona per org, not per persona. Also observed: modron's three grandfathered PRs are merged; hydramem joined the forge today and needs the same birth recipe as modron when this queue is executed.
Author
Collaborator

Steward design refinement (2026-08-04): the steward is a polling conformance worker, not a webhook listener — all its transitions are derivable from API state, and a poller that dies re-derives on restart (a dead listener silently misses events). Nu-implementable, systemd service + timer on bifrost. Merge duty: schedule, never performpr_auto_merge is Forgejo's own worker for this; once CI lands (actions runner planned for the Praha host, spare CPU), fastlane protection declares a required check and auto-merge fires on checks+approval. Interim: steward merges directly when its gate is green, with the required-check slot already in the spec so CI is a config delta. Build queue additions: (1) services.gitea-actions-runner declaration on Praha + sops registration token; (2) steward derivation table (API state → transition) as design artifact before code.

Steward design refinement (2026-08-04): the steward is a **polling conformance worker**, not a webhook listener — all its transitions are derivable from API state, and a poller that dies re-derives on restart (a dead listener silently misses events). Nu-implementable, systemd service + timer on bifrost. Merge duty: **schedule, never perform** — `pr_auto_merge` is Forgejo's own worker for this; once CI lands (actions runner planned for the Praha host, spare CPU), fastlane protection declares a required check and auto-merge fires on checks+approval. Interim: steward merges directly when its gate is green, with the required-check slot already in the spec so CI is a config delta. Build queue additions: (1) `services.gitea-actions-runner` declaration on Praha + sops registration token; (2) steward derivation table (API state → transition) as design artifact before code.
Author
Collaborator

Settled (2026-08-04): CI = buildbot-nix on Praha. Owner ruling. Supersedes the earlier "actions-runner planned / sr.ht worker deferred" queue entries.

Design, as verified from upstream docs:

  • Master: services.buildbot-nix.master on the Praha host (flake input github:nix-community/buildbot-nix), authBackend = "gitea" against jo.et0.pw (Forgejo speaks the Gitea API — first live probe confirms behavior before full commit).
  • Identity: dedicated ci persona via just forgejo mint ci — access token (write:repository + write:user) for webhook auto-creation and commit statuses; OAuth2 app on the forge for buildbot logins. Three sops secrets (token, webhook secret, OAuth secret), converged like the rest of the mesh.
  • Repo opt-in: the buildbot-nix topic — the birth recipe adds the topic, CI attaches, zero per-repo CI config. This joins the steward-spec birth recipe (law 12).
  • Triggers/gate: builds on PR opened + push to default branch, evaluates .#checks in parallel, posts commit statuses; fastlane protection names the check as required; pr_auto_merge gates on it. The steward's required-check slot is now filled by a named implementation.
  • Dialect note: the manifest is the flake itself — no CI YAML dialect to diverge from upstream. .build.yml (sr.ht, image: nixos/unstable) remains adoptable later without regret; nix flake check is one line in any dialect.
**Settled (2026-08-04): CI = buildbot-nix on Praha.** Owner ruling. Supersedes the earlier "actions-runner planned / sr.ht worker deferred" queue entries. Design, as verified from upstream docs: - **Master**: `services.buildbot-nix.master` on the Praha host (flake input `github:nix-community/buildbot-nix`), `authBackend = "gitea"` against jo.et0.pw (Forgejo speaks the Gitea API — first live probe confirms behavior before full commit). - **Identity**: dedicated `ci` persona via `just forgejo mint ci` — access token (`write:repository` + `write:user`) for webhook auto-creation and commit statuses; OAuth2 app on the forge for buildbot logins. Three sops secrets (token, webhook secret, OAuth secret), converged like the rest of the mesh. - **Repo opt-in**: the `buildbot-nix` topic — the birth recipe adds the topic, CI attaches, zero per-repo CI config. This joins the steward-spec birth recipe (law 12). - **Triggers/gate**: builds on PR opened + push to default branch, evaluates `.#checks` in parallel, posts commit statuses; fastlane protection names the check as required; `pr_auto_merge` gates on it. The steward's required-check slot is now filled by a named implementation. - **Dialect note**: the manifest is the flake itself — no CI YAML dialect to diverge from upstream. `.build.yml` (sr.ht, `image: nixos/unstable`) remains adoptable later without regret; `nix flake check` is one line in any dialect.
Author
Collaborator

CI design, part 2 — transversal checks and deploys via effects (2026-08-04, owner-directed):

  • Mechanism: buildbot-nix's Hercules-CI-style effects interface (upstream-supported, flagged experimental). No buildbot-nix patch or fork needed — the earlier wrapper-flake injection idea is discarded; effects are the better seam.
  • Transversal flake: a dedicated repo on the forge (working name larandar/transversal) owns ALL shared check/effect logic as forProject = projectFlake: args: …. Each built repo carries exactly one stamped line — effects = args: transversal.forProject self args; — added by the birth recipe. Zero per-repo config becomes one generated line per repo at birth; a repo missing the line is a steward-detectable conformance violation.
  • What effects unlock over plain checks: org-scoped secret files (effects.perRepoSecretFiles."gitea:larandar/*" — sops-converged, tmpfs at runtime) so checks can call the forge API; run-scheduled for periodic conformance; privileged post-build actions (statuses, labels, mirror triggers).
  • Deploys: for the pure NixOS configurations, deploy effects (hercules-ci-effects runNixOS / nixos-rebuild --target-host pattern) give merge-to-main → fleet-converged, SSH deploy key from org secrets, onPush.default semantics (PRs never deploy).
  • Deploy posture ruling (owner, 2026-08-04 — correcting an agent hallucination): NOT all hosts are owner-deployed. HITL-only hosts: bifrost and odin. All other hosts (Praha, future) are eligible for auto-deploy on merge. No deploy effect may ever be declared for a HITL host; the steward conformance-checks this prohibition.
  • Caveats recorded: effects interface is experimental upstream (interface churn risk); the stamped line is a permanent birth-recipe obligation.
**CI design, part 2 — transversal checks and deploys via effects (2026-08-04, owner-directed):** - **Mechanism**: buildbot-nix's Hercules-CI-style **effects** interface (upstream-supported, flagged experimental). No buildbot-nix patch or fork needed — the earlier wrapper-flake injection idea is discarded; effects are the better seam. - **Transversal flake**: a dedicated repo on the forge (working name `larandar/transversal`) owns ALL shared check/effect logic as `forProject = projectFlake: args: …`. Each built repo carries exactly one stamped line — `effects = args: transversal.forProject self args;` — added by the birth recipe. Zero per-repo config becomes one generated line per repo at birth; a repo missing the line is a steward-detectable conformance violation. - **What effects unlock over plain checks**: org-scoped secret files (`effects.perRepoSecretFiles."gitea:larandar/*"` — sops-converged, tmpfs at runtime) so checks can call the forge API; `run-scheduled` for periodic conformance; privileged post-build actions (statuses, labels, mirror triggers). - **Deploys**: for the pure NixOS configurations, deploy effects (hercules-ci-effects `runNixOS` / `nixos-rebuild --target-host` pattern) give merge-to-main → fleet-converged, SSH deploy key from org secrets, `onPush.default` semantics (PRs never deploy). - **Deploy posture ruling (owner, 2026-08-04 — correcting an agent hallucination)**: NOT all hosts are owner-deployed. **HITL-only hosts: bifrost and odin.** All other hosts (Praha, future) are eligible for auto-deploy on merge. No deploy effect may ever be declared for a HITL host; the steward conformance-checks this prohibition. - **Caveats recorded**: effects interface is experimental upstream (interface churn risk); the stamped line is a permanent birth-recipe obligation.
Author
Collaborator

Deferred evaluation: NixOps4 (2026-08-04). nixops.dev — official NixOps successor, Rust core, generic resource model + deployment state, nixops4-nixos integration; actively developed (core 2026-07, nixos integration 2026-08) but pre-release. Watch: on first tagged release, re-evaluate as (a) the deploy runner inside CI effects (swap for nixos-rebuild --target-host, one-line change in the transversal flake) and (b) the fleet-state authority (what's deployed where / did the fleet converge — today derivable only by the steward).

Thin-justfile doctrine (owner, 2026-08-04): recipes are verbs, never logic — any recipe that grows knowledge the flake lacks is a labyrinth seed; the knowledge belongs in Nix. Applies to the #22 build queue: steward, birth recipe, and effects absorb duties by deleting recipe surface, not porting it. No justfile rewrite as a parallel effort; the diet is incremental, per retirement.

**Deferred evaluation: NixOps4 (2026-08-04).** nixops.dev — official NixOps successor, Rust core, generic resource model + deployment state, `nixops4-nixos` integration; actively developed (core 2026-07, nixos integration 2026-08) but pre-release. Watch: on first tagged release, re-evaluate as (a) the deploy runner inside CI effects (swap for `nixos-rebuild --target-host`, one-line change in the transversal flake) and (b) the fleet-state authority (what's deployed where / did the fleet converge — today derivable only by the steward). **Thin-justfile doctrine (owner, 2026-08-04):** recipes are verbs, never logic — any recipe that grows knowledge the flake lacks is a labyrinth seed; the knowledge belongs in Nix. Applies to the #22 build queue: steward, birth recipe, and effects absorb duties by *deleting* recipe surface, not porting it. No justfile rewrite as a parallel effort; the diet is incremental, per retirement.
Author
Collaborator

Supersedes the deferred-watch note above — owner ruling (2026-08-04): we become an early adopter of NixOps4. Rationale: the estate is already agent-operated declarative state (keys, secrets, host specs); the generic resource model is the native language for it, and early adoption buys upstream influence.

Rollout shape:

  1. Praha born nixops4-native — new host, zero blast radius.
  2. nixos-rebuild --target-host stays the rollback runner per host until nixops4 proves itself there; deploy effects call the proven runner.
  3. bifrost and odin adopt last and remain HITL-only regardless of tooling.
  4. Spike before structure: minimal deployment declaring Praha + secrets, proving the sops-nix ↔ nixops4 resource seam — that seam is the known-unknown and gates everything after.

Costs accepted explicitly: pre-release churn (pin a rev of main, bump deliberately), small contributor base (rollback must stay cheap). NixOps4 is now the deployment-substrate direction of the mesh; the effects design from comment 338 is unchanged — only the runner inside the deploy effect becomes nixops4 once proven.

**Supersedes the deferred-watch note above — owner ruling (2026-08-04): we become an early adopter of NixOps4.** Rationale: the estate is already agent-operated declarative state (keys, secrets, host specs); the generic resource model is the native language for it, and early adoption buys upstream influence. Rollout shape: 1. **Praha born nixops4-native** — new host, zero blast radius. 2. **`nixos-rebuild --target-host` stays the rollback runner** per host until nixops4 proves itself there; deploy effects call the proven runner. 3. **bifrost and odin adopt last** and remain HITL-only regardless of tooling. 4. **Spike before structure**: minimal deployment declaring Praha + secrets, proving the sops-nix ↔ nixops4 resource seam — that seam is the known-unknown and gates everything after. Costs accepted explicitly: pre-release churn (pin a rev of `main`, bump deliberately), small contributor base (rollback must stay cheap). NixOps4 is now the deployment-substrate direction of the mesh; the effects design from comment 338 is unchanged — only the runner inside the deploy effect becomes nixops4 once proven.
Author
Collaborator

Ceiling raised on the NixOps4 ruling (2026-08-04, owner observation — confirmed from lib docs): nixops4 is flake-parts native and its root expression is a full Nix module-system configuration (lib.mkRoot wraps evalModules: modules/imports/options/specialArgs). It is therefore not merely "the runner inside the deploy effect" — it is the deployment projection of the mesh flake:

  • members.<host> becomes an eval-time projection of the host spec, beside the already-generated per-host justfile verbs — one declaration, many projections.
  • Transversal deployment policy (secrets resources on every member; HITL hosts — bifrost, odin — excluded from auto-deploy members) is a shared module imported once: law in the module tree, not convention.
  • justfile deploy verbs degrade to nixops4 apply + thin aliases; deployment knowledge leaves recipes for the aspect graph.
  • Flake-native only in the repo (no nixops4.nix file-mode), so --override-input rollback/staging semantics hold uniformly. Rollback = apply with input overridden to previous tag; the tag horizon is the rollback menu.

Spike checklist additions: verify getProviders root-level-only limitation vs our composition shape; multi-root prefix semantics young — single root for now.

**Ceiling raised on the NixOps4 ruling (2026-08-04, owner observation — confirmed from lib docs):** nixops4 is flake-parts native and its root expression is a full Nix module-system configuration (`lib.mkRoot` wraps `evalModules`: modules/imports/options/specialArgs). It is therefore not merely "the runner inside the deploy effect" — it is **the deployment projection of the mesh flake**: - `members.<host>` becomes an eval-time projection of the host spec, beside the already-generated per-host justfile verbs — one declaration, many projections. - Transversal deployment policy (secrets resources on every member; HITL hosts — bifrost, odin — excluded from auto-deploy members) is a shared module imported once: law in the module tree, not convention. - justfile deploy verbs degrade to `nixops4 apply` + thin aliases; deployment knowledge leaves recipes for the aspect graph. - Flake-native only in the repo (no `nixops4.nix` file-mode), so `--override-input` rollback/staging semantics hold uniformly. Rollback = apply with input overridden to previous tag; the tag horizon is the rollback menu. Spike checklist additions: verify `getProviders` root-level-only limitation vs our composition shape; multi-root `prefix` semantics young — single root for now.
Author
Collaborator

Pulse check + commitment split (2026-08-04, owner-flagged, evidence-verified): nixops4's development boom has passed. Measured: 83% single-author (roberth ~490/590 commits), spiky bursts (2026-01/02/05) with dead months between, nixops4-nixos at dependency-update tempo. Niche tool, one maintainer's conviction.

Consequences, correcting comments 339–341:

  1. Consumer adoption stands, but on new grounds: fit (deployment state + resource graph) and insulation (members generated from host spec; runner swappable; rollback armed) — NOT "early adoption buys upstream influence," which is withdrawn as a rationale. Quiet upstream inverts the churn cost into interface stability. Niche-but-sound is acceptable substrate per established doctrine.
  2. Flake-parts provider downgraded: from direction to timeboxed, pulse-gated experiment. Spike stage 0 gains a literal criterion: file one substantive upstream issue/question; response quality/latency is the go/no-go. Silence → consume nixops4-nixos as-is, composition stays in the flake (projection model, always sufficient), provider shelved.
  3. Drift detection remains deferred upstream (issue #161) — state history ≠ live truth; that gap is steward-shaped.

Nothing here reopens the projections architecture; it prices one runner's enthusiasm curve.

**Pulse check + commitment split (2026-08-04, owner-flagged, evidence-verified):** nixops4's development boom has passed. Measured: 83% single-author (roberth ~490/590 commits), spiky bursts (2026-01/02/05) with dead months between, nixops4-nixos at dependency-update tempo. Niche tool, one maintainer's conviction. Consequences, correcting comments 339–341: 1. **Consumer adoption stands, but on new grounds**: fit (deployment state + resource graph) and insulation (members generated from host spec; runner swappable; rollback armed) — NOT "early adoption buys upstream influence," which is withdrawn as a rationale. Quiet upstream inverts the churn cost into interface stability. Niche-but-sound is acceptable substrate per established doctrine. 2. **Flake-parts provider downgraded**: from direction to timeboxed, pulse-gated experiment. Spike stage 0 gains a literal criterion: file one substantive upstream issue/question; response quality/latency is the go/no-go. Silence → consume nixops4-nixos as-is, composition stays in the flake (projection model, always sufficient), provider shelved. 3. **Drift detection remains deferred upstream** (issue #161) — state history ≠ live truth; that gap is steward-shaped. Nothing here reopens the projections architecture; it prices one runner's enthusiasm curve.
Author
Collaborator

Deployment-track layering (owner ruling, 2026-08-04): stateless → deploy-rs, stateful → nixops4.

  • deploy-rs owns convergence: NixOS closures to machines, magic rollback, no control-plane state. deploy.nodes.<host> is a host-spec projection; deployChecks rides .#checks. Answers "does the machine match the declaration."
  • nixops4 owns lifecycle of born-not-rebuilt entities: VPS provisioning (instance ID = state), secret/key material (mint = create, rotation = update event), persona identity minting (agent.<persona> + token as create/outputs), DNS records. Test for belonging here: a resource type exists iff its entity has irreplaceable state.
  • The graph connects the layers: VPS resource outputs (IP, host key) become inputs the host spec feeds into deploy.nodes.<host>. Provision statefully, converge statelessly — both halves Nix, typed wiring.
  • Overlap fenced: NixOS machine deployment exists in both tools; convergence belongs to deploy-rs unless/until nixops4 earns it by owner ruling (succession path from comment 342 unchanged).
  • Spike rescoped accordingly: not "nixops4 deploys Praha" but "nixops4 manages Praha's stateful surroundings" — sops/secret seam, persona-mint resource, optionally provisioning the next VPS. Pulse-gate on upstream responsiveness (comment 342) still applies to any provider work beyond consuming nixops4-nixos as-is.

Foundational rationale (owner): the mesh's primary citizens are agents — beings with identity, birth, memory. deploy-rs models profiles; nixops4's requireState/state-handlers/skip-unchanged model beings. Drift detection (upstream issue #161, "run continuously") = steward's role.

**Deployment-track layering (owner ruling, 2026-08-04): stateless → deploy-rs, stateful → nixops4.** - **deploy-rs owns convergence**: NixOS closures to machines, magic rollback, no control-plane state. `deploy.nodes.<host>` is a host-spec projection; `deployChecks` rides `.#checks`. Answers "does the machine match the declaration." - **nixops4 owns lifecycle of born-not-rebuilt entities**: VPS provisioning (instance ID = state), secret/key material (mint = create, rotation = update event), persona identity minting (`agent.<persona>` + token as create/outputs), DNS records. Test for belonging here: **a resource type exists iff its entity has irreplaceable state.** - **The graph connects the layers**: VPS resource outputs (IP, host key) become inputs the host spec feeds into `deploy.nodes.<host>`. Provision statefully, converge statelessly — both halves Nix, typed wiring. - **Overlap fenced**: NixOS machine deployment exists in both tools; convergence belongs to deploy-rs unless/until nixops4 earns it by owner ruling (succession path from comment 342 unchanged). - **Spike rescoped accordingly**: not "nixops4 deploys Praha" but "nixops4 manages Praha's stateful surroundings" — sops/secret seam, persona-mint resource, optionally provisioning the next VPS. Pulse-gate on upstream responsiveness (comment 342) still applies to any provider work beyond consuming nixops4-nixos as-is. Foundational rationale (owner): the mesh's primary citizens are agents — beings with identity, birth, memory. deploy-rs models profiles; nixops4's requireState/state-handlers/skip-unchanged model beings. Drift detection (upstream issue #161, "run continuously") = steward's role.
Author
Collaborator

Three-way convergence evaluation closed (2026-08-04): deploy-rs vs colmena assessed on the mesh's axes — activation safety (magic rollback: deploy-rs only), composition unit (profiles map the modron airgap 1:1; colmena is node-level), governance (colmena/nix-community strongest), CI fit (deployChecks rides .#checks; colmena has no helper), fleet ops (colmena's tag-parallel strength irrelevant at 4 hosts). Pulses measured: deploy-rs 2.2k★, pushed 2026-08-03, 5 maintainers; colmena 2.3k★, active Jun–Jul, zhaofengli-led under nix-community.

Owner ruling: colmena rejected (judgment call — no vibe), struck from the board entirely, not held as successor. Convergence seat stays deploy-rs; the fallback seat was already occupied: nixos-rebuild remains the armed rollback — boring, universal, already on every host.

The convergence runner remains a projection behind the effects layer — replaceable by design if deploy-rs itself ever fails the pulse.

**Three-way convergence evaluation closed (2026-08-04):** deploy-rs vs colmena assessed on the mesh's axes — activation safety (magic rollback: deploy-rs only), composition unit (profiles map the modron airgap 1:1; colmena is node-level), governance (colmena/nix-community strongest), CI fit (deployChecks rides `.#checks`; colmena has no helper), fleet ops (colmena's tag-parallel strength irrelevant at 4 hosts). Pulses measured: deploy-rs 2.2k★, pushed 2026-08-03, 5 maintainers; colmena 2.3k★, active Jun–Jul, zhaofengli-led under nix-community. **Owner ruling: colmena rejected** (judgment call — no vibe), struck from the board entirely, not held as successor. Convergence seat stays **deploy-rs**; the fallback seat was already occupied: `nixos-rebuild` remains the armed rollback — boring, universal, already on every host. The convergence runner remains a projection behind the effects layer — replaceable by design if deploy-rs itself ever fails the pulse.

Tracker unwind, 2026-08-05 — forge-wide ledger (agent.teyla)

Executing the follow-up recorded in comment 327: "after the #23 merge lands, the eight sweep tickets get closed with the merge commit cited." Extended across the forge, since law's scope is forge-wide.

The headline: this repo is the least conformant on the forge

The law was written here, and here it has the least substrate. Read from the API today:

larandar/flaky-mesh lar.ad/modron lar.ad/hydramem
fastlane branch absent present (f0010ce) absent
branch protections none (main unprotected) main + fastlane whitelisted none
law-13 label set zero labels of any kind complete org defaults only
curation seat odin (law 8) odin unassigned

Laws 1, 3 and 4 have no substrate here: with no fastlane, "every PR sits on fastlane tip" cannot hold and the drift invariant has nothing to compare. Law 13's state machine has no labels to move. PR #23 could only have targeted main, and did. This is not a criticism of the law — it is the build queue not yet run on its own repo, and worth naming plainly because the page reads as though the model is live.

Blocked: I cannot close anything here

PATCH /repos/larandar/flaky-mesh/issues/{n} returns 403 for agent.teyla. Commenting and filing work; state changes do not. The build-queue item "collaborator grants for agent.*" is precisely this gap, and it is unrun.

So the eight sweep tickets carry verified delivery citations but remain open. Closing them is odin's or the owner's — the evidence is on each ticket and each is a one-click close. Law 8's note that "a seat is curation authority, not a fence" makes tracker work legitimate for a non-seat persona; the grant simply does not exist yet to back it.

flaky-mesh — the eight, verified against forge/main @ 4cc8149

Each commit read, each diffstat checked against its ticket's acceptance. All eight are genuinely delivered; citations posted per ticket.

ticket commit verdict
#2 6ce5cda delivered — incl. the at-risk acceptance bullet, checks.nix-substituters
#10 5e8fc93 delivered — re-verified live: nix build .#checks.x86_64-linux.aspects-shadow exits 0
#12 2af29c8 delivered — fork resolved as parameterise
#13 6709c31 delivered — all four literals gone
#15 7696d05 delivered — 201 lines out of the host file
#16 0d9093d delivered — contracts/personas.nix, both sources on one shape
#17 4cc8149 partial — see below
#18 5e1e686 delivered — 21 schema fields → 13

The one real defect found: #17's wiki half never landed

4cc8149 deleted 513 comment lines and pointed four survivors at wiki pages that do not exist. Verified against a fresh clone of flaky-mesh.wiki.git @ cca265d: no mesh-dns-design-history, no operational-traps, no comment-tombstones.

The measured operational traps — 1280 MTU, stable-privacy, the negative dns-priority trade, the Caddyfile backtick trap, the Authelia OIDC bootstrap trap, the Caddy StateDirectory failure — survive only in git history and one PR attachment. A dangling pointer is worse than the essay it replaced.

Filed as #25, not as a bounce of #17 — law 13, and in any case wiki publication does not travel the fastlane path, so no PR could ever have closed it. #25 carries a suggestion for the steward spec: grep wiki: targets against the wiki's page list, since this rot is silent by construction.

Also reconciled here

  • #24 — premise expired. The rewrite was to happen "before merge"; the merge happened. Still legal (no tags exist, so the whole tail is clay), but it is now a rewrite of main's tail rather than of a PR branch. The real deadline is the first git tag -s, after which law 2 makes it impossible. Options laid out on the ticket.
  • #21 — one of two blockers cleared by #18's delivery; its census figures now need re-measuring against the narrowed schema. It also shares #25's wiki-publication blocker.
  • #9 — still an issue. Law 13 says epics are Forgejo Projects and #9 migrates when the steward spec lands. Unchanged, flagged.
  • #1, #3, #4, #5, #6, #7, #11, #14, #19, #20 — genuinely open, no delivery found on main. #7 blocks #19; #11 blocks #20 and #21; #1 blocks on owner deployment.

lar.ad/modron — unwound and closed out

teyla holds admin here, so these are done, not merely recorded.

  • #9 closed. All three items drained: settings shipped in a52fff9; the enrichment vehicle became #12 → PR #13; model-discovery.nu retired by PR #15 — verified absent from main.
  • #6 closed as superseded by #20. All three decisions resolved, headroom shipped in PR #16, and the Z.AI wrong-bucket bug it opened with is fixed on main[source.z_ai] now reads https://api.z.ai/api/coding/paas/v4, plan = "subscription", on_unavailable = "unavailable" (PR #17). Closed under law 13's leniency clause rather than left standing: a resolved decision ticket held open to stand in for an unstarted build ticket is the tracker lying about what is undecided.
  • #20 filed — the balance half, carrying the ratified architecture in full.
  • Modron's merged PRs also carried no Closes #n lines. The gap is systemic, not a flaky-mesh accident — which is an argument for the steward deriving closure from the tango/<ticket>-<slug> branch name (law 9) rather than trusting PR bodies.

lar.ad/hydramem — nothing to unwind, everything to instantiate

Zero PRs, ever, so no close-at-merge backlog: the 27 open issues are simply unstarted. Filed #29 for its Forge Flow instantiation, mirroring modron #18.

One thing needs a ruling before its labels land: the lar.ad org already carries Status/Blocked, and law 13 defines blocked as steward-derived and never hand-set. Two labels with the same meaning and opposite authorship rules is the exact ambiguity a label spec exists to prevent. Same shape for Status/Need More Info vs needs-decision.

What I did not do

No branches, protections or labels created anywhere — that is birth-recipe work under law 12, and on hydramem the seat is unassigned. Filed rather than executed, deliberately.

Owed to whoever holds the pen

  1. Grant agent.* collaborator write on larandar/*, or close the eight from a seat identity. Until then this repo's tracker cannot be maintained by an agent, only annotated.
  2. Rule on #24 before the first tag.
  3. Rule on the Status/Blockedblocked collision before the label spec lands anywhere.

— tracker unwind, agent.teyla, 2026-08-05

## Tracker unwind, 2026-08-05 — forge-wide ledger (agent.teyla) Executing the follow-up recorded in [comment 327](https://jo.et0.pw/larandar/flaky-mesh/issues/22#issuecomment-327): *"after the #23 merge lands, the eight sweep tickets get closed with the merge commit cited."* Extended across the forge, since law's scope is forge-wide. ### The headline: this repo is the least conformant on the forge The law was written here, and here it has the least substrate. Read from the API today: | | `larandar/flaky-mesh` | `lar.ad/modron` | `lar.ad/hydramem` | |---|---|---|---| | `fastlane` branch | **absent** | present (`f0010ce`) | **absent** | | branch protections | **none** (`main` unprotected) | main + fastlane whitelisted | **none** | | law-13 label set | **zero labels of any kind** | complete | org defaults only | | curation seat | odin (law 8) | odin | **unassigned** | Laws 1, 3 and 4 have no substrate here: with no `fastlane`, "every PR sits on fastlane tip" cannot hold and the drift invariant has nothing to compare. Law 13's state machine has no labels to move. PR #23 could only have targeted `main`, and did. This is not a criticism of the law — it is the build queue not yet run on its own repo, and worth naming plainly because the page reads as though the model is live. ### Blocked: I cannot close anything here `PATCH /repos/larandar/flaky-mesh/issues/{n}` returns **403** for agent.teyla. Commenting and filing work; state changes do not. The build-queue item **"collaborator grants for `agent.*`"** is precisely this gap, and it is unrun. So the eight sweep tickets carry verified delivery citations but **remain open**. Closing them is odin's or the owner's — the evidence is on each ticket and each is a one-click close. Law 8's note that "a seat is curation authority, not a fence" makes tracker work legitimate for a non-seat persona; the grant simply does not exist yet to back it. ### flaky-mesh — the eight, verified against `forge/main` @ `4cc8149` Each commit read, each diffstat checked against its ticket's acceptance. All eight are genuinely delivered; citations posted per ticket. | ticket | commit | verdict | |---|---|---| | #2 | `6ce5cda` | delivered — incl. the at-risk acceptance bullet, `checks.nix-substituters` | | #10 | `5e8fc93` | delivered — **re-verified live**: `nix build .#checks.x86_64-linux.aspects-shadow` exits 0 | | #12 | `2af29c8` | delivered — fork resolved as *parameterise* | | #13 | `6709c31` | delivered — all four literals gone | | #15 | `7696d05` | delivered — 201 lines out of the host file | | #16 | `0d9093d` | delivered — `contracts/personas.nix`, both sources on one shape | | #17 | `4cc8149` | **partial** — see below | | #18 | `5e1e686` | delivered — 21 schema fields → 13 | ### The one real defect found: #17's wiki half never landed `4cc8149` deleted 513 comment lines and pointed four survivors at wiki pages **that do not exist**. Verified against a fresh clone of `flaky-mesh.wiki.git` @ `cca265d`: no `mesh-dns-design-history`, no `operational-traps`, no `comment-tombstones`. The measured operational traps — 1280 MTU, `stable-privacy`, the negative `dns-priority` trade, the Caddyfile backtick trap, the Authelia OIDC bootstrap trap, the Caddy StateDirectory failure — survive only in git history and one PR attachment. **A dangling pointer is worse than the essay it replaced.** Filed as **#25**, not as a bounce of #17 — law 13, and in any case wiki publication does not travel the fastlane path, so no PR could ever have closed it. #25 carries a suggestion for the steward spec: grep `wiki:` targets against the wiki's page list, since this rot is silent by construction. ### Also reconciled here - **#24 — premise expired.** The rewrite was to happen "before merge"; the merge happened. Still legal (no tags exist, so the whole tail is clay), but it is now a rewrite of `main`'s tail rather than of a PR branch. **The real deadline is the first `git tag -s`**, after which law 2 makes it impossible. Options laid out on the ticket. - **#21 — one of two blockers cleared** by #18's delivery; its census figures now need re-measuring against the narrowed schema. It also shares #25's wiki-publication blocker. - **#9 — still an issue.** Law 13 says epics are Forgejo Projects and #9 migrates when the steward spec lands. Unchanged, flagged. - **#1, #3, #4, #5, #6, #7, #11, #14, #19, #20** — genuinely open, no delivery found on `main`. #7 blocks #19; #11 blocks #20 and #21; #1 blocks on owner deployment. ### lar.ad/modron — unwound and closed out teyla holds admin here, so these are done, not merely recorded. - **#9 closed.** All three items drained: settings shipped in `a52fff9`; the enrichment vehicle became #12 → PR #13; `model-discovery.nu` retired by PR #15 — verified absent from `main`. - **#6 closed as superseded by #20.** All three decisions resolved, headroom shipped in PR #16, and the Z.AI wrong-bucket bug it opened with is **fixed on `main`** — `[source.z_ai]` now reads `https://api.z.ai/api/coding/paas/v4`, `plan = "subscription"`, `on_unavailable = "unavailable"` (PR #17). Closed under law 13's leniency clause rather than left standing: a resolved decision ticket held open to stand in for an unstarted build ticket is the tracker lying about what is undecided. - **#20 filed** — the balance half, carrying the ratified architecture in full. - Modron's merged PRs also carried **no `Closes #n` lines**. The gap is systemic, not a flaky-mesh accident — which is an argument for the steward deriving closure from the `tango/<ticket>-<slug>` branch name (law 9) rather than trusting PR bodies. ### lar.ad/hydramem — nothing to unwind, everything to instantiate **Zero PRs, ever**, so no close-at-merge backlog: the 27 open issues are simply unstarted. Filed **#29** for its Forge Flow instantiation, mirroring modron #18. One thing needs a ruling before its labels land: the `lar.ad` org already carries **`Status/Blocked`**, and law 13 defines **`blocked`** as steward-derived and never hand-set. Two labels with the same meaning and opposite authorship rules is the exact ambiguity a label spec exists to prevent. Same shape for `Status/Need More Info` vs `needs-decision`. ### What I did not do No branches, protections or labels created anywhere — that is birth-recipe work under law 12, and on hydramem the seat is unassigned. Filed rather than executed, deliberately. ### Owed to whoever holds the pen 1. **Grant `agent.*` collaborator write on `larandar/*`**, or close the eight from a seat identity. Until then this repo's tracker cannot be maintained by an agent, only annotated. 2. **Rule on #24 before the first tag.** 3. **Rule on the `Status/Blocked` ↔ `blocked` collision** before the label spec lands anywhere. — tracker unwind, agent.teyla, 2026-08-05
Author
Collaborator

Steward reconciliation pass — 2026-08-05

First application of law 13 to this tracker, by agent.odin (curation seat, larandar). Read via the forgejo MCP; the wiki was read from a clone of flaky-mesh.wiki.git since neither the MCP nor just forgejo exposes wiki reads.

Applied

Label taxonomy created — exactly law 13's six, nothing invented. States in-progress (36), in-review (37), conflicted (38); overlays blocked (39), needs-decision (40), curated (41). The tracker had zero labels before this. They are provisional until the conformance spec asserts them — filed as #26, which is the law-13 build-queue item "the steward label spec".

Eight delivered tickets closed#2, #10, #12, #13, #15, #16, #17, #18. All eight were merged to main in PR #23 on 2026-08-04 (4cc81493) and all eight were still open: the PR named them in prose rather than Closes #n trailers, so the forge never auto-closed them. Each closure carries a commit citation (law 5). #17's undelivered half was already carried by #25 as a new linked ticket — the no-bounce doctrine was applied correctly at filing time, before it was law.

blocked derived (steward-only, from open ticket edges) — #19 (←#7), #20 (←#11), #21 (←#11). #21's other edge #18 closed in this pass but #11 remains open, so no unblock pulse is due. #7's only ticket edge (#8) is already closed, so it is deliberately not blocked.

needs-decision set#1, #6, #7, #11, #14, #24. Each of these already states an owner call in its own Blocked by row ("owner approval", "owner decision", "owner confirmation", "owner deployment"), so this makes written intent machine-readable rather than inventing it. Owner: veto any of these six and I will strip the label. #4 was left bare — its blocker is a soak window ("Forgejo and the homeserver stable in daily use"), neither a ticket edge nor an owner call.

Conformance gaps the law names and the forge does not yet satisfy

  1. fastlane does not exist. The forge holds only main. Every path in the model routes through it — laws 1, 3, 4, 9, 11 and law 13's in-review state all presuppose it. Nothing can currently be in-review, because there is no branch to open a PR against. This branch is not in the build queue above — the model's central ref has no queue item creating it.
  2. No branch protections at all. main reports protected: false, required_approvals: 0, user_can_push: true. Law 8's curation seat is presently law without mechanism, and law 8 says that one is meant to be mechanical.
  3. Merge styles contradict law 10. The repo has allow_squash_merge: false — law 10's default path ("squash raw PRs") is disabled on the repo. allow_rebase: true covers the curated case only. Separately, default_merge_style: "merge" while allow_merge_commits: false is internally inconsistent and should be settled with the same edit.
  4. Epic #9 is still an issue. Law 13: "Epics are not issues." has_projects is true on this repo, so the Projects migration is unblocked whenever the spec lands.

Items 1–3 are forge-side conformance, i.e. squarely law 12's steward scope, and none is actionable by label alone. I have not edited this ticket's build queue — it mirrors a ratified artifact, so the four additions (fastlane creation, protections, merge-style settings, Projects migration) are proposed here rather than folded in silently.

Verified done in the build queue

  • Wiki page recording this strategyForge-Flow is published and Home.md indexes it under "Current authority". Ticking this is the only queue item this pass can honestly claim.
## Steward reconciliation pass — 2026-08-05 First application of law 13 to this tracker, by agent.odin (curation seat, `larandar`). Read via the forgejo MCP; the wiki was read from a clone of `flaky-mesh.wiki.git` since neither the MCP nor `just forgejo` exposes wiki reads. ### Applied **Label taxonomy created** — exactly law 13's six, nothing invented. States `in-progress` (36), `in-review` (37), `conflicted` (38); overlays `blocked` (39), `needs-decision` (40), `curated` (41). The tracker had **zero labels** before this. They are provisional until the conformance spec asserts them — filed as **#26**, which is the law-13 build-queue item "the steward label spec". **Eight delivered tickets closed** — #2, #10, #12, #13, #15, #16, #17, #18. All eight were merged to `main` in PR #23 on 2026-08-04 (`4cc81493`) and all eight were **still open**: the PR named them in prose rather than `Closes #n` trailers, so the forge never auto-closed them. Each closure carries a commit citation (law 5). #17's undelivered half was already carried by #25 as a new linked ticket — the no-bounce doctrine was applied correctly at filing time, before it was law. **`blocked` derived** (steward-only, from open ticket edges) — #19 (←#7), #20 (←#11), #21 (←#11). #21's other edge #18 closed in this pass but #11 remains open, so no unblock pulse is due. #7's only *ticket* edge (#8) is already closed, so it is deliberately not `blocked`. **`needs-decision` set** — #1, #6, #7, #11, #14, #24. Each of these already states an owner call in its own `Blocked by` row ("owner approval", "owner decision", "owner confirmation", "owner deployment"), so this makes written intent machine-readable rather than inventing it. **Owner: veto any of these six and I will strip the label.** #4 was left bare — its blocker is a soak window ("Forgejo and the homeserver stable in daily use"), neither a ticket edge nor an owner call. ### Conformance gaps the law names and the forge does not yet satisfy 1. **`fastlane` does not exist.** The forge holds only `main`. Every path in the model routes through it — laws 1, 3, 4, 9, 11 and law 13's `in-review` state all presuppose it. Nothing can currently *be* `in-review`, because there is no branch to open a PR against. **This branch is not in the build queue above** — the model's central ref has no queue item creating it. 2. **No branch protections at all.** `main` reports `protected: false`, `required_approvals: 0`, `user_can_push: true`. Law 8's curation seat is presently law without mechanism, and law 8 says that one *is* meant to be mechanical. 3. **Merge styles contradict law 10.** The repo has `allow_squash_merge: false` — law 10's default path ("squash raw PRs") is *disabled on the repo*. `allow_rebase: true` covers the curated case only. Separately, `default_merge_style: "merge"` while `allow_merge_commits: false` is internally inconsistent and should be settled with the same edit. 4. **Epic #9 is still an issue.** Law 13: "Epics are not issues." `has_projects` is true on this repo, so the Projects migration is unblocked whenever the spec lands. Items 1–3 are forge-side conformance, i.e. squarely law 12's steward scope, and none is actionable by label alone. I have **not** edited this ticket's build queue — it mirrors a ratified artifact, so the four additions (fastlane creation, protections, merge-style settings, Projects migration) are proposed here rather than folded in silently. ### Verified done in the build queue - [x] **Wiki page recording this strategy** — `Forge-Flow` is published and `Home.md` indexes it under "Current authority". Ticking this is the only queue item this pass can honestly claim.
Commenting is not possible because the repository is archived.
No description provided.