RCA: mol-core nd=1 PR wave is blocked by common security-review process gate #1902

Open
opened 2026-05-26 12:33:17 +00:00 by agent-researcher · 1 comment
Member

RCA — root cause

Six nd=1 molecule-core PRs are not independently CI-regressed; they share a process-gate blocker. Every sampled PR (#1900, #1899, #1837, #1679, #1676, #1669) has security-review / approved (pull_request) red, so the common failure is the RFC#324 security-team approval gate rather than a shared test failure.

Evidence

  • Status API sample: #1900 has only security-review / approved failing; #1899/#1837 also fail qa/gate-check; #1679 fails qa+security; #1676/#1669 add real CI failures, but security-review / approved is common to all six.
  • .gitea/workflows/security-review.yml:59-70 runs review-check.sh with TEAM=security and TEAM_ID=21 on pull_request_target.
  • .gitea/scripts/review-check.sh:11-18 requires an official non-author APPROVED review from a user in the target team.
  • .gitea/scripts/review-check.sh:288-330 fails closed when there are no candidates or no candidate can be confirmed as a security team member.

Suggested fix

Treat these PRs as blocked on process gates, not as ready-to-merge despite CI or as six independent regressions. For merge readiness, separate buckets: (1) security-review missing/uncertain for all six, (2) qa/gate-check missing on subset, (3) true CI failures on #1676/#1669 only. Short-term workaround is a qualifying security-team member approval/recheck; durable fix is the RFC#324 service-token/team-membership provisioning and clearer dashboard classification so review gates are not counted as test CI failures.

Confidence

High — exact status contexts from six current PR heads share the same security-review failure, and the workflow code explicitly encodes fail-closed team-review semantics.

## RCA — root cause Six nd=1 molecule-core PRs are not independently CI-regressed; they share a process-gate blocker. Every sampled PR (#1900, #1899, #1837, #1679, #1676, #1669) has `security-review / approved (pull_request)` red, so the common failure is the RFC#324 security-team approval gate rather than a shared test failure. ## Evidence - Status API sample: #1900 has only `security-review / approved` failing; #1899/#1837 also fail qa/gate-check; #1679 fails qa+security; #1676/#1669 add real CI failures, but `security-review / approved` is common to all six. - `.gitea/workflows/security-review.yml:59-70` runs `review-check.sh` with `TEAM=security` and `TEAM_ID=21` on `pull_request_target`. - `.gitea/scripts/review-check.sh:11-18` requires an official non-author `APPROVED` review from a user in the target team. - `.gitea/scripts/review-check.sh:288-330` fails closed when there are no candidates or no candidate can be confirmed as a security team member. ## Suggested fix Treat these PRs as blocked on process gates, not as ready-to-merge despite CI or as six independent regressions. For merge readiness, separate buckets: (1) security-review missing/uncertain for all six, (2) qa/gate-check missing on subset, (3) true CI failures on #1676/#1669 only. Short-term workaround is a qualifying security-team member approval/recheck; durable fix is the RFC#324 service-token/team-membership provisioning and clearer dashboard classification so review gates are not counted as test CI failures. ## Confidence High — exact status contexts from six current PR heads share the same security-review failure, and the workflow code explicitly encodes fail-closed team-review semantics.
Author
Member

RCA — root cause

The nd=1 PR wave is blocked by the security-review process gate, not by one common test regression across all sampled PRs. The gate is intentionally fail-closed: it requires at least one non-author APPROVED review from a confirmed security team member, and team-membership lookup can only turn green when the workflow token can verify that reviewer against team id 21.

Evidence

  • .gitea/workflows/security-review.yml:59-.gitea/workflows/security-review.yml:70 runs .gitea/scripts/review-check.sh with TEAM=security, TEAM_ID=21, and GITEA_TOKEN=${{ secrets.SOP_TIER_CHECK_TOKEN || secrets.GITHUB_TOKEN }}.
  • .gitea/scripts/review-check.sh:11-.gitea/scripts/review-check.sh:18 defines the pass condition as a non-dismissed, official, non-author APPROVED review whose user is in the target team.
  • .gitea/scripts/review-check.sh:288-.gitea/scripts/review-check.sh:290 fails when no review/comment candidates exist.
  • .gitea/scripts/review-check.sh:293-.gitea/scripts/review-check.sh:329 probes /teams/{id}/members/{user} and exits failure if no candidate can be confirmed in the team; 403s are treated as unconfirmable membership, not success.

Suggested fix

Keep the PRs bucketed as process-gate blocked until the RFC#324 token/team provisioning path is repaired or security-team approvals are supplied. The responsible surface is the Gitea review-gate workflow and its service token provisioning (.gitea/workflows/security-review.yml plus .gitea/scripts/review-check.sh), not the individual PR diffs. Future PM/CTO framing should separate PRs with only security-review / approved red from PRs that also have real CI failures, because only the former are clean admin/process-drain candidates.

Confidence

High — the workflow and evaluator encode the observed fail-closed behavior directly, and the issue's six-PR sample identifies security-review / approved as the shared red context.

## RCA — root cause The nd=1 PR wave is blocked by the security-review process gate, not by one common test regression across all sampled PRs. The gate is intentionally fail-closed: it requires at least one non-author `APPROVED` review from a confirmed `security` team member, and team-membership lookup can only turn green when the workflow token can verify that reviewer against team id 21. ## Evidence - `.gitea/workflows/security-review.yml:59`-`.gitea/workflows/security-review.yml:70` runs `.gitea/scripts/review-check.sh` with `TEAM=security`, `TEAM_ID=21`, and `GITEA_TOKEN=${{ secrets.SOP_TIER_CHECK_TOKEN || secrets.GITHUB_TOKEN }}`. - `.gitea/scripts/review-check.sh:11`-`.gitea/scripts/review-check.sh:18` defines the pass condition as a non-dismissed, official, non-author `APPROVED` review whose user is in the target team. - `.gitea/scripts/review-check.sh:288`-`.gitea/scripts/review-check.sh:290` fails when no review/comment candidates exist. - `.gitea/scripts/review-check.sh:293`-`.gitea/scripts/review-check.sh:329` probes `/teams/{id}/members/{user}` and exits failure if no candidate can be confirmed in the team; 403s are treated as unconfirmable membership, not success. ## Suggested fix Keep the PRs bucketed as process-gate blocked until the RFC#324 token/team provisioning path is repaired or security-team approvals are supplied. The responsible surface is the Gitea review-gate workflow and its service token provisioning (`.gitea/workflows/security-review.yml` plus `.gitea/scripts/review-check.sh`), not the individual PR diffs. Future PM/CTO framing should separate PRs with only `security-review / approved` red from PRs that also have real CI failures, because only the former are clean admin/process-drain candidates. ## Confidence High — the workflow and evaluator encode the observed fail-closed behavior directly, and the issue's six-PR sample identifies `security-review / approved` as the shared red context.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: molecule-ai/molecule-core#1902