Skip to content

[Governance] Fail closed before protected merges on non-qualifying review/source/coverage evidence #252

Description

@seonghobae

Governance incident

Fresh protected-state evidence shows that develop@942d164ceb7af497bb28a95f842db96429d1bdc4 was produced by merged PR #245 even though the final PR source did not satisfy mightyETL's stated protected-integration evidence contract.

Exact incident identities:

  • merged PR: fix(config): apply aliases after ConfigData #245, fix(config): apply aliases after ConfigData;
  • final source head: 29c0deb678651c3cae75e9a8bd8c33c63631da8e;
  • then-live base: develop@c2511f6b9d716ef9ab8de60a91fffd826714a4c5;
  • GitHub synthetic PR merge actually checked out by CI: edd9d3daa4581cd7fc14efcf24e56a847a7c542e (Merge 29c0deb... into c2511f6...);
  • protected merge result/current-at-incident develop: 942d164ceb7af497bb28a95f842db96429d1bdc4;
  • formal pull-request reviews on fix(config): apply aliases after ConfigData #245 at fresh re-read: zero;
  • final-head workflow aggregates: CI, Dependency Review, SBOM, Semgrep, and Security Scan all terminal-success;
  • CI's JaCoCo output on the admitted tree: Analyzed bundle 'etl-service' with 0 classes followed by All coverage checks have been met.

This issue does not claim the ConfigData behavior itself is defective. It records that the protected merge-admission boundary accepted evidence that repository policy explicitly classifies as non-qualifying: no independent non-author formal approval, synthetic-merge-only source execution, and vacuous zero-production-class coverage.

Fresh live enforcement evidence — 2026-08-13

The repository connector can now read the active repository rulesets even though direct classic branch-protection detail remains restricted. Fresh state was resolved against protected develop@4408b6086fd725ff1629d8f048cf28f3a2b40b1b.

  • Ruleset 11709659 (PR) is active on ~DEFAULT_BRANCH. It blocks deletion/non-fast-forward updates and requires pull requests plus review-thread resolution, but required_approving_review_count is 0, required_reviewers is empty, require_code_owner_review=false, require_last_push_approval=false, and it declares no bypass actors.
  • Ruleset 11709665 (Review) is active on ~ALL. It blocks deletion/non-fast-forward updates and enables Copilot code review on push/draft PRs, but it does not establish qualifying independent formal approval as a merge requirement.
  • The branch endpoint reports develop as protected: true while its summarized classic-protection payload has protection.enabled=false and required status-check enforcement off with no contexts/checks. Direct GET /branches/develop/protection returns 403 Resource not accessible by integration, so administrator restrictions and any classic-protection detail not represented by the branch summary remain unproven.
  • Both readable rulesets report bypass_actors: [] and current_user_can_bypass: never; this disproves the earlier need to guess whether the observed ordinary-path gap is caused by an explicit ruleset bypass actor. It does not prove there are no other organization/enterprise/classic protection mechanisms invisible to this integration.

The first demonstrated failing boundary is therefore concrete: the active PR ruleset itself permits zero approving reviews, and the readable branch summary does not enforce required status checks. That is sufficient to explain why the repository-level documented policy is stronger than the currently observable default-branch admission controls without inventing an administrator bypass.

RCA

Distinct remedies / feasibility

  1. Preferred — enforce qualifying evidence at the protected branch/ruleset boundary. After ci: schedule NVIDIA OpenCode maintenance agent #121 and fix(coverage): make JaCoCo production gate non-vacuous #164 (or accepted equivalents) are integrated, configure the protected default-branch admission policy to require at least one qualifying independent non-author formal approval plus the accepted exact-source, non-vacuous coverage, security, dependency, SBOM/SAST and other required checks. The current connector can verify rulesets but exposes no safe ruleset-mutation action, so this setting change is external_only from this automation rather than a reason to weaken repository-local policy.
  2. Repository-local admission control. Add a deterministic governance check that classifies source identity, coverage non-vacuity, stale-head reviews, and independent approval fail-closed. This is useful only if the protected branch actually requires the resulting check; do not create a decorative workflow that can be bypassed.
  3. Bypass governance. Inspect any remaining classic/organization/enterprise bypass or administrator authority with suitable repository-administration access, constrain it according to the accepted emergency policy, and retain auditable evidence for exceptional protected merges. Do not infer that administrator capability itself is an accepted bypass policy.
  4. Reject — retroactive evidence repair. A review submitted after merge, checks from another head/base, self-approval, a CodeRabbit status, or a synthetic merge success cannot be used to rewrite the historical admission decision as compliant.
  5. Reject — weakening the policy. Do not remove the independent-review, exact-source, non-vacuous coverage, scanner-completeness, or security gates merely because current settings do not enforce them.

Acceptance

Close only after fresh evidence proves all applicable protected-integration controls are actually enforced, not merely documented:

  1. live develop branch protection/ruleset and bypass authority are inspected and recorded without secrets;
  2. a PR with zero qualifying independent formal approvals cannot be merged through the ordinary protected path;
  3. head movement invalidates/requires regeneration of source-bound review/check evidence according to the accepted governance policy;
  4. the required CI source identity is the accepted literal source identity, or another explicitly reviewed equivalent whose identity semantics cannot be confused with GitHub's mutable synthetic PR merge ref;
  5. a JaCoCo run selecting zero governed production classes is hard non-green;
  6. applicable owned-production coverage is non-vacuous and the complete scope tracked by [Quality evidence] Extend non-vacuous 100% coverage to every owned production module #205 cannot silently omit a production module/class;
  7. scanner incompleteness such as [Security evidence] Fail closed when Trivy cannot resolve Maven BOM-managed dependency versions #196 is non-passing even when the aggregate vulnerability count is zero;
  8. current dependency review, SBOM, SAST, security, migration/compatibility and other repository-required checks are bound to the same unchanged candidate identity;
  9. ordinary maintainer/admin merge tooling cannot silently bypass the required evidence; any deliberately retained emergency bypass is narrowly authorized and auditable;
  10. a negative acceptance probe demonstrates that missing review/source/coverage evidence blocks a protected merge before this issue is closed;
  11. canonical Test Strategy, Security/Operability/Release governance and Traceability point to the executable controls without promoting active-PR behavior to shipped truth.

Sequencing / writer safety

Do not race #121 or #164 merely to react to this incident. Those branches own the current exact-source and coverage-control implementations. This issue owns the protected admission-enforcement gap and the historical #245 evidence. Waiting for those specific control branches never blocks independent mightyETL product/security/reliability work.

Relationships: #121 exact-source execution; #162/#164 non-vacuous coverage; #205 repository-wide coverage completeness; #196 vulnerability-evidence completeness; #159 canonical governance traceability; #165 release/provenance.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dependenciesDependency or lockfile maintenancearea: securitySecurity boundary, hardening, or vulnerability preventionmaintenancepriority: mediumNormal-priority or P2 workstatus: triagedOpen issue has an organization taxonomy assignmenttype: featureNew or expanded product capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions