Skip to content

HPNEX-6: Enable self-service plugin contributions - #487

Merged
openshift-merge-bot[bot] merged 2 commits into
openshift-eng:mainfrom
stbenjam:easier
May 20, 2026
Merged

openshift-merge-bot[bot] merged 2 commits into
openshift-eng:mainfrom
stbenjam:easier

Conversation

@stbenjam

@stbenjam stbenjam commented May 20, 2026

Copy link
Copy Markdown
Member

Summary

Makes it easier for anyone to contribute plugins without needing admin approval.

  • Enable auto_approve_unowned_subfolders in root OWNERS so plugin PRs can be approved by any collaborator
  • Add OWNERS files to each plugin directory with per-plugin contributors from git history
  • Add OWNERS files to protected directories (.github, evals, images, scripts, tests) so they remain admin-only
  • Add a plugin-owners-required skillsaw lint rule to enforce that every plugin has an OWNERS file
  • Replace old doc generation scripts with skillsaw docs (avoids needing to touch any files in / of the repo)
  • Add make test for lint rule unit tests and make list-unprotected to show open directories

Test plan

  • make lint passes
  • make test passes
  • Verify plugin PRs can be approved without admin

🤖 Generated with Claude Code

@openshift-ci
openshift-ci Bot requested review from stleerh and theobarberbany May 20, 2026 11:35
@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 20, 2026
@coderabbitai

coderabbitai Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

The PR implements a comprehensive ownership governance system by centralizing approvals through the ai-helpers-admins group alias, enforces OWNERS file presence across plugins and protected directories via new Skillsaw rules, and migrates documentation generation from custom Python scripts to a containerized skillsaw docs command integrated into the build system.

Changes

Ownership Governance System

Layer / File(s) Summary
Ownership alias infrastructure
OWNERS_ALIASES, OWNERS
Introduces OWNERS_ALIASES file with ai-helpers-admins group mapping 14 users, and updates root OWNERS to use the group with auto-approval for unowned subfolders.
Plugin and area OWNERS files
plugins/*/OWNERS, .github/OWNERS, scripts/OWNERS, evals/OWNERS, images/OWNERS, tests/OWNERS, .cursor/OWNERS, .github/workflows/OWNERS
Populates 50+ plugin directories and infrastructure areas with explicit approvers and reviewers lists that include ai-helpers-admins and domain-specific owners.
OWNERS enforcement rules and configuration
.skillsaw-owners-rule.py, .skillsaw-protected-dirs-rule.py, .skillsaw.yaml, tests/conftest.py, tests/test_owners_rule.py, tests/test_protected_dirs_rule.py
Updates PluginOwnersRequiredRule to require root-level OWNERS only; introduces new ProtectedDirsOwnersRule for directory-level enforcement; configures both in Skillsaw; adds pytest fixtures and comprehensive test classes for both rules.

Documentation System Migration

Layer / File(s) Summary
Skillsaw documentation rule and configuration
.skillsaw/plugindocs_rule.py, .skillsaw.yaml
Updates PluginsDocUpToDateRule to validate docs/index.html freshness by running skillsaw docs -o docs/ and detecting content changes; bumps Skillsaw version to 0.10.1 and adds new protected-dirs-owners rule configuration.
Legacy script and documentation removal
scripts/build-website.py, scripts/generate_plugin_docs.py, agents/feedback.md, commands/hello-world/echo.toml, docs/data.json, docs/README.md
Removes Python-based website and plugin docs generators, agent definition, example command, and generated JSON registry as they are superseded by containerized skillsaw docs generation.
Build system and workflow integration
Makefile, .github/workflows/update-docs.yml, .github/workflows/validate-plugin-version.yml, .github/workflows/lint-review.yml
Pins Skillsaw image to 0.10.1, adds test target for pytest in container, extends update target to create OWNERS symlinks and run skillsaw docs, adds list-unprotected target, updates doc-generation workflows to exclude PLUGINS.md and filter OWNERS file changes.
Documentation content and references
CONTRIBUTING.md, PLUGINS.md, README.md
Updates CONTRIBUTING to document docs/index.html regeneration via make update and skillsaw docs; redirects PLUGINS.md to external marketplace; updates README plugin links to marketplace.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • openshift-eng/ai-helpers#474: Implements the initial PluginOwnersRequiredRule with legacy-exceptions that this PR further refines by removing exceptions and focusing on root-level OWNERS validation.
  • openshift-eng/ai-helpers#291: Modifies OWNERS governance by changing approvers/reviewers entries; this PR consolidates that pattern by introducing the ai-helpers-admins group alias.
  • openshift-eng/ai-helpers#470: Populates docs/data.json and updates PLUGINS.md with plugin metadata that this PR removes in favor of dynamic skillsaw docs generation.

Suggested labels

lgtm

Suggested reviewers

  • theobarberbany
  • stleerh
🚥 Pre-merge checks | ✅ 9 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (9 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No Real People Names In Style References ✅ Passed No real people's names found as style references in plugin commands, skills, documentation, or prompts. "Personas" references are technical terms only.
No Assumed Git Remote Names ✅ Passed The modified validate-plugin-version.yml correctly discovers the remote using git remote | head -n1 before using it. No hardcoded git remote names found in any PR-modified files.
Git Push Safety Rules ✅ Passed PR does not introduce any new git push operations, force pushes, or automated push workflows. It removes old files and adds configuration/test files only.
No Untrusted Mcp Servers ✅ Passed PR adds no MCP server installations from untrusted sources. It only adds a security review check and maintains allowlist with verified gopls tool.
Ai-Helpers Overlap Detection ✅ Passed PR reorganizes existing plugin definitions into structured directories; does not introduce new overlapping functionality with other open PRs.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'HPNEX-6: Enable self-service plugin contributions' accurately reflects the main objective of the changeset, which involves adding OWNERS files and enabling self-service contributions through auto_approve_unowned_subfolders and per-plugin OWNERS configuration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands and usage tips.

@openshift-ci openshift-ci Bot added the do-not-merge/invalid-owners-file Indicates that a PR should not merge because it has an invalid OWNERS file in it. label May 20, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
Makefile (1)

19-20: ⚡ Quick win

Use $(CLAUDELINT_IMAGE) in lint to avoid image drift.

lint-pull uses the variable, but lint still hardcodes the image name.

💡 Suggested fix
-	$(CONTAINER_RUNTIME) run --rm $(SELINUX_OPT) -v $(PWD):/workspace:Z ghcr.io/stbenjam/claudelint:main -v --strict
+	$(CONTAINER_RUNTIME) run --rm $(SELINUX_OPT) -v $(PWD):/workspace:Z $(CLAUDELINT_IMAGE) -v --strict
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Makefile` around lines 19 - 20, The lint recipe in the Makefile hardcodes
ghcr.io/stbenjam/claudelint:main; change that to use the existing variable
$(CLAUDELINT_IMAGE) so the image can be controlled centrally (keep
$(CONTAINER_RUNTIME), $(SELINUX_OPT), volume mount and flags unchanged), i.e.,
replace the literal image token in the lint command with $(CLAUDELINT_IMAGE) to
match lint-pull and avoid image drift.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.skillsaw-custom.py:
- Around line 42-88: The current check runs website_script_path via
subprocess.run and reads/writes data_json_path (via original_data_json,
generated_data_json) which can create or modify docs/data.json during linting;
change it to run the script without mutating the repo by directing its output
into an isolated temporary location or running it against a temporary copy of
the repo: invoke subprocess.run(website_script_path) with environment or
arguments that make it write to a temp file (or set cwd to a tmpdir copy), then
compare the temp file contents to original_data_json
(data_json_path.read_text()) and report violations; remove any code that writes
back to data_json_path and ensure all temp files/directories are cleaned up even
on timeout/exception (handle subprocess.TimeoutExpired and other exceptions
accordingly).

---

Nitpick comments:
In `@Makefile`:
- Around line 19-20: The lint recipe in the Makefile hardcodes
ghcr.io/stbenjam/claudelint:main; change that to use the existing variable
$(CLAUDELINT_IMAGE) so the image can be controlled centrally (keep
$(CONTAINER_RUNTIME), $(SELINUX_OPT), volume mount and flags unchanged), i.e.,
replace the literal image token in the lint command with $(CLAUDELINT_IMAGE) to
match lint-pull and avoid image drift.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4235eaee-2f07-4ce2-a7e7-7af5c712de57

📥 Commits

Reviewing files that changed from the base of the PR and between ad12313 and abed86b.

📒 Files selected for processing (59)
  • .cursor/OWNERS
  • .github/OWNERS
  • .github/workflows/lint-plugins.yml
  • .github/workflows/update-docs.yml
  • .skillsaw-custom.py
  • .skillsaw.yaml
  • .skillsaw/owners_rule.py
  • .skillsaw/plugindocs_rule.py
  • .skillsaw/promptfoo_budget_rule.py
  • CONTRIBUTING.md
  • Makefile
  • OWNERS
  • OWNERS_ALIASES
  • PLUGINS.md
  • README.md
  • agents/feedback.md
  • commands/hello-world/echo.toml
  • evals/OWNERS
  • images/OWNERS
  • plugins/agendas/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/ci/OWNERS
  • plugins/code-review/OWNERS
  • plugins/compliance/OWNERS
  • plugins/console/OWNERS
  • plugins/container-image/OWNERS
  • plugins/doc/OWNERS
  • plugins/etcd/OWNERS
  • plugins/git/OWNERS
  • plugins/golang/OWNERS
  • plugins/gwapi/OWNERS
  • plugins/hcp/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/jira/OWNERS
  • plugins/lvms/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/native-notifications/OWNERS
  • plugins/node-tuning/OWNERS
  • plugins/node/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/olm/OWNERS
  • plugins/openshift-tls-profile/OWNERS
  • plugins/openshift/OWNERS
  • plugins/origin/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/rds-analyzer/OWNERS
  • plugins/session/OWNERS
  • plugins/snowflake/OWNERS
  • plugins/sosreport/OWNERS
  • plugins/teams/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/testing/OWNERS
  • plugins/utils/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/yaml/OWNERS
  • scripts/OWNERS
💤 Files with no reviewable changes (5)
  • commands/hello-world/echo.toml
  • .skillsaw/owners_rule.py
  • .skillsaw/plugindocs_rule.py
  • agents/feedback.md
  • .skillsaw/promptfoo_budget_rule.py

Comment thread .skillsaw/plugindocs_rule.py
@stbenjam
stbenjam force-pushed the easier branch 11 times, most recently from a7d5ef2 to 702178f Compare May 20, 2026 12:00
@openshift-ci openshift-ci Bot removed the do-not-merge/invalid-owners-file Indicates that a PR should not merge because it has an invalid OWNERS file in it. label May 20, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
.skillsaw/plugindocs_rule.py (1)

42-86: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Always restore docs/index.html in a finally block.

This check still mutates the repo on failure paths (returncode != 0, timeout, exception) if skillsaw docs touches docs/index.html before failing.

💡 Proposed fix
-        try:
-            original_content = index_path.read_text()
+        original_content = index_path.read_text()
+        try:
@@
-            generated_content = index_path.read_text()
-            if original_content != generated_content:
-                index_path.write_text(original_content)
+            generated_content = index_path.read_text()
+            if original_content != generated_content:
@@
         except subprocess.TimeoutExpired:
             violations.append(
                 self.violation(
                     "'skillsaw docs' timed out",
                     file_path=index_path
                 )
             )
         except Exception as e:
             violations.append(
                 self.violation(
                     f"Error checking docs up-to-date status: {e}",
                     file_path=index_path
                 )
             )
+        finally:
+            if index_path.exists():
+                current_content = index_path.read_text()
+                if current_content != original_content:
+                    index_path.write_text(original_content)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw/plugindocs_rule.py around lines 42 - 86, Read and store
original_content from index_path before entering the try, then run
subprocess.run and perform your comparison logic inside try without calling
index_path.write_text there; instead add a finally block that always restores
docs/index.html by writing original_content back if original_content is set;
update references in the code to remove the in-try write (the line that called
index_path.write_text(original_content)) and rely on the new finally to restore
state (use the same symbols: index_path, original_content, generated_content,
subprocess.run, self.violation, violations).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.skillsaw-owners-rule.py:
- Around line 64-69: The rule currently accepts any symlink for sub_owners;
change the check so that after confirming sub_owners.is_symlink() you resolve
the symlink target (e.g., via sub_owners.readlink()/resolve()) and verify it
points exactly to the plugin root OWNERS file (the path built from node.path /
"OWNERS" or equivalent in this codebase); if the target is different, append the
same violation (or a slightly adjusted message) so only symlinks that delegate
to the plugin root OWNERS pass. Ensure this logic lives with the existing branch
that handles non-symlinks (around sub_owners.is_symlink()) and use the same
symbols plugin_name, subdir.relative_to(node.path), sub_owners, and node.path to
construct the violation message.

---

Duplicate comments:
In @.skillsaw/plugindocs_rule.py:
- Around line 42-86: Read and store original_content from index_path before
entering the try, then run subprocess.run and perform your comparison logic
inside try without calling index_path.write_text there; instead add a finally
block that always restores docs/index.html by writing original_content back if
original_content is set; update references in the code to remove the in-try
write (the line that called index_path.write_text(original_content)) and rely on
the new finally to restore state (use the same symbols: index_path,
original_content, generated_content, subprocess.run, self.violation,
violations).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 96b3a526-ffa9-4525-933d-3f25cd79dbb2

📥 Commits

Reviewing files that changed from the base of the PR and between abed86b and 702178f.

📒 Files selected for processing (252)
  • .cursor/OWNERS
  • .github/OWNERS
  • .github/workflows/OWNERS
  • .github/workflows/update-docs.yml
  • .github/workflows/validate-plugin-version.yml
  • .skillsaw-owners-rule.py
  • .skillsaw-promptfoo-budget-rule.py
  • .skillsaw.yaml
  • .skillsaw/plugindocs_rule.py
  • CONTRIBUTING.md
  • Makefile
  • OWNERS
  • OWNERS_ALIASES
  • PLUGINS.md
  • README.md
  • agents/feedback.md
  • commands/hello-world/echo.toml
  • docs/README.md
  • docs/data.json
  • docs/index.html
  • evals/OWNERS
  • images/OWNERS
  • plugins/agendas/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/ai-sbom/scripts/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ai-sbom/skills/generate/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/bigquery/commands/OWNERS
  • plugins/bigquery/skills/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/ci/OWNERS
  • plugins/ci/agents/OWNERS
  • plugins/ci/commands/OWNERS
  • plugins/ci/docs/OWNERS
  • plugins/ci/scripts/OWNERS
  • plugins/ci/skills/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/ci/skills/analyze-disruption/OWNERS
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
  • plugins/ci/skills/fetch-payloads/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/ci/skills/fetch-regression-details/OWNERS
  • plugins/ci/skills/fetch-related-triages/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/ci/skills/fetch-test-report/OWNERS
  • plugins/ci/skills/fetch-test-runs/OWNERS
  • plugins/ci/skills/oc-auth/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • plugins/ci/skills/payload-experimental-reverts/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/ci/skills/prow-job-analyze-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-resource/OWNERS
  • plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
  • plugins/ci/skills/prow-job-artifact-search/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/ci/skills/set-release-blocker/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/ci/skills/triage-regression/OWNERS
  • plugins/ci/skills/trigger-payload-job/OWNERS
  • plugins/code-review/OWNERS
  • plugins/code-review/commands/OWNERS
  • plugins/code-review/evals/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/code-review/skills/lang-go/OWNERS
  • plugins/code-review/skills/profile-hypershift/OWNERS
  • plugins/compliance/OWNERS
  • plugins/compliance/commands/OWNERS
  • plugins/compliance/skills/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/compliance/skills/remediation-planning/OWNERS
  • plugins/console/OWNERS
  • plugins/console/skills/OWNERS
  • plugins/console/skills/upgrade-sdk/OWNERS
  • plugins/container-image/OWNERS
  • plugins/container-image/commands/OWNERS
  • plugins/doc/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/etcd/OWNERS
  • plugins/etcd/commands/OWNERS
  • plugins/git/OWNERS
  • plugins/git/commands/OWNERS
  • plugins/git/skills/OWNERS
  • plugins/git/skills/suggest-reviewers/OWNERS
  • plugins/golang/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/golang/hooks/scripts/OWNERS
  • plugins/golang/skills/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • plugins/golang/skills/lint-fix/OWNERS
  • plugins/golang/skills/lint/OWNERS
  • plugins/gwapi/OWNERS
  • plugins/gwapi/commands/OWNERS
  • plugins/gwapi/resources/OWNERS
  • plugins/hcp/OWNERS
  • plugins/hcp/commands/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/hcp/skills/hcp-create-azure/OWNERS
  • plugins/hcp/skills/hcp-create-kubevirt/OWNERS
  • plugins/hcp/skills/hcp-create-openstack/OWNERS
  • plugins/hcp/skills/hcp-create-powervs/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/hello-world/commands/OWNERS
  • plugins/hello-world/evals/OWNERS
  • plugins/jira/OWNERS
  • plugins/jira/commands/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/jira/evals/fixtures/OWNERS
  • plugins/jira/reference/OWNERS
  • plugins/jira/skills/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/jira/skills/create-bug/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/jira/skills/create-release-note/OWNERS
  • plugins/jira/skills/create-story/OWNERS
  • plugins/jira/skills/create-task/OWNERS
  • plugins/jira/skills/extract-prs/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • plugins/jira/skills/hypershift/OWNERS
  • plugins/jira/skills/jira-doc-generator/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • plugins/jira/skills/ready-to-solve/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • plugins/lvms/OWNERS
  • plugins/lvms/commands/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/lvms/skills/lvms-analyzer/OWNERS
  • plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/marketplace-ops/commands/OWNERS
  • plugins/marketplace-ops/scripts/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/must-gather/commands/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/native-notifications/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/node-tuning/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/node/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/olm-team/scripts/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/olm/OWNERS
  • plugins/olm/commands/OWNERS
  • plugins/openshift-tls-profile/OWNERS
  • plugins/openshift-tls-profile/commands/OWNERS
  • plugins/openshift-tls-profile/skills/OWNERS
  • plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
  • plugins/openshift/OWNERS
  • plugins/openshift/commands/OWNERS
  • plugins/openshift/skills/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
  • plugins/openshift/skills/openshift-node-kernel/OWNERS
  • plugins/origin/OWNERS
  • plugins/origin/commands/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/ote-migration/commands/OWNERS
  • plugins/ote-migration/skills/OWNERS
  • plugins/ote-migration/skills/ote-migration-workflow/OWNERS
  • plugins/rds-analyzer/OWNERS
  • plugins/rds-analyzer/commands/OWNERS
  • plugins/rds-analyzer/scripts/OWNERS
  • plugins/rds-analyzer/skills/OWNERS
  • plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
  • plugins/session/OWNERS
  • plugins/session/commands/OWNERS
  • plugins/snowflake/OWNERS
  • plugins/snowflake/commands/OWNERS
  • plugins/snowflake/scripts/OWNERS
  • plugins/snowflake/skills/OWNERS
  • plugins/snowflake/skills/setup-snowflake/OWNERS
  • plugins/sosreport/OWNERS
  • plugins/sosreport/commands/OWNERS
  • plugins/sosreport/skills/OWNERS
  • plugins/sosreport/skills/logs-analysis/OWNERS
  • plugins/sosreport/skills/network-analysis/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
  • plugins/sosreport/skills/resource-analysis/OWNERS
  • plugins/sosreport/skills/system-config-analysis/OWNERS
  • plugins/teams/OWNERS
  • plugins/teams/commands/OWNERS
  • plugins/teams/skills/OWNERS
  • plugins/teams/skills/analyze-regressions/OWNERS
  • plugins/teams/skills/coderabbit-adoption/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
  • plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
  • plugins/teams/skills/get-release-dates/OWNERS
  • plugins/teams/skills/list-components/OWNERS
  • plugins/teams/skills/list-jiras/OWNERS
  • plugins/teams/skills/list-regressions/OWNERS
  • plugins/teams/skills/list-teams/OWNERS
  • plugins/teams/skills/summarize-jiras/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/test-coverage/commands/OWNERS
  • plugins/test-coverage/skills/OWNERS
  • plugins/test-coverage/skills/analyze/OWNERS
  • plugins/test-coverage/skills/gaps/OWNERS
  • plugins/testing/OWNERS
  • plugins/testing/commands/OWNERS
  • plugins/testing/skills/OWNERS
  • plugins/testing/skills/mutation-generator/OWNERS
  • plugins/testing/skills/mutation-tester/OWNERS
  • plugins/utils/OWNERS
  • plugins/utils/commands/OWNERS
  • plugins/utils/scripts/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/workspaces/commands/OWNERS
  • plugins/workspaces/commands/create/OWNERS
  • plugins/workspaces/commands/delete/OWNERS
  • plugins/yaml/OWNERS
  • plugins/yaml/commands/OWNERS
  • scripts/OWNERS
  • scripts/build-website.py
  • scripts/generate_plugin_docs.py
💤 Files with no reviewable changes (7)
  • docs/data.json
  • agents/feedback.md
  • scripts/generate_plugin_docs.py
  • docs/README.md
  • commands/hello-world/echo.toml
  • .github/workflows/update-docs.yml
  • scripts/build-website.py
✅ Files skipped from review due to trivial changes (150)
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/ci/skills/fetch-payloads/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • .github/workflows/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/container-image/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • images/OWNERS
  • OWNERS_ALIASES
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/code-review/skills/lang-go/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
  • OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/rds-analyzer/skills/OWNERS
  • plugins/ote-migration/skills/OWNERS
  • plugins/ci/skills/payload-experimental-reverts/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/console/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
  • plugins/ci/skills/prow-job-analyze-install-failure/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
  • plugins/sosreport/skills/logs-analysis/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
  • plugins/teams/skills/OWNERS
  • plugins/jira/skills/create-release-note/OWNERS
  • plugins/rds-analyzer/commands/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • plugins/ci/skills/fetch-regression-details/OWNERS
  • plugins/gwapi/commands/OWNERS
  • plugins/testing/skills/mutation-generator/OWNERS
  • plugins/teams/commands/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/golang/skills/lint/OWNERS
  • plugins/testing/skills/OWNERS
  • plugins/snowflake/skills/OWNERS
  • plugins/bigquery/skills/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/test-coverage/skills/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/utils/commands/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/OWNERS
  • plugins/jira/evals/fixtures/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • scripts/OWNERS
  • plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/OWNERS
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/jira/skills/jira-doc-generator/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/snowflake/skills/setup-snowflake/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • .cursor/OWNERS
  • plugins/utils/scripts/OWNERS
  • plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
  • plugins/teams/skills/coderabbit-adoption/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/workspaces/commands/delete/OWNERS
  • plugins/console/skills/upgrade-sdk/OWNERS
  • plugins/test-coverage/skills/analyze/OWNERS
  • plugins/snowflake/scripts/OWNERS
  • plugins/olm-team/scripts/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/ote-migration/skills/ote-migration-workflow/OWNERS
  • plugins/gwapi/resources/OWNERS
  • plugins/teams/skills/list-teams/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/teams/skills/list-regressions/OWNERS
  • plugins/workspaces/commands/create/OWNERS
  • plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/code-review/skills/profile-hypershift/OWNERS
  • plugins/golang/skills/lint-fix/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
  • plugins/marketplace-ops/commands/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/container-image/commands/OWNERS
  • evals/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/test-coverage/commands/OWNERS
  • plugins/code-review/OWNERS
  • plugins/ai-sbom/skills/generate/OWNERS
  • PLUGINS.md
  • plugins/code-review/evals/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/sosreport/commands/OWNERS
  • CONTRIBUTING.md
  • plugins/teams/skills/summarize-jiras/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/teams/skills/list-components/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/compliance/OWNERS
  • plugins/compliance/skills/OWNERS
  • plugins/olm/commands/OWNERS
  • plugins/openshift/skills/openshift-node-kernel/OWNERS
  • plugins/teams/skills/get-release-dates/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/golang/hooks/scripts/OWNERS
  • plugins/node/OWNERS
  • plugins/sosreport/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • README.md
  • plugins/teams/skills/list-jiras/OWNERS
  • plugins/golang/OWNERS
  • plugins/git/OWNERS
  • plugins/origin/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/agendas/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/jira/OWNERS
  • plugins/sosreport/skills/OWNERS

Comment thread .skillsaw-owners-rule.py Outdated
@stbenjam
stbenjam force-pushed the easier branch 4 times, most recently from 6212aaa to d7a952f Compare May 20, 2026 12:40

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

♻️ Duplicate comments (2)
.skillsaw-owners-rule.py (1)

64-71: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Validate symlink target, not just symlink type.

A subdirectory OWNERS symlink currently passes even if it points somewhere other than the plugin-root OWNERS, which can bypass the delegation model.

Suggested fix
                 elif not sub_owners.is_symlink():
                     violations.append(
                         self.violation(
                             f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' "
                             f"has an OWNERS file that is not a symlink to the plugin root",
                             file_path=sub_owners,
                         )
                     )
+                else:
+                    try:
+                        if sub_owners.resolve(strict=True) != owners_path.resolve(strict=True):
+                            violations.append(
+                                self.violation(
+                                    f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' "
+                                    f"has an OWNERS symlink that does not point to the plugin root",
+                                    file_path=sub_owners,
+                                )
+                            )
+                    except FileNotFoundError:
+                        violations.append(
+                            self.violation(
+                                f"Plugin '{plugin_name}' subdirectory '{subdir.relative_to(node.path)}' "
+                                f"has a broken OWNERS symlink",
+                                file_path=sub_owners,
+                            )
+                        )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw-owners-rule.py around lines 64 - 71, The current check only
verifies that sub_owners.is_symlink() is true; update the logic in the block
that builds violations for sub_owners to also validate the symlink target points
to the plugin root OWNERS file (the expected target is node.path / "OWNERS" for
the given plugin). After detecting a symlink, read its target (using
Path.readlink or resolve via Path.resolve(strict=False)/os.path.realpath) and
normalize both target and expected paths (absolute/real) before comparing; if
they differ, append a violation via self.violation (same message context)
indicating the OWNERS symlink does not point to the plugin root OWNERS. Ensure
the check handles relative symlink targets correctly by comparing resolved paths
rather than raw strings.
.skillsaw/plugindocs_rule.py (1)

53-60: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Lint check can leave docs/index.html modified on failure paths.

index.html is restored only on content-mismatch success path; if skillsaw docs fails, times out, or throws after writing, the repo can remain dirty.

Suggested fix
-        try:
-            original_content = index_path.read_text()
+        original_content = index_path.read_text()
+        try:
@@
-            if result.returncode != 0:
+            if result.returncode != 0:
                 violations.append(
@@
                 )
                 return violations
@@
-            if original_content != generated_content:
-                index_path.write_text(original_content)
+            if original_content != generated_content:
@@
         except subprocess.TimeoutExpired:
@@
         except Exception as e:
@@
+        finally:
+            if index_path.exists():
+                index_path.write_text(original_content)

Also applies to: 73-85

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw/plugindocs_rule.py around lines 53 - 60, The check leaves
docs/index.html modified on non-success paths; update the function in
.skillsaw/plugindocs_rule.py to capture the original contents of index_path
(docs/index.html) before running skillsaw (e.g., read into a variable) and
ensure you restore that content on all failure/timeout/exception paths (use a
try/finally or explicit restore in the error branches that handle
result.returncode != 0 and the other block around lines 73-85). Reference the
existing variables/functions in the file (index_path, result, self.violation,
violations) and make sure the restore happens before returning violations so the
repo is not left dirty.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.skillsaw-owners-rule.py:
- Around line 50-54: The current recursive traversal uses node.path.rglob("*")
and only checks subdir.name, which still visits descendants of excluded
directories; update the exclusion check to skip any path that contains an
excluded segment (e.g., check if any(part in exclusions for part in
subdir.parts)) so descendants are ignored too, or replace rglob traversal with
os.walk/Path.iterdir and prune excluded directories when encountered; reference
node.path.rglob and subdir.name to locate the loop and change the condition to
test subdir.parts (or perform pruning) so entire excluded trees (.claude-plugin,
__pycache__, .work) are not traversed.

In @.skillsaw-protected-dirs-rule.py:
- Around line 63-67: The current loop over protected_path.rglob("*") only checks
subdir.name and so still enters descendants of excluded trees; update the filter
to examine the full relative path instead: compute rel =
subdir.relative_to(protected_path) (or use subdir.parts) and skip if any part of
rel (or the first part) matches the excluded set like "__pycache__" or ".work"
so that entire excluded trees and their descendants are ignored; adjust the
condition around subdir.is_dir() to use this rel-path check instead of only
subdir.name.

In `@Makefile`:
- Around line 40-43: The find command in the Makefile currently excludes only
the directories themselves (e.g., '*/.claude-plugin') but not their descendants;
update the find invocation used in the while-read loop to prune entire trees and
match descendants (for example replace the current -not -path '*/.claude-plugin'
style with -path '*/.claude-plugin*' -prune -o and do the same for .work and
__pycache__ patterns), ensuring the final expression selects directories after
the prunes so nested files under those trees are excluded.

---

Duplicate comments:
In @.skillsaw-owners-rule.py:
- Around line 64-71: The current check only verifies that
sub_owners.is_symlink() is true; update the logic in the block that builds
violations for sub_owners to also validate the symlink target points to the
plugin root OWNERS file (the expected target is node.path / "OWNERS" for the
given plugin). After detecting a symlink, read its target (using Path.readlink
or resolve via Path.resolve(strict=False)/os.path.realpath) and normalize both
target and expected paths (absolute/real) before comparing; if they differ,
append a violation via self.violation (same message context) indicating the
OWNERS symlink does not point to the plugin root OWNERS. Ensure the check
handles relative symlink targets correctly by comparing resolved paths rather
than raw strings.

In @.skillsaw/plugindocs_rule.py:
- Around line 53-60: The check leaves docs/index.html modified on non-success
paths; update the function in .skillsaw/plugindocs_rule.py to capture the
original contents of index_path (docs/index.html) before running skillsaw (e.g.,
read into a variable) and ensure you restore that content on all
failure/timeout/exception paths (use a try/finally or explicit restore in the
error branches that handle result.returncode != 0 and the other block around
lines 73-85). Reference the existing variables/functions in the file
(index_path, result, self.violation, violations) and make sure the restore
happens before returning violations so the repo is not left dirty.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a702079b-ea71-42ac-94da-038fb592dd80

📥 Commits

Reviewing files that changed from the base of the PR and between 702178f and 6212aaa.

📒 Files selected for processing (256)
  • .cursor/OWNERS
  • .github/OWNERS
  • .github/workflows/OWNERS
  • .github/workflows/update-docs.yml
  • .github/workflows/validate-plugin-version.yml
  • .skillsaw-owners-rule.py
  • .skillsaw-promptfoo-budget-rule.py
  • .skillsaw-protected-dirs-rule.py
  • .skillsaw.yaml
  • .skillsaw/plugindocs_rule.py
  • CONTRIBUTING.md
  • Makefile
  • OWNERS
  • OWNERS_ALIASES
  • PLUGINS.md
  • README.md
  • agents/feedback.md
  • commands/hello-world/echo.toml
  • docs/README.md
  • docs/data.json
  • docs/index.html
  • evals/OWNERS
  • images/OWNERS
  • plugins/agendas/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/ai-sbom/scripts/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ai-sbom/skills/generate/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/bigquery/commands/OWNERS
  • plugins/bigquery/skills/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/ci/OWNERS
  • plugins/ci/agents/OWNERS
  • plugins/ci/commands/OWNERS
  • plugins/ci/docs/OWNERS
  • plugins/ci/scripts/OWNERS
  • plugins/ci/skills/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/ci/skills/analyze-disruption/OWNERS
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
  • plugins/ci/skills/fetch-payloads/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/ci/skills/fetch-regression-details/OWNERS
  • plugins/ci/skills/fetch-related-triages/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/ci/skills/fetch-test-report/OWNERS
  • plugins/ci/skills/fetch-test-runs/OWNERS
  • plugins/ci/skills/oc-auth/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • plugins/ci/skills/payload-experimental-reverts/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/ci/skills/prow-job-analyze-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-resource/OWNERS
  • plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
  • plugins/ci/skills/prow-job-artifact-search/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/ci/skills/set-release-blocker/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/ci/skills/triage-regression/OWNERS
  • plugins/ci/skills/trigger-payload-job/OWNERS
  • plugins/code-review/OWNERS
  • plugins/code-review/commands/OWNERS
  • plugins/code-review/evals/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/code-review/skills/lang-go/OWNERS
  • plugins/code-review/skills/profile-hypershift/OWNERS
  • plugins/compliance/OWNERS
  • plugins/compliance/commands/OWNERS
  • plugins/compliance/skills/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/compliance/skills/remediation-planning/OWNERS
  • plugins/console/OWNERS
  • plugins/console/skills/OWNERS
  • plugins/console/skills/upgrade-sdk/OWNERS
  • plugins/container-image/OWNERS
  • plugins/container-image/commands/OWNERS
  • plugins/doc/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/etcd/OWNERS
  • plugins/etcd/commands/OWNERS
  • plugins/git/OWNERS
  • plugins/git/commands/OWNERS
  • plugins/git/skills/OWNERS
  • plugins/git/skills/suggest-reviewers/OWNERS
  • plugins/golang/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/golang/hooks/scripts/OWNERS
  • plugins/golang/skills/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • plugins/golang/skills/lint-fix/OWNERS
  • plugins/golang/skills/lint/OWNERS
  • plugins/gwapi/OWNERS
  • plugins/gwapi/commands/OWNERS
  • plugins/gwapi/resources/OWNERS
  • plugins/hcp/OWNERS
  • plugins/hcp/commands/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/hcp/skills/hcp-create-azure/OWNERS
  • plugins/hcp/skills/hcp-create-kubevirt/OWNERS
  • plugins/hcp/skills/hcp-create-openstack/OWNERS
  • plugins/hcp/skills/hcp-create-powervs/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/hello-world/commands/OWNERS
  • plugins/hello-world/evals/OWNERS
  • plugins/jira/OWNERS
  • plugins/jira/commands/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/jira/evals/fixtures/OWNERS
  • plugins/jira/reference/OWNERS
  • plugins/jira/skills/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/jira/skills/create-bug/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/jira/skills/create-release-note/OWNERS
  • plugins/jira/skills/create-story/OWNERS
  • plugins/jira/skills/create-task/OWNERS
  • plugins/jira/skills/extract-prs/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • plugins/jira/skills/hypershift/OWNERS
  • plugins/jira/skills/jira-doc-generator/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • plugins/jira/skills/ready-to-solve/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • plugins/lvms/OWNERS
  • plugins/lvms/commands/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/lvms/skills/lvms-analyzer/OWNERS
  • plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/marketplace-ops/commands/OWNERS
  • plugins/marketplace-ops/scripts/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/must-gather/commands/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/native-notifications/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/node-tuning/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/node/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/olm-team/scripts/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/olm/OWNERS
  • plugins/olm/commands/OWNERS
  • plugins/openshift-tls-profile/OWNERS
  • plugins/openshift-tls-profile/commands/OWNERS
  • plugins/openshift-tls-profile/skills/OWNERS
  • plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
  • plugins/openshift/OWNERS
  • plugins/openshift/commands/OWNERS
  • plugins/openshift/skills/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
  • plugins/openshift/skills/openshift-node-kernel/OWNERS
  • plugins/origin/OWNERS
  • plugins/origin/commands/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/ote-migration/commands/OWNERS
  • plugins/ote-migration/skills/OWNERS
  • plugins/ote-migration/skills/ote-migration-workflow/OWNERS
  • plugins/rds-analyzer/OWNERS
  • plugins/rds-analyzer/commands/OWNERS
  • plugins/rds-analyzer/scripts/OWNERS
  • plugins/rds-analyzer/skills/OWNERS
  • plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
  • plugins/session/OWNERS
  • plugins/session/commands/OWNERS
  • plugins/snowflake/OWNERS
  • plugins/snowflake/commands/OWNERS
  • plugins/snowflake/scripts/OWNERS
  • plugins/snowflake/skills/OWNERS
  • plugins/snowflake/skills/setup-snowflake/OWNERS
  • plugins/sosreport/OWNERS
  • plugins/sosreport/commands/OWNERS
  • plugins/sosreport/skills/OWNERS
  • plugins/sosreport/skills/logs-analysis/OWNERS
  • plugins/sosreport/skills/network-analysis/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
  • plugins/sosreport/skills/resource-analysis/OWNERS
  • plugins/sosreport/skills/system-config-analysis/OWNERS
  • plugins/teams/OWNERS
  • plugins/teams/commands/OWNERS
  • plugins/teams/skills/OWNERS
  • plugins/teams/skills/analyze-regressions/OWNERS
  • plugins/teams/skills/coderabbit-adoption/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
  • plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
  • plugins/teams/skills/get-release-dates/OWNERS
  • plugins/teams/skills/list-components/OWNERS
  • plugins/teams/skills/list-jiras/OWNERS
  • plugins/teams/skills/list-regressions/OWNERS
  • plugins/teams/skills/list-teams/OWNERS
  • plugins/teams/skills/summarize-jiras/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/test-coverage/commands/OWNERS
  • plugins/test-coverage/skills/OWNERS
  • plugins/test-coverage/skills/analyze/OWNERS
  • plugins/test-coverage/skills/gaps/OWNERS
  • plugins/testing/OWNERS
  • plugins/testing/commands/OWNERS
  • plugins/testing/skills/OWNERS
  • plugins/testing/skills/mutation-generator/OWNERS
  • plugins/testing/skills/mutation-tester/OWNERS
  • plugins/utils/OWNERS
  • plugins/utils/commands/OWNERS
  • plugins/utils/scripts/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/workspaces/commands/OWNERS
  • plugins/workspaces/commands/create/OWNERS
  • plugins/workspaces/commands/delete/OWNERS
  • plugins/yaml/OWNERS
  • plugins/yaml/commands/OWNERS
  • scripts/OWNERS
  • scripts/build-website.py
  • scripts/generate_plugin_docs.py
  • tests/conftest.py
  • tests/test_owners_rule.py
  • tests/test_protected_dirs_rule.py
💤 Files with no reviewable changes (7)
  • commands/hello-world/echo.toml
  • docs/README.md
  • agents/feedback.md
  • scripts/build-website.py
  • docs/data.json
  • .github/workflows/update-docs.yml
  • scripts/generate_plugin_docs.py
✅ Files skipped from review due to trivial changes (196)
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/ai-sbom/skills/generate/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/ci/OWNERS
  • plugins/rds-analyzer/skills/OWNERS
  • plugins/openshift-tls-profile/skills/OWNERS
  • plugins/jira/evals/fixtures/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/console/skills/upgrade-sdk/OWNERS
  • plugins/hcp/skills/hcp-create-openstack/OWNERS
  • plugins/git/skills/OWNERS
  • plugins/golang/skills/lint/OWNERS
  • plugins/lvms/skills/lvms-analyzer/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/golang/skills/lint-fix/OWNERS
  • plugins/hello-world/evals/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/git/commands/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/jira/skills/OWNERS
  • plugins/jira/skills/create-bug/OWNERS
  • plugins/session/commands/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/compliance/skills/OWNERS
  • plugins/rds-analyzer/scripts/OWNERS
  • plugins/ci/skills/set-release-blocker/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/workspaces/commands/delete/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/sosreport/commands/OWNERS
  • plugins/test-coverage/skills/gaps/OWNERS
  • plugins/ci/skills/fetch-test-report/OWNERS
  • plugins/sosreport/skills/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/golang/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/openshift-tls-profile/skills/openshift-tls-profile/OWNERS
  • plugins/jira/skills/create-task/OWNERS
  • plugins/sosreport/skills/resource-analysis/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/teams/skills/coderabbit-rules-from-pr-reviews/OWNERS
  • plugins/utils/commands/OWNERS
  • plugins/ci/skills/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • plugins/compliance/OWNERS
  • plugins/jira/skills/create-release-note/OWNERS
  • plugins/snowflake/scripts/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/utils/scripts/OWNERS
  • plugins/teams/skills/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/yaml/commands/OWNERS
  • plugins/snowflake/commands/OWNERS
  • plugins/openshift/skills/generating-ovn-topology/scripts/OWNERS
  • plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/code-review/skills/lang-go/OWNERS
  • plugins/jira/skills/hypershift/OWNERS
  • plugins/code-review/evals/OWNERS
  • plugins/jira/skills/extract-prs/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • plugins/test-coverage/commands/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/ci/skills/fetch-regression-details/OWNERS
  • plugins/marketplace-ops/scripts/OWNERS
  • plugins/hcp/skills/hcp-create-powervs/OWNERS
  • plugins/test-coverage/skills/OWNERS
  • plugins/ci/skills/prow-job-artifact-search/OWNERS
  • plugins/olm-team/scripts/OWNERS
  • plugins/testing/commands/OWNERS
  • plugins/openshift-tls-profile/commands/OWNERS
  • plugins/marketplace-ops/commands/OWNERS
  • plugins/node/OWNERS
  • plugins/console/skills/OWNERS
  • plugins/ci/docs/OWNERS
  • plugins/ote-migration/skills/ote-migration-workflow/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/bigquery/commands/OWNERS
  • plugins/testing/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/ci/skills/fetch-payloads/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/hcp/skills/hcp-create-kubevirt/OWNERS
  • plugins/ci/skills/payload-experimental-reverts/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/workspaces/commands/OWNERS
  • plugins/ote-migration/skills/OWNERS
  • plugins/doc/OWNERS
  • plugins/teams/skills/list-teams/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • OWNERS_ALIASES
  • plugins/olm/commands/OWNERS
  • plugins/jira/reference/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/OWNERS
  • .github/OWNERS
  • plugins/ci/agents/OWNERS
  • plugins/ci/skills/fetch-test-runs/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/rds-analyzer/skills/rds-analyzer-workflow/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • plugins/code-review/OWNERS
  • plugins/container-image/commands/OWNERS
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/teams/skills/summarize-jiras/OWNERS
  • plugins/session/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/teams/skills/coderabbit-adoption/OWNERS
  • plugins/marketplace-ops/OWNERS
  • scripts/OWNERS
  • plugins/openshift/skills/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-open-pr/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
  • plugins/jira/OWNERS
  • plugins/snowflake/skills/setup-snowflake/OWNERS
  • plugins/testing/skills/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-search/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/rds-analyzer/commands/OWNERS
  • plugins/teams/skills/list-regressions/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • images/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/workspaces/commands/create/OWNERS
  • plugins/ci/skills/analyze-disruption/OWNERS
  • plugins/git/OWNERS
  • plugins/etcd/commands/OWNERS
  • plugins/container-image/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/openshift/OWNERS
  • plugins/jira/skills/ready-to-solve/OWNERS
  • plugins/snowflake/skills/OWNERS
  • plugins/ote-migration/commands/OWNERS
  • plugins/compliance/commands/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-check/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
  • plugins/teams/skills/get-release-dates/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/gwapi/commands/OWNERS
  • plugins/teams/OWNERS
  • plugins/teams/skills/list-jiras/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/teams/skills/analyze-regressions/OWNERS
  • plugins/golang/hooks/scripts/OWNERS
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/compliance/skills/remediation-planning/OWNERS
  • plugins/teams/skills/coderabbit-inheritance-scanner-existing-pr/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/openshift/skills/openshift-node-kernel/OWNERS
  • plugins/jira/skills/create-story/OWNERS
  • plugins/git/skills/suggest-reviewers/OWNERS
  • plugins/testing/skills/mutation-generator/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/ci/commands/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ci/skills/oc-auth/OWNERS
  • plugins/teams/commands/OWNERS
  • plugins/ci/skills/prow-job-analyze-resource/OWNERS
  • plugins/code-review/commands/OWNERS
  • README.md
  • plugins/testing/skills/mutation-tester/OWNERS
  • .cursor/OWNERS
  • PLUGINS.md
  • plugins/openshift-tls-profile/OWNERS
  • plugins/sosreport/skills/ovs-db-analysis/scripts/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/agendas/OWNERS
  • CONTRIBUTING.md
  • plugins/jira/commands/OWNERS

Comment thread .skillsaw-owners-rule.py Outdated
Comment thread .skillsaw/protected_dirs_rule.py Outdated
Comment thread Makefile Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/lint-review.yml (1)

17-22: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add contents: read when using a scoped permissions block.

actions/checkout needs repository read access. When a job-level permissions block is present, any omitted scopes default to none, making contents inaccessible unless explicitly granted.

Proposed fix
     permissions:
+      contents: read
       pull-requests: write
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/lint-review.yml around lines 17 - 22, The workflow's
job-level permissions block currently only sets pull-requests: write, which
revokes default repository read access and breaks actions/checkout; update the
permissions block to explicitly include contents: read alongside pull-requests:
write so actions/checkout (uses:
actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd) can access the
repository; ensure the permissions stanza contains both "contents: read" and
"pull-requests: write".
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.skillsaw/plugindocs_rule.py:
- Around line 39-40: The current check that returns early when
index_path.exists() is false should instead record a violation so missing docs
fail lint: replace the early return with logic that appends a descriptive
violation to the violations list (mentioning missing docs/index.html) and then
return the violations; update the function that contains index_path and
violations (the plugindocs rule function in .skillsaw/plugindocs_rule.py) so
callers still get the violations list rather than silently passing.

In `@plugins/olm/OWNERS`:
- Around line 1-6: Update the OWNERS entries to reflect git history: remove the
user "chiragkyal" from both the approvers and reviewers lists and add
"stephen@redhat.com" in their place so the approvers list contains
"ai-helpers-admins" and "stephen@redhat.com" and the reviewers list contains
"ai-helpers-admins" and "stephen@redhat.com"; ensure there are no duplicates and
formatting remains valid YAML.

---

Outside diff comments:
In @.github/workflows/lint-review.yml:
- Around line 17-22: The workflow's job-level permissions block currently only
sets pull-requests: write, which revokes default repository read access and
breaks actions/checkout; update the permissions block to explicitly include
contents: read alongside pull-requests: write so actions/checkout (uses:
actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd) can access the
repository; ensure the permissions stanza contains both "contents: read" and
"pull-requests: write".
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: af896572-c8da-4690-8432-0e9bb8712e35

📥 Commits

Reviewing files that changed from the base of the PR and between 6212aaa and d7a952f.

📒 Files selected for processing (179)
  • .cursor/OWNERS
  • .github/OWNERS
  • .github/workflows/OWNERS
  • .github/workflows/lint-review.yml
  • .github/workflows/update-docs.yml
  • .github/workflows/validate-plugin-version.yml
  • .skillsaw-owners-rule.py
  • .skillsaw-promptfoo-budget-rule.py
  • .skillsaw-protected-dirs-rule.py
  • .skillsaw.yaml
  • .skillsaw/plugindocs_rule.py
  • CONTRIBUTING.md
  • Makefile
  • OWNERS
  • OWNERS_ALIASES
  • PLUGINS.md
  • README.md
  • agents/feedback.md
  • commands/hello-world/echo.toml
  • docs/README.md
  • docs/data.json
  • docs/index.html
  • evals/OWNERS
  • images/OWNERS
  • plugins/agendas/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/ai-sbom/scripts/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ai-sbom/skills/generate-sbom/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/bigquery/commands/OWNERS
  • plugins/bigquery/skills/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/ci/OWNERS
  • plugins/ci/agents/OWNERS
  • plugins/ci/commands/OWNERS
  • plugins/ci/docs/OWNERS
  • plugins/ci/scripts/OWNERS
  • plugins/ci/skills/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/ci/skills/analyze-disruption/OWNERS
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
  • plugins/ci/skills/fetch-payloads/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/ci/skills/fetch-regression-details/OWNERS
  • plugins/ci/skills/fetch-related-triages/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/ci/skills/fetch-test-report/OWNERS
  • plugins/ci/skills/fetch-test-runs/OWNERS
  • plugins/ci/skills/oc-auth/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • plugins/ci/skills/payload-experimental-reverts/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/ci/skills/prow-job-analyze-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-metal-install-failure/OWNERS
  • plugins/ci/skills/prow-job-analyze-resource/OWNERS
  • plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
  • plugins/ci/skills/prow-job-artifact-search/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/ci/skills/set-release-blocker/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/ci/skills/triage-regression/OWNERS
  • plugins/ci/skills/trigger-payload-job/OWNERS
  • plugins/code-review/OWNERS
  • plugins/code-review/commands/OWNERS
  • plugins/code-review/evals/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/code-review/skills/go-code-review/OWNERS
  • plugins/code-review/skills/hypershift-code-review/OWNERS
  • plugins/compliance/OWNERS
  • plugins/compliance/commands/OWNERS
  • plugins/compliance/skills/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/compliance/skills/remediation-planning/OWNERS
  • plugins/console/OWNERS
  • plugins/console/skills/OWNERS
  • plugins/console/skills/upgrade-console-sdk/OWNERS
  • plugins/container-image/OWNERS
  • plugins/container-image/commands/OWNERS
  • plugins/doc/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/etcd/OWNERS
  • plugins/etcd/commands/OWNERS
  • plugins/git/OWNERS
  • plugins/git/commands/OWNERS
  • plugins/git/skills/OWNERS
  • plugins/git/skills/suggest-reviewers/OWNERS
  • plugins/golang/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/golang/hooks/scripts/OWNERS
  • plugins/golang/skills/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • plugins/golang/skills/go-lint-fix/OWNERS
  • plugins/golang/skills/go-lint/OWNERS
  • plugins/gwapi/OWNERS
  • plugins/gwapi/commands/OWNERS
  • plugins/gwapi/resources/OWNERS
  • plugins/hcp/OWNERS
  • plugins/hcp/commands/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/hcp/skills/hcp-create-azure/OWNERS
  • plugins/hcp/skills/hcp-create-kubevirt/OWNERS
  • plugins/hcp/skills/hcp-create-openstack/OWNERS
  • plugins/hcp/skills/hcp-create-powervs/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/hello-world/commands/OWNERS
  • plugins/hello-world/evals/OWNERS
  • plugins/jira/OWNERS
  • plugins/jira/commands/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/jira/evals/fixtures/OWNERS
  • plugins/jira/reference/OWNERS
  • plugins/jira/skills/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/jira/skills/create-bug/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/jira/skills/create-release-note/OWNERS
  • plugins/jira/skills/create-story/OWNERS
  • plugins/jira/skills/create-task/OWNERS
  • plugins/jira/skills/extract-prs/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • plugins/jira/skills/hypershift/OWNERS
  • plugins/jira/skills/jira-doc-generator/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • plugins/jira/skills/ready-to-solve/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • plugins/lvms/OWNERS
  • plugins/lvms/commands/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/lvms/skills/lvms-analyzer/OWNERS
  • plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/marketplace-ops/commands/OWNERS
  • plugins/marketplace-ops/scripts/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/must-gather/commands/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/native-notifications/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/node-tuning/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/node/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/olm-team/scripts/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/olm/OWNERS
  • plugins/olm/commands/OWNERS
💤 Files with no reviewable changes (5)
  • commands/hello-world/echo.toml
  • docs/data.json
  • agents/feedback.md
  • docs/README.md
  • .github/workflows/update-docs.yml
✅ Files skipped from review due to trivial changes (131)
  • plugins/compliance/skills/OWNERS
  • plugins/container-image/commands/OWNERS
  • plugins/code-review/skills/classify-review-comment/OWNERS
  • plugins/ci/skills/fetch-test-report/OWNERS
  • plugins/ci/skills/fetch-prowjob-json/OWNERS
  • plugins/ai-sbom/skills/generate-sbom/OWNERS
  • plugins/code-review/skills/go-code-review/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/OWNERS
  • plugins/compliance/OWNERS
  • plugins/jira/skills/ocpbugs/OWNERS
  • .github/OWNERS
  • plugins/jira/skills/create-epic/OWNERS
  • plugins/compliance/skills/codebase-impact-analysis/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/jira/skills/cntrlplane/OWNERS
  • plugins/lvms/skills/lvms-analyzer/scripts/OWNERS
  • plugins/ai-sbom/docs/OWNERS
  • plugins/container-image/OWNERS
  • plugins/ci/skills/fetch-jira-issue/OWNERS
  • plugins/jira/skills/jira-doc-generator/OWNERS
  • plugins/ai-sbom/skills/OWNERS
  • plugins/ai-sbom/scripts/OWNERS
  • plugins/hcp/commands/OWNERS
  • plugins/ci/skills/payload-autodl-json/OWNERS
  • plugins/jira/skills/create-story/OWNERS
  • plugins/olm-team/skills/k8s-ocp-olm-expert/OWNERS
  • plugins/agendas/commands/OWNERS
  • plugins/golang/skills/fix-cve/OWNERS
  • images/OWNERS
  • plugins/jira/skills/catch-me-up/scripts/OWNERS
  • plugins/jira/commands/OWNERS
  • plugins/ci/skills/analyze-payload/OWNERS
  • plugins/bigquery/skills/OWNERS
  • plugins/ci/docs/OWNERS
  • plugins/native-notifications/hooks/OWNERS
  • plugins/must-gather/skills/OWNERS
  • plugins/ai-operator-dashboard-generator/skills/dashboard-templates/OWNERS
  • plugins/hcp/skills/hcp-create-openstack/OWNERS
  • plugins/jira/OWNERS
  • plugins/ci/skills/fetch-job-run-summary/OWNERS
  • plugins/bigquery/skills/ci-data-analyst/OWNERS
  • plugins/ci/skills/fetch-releases/OWNERS
  • plugins/ci/skills/prow-job-extract-must-gather/OWNERS
  • plugins/jira/skills/create-feature-request/OWNERS
  • plugins/ci/skills/stage-payload-reverts/OWNERS
  • plugins/ci/skills/prow-job-analyze-resource/OWNERS
  • plugins/git/commands/OWNERS
  • plugins/jira/skills/status-analysis/OWNERS
  • plugins/hcp/skills/OWNERS
  • plugins/must-gather/commands/OWNERS
  • plugins/olm-team/commands/OWNERS
  • plugins/golang/skills/go-lint/OWNERS
  • plugins/ci/skills/prow-job-artifact-search/OWNERS
  • plugins/jira/skills/create-feature/OWNERS
  • plugins/lvms/skills/OWNERS
  • plugins/jira/skills/jira-validate-blockers/OWNERS
  • plugins/ci/skills/fetch-test-runs/OWNERS
  • plugins/node-tuning/commands/OWNERS
  • plugins/ci/skills/revert-pr/OWNERS
  • plugins/ci/skills/add-jira-triage-link/OWNERS
  • plugins/ci/commands/OWNERS
  • plugins/jira/reference/OWNERS
  • plugins/jira/skills/status-analysis/scripts/OWNERS
  • plugins/jira/skills/extract-prs/OWNERS
  • plugins/jira/evals/OWNERS
  • plugins/hcp/skills/hcp-create-aws/OWNERS
  • plugins/hcp/skills/hcp-create-powervs/OWNERS
  • plugins/code-review/skills/hypershift-code-review/OWNERS
  • PLUGINS.md
  • plugins/jira/skills/create-bug/OWNERS
  • plugins/jira/skills/jira-issues-by-component/OWNERS
  • plugins/node-tuning/skills/scripts/OWNERS
  • plugins/jira/skills/hypershift/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/bigquery/commands/OWNERS
  • plugins/console/skills/OWNERS
  • plugins/doc/commands/OWNERS
  • plugins/console/skills/upgrade-console-sdk/OWNERS
  • plugins/lvms/commands/OWNERS
  • plugins/node/OWNERS
  • plugins/compliance/skills/cve-intelligence-gathering/OWNERS
  • plugins/ai-operator-dashboard-generator/commands/OWNERS
  • plugins/jira/skills/categorize-activity-type/OWNERS
  • plugins/git/skills/OWNERS
  • plugins/jira/skills/generate-enhancement/OWNERS
  • plugins/ci/skills/fetch-related-triages/OWNERS
  • plugins/jira/skills/catch-me-up/OWNERS
  • plugins/ci/skills/oc-auth/OWNERS
  • plugins/etcd/commands/OWNERS
  • plugins/ci/skills/fetch-new-prs-in-payload/OWNERS
  • plugins/hcp/skills/hcp-create-kubevirt/OWNERS
  • plugins/node-tuning/skills/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/scripts/OWNERS
  • plugins/ci/skills/triage-regression/OWNERS
  • plugins/jira/skills/create-task/OWNERS
  • plugins/agendas/OWNERS
  • plugins/hello-world/evals/OWNERS
  • plugins/jira/skills/gcp-hcp/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/code-review/commands/OWNERS
  • plugins/etcd/OWNERS
  • plugins/gwapi/commands/OWNERS
  • .cursor/OWNERS
  • plugins/ci/skills/payload-results-yaml/OWNERS
  • plugins/golang/hooks/OWNERS
  • plugins/node/commands/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/code-review/skills/OWNERS
  • plugins/olm/commands/OWNERS
  • plugins/ci/skills/trigger-payload-job/OWNERS
  • plugins/hcp/skills/hcp-create-agent/OWNERS
  • plugins/jira/skills/ready-to-solve/OWNERS
  • plugins/golang/skills/OWNERS
  • plugins/git/skills/suggest-reviewers/OWNERS
  • plugins/olm-team/skills/OWNERS
  • plugins/doc/OWNERS
  • plugins/bigquery/skills/analyze-usage/OWNERS
  • plugins/ci/skills/prow-job-analyze-test-failure/OWNERS
  • plugins/golang/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/jira/skills/OWNERS
  • plugins/compliance/skills/call-graph-analysis/OWNERS
  • plugins/must-gather/skills/must-gather-analyzer/OWNERS
  • plugins/compliance/commands/OWNERS
  • .github/workflows/validate-plugin-version.yml
  • README.md
  • plugins/must-gather/OWNERS
  • plugins/git/OWNERS
  • CONTRIBUTING.md
  • .skillsaw-promptfoo-budget-rule.py

Comment thread .skillsaw/plugindocs_rule.py
Comment thread plugins/olm/OWNERS
@stbenjam
stbenjam force-pushed the easier branch 3 times, most recently from e94128b to 91685da Compare May 20, 2026 13:06

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.skillsaw-owners-rule.py (1)

32-44: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Enforce OWNERS as a file, not just an existing path.

Line 32 currently accepts any existing path, so an OWNERS/ directory can bypass this rule. Add a file-type check before the empty-file check.

Proposed fix
             if not owners_path.exists():
                 violations.append(
                     self.violation(
                         f"Plugin '{plugin_name}' is missing an OWNERS file",
                         file_path=node.path / ".claude-plugin" / "plugin.json",
                     )
                 )
+            elif not owners_path.is_file():
+                violations.append(
+                    self.violation(
+                        f"Plugin '{plugin_name}' has an OWNERS path that is not a file",
+                        file_path=owners_path,
+                    )
+                )
             elif owners_path.stat().st_size == 0:
                 violations.append(
                     self.violation(
                         f"Plugin '{plugin_name}' has an empty OWNERS file",
                         file_path=owners_path,
                     )
                 )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw-owners-rule.py around lines 32 - 44, The current check only
verifies owners_path.exists(), letting an OWNERS/ directory pass; update the
logic to require a regular file by using owners_path.is_file(): replace the
initial if with a single condition like "if not owners_path.exists() or not
owners_path.is_file()" to append the missing OWNERS violation (using plugin_name
and file_path as before), and keep the subsequent "elif
owners_path.stat().st_size == 0" branch to detect empty files; reference
owners_path, violations.append, and self.violation to locate and modify the
code.
♻️ Duplicate comments (2)
.skillsaw-protected-dirs-rule.py (1)

63-67: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Exclude entire ignored trees, not just directories with matching leaf names.

Line 66 checks only subdir.name, so descendants inside .work/__pycache__ can still be linted via rglob("*").

Proposed fix
             for subdir in protected_path.rglob("*"):
                 if not subdir.is_dir():
                     continue
-                if subdir.name in ("__pycache__", ".work"):
+                rel_parts = subdir.relative_to(protected_path).parts
+                if any(part in ("__pycache__", ".work") for part in rel_parts):
                     continue
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw-protected-dirs-rule.py around lines 63 - 67, The loop currently
only checks subdir.name so descendants under ignored directories still get
processed; change the check to skip any path that has an ignored ancestor by
testing the path parts (e.g., use protected_path.rglob("*") and skip when
any(part in ("__pycache__",".work") for part in subdir.parts)) or otherwise use
a Path.match like subdir.match("**/.work") / "**/__pycache__" to exclude the
entire ignored tree; update the condition around subdir.is_dir() and the name
check to perform this ancestor-aware test so all descendants of .work and
__pycache__ are excluded.
.skillsaw/plugindocs_rule.py (1)

39-40: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Do not silently pass when docs/index.html is missing.

The rule returns early without a violation when docs/index.html doesn't exist, allowing repositories with missing documentation to pass lint checks. This defeats the purpose of the rule.

💡 Proposed fix
 if not index_path.exists():
+    violations.append(
+        self.violation(
+            "docs/index.html is missing. Run 'skillsaw docs -o docs/' to generate docs.",
+            file_path=docs_path,
+        )
+    )
     return violations
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.skillsaw/plugindocs_rule.py around lines 39 - 40, The rule currently
returns early when index_path (docs/index.html) doesn't exist, which hides
missing-docs problems; instead, update the check around index_path.exists() to
add a violation to the violations collection (e.g., violations.append(...) or
violations.add(...)) describing that docs/index.html is missing (include context
like index_path and a clear message), and only return after recording that
violation so repos with no docs fail the lint rule; keep the rest of the
function logic the same and reference index_path and the violations variable
when making the change.
🧹 Nitpick comments (1)
Makefile (1)

43-43: ⚖️ Poor tradeoff

Python 3 dependency for symlink path calculation.

The relative path calculation requires Python 3 at build time. While reasonable for most environments, consider if a pure shell alternative (or a build-time check) would improve portability.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Makefile` at line 43, The Makefile currently computes rel with rel=$$(python3
-c "import os.path; print(os.path.relpath('$${root_dir}OWNERS', '$$dir'))")
which forces a Python 3 dependency; either replace this with a pure-shell
fallback or add a build-time check and clear error/fallback when python3 is
missing. Implement one of two fixes: (a) add a small preflight step that checks
command -v python3 (or python) and fails fast with a helpful message if not
found before using rel, or (b) replace the python3 invocation with a shell-only
computation using dirname/realpath/awk/sed logic to compute the relative path
and assign it to rel; update usages of rel accordingly (the rel assignment and
any rule that relies on rel) so the Makefile works without requiring python3.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.skillsaw-protected-dirs-rule.py:
- Around line 53-70: The check for OWNERS currently only uses Path.exists(),
which treats directories named "OWNERS" as valid; update the validation in the
loop that handles protected_path (references owners_path and sub_owners) to
ensure the OWNERS entry is an actual file by using an is_file() check (or
equivalent) instead of exists() for both the top-level owners_path and each
sub_owners, and treat non-file OWNERS (missing or not a file) as a violation so
the logic that appends self.violation and continues behaves correctly.

In `@tests/test_protected_dirs_rule.py`:
- Around line 70-78: The test test_violation_when_root_owners_missing is too
loose because it only checks for "missing an OWNERS file" and could match a
violation for .github/workflows; update the assertion to verify the violation
targets the root directory explicitly by inspecting the violation's path or
message for the root ".github" (e.g., assert violations[0].path == str(temp_dir
/ ".github") or assert ".github\" in violations[0].message and not "workflows"),
keeping the rest of the test (RepositoryContext, protected_dirs_rule,
rule.check) unchanged.

---

Outside diff comments:
In @.skillsaw-owners-rule.py:
- Around line 32-44: The current check only verifies owners_path.exists(),
letting an OWNERS/ directory pass; update the logic to require a regular file by
using owners_path.is_file(): replace the initial if with a single condition like
"if not owners_path.exists() or not owners_path.is_file()" to append the missing
OWNERS violation (using plugin_name and file_path as before), and keep the
subsequent "elif owners_path.stat().st_size == 0" branch to detect empty files;
reference owners_path, violations.append, and self.violation to locate and
modify the code.

---

Duplicate comments:
In @.skillsaw-protected-dirs-rule.py:
- Around line 63-67: The loop currently only checks subdir.name so descendants
under ignored directories still get processed; change the check to skip any path
that has an ignored ancestor by testing the path parts (e.g., use
protected_path.rglob("*") and skip when any(part in ("__pycache__",".work") for
part in subdir.parts)) or otherwise use a Path.match like
subdir.match("**/.work") / "**/__pycache__" to exclude the entire ignored tree;
update the condition around subdir.is_dir() and the name check to perform this
ancestor-aware test so all descendants of .work and __pycache__ are excluded.

In @.skillsaw/plugindocs_rule.py:
- Around line 39-40: The rule currently returns early when index_path
(docs/index.html) doesn't exist, which hides missing-docs problems; instead,
update the check around index_path.exists() to add a violation to the violations
collection (e.g., violations.append(...) or violations.add(...)) describing that
docs/index.html is missing (include context like index_path and a clear
message), and only return after recording that violation so repos with no docs
fail the lint rule; keep the rest of the function logic the same and reference
index_path and the violations variable when making the change.

---

Nitpick comments:
In `@Makefile`:
- Line 43: The Makefile currently computes rel with rel=$$(python3 -c "import
os.path; print(os.path.relpath('$${root_dir}OWNERS', '$$dir'))") which forces a
Python 3 dependency; either replace this with a pure-shell fallback or add a
build-time check and clear error/fallback when python3 is missing. Implement one
of two fixes: (a) add a small preflight step that checks command -v python3 (or
python) and fails fast with a helpful message if not found before using rel, or
(b) replace the python3 invocation with a shell-only computation using
dirname/realpath/awk/sed logic to compute the relative path and assign it to
rel; update usages of rel accordingly (the rel assignment and any rule that
relies on rel) so the Makefile works without requiring python3.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: eca6b730-52ae-42a3-b244-9ef35d8f1ed1

📥 Commits

Reviewing files that changed from the base of the PR and between d7a952f and 2ff4f56.

📒 Files selected for processing (70)
  • .cursor/OWNERS
  • .github/OWNERS
  • .github/workflows/OWNERS
  • .github/workflows/lint-review.yml
  • .github/workflows/update-docs.yml
  • .github/workflows/validate-plugin-version.yml
  • .skillsaw-owners-rule.py
  • .skillsaw-promptfoo-budget-rule.py
  • .skillsaw-protected-dirs-rule.py
  • .skillsaw.yaml
  • .skillsaw/plugindocs_rule.py
  • CONTRIBUTING.md
  • Makefile
  • OWNERS
  • OWNERS_ALIASES
  • PLUGINS.md
  • README.md
  • agents/feedback.md
  • commands/hello-world/echo.toml
  • docs/README.md
  • docs/data.json
  • docs/index.html
  • evals/OWNERS
  • images/OWNERS
  • plugins/agendas/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/ci/OWNERS
  • plugins/code-review/OWNERS
  • plugins/compliance/OWNERS
  • plugins/console/OWNERS
  • plugins/container-image/OWNERS
  • plugins/doc/OWNERS
  • plugins/etcd/OWNERS
  • plugins/git/OWNERS
  • plugins/golang/OWNERS
  • plugins/gwapi/OWNERS
  • plugins/hcp/OWNERS
  • plugins/hello-world/OWNERS
  • plugins/jira/OWNERS
  • plugins/lvms/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/must-gather/OWNERS
  • plugins/native-notifications/OWNERS
  • plugins/node-tuning/OWNERS
  • plugins/node/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/olm/OWNERS
  • plugins/openshift-tls-profile/OWNERS
  • plugins/openshift/OWNERS
  • plugins/origin/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/rds-analyzer/OWNERS
  • plugins/session/OWNERS
  • plugins/snowflake/OWNERS
  • plugins/sosreport/OWNERS
  • plugins/teams/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/testing/OWNERS
  • plugins/utils/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/yaml/OWNERS
  • scripts/OWNERS
  • scripts/build-website.py
  • scripts/generate_plugin_docs.py
  • tests/OWNERS
  • tests/conftest.py
  • tests/test_owners_rule.py
  • tests/test_protected_dirs_rule.py
💤 Files with no reviewable changes (7)
  • agents/feedback.md
  • docs/README.md
  • .github/workflows/update-docs.yml
  • docs/data.json
  • commands/hello-world/echo.toml
  • scripts/generate_plugin_docs.py
  • scripts/build-website.py
✅ Files skipped from review due to trivial changes (40)
  • plugins/teams/OWNERS
  • plugins/session/OWNERS
  • plugins/console/OWNERS
  • tests/OWNERS
  • plugins/test-coverage/OWNERS
  • plugins/ai-operator-dashboard-generator/OWNERS
  • plugins/ote-migration/OWNERS
  • plugins/code-review/OWNERS
  • plugins/olm-team/OWNERS
  • plugins/ai-sbom/OWNERS
  • plugins/openshift/OWNERS
  • plugins/jira/OWNERS
  • plugins/compliance/OWNERS
  • plugins/sosreport/OWNERS
  • .github/OWNERS
  • plugins/node/OWNERS
  • plugins/workspaces/OWNERS
  • plugins/openshift-tls-profile/OWNERS
  • plugins/hello-world/OWNERS
  • OWNERS_ALIASES
  • plugins/node-tuning/OWNERS
  • plugins/bigquery/OWNERS
  • plugins/rds-analyzer/OWNERS
  • .cursor/OWNERS
  • .github/workflows/OWNERS
  • PLUGINS.md
  • plugins/container-image/OWNERS
  • plugins/origin/OWNERS
  • plugins/must-gather/OWNERS
  • scripts/OWNERS
  • plugins/git/OWNERS
  • CONTRIBUTING.md
  • plugins/golang/OWNERS
  • plugins/marketplace-ops/OWNERS
  • plugins/testing/OWNERS
  • plugins/doc/OWNERS
  • README.md
  • .skillsaw-promptfoo-budget-rule.py
  • evals/OWNERS
  • plugins/agendas/OWNERS

Comment thread .skillsaw/protected_dirs_rule.py Outdated
Comment thread tests/test_protected_dirs_rule.py Outdated
@stbenjam
stbenjam force-pushed the easier branch 3 times, most recently from 552cbdc to 2f56cc8 Compare May 20, 2026 13:49
…o skillsaw

- Add OWNERS_ALIASES with ai-helpers-admins group
- Enable auto_approve_unowned_subfolders in root OWNERS so any collaborator
  can approve new plugin PRs without needing a root approver
- Add OWNERS files to all plugin directories with per-plugin contributors
- Add OWNERS files to images/, scripts/, .github/, .cursor/, evals/
- Replace PLUGINS.md with a link to the docs site
- Switch docs generation to skillsaw docs, remove old scripts and workflow
- Add custom lint rules for OWNERS validation and promptfoo budgets
- Migrate lint workflow to skillsaw GitHub Action

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@stbenjam stbenjam changed the title Add OWNERS files and enable self-service plugin contributions HPNEX-6: Enable self-service plugin contributions May 20, 2026
@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label May 20, 2026
@openshift-ci-robot

openshift-ci-robot commented May 20, 2026

Copy link
Copy Markdown

@stbenjam: This pull request references HPNEX-6 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the sub-task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Summary

Makes it easier for anyone to contribute plugins without needing admin approval.

  • Enable auto_approve_unowned_subfolders in root OWNERS so plugin PRs can be approved by any collaborator
  • Add OWNERS files to each plugin directory with per-plugin contributors from git history
  • Add OWNERS files to protected directories (.github, evals, images, scripts, tests) so they remain admin-only
  • Add a plugin-owners-required skillsaw lint rule to enforce that every plugin has an OWNERS file
  • Replace old doc generation scripts with skillsaw docs (avoids needing to touch any files in / of the repo)
  • Add make test for lint rule unit tests and make list-unprotected to show open directories

Test plan

  • make lint passes
  • make test passes
  • Verify plugin PRs can be approved without admin

🤖 Generated with Claude Code

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@cblecker cblecker left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Overall this looks good — the OWNERS structure and auto_approve_unowned_subfolders approach makes sense for lowering the contribution barrier.

One minor inline comment on the plugindocs lint rule. Also worth noting: the new tests cover owners_rule.py well, but the refactored plugindocs_rule.py (which changed from two-script/two-file checking to single skillsaw docs invocation) doesn't have test coverage yet. Not blocking, just flagging for future consideration.

Comment thread .skillsaw/plugindocs_rule.py
Move index.html restoration to a finally block so the file is always
restored even when skillsaw docs fails, times out, or throws.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@stbenjam

Copy link
Copy Markdown
Member Author

@cblecker Good catch — moved the index.html restoration into a finally block so it's always restored regardless of whether the command fails, times out, or throws. Fixed in 3a4d6c4.

@cblecker

Copy link
Copy Markdown
Collaborator

/lgtm
/hold

Holding if there are any other reviews. Feel free to remove when ready.

@openshift-ci openshift-ci Bot added the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label May 20, 2026
@openshift-ci openshift-ci Bot added the lgtm Indicates that a PR is ready to be merged. label May 20, 2026
@openshift-ci

openshift-ci Bot commented May 20, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: cblecker, stbenjam

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@stbenjam

Copy link
Copy Markdown
Member Author

Thanks, everyone I talked to was on board and this is probably subject to merge conflicts -- we can revert if there's issues

/hold cancel

@openshift-ci openshift-ci Bot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label May 20, 2026
@openshift-merge-bot
openshift-merge-bot Bot merged commit 604d2f5 into openshift-eng:main May 20, 2026
5 checks passed
@zaneb

zaneb commented May 28, 2026

Copy link
Copy Markdown
Contributor

@stbenjam the format of index.html where basically all of the data is included in a JSON blob on a single line means that practically every PR that merges is going to conflict with practically every other PR.
Is there any way to pretty-print it? If not we might need to do something like move the HTML to a separate repo and generate it as a post-merge step.

@stbenjam

Copy link
Copy Markdown
Member Author

@zaneb That is a good point. I would like people to not have to deal with this at all, but some concerns were raised when I tried to get auto-merging PR's turned on here. I will fix the JSON thing, but it won't eliminate potential conflicts entirely.

I will fix it regardless, but #507 would be nice

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants