DevOps Pod PR Status
Thin wrapper over the shared pr-skills library, pinned to the DevOps pod and scoped to PRs authored by DevOps roster members (leads ∪ members in .github/teams/devops.json).
The dashboard spans the qvac monorepo (filtered by the pod's ownedPaths) plus every repo declared under extraRepos in .github/teams/devops.json. For extra repos the pod is treated as the sole owner — every open PR there is in-scope regardless of touched paths. The monorepo (tetherto/qvac) is the primary repo and stays path-filtered; it is intentionally NOT listed under extraRepos. Today's extraRepos are an explicit curated list:
- Ops:
tetherto/github-ops, tetherto/oss-actions, tetherto/qvac-actions, tetherto/qvac-devops, tetherto/qvac-testops, tetherto/release-ops, tetherto/data-github-ops
- Dev:
tetherto/qvac-workbench, tetherto/qvac-internal, tetherto/qvac-test-suite, tetherto/qvac-registry-vcpkg, tetherto/qvac-fabric-speech.cpp, tetherto/qvac-ext-stable-diffusion.cpp, tetherto/qvac-fabric-llm.cpp, tetherto/qvac-ext-ggml, tetherto/qvac-ext-bergamot-translator, tetherto/qvac-ext-marian-dev
- Research:
tetherto/qvac-research-tool-call, tetherto/qvac-research-medpsy, tetherto/qvac-research-translations-nmt, tetherto/qvac-research-evaluate, tetherto/qvac-research-synthetic-data-creation, tetherto/qvac-research-model-training, tetherto/qvac-model-tools, tetherto/qvac-rnd-fabric-llm-bitnet, tetherto/qvac-rnd-fabric-llm-finetune
extraRepos entries are plain owner/name strings used as-is. Glob entries (an owner/name whose name segment contains *, e.g. tetherto/qvac-*) are also supported and resolved dynamically per run via gh repo list <owner> --no-archived — add one to the list if you'd rather track every matching repo automatically instead of curating. Any repo the script cannot read is skipped with a one-line warning on stderr.
When to use this skill
Use when:
- User asks about open DevOps pod PRs, review status, or what needs attention
- User asks specifically about stale PRs touching DevOps paths
- User wants to know which DevOps pod PRs to review next
- User invokes
/qv-devops-pr-status
Prerequisites
gh CLI installed and authenticated (gh auth status)
- User must have read access to
tetherto/qvac AND every repo declared under extraRepos (any repo the script cannot read is skipped with a one-line warning on stderr)
- Team roster +
extraRepos maintained at .github/teams/devops.json
Usage
DATE="$(date -u +%Y-%m-%d)"
node .agents/skills/_lib/pr-skills/pr-status.mjs --pod devops --mode team --authors pod \
2> /tmp/devops-pr-status-${DATE}.stderr \
| tee "/tmp/devops-pr-status-${DATE}.txt"
--authors pod restricts the main dashboard to PRs authored by DevOps roster members. PRs that touch DevOps-owned paths (in the monorepo) or live in any extra repo but are authored outside the roster are surfaced in a separate "Excluded" section at the bottom of the same dashboard, so the pod still has visibility into cross-pod work hitting its surfaces without those PRs polluting the queue. See .agents/skills/_lib/pr-skills/README.md for the flag's full behavior.
extraRepos is honored only by --mode team. --mode review and --mode my continue to operate against the configured primary repo only (the monorepo); cross-repo personal review/my-PR dashboards are not in scope of this skill.
The first line of the dashboard is a Repos: summary listing the primary repo plus every extra repo that contributed to the run, so the user can see the full scope at a glance. PRs from extra repos render as owner/repo#<num> (e.g. tetherto/qvac-workbench#42); PRs from the primary monorepo render as bare #<num> exactly as before. The same prefix shows in the Excluded section.
For the personal review queue scoped to DevOps PRs, use --mode review (without --authors pod — review queue intentionally includes cross-pod authors whose review the user owes). That mode stays on the primary repo.
Workflow
Run the script with --pod devops --mode team --authors pod, teeing stdout to /tmp/devops-pr-status-<YYYY-MM-DD>.txt so the dashboard is available for paste afterwards. Redirect stderr to a sibling .stderr file (it contains progress / SLACK_VALIDATION_REQUIRED notices and any skipped-repo warnings, not dashboard content).
Present the dashboard to the user in the chat presentation format (see below) — not as a raw paste of the script output.
Surface the summary header counts (need your re-review / stale / merge conflicts / excluded) prominently.
Print the paste-ready copy commands. The dashboard at /tmp/devops-pr-status-<DATE>.txt is plain text with two-space indent — when pasted into a Slack thread, Slack auto-renders the indented lines as nested bullets and turns #<num> into PR auto-links. No re-formatting is needed.
pbcopy < /tmp/devops-pr-status-${DATE}.txt # macOS
xclip -selection clipboard < /tmp/devops-pr-status-${DATE}.txt # Linux
wl-copy < /tmp/devops-pr-status-${DATE}.txt # Wayland
After showing results, offer: "Want me to review any of these? Provide the PR URL and I'll run /qv-devops-pr-review (or /qv-pr-review for the generic flow)."
Chat presentation format
The in-chat rendering uses Markdown with hyperlinked PR numbers. This is distinct from the paste-ready Slack form (auto-linked plain text) saved to the temp file. Both must be produced on every run.
Required layout (in this exact order):
- Title line —
## DevOps Pod — PR Status (authors scoped to roster).
- Headline summary — one bold line restating the script summary counts (
N PRs need attention · X fully approved · Y need your re-review · Z stale). Append · <K> repos scanned when the script's Repos: line lists more than just the primary repo (i.e., extraRepos resolved to at least one repo), so the user can see the scope at a glance.
- Roster line — one-line listing of the roster:
Roster: `Proletter` (lead) + `darkynt`, `GSServita`, `sidj-thr`, `tamer-hassan-tether`, `yauhenipankratovich-web`.
Refresh from .github/teams/devops.json on every run; do not hardcode if the file has drifted.
- Headline analysis — one short paragraph identifying the highest-leverage cluster in the queue (e.g., "Four
QVAC-18047 PRs all sit on team-lead approval only — fastest path to drain the queue."). Skip when the queue is empty.
### :red_circle: Stale (>3d) — N — one bullet per stale PR.
### :large_yellow_circle: Needs Review — N — one bullet per active PR.
### :repeat: Needs your re-review — N — only if the section is non-empty.
### Excluded (non-roster authors) — populated from the script's "EXCLUDED" section. One bullet per PR. Acts as a quick visibility list, not a review queue.
### Paste-ready — the pbcopy / xclip / wl-copy block.
Bullet format for the active sections (Stale / Needs Review / Re-review):
- [<ref>](<url>) — <title> · `<author-login>` · <age> · <approvals/notes> · **<blockers/labels>**
<ref> is #<num> for PRs in the primary monorepo and owner/repo#<num> (e.g. tetherto/qvac-workbench#42) for PRs from any extraRepos entry. Mirror the script's prRef form 1:1 — the rendered link text must match what appears in the dashboard at /tmp/devops-pr-status-<DATE>.txt.
[<ref>](<url>) — Markdown link, never bare <ref>.
<title> is the PR title verbatim, no truncation.
<author-login> is wrapped in backticks.
<age> is the script's age string (e.g., 4d 13h).
<approvals/notes> lists :white_check_mark: <login> / :x: <login> / :arrows_counterclockwise: <login> for any non-pending reviews on the PR (from the script's Reviews: / Other: lines).
<blockers/notes> is bolded — "needs team-lead approval", "needs team-member approval", "needs team-member + team-lead approval", "needs fork-ci approval", or any :warning: merge conflicts flag. Include labels in plain backticks (e.g., `safe-to-test`) when present.
Bullet format for the Excluded section (compact — these are not the pod's review queue):
- [<ref>](<url>) `<author-login>`
References
1---2name: qv-devops-pr-status3description: Team-wide PR dashboard for the DevOps pod, scoped to PRs authored by pod-roster members. Shows open PRs touching DevOps-owned paths and authored by DevOps leads/members, grouped into needs-your-re-review / stale (>3d) / needs-review, with merge-conflict warnings and a separate Excluded section for non-roster authors. Use when checking DevOps pod PR status, asking about stale PRs, or invoking /qv-devops-pr-status.4---56# DevOps Pod PR Status78Thin wrapper over the shared pr-skills library, pinned to the DevOps pod and scoped to PRs authored by DevOps roster members (`leads ∪ members` in [.github/teams/devops.json](../../../.github/teams/devops.json)).910The dashboard spans the qvac monorepo (filtered by the pod's `ownedPaths`) **plus** every repo declared under `extraRepos` in [.github/teams/devops.json](../../../.github/teams/devops.json). For extra repos the pod is treated as the sole owner — every open PR there is in-scope regardless of touched paths. The monorepo (`tetherto/qvac`) is the primary repo and stays path-filtered; it is intentionally NOT listed under `extraRepos`. Today's `extraRepos` are an explicit curated list:1112- Ops: `tetherto/github-ops`, `tetherto/oss-actions`, `tetherto/qvac-actions`, `tetherto/qvac-devops`, `tetherto/qvac-testops`, `tetherto/release-ops`, `tetherto/data-github-ops`13- Dev: `tetherto/qvac-workbench`, `tetherto/qvac-internal`, `tetherto/qvac-test-suite`, `tetherto/qvac-registry-vcpkg`, `tetherto/qvac-fabric-speech.cpp`, `tetherto/qvac-ext-stable-diffusion.cpp`, `tetherto/qvac-fabric-llm.cpp`, `tetherto/qvac-ext-ggml`, `tetherto/qvac-ext-bergamot-translator`, `tetherto/qvac-ext-marian-dev`14- Research: `tetherto/qvac-research-tool-call`, `tetherto/qvac-research-medpsy`, `tetherto/qvac-research-translations-nmt`, `tetherto/qvac-research-evaluate`, `tetherto/qvac-research-synthetic-data-creation`, `tetherto/qvac-research-model-training`, `tetherto/qvac-model-tools`, `tetherto/qvac-rnd-fabric-llm-bitnet`, `tetherto/qvac-rnd-fabric-llm-finetune`1516`extraRepos` entries are plain `owner/name` strings used as-is. Glob entries (an `owner/name` whose name segment contains `*`, e.g. `tetherto/qvac-*`) are also supported and resolved dynamically per run via `gh repo list <owner> --no-archived` — add one to the list if you'd rather track every matching repo automatically instead of curating. Any repo the script cannot read is skipped with a one-line warning on stderr.1718## When to use this skill1920**Use when:**2122- User asks about open DevOps pod PRs, review status, or what needs attention23- User asks specifically about stale PRs touching DevOps paths24- User wants to know which DevOps pod PRs to review next25- User invokes `/qv-devops-pr-status`2627## Prerequisites2829- `gh` CLI installed and authenticated (`gh auth status`)30- User must have read access to `tetherto/qvac` AND every repo declared under `extraRepos` (any repo the script cannot read is skipped with a one-line warning on stderr)31- Team roster + `extraRepos` maintained at [.github/teams/devops.json](../../../.github/teams/devops.json)3233## Usage3435```bash36DATE="$(date -u +%Y-%m-%d)"37node .agents/skills/_lib/pr-skills/pr-status.mjs --pod devops --mode team --authors pod \38 2> /tmp/devops-pr-status-${DATE}.stderr \39 | tee "/tmp/devops-pr-status-${DATE}.txt"40```4142`--authors pod` restricts the main dashboard to PRs authored by DevOps roster members. PRs that touch DevOps-owned paths (in the monorepo) or live in any extra repo but are authored outside the roster are surfaced in a separate "Excluded" section at the bottom of the same dashboard, so the pod still has visibility into cross-pod work hitting its surfaces without those PRs polluting the queue. See [.agents/skills/_lib/pr-skills/README.md](../_lib/pr-skills/README.md) for the flag's full behavior.4344`extraRepos` is honored only by `--mode team`. `--mode review` and `--mode my` continue to operate against the configured primary repo only (the monorepo); cross-repo personal review/my-PR dashboards are not in scope of this skill.4546The first line of the dashboard is a `Repos:` summary listing the primary repo plus every extra repo that contributed to the run, so the user can see the full scope at a glance. PRs from extra repos render as `owner/repo#<num>` (e.g. `tetherto/qvac-workbench#42`); PRs from the primary monorepo render as bare `#<num>` exactly as before. The same prefix shows in the Excluded section.4748For the personal review queue scoped to DevOps PRs, use `--mode review` (without `--authors pod` — review queue intentionally includes cross-pod authors whose review the user owes). That mode stays on the primary repo.4950## Workflow51521. Run the script with `--pod devops --mode team --authors pod`, **teeing stdout to `/tmp/devops-pr-status-<YYYY-MM-DD>.txt`** so the dashboard is available for paste afterwards. Redirect stderr to a sibling `.stderr` file (it contains progress / `SLACK_VALIDATION_REQUIRED` notices and any skipped-repo warnings, not dashboard content).532. Present the dashboard to the user in the **chat presentation format** (see below) — not as a raw paste of the script output.543. Surface the summary header counts (need your re-review / stale / merge conflicts / excluded) prominently.554. **Print the paste-ready copy commands.** The dashboard at `/tmp/devops-pr-status-<DATE>.txt` is plain text with two-space indent — when pasted into a Slack thread, Slack auto-renders the indented lines as nested bullets and turns `#<num>` into PR auto-links. No re-formatting is needed.5657 ```bash58 pbcopy < /tmp/devops-pr-status-${DATE}.txt # macOS59 xclip -selection clipboard < /tmp/devops-pr-status-${DATE}.txt # Linux60 wl-copy < /tmp/devops-pr-status-${DATE}.txt # Wayland61 ```62635. After showing results, offer: "Want me to review any of these? Provide the PR URL and I'll run `/qv-devops-pr-review` (or `/qv-pr-review` for the generic flow)."6465## Chat presentation format6667The in-chat rendering uses Markdown with hyperlinked PR numbers. This is distinct from the paste-ready Slack form (auto-linked plain text) saved to the temp file. Both must be produced on every run.6869Required layout (in this exact order):70711. **Title line** — `## DevOps Pod — PR Status (authors scoped to roster)`.722. **Headline summary** — one bold line restating the script summary counts (`N PRs need attention · X fully approved · Y need your re-review · Z stale`). Append `· <K> repos scanned` when the script's `Repos:` line lists more than just the primary repo (i.e., `extraRepos` resolved to at least one repo), so the user can see the scope at a glance.733. **Roster line** — one-line listing of the roster:74 ```75 Roster: `Proletter` (lead) + `darkynt`, `GSServita`, `sidj-thr`, `tamer-hassan-tether`, `yauhenipankratovich-web`.76 ```77 Refresh from [.github/teams/devops.json](../../../.github/teams/devops.json) on every run; do not hardcode if the file has drifted.784. **Headline analysis** — one short paragraph identifying the highest-leverage cluster in the queue (e.g., "Four `QVAC-18047` PRs all sit on team-lead approval only — fastest path to drain the queue."). Skip when the queue is empty.795. **`### :red_circle: Stale (>3d) — N`** — one bullet per stale PR.806. **`### :large_yellow_circle: Needs Review — N`** — one bullet per active PR.817. **`### :repeat: Needs your re-review — N`** — only if the section is non-empty.828. **`### Excluded (non-roster authors)`** — populated from the script's "EXCLUDED" section. One bullet per PR. Acts as a quick visibility list, not a review queue.839. **`### Paste-ready`** — the `pbcopy` / `xclip` / `wl-copy` block.8485Bullet format for the active sections (Stale / Needs Review / Re-review):8687```88- [<ref>](<url>) — <title> · `<author-login>` · <age> · <approvals/notes> · **<blockers/labels>**89```9091- `<ref>` is `#<num>` for PRs in the primary monorepo and `owner/repo#<num>` (e.g. `tetherto/qvac-workbench#42`) for PRs from any `extraRepos` entry. Mirror the script's `prRef` form 1:1 — the rendered link text must match what appears in the dashboard at `/tmp/devops-pr-status-<DATE>.txt`.92- `[<ref>](<url>)` — Markdown link, never bare `<ref>`.93- `<title>` is the PR title verbatim, no truncation.94- `<author-login>` is wrapped in backticks.95- `<age>` is the script's age string (e.g., `4d 13h`).96- `<approvals/notes>` lists `:white_check_mark: <login>` / `:x: <login>` / `:arrows_counterclockwise: <login>` for any non-pending reviews on the PR (from the script's `Reviews:` / `Other:` lines).97- `<blockers/notes>` is bolded — "needs team-lead approval", "needs team-member approval", "needs team-member + team-lead approval", "needs fork-ci approval", or any `:warning: merge conflicts` flag. Include labels in plain backticks (e.g., `` `safe-to-test` ``) when present.9899Bullet format for the Excluded section (compact — these are not the pod's review queue):100101```102- [<ref>](<url>) `<author-login>`103```104105## References106107- Pod metadata: [.github/teams/devops.json](../../../.github/teams/devops.json)108- Shared library README: [.agents/skills/_lib/pr-skills/README.md](../_lib/pr-skills/README.md)109- Generic PR review skill: [.agents/skills/qv-pr-review/SKILL.md](../qv-pr-review/SKILL.md)110- DevOps-flavored PR review skill: [.agents/skills/qv-devops-pr-review/SKILL.md](../qv-devops-pr-review/SKILL.md)