Skip to content

feat(queue): add mazet to the auto-merge set - #73

Merged
LeTuR merged 2 commits into
mainfrom
feat/auto-merge-mazet
Sep 11, 2026
Merged

feat(queue): add mazet to the auto-merge set#73
LeTuR merged 2 commits into
mainfrom
feat/auto-merge-mazet

Conversation

@LeTuR

@LeTuR LeTuR commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Intent

Let fleet's shepherd merge pull requests in github.com/LeTuR/mazet, now that the remote takes squash. Add exactly one entry — github.com/LeTuR/mazet, host-qualified — to AUTO_MERGE_REPOS in scripts/lib/queue.py, and make every place that states the set agree with the code: .agents/skills/fleet-queue/SKILL.md names all three repositories in prose and must now name four. AGENTS.md and FLEET.md were checked and refer to the set generically with a format example rather than enumerating it, so they deliberately stay untouched.

The remote was the blocker and is not any more: mazet allowed rebase merging only until 2026-09-11, and MERGE_METHOD is squash, so every shepherd pass would have produced a recorded refusal rather than a merge. It now reports allow_squash_merge true with rebase and merge-commit both false, delete_branch_on_merge true, and PR_TITLE/PR_BODY as the squash commit title and message — the same shape as fleet's own remotes. Its .no-mistakes.yaml and three CI workflows were verified against the live repository, which is what the code comment's stated test for adding an entry asks for.

Deliberate constraints from the task, so a reviewer does not read them as omissions:

  • Nothing else in the merge gate may move. MERGE_METHOD, the no-mistakes attestation gate for the current head, the head-branch check, the pusher check and the checks-passed condition are all untouched; this widens the allowlist by one entry and nothing else.
  • Entries stay host-qualified. A bare LeTuR/mazet must keep being refused rather than matched against a slug.
  • FLEET_AUTO_MERGE_REPOS keeps REPLACING the set rather than adding to it.
  • scripts/queue.sh stays the only writer over the queue's records.

Testing was written first and observed to fail for the right reason before the allowlist changed (the shepherd printed 'fleet does not merge in LeTuR/mazet on github.com; this one is yours'). The new queue-selftest.sh section 9j extends what 9i already asserts rather than adding a parallel check: an attested, green mazet pull request is merged by squash through the stubbed forge, an unvetted one is still handed back, a bare LeTuR/mazet in FLEET_AUTO_MERGE_REPOS is refused, and the default set is read back through auto_merge_repos() and every entry put through forge.RepoId.parse. That last assertion exists because the literal in queue.py is never parsed at runtime — only the environment override is — so a bare slug written into the set would match nothing, refuse nothing, and otherwise fail no test.

./scripts/check.sh was run to completion locally and exited 0, including the queue and skills checks.

Repository convention note: CONTRIBUTING.md says pull request titles are conventional and scopeless, but the whole recent history is scoped and the direct precedent for this change is 'feat(queue): add thurbox to the auto-merge set (#64)'. The scoped form was chosen to match the history.

A previous run of this same change (01M28VSQMRZCP0PFYGKMW6XBS9) passed intent, rebase, review and test, then failed at the document step because the pipeline agent exited 1 on a usage limit. Nothing was pushed and its rebased head is no longer reachable as an object, so this is a resubmission of the identical commit, not new work.

What Changed

  • AUTO_MERGE_REPOS in scripts/lib/queue.py gains one host-qualified entry, github.com/LeTuR/mazet, so queue.sh shepherd merges there instead of recording a refusal; the comment above the set records why the remote was the blocker (it allowed rebase only, against a squash MERGE_METHOD) and no other gate moved.
  • queue-selftest.sh grows section 9j: against the stubbed forge, an attested green mazet pull request is merged with --squash --delete-branch, an unattested one is handed back unmerged, a bare LeTuR/mazet in FLEET_AUTO_MERGE_REPOS is refused rather than matched, and the whole set is read back through auto_merge_repos() with every entry put through forge.RepoId.parse — the literal in queue.py is never parsed at runtime, so an unqualified slug there would otherwise fail no test.
  • Section 14 no longer asserts the merge set by enumerating its members; it now checks only that discovering a GitLab instance added nothing to it, and the fleet-queue skill's prose naming the set lists four repositories instead of three.

