Skip to content

fix(security): the org's signed-commits ruleset is active but enforces nothing #132

Description

@devantler

🤖 Generated by the Agentic Engineer

Delivered and verified (2026-09-08)

PR #190 merged as 7130742c555d4a225414043a47dd2c24df7c4d7c and shipped in tag v1.23.6. The signed artifact reached the existing controller through normal Flux reconciliation. Organization ruleset 5397812, Require signed commits, is now Disabled, retains its original identity, empty ref coverage, signature rule and empty bypass list, and permits only Observe and Update. GitHub settings and the healthy controller independently confirm the result.

The complete before/after effective-rules responses on main for .github, actions, platform, monorepo, and ksail are identical: all existing pull-request, linear-history and required-status-check protections remain. There are still zero native signature rules in every case. The September 6 sampled default-branch commits all reported verified: true, reason: valid with committer web-flow. That is historical signed-commit outcome evidence, not proof of native signature enforcement.

The control-integrity defect is resolved: the retained rule no longer advertises active protection that applies nowhere.

The old one-click enforcement recommendation missed a compatibility constraint

GitHub's current signed-commit rules documentation says squash merging into a branch requiring signatures is restricted to the pull-request author. A branch-signing audit alone therefore does not establish compatibility with the engineer merging bot and contributor PRs.

Enabling the rule on ~DEFAULT_BRANCH must not be called a zero-cost change until those merge paths are demonstrated. The earlier audit remains useful historical evidence in the comments, but does not prove this additional condition.

Approved retirement — delivered

The issue's original expected behavior explicitly allowed either enforcement or retirement. The scoped retirement was explicitly approved in the September 8 session. PR #190 retains the already-inert object as a disabled record:

- managementPolicies: ["Observe"]
+ managementPolicies: ["Observe", "Update"]
- enforcement: active
+ enforcement: disabled

Before allowing Update, the implementation backfilled every writable field from the complete observed shape: branch target, original name and external ID, empty ref include/exclude, repository selector ~ALL with no exclusions and protected: false, no bypass actors, and the existing signature rule plus its observed false boolean rule fields. Never permit Create or Delete. This preserves zero effective coverage and does not remove any effective PR, history, or required-check control.

The compensating protection remains the effective pull-request/status/linear-history controls and GitHub-created signed squash commits. The disabled retained record makes the advertised posture honest; it does not implement native signature enforcement.

Historical approval rejection — now resolved

Automatic approval review initially rejected even the local configuration edit because the specific security-policy change lacked explicit authorization. The user has now approved this exact retained-disabled, Observe-and-Update-only proposal. The actual session question and answer were verified, and the independently reviewed patch was applied successfully in the approval-bearing session context. The signed change has now completed review, release and production verification.

Acceptance criteria

  • Obtain explicit approval for the scoped retirement while preserving all effective branch protections.
  • Complete current-head review and CI, and deliver the fully backfilled disabled resource declaratively.
  • Verify the released artifact and the existing live ruleset's disabled state, retained identity and healthy controller status.
  • Compare complete effective branch protections with the saved baseline and record the final disposition here.

All ten repository tests, the installed-CRD schema check and the no-deletion/release guards passed. The change retains all 99 rendered identities and changes only the signing-rule record; 16 unsafe variations are rejected by the new guard. Full-range review found no remaining issues at the final head, and hosted CI passed. Independent signature verification passed for the immutable OCI digest, all 127 packaged source files matched the merged commit byte for byte, and Flux verified and applied that same release. The controller retained the same resource identity and observed the disabled state.

No personal action or delivery work remains for this issue. After disabling the rule, repository-inherited ruleset reads no longer returned it; the authenticated organization settings page and the controller observation supplied the independent disabled-state checks. The complete effective-protection comparison passed for all five repositories.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions