feat(ci): wire Ollama review-run into Patchwarden dry-run #524

Merged
pdurlej merged 1 commit from codex/523-patchwarden-ollama-workflow into main 2026-05-27 15:59:19 +02:00
Collaborator

Canary status: missing - workflow/security-sensitive change; require operator/Iskra review before merge.

Canary Context Pack

Product story

Patchwarden dogfood should visibly exercise the actual Ollama reviewer lane and speak back to eligible boring PRs, instead of only uploading silent deterministic artifacts. This makes the platform loop closer to the operator mental model without widening automerge authority.

What changed

  • patchwarden-client-dry-run now grants pull-requests: write for the dry-run job so Patchwarden can post comments when a runner-local comment token exists.
  • The workflow now sources the runner-local canary env (PLATFORMCTL_CANARY_ENV) before model review/comment posting.
  • The workflow now builds /tmp/patchwarden-client/pr-metadata.json from the PR event and collected file list.
  • patchwarden review-run now uses --lane-config, --pr-metadata-file, and --diff-file instead of the deterministic stub flags.
  • The live reviewer is explicitly limited to safe_docs_status; workflow/runtime/secrets/policy-governance PRs skip model review/commenting and remain manual.
  • A new gated post-findings --execute step posts the rendered Patchwarden findings/no-findings comment to the PR when FORGEJO_TOKEN_CODEX or PLATFORMCTL_PR_SANITY_COMMENT_TOKEN is present in the runner-local env.

Why it changed

Issue #523 identifies that Patchwarden PR #49/#50 capabilities already exist, but platform was not wiring them into the dry-run workflow. This PR is pure platform-side wiring, constrained by the repo CI secret policy.

Files touched

  • .forgejo/workflows/patchwarden-client-dry-run.yml

Relevant context

  • pdurlej/patchwarden#49: live review-run path via lane config + PR metadata + diff.
  • pdurlej/patchwarden#50: post-findings --execute behavior.
  • pdurlej/patchwarden#57: D21 allows this workflow wiring under M2 gate amendment.
  • docs/ci/README.md: PR workflows must not read provider/comment tokens from Forgejo repo secrets; they use runner-local Infisical-derived env instead.
  • policies/platform.v0.toml in Patchwarden remains the source of lane/model config.

Runtime evidence

No runtime/platform service mutation. Local validation only:

  • git diff --check
  • YAML parse via Ruby/Psych
  • python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows --markdown /tmp/ci-workflow-lint.md --json /tmp/ci-workflow-lint.json -> 0 findings
  • PYTHONPATH=control-plane python3 -m platformctl.cli validate all --json -> exitCode 0

Known constraints

  • Smoke test requires this workflow to be merged, then a trivial safe_docs_status PR must be opened to verify live Ollama call + PR comment.
  • PLATFORMCTL_CANARY_ENV must exist on the runner and include the Ollama key; comment posting also needs FORGEJO_TOKEN_CODEX or PLATFORMCTL_PR_SANITY_COMMENT_TOKEN.
  • If this PR itself is classified as workflow, the live reviewer/comment step should intentionally skip; that is expected and preserves the safe-docs-only lane.
  • If Ollama is unreachable on an eligible safe-docs PR and the lane is fail-closed, review-run should exit 2 and no comment should post.

Explicit out-of-scope

  • No pyfallow/fallow-ts wiring.
  • No Patchwarden CLI changes.
  • No policy expansion beyond the existing safe_docs_status lane.
  • No merge/approval automation.
  • No Forgejo repository secret use for provider/comment tokens.

Requested decision

Merge after workflow/security review so the follow-up smoke PR can validate end-to-end behavior on an eligible boring docs/status change.

Merge blockers

  • Missing runner-local canary env for live model review/comment posting on the follow-up smoke PR.
  • Workflow accidentally executing PR code with comment token.
  • Any change that would let Patchwarden approve or merge instead of only comment.

Spec sources read

  • docs/forgejo-agent-operations.md - Forgejo write identity and API rules.
  • docs/ci/README.md - runner-local Infisical env and no repo-secret token policy.
  • .forgejo/ci-policy.yaml - workflow lint policy forbidding direct provider/comment token names and secrets in PR workflows.
  • .forgejo/workflows/patchwarden-client-dry-run.yml - target workflow.
  • Issue #523 - implementation scope and acceptance criteria.
  • /Users/pd/Developer/patchwarden/src/patchwarden/cli.py - review-run and post-findings CLI flags/exit behavior.
  • /Users/pd/Developer/patchwarden/policies/platform.v0.toml - existing lane config.
  • /Users/pd/Developer/patchwarden/docs/operations/platform-dogfood.md - current dogfood gap.

Closes #523

Canary status: missing - workflow/security-sensitive change; require operator/Iskra review before merge. ## Canary Context Pack ### Product story Patchwarden dogfood should visibly exercise the actual Ollama reviewer lane and speak back to eligible boring PRs, instead of only uploading silent deterministic artifacts. This makes the platform loop closer to the operator mental model without widening automerge authority. ### What changed - `patchwarden-client-dry-run` now grants `pull-requests: write` for the dry-run job so Patchwarden can post comments when a runner-local comment token exists. - The workflow now sources the runner-local canary env (`PLATFORMCTL_CANARY_ENV`) before model review/comment posting. - The workflow now builds `/tmp/patchwarden-client/pr-metadata.json` from the PR event and collected file list. - `patchwarden review-run` now uses `--lane-config`, `--pr-metadata-file`, and `--diff-file` instead of the deterministic stub flags. - The live reviewer is explicitly limited to `safe_docs_status`; workflow/runtime/secrets/policy-governance PRs skip model review/commenting and remain manual. - A new gated `post-findings --execute` step posts the rendered Patchwarden findings/no-findings comment to the PR when `FORGEJO_TOKEN_CODEX` or `PLATFORMCTL_PR_SANITY_COMMENT_TOKEN` is present in the runner-local env. ### Why it changed Issue #523 identifies that Patchwarden PR #49/#50 capabilities already exist, but platform was not wiring them into the dry-run workflow. This PR is pure platform-side wiring, constrained by the repo CI secret policy. ### Files touched - `.forgejo/workflows/patchwarden-client-dry-run.yml` ### Relevant context - `pdurlej/patchwarden#49`: live `review-run` path via lane config + PR metadata + diff. - `pdurlej/patchwarden#50`: `post-findings --execute` behavior. - `pdurlej/patchwarden#57`: D21 allows this workflow wiring under M2 gate amendment. - `docs/ci/README.md`: PR workflows must not read provider/comment tokens from Forgejo repo secrets; they use runner-local Infisical-derived env instead. - `policies/platform.v0.toml` in Patchwarden remains the source of lane/model config. ### Runtime evidence No runtime/platform service mutation. Local validation only: - `git diff --check` - YAML parse via Ruby/Psych - `python3 control-plane/platformctl/ci/lint_workflows.py --policy .forgejo/ci-policy.yaml --workflows .forgejo/workflows --markdown /tmp/ci-workflow-lint.md --json /tmp/ci-workflow-lint.json` -> 0 findings - `PYTHONPATH=control-plane python3 -m platformctl.cli validate all --json` -> exitCode 0 ### Known constraints - Smoke test requires this workflow to be merged, then a trivial `safe_docs_status` PR must be opened to verify live Ollama call + PR comment. - `PLATFORMCTL_CANARY_ENV` must exist on the runner and include the Ollama key; comment posting also needs `FORGEJO_TOKEN_CODEX` or `PLATFORMCTL_PR_SANITY_COMMENT_TOKEN`. - If this PR itself is classified as `workflow`, the live reviewer/comment step should intentionally skip; that is expected and preserves the safe-docs-only lane. - If Ollama is unreachable on an eligible safe-docs PR and the lane is fail-closed, `review-run` should exit 2 and no comment should post. ### Explicit out-of-scope - No pyfallow/fallow-ts wiring. - No Patchwarden CLI changes. - No policy expansion beyond the existing `safe_docs_status` lane. - No merge/approval automation. - No Forgejo repository secret use for provider/comment tokens. ### Requested decision Merge after workflow/security review so the follow-up smoke PR can validate end-to-end behavior on an eligible boring docs/status change. ### Merge blockers - Missing runner-local canary env for live model review/comment posting on the follow-up smoke PR. - Workflow accidentally executing PR code with comment token. - Any change that would let Patchwarden approve or merge instead of only comment. ## Spec sources read - `docs/forgejo-agent-operations.md` - Forgejo write identity and API rules. - `docs/ci/README.md` - runner-local Infisical env and no repo-secret token policy. - `.forgejo/ci-policy.yaml` - workflow lint policy forbidding direct provider/comment token names and secrets in PR workflows. - `.forgejo/workflows/patchwarden-client-dry-run.yml` - target workflow. - Issue #523 - implementation scope and acceptance criteria. - `/Users/pd/Developer/patchwarden/src/patchwarden/cli.py` - `review-run` and `post-findings` CLI flags/exit behavior. - `/Users/pd/Developer/patchwarden/policies/platform.v0.toml` - existing lane config. - `/Users/pd/Developer/patchwarden/docs/operations/platform-dogfood.md` - current dogfood gap. Closes #523
feat(ci): wire patchwarden Ollama dry-run comments
Some checks failed
canary-required / collect-diff (pull_request) Successful in 5s
infra-docs-drift / docs-drift (pull_request) Successful in 4s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 4s
workflow-lint / lint (pull_request) Failing after 5s
canary-required / canary (pull_request) Successful in 15s
patchwarden-client-dry-run / dry-run (pull_request) Failing after 24s
base-is-main / guard (pull_request) Successful in 2s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 5s
patchwarden-pr-sanity / sanity (pull_request) Failing after 22s
194daf9789
codex force-pushed codex/523-patchwarden-ollama-workflow from 194daf9789
Some checks failed
canary-required / collect-diff (pull_request) Successful in 5s
infra-docs-drift / docs-drift (pull_request) Successful in 4s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 4s
workflow-lint / lint (pull_request) Failing after 5s
canary-required / canary (pull_request) Successful in 15s
patchwarden-client-dry-run / dry-run (pull_request) Failing after 24s
base-is-main / guard (pull_request) Successful in 2s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 5s
patchwarden-pr-sanity / sanity (pull_request) Failing after 22s
to 8d1cd290f9
Some checks failed
base-is-main / guard (pull_request) Successful in 2s
canary-required / collect-diff (pull_request) Successful in 5s
infra-docs-drift / docs-drift (pull_request) Successful in 5s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 4s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 5s
workflow-lint / lint (pull_request) Successful in 6s
canary-required / canary (pull_request) Successful in 15s
patchwarden-client-dry-run / dry-run (pull_request) Failing after 23s
patchwarden-pr-sanity / sanity (pull_request) Successful in 23s
2026-05-27 15:37:47 +02:00
Compare
codex force-pushed codex/523-patchwarden-ollama-workflow from 8d1cd290f9
Some checks failed
base-is-main / guard (pull_request) Successful in 2s
canary-required / collect-diff (pull_request) Successful in 5s
infra-docs-drift / docs-drift (pull_request) Successful in 5s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 4s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 5s
workflow-lint / lint (pull_request) Successful in 6s
canary-required / canary (pull_request) Successful in 15s
patchwarden-client-dry-run / dry-run (pull_request) Failing after 23s
patchwarden-pr-sanity / sanity (pull_request) Successful in 23s
to b07a44b512
All checks were successful
base-is-main / guard (pull_request) Successful in 2s
canary-required / collect-diff (pull_request) Successful in 5s
infra-docs-drift / docs-drift (pull_request) Successful in 5s
patchwarden-client-dry-run / collect-diff (pull_request) Successful in 5s
patchwarden-pr-sanity / collect-diff (pull_request) Successful in 4s
workflow-lint / lint (pull_request) Successful in 5s
canary-required / canary (pull_request) Successful in 15s
patchwarden-client-dry-run / dry-run (pull_request) Successful in 23s
patchwarden-pr-sanity / sanity (pull_request) Successful in 23s
2026-05-27 15:43:54 +02:00
Compare
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!524
No description provided.