Risk Assessment

✅ Low: The behavioral change is a single host-qualified entry added to an existing allowlist with every merge gate untouched, backed by a new selftest section that mirrors the precedent set by the previous addition; the only issues found are minor weaknesses in test assertion strength.

Testing

The configured ./scripts/check.sh baseline had already passed; on top of it I re-ran the queue check and the queue selftest directly (both exit 0, with the nine new section 9j assertions and the five reworked section 14 assertions green), then drove ./scripts/queue.sh shepherd end-to-end three times against throwaway queues with a stand-in forge CLI to capture reviewer-readable transcripts: the before-state where mazet is handed back, the after-state where an attested green mazet pull request is squash-merged with the branch deleted and publish.state = merged persisted onto the task, and an adversarial pass showing the stale-attestation, no-push-access, failed-checks and fork gates all still refusing on the newly allowlisted repo. The bare-slug override is refused and merges nothing, and the environment override still replaces the shipped set. The change has no UI surface, so the evidence is CLI transcripts and persisted queue state rather than screenshots. Two things were not driven live: a merge against the live repository, which would irreversibly merge a real pull request (its premise — squash-only merging, delete-on-merge, PR_TITLE/PR_BODY, a .no-mistakes.yaml and three active workflows — was instead confirmed read-only against the real remote); and the agreement between the documentation that enumerates the set and the code, which was read rather than exercised and therefore carries no live result.

  • Live validation: ✅ go - 9 of 11 scenarios driven live against the product
Scenario Result Live Evidence
An attested, green pull request on github.com/LeTuR/mazet is squash-merged unattended by the shepherd, with the branch deleted ✅ pass live ./scripts/queue.sh shepherd --topic mazet-live against a throwaway queue; the row reads merged: squash-merged, branch deleted, the shepherd issued `gh pr merge https://github.com/LeTuR/mazet/pull/…
Before the entry existed the same pull request was handed back, not merged (the regression this change fixes) ✅ pass live Same queue, same pull request, run with FLEET_AUTO_MERGE_REPOS='github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview': the row reads `ready: fleet does not merge in LeT…
An unattested mazet pull request is still handed back and given a fixer rather than merged ✅ pass live PR 302 in the same pass: policy: the body carries no no-mistakes attestation then dispatched: Re-open PR #302 through the pipeline, recorded as publish.state = unattested; the merge log names on…
Adversarial: a bare LeTuR/mazet naming no forge is refused rather than matched against the slug ✅ pass live FLEET_AUTO_MERGE_REPOS='LeTuR/mazet' ./scripts/queue.sh shepherd --dry-run prints ignoring 'LeTuR/mazet' — an auto-merge entry must name its forge, the mazet pull request stays `ready: fleet does…
FLEET_AUTO_MERGE_REPOS still replaces the shipped set rather than adding to it ✅ pass live With the override naming the three older repos, the pass's own Merging is limited to line names exactly those three and mazet is excluded despite being in the shipped literal; with no override the l…
Adversarial: every other merge gate still refuses on the newly allowlisted repo ✅ pass live ./scripts/queue.sh shepherd --topic mazet-gates over five mazet pull requests: an attestation for an earlier head is policy and gets a fixer, an author with no push access is not-merged, failing…
The shepherd tells the operator the set is four repositories, every entry host-qualified ✅ pass live The pass's closing line reads Merging is limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview; queue-selftest section 9j reads the…
A discovered second forge adds nothing to the merge set, and the reworked section 14 assertion would catch it if it did ✅ pass live queue-selftest section 14 (real GitLab adapter over recorded glab output) is green on all five assertions including discovering the instance put nothing of it on that set; driving the same line with…
The remote is genuinely no longer the blocker: github.com/LeTuR/mazet allows squash and only squash ✅ pass live Read-only against the live repository: gh api repos/LeTuR/mazet returns allow_squash_merge true, allow_rebase_merge false, allow_merge_commit false, delete_branch_on_merge true, PR_TITLE/PR_BODY; it…
Every place that states the set agrees with the code after the change ⏸️ untested no This was established by reading tracked files with git grep, not by driving the running product, so the prior payload records no live result for it. Documentation consistency has no runtime surface…
A real squash merge performed on the live github.com/LeTuR/mazet repository ⏸️ untested no Driving this needs a genuinely open, attested, green pull request on the public github.com/LeTuR/mazet and authority to merge it; the merge is irreversible and outward-facing, and a test phase should…
Evidence: Shepherd transcript: mazet before and after the allowlist entry


========================================================================
A. BEFORE-STATE: the allowlist as it was, three repos, mazet not on it
   $ FLEET_AUTO_MERGE_REPOS='github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview' \
       ./scripts/queue.sh shepherd --topic mazet-live
========================================================================
shepherd: 3 open pull request(s) on LeTuR/mazet on github.com, someone-else/their-repo on github.com — what it did:

    mazet-live/01-attested  https://github.com/LeTuR/mazet/pull/301
        ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
        ready: fleet does not merge in LeTuR/mazet on github.com; this one is yours
    mazet-live/02-unvetted  https://github.com/LeTuR/mazet/pull/302
        policy: the body carries no no-mistakes attestation, so nothing but its own prose says the pipeline ever ran
        dispatched: Re-open PR #302 through the pipeline -> f1xe4000-0000-0000-0000-000000000001
    mazet-live/03-elsewhere  https://github.com/someone-else/their-repo/pull/401
        foreign: its head branch is in LeTuR's repository, not someone-else/their-repo on github.com — fleet neither merges nor sends an agent at a pull request that is not ours
        left-alone: not ours; fleet only merges and only fixes its own

shepherd: 1 dispatched, 1 left-alone, 1 ready
          Fixers are working in place on the existing branches; nothing forked.
          Merging is limited to github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview, and only for a pull request whose
          head branch is in that repo, that someone who can push there opened, that
          carries a no-mistakes attestation for its CURRENT head, whose checks passed,
          and that the forge itself calls mergeable.
    run log updated: /tmp/tmp.QBeX93I65r/runs/2026-09-11-mazet-live.md

--- what the forge was asked to merge: (nothing)


========================================================================
B. ADVERSARIAL: a bare LeTuR/mazet in the override, no forge named
   $ FLEET_AUTO_MERGE_REPOS='LeTuR/mazet' ./scripts/queue.sh shepherd --topic mazet-live --dry-run
========================================================================
FLEET_AUTO_MERGE_REPOS: ignoring 'LeTuR/mazet' — an auto-merge entry must name its forge, as in github.com/owner/repo
FLEET_AUTO_MERGE_REPOS: ignoring 'LeTuR/mazet' — an auto-merge entry must name its forge, as in github.com/owner/repo
shepherd: 3 open pull request(s) on LeTuR/mazet on github.com, someone-else/their-repo on github.com — what it would do:

    mazet-live/01-attested  https://github.com/LeTuR/mazet/pull/301
        ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
        ready: fleet does not merge in LeTuR/mazet on github.com; this one is yours
    mazet-live/02-unvetted  https://github.com/LeTuR/mazet/pull/302
        policy: the body carries no no-mistakes attestation, so nothing but its own prose says the pipeline ever ran
        would-dispatch: Re-open PR #302 through the pipeline (a fresh session on the branch)
    mazet-live/03-elsewhere  https://github.com/someone-else/their-repo/pull/401
        foreign: its head branch is in LeTuR's repository, not someone-else/their-repo on github.com — fleet neither merges nor sends an agent at a pull request that is not ours
        left-alone: not ours; fleet only merges and only fixes its own

shepherd: 1 left-alone, 1 ready, 1 would-dispatch
          Merging is limited to , and only for a pull request whose
          head branch is in that repo, that someone who can push there opened, that
          carries a no-mistakes attestation for its CURRENT head, whose checks passed,
          and that the forge itself calls mergeable.


========================================================================
C. THE CHANGE: the default allowlist
   $ ./scripts/queue.sh shepherd --topic mazet-live
========================================================================
shepherd: 3 open pull request(s) on LeTuR/mazet on github.com, someone-else/their-repo on github.com — what it did:

    mazet-live/01-attested  https://github.com/LeTuR/mazet/pull/301
        ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
        merged: squash-merged, branch deleted
    mazet-live/02-unvetted  https://github.com/LeTuR/mazet/pull/302
        policy: the body carries no no-mistakes attestation, so nothing but its own prose says the pipeline ever ran
        dispatched: Re-open PR #302 through the pipeline -> f1xe4000-0000-0000-0000-000000000001
    mazet-live/03-elsewhere  https://github.com/someone-else/their-repo/pull/401
        foreign: its head branch is in LeTuR's repository, not someone-else/their-repo on github.com — fleet neither merges nor sends an agent at a pull request that is not ours
        left-alone: not ours; fleet only merges and only fixes its own

shepherd: 1 dispatched, 1 left-alone, 1 merged
          Fixers are working in place on the existing branches; nothing forked.
          Merging is limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview, and only for a pull request whose
          head branch is in that repo, that someone who can push there opened, that
          carries a no-mistakes attestation for its CURRENT head, whose checks passed,
          and that the forge itself calls mergeable.
    run log updated: /tmp/tmp.QBeX93I65r/runs/2026-09-11-mazet-live.md

--- what the forge was asked to merge (pull request numbers): 301
--- the merge command the shepherd issued:
    gh pr merge https://github.com/LeTuR/mazet/pull/301 --squash --delete-branch
--- what the queue wrote onto each task:
    01-attested
      state=done outcome=shipped
      publish.at = 2026-09-11T21:34:09+00:00
      publish.by = shepherd
      publish.detail = squash-merged, branch deleted
      publish.how = run `/no-mistakes --yes`
      publish.method = no-mistakes
      publish.state = merged
    02-unvetted
      state=queued outcome=None
      publish.at = 2026-09-11T21:34:09+00:00
      publish.by = shepherd
      publish.detail = the body carries no no-mistakes attestation, so nothing but its own prose says the pipeline ever ran
      publish.how = run `/no-mistakes --yes`
      publish.method = no-mistakes
      publish.state = unattested
    03-elsewhere
      state=done outcome=shipped
      publish.at = 2026-09-11T21:34:10+00:00
      publish.by = shepherd
      publish.detail = its head branch is in LeTuR's repository, not someone-else/their-repo on github.com — fleet neither merges nor sends an agent at a pull request that is not ours
      publish.how = run `/no-mistakes --yes`
      publish.method = no-mistakes
      publish.state = unknown
Evidence: Shepherd transcript: every merge gate exercised on the new repo

========================================================================
Every merge gate, on github.com/LeTuR/mazet — the newly allowlisted repo
   $ ./scripts/queue.sh shepherd --topic mazet-gates
========================================================================
shepherd: 5 open pull request(s) on LeTuR/mazet on github.com — what it did:

    mazet-gates/01-stale-attestation  https://github.com/LeTuR/mazet/pull/311
        policy: the no-mistakes attestation is for 00000000, and the head is 00000000 — it attests a push that is no longer what would merge
        dispatched: Re-open PR #311 through the pipeline -> f1xe4000-0000-0000-0000-000000000001
    mazet-gates/02-stranger  https://github.com/LeTuR/mazet/pull/312
        ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
        not-merged: stranger has no access to LeTuR/mazet on github.com — fleet merges unattended only what someone who can push here opened
    mazet-gates/03-checks-failed  https://github.com/LeTuR/mazet/pull/313
        checks-failed: failed checks: CI
        dispatched: Fix the failing checks on PR #313 -> f1xe4000-0000-0000-0000-000000000001
    mazet-gates/04-fork  https://github.com/LeTuR/mazet/pull/314
        foreign: its head branch is in someone-else's fork, not LeTuR/mazet on github.com — fleet neither merges nor sends an agent at a pull request that is not ours
        left-alone: not ours; fleet only merges and only fixes its own
    mazet-gates/05-good  https://github.com/LeTuR/mazet/pull/315
        ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
        merged: squash-merged, branch deleted

shepherd: 2 dispatched, 1 left-alone, 1 merged, 1 not-merged
          Fixers are working in place on the existing branches; nothing forked.
          Merging is limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview, and only for a pull request whose
          head branch is in that repo, that someone who can push there opened, that
          carries a no-mistakes attestation for its CURRENT head, whose checks passed,
          and that the forge itself calls mergeable.
    run log updated: /tmp/tmp.N6cvVamM6I/runs/2026-09-11-mazet-gates.md

--- pull requests the forge was actually asked to merge: 315
--- every merge command issued:
    gh pr merge https://github.com/LeTuR/mazet/pull/315 --squash --delete-branch
Evidence: Live read-only check of the github.com/LeTuR/mazet remote
# The premise of the change, read live off github.com/LeTuR/mazet (read-only)

$ gh api repos/LeTuR/mazet --jq "{merge settings}"
{"allow_merge_commit":false,"allow_rebase_merge":false,"allow_squash_merge":true,"delete_branch_on_merge":true,"squash_merge_commit_message":"PR_BODY","squash_merge_commit_title":"PR_TITLE"}

# fleet only adds a repo whose own pipeline gates it — its .no-mistakes.yaml and CI
$ gh api repos/LeTuR/mazet/contents/.no-mistakes.yaml --jq .content | base64 -d
    # The no-mistakes gate for mazet.
    #
    # `commands.*` are spelled out rather than left for the agent to detect. A gate
    # step has to be deterministic about what it executes: an empty key does not
    # mean "run something small", it means the agent decides what running the tests
    # looks like, and two runs of the same gate can then check different things.
    #
    # These keys are read from the DEFAULT BRANCH, so an edit here takes effect on
    # the change after the one that makes it.
    commands:
      # The whole lint surface CI enforces, in the order that fails cheapest first.
      # The rustdoc check is part of it: a broken intra-doc link is a CI failure
      # like any other, and catching it here is the round-trip this step exists to
      # prevent.
      lint: >-
        cargo fmt --all -- --check
        && cargo clippy --all-targets --all-features -- -D warnings
        && RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --all-features
    
      # Run before the push step commits agent fixes, so formatting never reaches
      # lint dirty and costs an extra auto-fix round.
      format: cargo fmt --all
    
      # The suite, named explicitly. `--all-features` so it matches what clippy and
      # CI compile; the crate is small enough that the build is warm by the time
      # this runs.
      test: cargo test --all-features
    
    # Generated, not authored: reviewing it reviews the resolver, not a decision.
    ignore_patterns:
      - "Cargo.lock"
    
    # Review findings park for a human decision rather than being auto-applied, so
    # this repository does not inherit an operator's global override.
    auto_fix:
      review: 0
    
    # ci.yml sets `cancel-in-progress: true`, so a cancelled check here almost
    # always means a newer push superseded it rather than provider flakiness.
    # Rerunning would restart work that was stopped on purpose.
    ci:
      rerun_transient: 0

$ gh api repos/LeTuR/mazet/actions/workflows --jq ".workflows[] | .name + \"  (\" + .path + \", \" + .state + \")\""
    Release  (.github/workflows/cd.yml, active)
    CI  (.github/workflows/ci.yml, active)
    PR Title  (.github/workflows/pr-title.yml, active)
Evidence: Queue selftest: section 9j and section 14 assertions
$ ./scripts/queue-selftest.sh   (exit 0 — final line: "queue-selftest: every claim holds")

--- section 9j assertions (the new entry) ---
310:  �[32mok�[0m    and by the same squash fleet's own are merged by
333:  �[32mok�[0m    the shepherd reaches mazet at all
334:  �[32mok�[0m    an attested, green mazet pull request is merged unattended
335:  �[32mok�[0m    and by the same squash fleet's own are merged by
336:  �[32mok�[0m    the second addition loosens no gate either: an unattested one is not merged
337:  �[32mok�[0m    a bare LeTuR/mazet is refused, not matched against the slug
338:  �[32mok�[0m    and nothing in mazet would be merged under it
339:  �[32mok�[0m    the allowlist is the four repositories fleet may merge in
340:  �[32mok�[0m    and every entry in it names its forge, so none can match a bare slug

--- section 14 assertions (a discovered second forge adds nothing to the set) ---
715:  �[32mok�[0m    shepherd lists what is open on the discovered instance
716:  �[32mok�[0m    and a mergeable, attested one there is handed back, not merged
717:  �[32mok�[0m    and the pass says what it limits merging to
718:  �[32mok�[0m    because discovering the instance put nothing of it on that set
719:  �[32mok�[0m    so nothing on a discovered host was merged


�[32mqueue-selftest: every claim holds�[0m
Evidence: Section 14's narrowed assertion is sensitive, not vacuous
--- the set as shipped (what section 14 checks against) ---
          Merging is limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview, and only for a pull request whose

--- the same line with a gitlab.example.com repository put on the set ---
          Merging is limited to github.com/LeTuR/mazet, gitlab.example.com/acme/group/widgets, and only for a pull request whose
Evidence: Every tracked place that enumerates the auto-merge set
# Every tracked place that enumerates the auto-merge set

$ git grep -n -l "Thurbeen/thurview" -- "*.md" "*.py" "*.sh"
.agents/skills/fleet-queue/SKILL.md
scripts/lib/queue.py
scripts/queue-selftest.sh

$ git grep -n "Thurbeen/thurview" -- "*.md"
.agents/skills/fleet-queue/SKILL.md:827:`github.com/Thurbeen/thurview` — and only when **all** of these hold. Entries

# does any of them still name three repositories without mazet?
$ git grep -n "LeTuR/mazet" -- "*.md" "*.py" "*.sh"
.agents/skills/fleet-queue/SKILL.md:825:`scripts/lib/queue.py` — `github.com/LeTuR/mazet`,
scripts/lib/queue.py:4334:# `LeTuR/mazet` was added on the same instruction and is the first entry under
scripts/lib/queue.py:4346:    "github.com/LeTuR/mazet",
scripts/queue-selftest.sh:2573:# here about `github.com/LeTuR/mazet`, because they are claims about an ENTRY
scripts/queue-selftest.sh:2576:# HOST-QUALIFIED, so `LeTuR/mazet` is refused rather than matched against the
scripts/queue-selftest.sh:2592:artifact: https://github.com/LeTuR/mazet/pull/301
scripts/queue-selftest.sh:2615:        "url": f"https://github.com/LeTuR/mazet/pull/{n}",
scripts/queue-selftest.sh:2634:expect "the shepherd reaches mazet at all" "LeTuR/mazet" "$out"
scripts/queue-selftest.sh:2642:	"pr merge https://github.com/LeTuR/mazet/pull/301 --squash --delete-branch" \
scripts/queue-selftest.sh:2653:out="$(env PATH="$shep/bin:$base_path" FLEET_AUTO_MERGE_REPOS="LeTuR/mazet" \
scripts/queue-selftest.sh:2655:expect "a bare LeTuR/mazet is refused, not matched against the slug" \
scripts/queue-selftest.sh:2673:	"entries=github.com/LeTuR/mazet github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview" \
Evidence: The merge the shepherd performs on mazet, and what it wrote down
mazet-live/01-attested https://github.com/LeTuR/mazet/pull/301
ready: the pipeline attests 00000000, which is this head; checks green, mergeable, and the branch is ours
merged: squash-merged, branch deleted

--- the merge command the shepherd issued:
gh pr merge https://github.com/LeTuR/mazet/pull/301 --squash --delete-branch
--- what the queue wrote onto the task:
01-attested state=done outcome=shipped publish.state = merged publish.by = shepherd
publish.detail = squash-merged, branch deleted

Pipeline

Updates from git push no-mistakes

✅ **intent** - passed

✅ No issues found.

✅ **Rebase** - passed

✅ No issues found.

⚠️ **Review** - 2 infos
  • ⚠️ scripts/queue-selftest.sh:5409 - §14 still asserts "because the merge set is exactly the three repos it always was" against the literal "github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview", and it was not updated with the allowlist. The intent requires "make every place that states the set agree with the code"; this is such a place and it no longer does. Concrete trace: scripts/lib/queue.py:5371 prints "Merging is limited to " + ", ".join(sorted(auto_merge_repos())); sorted() now yields github.com/LeTuR/mazet first ('L' < 'T'), so the printed line is "…limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview, …" and expect()'s grep -qF still finds the stale three-repo substring. The test therefore passes while asserting a set that is wrong by one entry — a wrong label that never fails. It is also silently fragile: an entry sorting between fleet and thurbox would make this expect fail for a reason unrelated to what §14 is about. Smallest remedy: put github.com/LeTuR/mazet at the head of the expected string and say four in the label, or narrow the assertion to what §14 actually proves (that acme/group/widgets on the discovered GitLab host is absent from the printed set). Flagged ask-user rather than auto-fix because it is the intent's "every place that states the set" criterion that is unmet, so the author should confirm which of the two forms they want.
  • ℹ️ scripts/queue-selftest.sh:2672 - The allowlist is now spelled out verbatim in four places: scripts/lib/queue.py:4345, .agents/skills/fleet-queue/SKILL.md:825, the new entries= expectation here, and the §14 expectation at line 5409. The readback assertion here is worth keeping — without an exact-membership check, "unqualified=none" would also pass on an empty set — but noting the cost, which is exactly what produced the §14 miss above: a fifth entry means editing four literals, and only one of them fails loudly when it is forgotten.
  • ℹ️ scripts/queue-selftest.sh:2585 - §9j reassigns mtopic, which §9h (line 2456) already used for the many-prs pagination topic. Nothing after §9j reads the old value today, so there is no current failure, but any assertion later appended about the §9h topic would silently target the mazet topic instead — the neighbouring sections deliberately use distinct names (stopic, ttopic, gdtopic). Rename to something like ztopic/maztopic.

🔧 Fix applied.
2 infos still open:

  • ℹ️ scripts/queue-selftest.sh:2672 - The set readback asserts exact membership with a substring match, so it does not actually pin the set for the most likely future addition. expect greps with grep -qF (scripts/queue-selftest.sh:172), and the needle is entries=github.com/LeTuR/mazet github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview with nothing after it. Concrete trace: add github.com/acme/widgets to AUTO_MERGE_REPOS. sorted() compares github.com/ then 'a' (97) against 'T' (84), so the new entry lands LAST and the printed line becomes entries=...thurview github.com/acme/widgets — which still contains the needle verbatim, so the assertion passes while its own label says "the four repositories fleet may merge in". Any owner whose name sorts after Thurbeen (every lowercase one) slips through. The unqualified=none assertion beside it is unaffected and still catches a bare slug wherever it sorts, so this is a weakened label rather than a hole in the parse claim the intent asked for. Smallest remedy is mechanical: emit a terminator the needle includes, e.g. print(&#34;entries=&#34; + &#34; &#34;.join(repos) + &#34; .&#34;) and end the expected string with thurview .. (A trailing newline cannot be used — grep -F treats a newline in the pattern as an alternation, which would make the assertion weaker still.)
  • ℹ️ scripts/queue-selftest.sh:5410 - In the fix round's §14 rewrite, limited is defined as the output of grep &#39;Merging is limited to&#39;, and the very next line asserts that limited contains Merging is limited to. That assertion can only fail when grep matched nothing, i.e. it is a non-empty check written circularly; the claim §14 actually makes is carried entirely by the refute on gitlab.example.com that follows. Not a defect — the pair still fails correctly if the shepherd stops printing the line (limited is empty, expect fails) — but the expect reads as if it verifies content it cannot. Noting it rather than asking for a change.
✅ **Test** - passed

✅ No issues found.

  • Live validation: ✅ go - 9 of 11 scenarios driven live against the product
Scenario Result Live Evidence
An attested, green pull request on github.com/LeTuR/mazet is squash-merged unattended by the shepherd, with the branch deleted ✅ pass live ./scripts/queue.sh shepherd --topic mazet-live against a throwaway queue; the row reads merged: squash-merged, branch deleted, the shepherd issued `gh pr merge https://github.com/LeTuR/mazet/pull/…
Before the entry existed the same pull request was handed back, not merged (the regression this change fixes) ✅ pass live Same queue, same pull request, run with FLEET_AUTO_MERGE_REPOS=&#39;github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview&#39;: the row reads `ready: fleet does not merge in LeT…
An unattested mazet pull request is still handed back and given a fixer rather than merged ✅ pass live PR 302 in the same pass: policy: the body carries no no-mistakes attestation then dispatched: Re-open PR #302 through the pipeline, recorded as publish.state = unattested; the merge log names on…
Adversarial: a bare LeTuR/mazet naming no forge is refused rather than matched against the slug ✅ pass live FLEET_AUTO_MERGE_REPOS=&#39;LeTuR/mazet&#39; ./scripts/queue.sh shepherd --dry-run prints ignoring &#39;LeTuR/mazet&#39; — an auto-merge entry must name its forge, the mazet pull request stays `ready: fleet does…
FLEET_AUTO_MERGE_REPOS still replaces the shipped set rather than adding to it ✅ pass live With the override naming the three older repos, the pass's own Merging is limited to line names exactly those three and mazet is excluded despite being in the shipped literal; with no override the l…
Adversarial: every other merge gate still refuses on the newly allowlisted repo ✅ pass live ./scripts/queue.sh shepherd --topic mazet-gates over five mazet pull requests: an attestation for an earlier head is policy and gets a fixer, an author with no push access is not-merged, failing…
The shepherd tells the operator the set is four repositories, every entry host-qualified ✅ pass live The pass's closing line reads Merging is limited to github.com/LeTuR/mazet, github.com/Thurbeen/fleet, github.com/Thurbeen/thurbox, github.com/Thurbeen/thurview; queue-selftest section 9j reads the…
A discovered second forge adds nothing to the merge set, and the reworked section 14 assertion would catch it if it did ✅ pass live queue-selftest section 14 (real GitLab adapter over recorded glab output) is green on all five assertions including discovering the instance put nothing of it on that set; driving the same line with…
The remote is genuinely no longer the blocker: github.com/LeTuR/mazet allows squash and only squash ✅ pass live Read-only against the live repository: gh api repos/LeTuR/mazet returns allow_squash_merge true, allow_rebase_merge false, allow_merge_commit false, delete_branch_on_merge true, PR_TITLE/PR_BODY; it…
Every place that states the set agrees with the code after the change ⏸️ untested no This was established by reading tracked files with git grep, not by driving the running product, so the prior payload records no live result for it. Documentation consistency has no runtime surface…
A real squash merge performed on the live github.com/LeTuR/mazet repository ⏸️ untested no Driving this needs a genuinely open, attested, green pull request on the public github.com/LeTuR/mazet and authority to merge it; the merge is irreversible and outward-facing, and a test phase should…
  • ./scripts/check.sh
  • ./scripts/check.sh queue (queue selftest through the repo's own gate, exit 0)
  • ./scripts/queue-selftest.sh (direct run for per-assertion output; all §9j and §14 assertions green, exit 0)
  • Manual end-to-end drive of ./scripts/queue.sh shepherd --topic &lt;topic&gt; under FLEET_AUTO_MERGE_REPOS=&#39;github.com/Thurbeen/fleet github.com/Thurbeen/thurbox github.com/Thurbeen/thurview&#39; (before-state) and under the shipped set (after-state)
  • Manual drive of ./scripts/queue.sh shepherd over five mazet pull requests exercising each merge gate: stale attestation, author without push access, failed checks, fork head branch, and a clean control
  • FLEET_AUTO_MERGE_REPOS=&#39;LeTuR/mazet&#39; ./scripts/queue.sh shepherd --topic &lt;topic&gt; --dry-run (bare slug, adversarial)
  • FLEET_AUTO_MERGE_REPOS=&#39;github.com/LeTuR/mazet gitlab.example.com/acme/group/widgets&#39; ./scripts/queue.sh shepherd --dry-run (sensitivity of section 14's narrowed assertion)
  • gh api repos/LeTuR/mazet, gh api repos/LeTuR/mazet/contents/.no-mistakes.yaml, gh api repos/LeTuR/mazet/actions/workflows (read-only, live remote)
  • git grep -n &#39;Thurbeen/thurview&#39; -- &#39;*.md&#39; &#39;*.py&#39; &#39;*.sh&#39; to confirm every place that enumerates the set now names four repositories
✅ **Document** - passed

✅ No issues found.

✅ **Lint** - passed

✅ No issues found.

✅ **Push** - passed

✅ No issues found.

`github.com/LeTuR/mazet` joins AUTO_MERGE_REPOS on the same terms as thurbox
and thurview: its own `.no-mistakes.yaml` and CI stand behind the attestation
and checks gates. Its remote was the blocker — rebase-only until today, which
MERGE_METHOD = "squash" would have refused on every pass — and it now allows
squash and nothing else.

SKILL.md's prose names the four. queue-selftest.sh gets 9j, mirroring 9i: an
attested mazet PR merges by squash, an unvetted one is still handed back, a
bare `LeTuR/mazet` is refused, and the whole set is read back and put through
forge.RepoId.parse — the literal is never parsed at runtime, so a bare slug
written there would match nothing and refuse nothing.
@LeTuR
LeTuR merged commit e566e79 into main Sep 11, 2026
11 checks passed
@LeTuR
LeTuR deleted the feat/auto-merge-mazet branch September 11, 2026 22:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant