chore(deps): add Forgejo Renovate setup #682

Merged
pdurlej merged 1 commit from codex/667-renovate-forgejo into main 2026-06-02 11:17:46 +02:00
Collaborator

Canary status: missing — fire canary 3+3 manually before merge

Summary

Adds the first Forgejo-native Renovate setup for pdurlej/platform so dependency drift becomes scheduled PRs instead of manual surprise audits.

What changed

  • Added renovate.json with repo policy for Docker, Python, uv lockfiles, Dockerfiles, Forgejo/GitHub Actions, and custom regex parsing for compose ${*_IMAGE:-image:tag} defaults.
  • Added .forgejo/workflows/renovate.yml to run self-hosted Renovate weekly and on manual dispatch against pdurlej/platform using RENOVATE_PLATFORM=forgejo.
  • Added runbooks/renovate.md with token requirements, coverage, first-run checklist, and runtime-apply boundaries.
  • Linked Renovate from AGENTS.md and runbooks/module-update-flow.md.
  • Marked the older custom auto-updates spec as superseded-for-v0-by-renovate rather than deleting it.
  • Added tests for Renovate config/workflow invariants.

Canary Context Pack

Product story

The platform should stop discovering dependency drift only during manual sweeps. Renovate should open bounded, reviewable Forgejo PRs for repo-visible dependency updates while keeping runtime mutation behind existing review and apply gates.

What changed

This PR wires config-as-code and a scheduled Forgejo workflow for Renovate. It does not run Renovate live and does not create/update any secrets.

Why it changed

Issue #667 identified missing dependency automation as the root cause behind silent image drift, including PostgreSQL lagging behind security patch releases.

Files touched

  • .forgejo/workflows/renovate.yml
  • renovate.json
  • runbooks/renovate.md
  • runbooks/module-update-flow.md
  • AGENTS.md
  • docs/specs/platform-auto-updates-v0/README.md
  • control-plane/platformctl/tests/test_renovate_config.py

Relevant context

  • Issue #667
  • Issue #669 remains the companion for runtime-only floating tags.
  • Issue #668 remains the explicit PostgreSQL security update.
  • Renovate official docs: self-hosting, Forgejo platform, custom regex managers, Docker updates/digest pinning.

Runtime evidence

No runtime mutation. No token creation. No live Renovate run.

Local validation:

cd control-plane && uv run pytest platformctl/tests/test_renovate_config.py
python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows --markdown /private/tmp/renovate-ci-lint.md --json /private/tmp/renovate-ci-lint.json
python3 -m json.tool renovate.json
PYTHONPATH=control-plane uv run --project control-plane python -m platformctl.cli validate all --json

Results:

  • test_renovate_config.py: 3 passed
  • Forgejo workflow lint: 0 findings
  • renovate.json: parses
  • platformctl validate all --json: exitCode 0

Known constraints

  • First real Renovate run requires a Forgejo Actions RENOVATE_TOKEN for a non-operator Renovate bot identity.
  • RENOVATE_GITHUB_COM_TOKEN is optional but recommended for changelog/upstream metadata rate limits.
  • Runtime-only image vars in host env/Infisical are not fully repo-visible yet; #669 remains necessary for those seven floating tags.

Explicit out-of-scope

  • No Renovate token creation.
  • No live Renovate run.
  • No auto-merge.
  • No platformctl apply.
  • No runtime image/env mutation.
  • No PostgreSQL 16.14 bump; that stays in #668.

Requested decision

Merge if the self-hosted Renovate workflow/config and no-runtime-mutation boundary are acceptable.

Merge blockers

  • Any workflow secret exposure under PR triggers.
  • Any accidental auto-merge/runtime apply path.
  • Any Renovate config shape that would not run on Forgejo.

Spec sources read

  • Forgejo issue #667 — task scope and acceptance criteria.
  • docs/specs/platform-auto-updates-v0/README.md and 01-plan.md — existing auto-update background.
  • runbooks/module-update-flow.md — existing module update discipline.
  • .forgejo/ci-policy.yaml and workflow examples — local Forgejo workflow policy.
  • Official Renovate docs for Forgejo, self-hosted config, Docker updates, and regex custom managers.

Closes #667

Canary status: missing — fire canary 3+3 manually before merge ## Summary Adds the first Forgejo-native Renovate setup for `pdurlej/platform` so dependency drift becomes scheduled PRs instead of manual surprise audits. ## What changed - Added `renovate.json` with repo policy for Docker, Python, uv lockfiles, Dockerfiles, Forgejo/GitHub Actions, and custom regex parsing for compose `${*_IMAGE:-image:tag}` defaults. - Added `.forgejo/workflows/renovate.yml` to run self-hosted Renovate weekly and on manual dispatch against `pdurlej/platform` using `RENOVATE_PLATFORM=forgejo`. - Added `runbooks/renovate.md` with token requirements, coverage, first-run checklist, and runtime-apply boundaries. - Linked Renovate from `AGENTS.md` and `runbooks/module-update-flow.md`. - Marked the older custom auto-updates spec as superseded-for-v0-by-renovate rather than deleting it. - Added tests for Renovate config/workflow invariants. ## Canary Context Pack ### Product story The platform should stop discovering dependency drift only during manual sweeps. Renovate should open bounded, reviewable Forgejo PRs for repo-visible dependency updates while keeping runtime mutation behind existing review and apply gates. ### What changed This PR wires config-as-code and a scheduled Forgejo workflow for Renovate. It does not run Renovate live and does not create/update any secrets. ### Why it changed Issue #667 identified missing dependency automation as the root cause behind silent image drift, including PostgreSQL lagging behind security patch releases. ### Files touched - `.forgejo/workflows/renovate.yml` - `renovate.json` - `runbooks/renovate.md` - `runbooks/module-update-flow.md` - `AGENTS.md` - `docs/specs/platform-auto-updates-v0/README.md` - `control-plane/platformctl/tests/test_renovate_config.py` ### Relevant context - Issue #667 - Issue #669 remains the companion for runtime-only floating tags. - Issue #668 remains the explicit PostgreSQL security update. - Renovate official docs: self-hosting, Forgejo platform, custom regex managers, Docker updates/digest pinning. ### Runtime evidence No runtime mutation. No token creation. No live Renovate run. Local validation: ```bash cd control-plane && uv run pytest platformctl/tests/test_renovate_config.py python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows --markdown /private/tmp/renovate-ci-lint.md --json /private/tmp/renovate-ci-lint.json python3 -m json.tool renovate.json PYTHONPATH=control-plane uv run --project control-plane python -m platformctl.cli validate all --json ``` Results: - `test_renovate_config.py`: 3 passed - Forgejo workflow lint: 0 findings - `renovate.json`: parses - `platformctl validate all --json`: exitCode 0 ### Known constraints - First real Renovate run requires a Forgejo Actions `RENOVATE_TOKEN` for a non-operator Renovate bot identity. - `RENOVATE_GITHUB_COM_TOKEN` is optional but recommended for changelog/upstream metadata rate limits. - Runtime-only image vars in host env/Infisical are not fully repo-visible yet; #669 remains necessary for those seven floating tags. ### Explicit out-of-scope - No Renovate token creation. - No live Renovate run. - No auto-merge. - No `platformctl apply`. - No runtime image/env mutation. - No PostgreSQL 16.14 bump; that stays in #668. ### Requested decision Merge if the self-hosted Renovate workflow/config and no-runtime-mutation boundary are acceptable. ### Merge blockers - Any workflow secret exposure under PR triggers. - Any accidental auto-merge/runtime apply path. - Any Renovate config shape that would not run on Forgejo. ## Spec sources read - Forgejo issue #667 — task scope and acceptance criteria. - `docs/specs/platform-auto-updates-v0/README.md` and `01-plan.md` — existing auto-update background. - `runbooks/module-update-flow.md` — existing module update discipline. - `.forgejo/ci-policy.yaml` and workflow examples — local Forgejo workflow policy. - Official Renovate docs for Forgejo, self-hosted config, Docker updates, and regex custom managers. Closes #667
chore(deps): add Forgejo Renovate setup
All checks were successful
canary-required / collect-diff (pull_request) Successful in 4s
infra-docs-drift / docs-drift (pull_request) Successful in 4s
platformctl plan / auto-apply scope (pull_request) Successful in 17s
pyfallow / Pyfallow gate (control-plane) (pull_request) Successful in 15s
python-ci / Python 3.11 (pull_request) Successful in 39s
python-ci / Python 3.12 (pull_request) Successful in 40s
python-ci / Python 3.13 (pull_request) Successful in 39s
workflow-lint / lint (pull_request) Successful in 4s
canary-required / canary (pull_request) Successful in 12s
base-is-main / guard (pull_request) Successful in 1s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 3s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 3s
patchwarden-client-dry-run / dry-run (pull_request) Successful in 16s
patchwarden-pr-sanity / sanity (pull_request) Successful in 4m11s
f099cefd9d
codex added this to the 10 - Improvements milestone 2026-06-02 09:00:22 +02:00
Author
Collaborator

Patchwarden PR sanity

  • Status: eligible_sanity_clean
  • PR: 682
  • Commit: bc99925ecf25a736065b054e57de6bb089cdf031
  • Security-sensitive label: present
  • Authority: advisory model review plus deterministic blockers only
  • 3+3 canary: still alive; this does not replace it

Deterministic findings

  • info sensitive-path-touched Sensitive path touched — .forgejo/workflows/renovate.yml
    • Evidence: .forgejo/workflows/renovate.yml
    • Next: Route through the existing 3+3/risk-tier process; model review remains advisory.

Model reviewers

global-glm / glm-5.1:cloud

  • Status: ok
  • Verdict: OK
  • Findings: none

global-deepseek / deepseek-v4-pro:cloud

  • Status: ok
  • Verdict: OK
  • Findings: none

