HOMELAB-1679: fix(forgejo): the reviewer identity set is a fixed per-repo map in code; the env lever is removed (D6.1(d)) #134
Open
pi-landing
wants to merge 5 commits from
reviewers-by-repo-f1 into main
pull from: reviewers-by-repo-f1
merge into: Homelab:main
Homelab:main
Homelab:lr-20261111-017-s1
Homelab:lr-20261111-017-f5
Homelab:lr-20261111-017-census
Homelab:lr-20261111-017-lockharden
Homelab:lr/IR-20261111-extskill
Homelab:lr-20261111-017-n6split
Homelab:lr-20261111-017-headfollow2
Homelab:lr-20261111-017-headfollow
Homelab:lr-20261111-017-headpin
Homelab:plane/HOMELAB-2479-122-signal-exit-fix
Homelab:plane/HOMELAB-2479-seat-post-helper
Homelab:archive/plane/HOMELAB-1850-attribution-wip-20261110
Homelab:archive/plane/HOMELAB-1688-routines-wip-20261110
Homelab:archive/plane/HOMELAB-2674-operator-identity-wip-20261110
Homelab:lock-frozen-20261107
Homelab:ld/pi-skills-lab-run-archive-fix
Homelab:ldv0/ld-sessiontag-f
Homelab:plane/HOMELAB-2682-reload-trace
Homelab:plane/HOMELAB-2682-fake-tmpfix
Homelab:plane/HOMELAB-2682-forge-write-refuse
Homelab:plane/HOMELAB-2682-ci-key-file
Homelab:plane/ci-pending-status-truth
Homelab:plane/HOMELAB-2682-watchdog-fix
Homelab:plane/HOMELAB-2682-operator-refuse
Homelab:plane/HOMELAB-2682-refusal-forms
Homelab:plane/HOMELAB-2682-selfresolve-nearmiss
Homelab:plane/HOMELAB-2682-cheap-plane-comments
Homelab:plane/HOMELAB-2682-verdict-arm-fix
Homelab:plane/HOMELAB-2682-comment-refuse
Homelab:plane/HOMELAB-2682-finding-rule
Homelab:plane/HOMELAB-2682-blocker-none
Homelab:plane/HOMELAB-2682-collapse
Homelab:plane/HOMELAB-2682-negation-heading
Homelab:plane/HOMELAB-2682-comment-as
Homelab:plane/HOMELAB-2682-bold-negation
Homelab:plane/HOMELAB-2682-get-pr-sha
Homelab:plane/HOMELAB-2682-phrase-hardening
Homelab:plane/HOMELAB-2682-plane-comments-limit
Homelab:plane/HOMELAB-2682-lock-defects
Homelab:plane/HOMELAB-ci-runs-limit
Homelab:plane/HOMELAB-lock-heading-delta
Homelab:plane/HOMELAB-lock-holes
Homelab:plane/HOMELAB-2686-lock-read
Homelab:plane/HOMELAB-2634-janitor-background
Homelab:archive/plane/HOMELAB-2674-operator-identity-20261109
Homelab:plane/HOMELAB-2674-operator-identity
Homelab:plane/HOMELAB-2634-janitor-relief
Homelab:plane/HOMELAB-2524-ci-contexts
Homelab:plane/HOMELAB-2612-gradle-danger
Homelab:plane/HOMELAB-2661-hold-session
Homelab:plane/HOMELAB-2659-merge-panel
Homelab:plane/HOMELAB-2634-herdr-janitor
Homelab:plane/HOMELAB-2578-openbao-auth
Homelab:plane/HOMELAB-2590-blocker-record
Homelab:plane/HOMELAB-2586-wrapped-negation
Homelab:plane/HOMELAB-2566-formal-verdicts
Homelab:plane/HOMELAB-2578-runtime-landing-credential
Homelab:plane/HOMELAB-2567-typebox-tests
Homelab:plane/HOMELAB-2522-formal-supersession
Homelab:plane/HOMELAB-2550-comment-identity-hardening
Homelab:plane/HOMELAB-2554-comment-identity-hardening
Homelab:plane/HOMELAB-2521-blocker-ids
Homelab:plane/HOMELAB-2529-comment-identity
Homelab:plane/HOMELAB-2526-merge-identity
Homelab:plane/HOMELAB-2527-comment-identity
Homelab:plane/HOMELAB-2512-hold-identity
Homelab:plane/HOMELAB-2423-verdict-helper
Homelab:plane/HOMELAB-2411-lock-supersede
Homelab:plane/HOMELAB-2346-exact-head-lock
Homelab:plane/HOMELAB-2323-otel-prompt-undefined
Homelab:plane/HOMELAB-2321-poll-loop-guard
Homelab:plane/HOMELAB-2218-redact-fp
Homelab:plane/HOMELAB-1727-friction-actor
Homelab:plane/HOMELAB-1880-meeting-enriched-transcript
Homelab:plane/HOMELAB-1690-l7
Homelab:plane/HOMELAB-1850-attribution
Homelab:plane/HOMELAB-1877-voice-whisper-tier1
Homelab:plane/HOMELAB-1855-voice-whisper-remote-mic
Homelab:plane/HOMELAB-1688-routines
Homelab:plane/HOMELAB-1842-intercom-conflict
Homelab:plane/HOMELAB-1678-refocus
Homelab:plane/HOMELAB-1788-fallback-fixture
Homelab:plane/HOMELAB-ci-swarm-fix
Homelab:plane/HOMELAB-1788-intercom
Homelab:plane/HOMELAB-1679-closure
Homelab:plane/HOMELAB-1769-mcp-bridge
Homelab:plane/HOMELAB-1750-meeting-video-review
Homelab:plane/HOMELAB-1736-forgejo-ci
Homelab:plane/HOMELAB-1695-modelrole
Homelab:plane/HOMELAB-1741-watchdog-challenge
Homelab:plane/HOMELAB-1668-stall-watchdog
Homelab:plane/HOMELAB-1734-epic-session-generic
Homelab:plane/HOMELAB-1629-attach-kickoff
Homelab:plane/epic-session-emit-fix
Homelab:plane/HOMELAB-1628-voice-whisper
Homelab:plane/HOMELAB-1624-docs
Homelab:plane/HOMELAB-1560-epic-session
Homelab:plane/HOMELAB-1618-pane-ux
Homelab:plane/HOMELAB-1614-swarm-view-ux
Homelab:plane/HOMELAB-1609-ext
Homelab:plane/HOMELAB-1609-skills-agents
Homelab:plane/HOMELAB-1577-steer-send
Homelab:plane/HOMELAB-1576-split-direction
Homelab:plane/HOMELAB-1544-async-only-dispatch
Homelab:plane/HOMELAB-1575-swarm-ux
Homelab:plane/HOMELAB-1571-pane-nits
Homelab:plane/HOMELAB-1569-settings-reload
Homelab:plane/HOMELAB-1573-chat-first
Homelab:plane/HOMELAB-1572-on-demand-panes
Homelab:plane/HOMELAB-1570-pane-ux
Homelab:plane/HOMELAB-1558-phase3
Homelab:plane/HOMELAB-1558-phase4
Homelab:plane/HOMELAB-1557-phase2
Homelab:plane/HOMELAB-1557-phase1
Homelab:plane/HOMELAB-1561-ci
Homelab:plane/HOMELAB-1559-contract-followup
Homelab:plane/HOMELAB-1559-phase0-foundation
Homelab:plane/HOMELAB-1555-telemetry-attribution
Homelab:plane/HOMELAB-1552-otel-subagent-spans
Homelab:plane/HOMELAB-1553-subagent-result-fallback
Homelab:plane/HOMELAB-1552-forgejo-merge-default
Homelab:plane/HOMELAB-1548-model-override
Homelab:rescue/HOMELAB-1534-1542-inflight
Homelab:plane/HOMELAB-1527-tunnel-spans
Homelab:plane/HOMELAB-1532-unknown-prefix-fail-loud
Homelab:plane/HOMELAB-1531-send-project-map
Homelab:homelab-1517/otel-header-format-fix
No reviewers
Labels
Clear labels
No items
No labels
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
Homelab/pi-extensions!134
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "reviewers-by-repo-f1"
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?
What this changes
The set of logins whose verdict is approving evidence becomes a fixed map in code, per repo —
DEFAULT_LANDING_POLICY.reviewerIdentitiesByRepoinforgejo/landing.ts— and the environment overrideFORGEJO_LANDING_REVIEWERSis removed completely (it is not read anywhere: not on GO-gated repos, not on any other).Why: whose prose may approve a diff is a property of the repo, and a value a session can set is not a gate (the class review B3 / the N15 pin already closed on GO-gated repos). Until now any lane could widen its own reviewer set by exporting one login.
The map preserves today's behaviour (30-day census, read-only)
Window 2026-10-13T13:57Z → 2026-11-12, 214 merged PRs, each read individually for
merged_by(the list endpoint does not carry it):ld-reviewergits-seat-commentld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerld-reviewerpi-landing/ld-landingare the merger identities, never reviewers. No repo's effective reviewer set was anything other thanld-reviewer: no sbx-* pod setsFORGEJO_LANDING_REVIEWERS(pod specs read by the supervisor, 14:3xZ), and the only other merger identity isld-landing.Homelab/ghostty-in-the-shell→gits-seat-comment(D6.1(d)): the account it now seats with, replacing the revoked one.Homelab/throwaway-ld-test-20261108is deliberately NOT mapped: it is a throwaway test repo, and it stays rejected. That is the fail-closed answer, not an oversight.sendrast-botmerges by API, and the release PRs land inHomelab/prod(→ld-reviewer). No Sendrast row is needed in the map.Rule
owner/repoinrepoKeyform, so any spelling the forge or a caller produces resolves).pi-landing, is ignored on every repo, gated or not.no trusted reviewer identity is configured for <repo>), and a malformed entry (empty list, blank login) is refused the same way — never "anyone".Tests
forgejo/tests/landing-reviewers-by-repo.test.ts(new):gits-seat-comment; an exact-headld-reviewerverdict — which used to approve — is no longer evidence (the row that fails with the old code);ld-reviewer;pi-landing: ignored on GITS, on a mapped non-gated repo and on a GO-gated repo; anld-reviewerverdict on GITS stays untrusted even when the env names it;https://…/X.git, upper case, trailing slash) resolve.Updated for the removed lever:
landing-gated-reviewers-n6,landing-gated-env-pins-n15,landing-census-gated-policy-017,landing-record,landing-server-repo-name-b1,landing-corpus,docs/forgejo.md.Local run: the runnable subset passes (584 tests). 19 test files in this checkout do not load because
@mariozechner/pi-aiis not installed in this pod — pre-existing, unrelated to the change (they fail the same way onmain); CI installs it and runs the whole suite.Do not merge
Gate PR: needs a clean pair (SEAT-LINE + SEATSID), homelab-f1's review, and El Director's GO. No merge from this branch.
homelab-f1 r3, the two r2 requests that were not in the code. B1 — `DEFAULT_LANDING_POLICY` was only half a gate: the reviewer map was deep-frozen, but the policy object and its four lists were not, so one `DEFAULT_LANDING_POLICY.dangerousPaths.push(…)` moved the dangerous class for every caller and one `reviewerIdentities.push(…)` moved the reviewer set for the fleet. The object and every list are now frozen (a `frozenList` helper takes a copy first), and the three reads that resolved through it (`resolveLandingPolicy` ×2, `evaluateLandingLock`'s no-policy fallback) use the frozen map constant directly, so there is no reachable mutation path. B2 — `verdict.ts` called `findOpenBlockers(items)` with no options, so the scan fell back to the default policy and answered for `ld-reviewer` on every repo. In Homelab/ghostty-in-the-shell that inverted the rule the map exists to enforce: `gits-seat-comment`, the identity that repo trusts, got "your resolution does not clear" for `--resolve-review`, and `ld-reviewer`, whose verdicts are no longer evidence there, closed findings. It now passes `{ policy, headSha }` — the same policy the rest of the report uses, and the head, so a resolution that pins another head closes nothing (the lock's own rule). N2 — `landing-record.test.ts` no longer exercised HOMELAB-2522's citation binding: the map gives each repo ONE identity, so the two-trusted-author shape the rule is about cannot arise end to end any more, and the old case was passing on the untrusted-identity leg instead. It is restored where the rule lives (the lock input) with the set stated explicitly, and it asserts both directions: another author's tagged verdict supersedes nothing (`#1601` named, "do not declare"), the same author's does (the note names the supersession and the panel passes). Tests: 4 new/restored cases, each red on the previous commit (B2 both directions verified red by reverting the one-line call). Suite 1369 passed / 1369 (68 files) with the alias node_modules in the sandbox.View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.Merge
Merge the changes and update on Forgejo.Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.