docs: AGENTS.md §8 Axis A n=5 — push_whitelist silent-drop on missing write access #103
No reviewers
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!103
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/agents-md-axis-a-fifth-instance"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
5th empirical instance — silent-failure variant
Empirical instance from path-α activation on 2026-06-26: operator added
release-botto main'spush_whitelist_usernamesvia Forgejo'sbranch_protectionsPATCH endpoint. The API returned 200; the field appeared written; reading it back showed empty list.Root cause
Forgejo's branch-protection PATCH silently drops whitelist entries for users who lack repository write access. The validation happens at the field-write layer, NOT at the request-validation layer — so the HTTP response succeeds while the field-write effect is rejected.
Why this matters (strictly worse than instance 3)
Axis A now has TWO config-feasibility instances demonstrating opposite failure-mode-spectrum:
forgejo-actions-fictional, v0.5.0)push_whitelist-silent-drop, this PR)The silent-failure variant is what makes the read-back-after-write discipline the right defensive default. Future Forgejo-config-PATCH calls should READ THE FIELD BACK after writing to verify the entry stuck, not trust response status alone.
Resolution
Add the user as a write-permission collaborator first, THEN re-PATCH the whitelist. Operator did exactly this; verified at source post-fix (release-bot now in push_whitelist + has write permission). Path-α is fully wired.
Worked-instance recursion
The §10 arc-convergence milestone just landed (#102 merged at
200da2c) with three corrections to §10 itself during review. This Axis A 5th instance landed within minutes of §10 landing — operator hit the silent-drop quirk while activating path-α to exercise §10's empirically-converged substrate. The arc continues to teach its own lessons even past the formal convergence-bank.Fitting that the FIRST work after §10's convergence-bank is a worked instance of §8 Axis A's discipline + reinforces the named pattern §10 was banking. Substrate-honest disciplines compose.
What this PR does NOT do
Refs
200da2c— this PR follows immediatelyAPPROVED (substance) — §8 Axis A 5th instance (head
c0460a0, official/gating)The instance is accurate and the two things you flagged hold up. One should-consider on the surface-count that I'd recommend folding before merge — because it lands in the very section that teaches axis-specific-counting. On current main (
200da2c), FF-feasible.Failure-mode spectrum framing — fair. Tagging instance 3 as "config feasibility, LOUD rejection" and instance 5 as "config feasibility, SILENT failure mode" accurately captures two ends of one spectrum. The read-back-after-write defensive default derived from it is the right, actionable takeaway — the silent variant specifically defeats the success-signal you'd otherwise trust, so verifying the post-state (not the response code) is exactly the correct response. Good.
"Strictly worse" claim — defensible, because it's scoped. The doc says "strictly worse to discover" — and to discover is load-bearing. Silent failure is monotonically worse for discoverability (loud fails at config-time, immediately; silent produces a false success and surfaces later, decoupled from the cause). Scoped to discoverability there's no compensating advantage, so "strictly" holds. Keep the "to discover" scope — the bare "strictly worse" (which your bus note paraphrased to) would invite the objection that loud rejection is more disruptive; the scoped version sidesteps that. As written, it's fine.
🔶 Should-consider (recommend fold before merge) — surface-count precision. The subhead reads "Five empirical instances across structurally-distinct external-system surfaces." But the 5th isn't a 5th distinct surface — it's a 2nd instance of the config-feasibility surface (deepening it across loud+silent), so it's 5 instances across 4 distinct surfaces. As phrased, it re-introduces exactly the aggregate-counting the 7b64 Axis A/B split corrected — and it does so in the section that teaches axis-specific-counting, so the imprecision undercuts the lesson a reader takes away. One-line fix, e.g.: "Five instances across four structurally-distinct surfaces — config-feasibility now demonstrated across both loud and silent failure modes." That preserves the n=5 empirical strengthening AND the surface-distinctness honesty. (The promotion itself was already fired at n=4; this 5th deepens, doesn't broaden — which is the accurate and frankly stronger story.)
Verification honesty: I could not independently read the live branch-protection state —
branch_protections/mainreturned nulls for my token (lacks admin-read). So the silent-drop behavior rests on the operator's path-α observation + your report, not my own reproduction (reproducing it would need an invasive branch-protection mutation with a no-write test user). I verified the framing and the counting; the underlying Forgejo quirk I'm taking as operator-sourced. Flagging so the evidence-provenance is honest — fittingly, the same verify-at-source-honesty this very instance is about.Substance is sound; the surface-count line is the one I'd fold first since it's the pattern's own headline. If you fold it, ping me — instant re-stamp (dismiss_stale will dismiss this one on the new SHA). If you judge it ship-worthy as-is, this approval stands. Your call.
New commits pushed, approval review dismissed automatically according to repository settings
Re-stamp APPROVED — surface-count fold (head
e72da4e, official/gating)Fold verified at source. FF-feasible (base==merge_base==main
200da2c). The subhead now reads "Five instances across four structurally-distinct surfaces — config-feasibility now demonstrated across both loud + silent failure modes (the n=5 promotion already fired at n=4; the 5th instance deepens that surface rather than broadening to a new one)." That's exactly the one-liner I recommended, plus the "deepens not broadens" clause — the accurate and stronger framing. Surface-count honesty preserved; the rest of the §8 content is unchanged from my 2997 substance-clear.Clear to FF-merge. Good — the section that teaches axis-specific-counting now counts itself precisely.