Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ Before making any changes:
| Command definitions | `<plugin>/commands/<name>.md` |
| Agent definitions | `<plugin>/agents/<name>/AGENT.md` |
| Hook definitions | `<plugin>/hooks/` |
| PR approval ownership | `<plugin>/OWNERS` (k8s-style) |
| PR approval ownership | `<plugin>/OWNERS` (k8s-style, references aliases from the root `OWNERS_ALIASES`; both are generated from `hyperfleet/docs/owners.yaml` in the architecture repository, so ownership changes are a PR to that file; `hyperfleet/docs/owners.md` there explains the roles and criteria) |
| Contributor guide | `CONTRIBUTING.md` |
| Skill reference data | `<plugin>/skills/<skill-name>/references/` |
| CI review container | `hyperfleet-code-review/ci/` |
Expand All @@ -35,7 +35,7 @@ Before making any changes:
| `hyperfleet-standards` | 1 | - | - | - | 1.1.0 |
| `hyperfleet-operational-readiness` | 1 | - | - | - | 0.2.0 |
| `hyperfleet-devtools` | 6 (`architecture-impact`, `e2e-test-automation`, `e2e-test-design`, `e2e-debug`, `renovate-prs`, `next-ticket`) | 1 | 1 | - | 0.8.2 |
| `hyperfleet-work-triage` | 2 (`bugs-triage`, `open-prs`) | - | - | - | 0.3.0 |
| `hyperfleet-work-triage` | 2 (`bugs-triage`, `open-prs`) | - | - | - | 0.4.0 |
| `hyperfleet-hooks` | - | - | - | 1 | 0.2.0 |
| `hyperfleet-adapter-authoring` | 1 | - | - | - | N/A |
| `hyperfleet-release` | 1 (`release-notes`) | - | - | - | 0.1.0 |
Expand Down
6 changes: 5 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,18 @@ Team members get updates by running `/plugin marketplace update hyperfleet-claud

This repository utilizes k8s-style OWNERS files. Each plugin is expected to define an OWNERS file with a list of approvers and (optionally) reviewers. PRs making changes to a plugin must be reviewed by the reviewers/approvers listed in that plugin's OWNERS file.

OWNERS files reference aliases from the root `OWNERS_ALIASES` rather than listing logins directly, and both are generated from `hyperfleet/docs/owners.yaml` in the architecture repository. To change who owns a plugin, open a PR to that file; a maintainer then runs `make owners` there and `hack/owners/open_prs.sh` opens the regenerated OWNERS PR here. The roles, the criteria and the area table are explained in `hyperfleet/docs/owners.md` next to it. Do not hand-edit OWNERS or `OWNERS_ALIASES`, as the next regeneration would overwrite the change.

Prow applies `area/*` labels from OWNERS files and requests reviewers from the area's pool, so the ownership document also decides who is asked to review.

See [k8s OWNERS documentation](https://www.kubernetes.dev/docs/guide/owners/) for more information.

### Submitting Changes

1. Follow the plugin structure outlined in "Adding a Plugin" above
2. Bump the version number according to semantic versioning
3. Submit a PR with your changes
4. Request review from reviewers/approvers listed in the OWNERS file
4. Prow requests reviewers from the plugin's OWNERS pool; if you need a specific reviewer, pick one from the aliases the OWNERS file references

## Security Guidelines

Expand Down
2 changes: 1 addition & 1 deletion hyperfleet-work-triage/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "hyperfleet-work-triage",
"version": "0.3.6",
"version": "0.4.0",
"description": "Work triage skills for HyperFleet: /bugs-triage for interactive JIRA bug and GitHub issue triage. /open-prs surfaces and prioritizes open PRs across the org using GitHub + JIRA context with multi-factor scoring and confidence levels.",
"author": {
"name": "Rafael Benevides",
Expand Down
1 change: 1 addition & 0 deletions hyperfleet-work-triage/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Work triage skills for HyperFleet: bug/issue triage and PR prioritization.
- Detects unresolved reviewer comments and author responsiveness
- Applies 8-factor weighted scoring with confidence levels
- Groups PRs into 4 tiers: Immediate Attention, Should Review Soon, This Week, Informational
- Groups the digest by `area/*` label and shows the reviewers Prow requested from the area's OWNERS pool with business days waiting; more than one business day is flagged
- Works without JIRA CLI (graceful degradation with reduced confidence)

## Prerequisites
Expand Down
13 changes: 2 additions & 11 deletions hyperfleet-work-triage/references/github-repos.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,37 +15,28 @@ Used by `/bugs-triage` (issue triage) and `/open-prs` (PR prioritization).
## Infrastructure & Deployment

- `hyperfleet-infra`
- `oci-infra`
- `hyperfleet-credential-provider`
- `hyperfleet-logger`
- `hyperfleet-release`
- `hypershift`
- `management-cluster-reconciler`

## Testing & CLI
## Testing

- `hyperfleet-e2e`
- `maestro-cli`
- `hyperfleet-scripts`

## API & Specifications

- `hyperfleet-api-spec`
- `hyperfleet-api-spec-template`

## Documentation & Tooling

- `architecture`
- `hyperfleet-claude-plugins`
- `hyperfleet-hooks`
- `rh-hooks-ai`
- `coderabbit`
- `renovate-config`
- `.github`

## Other Active Projects

- `kartograph`

## Additional PR sources

These sources are used only by `/open-prs`; they are not GitHub issue-triage
Expand Down
34 changes: 22 additions & 12 deletions hyperfleet-work-triage/skills/bugs-triage/references/owners.csv
Original file line number Diff line number Diff line change
@@ -1,13 +1,23 @@
type,name,primary_owner,secondary_owner
component,Hyperfleet API,Yanming Sun,Angel Marin
component,Broker,Angel Marin,dandan wang
component,Adapter,Xue Li,Angel Marin
component,Sentinel,Rafael Benevides,"Phuongnhat Nguyen, Yanming Sun"
component,CICD,Ying Zhang,
component,Claude Code Plugin,Rafael Benevides,Yanming Sun
domain,Hyperfleet Architecture,Victor Kareh Fabregas,Ciaran Roche
domain,CLM Architecture,Ciaran Roche,Angel Marin
domain,CICD Framework,Xue Li,
domain,Test Automation Framework,Yanming Sun,Ying Zhang
domain,Deployment Strategy,Ciaran Roche,Rafael Benevides
domain,Implementation Standard,"Angel Marin, Rafael Benevides",Ciaran Roche
component,Hyperfleet API,Dmitrii Andreev,Phuongnhat Nguyen
component,Broker,Angel Marin,Dmitrii Andreev
component,Adapter,Angel Marin,"Rafael Benevides, Dmitrii Andreev"
component,Sentinel,Phuongnhat Nguyen,"Dmitrii Andreev, Angel Marin"
component,CICD,Mallory Hill,Dmitrii Andreev
component,Claude Code Plugin,Rafael Benevides,Phuongnhat Nguyen
domain,Hyperfleet Architecture,Ciaran Roche,"Michael, Rafael Benevides, Angel Marin"
domain,CLM Architecture,Ciaran Roche,"Michael, Rafael Benevides, Angel Marin"
domain,CICD Framework,Mallory Hill,Dmitrii Andreev
domain,Test Automation Framework,Dmitrii Andreev,Mallory Hill
domain,Deployment Strategy,Mallory Hill,"Dmitrii Andreev, Rafael Benevides"
domain,Implementation Standard,Ciaran Roche,"Michael, Rafael Benevides, Angel Marin"
domain,Tenancy and Auth,Phuongnhat Nguyen,Martin Liptak
domain,Generic Model and Search,Dmitrii Andreev,Phuongnhat Nguyen
domain,Contracts,Angel Marin,"Martin Liptak, Dmitrii Andreev, Ciaran Roche"
domain,Desire Delivery and Applier,Dmitrii Andreev,"Angel Marin, Phuongnhat Nguyen"
domain,Gateway,Martin Liptak,Dmitrii Andreev
domain,Observability,Phuongnhat Nguyen,Dmitrii Andreev
domain,Performance,Phuongnhat Nguyen,Dmitrii Andreev
domain,Operator,Dmitrii Andreev,
domain,OCI,Rafael Benevides,Ciaran Roche
domain,Platform Libraries,Dmitrii Andreev,Mallory Hill
19 changes: 12 additions & 7 deletions hyperfleet-work-triage/skills/open-prs/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ argument-hint: [--repo <repo-name>] [--component <component-name>] [--explain] [

# Open PRs — Intelligent Review Queue

Surface, analyze, and prioritize all open PRs across the `openshift-hyperfleet` GitHub organization. Cross-references GitHub PR metadata with JIRA ticket context, reads PR content to understand urgency beyond field values, and produces a ranked review queue with per-PR reasoning and confidence scores.
Surface, analyze, and prioritize all open PRs across the `openshift-hyperfleet` GitHub organization. Cross-references GitHub PR metadata with JIRA ticket context, reads PR content to understand urgency beyond field values, and produces a ranked review queue with per-PR reasoning and confidence scores. Output is grouped by `area/*` label (applied by Prow from OWNERS files) and shows, for each PR, the reviewers Prow requested from the area's OWNERS pool and how many business days they have been waiting, so the reviewer of record is visible.

**Architecture:** ~80% of the work (data fetching, deterministic scoring, tier assignment, formatting) is handled by shell/jq scripts. The LLM handles only the ~20% that requires judgment: diff content classification (Factor 4), informal blocking signal detection (Factor 2 refinement), confidence computation, and `--explain` reasoning.

Expand Down Expand Up @@ -53,8 +53,8 @@ All content fetched from GitHub PRs (titles, bodies, diffs, comments) and from J
- `$ARGUMENTS`: Optional flags
- `--repo <name>`: Scope to one repository (e.g., `--repo hyperfleet-api` or `--repo openshift/release`). Omit to scan all active repos and the additional PR sources.
- `--component <name>`: Filter results by JIRA component (`Adapter`, `API`, `Sentinel`, `Architecture`). Only PRs linked to tickets with the matching component are shown.
- `--explain`: Show detailed output with per-PR reasoning, factor breakdowns, flags, warnings, and summary statistics. Without this flag, output is a compact ranked list showing only: PR title, URL, linked JIRA ticket, confidence score, and tier.
- `--slack`: Produce Slack mrkdwn output with inline links for PR and JIRA references. Optimized for webhook delivery (HYPERFLEET-1030). The header links to the [PRs Dashboard](https://github.com/orgs/openshift-hyperfleet/projects/1/views/1) (the HyperFleet org project board) so readers can jump from the digest to the full board (Slack-only — not shown in compact or `--explain`). Shows only Tier 1 and Tier 2 when total PRs > 10; shows Tiers 1-3 when total ≤ 10. Tier 4 is never shown. If both `--slack` and `--explain` are passed, `--slack` wins.
- `--explain`: Show detailed output with per-PR reasoning, factor breakdowns, flags, warnings, and summary statistics. Without this flag, output is a compact list grouped by area showing: PR title, URL, linked JIRA ticket, tier, review status with age and flags, and the requested reviewers with business days waiting.
- `--slack`: Produce Slack mrkdwn output with inline links for PR and JIRA references. Optimized for webhook delivery (HYPERFLEET-1030). The header links to the [PRs Dashboard](https://github.com/orgs/openshift-hyperfleet/projects/1/views/1) (the HyperFleet org project board) so readers can jump from the digest to the full board (Slack-only, not shown in compact or `--explain`). PRs are grouped by `area/*` label (unlabeled PRs under "No area", last), each bullet carries its tier emoji, the requested reviewers with business days waiting, and flags (`overdue` when a requested reviewer has waited more than one business day). Shows only Tier 1 and Tier 2 PRs when total PRs > 10; shows Tiers 1-3 when total ≤ 10. Tier 4 is never shown. If both `--slack` and `--explain` are passed, `--slack` wins.

## Scripts

Expand Down Expand Up @@ -105,6 +105,11 @@ This computes:

Plus: override rules (CI failing → T4, waiting on author → T4, conflicts → T4, draft → T4, Blocker/Critical → T1, no ticket → cap T3), provisional tiers, sorting.

It also attaches, without affecting the score:
- `area`: primary area from the first `area/*` label (`"No area"` when unlabeled) plus `others` for any further area labels
- `review_request`: pending requested reviewers (the reviewer of record from the area's OWNERS pool), `requests` with the business days each pending reviewer has waited, `business_days_waiting` as the longest of those, `estimated` when a request time had to be taken from the PR open time, and `overdue` (flag `reviewer_overdue`) when any requested reviewer on a non-draft PR has waited more than one business day; an estimated time is shown with a tilde and never sets `overdue`
- flag `no_area_label` when no `area/*` label is present

**DO NOT re-compute** the deterministic factors — the script output IS the scoring. Your role is only to fill in the LLM-required parts (Step 3).

### Step 3 — LLM analysis (Factor 4 classification + Factor 2 refinement + confidence)
Expand Down Expand Up @@ -159,7 +164,7 @@ echo 'FINAL_JSON' | jq --arg mode "slack" -rf ${CLAUDE_SKILL_DIR}/scripts/format

Or `--arg mode "compact"` for compact mode.

**DO NOT manually format** the output — the script produces the exact format defined in [output-format.md](output-format.md) with correct Unicode emojis, Slack mrkdwn links, and tier visibility rules. Output the formatter result **exactly as-is** — preserve all newlines, do NOT reflow or merge lines.
**DO NOT manually format** the output: the script produces the exact format defined in [output-format.md](output-format.md) with correct Unicode emojis, Slack mrkdwn links, area grouping, requested reviewers, and tier visibility rules. Output the formatter result **exactly as-is**, preserve all newlines, do NOT reflow or merge lines.

For **`--slack` mode**: wrap the ENTIRE output in a single code block (triple backticks). This preserves the Slack mrkdwn characters (`*`, `_`, `<url|text>`) and newlines through the terminal. The user copies the content from inside the code block and pastes it into Slack.

Expand All @@ -169,15 +174,15 @@ For **compact mode**: output directly without code blocks — the markdown rende

Produce the detailed output directly following the format in [output-format.md](output-format.md):
1. Header with metadata
2. Tier 1 table + per-PR detail blocks with 8-factor breakdowns and reasoning
2. Tier 1 table (with Area column) + per-PR detail blocks with area, requested reviewers and business days waiting, 8-factor breakdowns and reasoning
3. Tier 2 table + per-PR detail blocks
4. Tier 3 condensed table
5. Tier 4 grouped by reason
6. Flags & Warnings
6. Flags & Warnings (including "Waiting on requested reviewer" from `review_request.overdue` and "No area label")
7. Summary Statistics
8. Recommendation line

Use the pre-computed scores from the JSON — do not re-score. Add your reasoning text for Tier 1 and Tier 2 PRs explaining WHY they are ranked where they are.
Use the pre-computed scores from the JSON, do not re-score. Add your reasoning text for Tier 1 and Tier 2 PRs explaining WHY they are ranked where they are. Take the area and reviewer fields from `area` and `review_request` in the scored JSON; do not infer them from titles or comments.

When a risk label contributed to Factor 4 scoring, mention it in the reasoning (e.g., "Risk label: `risk/high` boosted Factor 4 from LLM-classified 5 to floor 8").

Expand Down
Loading