Skip to content
Back to skills

Pr Board

ASecurity

Answers "how are my PRs?", "did I address the review?", "anything waiting on me?". Lectio-first via authored-PR activity (reviews/comments by others, excluding your own replies), falls back to gh for coverage gaps, joins to local worktrees, prints a board of what needs you. Read-only.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
ai-agentsrustgobash

Works with

  • cli
  • mcp

Security analysis

A100/100

Scanned September 19, 2026

npx -y skills add jamestexas/agents --skill pr-board --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Pr Board?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Pr Board
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jamestexas-pr-board/badge)](https://www.skillsdirectory.com/skills/jamestexas-pr-board)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: pr-board
description: >
  Answers "how are my PRs?", "did I address the review?", "anything waiting
  on me?". Lectio-first via authored-PR activity (reviews/comments by others,
  excluding your own replies), falls back to gh for coverage gaps, joins to
  local worktrees, prints a board of what needs you. Read-only.
user-invocable: true
argument-hint: "[--since <dur>] [--pr <ref>] [--no-refresh]"
allowed-tools: "mcp__lectio__*, Bash(lectio:*), Bash(gh:*)"
---

# pr-board — what's new on the PRs I authored

The recurring question this answers: *"how are my PRs / did I address the
reviews?"* — asked constantly during review cycles, and usually answered by
hand-rolling `gh` because nothing makes the better tool the default reach.
lectio already has the answer: `memory_authored_activity` is purpose-built for
"reviews and comments by other people on PRs I authored, since I last looked,
excluding my own replies." This skill makes that the default, keeps it
**fresh**, and adds the cross-source join (PR ↔ local worktree ↔ notes) that
only lectio can do.

**Model:** lectio is the substrate; this skill is the *reach* + *freshness* +
*presentation* layer. lectio reports last-known state; the skill decides
whether that's fresh enough and refreshes if not (the "derive current state"
move). gh is the fallback for what lectio doesn't cover, never the first reach.

**Three views of one question, and where the numbers come from.** "Does
anything need me?" is answered in three places, and it is worth knowing the
lineage before you trust a number:

1. **Canonical Hours' own `pr-board` skill** — scheduled (cron, default every
   five minutes), it triages pre-fetched lifecycle events into
   `needs_you/active/opened/resolved` and *writes the board*. It is a renderer
   with judgment, not a crawler, and it has its own lectio connection for
   enrichment. This is where the board is produced.
2. **The work HUD's needs-you dial and MY PRS panel** — ambient *display*.
   The HUD reads a local work-board service, which reads the board Canonical
   Hours wrote. The dial does no triage of its own; it shows that work.
3. **This skill** — the *interactive* mode. You ask, it refreshes, and it
   answers the follow-up an always-on dial cannot ("did I address the
   review?") by joining PR threads to your local worktrees.

Two substrates on purpose: lectio is historical and cross-source; Canonical
Hours is a scheduled fold serving a current board. Reach for the dial to
notice, and for this skill to act — and remember a stale dial usually means
the tick did not run, not that nothing needs you.

## Arguments

- `--since <dur>` — window for "new activity" (e.g. `24h`, `3d`). Default `24h`.
- `--pr <ref>` — focus one PR (`42090` or `owner/repo#42090`); skips the board, deep-dives that PR's review thread + your reply status.
- `--no-refresh` — skip the freshness step (use lectio as-is; faster, possibly stale).

---

## Phase 0 — Freshness (derive current state)

lectio's answer is only as current as its last `gh` sweep. Before reading,
make it fresh — this is now safe to run alongside the launchd sweep timer
(WAL + busy_timeout, lectio bead fa895f), so it won't error on a lock.

1. Unless `--no-refresh`: `lectio sweep --source gh --if-stale 10m`
   (also `--source linear --if-stale 10m` if the question touches Linear).
   `--if-stale` no-ops when gh swept within 10 min, sweeps otherwise — cheap to
   call every time.
2. Optional sanity read: `lectio status --json` shows per-source
   `last_advanced_at` — if gh is hours stale and the refresh didn't move it,
   the sweep service may be wedged (see lectio bead 0618a0); say so rather than
   silently reporting stale data.

> If the `lectio` MCP / CLI isn't available at all, skip to Phase 3 (pure gh
> fallback) and say up front that this is gh-only, no cross-source join.

---

## Phase 1 — Ask lectio the authored-activity question

Call `memory_authored_activity` with `since_nanos` = now − `--since`
(default 24h). It resolves "mine" from your `[identity] gh_logins` (falls back
to `gh.authors`) — no need to pass authors. It returns, per PR you authored:
the PR (repo, number, title, state/merged), and the **new items** — reviews and
review-comments by people who aren't you, since the window — each with author,
path, preview, timestamp. Author attribution is present (lectio bead 380b79),
so "whose review" is answered without falling back to gh.

If it returns an empty/zero result, that's a real answer ("nothing new on your
PRs since <t>") — report it, don't go hunting in gh to manufacture activity.

---

## Phase 2 — Join each PR to your local context (lectio's edge)

For each PR with new activity, a quick `memory_search "<number>"` (and/or
`memory_traverse` on the PR URI) surfaces the cross-source threads lectio
uniquely holds: your local review worktree (`fs://…/<repo>-pr-<n>-review`),
notes files, the commits that touch the same files, prior turns where you
discussed it. This is the value over `gh` alone — gh knows the PR, the
filesystem knows your worktree, lectio has both joined on one graph.

For `--pr <ref>`: skip the board, deep-dive this one — full review timeline
(`memory_get_timeline` on the PR URI), each reviewer's comments, and crucially
**whether you replied after their latest comment** (compare your latest
authored item's timestamp vs the reviewer's). That's the literal
"did I address the review?" answer.

---

## Phase 3 — Present the board

One scannable block, sorted by what needs you most (unanswered reviews first):

```
PR board — new since <window>  (gh swept <freshness>)

owner/repo#42090 — "title" — OPEN — ⚠ NEEDS REPLY
  • Mark: 3 review comments (src/foo.rs, src/bar.rs) — 2h ago — you haven't replied since
  • local: <worktree-path>/mono-pr-42090-review worktree, notes at <path>
owner/repo#39311 — "title" — OPEN — ✓ replied
  • Carol: 1 approval — 1d ago
…
2 PRs with new activity · 1 needs your reply
```

- **What needs you:** the short list where a reply or decision is pending — the actual point of the board.
- **Attribution:** name the reviewer (Mark, Carol) — it's in the data now.
- **Cite URIs** for claims drawn from lectio (per its epistemic contract), and flag any answer that's from stale data if Phase 0 couldn't refresh.

**gh fallback (coverage gaps only):** if a PR you know exists isn't in lectio's
result, it's likely outside configured `gh` coverage (`memory_list_sources`
shows the scopes). For that specific gap, `gh pr view <ref> --json …` — and
note it's a coverage gap worth adding to `[[gh.repo]]` or `author_scoped`, so
next time lectio has it.

---

## Posture

Read-only. This skill answers a question; it never posts a reply, approves, or
comments. When the board says "#42090 needs a reply," handing off to compose
that reply is a separate, explicit step the user initiates.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.