docs: reconcile merge-gate + front-gate to standing auto-merge - #45
Conversation
…#43) The operating policy granted Faber standing auto-merge (CI-green + Codex-clean, low-risk) but the docs still said the opposite. Reconcile every doc to actual practice without weakening the remaining rails. - README.md: replace "No auto-merge in Phase 1. Faber pings; you merge." with the real policy (Faber auto-merges clean low-risk PRs; human only for needs-human/round-cap, safety-rail changes, north-star/goal drift). Loop diagram + Rollout phases made consistent. - manager/CLAUDE.md: "Never merge. Merging is mine." -> "Merge clean PRs" per standing authorization, with the human-review carve-outs; kept never-write-code/open-PRs and never-self-approve intact. Loop pass-step and Tracking updated. - templates/faber-command.md: same reconciliation for the live /faber prompt. - Consistency sweep: QUICKSTART.md, RESTORE.md (intro, smoke test, safety rails, branch-protection note), reviewer/codex-review.md flow diagram, routines/brief.md, templates/repo-setup.md — removed every leftover "no auto-merge" / "you merge" / "never merges" contradiction. - CLAUDE.md self-mod rail list: the "no auto-merge" rail reworded to its surviving form (merge stays gated + human-review carve-outs) — this is the deliberate, human-authorized loosening of that rail. Rails preserved: reviewer read-only/comments-only, CI hard gate, rounds cap (~3), needs-human escalation, never-self-approve, never-write-code, one coder-launch per issue. Only auto-merge-of-clean-PRs loosens. Docs/prompt-only; no .sh touched. Structure check passes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Codex reviewer (cross-vendor, read-only)Posted verbatim by The prompt changes introduce unsafe/ambiguous merge behavior: the final manager instructions can auto-merge high-risk work and the tracking path can strand low-risk PRs after CI turns green. Full review comments:
|
Round-1 review fixes for PR #45 (issue #43): - [P1] Move the high-risk exclusion *inside* the FINAL merge instruction in manager/CLAUDE.md, templates/faber-command.md, and README.md so the last word on merging always carves out auth / DB-migrations / shared-or-production repos / security-sensitive / operator-judgment changes — these go to the human merge gate even when CI-green + Codex-clean. - [P2] Tracking now auto-merges low-risk merge-ready PRs that turned CI-green after the loop ended (manager/CLAUDE.md), and the read-only brief flags them as ready-to-merge — so they're no longer stranded. High-risk / human-held ones are still listed for the user. Prompt/docs-only: live behavior changes only when re-pasted into the routines. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-1: both Codex findings addressed in 4803e2a (docs/prompt-only). [P1] High-risk out of auto-merge. Moved the high-risk exclusion inside the FINAL merge instruction in each file so the last word on merging always carves it out (can't be overridden by an earlier note):
[P2] Don't strand merge-ready PRs after CI turns green. Tracking in Everything else from the PR (auto-merge reconciliation, front-gate consistency) and all rails intact. Structure check + shellcheck pass locally. Label bumped |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The patch changes the workflow to auto-merge low-risk clean PRs, but one of the surfaced routines still defers those PRs instead of merging them, leaving the documented Phase 2 path inconsistent. Review comment:
|
…ng pass Resolves the round-2 [P2]: routines/brief.md only FLAGGED low-risk merge-ready PRs while manager/CLAUDE.md Tracking AUTO-MERGES them — inconsistent, and stranding-prone if the brief is the only scan. - routines/brief.md: state plainly it is read-only — it surfaces state, does not merge. Report low-risk merge-ready + CI-green PRs as auto-merge-eligible (Faber merges them on a status/Tracking pass, picked up there, not in the brief); list high-risk / human-held ones. - manager/CLAUDE.md: name the status/Tracking pass the auto-merge actor, contrasted with the read-only brief that only surfaces the same state. - README.md (Phase 2): decouple — the brief resurfaces (read-only, never merges); Faber auto-merges on a status/Tracking pass. No file both calls the brief read-only AND says it merges. High-risk carve-out (always to the human merge gate) and all rails unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-2: Codex [P2] addressed in 6b0c237 (docs/prompt-only). [P2] brief read-only vs. Tracking auto-merge — reconciled. The brief surfaces state; Faber's status/Tracking pass is the actor. No file both calls the brief read-only and says it merges.
High-risk carve-out intact (high-risk always to your merge gate, even CI-green + Codex-clean — the last word on merging). All rails unchanged: reviewer read-only/comments-only, CI hard gate, rounds cap, Structure check + shellcheck pass locally. Label bumped |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The auto-merge instructions can merge a changed PR head that has not been reviewed, and the documentation now contains contradictory merge-authority instructions. These issues should be fixed before relying on the new behavior. Full review comments:
|
Round-3 Codex feedback (issue #43, docs/prompt-only). [P1] merge-ready now means "the CURRENT head passed Codex review." A new push voids the label (GitHub keeps it across head changes); before auto-merging, confirm the latest Codex review covered the current head SHA, else clear merge-ready and re-run codex-review.sh on the new head first — only a passing review of the current head re-applies merge-ready. Stated in the pass path, the Tracking auto-merge rule, and the Merge & never rule of manager/CLAUDE.md; mirrored in templates/faber-command.md (round loop + the closing merge sentence) and routines/brief.md (stale heads flagged as needs-fresh-review, not auto-merge-eligible). [P2] README agent table no longer contradicts the auto-merge rule: Faber's writes scoped to authoring — "issues only; never authors code/PRs (merges clean low-risk PRs)." High-risk carve-out and all rails (reviewer read-only/comments-only, CI hard gate, rounds cap, needs-human, never-self-approve, never-write-code/open-PRs) unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-3: both Codex findings addressed in f405905 (docs/prompt-only). [P1] Require fresh review for the merged head.
[P2] Reconcile the remaining never-merge text. High-risk carve-out intact (high-risk always to your merge gate, even CI-green + Codex-clean — last word on merging). All rails unchanged: reviewer read-only/comments-only, CI hard gate, rounds cap, Structure check + shellcheck pass locally. Label bumped |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The new auto-merge instructions need an atomic current-head guard to uphold the stated safety invariant, and the canonical label state remains out of sync with the changed semantics. Full review comments:
|
Faber — round cap + safety-rail change → human checkpointCI green throughout. This PR loosens the no-auto-merge rail, and Codex has adversarially hardened it over 4 review cycles — each round a new, more-subtle safety nuance, all valid:
Both remaining fixes are concrete and bounded (the atomic |
…tion Round-4 of issue #43. Address both Codex findings (docs/prompt + label text only): [P2] Atomic head-match guard. State the auto-merge action as pinned to the reviewed SHA via `gh pr merge <PR#> --squash --match-head-commit <reviewed-sha>` so a push between the head-check and the merge fails atomically instead of merging an unreviewed head (closes the TOCTOU race in unprotected repos). Encoded in manager/CLAUDE.md (Tracking auto-merge rule + Merge & never rule), templates/faber-command.md (round-loop pass line + closing merge sentence), and README.md (Faber auto-merges design decision). [P3] Sync canonical merge-ready label description to the auto-merge semantics in scripts/setup-target-repo.sh and templates/repo-setup.md: "Current head passed Codex review; auto-merged if low-risk, else awaiting your merge". All rails intact: high-risk always to the human (last word on merging), reviewer read-only/comments-only, current-head invariant (merge-ready void on new commits). Structure check + shellcheck clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-4: both Codex findings addressed in 76a57d5 (docs/prompt + label-text only). [P2] Atomic head-match guard for auto-merge. The auto-merge rule now pins the merge to the reviewed SHA —
[P3] Sync the canonical
All rails intact: high-risk always goes to the human merge gate even when CI-green + Codex-clean (last word on merging); reviewer stays read-only / comments-only; current-head invariant ( Structure check + shellcheck ( |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The new auto-merge workflow lacks a durable way to identify the exact reviewed head and uses an unscoped merge command in a cross-repo workflow. These are safety/correctness issues that should be fixed before relying on the new behavior. Full review comments:
|
Faber — stopping; recommend scoping down (5th cycle, safety rail)Round-4's atomic Root insight: every one of these (stale-head, TOCTOU, durable-SHA, cross-repo) lives in the unattended "auto-merge on a later status scan across repos" path — a mechanism we don't actually have yet. The in-session auto-merge is safe and simple: Faber reviews a PR and merges it back-to-back, in the target repo, pinned to the head it just reviewed (no concurrent pusher, no cross-repo ambiguity). Recommendation: scope this PR's auto-merge to the in-session case only (Faber auto-merges a clean, low-risk PR it just reviewed, in the current target repo, |
…-only; defer unattended path to #46 The only auto-merge path is now in-session: Faber merges a PR only when it just reviewed that exact head back-to-back (review->merge), pinned with `gh pr merge --squash --match-head-commit <reviewed-sha>`. A later status/ Tracking scan and the brief only SURFACE `merge-ready` PRs (read-only) and never merge. The unattended status-scan / cross-repo auto-merge path (which needs a durable reviewed-SHA mechanism and `--repo` qualification) is deferred to #46 and intentionally not enabled. - manager/CLAUDE.md: pass-step merge is in-session/back-to-back with the reviewed-SHA pin; Tracking pass is read-only (was the "auto-merge actor"); "Merge clean PRs" -> "Merge clean PRs in-session" + #46 deferral note. - templates/faber-command.md: pass-step + summary scoped to in-session-only; status scan never auto-merges; #46 referenced. - README.md: design-decision -> "in-session only" + #46 note; Phase 2 status pass/brief now read-only; Phase 3 names the deferred #46 work; loop diagram annotated in-session. - routines/brief.md: low-risk PRs reported as "awaiting merge" via in-session review (no more "auto-merge-eligible on a status pass" handoff). - setup-target-repo.sh + templates/repo-setup.md: merge-ready label -> "auto-merged in-session if low-risk, else awaiting your merge". Rails intact: reviewer read-only/comments-only, CI hard gate, rounds cap, needs-human, never-self-approve, never-write-code/open-PRs, high-risk carve-out, current-head invariant, read-only brief. Self-mod note: prompt/doc-only; no live behavior change until the human re-runs scripts/install.sh (/faber) and Faber re-reads manager/CLAUDE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Scoped auto-merge to the in-session case only per the #43 decision; deferred the unattended path to #46. Pushed Auto-merge is now in-session-only — Faber merges a PR only when it just reviewed that exact head back-to-back (review→merge), pinned with Per file:
Rails intact: reviewer read-only/comments-only, CI hard gate, rounds cap, Verify: Self-mod note: prompt/doc-only — no live behavior change until you re-run |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The patch introduces an auto-merge workflow, but the documented merge command is not safely bound to the reviewed repository or to a reliably captured reviewed commit SHA. These gaps can cause the new safety checks to merge the wrong PR or an unreviewed head. Full review comments:
|
…the merge Addresses both Codex [P1]s on PR #45 (docs/prompt-only): - Trustworthy reviewed SHA: the in-session auto-merge now captures the head BEFORE review (gh pr view --json headRefOid) and pins the merge to it, so the pin can never be back-filled from post-review/current state. If the head moved at any point the merge refuses; treat merge-ready as void and re-review. - Repo-qualify the merge: mirror codex-review.sh — unset GH_REPO + explicit --repo <repo> derived from the cwd's remote, so a stray GH_REPO can't redirect the merge to the wrong repo. Encoded identically in manager/CLAUDE.md (pass step + Merge & never), templates/faber-command.md (round-loop pass + "you do merge"), and the README.md "Faber auto-merges" design decision. In-session-only scope, #46 deferral, high-risk carve-out, and merge-ready semantics all intact. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-5: both Codex [P1]s addressed in [P1] Trustworthy reviewed SHA via a safe capture sequence. The in-session auto-merge is now an ordered, safe sequence instead of a fillable
This guarantees Faber only merges the exact head it reviewed; if anything changed, the merge safely refuses. [P1] Repo-qualify the merge. Mirrors Encoded identically in Kept intact: in-session-only scope (status pass + brief stay read-only; unattended path deferred to #46), high-risk carve-out (human, last word), Structure check passes; shellcheck clean (no scripts changed). Not merging / not approving / not touching labels. Self-mod note: prompt/doc-only — no live behavior change until the manager prompt is re-synced ( |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The new auto-merge instructions do not cleanly bind the reviewed SHA to the merge pin because the main loop still runs the reviewer before the capture sequence, leaving either duplicate reviews or a path to merging an unreviewed head. Review comment:
|
…t intent altitude Per the scope-down on #43/PR #45: remove the step-by-step gh pr merge --match-head-commit capture→review→merge command sequence from the prompts (manager/CLAUDE.md, templates/faber-command.md, README.md) and replace it with the auto-merge POLICY at intent altitude — Faber MAY auto-merge an in-session reviewed PR when CI-green, Codex-clean, low-risk; repo-scoped; bound to the reviewed head (head moved → re-review). High-risk PRs (auth, migrations, shared/production repos, security-sensitive) always go to the human merge gate. The precise race-safe command sequence and unattended status-scan / cross-repo auto-merge are deferred to issue #46 (pending). Rails unchanged: reviewer read-only/comments-only, CI hard gate, rounds cap, needs-human, never-write-code/open-PRs, never-self-approve, read-only status/brief, current-head principle. merge-ready label descriptions already consistent (no command sequence) — left as-is. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Scope-down applied ( Per the agreed decision on this PR, I removed the fragile step-by-step merge command sequence from the prompts (the
Applied to Note: the exact safe-merge command sequence is intentionally deferred to #46. Kept intact: the doc reconciliation (no "no auto-merge"/"never merge" absolutes remain — Faber MAY merge clean PRs), front-gate consistency ( Structure check + shellcheck pass locally. Not touching labels/merge/approve. |
Codex reviewer (cross-vendor, read-only)Posted verbatim by The patch enables an auto-merge behavior in the manager prompt before the documented race-safe merge mechanism exists, which can allow merging an unreviewed head in a normal PR update race. Review comment:
|
Faber — root cause found; human decision on the auto-merge railAfter 7 rounds, the reviewer pinned it: we're documenting auto-merge as enabled before its race-safe mechanism (#46) exists. Codex's accepted fixes are either "hand-to-human until #46 lands" or "ship the concrete SHA-checked command" (which is exactly what churned 7×). The doc-reconciliation core of this PR is done and good (no more "no auto-merge"/"never merge" absolutes; front-gate consistent; high-risk→human; status/brief read-only; rails intact). The only open question is whether to enable auto-merge in the prompt now. Fork (human's call — auto-merge rail):
Note: the operator's standing in-session auto-merge (verbal grant) continues regardless — this is about the documented/prompt default. |
…ase-race doc (round-3) [P2] Minimize the base-race window: move the `baseRefOid == Reviewed-base` re-check from before the CI query to immediately before `gh pr merge` (after the CI check), so the base is verified as late as possible. Also document the residual honestly in the header: `--match-head-commit` pins only the head (gh has no `--match-base-commit`), so the base-race is fully closed only by server-side branch protection / required-up-to-date — a per-repo setup step; the script minimizes but cannot eliminate it alone. [P2] Don't over-claim wiring: soften the header to describe this as the safe in-session merge mechanism / manual-standalone helper. Wiring it into Faber's flow lands in #45; until then the Faber sources still hand clean PRs to the human gate. (No Faber prompt files touched — that's #45.) Round-1/2 safety kept intact: authenticated marker (operator author + harness header), Reviewed-head + Reviewed-base binding from one comment, >=1-real-pass CI, head pin via --match-head-commit, preflight, unset GH_REPO + explicit --repo, refuse-paths. set -euo pipefail, +x, shellcheck -S style clean, structure check passes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat: safe in-session merge harness + reviewed-SHA marker Closes #46. - scripts/codex-review.sh now stamps `Reviewed-head: <full-sha>` into its posted review comment header, so a later actor knows the exact commit Codex reviewed. Marker is part of Faber's header prefix, clearly separate from Codex's verbatim body — read-only/comments-only/verbatim unchanged. - New scripts/merge-pr.sh <PR#>: read-only until the final merge. Reads the latest Reviewed-head marker, refuses if none; confirms current head == reviewed SHA (race guard), refuses on mismatch; confirms CI green (gh pr checks buckets), refuses otherwise; then squash-merges pinned with --match-head-commit. Repo-scoped (GH_REPO unset, cwd-derived --repo). Does not judge review pass/fail or risk (Faber's call). Header notes the unattended/cross-repo path is a future extension, not supported yet. - Registered merge-pr.sh in ci/required-files.txt + README Layout; noted the Reviewed-head marker in reviewer/codex-review.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * harden merge-pr.sh: authenticate review marker + require a real passing check Round-1 review fixes for the two Codex [P2]s on PR #47 (issue #46): 1. Authenticate the review marker. The Reviewed-head: scan trusted any comment, so a PR author/collaborator could spoof a review marker and get an unreviewed head merged. Now the marker is accepted only from a genuine codex-review.sh comment, requiring BOTH: (a) the comment is authored by the gh-authenticated operator (gh api user) and (b) it carries the harness header signature ("## Codex reviewer (cross-vendor, read-only)") together with the Reviewed-head: <40-hex> marker. A spoof fails (a) and/or (b). 2. Require a real passing check. An all-skipped CI result had not_green==0 and slipped through. Now green = (>=1 bucket "pass") AND (no fail/pending/cancel); skipped is tolerated only alongside a real pass. Zero-checks still refused. shellcheck -S style clean; +x preserved; structure check passes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(merge-pr): bind reviewed base SHA + show real check names (round-2) Round-2 Codex feedback on PR #47: [P2] Bind the reviewed BASE, not just the head. --match-head-commit and the head==reviewed-SHA check only pin the PR head; if the base branch advances after codex-review.sh runs, the merge integrates a base Codex never reviewed (a different effective diff) yet the guard passes. - codex-review.sh: rev-parse origin/<base> right after the fetch and stamp a `Reviewed-base: <full-sha>` marker alongside `Reviewed-head:` in the harness comment. - merge-pr.sh: parse Reviewed-head AND Reviewed-base from the SAME authenticated harness comment, then after the head check also confirm the PR's current baseRefOid == the reviewed base SHA; refuse ("base advanced since review (<old>-><new>)") if it moved. [P3] Show real check names in the CI diagnostic. The not-green diagnostic printed `.name` but the gh pr checks --json call only requested `bucket`, so it printed null. Request `name,bucket` so failing checks list real names. Kept intact: marker authentication (operator author + harness header signature), the >=1-real-pass CI rule, preflight, unset GH_REPO + explicit --repo, the --match-head-commit pinned merge, refuse-paths. shellcheck-clean, +x, structure check passes. Verified (mocked gh, no real merge): base-changed -> refuse; head-changed -> refuse; all-skipped/no-real-pass -> refuse; spoofed/non-operator marker -> refuse; missing Reviewed-base -> refuse; genuine marker (head+base match) + >=1 pass -> proceeds to the pinned merge (stubbed). CI diagnostic now prints the real failing check name. Refs #46 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(merge-pr): relocate base re-check to just before merge + honest base-race doc (round-3) [P2] Minimize the base-race window: move the `baseRefOid == Reviewed-base` re-check from before the CI query to immediately before `gh pr merge` (after the CI check), so the base is verified as late as possible. Also document the residual honestly in the header: `--match-head-commit` pins only the head (gh has no `--match-base-commit`), so the base-race is fully closed only by server-side branch protection / required-up-to-date — a per-repo setup step; the script minimizes but cannot eliminate it alone. [P2] Don't over-claim wiring: soften the header to describe this as the safe in-session merge mechanism / manual-standalone helper. Wiring it into Faber's flow lands in #45; until then the Faber sources still hand clean PRs to the human gate. (No Faber prompt files touched — that's #45.) Round-1/2 safety kept intact: authenticated marker (operator author + harness header), Reviewed-head + Reviewed-base binding from one comment, >=1-real-pass CI, head pin via --match-head-commit, preflight, unset GH_REPO + explicit --repo, refuse-paths. set -euo pipefail, +x, shellcheck -S style clean, structure check passes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Now that scripts/merge-pr.sh has landed on main (via #46/#47), enable the in-session auto-merge by pointing Faber at it instead of stopping at the human merge gate / deferring the mechanism to #46. - manager/CLAUDE.md, templates/faber-command.md, README.md: on a clean in-session Codex review + low-risk PR, Faber auto-merges by running `scripts/merge-pr.sh <PR#>` from the target repo's clone (absolute path, same convention as codex-review.sh). The script owns the mechanical safety (authenticated reviewed head+base SHA marker, head+base unchanged since review, >=1 real CI pass, --match-head-commit pin) and refuses otherwise, so Faber never hand-crafts a merge command. - High-risk PRs (auth, migrations, shared/production, security-sensitive) still go to the human merge gate even when clean — Faber does not run merge-pr.sh for those. - Status pass + brief stay read-only (surface merge-ready only). The unattended status-scan / cross-repo auto-merge remains a future extension of merge-pr.sh, deferred to #46 (per the script's header). - Front-gate, merge-ready semantics, and all rails unchanged. Prompt change: this updates manager/CLAUDE.md and templates/faber-command.md; live behavior does not change until the human re-pastes the routine. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round 4 (pushed
Verify: structure check passes (docs/prompt-only; no Note (self-mod safety): this is a prompt change to Label: |
Codex reviewer (cross-vendor, read-only)Reviewed-head: 663fffb Posted verbatim by The new auto-merge flow depends on a helper with an undocumented prerequisite, so the documented setup can pass while the new merge step fails. There is also a stale helper header contradicting the newly wired Faber behavior. Full review comments:
|
[P2] jq is required by scripts/merge-pr.sh (parses gh pr checks --json) but was undocumented and unchecked, so a fresh machine passes setup then fails at merge. Add jq to QUICKSTART Prerequisites and to its §5 list of doctor's checks; add a (command -v jq) check to scripts/doctor.sh (check (e), next to gh/codex) with an actionable fail message, and update doctor's header-comment checks list and usage() to include jq. File/label checks renumbered (f)/(g). [P3] scripts/merge-pr.sh header no longer calls itself a manual/standalone helper or says the Faber sources defer to the human 'until #45 updates them'. It now states it is invoked by Faber's in-session auto-merge flow for clean, low-risk, in-session-reviewed PRs; high-risk still goes to the human gate; the unattended/cross-repo path remains the future extension. Behavior and safety logic unchanged — comment only. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
Round-5: both Codex findings addressed in 8a76792 (docs + script-comment + doctor-check; no behavior change). [P2] jq prereq documented + checked. jq is required by `scripts/merge-pr.sh` (it parses `gh pr checks --json`) but was previously undocumented and unchecked — a fresh machine passed setup, then the merge step failed. Fixed:
[P3] merge-pr.sh header aligned with the wired reality. Removed the stale "manual / standalone helper" + "the Faber sources hand clean PRs to the human until #45 updates them" wording. The WIRING note now states the script is invoked by Faber's in-session auto-merge flow (for clean, low-risk, in-session-reviewed PRs); high-risk still → human (Faber never calls it for them); the unattended status-scan / cross-repo path remains the documented future extension. Kept intact: all of this PR's auto-merge wiring and merge-pr.sh's safety logic (SHA-pin / repo-scope / base-pin / CI-green; `--match-head-commit`) — only the header comment changed. Rails unchanged: reviewer read-only/comments-only, high-risk → human, status/brief read-only, no self-approve/merge. shellcheck `-S style` (all scripts) clean; structure check passes; both scripts stay `+x`. `./scripts/doctor.sh` shows the new `pass: (e) jq on PATH` on this machine. Label left at `round-3` (unchanged). Not merging / not approving. |
Codex reviewer (cross-vendor, read-only)Reviewed-head: 8a76792 Posted verbatim by The changes consistently update the documentation and prompts to describe the new in-session low-risk merge flow, and the only functional script change adds a jq preflight that matches merge-pr.sh's dependency. I did not find a discrete regression introduced by this patch. |
Closes #43
What
Reconcile the merge-gate and front-gate docs with the actual operating policy: the user granted standing auto-merge (Faber merges PRs that are CI-green + Codex-clean and low-risk, without per-PR confirmation), but several docs still said the opposite. This removes every "no auto-merge" / "you merge" / "never merges" contradiction across the repo while preserving every other rail.
Why
The policy had outrun the docs.
README.mddesign-decisions andmanager/CLAUDE.md"Never" still asserted manual-merge-only, contradicting how the team actually runs.Changed per file
README.md— design-decision "No auto-merge in Phase 1. Faber pings; you merge." → Faber auto-merges clean, low-risk PRs (CI green + Codex clean), human only forneeds-human/round-cap escalations, safety-rail changes, and north-star milestones / goal drift. Loop diagram and Rollout phases made consistent (this is the earned auto-merge).manager/CLAUDE.md— "Never merge. Merging is mine." → Merge clean PRs per standing authorization; do NOT merge when human review is required (safety-rail changes, ambiguous specs, escalations, north-star/goal drift). Kept "never write code / open PRs" and "never self-approve" intact. Updated the loop pass-step and the Tracking bullet.templates/faber-command.md— same reconciliation for the live/faberprompt.QUICKSTART.md,RESTORE.md(intro, end-to-end smoke test, safety-rails list, branch-protection note),reviewer/codex-review.md(flow diagram),routines/brief.md,templates/repo-setup.md— removed leftover contradictions. The branch-protection notes now distinguish GitHub's native auto-merge button (kept off; merges run through Faber/human, both gated on green CI) from Faber's deliberategh pr merge.CLAUDE.mdself-modification-safety rail list — the "no auto-merge" rail reworded to its surviving form (merge stays gated + human-review carve-outs). See self-mod note below.Rails preserved (only auto-merge-of-clean-PRs loosens)
needs-humanescalation intact.readyafter the user's explicit approval; never self-approves) confirmed consistent acrossmanager/CLAUDE.md,README.md,templates/faber-command.md(andQUICKSTART.md/RESTORE.md).This is a deliberate, human-authorized change to the "no auto-merge" safety rail — the user granted standing auto-merge, so this PR loosens exactly that one rail (and reworded it in
CLAUDE.md's self-mod rail list accordingly). Nothing else loosens.Prompt sync: this changes prompt/doc sources, which do not alter live behavior until synced. The live
/fabercommand updates only when the user re-runsscripts/install.sh;manager/CLAUDE.mdtakes effect on Faber's next read.Tests
Docs/prompt-only — no
.shtouched. CI structure check passes locally (structure ok); shellcheck unaffected.