bundles/dev-loop/skills/gh-board-sync/SKILL.md
Reconcile a GitHub Projects v2 board against real repository state — merged PRs, closed issues, stale lanes, untracked work — and report every drifted item with evidence. Read-only by default; fixes Status/Priority values only with --apply and per-category confirmation. Use when asking whether the board reflects reality, auditing board drift, or syncing board state after merges.
npx skillsauth add shipshitdev/library gh-board-syncInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Answer one question with evidence: does the board reflect reality? The dev-loop treats the board as truth, which only works if the board actually tracks the repos. This skill diffs a GitHub Projects v2 board against live repository state — PR merge status, issue state, review decisions, milestones — and reports every item where the two disagree, ordered by how badly the disagreement lies to you.
It is a reconciler, not a board configurator. Board shape (fields, columns,
options) belongs to gh-project-board; this skill assumes the canonical shape
and compares item state to repo state.
Inputs:
--apply to fix drift after the reportOutputs:
Creates/Modifies:
--apply and confirmation: sets the Status and Priority fields on
existing project items onlyExternal Side Effects:
Confirmation Required:
--apply write at allDelegates To:
gh-project-board for board shape — run its audit first; if the board is not
the canonical five-column shape, stop and normalize there before syncingroadmap-to-milestones when the readiness check shows the coming week needs
milestones created or re-datedstandup when the user wants a personal what-did-I-do summary, not board
truthgh-inbox when the user wants their own me-scoped queue, not the boardprd-task-creator when untracked work should become tracked issuesOrdered by severity — the earlier the check, the more the drift misleads.
--horizon for longer sprints): open/closed counts, overdue flags, and each
milestone's open issues — the coming sprint's focus list. Report only —
creating or re-dating milestones is roadmap-to-milestones' job.Draft items (board items with no linked issue/PR) are bucketed separately and never flagged — a draft has no repo state to drift from.
Verify auth and project scope:
gh auth status -h github.com
gh project list --owner <owner>
Verify board shape via gh-project-board's audit. If Status is missing
or the columns are not the canonical Backlog / In Progress / Human Review /
Done / Deferred model, stop and hand off to gh-project-board — syncing a
non-canonical board produces garbage findings.
Run the report (read-only, always the first step):
node ${CLAUDE_SKILL_DIR}/scripts/gh-board-sync-report.mjs \
--owner <owner> \
--project <number>
Useful variants:
node ${CLAUDE_SKILL_DIR}/scripts/gh-board-sync-report.mjs \
--owner <owner> --project <number> --repo <owner/name>
node ${CLAUDE_SKILL_DIR}/scripts/gh-board-sync-report.mjs \
--owner <owner> --project <number> --window 30 --stale 3
node ${CLAUDE_SKILL_DIR}/scripts/gh-board-sync-report.mjs \
--owner <owner> --project <number> --horizon 14
node ${CLAUDE_SKILL_DIR}/scripts/gh-board-sync-report.mjs \
--owner <owner> --project <number> --json
Present the report grouped by check with the verdict up front. Every finding carries its evidence — do not editorialize beyond what the repo state shows.
Without --apply, stop here. The report is the deliverable.
With --apply, propose fixes per check category and confirm each category
separately:
Status to DoneStatus back to the lane the evidence supports
(In Progress if an open PR exists, else Backlog)Backlog (unclaim) — never auto-apply; each stale item
needs a human callDone; approved-and-green → report to the human,
do not move (the gate is theirs to clear)Priority per the user's rankingprd-task-creator, the issue
owner, or roadmap-to-milestones respectivelyApply approved batches with the smallest mutation — field values only,
using the item and field IDs from the --json report:
gh api graphql -f query='
mutation($project: ID!, $item: ID!, $field: ID!, $option: String!) {
updateProjectV2ItemFieldValue(input: {
projectId: $project, itemId: $item, fieldId: $field,
value: { singleSelectOptionId: $option }
}) { projectV2Item { id } }
}' -F project=<id> -F item=<id> -F field=<id> -F option=<optionId>
Re-run the report after applying and show the before/after drift counts.
--apply without a fresh report is invalid — never
fix drift you haven't shown the user.Status/Priority.gh api graphql for board reads and writes — the REST API does not
expose Projects v2 item fields. Paginate items in pages of 100; boards
routinely exceed one page.closedByPullRequestsReferences and PR→issue
through closing keywords in the PR body. A PR with neither is untracked
work, not an error.gh-project-board's audit fails,
findings are noise. Normalize shape first.development
Coordinates a weekly engineering review of board accuracy, recent code changes, operational health, and scoped cleanup. Use for a recurring repository health review or a review of the last several days.
testing
Audits project board configuration and prepares explicitly requested setup, copy, or normalization changes while preserving the existing workflow and provider boundaries. Use when inspecting a board's fields, columns, scope, or configuration.
testing
Reconciles a project board with current work and delivery evidence, reports incomplete coverage and metadata gaps, and applies only approved provider-supported field changes. Use when auditing board drift, reviewing blocked work, or assessing upcoming delivery.
development
Walk through how a subsystem works. Use for "how does X work", code walkthroughs before changing something, and placement or ownership questions. Explains architecture, runtime flow, and onboarding mental models. Can critique architecture. Use why for motivation.