C8 G1+G1c: sendrast-release robot into sbx-sendrast (head-pinned merge helper) #940
Open
pi-landing
wants to merge 3 commits from
plane/IR-20261111-c8grants into live
pull from: plane/IR-20261111-c8grants
merge into: Homelab:live
Homelab:main
Homelab:live
Homelab:sso/zitadel-guest-users
Homelab:sso/argocd-readonly-groups
Homelab:lr-20261111-025/amendment-4
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: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!940
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "plane/IR-20261111-c8grants"
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?
C8 G1 + G1c — REBUILD: the Sendrast-only robot in Jesús's sandbox, and the hardened merge helper
This head replaces the first attempt after homelab-93's BLOCKING review
(
working-files/security-hypervisor/pr-ic940/review-93.md). Nothing is applied, restarted or created by this PR.Why the rebuild (93 F1)
The first version mounted the existing release robot. That robot also has write on
Homelab/prod, and everyHomelab/prodworkflow runs on theinfra:hostrunner, which carries the SOPS age key, the AWS credentials forthe terraform state and the
OPENBAO_APPLY_*/OPENBAO_CI_*AppRoles. A writer there can run arbitrary code onthe infrastructure, so "landing is still gated" did not cover it. The sandbox now gets a Sendrast-only robot:
sendrast-robot— created by Aaron (click list, section E). Write onSendrast/api-sendrastandSendrast/sendrast-webonly. Neither the account nor its token exists yet, and this PR creates neither.kv/sendrast/sbx/release-robot(fieldtoken) — also not created yet, and this PRcreates no OpenBao object.
not mounted anywhere new.
G1 — the credential (
externalsecrets.yaml,statefulset.yaml)ExternalSecret sbx-sendrast-release-robot(nssbx-sendrast) readskv/sendrast/sbx/release-robotfield
token→ Secretsbx-sendrast-release-robot(creationPolicy: Owner,deletionPolicy: Retain, like itssiblings). Every reference to the old shared-robot object is gone from the PR's files and from this body.
openbao-sendrast(roleeso-sendrast), the namespace's own store — never the broadopenbaostore,which would hand the sandbox all of
kv/data/*./home/jesus: volumerelease-robot→/run/secrets/sendrast/release-robot/tokenin the
sandboxcontainer only (not indind,healthor the init containers).F2 — the store is now scoped to its namespace
openbao-sendrastis a ClusterSecretStore, and an unscoped one can be selected from any namespace by anyoneallowed to create an ExternalSecret there. The fix is
spec.conditions[].namespaces: [sbx-sendrast].The store has exactly one copy, in Homelab/prod
(
manifests/lab-director/ld-fleet-cluster-secret-stores.yaml), so this change cannot live in this repo. It iscommitted and pushed on a prod branch —
plane/IR-20261111-c8grants-store, headf51f9b1d2dd9eff2d5e281b4a16415f8f55cefb4— and no PR has been opened for it by this seat; it needs alanding worker. Verified against the live CRD:
external-secrets v2.2.0,spec.conditionsis schema-supported(
kubectl explain clustersecretstore.spec.conditions).Census before the change (live cluster, read-only, all 103 ExternalSecrets in every namespace matched on
secretStoreRef.name == openbao-sendrast):sbx-sendrast/sbx-sendrast-forgejo-tokenopenbao-sendrast(ClusterSecretStore)sendrast/sbx/forgejo-botReady=True SecretSyncedOne consumer, inside
sbx-sendrast. No namespace-scopedSecretStoreexists anywhere (kubectl get secretstores -A→ none), no ClusterExternalSecret exists, so nothing outside the sandbox loses anything. The newExternalSecret in this PR is in the same namespace.
Policy — no terraform change is needed (plan v2)
eso-sendrastalready readskv/data/sendrast/sbx/*andkv/metadata/sendrast/sbx/*, read-only(prod
terraform/openbao.tf,sendrast_eso_consumers). The new object is under that same prefix, so:Plan: 0 to add, 0 to change, 0 to destroy— no edit authored, nothing staged, nothing applied. The live proofis the census row above: the sibling ExternalSecret reads another object under the same prefix and is synced
today. Recorded in
working-files/infra-stability/c8-jesus-grants-20261111/tf-plan-eso-sendrast-v2.txt.The old
tf-plan-eso-sendrast.txt(v1) is dead: it planned an in-place widening to reach the shared robot'spath, which belonged to the rejected design. It must not be applied, and its uncommitted change in
prod/.worktrees/IR-20261111-c8grants-tfis discarded.G1c — the helper (
sendrast-tools.yaml,statefulset.yaml)ConfigMap sbx-sendrast-tools, mounted read-only at/opt/sendrast-tools/(outside his home), two files.Provenance:
working-files/infra-stability/sendrast-release-unblock-20261110/sendrast-merge.py, source sha256re-verified
db8108eb40e7…before adapting; the{"Do": …, "head_commit_id": <expected>}merge call — the oneproperty Forgejo enforces server-side — is untouched.
Sendrast/api-sendrastandSendrast/sendrast-web, nothing else, refused before thefirst API call (
step=allowlist, exit 1). A--repo Homelab/prodrun was checked by hand and dies at thatstep without touching the network. The server-reported base is then checked too:
base.repo.full_namefromthe PR payload must be on the same allowlist (
step=repo-server, fails closed when missing or non-string), so ahand-typed
--repocannot misdescribe the PR's real base.is refused; then one
ld-reviewerAPPROVED review at the current head is required. This matters becausemainasks for zero required approvals, so the server-side approval whitelist is inert.--self-checkon both scripts — offline fixtures, no network, no token. The merge helper's set coversallowlist accept/refuse (incl. a case variant), the server-reported
base.repo.full_nameaccept/refuse, cleanapproval / dismissed / stale-flag / non-head / wrong-user / no-approval / no-reviews / non-list, CI success +
pending, "no token-bearing URL", "no command-line token", and the token-file mode rule (0666 refused, 0440
accepted) — 22/22 PASS:
python3 /opt/sendrast-tools/sendrast-merge.py --self-check. The credentialhelper's own self-check covers exactly the push route and nothing else — request with no path → refuse,
Homelab/prod→ refuse, and both Sendrast repos → answer — 14/14 PASS:sh /opt/sendrast-tools/sendrast-credential-helper.sh --self-check.sendrast-credential-helper.sh, a git credential helper that reads thesame file and answers only
get, onlyhttps, onlyforgejo.aaron.reynoza.organd only the two allowlistedrepos;
store/eraseare no-ops, so nothing is cached in.git/configon his persistent home. It replaces theimprovisation
git push https://x:$(cat token)@…, which puts the token in argv and history: All three parts are load-bearing.credential.helper=comes first: the pod's own environment alreadyregisters a helper, and a bare
!/opt/sendrast-tools/…(or a helper appended without clearing the inheritedone) has the pod's helper answering instead — and the script is mounted 0440, so invoking it directly gets
Permission denied; it is run throughshfor the same reason.useHttpPath=trueis required: without itgit sends no
pathon the credential request, and the helper deliberately refuses a path-less request ratherthan answering for any repo on the host.
Authorizationheader cannot be replayedat another host; the docstring now matches reality (exit 1/2, file mode 0440).
His home's pi-extensions copy (1112bfb) calls
/mergewithout the head pin. That copy is not edited andnothing is written under
/home/jesus: this helper is the sanctioned route.Deviations that still apply
defaultMode: 288(0440), not0400. The container runs as uid 1006 with podfsGroup1006, so aroot-owned 0400 file is unreadable for Jesús's uid and the mount would be dead weight. 0440 is the pattern
already proven in this pod (the git token), still non-writable for everyone, never in env, never in argv.
optional: trueon the Secret volume, and now doubly gated: the robot account does not exist AND the kvobject does not exist. An unplanned pod recreate must not leave Jesús's sandbox
Pendingover a secret thatcannot exist yet. Drop
optional: trueonce the ES isSecretSynced, so the mount is enforced.Go-live
At the next
sbx-sendrastrestart that homelab-a9 coordinates with Jesús, and ONLY once Aaron has createdsendrast-robot(click list, section E) andkv/sendrast/sbx/release-robotexists.updateStrategyisOnDelete: merging this changes nothing in the running pod, and this PR touches no restart path. The restartwindow checks
SecretSynced=Trueonsbx-sendrast-release-robotbefore any pod delete, exactly as forci-reader.Revocation, written down (93 F6):
deletionPolicy: Retainmeans removing the ExternalSecret later leaves the lasttoken in the namespace and in the pod. Revoking means rotating or deleting the robot's token in Forgejo, not
deleting the Secret.
Verify
kubectl kustomize core/manifests/apps/sbx-sendrastrenders: the new ConfigMap, the new ExternalSecret(key
sendrast/sbx/release-robot), and both mountsreadOnly: trueon thesandboxcontainer--self-check→ mergehelper 22/22 PASS, credential helper 14/14 PASS
sh -non the credential helper; it refuses a foreign host, a foreign repo path and a path-lessrequest (no
useHttpPath), accepts both Sendrast repos, and is exercised through the documentedcredential.helper=+useHttpPath=true+!sh …invocationyaml-lint+shellcheck+terraform-validategreen on this head (CI run #3581)sbx-sendrast(table above)spec.conditionsexists in the live CRD (external-secrets v2.2.0)SecretSynced=Trueonsbx-sendrast-release-robot— blocked on Aaron creating the robot and the kvobject (reported, not done here)
Lab-Run: IR-20261111-c8grantsExact head:
6ef31481dcBase:
35a336157dVERDICT: APPROVED (census format, seat A)
SESSION: IR-20261111-c8grants-seatA-20261111T1652Z
MODEL: deepseek-flash
Read route: ambient pi-landing API read only (PR body + diff + file blobs at the head sha + prod@live store/terraform). No comment/review read on this PR at any point before this comment (NO-READ respected).
Diff surface, verified against the tree, not the prose: exactly 4 files, all under
core/manifests/apps/sbx-sendrast/(externalsecrets.yaml,kustomization.yaml, newsendrast-tools.yaml,statefulset.yaml). Two hunks in the StatefulSet (volumeMounts, volumes), nothing else.kubectl kustomize core/manifests/apps/sbx-sendraston a clean clone of the head renders (exit 0): ConfigMapsbx-sendrast-tools, ExternalSecretsbx-sendrast-release-robot, StatefulSet with both new mountsreadOnly: trueandupdateStrategy: OnDelete. CI combined status at the head =success(11 contexts, re-read myself, not taken from the body).LEGS
(a) G1 credential — PASS. ES
sbx-sendrast-release-robotin nssbx-sendrast,secretStoreRefClusterSecretStoreopenbao-sendrast,remoteRef.key: ci/forgejo-sendrast-release+property: token→ resolves tokv/data/ci/forgejo-sendrast-release(store pathkv, v2). Secretsbx-sendrast-release-robot,creationPolicy: Owner,deletionPolicy: Retain— matches the other 4 ESes in the file. Store identity verified independently:openbao-sendrastexists inHomelab/prod@live(manifests/lab-director/ld-fleet-cluster-secret-stores.yaml, wave 8) withrole: eso-sendrastbound toexternal-secrets/eso-openbao-reader, and the SAME store already serves the workingsbx-sendrast-forgejo-tokenES in this namespace — so the new ES is not blocked by store readiness, only by the role's path scope. Mountrelease-robot→/run/secrets/sendrast/release-robot+ itemtoken⇒ exact file/run/secrets/sendrast/release-robot/token;readOnly: true; outside/home/jesus. Names, paths and readonly are all correct.(b) defaultMode 288 (0440) deviation — PASS, and the deviation is the correct call. Verified in the manifest: pod
securityContext.fsGroup: 1006; thesandboxcontainer (the one that owns mounts 586–640) isrunAsUser: 1006 / runAsGroup: 1006 / runAsNonRoot: true / readOnlyRootFilesystem: true. A secret volume is deliveredroot:<fsGroup>atdefaultMode, so 0400 would be unreadable for uid 1006 and the mount would be dead weight; 0440 grants group-read only and is non-writable by anyone — and since every process in that container is uid/gid 1006, group-read adds no privilege beyond what 0400-for-1006 would have. Documented in both the manifest comment and the PR body, i.e. flagged rather than silently done. No env var, no argv: the diff adds no environment entries and the helper reads the token from the file. PASS.(c)
optional: true— PASS with a note. Correct fail-closed shape: while the ESO gap stands an unplanned pod recreate mounts an empty directory instead of leaving Jesús's sandboxPending, and once the Secret syncs the projected volume updates in place with no recreate (accurate as documented). Two precision notes, neither blocking: (1) withoptional: true, a Secret that existed and is then deleted leaves the last file content mounted, so "never starts with a stale token" is true at pod start but not for a long-lived pod; (2) if the token file is absent the helper dies on a bareFileNotFoundErrortraceback fromopen(args.token_file)rather than thestep=… code=…fail path — fail-closed (no merge, exit 1) but the body's "the helper's error says so" overstates the diagnostics. Droppingoptional: trueonceSecretSynced=True, as the body says, closes both.(d) G1c ConfigMap helper — PASS. Embedded copy extracted from the rendered ConfigMap:
ast.parseOK,--helpshows--token-fileoptional with default exactly/run/secrets/sendrast/release-robot/token(byte-matches the G1 mount path), head pin intact ({"Do": …, "head_commit_id": args.expect_sha}), the four checks present and ordered, token only via file, exits 2 on head move / 3 on unexpected code, mode 0440 and non-executable (invokedpython3 …), mounted read-only at/opt/sendrast-tools— same pattern as the already-working/opt/sbx-skillsand/opt/sbx-modelsmounts in this pod, so no read-only-rootfs conflict.sendrast-tools.yamlis inresources(7 entries = the 7 non-kustomization manifests in the directory; verified), and it renders, so ArgoCD will not prune it. Caveat on the one claim I cannot verify: the "byte-identical to sha256 db8108eb except the--token-filedefault" comparison is attested, not checkable — the pristine source lives in aworking-files/…path that is not in Git (I searched infra-core@head, prod, and the repo root; no such tree). The embedded blob hashes30e98f9c…. Recommend committing the pristine source (or its diff) into that record so the next reader can audit it instead of trusting the note.(e) No writes under /home/jesus — PASS. The whole diff is 4 files under
core/manifests/apps/sbx-sendrast/; no hostPath, no init container, no script touching the home tree. The amendment is purely additive manifests + controller-side mounts.(f) Trailer — PASS. Last line of the head commit message is exactly
Lab-Run: IR-20261111-c8grants(checked on the commit object at the exact head). Cosmetic only: the PR description wraps the same line in backticks.(g) No restart semantics — PASS.
spec.updateStrategy.type: OnDeleteis unchanged by the diff, present in the render, and norollingUpdate/partitionis introduced. No image, command, argument, annotation or env change in the StatefulSet hunks; onlyvolumeMounts+volumes. The merge therefore changes nothing in the running pod, as claimed; it takes effect only at a restart coordinated with Jesús.(h) ESO gap honesty — PASS, and the disclosure is accurate.
prod@live terraform/openbao.tfsendrast_eso_consumers = { sendrast = "sendrast/sbx" }grantseso-eso-sendrastread onkv/data/sendrast/sbx/*andkv/metadata/sendrast/sbx/*and nothing else, so this ES genuinely cannot readkv/ci/…and will sit inSecretSyncedErroruntil the policy widens. Plan-only (no apply) is consistent with the brief; nothing in this diff depends on the apply having happened. Fail-closed, unchanged running pod, self-healing on apply.STATED CONSEQUENCE, recorded: with this mount the
sendrast-releaserobot can push branches and open PRs onHomelab/prod(El Director, 16:14:25Z); landing stays gated;Sendrast/deploywrite is Jesús's own addition and is not touched here.FOLLOW-UPS I am not blocking on, but which should not be lost:
"Landing stays gated" is not evidenced anywhere in this change. The mounted helper takes
--repo, and its merge gate is step 2 = one Forgejo formalAPPROVEDreview byld-reviewerat the head — which our own landing policy explicitly treats as never-evidence. So the gate is the robot token's Forgejo permissions, not the helper file (the same token can call/mergewith plain curl). This PR does not state the robot's permission set onHomelab/prod, and no Git record of it exists (kv/ci/forgejo-sendrast-releaseis out-of-band; prod terraform documents onlysendrast-bot). Ask: record the robot's permissions — branch/PR write, explicitly no merge onHomelab/prod— in the same place the grant is documented, so "gated" is a documented fact rather than an intention.When the prod policy change is applied,
ClusterSecretStore openbao-sendrastcurrently has NOspec.conditions.namespaceSelector, so after the role is widened tokv/data/ci/forgejo-sendrast-releaseany namespace's ExternalSecret could pull that token cluster-wide. The prod PR that applies the one-line policy widen should add the namespace condition (and ideally tighten it tosbx-sendrast) — otherwise the "narrow store" framing in this PR's comments stops being true at exactly the moment the gap closes.VERDICT: APPROVED — legs (a)–(h) pass on substance at head
6ef31481dc; the two items above are required follow-ups in the prod apply, not defects in this diff.Seat B — census-format review, head
6ef31481dcSESSION: IR-20261111-c8grants-seatB-20261111T1652Z
MODEL: deepseek-flash
VERDICT: CHANGES — 1 blocking leg; the five substance legs (a)–(e) PASS as built.
What I re-derived myself instead of trusting the body: base
35a3361→ head6ef31481is ONE commit, 4 files, 274 insertions, 0 deletions;kubectl kustomize core/manifests/apps/sbx-sendrastrenders clean;resources(7) ==ls *.yamlminus the kustomization; the ClusterSecretStore and the ESO policy read out of Homelab/prodlive(not copied from this description).(a) ExternalSecret + mount — PASS (both deviations safe and documented)
externalsecrets.yaml:180-200: nssbx-sendrast, ClusterSecretStoreopenbao-sendrast, remoteRefci/forgejo-sendrast-releasepropertytoken, target Secretsbx-sendrast-release-robot,creationPolicy: Owner/deletionPolicy: Retain— the same shape as the five ES already in that file.manifests/lab-director/ld-fleet-cluster-secret-stores.yaml:326-350:path: kv,version: v2,role: eso-sendrast. Sokey: ci/forgejo-sendrast-releaseresolves tokv/data/ci/forgejo-sendrast-release, matching this file's own convention (ld/omniroute,ld/forgejo-ci-reader,sendrast/sbx/forgejo-bot). Path leg correct, and correctly NOT the broadopenbaostore.statefulset.yaml:626-628,readOnly: true, on thesandboxcontainer. Volume:763-770:secretName: sbx-sendrast-release-robot,items: token→token,defaultMode: 288. The chain lines up end to end: propertytoken→ secretKeytoken→ items.pathtoken→/run/secrets/sendrast/release-robot/token= the helper's default.sandboxrunsrunAsUser: 1006(:442) with podfsGroup: 1006(:107-108); a Secret volume is root-owned, so 0400 is unreadable for uid 1006 and the mount would be dead weight. 288 is the pattern already proven in this pod (ci-reader:746, omniroute key, sbx-skills).readOnly: trueon the mount is the write barrier — nothing in argv, nothing in env. Accepted trade, worth stating once: 0440 exposes the token to anything in the pod's group 1006, i.e. the same exposure the git bot token already has — consistent, not new.optional: true: safe for availability, honest, acceptable. It converts a misconfiguration into a silent absence instead of a Pending pod, which is the right trade for a sandbox that must not wedge on a policy that is not applied yet. Two nits, non-blocking: with no token file the helper dies atopen(args.token_file)with a bare FileNotFoundError traceback (line 97 of the extracted helper) — the PR says "the error says it"; it does, but not readably; and it sits next toci-reader, whose comment at:738says it deliberately has NO optional escape hatch, so a reader who does not have this PR body in front of them will read the two polarities as a mistake.terraform/openbao.tf:1039-1057grantseso-sendrastread onkv/data|metadata/sendrast/sbx/*only. This ES will sit in SecretSyncedError until the planned one-object policy change lands — exactly as documented, and the plan-only discipline (no apply) is right for C8.kv/ci/forgejo-sendrast-releaseexists at v2 with atokenfield (no OpenBao credential here; the builder read metadata only). If the field name is wrong this fails closed and, thanks tooptional: true, the pod still starts — bounded, so not a blocker.(b) ConfigMap / head-pinned helper — PASS on substance, provenance NOT verifiable
sendrast-tools.yaml:27-180; CMsbx-sendrast-toolsmounted read-only at/opt/sendrast-tools(statefulset.yaml:632-634, volume:774-779,defaultMode: 288), listed atkustomization.yaml:39, invoked aspython3 /opt/sendrast-tools/sendrast-merge.pyso 0440 and non-executable is correct.I extracted the block scalar and checked it:
ast.parseOK; the merge call is{"Do": …, "head_commit_id": args.expect_sha}(line 135) after the head check (line 104) and the read-back; the token comes only from a file (open(args.token_file), line 97), never argv, never env, never printed;--helpconfirms--token-fileis optional with/run/secrets/sendrast/release-robot/tokenas default (line 90). The four checks are intact.But the sha256 claim cannot be reviewed.
working-files/infra-stability/sendrast-release-unblock-20261110/sendrast-merge.pyexists in no reachable tree — not in infra-core, prod, lab-director or pi-extensions, and it is not gitignored, it is simply not committed. Sodb8108eb…cannot be re-derived by a reviewer or by CI, and nothing pins the bytes that are actually mounted (embedded copy: 6500 B,sha256 30e98f9c4ea52739b8616a1330d16fa837ceec21646ece6a4944c8dab4c8d651). Also "byte-identical except one change" is imprecise: the docstring gains a C8 G1c paragraph as well as--token-filechanging.(c) No writes under /home/jesus — PASS
Zero deletion lines in the whole diff; no hostPath, seed, image or
/home/jesuspath is touched; both new mounts are read-only and outside the home; the helper's default token path is under/run/secrets/, never the home.(d) Trailer — PASS
Single commit;
%(trailers)is exactly one trailer; the last non-empty line of the message, and nothing after it, isLab-Run: IR-20261111-c8grants.(e) No restart semantics — PASS
updateStrategy: OnDelete(statefulset.yaml:75-76), untouched; the additions are twovolumeMounts(bothreadOnly: true) and two volumes on an unchanged image; norollingUpdate/partition, no image bump, no delete/restart instruction anywhere in the diff. Nothing rolls on merge; it lands on the next sbx recreate that homelab-a9 coordinates with Jesús.BLOCKING
1. The repo's own invariant harness goes red on this head.
scripts/gits-sbx-epic-test.sh:2536-2556(H2v3[3]) requires the render's new(kind,name)objects for sbx-sendrast to equal EXACTLY six known ones (models-json, ci-reader, plane, viewer Role/RoleBinding/ServiceAccount), minus whatever the base ref already carries. Base35a3361already carries all six ⇒ expected-new is EMPTY. I ran the harness's ownobjs()derivation over base vs head: added =ConfigMap/sbx-sendrast-tools,ExternalSecret/sbx-sendrast-release-robot; removed = none ⇒sradded != srexpected⇒ FAIL. Sections [6]/[7] are also where this file pins the plane/ci-reader volumes and ci-reader's "no optional escape hatch", so the shape the sibling waves used is: extendsrexpectedwith the two new objects and add a small subsection pinning this volume's polarity (secretName,key: token,defaultMode: 288,optional: trueand why, mountreadOnly: true) so the two deviations are guarded the way the others are, instead of relying on this PR body. Two lines plus a short block. If this epic instead updates the harness in a later wave, say so in a reply and this leg is satisfied.SHOULD FIX in this PR
30e98f9c…, 6500 B) next to the G1c comment — or commit the source under a tracked path — so the "sanctioned route" has provenance in Git and future drift of this ConfigMap is visible. Drop the "only one change" wording to "docstring paragraph +--token-filedefault".--repois a free argument — so a pod holding this token also holds a merge tool whose gate is materially weaker than this fleet's landing lock (where verdicts are comments and formal review state is explicitly not evidence). Landing is safe only because Forgejo refuses the robot on Homelab/prod: that is implied by El Director's 16:14:25Z words, not stated in the diff. One line asserting the robot has no merge permission on Homelab/prod (or an allowlist on--repo) makes the boundary checkable instead of assumed. Sendrast/deploy write being Jesús's own addition is noted and correctly left untouched.NITS
models-json.yaml:57-58hasapp.kubernetes.io/part-of: sendrast-sandbox.tokenis mounted. A human pushing with the robot needs the login name in the credential helper too — one line of usage (/opt/sendrast-tools/..., loginsendrast-release, token by file) somewhere in Git would make the sanctioned route discoverable without this PR body.Nothing above asks to change (a)'s two deviations: as built, 0440 and
optional: trueare correct, and the second is already promised as a follow-up.VERDICT: CHANGES — 1 blocking leg (L4, the sanctioned push/tag route as documented), 3 advisories. Everything else in the brief checks out at this exact head.
Reviewed head
07e41d743b(base35a336157d), 4 files. I read the diff and the files at that head via the Forgejo API and re-derived the checks locally (kubectl kustomize render of core/manifests/apps/sbx-sendrast, extracted ConfigMap payloads, realgit credential fill). I did not use the author's verify list as evidence.LEGS
sbx-sendrast-release-robot(ns sbx-sendrast) → ClusterSecretStoreopenbao-sendrast,key: sendrast/sbx/release-robot,property: token, creationPolicy Owner / deletionPolicy Retain. Rendered output confirms exactly that.grep -rIl forgejo-sendrast-releaseover the whole tree at this head → NONE; the stringci/forgejo-sendrast-releaseappears nowhere, and the onlysendrast-releasehits are prose about not mounting the old robot.release-robot→secretName: sbx-sendrast-release-robot,optional: true,defaultMode: 288,items: [{key: token, path: token}]; mountreadOnly: trueat/run/secrets/sendrast/release-robotin thesandboxcontainer ONLY (rendered container map: dind 2142, sandbox 2215, health 2269 — the mount block sits inside sandbox; no init container mounts it). 0440 rationale is factually correct here: podfsGroup: 1006and sandboxrunAsUser 1006 / runAsGroup 1006, so a root-owned 0400 would be unreadable and 288 is the right call.sendrast-toolsmount is likewise readOnly and outside the home.main()is allowlist → token → PR head → reviews → CI → merge; the allowlist refusal happens beforeread_token()and before anyhttp()call, so--repo Homelab/proddies offline. Head pinhead_commit_idis in the merge body;--expect-shadrift exits 2. Review gate rejectsdismissed,stale, and any approval whosecommit_id != head, then requires anld-reviewerAPPROVED at head; CI combined status must besuccess(missing status is fail-closed). Token: no--token, file only, group/world-writable refused; redirects refused via_NoRedirect; no token in URL construction. I extracted the payload from the ConfigMap and ran it:python3 … --self-check→ 19/19 PASS,failures=0, exit 0;py_compileOK;sh -non the sibling OK.sh <path>accepts both Sendrast repos and refuses a foreign host andSendrast/api-sendrast-evil), but it cannot be invoked the way the PR documents it. The file is mounted atdefaultMode: 288(0440) on a read-only volume, and git runs!-prefixed helpers through the shell, which must execve the path. Reproduced with real git against the rendered mode, with ambient config cleared:printf 'protocol=https\nhost=forgejo.aaron.reynoza.org\npath=Sendrast/sendrast-web.git\n\n' | git -c credential.helper= -c credential.helper='!/tmp/tools/helper.sh' credential fill
→
/tmp/tools/helper.sh get: 1: …: Permission denied/fatal: could not read Username for 'https://forgejo.aaron.reynoza.org'(exit 128).The same file at 0440 via
!sh /tmp/tools/helper.shreturnsusername=sendrast-robot+ the token; at 0550 the direct form works. So the documented command in the ConfigMap header and in the PR body does not work. This is fail-closed (no leak), but it defeats the point of F4/F5: the "sanctioned route" a future agent would copy is dead, and the fallback stays thehttps://x:$(cat token)@…improvisation the review asked to eliminate. Fix is one line: document!sh /opt/sendrast-tools/sendrast-credential-helper.sh(keeps 288/0440, cleanest), or raise that volume to 0550 (360) and keep the direct form — then verify through realgit credential fill, not onlysh -n.updateStrategy: OnDeleteat this head; nothing restarts a pod. Head commit message's LAST trailer is exactlyLab-Run: IR-20261111-c8grants. The body states go-live only at the next a9-coordinated sbx restart and only after Aaron createssendrast-robotandkv/sendrast/sbx/release-robotexists, and states that this PR creates neither.Findings (non-blocking)
username=ld-builder), i.e.-c credential.helper='!…'without a preceding-c credential.helper=can silently fall through to another helper — and this pod already carries a git credential mount (/run/secrets/sendrast/git). The documented command should start with-c credential.helper=to reset the list, so the sanctioned helper is the only one asked.path(if [ -n "$path" ]); a host-only remote URL gets credentials for any path on the host. Bounded by the robot's own Sendrast-only write, but the allowlist should refuse an emptypathexplicitly rather than bypass.state: APPROVEDwithdismissed: true.approval_verdict()filtersstate == "APPROVED"first, so a review returned with stateDISMISSEDis dropped rather than triggering an explicit refusal. Net outcome stays fail-closed (a freshld-reviewerAPPROVED at head is still required), but the docstring/PR wording is stronger than the code; treatDISMISSEDas a refusal so the claim is literally true. Related: the two token-mode fixtures re-implement the mode predicate inline instead of callingread_token(), so a regression inread_token()would not be caught — call the function on a temp file.spec.conditions[].namespaces: [sbx-sendrast]) is honestly declared as out-of-repo (Homelab/prod, branch head f51f9b1d2dd9eff2d5e281b4a16415f8f55cefb4, no PR from this seat). G1 does not depend on it for the mount to work, but the rebuild's narrower-blast-radius claim is only complete once that lands; it should stay visible as a tracked follow-up rather than being counted as delivered here.Verified positives worth recording: kustomize renders clean (exit 0) with the new ConfigMap, ES and both readOnly mounts; ES/Secret key (
token) matches the helper's default path/run/secrets/sendrast/release-robot/token; 288 = 0440 is consistent across both new volumes; self-check is genuinely offline (no network, no token, temp dir only) and its 19 fixtures are real assertions, not prints.SESSION: IR-20261111-c8grants-seatA-20261111T1720Z
MODEL: deepseek-flash
CENSUS VERDICT — seat B (rebuilt head)
PR: Homelab/infra-core #940 · head
07e41d743b· base35a336157dScope: read-only review of the diff at this head (API diff + archive of the head tree +
kubectl kustomize core/manifests/apps/sbx-sendrast). NO-READ honoured: I did not list or read this PR's comments, reviews or inline comments at any point.SESSION: IR-20261111-c8grants-seatB-20261111T1720Z
MODEL: deepseek-flash
VERDICT: APPROVED (substance of the diff)
LEGS: (a) PASS · (b) PASS · (c) PASS · (d) PASS · (e) PASS · (f) PASS · CI at head FAIL — see F1; this verdict authorises no merge until the exact head is green.
Findings and evidence
(a) PASS — new credential, old path gone.
externalsecrets.yaml:191-209: ExternalSecretsbx-sendrast-release-robotin nssbx-sendrast,secretStoreRefkind ClusterSecretStore / nameopenbao-sendrast,data[0].remoteRef.key: sendrast/sbx/release-robot,property: token,creationPolicy: Owner,deletionPolicy: Retain,refreshInterval: 1h. Mounted at/run/secrets/sendrast/release-robot(statefulset.yaml:626-628,readOnly: true, sandbox container only — the mounts at 594/597 are omniroute/git, no path collision).grep -rn 'ci/forgejo-sendrast-release'over the whole head tree → 0 hits; no old shared-robot reference anywhere.(b) PASS — doubly gated, mode justified. Volume
release-robot(statefulset.yaml:766-775):secret: sbx-sendrast-release-robot,optional: true,defaultMode: 288, single itemtoken→token. The 0440 rationale is real and consistent: sandbox containerrunAsUser/runAsGroup: 1006(442-443) and podsecurityContext.fsGroup: 1006(108), so a root-owned 0400 would be unreadable; the comment says so.optional: trueis deliberate until the robot + kv object exist, and the body states both preconditions. Fail-closed when absent: the helper'sread_tokenrefuses a missing/unreadable file.(c) PASS — I extracted both embedded scripts out of the RENDERED ConfigMap (byte-identical to the source block,
cmpclean), compiled them, ran them:•
--self-check→ 19/19 PASS, exit 0 (allowlist accept/refuse incl. case variant, clean approval, dismissed, stale-flag, non-headcommit_id, wrong user, no approvals, no reviews, non-list, CI success/pending, no token-bearing URL, no command-line token, 0666 refused / 0440 accepted).• Allowlist is enforced before anything else:
--repo Homelab/prod --token-file /nonexistentprintsFAIL step=allowlist code=refused … refusing before any API call, exit 1 — the token file is not even stat'ed, so no network and no credential read.• Review gate: any
dismissedapproval, anystaleapproval, and any approval whosecommit_id != headare refused before theld-reviewerat-head approval is required (approval_verdict).• Token: no
--tokenoption exists in the parser; token read from file only, group/world-writable file refused; a singlePOST /mergewith{"Do":…, "head_commit_id": <expected>}and a read-back ofmerged.• Redirects refused (
_NoRedirect→ 3xx becomes a hard non-200 failure, so the Authorization header cannot be replayed cross-host).•
sendrast-credential-helper.sh: get-only (store/eraseare no-ops, verified exit 0/no output), https-only, host-pinned, two-segment repo allowlist; I ran the accepts and the refusals (foreign host,Sendrast/api-sendrast-evil, non-https all exit 1). Reads the same file, never argv/env/URL.(d) PASS — exactly 4 files changed (externalsecrets.yaml, kustomization.yaml, new sendrast-tools.yaml, statefulset.yaml), all under
core/manifests/apps/sbx-sendrast; no path under/home/jesusis written or added; both new mounts (/run/secrets/sendrast/release-robot,/opt/sendrast-tools) are outside the home and read-only, ConfigMap+Secret volumedefaultMode: 288.(e) PASS — commit
07e41d7message: last non-empty line is exactlyLab-Run: IR-20261111-c8grants. The PR body's Go-live section states the two preconditions verbatim: goes live at the nextsbx-sendrastrestart that homelab-a9 coordinates with Jesús, and ONLY once Aaron has createdsendrast-robotandkv/sendrast/sbx/release-robotexists; nothing is restarted/applied/created by this PR.(f) PASS —
updateStrategy: type: OnDelete(statefulset.yaml:75-76, unchanged by this diff, present in the render); the diff adds only template fields, so merging cannot restart the running pod.F1 — CI IS RED AT THIS EXACT HEAD (leg fails; blocking for landing, not for the substance above).
GET /commits/07e41d7…/status→combined: failure, 11 statuses, one non-green:CI Review / record-sql-test (pull_request)—Failing after 5m21s, run 3580 job 7, created 2026-11-11T17:03:24Z (head authored 16:56:33Z, so it is this head).The three Lint & Validate jobs the body cites (run 3581: yaml-lint, shellcheck, terraform-validate) are indeed green, and the body does not claim more than that — but it also does not mention this failure. A diff touching only four sbx-sendrast manifests makes a regression of a record/SQL test implausible; treat it as flake/environmental and prove it: re-run and either get the head green or attach the evidence that it fails identically on
live(the base sha currently carries no statuses at all, so base-green is not established either). The landing lock needs green at this exact head; I cannot sign the CI leg.F2 — non-blocking, design (record it): the review gate is a client-side control in a file the token holder can bypass. The token is mounted readable to uid 1006 by design, so Jesús can call
POST /repos/…/pulls/{n}/mergedirectly with the same token; since Sendrastmainasks for 0 required approvals (the body says so), the server enforces nothing. G1c therefore protects against accidental use, not against a determined user. If the intent is enforceable review, the control belongs server-side (required approvals / merge whitelist on the Sendrast repos), not in the helper. As specified for this PR it is accepted, but it should not be described as a guarantee.F3 — non-blocking, operational: the gate refuses ANY approval whose
commit_id != head, and Forgejo keeps reviews per commit. After the first re-push of an already-approved PR, the helper refuses that PR forever (no supersession notion, and a dismissed/stale flag is equally permanent). Intended strictness per the brief, but the operator note should say the escape hatch is a fresh PR, otherwise the sanctioned route dead-ends on round 2.F4 — minor:
sendrast-credential-helper.shonly applies the repo allowlist when git sends apath=; a host-only request returns the credential (verified). Bounded by the robot's two-repo scope, so not exploitable here, but it is weaker than "only the two allowlisted repos" as written.F5 — dependency, outside this diff: the
openbao-sendrastnamespace scoping (spec.conditions[].namespaces) lives in Homelab/prodmanifests/lab-director/ld-fleet-cluster-secret-stores.yaml(body says branchplane/IR-20261111-c8grants-store, head f51f9b1…, no PR opened). Until that lands in prod, the store stays cluster-wide-selectable and the "doubly gated / namespace-scoped" story is incomplete. Also track the follow-up removal ofoptional: trueonceSecretSynced=True— with it in place the mount is not enforced.No token, secret value, prefix or fingerprint appears in this comment. Nothing was written under
/home/jesus; no kubectl write, no restart, no OpenBao write performed by this seat.The r2 review reproduced, on git 2.39.5, that the push/tag route this PR ships could not work: the helper is mounted 0440 so `!<file>` gives Permission denied; once runnable, the pod's own sendrast-bot helper answers first and ours is never asked; and with credential.useHttpPath unset git sends no `path`, so the two-repo allowlist never ran and the helper answered for ANY repo on the host. Each fix, and where it lives: (a) Doc + invocation use `!sh <file>`, not `!<file>`. The volume keeps defaultMode 0440 and nothing in the mount becomes executable; `sh` reads the file. Documented in the ConfigMap header (item 5) and in the helper's USAGE block. (b) The documented command resets the helper list FIRST, because `-c` APPENDS after the env entries (statefulset.yaml GIT_CONFIG_*) that already answer as sendrast-bot: git -c credential.helper= \ -c credential.useHttpPath=true \ -c credential.helper='!sh /opt/sendrast-tools/sendrast-credential-helper.sh' \ push origin <ref> (c) The helper now REFUSES a request that carries no `path` (exit 1, reason on stderr) instead of answering it. That is the hard fail the review asked for: no path means the repo check cannot run, so there is nothing safe to answer. The refusal message names `-c credential.useHttpPath=true`. The decision logic moved into a `decide()` function so it can be driven by fixtures; `get`/`store`/`erase` behave as before (store/erase are no-ops). (d) `--self-check` on the credential helper, 14 fixtures, no network and a dummy token file in a temp dir. Ten drive decide() directly: the two Sendrast repos answer as sendrast-robot; NO path and empty path refuse; Homelab/prod, `api-sendrast-evil` and the case variant refuse; http and a foreign host refuse; an unreadable token file refuses. Four run the DOCUMENTED command line through real `git credential fill` (with `env -i`, so the pod's bot helper cannot answer and turn a refusal into a pass): both Sendrast repos yield username=sendrast-robot; Homelab/prod yields no credential; and WITHOUT useHttpPath it yields no credential, which is the case that used to authenticate silently. (e) The merge helper now also checks the repo the SERVER reports, not just the `--repo` string the caller passed: after the PR read, `base.repo.full_name` must be in the allowlist (step 1b, new pure `base_repo_verdict()`; a missing or non-string full_name fails closed). Three new fixtures cover it (allowlisted base, Homelab/prod base, payload without base.repo), so --self-check is now 22 checks. Both self-checks run green against the extracted ConfigMap items: merge 22/22, credential helper 14/14. No behaviour outside sbx-sendrast changes, nothing is applied or restarted here, and go-live is still gated on Aaron creating sendrast-robot plus kv/sendrast/sbx/release-robot (review 93 C1/C3). Lab-Run: IR-20261111-c8grantsView command line instructions
Checkout
From your project repository, check out a new branch and test the changes.