seatpost: 8098 posts as ld-reviewer; R29 one-claim-per-seat; relay provenance gate (LR-20261111-025, AMENDMENT 4) #950
Open
pi-landing
wants to merge 4 commits from
lr-20261111-025/amendment-4 into live
pull from: lr-20261111-025/amendment-4
merge into: Homelab:live
Homelab:main
Homelab:live
Homelab:sso/zitadel-guest-users
Homelab:sso/argocd-readonly-groups
Homelab:ld/IR-20261112-phase1guard
Homelab:ld/IR-20261112-kimipool
Homelab:lr-20261111-017-a24
Homelab:plane/IR-20261112-relayalert
Homelab:plane/IR-20261112-sbxdisk
Homelab:lr-20261111-025/seat-template
Homelab:plane/IR-20261112-mgmtdns
Homelab:plane/IR-20261112-r10-openbao-loki
Homelab:plane/f-r2-d6-sbx-reviewer-out
Homelab:plane/R39-forgejo-access-log-sink
Homelab:plane/R39-forgejo-access-log-auth
Homelab:plane/IR-20261111-extdel-v2
Homelab:plane/f-r2-d6-gits-reviewer-removal
Homelab:plane/R39-forgejo-access-log
Homelab:plane/R1-localbin
Homelab:plane/IR-20261111-r25offdisk
Homelab:plane/IR-20261112-runners8
Homelab:plane/EXTDEL-4918-forgejo-ext
Homelab:plane/IR-20261112-npmcache
Homelab:lr-20261111-016-launchcap
Homelab:plane/IR-20261111-runners10
Homelab:plane/IR-20261111-c8brief
Homelab:IR-20261111-runnercap
Homelab:plane/IR-20261111-baohelper
Homelab:plane/IR-20261111-gitsemu
Homelab:plane/IR-20261111-runnerlock
Homelab:plane/IR-20261111-c8grants
Homelab:lr-20261111-017-n9
Homelab:lr-20261111-025/seatpost
Homelab:ld/LR-20261111-024-seat-ban
Homelab:lr-20261111-017-seatlookup
Homelab:spec-014-skill-sync
Homelab:ld-spec-009/relay-fixforward
Homelab:ld/spec-016-launch-cap
Homelab:ld-spec-009/relay-a3
Homelab:plane/LR-20261111-018-seat-posting
Homelab:plane/LR-20261111-012-sbx-lab-transcripts
Homelab:spec-010-fit2
Homelab:ld-spec-009/relay
Homelab:plane/HOMELAB-C3C-epic-supervisor
Homelab:plane/dircfg-c3b-work-pointer
Homelab:plane/HOMELAB-2479-sbx-ffmpeg
Homelab:plane/dircfg-c5-epic-supervisor
Homelab:plane/dircfg-c4-opening
Homelab:plane/dircfg-c3-work-md
Homelab:plane/dircfg-c2-brief-metodo
Homelab:plane/dircfg-c6-sbx-sendrast-skills
Homelab:plane/HOMELAB-2479-zitadel-display-name
Homelab:plane/dircfg-c1-director-gitinit
Homelab:plane/HOMELAB-2479-sbx-sendrast-9gi
Homelab:plane/HOMELAB-2479-invite-list-reader
Homelab:plane/HOMELAB-2479-sbx-lab-wk02-affinity
Homelab:plane/HOMELAB-2479-wk02-sbx-lab-limit
Homelab:plane/HOMELAB-2479-zitadel-user-drift
Homelab:plane/HOMELAB-2479-zitadel-h2c
Homelab:spec-008-b-sbxlab-pin
Homelab:spec-008-a-sbxfleet-base-bump
Homelab:spec-007-ld-implement-skill
Homelab:archive/plane/HOMELAB-2658-omniroute-containment-wip-20261110
Homelab:archive/plane/HOMELAB-2446-wk01-requests-wip-20261110
Homelab:plane/HOMELAB-2479-gits-fixture-vendor
Homelab:ld-spec-004
Homelab:plane/HOMELAB-2479-plane-smtp-chart
Homelab:ld-spec-003
Homelab:plane/HOMELAB-2479-aaron-site-zitadel
Homelab:plane/HOMELAB-2479-runner-requests
Homelab:plane/ld-stopnow-gits-pin
Homelab:plane/ld-stopnow-alias-retire
Homelab:plane/HOMELAB-2479-sbx-gits-probe-tmp
Homelab:plane/HOMELAB-2479-gits-toolcache
Homelab:plane/ld-stopnow-sbxlab-pin
Homelab:plane/ld-stopnow-sbxfleet-base2
Homelab:plane/ld-stopnow-sbxfleet-base
Homelab:plane/ld-stopnow-item2-skill-rule
Homelab:plane/HOMELAB-88-cm-ssa-syncopt
Homelab:plane/HOMELAB-88-sandbox-telemetry
Homelab:plane/HOMELAB-88-sbx-gits-16g
Homelab:plane/HOMELAB-88-whisper-cuda
Homelab:plane/HOMELAB-2479-secretscan-fixture-allowlist
Homelab:plane/HOMELAB-2479-registry-backup
Homelab:plane/HOMELAB-2682-sandbox-init-tmpfix
Homelab:plane/HOMELAB-2479-fix-port-gate
Homelab:plane/HOMELAB-2479-emulator-gate
Homelab:plane/HOMELAB-2479-fixture-resync
Homelab:plane/HOMELAB-2682-forgejo-ext-pin-cd50fbc6
Homelab:plane/HOMELAB-2479-openbao-raft-verify
Homelab:plane/HOMELAB-2682-forgejo-ext-pin-96437d4a
Homelab:plane/HOMELAB-2479-moore-disk-alert
Homelab:plane/HOMELAB-2479-harbor-pin-secrets
Homelab:plane/HOMELAB-2682-relief-threshold-p1
Homelab:archive/plane/HOMELAB-2682-relief-threshold-20261109
Homelab:plane/HOMELAB-2682-relief-threshold
Homelab:plane/HOMELAB-2682-sbx-gits-seed-pin
Homelab:plane/HOMELAB-2479-ci-trim
Homelab:plane/HOMELAB-2682-ok0
Homelab:plane/HOMELAB-2479-liveness-window-120s
Homelab:plane/HOMELAB-2682-seed-bump
Homelab:plane/HOMELAB-2682-transcripts
Homelab:plane/HOMELAB-2682-pin-bump
Homelab:plane/HOMELAB-2682-declaration
Homelab:plane/HOMELAB-2682-gradle-daemon-gen
Homelab:plane/HOMELAB-2682-tools-pin
Homelab:plane/HOMELAB-2479-harbor-db-backup
Homelab:plane/HOMELAB-2682-suite-relpath
Homelab:plane/HOMELAB-2682-revert-859-delivery
Homelab:plane/HOMELAB-2479-volume-floor
Homelab:plane/HOMELAB-2682-check-anchor
Homelab:dev/cockpit
Homelab:plane/HOMELAB-2479-nic-roster
Homelab:plane/HOMELAB-2479-nic-roster-rehome
Homelab:ld-1/truth-fixes
Homelab:ld-1/remove-open-chat
Homelab:ld-1/gate-cut
Homelab:plane/HOMELAB-2479-nic-critical
Homelab:plane/HOMELAB-2479-startup-probe
Homelab:ld-1/dev-route-1
Homelab:plane/HOMELAB-2479-factory-token
Homelab:plane/HOMELAB-2682-evidence-fixes
Homelab:ld-1/gate-dev-route
Homelab:plane/HOMELAB-2479-sbx-resources
Homelab:plane/HOMELAB-2479-factory-pr-series
Homelab:plane/HOMELAB-2682-preclean-optout
Homelab:plane/HOMELAB-2479-measurement
Homelab:plane/sbx-gits-resources-20261105
Homelab:plane/sbx-lab-resources-20261105
Homelab:plane/HOMELAB-2682-emu-proof
Homelab:plane/HOMELAB-2682-sbxgits-pin
Homelab:plane/HOMELAB-2682-ssh-image
Homelab:archive/plane/HOMELAB-2694-sandbox-mem-page-20261110
Homelab:plane/HOMELAB-2694-sandbox-mem-page
Homelab:plane/HOMELAB-2537-jvm-proof-mode
Homelab:plane/HOMELAB-2694-sbx-lab-memory
Homelab:plane/HOMELAB-2694-psi-memory-alert
Homelab:plane/HOMELAB-2682-lab-env
Homelab:plane/HOMELAB-2694-sandbox-oom-alerts
Homelab:plane/HOMELAB-2682-quote-rule
Homelab:plane/HOMELAB-2481-sandbox-log-reader
Homelab:plane/HOMELAB-2682-sbx-lab-ext
Homelab:plane/HOMELAB-2688-longhorn-alerts
Homelab:plane/HOMELAB-2682-sbx-lab-idents
Homelab:plane/HOMELAB-2682-ct-skills
Homelab:plane/GITS-492-tablet-build-delivery
Homelab:epic/ld-1
Homelab:plane/HOMELAB-2680-sandbox-redact
Homelab:plane/HOMELAB-2683-sbx-lab-pin
Homelab:plane/HOMELAB-2685-outage-alerts
Homelab:plane/HOMELAB-2683-gcc-sbx-lab
Homelab:plane/HOMELAB-2658-omniroute-containment
Homelab:plane/HOMELAB-2440-sbx-lab-cpu
Homelab:plane/HOMELAB-2673-ci-pending-paging
Homelab:plane/HOMELAB-2675-sbx-gits-alerts
Homelab:plane/HOMELAB-2440-sbx-lab-request
Homelab:plane/HOMELAB-2445-sbx-lab-offpve
Homelab:plane/HOMELAB-2445-wk06-requests
Homelab:plane/HOMELAB-2658-liveness
Homelab:plane/HOMELAB-2655-sbx-sendrast-pin-54c78dd
Homelab:plane/HOMELAB-2655-sbx-sendrast-t7
Homelab:plane/HOMELAB-2626-h9-voz-sandbox
Homelab:plane/HOMELAB-2636-android-emu-b
Homelab:plane/GITS-401-drain-envelope
Homelab:plane/HOMELAB-2492-volume-attach-alerts
Homelab:plane/HOMELAB-2626-h8e-skill-hipervisor
Homelab:plane/HOMELAB-2488-io-psi-alerts
Homelab:plane/HOMELAB-2626-h8d-skills-pi
Homelab:plane/HOMELAB-2626-h8c-skills-pi-pulido
Homelab:plane/HOMELAB-2626-h8b-skills-pi-fixes
Homelab:plane/HOMELAB-2489-longhorn-tgtd-alerts
Homelab:plane/HOMELAB-2626-h8-skills-pi
Homelab:plane/HOMELAB-2618-h3-checklist
Homelab:plane/HOMELAB-2547-sbx-sendrast-pin7
Homelab:plane/HOMELAB-2618-h7-sbx-sendrast-kubectl
Homelab:plane/HOMELAB-2618-h6-sbx-lab-viewer
Homelab:plane/HOMELAB-2547-sbx-sendrast-pin6
Homelab:plane/HOMELAB-2614-etcd-leader-alert
Homelab:plane/HOMELAB-2547-sbx-sendrast-r59
Homelab:plane/HOMELAB-2618-h4-ci-reader
Homelab:plane/HOMELAB-2618-h2v3-sbx-sendrast
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin5
Homelab:plane/HOMELAB-2547-sbx-sendrast-pidir
Homelab:plane/HOMELAB-2547-sbx-sendrast-pooldir
Homelab:plane/HOMELAB-2618-h5c-bump
Homelab:plane/HOMELAB-2547-sbx-sendrast-credhelper
Homelab:plane/HOMELAB-2618-h1fix-kustomize
Homelab:plane/HOMELAB-2618-h5-sbx-fleet
Homelab:plane/HOMELAB-2618-h1-fuente-unica
Homelab:plane/HOMELAB-2618-h2-sendrast
Homelab:plane/HOMELAB-2547-sbx-sendrast-rbac
Homelab:plane/HOMELAB-2618-h0-ondelete
Homelab:plane/HOMELAB-2446-wk01-requests
Homelab:plane/HOMELAB-2570-idle-liveness
Homelab:plane/HOMELAB-2511-step-alert
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin4
Homelab:plane/HOMELAB-2546-sbx-sendrast-health2
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin3
Homelab:plane/HOMELAB-2546-sbx-sendrast-health
Homelab:plane/HOMELAB-2546-sbx-sendrast-gotoolchain
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin2
Homelab:plane/HOMELAB-2546-sbx-sendrast-r43
Homelab:plane/HOMELAB-2445-descheduler-repause
Homelab:plane/HOMELAB-2546-sbx-sendrast-psa
Homelab:plane/HOMELAB-2537-sbx-gits-post-humo
Homelab:plane/HOMELAB-2546-sbx-sendrast-wk03
Homelab:plane/HOMELAB-2537-sbx-gits-fix-perm
Homelab:plane/HOMELAB-2546-sbx-sendrast-pin
Homelab:plane/HOMELAB-2546-sbx-sendrast-platform
Homelab:plane/HOMELAB-2546-sbx-sendrast
Homelab:plane/HOMELAB-2537-sbx-gits
Homelab:plane/HOMELAB-2481-dind-gc-tightening
Homelab:archive/plane/HOMELAB-2481-node-local-dind-20261110
Homelab:plane/HOMELAB-2481-node-local-dind
Homelab:plane/HOMELAB-2535-sbx-lab-gitops
Homelab:plane/HOMELAB-2483-volume-usage-alert
Homelab:plane/HOMELAB-2482-slice-B-prepare
Homelab:plane/HOMELAB-2482-slice-C-ephemeral-ceilings
Homelab:plane/HOMELAB-2483-retention
Homelab:plane/HOMELAB-2483-alerts
Homelab:plane/GITS-395-emulator-adb-v2
Homelab:plane/GITS-395-emulator-adb
Homelab:plane/HOMELAB-2472-dor-newtest
Homelab:plane/GITS-403-emu-env-drift
Homelab:plane/HOMELAB-2467-gitleaks-scan
Homelab:plane/GITS-401-dind-digest
Homelab:plane/GITS-371-android-emu-prestop-command
Homelab:plane/GITS-371-android-emu-dind-drain
Homelab:plane/GITS-371-android-emu-shutdown-grace
Homelab:plane/HOMELAB-2196-speed-batch
Homelab:plane/HOMELAB-2442-android-ci-raise
Homelab:plane/HOMELAB-2442-runner-pool
Homelab:plane/HOMELAB-2442-mem-rightsize
Homelab:plane/HOMELAB-2443-ldpush-memory
Homelab:plane/HOMELAB-2444-fpr
Homelab:plane/GITS-364-emu-drift-fix
Homelab:plane/GITS-362-release-upload-mount
Homelab:plane/HOMELAB-2432-alerts
Homelab:plane/HOMELAB-1945-landing-step
Homelab:plane/HOMELAB-2421-dashboard
Homelab:plane/HOMELAB-2417-baseline
Homelab:plane/HOMELAB-2418-runners
Homelab:plane/HOMELAB-2415-budget-kill-scope
Homelab:plane/GITS-33-e0r-t3-android-release-lane
Homelab:plane/HOMELAB-2412-pernode-cap
Homelab:plane/GITS-281-android-ci-pin
Homelab:plane/HOMELAB-2407-gate-creation-exempt
Homelab:plane/GITS-281-android-ci-image-emulator
Homelab:plane/HOMELAB-2406-panel-artifact
Homelab:plane/GITS-22-e0-t13
Homelab:plane/HOMELAB-2402-node-keys
Homelab:plane/GITS-21-e0-t12
Homelab:plane/GITS-19-e0-t10
Homelab:plane/GITS-18-e0-t9
Homelab:plane/HOMELAB-1941-b13-slice2
Homelab:plane/HOMELAB-2400-active-rows
Homelab:plane/HOMELAB-2395-trim-manage-key
Homelab:plane/HOMELAB-1944-panel-gateway
Homelab:plane/HOMELAB-2392-diff-fetch
Homelab:plane/HOMELAB-1940-caps-accounting
Homelab:plane/HOMELAB-2390-diff-git
Homelab:plane/HOMELAB-1944-panel-runtime
Homelab:plane/HOMELAB-2329-gate-decision
Homelab:plane/HOMELAB-2381-claim-retry
Homelab:plane/record-sql-test-fix
Homelab:plane/HOMELAB-2373-tailscale-1.104.4
Homelab:plane/HOMELAB-2357-resume-inflight
Homelab:plane/HOMELAB-2372-fail-closed
Homelab:plane/HOMELAB-2278-freshness
Homelab:plane/HOMELAB-2356-runtime-verdicts
Homelab:plane/HOMELAB-2281-objectlock
Homelab:plane/HOMELAB-2340-pane-loss
Homelab:plane/HOMELAB-1943-frozen-charters
Homelab:plane/HOMELAB-2348-replay-refusal
Homelab:plane/HOMELAB-1944-review-panel
Homelab:plane/HOMELAB-2341-reauthorize-anchor
Homelab:plane/HOMELAB-1942-workflow-knobs
Homelab:plane/HOMELAB-2327-signing-dispatch
Homelab:plane/HOMELAB-2280-pacing
Homelab:plane/HOMELAB-2195-f9-dor
Homelab:plane/HOMELAB-2249-orphan-alert
Homelab:plane/HOMELAB-2311-runbook
Homelab:plane/HOMELAB-2302-argocd-reader
Homelab:plane/HOMELAB-2273-etcd-snapshot-b2
Homelab:plane/HOMELAB-2298-eso-repo-password
Homelab:plane/HOMELAB-2274-raft-b2
Homelab:plane/HOMELAB-2249-alerts
Homelab:plane/HOMELAB-2258-xhost-sc
Homelab:plane/HOMELAB-2259-strict-local
Homelab:plane/HOMELAB-2195-f4-workflow-id
Homelab:plane/HOMELAB-2260-node-labels
Homelab:plane/HOMELAB-2257-zone-labels
Homelab:plane/HOMELAB-2195-b2-drain-rule
Homelab:plane/HOMELAB-2195-b3-records
Homelab:plane/HOMELAB-2195-b5-fragility
Homelab:plane/HOMELAB-2195-b1-dor-pickup
Homelab:plane/HOMELAB-1939-bumpupdate
Homelab:plane/HOMELAB-1939-mergedecode
Homelab:plane/HOMELAB-1939-agentwait
Homelab:plane/HOMELAB-2240-lane
Homelab:plane/HOMELAB-2246-runner-1rep
Homelab:plane/HOMELAB-1980-b11-pane-hold
Homelab:plane/HOMELAB-2235-argocd-memory
Homelab:plane/HOMELAB-2232-proxmox-module
Homelab:plane/HOMELAB-gitops-atlantis
Homelab:plane/HOMELAB-2210-docker-config-seed2
Homelab:plane/HOMELAB-2210-runner-pin
Homelab:plane/HOMELAB-2210-runner-buildx
Homelab:plane/HOMELAB-1932-ld-runners
Homelab:plane/HOMELAB-2200-snapshot-retain
Homelab:plane/HOMELAB-2199-cnpg-backup-stale
Homelab:plane/HOMELAB-2201-runner-gc
Homelab:plane/HOMELAB-1926-plane-rabbitmq-resources
Homelab:plane/HOMELAB-1905-cnpg-ha-docs
Homelab:plane/HOMELAB-1906-cronjob-ttl-rules
Homelab:plane/HOMELAB-1904-longhorn-fixes
Homelab:plane/HOMELAB-1908-annotation-fix
Homelab:plane/HOMELAB-1904-cnpg-ha-rules
Homelab:plane/HOMELAB-1904-recyclarr-netpol
Homelab:plane/HOMELAB-1904-cpu-rightsize
Homelab:plane/HOMELAB-1893-alertintake-plane-storm
Homelab:plane/HOMELAB-1878-retention
Homelab:epic/LD4
Homelab:plane/HOMELAB-1885-cockpit-e2e
Homelab:plane/HOMELAB-1727-skillhealth
Homelab:plane/HOMELAB-1728-signals
Homelab:plane/HOMELAB-1731-fitness
Homelab:plane/HOMELAB-1859-gateway
Homelab:plane/HOMELAB-1847-oncall
Homelab:plane/HOMELAB-1690-l7
Homelab:plane/HOMELAB-1850-tempo
Homelab:plane/HOMELAB-1850-attribution
Homelab:plane/HOMELAB-1686-meetings
Homelab:epic/LD3
Homelab:plane/HOMELAB-1684-derived-state
Homelab:plane/HOMELAB-1871-oidc-entrypoint-fix
Homelab:plane/HOMELAB-1871-oidc-sync
Homelab:plane/HOMELAB-1865-atlantis-leg
Homelab:plane/HOMELAB-1730-readiness
Homelab:plane/HOMELAB-1681b-image-dispatch
Homelab:plane/HOMELAB-1682-gates-backend
Homelab:plane/HOMELAB-1848-alert-audit
Homelab:plane/HOMELAB-1729-planfresh
Homelab:plane/HOMELAB-1848-contract-demo
Homelab:plane/HOMELAB-1854-longhorn-guard
Homelab:plane/HOMELAB-1685-intake
Homelab:plane/HOMELAB-1688-routines
Homelab:plane/HOMELAB-1687-el-director
Homelab:plane/HOMELAB-1827-prepull
Homelab:plane/HOMELAB-1827-livez
Homelab:plane/HOMELAB-1835-alert-rule
Homelab:plane/HOMELAB-1831-plane-vendor
Homelab:plane/HOMELAB-1746-es-newt-next
Homelab:plane/HOMELAB-1841-kubeprism
Homelab:plane/HOMELAB-1825-sandbox-pullsecrets
Homelab:plane/HOMELAB-1828-outline-minio
Homelab:plane/HOMELAB-1828-cnpg-alert
Homelab:plane/HOMELAB-1711-compile-before-claim
Homelab:plane/HOMELAB-1711-image-smoke
Homelab:epic/ld2
Homelab:plane/HOMELAB-1711-dispatcher-deploy
Homelab:plane/HOMELAB-1711-sweep-heart
Homelab:plane/HOMELAB-1824-omni-liveness
Homelab:plane/HOMELAB-1746-idp-redirect
Homelab:plane/HOMELAB-1711-sweep-control
Homelab:plane/HOMELAB-1711-raceprobe
Homelab:plane/HOMELAB-1711-dispatcher-image
Homelab:plane/HOMELAB-1720-identity
Homelab:plane/HOMELAB-1678-bashguard-fix
Homelab:plane/HOMELAB-1746-pangolin-oidc
Homelab:plane/HOMELAB-1680-custodian
Homelab:plane/HOMELAB-1678-scheduler
Homelab:plane/HOMELAB-1676-sentinel
Homelab:plane/HOMELAB-1677-rcbridge
Homelab:plane/HOMELAB-1796-teardown
Homelab:plane/HOMELAB-1794-spawn
Homelab:plane/HOMELAB-1797-claims
Homelab:plane/HOMELAB-1808-1809-fixes
Homelab:plane/HOMELAB-1791-sandbox-init
Homelab:plane/HOMELAB-1795-watch
Homelab:plane/HOMELAB-1798-compiler
Homelab:plane/HOMELAB-1674-claude-image
Homelab:plane/HOMELAB-1672-job-contract
Homelab:plane/HOMELAB-1698-meet-ai-namespace
Homelab:plane/HOMELAB-1635-cp01-pins
Homelab:plane/HOMELAB-1585-argocd-repo-creds
Homelab:plane/HOMELAB-1766-gateway-alerts
Homelab:epic/LD1
Homelab:plane/HOMELAB-1735-env-fix
Homelab:plane/HOMELAB-1735-harbor-robot
Homelab:plane/HOMELAB-1666-agent-sandbox
Homelab:plane/HOMELAB-1665-pi-image
Homelab:archive/epic/LD0-20261109
Homelab:plane/HOMELAB-1634-dind-harbor-auth
Homelab:plane/HOMELAB-1634-runner-cleanup
Homelab:plane/HOMELAB-1634-review-followups
Homelab:homelab/HOMELAB-1630-runner-resources
Homelab:plane/HOMELAB-1621-cpu-barchart
Homelab:plane/HOMELAB-1619-mgmt-vm-dashboard
Homelab:plane/HOMELAB-1598-oidc
Homelab:plane/HOMELAB-1574-plane-image-bump
Homelab:plane/HOMELAB-1535-outline-prestop
Homelab:plane/HOMELAB-1535-outline-ha
Homelab:plane/HOMELAB-1534-reviewer-fetch-auth
Homelab:plane/HOMELAB-1518-longhorn-rule-fix
Homelab:plane/HOMELAB-1527-tempo-pipeline
Homelab:plane/HOMELAB-1526-mqttx-web
Homelab:plane/HOMELAB-1511-prowlarr-qbit
No reviewers
Labels
No labels
operator-review
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
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/infra-core!950
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "lr-20261111-025/amendment-4"
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?
Spec 025 / AMENDMENT 4: 8098 posts as ld-reviewer; R29 one-claim-per-seat; the relay's provenance gate
El Director's identity ruling, built to homelab-3c's five binding conditions
(agreed 2026-11-11). This is a gate change — it moves what authored seat
verdicts the fleet's gates count.
The five conditions, each with its proof
The endpoint's comment POST uses
LD_REVIEWER_TOKEN(mounted fromld-runtime-forgejo-reviewer, which prod already carries — no newidentity, no prod env change); the head read keeps
LD_FORGEJO_TOKEN. Amissing reviewer token is a per-call 502 naming the variable — never
a boot failure and never a fallback to the landing token (that
fallback would post as pi-landing, the exact bug this amendment exists
to fix). The guard gains a census of ld-reviewer identity material under
core/manifests/apps/sbx-*/: the two known copy-pairs (sbx-lab +sbx-gits, removed at the 009(c) daylight cut) are pinned, and any NEW
reference or renamed secret fails the suite.
TestNoReviewOnTheSeatPostPathparses the package sources and thewiring with go/ast (comments invisible): any
/reviewsliteral orreview-shaped seam method fails; the
Posterinterface is pinned toexactly
{PostIssueComment, PullHead}. Both halves proven to bite withtemp probes, then reverted.
00008 (prod #1210, additive, lands first). Same sid + fresh bundle +
same target is refused (
TestOneSeatClaimPerTargetIsR29); a burnedbundle is final for the seat on that target — recovery is a fresh
registration with a FRESH SID, because the verdict is the seat's and the
seat gets one. The boot index assertion now requires
seat_posts_one_claim_per_sid+seat_posts_one_postand names whichis missing; the dropped per-bundle claim name is no longer required.
here relaxes it — no census code touched; the endpoint still records the
sid and the comment_id the provenance read counts by.
endpoint (provenance: the comment_id is in
seat_postsfor thatrepo/pr/head, read in-process from the record DB). Env-gated —
LD_RELAY_PROVENANCE_ONLY, default OFF, prod flips it at the daylightcut, one boot line names the state either way; fail-closed on a
provenance read error (an unverifiable verdict is skipped, never
counted); gate-off behavior is byte-for-byte today's.
The residual, explicit
Anything in sbx-lab can still call 8098 and post an ld-reviewer-authored
verdict claiming a seat sid. Until spec 026 (R27) stamps the tags, what
makes a comment a seat is the gateway sid check plus the one-post,
head-pinned rule, NOT the author.
Roll-out order (with the lead)
it — the image below asserts the new index at boot.
census keeps the removal honest), prod sets
LD_RELAY_PROVENANCE_ONLY,and seats post only through 8098.
Proof
go vet ./...clean;go test -race -count=1 ./seatpost/ ./record/ ./relay/ ./cmd/ld-runtime/— all ok (31/34/58/60 test functions).pre-existing, unchanged.
no independent walk: implementer-run checks only
Lab-Run: LR-20261111-025
Review round 2 (stacked
2f50d0d0) — homelab-3c's B1-B3/C5/teststhe pin (case variants normalized; anything lower-casing cannot fix is
refused), the sid is stored verbatim. Real-index proof: the CI schema
now carries
seat_postswith both partial unique indexes, andTestConcurrentClaimOnOneSidInsertsOnceissues two racing INSERTsagainst PostgreSQL — ci.yaml fails the build if it did not execute.
relay's
resolved <ID>lines count only with endpoint provenance(same env gate; off = byte-for-byte old behavior).
PURPOSE, the ld-reviewer token still reaches sbx-lab and sbx-gits, the
store's namespace condition is the daylight cut's job. PR text matches.
TestNoReviewOnTheSeatPostPathwalks run/forgejo.go's callgraph and pins the Poster method set (proven to bite on a rename and a
/reviewsprobe); the R29 concurrency test asserts exactly one Forgejocall and the loser's named refusal.
LD_RELAY_PROVENANCE_ONLY=true(inert until the next pin rolls an image that reads it).
NO seats on this round until the seat-launch tooling (#312 @7a43b28)
lands, per the lead.
go vet+go test -racegreen on seatpost /record / relay / cmd/ld-runtime.
Patch for this round:
amendment4-r2-interdiff.patch(5732e5f0..2f50d0d0); full PR diff:
amendment4-diff.patch.APPROVE — ld-reviewer — head
5732e5f0f2SESSION: LR-20261111-025-seatB-20261111T2234Z
MODEL: omniroute/deepseek-flash
VERDICT: APPROVE. All five AMENDMENT 4 conditions are implemented and testable at this head; three findings below are non-blocking (one documentation, two verification follow-ups). Judged on the diff, the tests and the guard only.
FINDINGS (each checkable on its own):
sed -n 965p lab-director/dispatcher/seatpost/post.goprints "the database's two partial unique indexes (seat_posts_one_claim, seat_posts_one_post — record/seat_posts.go carries the DDL contract)". The executable paths are correct (claim read and boot assert both useseat_posts_one_claim_per_sid), andrecord/seat_posts_test.gobars the old name only fromrecord/seat_posts.go, so this comment contradicts the same file's head note (line 42) and condition 3's "the dropped per-bundle index name is gone". Documentation only — fix in a follow-up, not a landing blocker.seatpost/post.go:243addsResultAlreadyClaimed = "already_claimed_target", now written by every R29 refusal. No.sqlin this repo constrainsseat_posts.result(grep -rn seat_posts --include=*.sql .→ empty; the migrations ride the prod PR), andwriteAuditonly logs a failed insert ("the audit row is missing"), so a prod-side CHECK constraint excluding this value would silently drop every R29 refusal row. Check: the 00008 DDL on the prod PR for a CHECK onresult.processedmap —relay/poller.goprovenanceIgnoredgains one entry per unprovenanced comment id and is never trimmed; bounded by the comments on the relay's single repo (grep -n provenanceIgnored lab-director/dispatcher/relay/poller.go). Not a defect, just noted for the daylight cut.CONDITION 1 — POST uses LD_REVIEWER_TOKEN, no fallback, missing reviewer token is a per-call 502 naming it: PASS.
cmd/ld-runtime/seat_post.goreadsLD_REVIEWER_TOKENintopostTokenwith noenvOrdefault (no fallback),PostIssueCommentbuilds the client withp.postTokenand refuses with%w ErrPosterUnconfigured (LD_REVIEWER_TOKEN absent)if empty,PullHeadkeepsheadToken;seatpost/post.gomissingCredential()names the read variable first, thenLD_FORGEJO_TOKEN(nil poster), thenMissingPostTokenEnv, and is called before the head read and before the claim INSERT, so a 502 burns nothing. Tests:TestSeatPostMissingReviewerTokenRefusesPerCallasserts HTTP 502 whose body namesLD_REVIEWER_TOKENand never the landing token value;TestSeatPostReadsItsEnvironmentassertspostToken/headTokenare the two distinct values and neither appears in the boot line.CONDITION 2 — plain comments only, no review endpoint on the seam, guard actually bites: PASS, proven by mutation on copies (discarded, never on the PR head). (a)
printf 'func probeReviewsCall(p string) string { return p + "/repos/o/r/pulls/1/reviews" }'appended to a COPY ofseatpost/post.go→TestNoReviewOnTheSeatPostPathFAILS atpost_test.go:1475naming the literal. (b) aPostReviewmethod added to a COPY ofcmd/ld-runtime/seat_post.go→ same test FAILS atpost_test.go:1481naming the identifier, i.e. the wiring file is really in scope. The seam is additionally pinned by method set (want = {PostIssueComment, PullHead}, extra method → fatal), and the guard is anti-vacuous (scanned < 2, zero literals/idents → fatal). Unmutated copy:ok ... 0.011s.CONDITION 3 — R29: PASS. Claim key is (repo, pr, head, sid):
selectSeatPostClaimedSQLfiltersrepo=$1 and pr=$2 and head=$3 and sid=$4 ... action='post' and result='claimed'(nobundle),SeatPostClaimedForTargetscans it, the claim INSERT's unique violation maps to the same 409ReasonAlreadyClaimed, and the store seam is renamedClaimedForTarget. Boot assert requiresseat_posts_one_claim_per_sid+seat_posts_one_post(seat_post.goseatPostSchemaOK/missingSeatPostIndexes),SeatPostsIndexesqueries those two names and the old name is not awaited (only mentioned in prose);TestSeatPostsIndexesAssertsThe00008Namespins the exactQueryContext(..., "seat_posts_one_claim_per_sid", "seat_posts_one_post")call and fails if"seat_posts_one_claim"reappears inrecord/seat_posts.go. Behaviour:TestOneSeatClaimPerTargetIsR29proves same sid + fresh bundle + same head → 409 with exactly one Forgejo call, a different sid on the same target still posts, and a claim on another head does not refuse.CONDITION 4 — no census code relaxed: PASS.
git diff --numstat origin/live...HEADtouches 11 files, none of them census code (forgejo-ext.yamluntouched);scripts/gits-sbx-epic-test.shdiff is +98/−0 (new section 30 only, zero deletions). Section 30's census reproduces today's set exactly and its mutation test bites (see TEST lines).CONDITION 5 — relay gate env-gated, default off, fail-closed, OFF is the old loop: PASS.
envBoolturns ON only for1/true/yes/on, everything else (including typos) falls back to the defaultfalse(relayProvenanceOnly()passesfalse);relay.NewREFUSESProvenanceOnly && Provenance == nil;provenanceSkipreturns false immediately when OFF (no seam read at all), returns true on a read error (nothing decided, not marked processed, next poll retries), and returns true on a false answer (logged once, never decided, not processed) with acceptance still requiring a TRUE answer scoped to the relay's owncfg.Repo,pr.HeadSHAand comment id; skipped comments write no decision row. Tests:TestProvenanceGateOffIsTheOldLoopByteForByte(seam never read, exact pre-cut log line, 1 review filed),...OnIgnoresAnUnprovenancedVerdict,...OnAcceptsAProvenancedVerdict(including "a proof for another head is not a proof for this one"),...OnFailsClosedOnAReadError,...NeedsASeam,TestRelayProvenanceGateIsWiredFromTheEnv(unset/off/garbage → off; on/1 → on),TestRelayProvenanceReadsTheSeatPostLedger(seam isSeatPostEndpointPosted, wired vianewRelayProvenance(store)).TEST:
git rev-parse HEAD→5732e5f0f27099e60b409faccdf288811dcf4df7(git checkout of that sha)cd lab-director/dispatcher && go vet ./...→ exit 0go test -race -count=1 ./seatpost/ ./record/ ./relay/ ./cmd/ld-runtime/→ exit 0 (ok seatpost 1.468s, ok record 1.079s, ok relay 1.286s, ok cmd/ld-runtime 1.259s)core/manifests/apps/sbx-*: exactly 12 lines =S30_WANT; appending- name: ld-reviewer-identity+secretName: sbx-sendrast-ld-reviewerto a copy ofsbx-sendrast/statefulset.yamlproduces12a13,14(red), so a second sbx-* ld-reviewer reference fails the tripwireAPPROVE — ld-reviewer — head
5732e5f0f2SESSION: LR-20261111-025-seatA-20261111T2234Z
MODEL: omniroute/deepseek-flash
VERDICT: APPROVE — all five binding conditions of AMENDMENT 4 hold in the implementation; no blocker found.
FINDINGS: none blocking.
fmt.Sprintf("POST %s/repos/o/r/pulls/1/reviews", ...)→ FAIL "a string literal on the seat-post path names a review"; addingvar dismissReview int→ FAIL "the identifier dismissReview is review-shaped". Clean copy exits 0.NOTE (non-blocking, pre-existing, not introduced here): lab-director/dispatcher/seatpost/post.go:965 still names the dropped per-bundle index
seat_posts_one_claimin the in-process-claim comment (identical text on origin/live at line 908). Behavior, SQL and the boot assert all use seat_posts_one_claim_per_sid; only that comment is stale.TEST: cd lab-director/dispatcher && GOMODCACHE=/tmp/gmc-
go vet ./... → exit 0TEST: go test -race -count=1 ./seatpost/ → exit 0 (ok 1.280s)
TEST: go test -race -count=1 ./record/ → exit 0 (ok 1.064s)
TEST: go test -race -count=1 ./relay/ → exit 0 (ok 1.235s)
TEST: go test -race -count=1 ./cmd/ld-runtime/ → exit 0 (ok 1.114s)
TEST: head verified: git rev-parse HEAD =
5732e5f0f2LD-VERDICT REQUEST_CHANGES head=2f50d0d0eb6972cd6f653b19846a39c37b3e633e session=LR-20261111-025-seatA-20261112T1619Z
HOLD — the endpoint-provenance gate (C5) can never match on the one repo the relay serves, so flipping LD_RELAY_PROVENANCE_ONLY=on silently ignores every verdict and every
resolved <ID>.FINDINGS
repo = $1exactly. Registration stores the CANONICAL repo — seatpost/post.go:213-228 lower-cases it — so a lab-director pin is storedhomelab/lab-director, while the relay only ever decides on cfg.Repo =Homelab/lab-director(allowlist relay/relay.go:63 is an exact string; poller.go:553 refuses anything else). Case-sensitive text equality then misses for every comment: all verdicts/resolutions ignored, fail-closed but total.Clear it by canonicalising on the provenance path — lower-case the repo before the read at cmd/ld-runtime/seat_post.go:241, or
lower(repo) = lower($1)in selectSeatPostEndpointPostedSQL — and add a test that crosses the boundary: real store/query,Homelab/lab-directorasked,homelab/lab-directorpinned. relay/relay_test.go:36 uses the same mixed-case testRepo as fakeProvenance, so no existing test can see the mismatch.REVIEWED AND OK
TEST
model: omniroute/deepseek-flash
session: LR-20261111-025-seatA-20261112T1619Z
LD-VERDICT APPROVED head=2f50d0d0eb6972cd6f653b19846a39c37b3e633e session=LR-20261111-025-seatB-20261112T1619Z
APPROVE — ld-reviewer — head
2f50d0d0ebJudged the diff 3563ec7f...2f50d0d0 only (no PR comments or reviews read; no formal review filed).
WHAT I CHECKED AND FOUND SOUND
Lab-Run: LR-20261111-025(census builder leg OK).live, which post.go:1158 has already proven equal toreg.Head— so the read key and the index key cannot drift.seat_posts_one_claim_per_sidand explicitly does not await the dropped name (record/seat_posts.go:316, cmd/ld-runtime/seat_post.go:355-362): no "migration pending" deadlock on the old index.FINDINGS (non-blocking, in landing-relevance order)
update seat_posts set repo = lower(repo) where repo <> lower(repo);in prod 00008, orlower(repo) = $1in those three WHEREs. Moot if 00007+00008 carry no rows yet — please state which; the diff is silent.resolved <ID>gate changes only LOG lines: nothing in this repo consumes a resolution (the landing lock reads the gated repo's own comments), so "counts only with endpoint provenance" overstates what shipped. Reportable, but the lock/census half must not be assumed done.TESTS
model: omniroute/deepseek-flash
session: LR-20261111-025-seatB-20261112T1619Z
The security lead's R1 and R5 (950-review-lead-r2). R2, R3 and R6 stay as they were; R4 is a NAMED RESIDUAL (recorded on the PR, closed by spec 031), not code. R1 — THE CLAIM KEY COMPARED THE SID BYTE FOR BYTE, BUT THE CENSUS GROUPS A SEAT BY session.toLowerCase() (forgejo landing.ts). Two spellings of one sid were therefore ONE seat to the gate that counts verdicts and TWO claims to the ledger: a second spelling could claim the same (repo, pr, head) and post a second verdict for it. Both halves of R1, because a key can be folded or the input can be refused, and each alone leaves a hole: * `selectSeatPostClaimedSQL` now reads `lower(sid) = lower($4)` (record/seat_posts.go). It can only REFUSE more, never allow more, and it makes the endpoint's read agree with the census. The pin still stores the sid VERBATIM, so a verdict is attributed to the exact tag it declared. * `canonicalSid` now REFUSES instead of trimming (seatpost/post.go): the allowlist is the lock's own session charset [A-Za-z0-9._:-], so leading, trailing and inner WHITESPACE, ZERO-WIDTH characters (U+200B, U+200D, U+FEFF, U+00A0) and CONTROL characters are refused rather than folded into a different tag. Every sid in the fleet ledger fits the charset (checked: no character outside it in 60+ lines), so nothing a real seat sends is narrowed. R5 — THE §30 PASS LINE CLAIMED MORE THAN THE CENSUS CHECKS. It said "Ningun otro sbx-* lo lleva", which the code cannot know: it is a textual grep of three names over the FIRST-LEVEL core/manifests/apps/sbx-*/*.yaml files, with forgejo-ext.yaml excluded by name (it is a ConfigMap carrying Go code). The line now says exactly that, names the three patterns, and says what it cannot see: a reference written with another key, a Secret read through store + key, a subdirectory, and anything about namespace readability (009(c)'s job). RED ON2f50d0d0(new test files run against the OLD tree, in a temp worktree of this repo at2f50d0d0, removed afterwards): FAIL TestMalformedRequests (the new whitespace/zero-width rows: 200, want 400) FAIL TestRegisterRefusesUncanonicalSid (status = 200, want 400) FAIL TestSeatPostStatementsFilterOnActionAndResult (missing "lower(sid) = lower($4)"; still "sid = $4") TestClaimReadFoldsTheSidCase SKIPS here (LD_TEST_RECORD_DSN unset in this pod) and FAILS on2f50d0d0in CI, where the schema fixture runs: the old statement answers false for a claim written in the other spelling. TestClaimKeyFoldsTheSidCase is a BEHAVIOUR row, not a red-on-old row: the fake store mirrors the real statement, so it moves with the SQL by design. GREEN on this head: go build ./... ; go vet ./... ; go test -count=1 ./seatpost/ ./record/ ./cmd/ld-runtime/ ./relay/ -> all ok; gofmt clean on every changed file; scripts/gits-sbx-epic-test.sh passes bash -n (the §30 census LOGIC is untouched — only its PASS sentence changed). Lab-Run: LR-20261111-025Residual record for #950 (LR-20261111-025) — R4, quoted as the lead directed
Round 3 of this PR (head
75486a4d) answers the security lead's R1 and R5; R2, R3 and R6 were already clear. R4 is accepted as a NAMED RESIDUAL and is deliberately not fixed here. Quoted:What changed in this round (one stacked commit, no amend, no force):
selectSeatPostClaimedSQLnow readslower(sid) = lower($4)(record/seat_posts.go), so a second spelling of one sid cannot claim the same (repo, pr, head): the census groups a seat bysession.toLowerCase(), and the ledger now agrees with it. It can only refuse more, never allow more, and the pin still stores the sid verbatim, so a verdict is attributed to the exact tag it declared.canonicalSid(seatpost/post.go) holds the sid to the lock's own session charset[A-Za-z0-9._:-]: leading, trailing and inner whitespace, zero-width characters (U+200B, U+200D, U+FEFF, U+00A0) and control characters are refused with the named reason. Every sid in the fleet ledger fits that charset, so no real seat is narrowed.core/manifests/apps/sbx-*/*.yamlfiles, withforgejo-ext.yamlexcluded by name; the line now states that, and states what it cannot see (a reference written with another key, a Secret read by store + key, subdirectories, namespace readability).Red on
2f50d0d0, from a temp worktree of this repo at the old head with the new test files (removed afterwards):TestMalformedRequests(the new whitespace/zero-width rows),TestRegisterRefusesUncanonicalSidandTestSeatPostStatementsFilterOnActionAndResultall fail there;TestClaimReadFoldsTheSidCaseskips in this pod withoutLD_TEST_RECORD_DSNand fails on2f50d0d0in CI, where the schema fixture runs.TestClaimKeyFoldsTheSidCaseis a behaviour row whose fake mirrors the statement, so it moves with the SQL by design and is not offered as a red-on-old row.Green on
75486a4d:go build ./...,go vet ./...,go test -count=1 ./seatpost/ ./record/ ./cmd/ld-runtime/ ./relay/all ok, gofmt clean on every changed file,bash -n scripts/gits-sbx-epic-test.shok.Lab-Run: LR-20261111-025
Residual (security lead, 2026-11-12): claim uniqueness index is case-exact; closure = migration unique (repo, pr, head, lower(sid)) + boot check + S/s concurrency test, or spec 031.
LD-VERDICT APPROVED head=676e0dfc5da64039662fc22dec2bb9d1fe944a8c session=LR-20261111-025-seatA-20261112T1636Z
APPROVE — ld-reviewer — head
676e0dfc5dJudged at this head only: diff 3563ec7fad6f...676e0dfc5da6 (15 files, +2793/-202), this PR's own unit tests, and guard section 30. No comments or reviews were read.
WHAT I VERIFIED
resolved <ID>line needs the same provenance, with its own pinned grammar (relay/poller.go:470, :508).FINDINGS (non-blocking, one per line)
TESTS (this clone, this PR's tests only)
model: omniroute/deepseek-flash
session: LR-20261111-025-seatA-20261112T1636Z
LD-VERDICT APPROVED head=676e0dfc5da64039662fc22dec2bb9d1fe944a8c session=LR-20261111-025-seatB-20261112T1636Z
Approved. R29's claim key (repo, pr, head, sid) is carried by code, by the CI schema fixture and by a real-PostgreSQL racing-insert test that ci.yaml now requires to have executed; the posting credential is a SECOND identity (LD_REVIEWER_TOKEN) with no fallback to the landing token; the registration allowlist and the repo/sid canonicalisation are on the pin, not on the echo; the relay's endpoint-provenance gate ships OFF and is a no-op in that state; and the ld-reviewer material census under sbx-* is a tripwire that bites in both mutated directions. Head carries
Lab-Run: LR-20261111-025.FINDINGS (none blocking; listed so the next commit can take them)
provenanceSkipdoc block runs straight intoprovenanceRepo's, so provenanceRepo (433) carries a doc about provenanceSkip and provenanceSkip (437) carries none. Clear it by inserting a//separator at poller.go:420.logf's doc (226); it duplicates provenanceIgnored's doc (212-215). Delete 221-225.head = $3) and the relay only TrimSpaces pr.HeadSHA, while the repo half IS case-folded on both sides. Register lowercases the head (seatpost/post.go:722), so a non-lowercase head from the API would make EVERY verdict unprovenanced once the gate is on — the same silent-outage class seat A held on for repo. One-line clear:strings.ToLowerat poller.go:441.lower(sid) = lower($4)) but the unique index is byte-exact, so two case-variant spellings racing can BOTH insert a claim and both reach Forgejo; the index is therefore not the cross-replica arbiter the doc claims for that race (sequentially the read still refuses, so it can only refuse more). Either indexlower(sid), or state this residual beside seatpost/post.go:56.resolved <ID>gate is head-pinned: a provenanced withdrawal posted at H1 stops counting as soon as the head moves to H2, and it is then logged as "WITHOUT endpoint provenance" (495). Fail-closed (the hold stays in force), but the withdrawal is silently stranded and misdiagnosed.seat_posts_one_claim_per_sidcouples the image to prod 00008: an OLD ld-runtime still running after 00008 lands refuses every post, and the only evidence is a boot line printed before the migration applied. The prod PR must roll/restart ld-runtime in the same window.TESTS (this clone, this head)
git diff --stat origin/live 3563ec7 -- core/manifests/apps/sbx-gitsshows forgejo-ext.yaml + statefulset.yaml), and none of the 24 names a file this diff touches.model: omniroute/deepseek-flash
session: LR-20261111-025-seatB-20261112T1636Z
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.