redteam / kimi-k2.6:cloud

  • Status: error
  • Verdict: -
  • Note: ReadTimeout: The read operation timed out
  • Findings: none

Policy notes

  • GLM 5.1 + DeepSeek V4 Pro are the operator-required model mix for this bot.
  • Optional red-team model is enabled only when PLATFORMCTL_PR_SANITY_REDTEAM_MODEL is configured.
  • Auto-merge is not enabled here.
<!-- patchwarden-pr-sanity:pdurlej/platform:PR-682 --> # Patchwarden PR sanity - Status: `eligible_sanity_clean` - PR: `682` - Commit: `bc99925ecf25a736065b054e57de6bb089cdf031` - Security-sensitive label: `present` - Authority: advisory model review plus deterministic blockers only - 3+3 canary: still alive; this does not replace it ## Deterministic findings - **`info` `sensitive-path-touched`** Sensitive path touched — `.forgejo/workflows/renovate.yml` - Evidence: `.forgejo/workflows/renovate.yml` - Next: Route through the existing 3+3/risk-tier process; model review remains advisory. ## Model reviewers ### `global-glm` / `glm-5.1:cloud` - Status: `ok` - Verdict: `OK` - Findings: none ### `global-deepseek` / `deepseek-v4-pro:cloud` - Status: `ok` - Verdict: `OK` - Findings: none ### `redteam` / `kimi-k2.6:cloud` - Status: `error` - Verdict: `-` - Note: ReadTimeout: The read operation timed out - Findings: none ## Policy notes - GLM 5.1 + DeepSeek V4 Pro are the operator-required model mix for this bot. - Optional red-team model is enabled only when `PLATFORMCTL_PR_SANITY_REDTEAM_MODEL` is configured. - Auto-merge is not enabled here.
codex force-pushed codex/667-renovate-forgejo from f099cefd9d
All checks were successful
canary-required / collect-diff (pull_request) Successful in 4s
infra-docs-drift / docs-drift (pull_request) Successful in 4s
platformctl plan / auto-apply scope (pull_request) Successful in 17s
pyfallow / Pyfallow gate (control-plane) (pull_request) Successful in 15s
python-ci / Python 3.11 (pull_request) Successful in 39s
python-ci / Python 3.12 (pull_request) Successful in 40s
python-ci / Python 3.13 (pull_request) Successful in 39s
workflow-lint / lint (pull_request) Successful in 4s
canary-required / canary (pull_request) Successful in 12s
base-is-main / guard (pull_request) Successful in 1s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 3s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 3s
patchwarden-client-dry-run / dry-run (pull_request) Successful in 16s
patchwarden-pr-sanity / sanity (pull_request) Successful in 4m11s
to bc99925ecf
All checks were successful
base-is-main / guard (pull_request) Successful in 2s
canary-required / collect-diff (pull_request) Successful in 4s
infra-docs-drift / docs-drift (pull_request) Successful in 5s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 3s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 3s
platformctl plan / auto-apply scope (pull_request) Successful in 17s
pyfallow / Pyfallow gate (control-plane) (pull_request) Successful in 15s
python-ci / Python 3.11 (pull_request) Successful in 38s
python-ci / Python 3.12 (pull_request) Successful in 39s
python-ci / Python 3.13 (pull_request) Successful in 39s
workflow-lint / lint (pull_request) Successful in 5s
canary-required / canary (pull_request) Successful in 12s
patchwarden-client-dry-run / dry-run (pull_request) Successful in 16s
patchwarden-pr-sanity / sanity (pull_request) Successful in 3m57s
2026-06-02 10:22:48 +02:00
Compare
Author
Collaborator

Rebased and refreshed after #683/#684 merged.

Current head: bc99925ecf25a736065b054e57de6bb089cdf031
Base: main at c7c179732b6142bbc7d830da724433340f806e3c

Validation rerun after rebase:

  • uv run pytest platformctl/tests/test_renovate_config.py -> 3 passed
  • python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows ... -> 0 findings
  • python3 -m json.tool renovate.json -> passed
  • PYTHONPATH=control-plane uv run --project control-plane python -m platformctl.cli validate all --json -> exitCode 0

No runtime mutation, no token creation, no live Renovate run.

Rebased and refreshed after #683/#684 merged. Current head: `bc99925ecf25a736065b054e57de6bb089cdf031` Base: `main` at `c7c179732b6142bbc7d830da724433340f806e3c` Validation rerun after rebase: - `uv run pytest platformctl/tests/test_renovate_config.py` -> 3 passed - `python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows ...` -> 0 findings - `python3 -m json.tool renovate.json` -> passed - `PYTHONPATH=control-plane uv run --project control-plane python -m platformctl.cli validate all --json` -> exitCode 0 No runtime mutation, no token creation, no live Renovate run.
pdurlej deleted branch codex/667-renovate-forgejo 2026-06-02 11:17:46 +02:00
Sign in to join this conversation.
No reviewers
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform!682
No description provided.