Skip to content

chore: adopt org-infra reusable CI workflows (MegaLinter, PR title checks) - #101

Open
em-redhat wants to merge 4 commits into
unbound-force:mainfrom
em-redhat:opsx/adopt-org-infra-ci
Open

em-redhat wants to merge 4 commits into
unbound-force:mainfrom
em-redhat:opsx/adopt-org-infra-ci

Conversation

@em-redhat

Copy link
Copy Markdown
Contributor

Summary

Adopts the complytime/org-infra reusable CI workflow for standardized
linting and PR title validation, addressing issue #25. This brings
replicator in line with the org-wide CI standard already adopted by
other repos (unbound-force, dewey).

The new Standardized CI / Run linters check runs MegaLinter (12
org-standard linters including actionlint, shellcheck, golangci-lint,
markdownlint, yamllint, and security scanners) and validates PR titles
against Conventional Commits format via commitlint. The existing
Build and Test check is unchanged.

Fixes: #25

How to Test

  1. Verify workflow file: Inspect .github/workflows/ci_checks.yml
    — confirm SHA-pinned uses: reference to complytime/org-infra
    v0.7.1, timeout-minutes: 15, least-privilege permissions.

  2. Verify MegaLinter config: Inspect .mega-linter.yml — confirm
    12 org-standard linters enabled, directory exclusions for
    .opencode, .claude, .uf, .specify, dist, vendor.

  3. Verify release preflight: Inspect .github/workflows/release.yml
    — confirm ci_checks array includes both "Build and Test" and
    "Standardized CI / Run linters".

  4. Verify branch protection: Inspect .github/settings.yml
    confirm Standardized CI / Run linters added to
    required_status_checks.contexts.

  5. CI check: Observe that the Standardized CI / Run linters
    check runs on this PR and produces MegaLinter output.

How to Demo

After merge, open any PR against main and observe two required CI
checks: the existing Build and Test and the new
Standardized CI / Run linters. Non-conventional PR titles will be
rejected by commitlint. MegaLinter will scan changed files for lint
issues across GitHub Actions, shell, Go, Markdown, YAML, and security.

Key Files Changed

CI/CD Configuration:

  • .github/workflows/ci_checks.yml — New consumer workflow calling
    org-infra reusable CI (SHA-pinned v0.7.1)
  • .mega-linter.yml — New MegaLinter configuration with org-standard
    12-linter set and project-specific directory exclusions
  • .github/workflows/release.yml — Updated preflight ci_checks
    array to gate on both checks
  • .github/settings.yml — Added new required status check to branch
    protection

Documentation:

  • AGENTS.md — Documented new CI check and added Recent Changes entry

Spec Artifacts:

  • openspec/changes/adopt-org-infra-ci/ — Proposal, design, spec,
    and tasks for this change

This PR was generated by /uf.finale (AI-assisted).

…ecks)

- Add ci_checks.yml consuming complytime/org-infra reusable CI workflow
  (SHA-pinned to v0.7.1) for MegaLinter and commitlint PR title validation
- Add .mega-linter.yml with org-standard 12-linter set and directory
  exclusions for AI agent configs and build output
- Update release.yml preflight to gate on both "Build and Test" and
  "Standardized CI / Run linters" checks
- Update settings.yml branch protection to require the new linter check
- Update AGENTS.md to document the new CI check and add Recent Changes entry
- Include OpenSpec change artifacts (proposal, design, spec, tasks)
- Include Dewey learnings from prior sessions

Fixes: unbound-force#25

Assisted-by: claude-opus
Generated with AI assistance (claude-opus)
@em-redhat
em-redhat requested a review from a team as a code owner September 9, 2026 12:04
@em-redhat em-redhat self-assigned this Sep 9, 2026
@em-redhat em-redhat added the enhancement New feature or request label Sep 9, 2026
@em-redhat em-redhat moved this to Ready for Review 👀 in Unbound Force Planning Sep 9, 2026
Comment thread .uf/dewey/learnings/commit-trailers-ai-assisted.md Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:07 AM UTC · Completed 10:27 AM UTC

Commit: 2e60ea5 · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $7.03

@fullsend-ai-review fullsend-ai-review Bot added the risk/moderate PR risk: moderate label Sep 14, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 14, 2026

Copy link
Copy Markdown

Risk Assessment: moderate (2/5)

Details

Score unchanged from prior assessment (2, moderate). Tier 1 raw metrics inflated by 22 deleted learnings files and 5 new openspec documents, but actual risk surface is narrow: one new CI workflow, one new linter config, and minor edits to 4 existing files. No security-sensitive or dependency changes. CI workflow addition is additive and easily reverted. All issue acceptance criteria met.

Previous run

Risk Assessment: moderate (2/5)

Details

CI config change with 4 protected paths and workflow modifications, but the change is additive, well-documented with rollback procedure, all issue acceptance criteria are met, most files are new documentation, and no dependency or security-sensitive changes exist.

@fullsend-ai-review

fullsend-ai-review Bot commented Sep 14, 2026

Copy link
Copy Markdown

Review

Findings

Medium

  • [protected-path] .github/settings.yml, .github/workflows/ci_checks.yml, .github/workflows/release.yml, AGENTS.md — This PR modifies 4 files under protected paths (.github/, AGENTS.md). The PR links to issue chore: adopt org-infra reusable CI workflows (MegaLinter, PR title checks) #25 and the description explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

  • [runtime mechanism] .github/settings.yml:20 — The required status check name "Standardized CI / Run linters" is derived from the caller job name combined with the internal job name of the reusable workflow at complytime/org-infra. If the reusable workflow's job is not named exactly "Run linters", the required check will never be satisfied and all PR merges to main will be blocked. The same name is used in release.yml's ci_checks parameter.
    Remediation: Verify by checking the job name in complytime/org-infra/.github/workflows/reusable_ci.yml, or by confirming the exact check name reported by a test run.

Low

  • [Secrets-Detection-Gap] .mega-linter.yml:2ADDITIONAL_EXCLUDED_DIRECTORIES excludes .opencode, .claude, .uf, and .specify from all enabled linters, including REPOSITORY_BETTERLEAKS (secrets scanner). If a secret is accidentally committed to any of these directories, the secrets scanner will not detect it. The spec acknowledges this trade-off and suggests per-linter overrides as a future enhancement.

  • [incomplete-contributor-linting-guidance] CONTRIBUTING.md:20 — The "Building and Testing" section lists make targets but omits make lint. With this PR adding "Standardized CI / Run linters" as a required check, contributors following the documented workflow will not catch linting issues locally.
    Remediation: Add make lint to the documented make targets in CONTRIBUTING.md.

  • [scope-creep] .uf/dewey/learnings/ — The PR deletes 22 agent-generated learnings files and adds .uf/dewey/learnings/ to .gitignore. While unrelated to the CI adoption scope authorized by issue chore: adopt org-infra reusable CI workflows (MegaLinter, PR title checks) #25, these are housekeeping deletions of files that should not have been tracked. The .gitignore addition addresses the root cause.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR
Previous run

Review

Findings

Medium

  • [naming-convention] .github/workflows/ci_checks.yml:31 — Job key call_reusable_ci uses snake_case, while every existing multi-word job key in the repository's workflows uses kebab-case: build-and-test (ci.yml), check-signing-secrets, sign-macos, publish-cask (release.yml).
    Remediation: Rename the job key to call-reusable-ci.

  • [protected-path] .github/settings.yml, .github/workflows/ci_checks.yml, .github/workflows/release.yml, AGENTS.md — This PR modifies 4 files under protected paths (.github/, AGENTS.md). The PR links to issue chore: adopt org-infra reusable CI workflows (MegaLinter, PR title checks) #25 and the description explains the rationale for the changes. Human approval is always required for protected-path changes, regardless of context.

Low

  • [Secrets-Detection-Gap] .mega-linter.yml:2ADDITIONAL_EXCLUDED_DIRECTORIES excludes .opencode, .claude, .uf, and .specify from all enabled linters, including REPOSITORY_BETTERLEAKS (secrets scanner). If a secret is accidentally committed to any of these directories, the secrets scanner will not detect it. Consider using linter-specific exclusion overrides rather than global directory exclusion.

  • [scope-creep] .uf/dewey/learnings/ — The PR includes 37 process documentation files spanning topics unrelated to CI adoption. These appear to be agent-generated byproducts accumulated during development. Consider splitting into a separate commit or PR to keep the review surface focused.

  • [naming-convention] .uf/dewey/learnings/commit-trailers-ai-assisted.md — Seven new learnings files omit the <topic>-<YYYYMMDD>T<HHMMSS>-<author>.md naming suffix used by all 23 existing files in the directory.

  • [incomplete-CI-parity-documentation] AGENTS.md:93 — The CI Parity Gate section tells agents to read workflow files for local commands, but ci_checks.yml delegates to a reusable workflow with no locally runnable commands. Add a note that MegaLinter is CI-only or document the local equivalent.


Next steps:

  • /fs-fix — agent addresses review findings automatically
  • /fs-fix <your instruction> — agent fixes with your specific guidance
  • Push commits directly — review re-runs automatically on push
  • /fs-fix-stop — disable automatic fix runs for this PR

fullsend-ai-review[bot]

This comment was marked as outdated.

Remove 60 .uf/dewey/learnings/*.md files that were
unintentionally included in the PR. Add .uf/dewey/learnings/
to .gitignore to prevent future leaks.

Addresses PR unbound-force#101 review feedback from @marcusburghardt.

Signed-off-by: Em <em-redhat@users.noreply.github.com>
Assisted-by: claude-opus
Rename call_reusable_ci to call-reusable-ci to match
the kebab-case convention used by all other workflow
job keys (build-and-test, check-signing-secrets, etc.).

Addresses PR unbound-force#101 review feedback from @fullsend-ai-review.

Signed-off-by: Em <em-redhat@users.noreply.github.com>
Assisted-by: claude-opus
Add note that MegaLinter runs in CI only with no local
equivalent, and suggest mega-linter-runner (requires
Docker) for local linting.

Addresses PR unbound-force#101 review feedback from @fullsend-ai-review.

Signed-off-by: Em <em-redhat@users.noreply.github.com>
Assisted-by: claude-opus
@fullsend-ai-review

fullsend-ai-review Bot commented Sep 14, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:22 PM UTC · Completed 3:43 PM UTC

Commit: f72c13e · View workflow run →

Runtime: claude · Model: opus → claude-opus-4-6 · Effort: high · Cost: $6.60

@fullsend-ai-review fullsend-ai-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See the review comment for full details.

Comment thread .github/settings.yml
strict: true
contexts:
- "Build and Test"
- "Standardized CI / Run linters"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[medium] runtime mechanism

The required status check name "Standardized CI / Run linters" depends on the external reusable workflow job name. If the reusable workflow job is not named exactly "Run linters", the required check will never be satisfied and all PR merges to main will be blocked.

Suggested fix: Verify by checking the job name in complytime/org-infra/.github/workflows/reusable_ci.yml, or by confirming the exact check name reported by a test run.

Comment thread .mega-linter.yml
@@ -0,0 +1,24 @@
# https://megalinter.io/latest/supported-linters/
ADDITIONAL_EXCLUDED_DIRECTORIES:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[low] Secrets-Detection-Gap

ADDITIONAL_EXCLUDED_DIRECTORIES excludes .opencode, .claude, .uf, and .specify from all enabled linters, including REPOSITORY_BETTERLEAKS (secrets scanner). If a secret is accidentally committed to any of these directories, the secrets scanner will not detect it.

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

Labels

enhancement New feature or request risk/moderate PR risk: moderate

Projects

Status: Ready for Review 👀

Development

Successfully merging this pull request may close these issues.

chore: adopt org-infra reusable CI workflows (MegaLinter, PR title checks)

3 participants