board-setup
Use when recording a repo's issue-board constants in its `CLAUDE.md` — the forge and repo, the project and Status field ids, every option id, the enabled…
Skill by pmvanev
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/pmvanev-board-setup
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: writing, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/board-setup
What's inside
- Skill name
board-setup- Description
- Use when recording a repo's issue-board constants in its `CLAUDE.md` — the forge and repo, the project and Status field ids, every option id, the enabled workflows, the tier, the docs root and whether the repo is nWave — on GitHub or GitLab. Triggers on "record the board constants", "write the issue board section", "probe the board", "add the board block to a repo that already documents its board", "check whether the board notes still match the forge", "re-run the board setup", or "why can't grooming evaluate rule 4". Probes what a forge answers, asks only what none records, labels every generated line `probed` or `assumed`, coexists with prose it cannot regenerate, and writes zero bytes when nothing moved. Never infers a declaration from the labels in use, and never writes to the forge.
- License
- MIT
- Instructions
- 433 lines in SKILL.md · view on GitHub
Files (32)
- SKILL.md
- drift-and-retire.md · references/
- gitlab.md · references/
- outcomes.md · references/
- provenance-model.md · references/
- expected.md · self-test/01-fresh-target/
- manifest.json · self-test/01-fresh-target/
- expected.md · self-test/02-refused-probe-writes-nothing/
- manifest.json · self-test/02-refused-probe-writes-nothing/
- expected.md · self-test/03-section-already-exists/
- manifest.json · self-test/03-section-already-exists/
- expected.md · self-test/04-malformed-markers/
- manifest.json · self-test/04-malformed-markers/
- expected.md · self-test/05-region-already-present/
- manifest.json · self-test/05-region-already-present/
- expected.md · self-test/06-contradicting-line/
- manifest.json · self-test/06-contradicting-line/
- expected.md · self-test/07-cannot-evaluate-is-not-an-offer/
- manifest.json · self-test/07-cannot-evaluate-is-not-an-offer/
- expected.md · self-test/08-decline-leaves-unevaluated/
- manifest.json · self-test/08-decline-leaves-unevaluated/
- expected.md · self-test/09-declaration-contradicts-evidence/
- manifest.json · self-test/09-declaration-contradicts-evidence/
- expected.md · self-test/10-rerun-writes-zero-bytes/
- manifest.json · self-test/10-rerun-writes-zero-bytes/
- expected.md · self-test/11-gitlab-unread-labels/
- manifest.json · self-test/11-gitlab-unread-labels/
- expected.md · self-test/12-vanished-option-id/
- manifest.json · self-test/12-vanished-option-id/
- expected.md · self-test/13-retire-must-not-reach-a-declaration/
- manifest.json · self-test/13-retire-must-not-reach-a-declaration/
- README.md · self-test/
SKILL.md (first lines)
# Board setup — probe, label, write
Discover a repo's board constants and write them down **before** they are learned by contact.
Probe everything discoverable, ask for what is not, and **label every line with where it came
from**. A line whose origin cannot be told is the defect here — not a line that is missing.
Why that is the thesis, and why this plugin's own `CLAUDE.md` is the evidence for it:
`${CLAUDE_PLUGIN_ROOT}/skills/board-setup/references/provenance-model.md`.
## Three categories, and every fact line carries one
| Category | Means | Where it is written |
|---|---|---|
| **probed** | the forge returned it | **inside** the markers |
| **assumed** | the forge returned *half* of it, or it is derived from a proxy | inside the markers, labelled, saying what is not knowable |
| **declared** | only a human can say it | a **separate** region, attributed, never regenerated |
**No line in either region is composed at run time, so no prose standard applies to a session here.**
Every line — `probed`, `assumed` and its *not knowable … why* clause alike — is emitted by
`render-block.py` from strings that live in `probe-board.py`. A session that composed one would be
typing a value the script returns, which *Never type a value this script could return* forbids and
*Hand-writing a region breaks determinism* explains the cost of.
**The rationale strings are still prose**: `rules/writing.md` governs them at build time, in
`probe-board.py`, for whoever edits them.
**`declared` is out for a second, independent reason**: a human wrote it, and judging prose a human
wrote is taste.
The third category is not decoration: *"Auto-close on Done is ENABLED"* is one confident sentence
spanning a fact and a guess, because the forge reports that the workflow is on and never which
status fires it. The field-level derivation is in `${CLAUDE_PLUGIN_ROOT}/skills/board-setup/references/provenance-model.md`.
## The probe is a script, and that is the point
Run `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/probe-board.py --repo OWNER/REPO`. It emits JSON: every
value paired with the exact query that produced it, in a fixed field order.
**Never type a value this script could return, and never fill a gap it left.** A value that did not
come out of the JSON does not go inside the markers, because in the finished file a remembered id is
indistinguishable from a probed one.
**Read `status` first.** On `refused`, **write nothing** and report `refusal.reason`, then
`refusal.fix` **when it is non-null** — `fix` is nullable, and printing `None` at a reader is worse
than saying no fix is known. A refusal whose reason names an unbuilt slice is reported as *not
available yet*, never as an instruction: there is no flag that names a board, and relaying advice the
product cannot honour is its own defect.
A partial block is worse than none: a block silently missing its Status field id reads exactly like
one whose board has no Status field.
## The region
```markdown
## Issue board
<!-- phil:board-setup:v1:begin -->
generated 2026-08-17T14:44Z · do not edit inside these markers
- Forge: GitHub at github.com — use `gh -R owner/repo` on every call *(probed · Q1)*
- Board: project `PVT_…` · number 3 · "phil plugin" *(probed · Q2)*
- Status is a project **field**, id `PVTSSF_…` — not a label *(probed · Q3)*
- Status options (4) *(probed · Q3)*: Todo `f75ad846` · In Progress `47fc9ee4` · …
**Queries**
- `Q1` — `gh repo view owner/repo --json nameWithOwner,defaultBranchRef,isFork,isPrivate`
- `Q2` — `{ repository(owner:"…", name:"…"){ projectsV2(first:20){ … } } }`
<!-- phil:board-setup:v1:end -->
```
**The markers are bare and versioned; the timestamp is the first line inside**, so the string a
refresh matches on never changes between runs.
**Every bullet names the query that produced it**, with the queries listed once each at the foot —
several constants come from one call, and repeating a GraphQL document per bullet buries the values
it exists to source. Two shapes need a rule:
- A fact whose `query` is a cross-reference (`"(see project-discovery)"`) cites the **referenced
fact's** Q-number.
- A compound `query` — two calls joined because the first returned nothing — becomes **two** named
entries, with what the first returned recorded.
**Everything outside the markers belongs to a human, permanently.**
### The facts with no template field still get written
Five facts carry no `template_field`: `default-branch`, `fork`, `project-discovery`, `board-view`,
`other-single-select-fields`. **They are not surplus and must not be dropped.** Write them as
bullets in the same region, after the template-shaped ones, each carrying its provenance and
Q-number like any other. `fork` and `other-single-select-fields` appear only when the forge returned
them. Why *how the board was found* is itself a constant: `${CLAUDE_PLUGIN_ROOT}/skills/board-setup/references/provenance-model.md`.
## Two regions, and the second is a human's
A declaration lives in a **second delimited region**, outside the probed markers, so the probed region
can be regenerated without touching a human's answer:
```
<!-- phil:board-setup:declared:v1:begin -->
generated … · declarations, not probed facts — a human's answers
- Label family **wave** (`wave: discuss`): **single-valued** *(you declared · 2026-08-17)*
<!-- phil:board-setup:declared:v1:end -->
```
- The **probed** region is regenerated freely, every run.
- The **declared** region is written once on an answer and **never regenerated**. A second
`--declare` refuses.
**Every ask that fills the declared region follows `${CLAUDE_PLUGIN_ROOT}/skills/shared/decision-request.md`.**
Load it before the first `AskUserQuestion` call.
Two things that standard cannot know: what makes a question *un-probeable* is this skill's own finding,
so the context block carries the probe that failed and why no forge answers it; and the counted ask must
describe the convention in plain terms — a question about label families that names the families as
identifiers is asking the reader to hold the vocabulary the answer is supposed to establish.From pmvanev/phil-claude-plugin, MIT.
More from pmvanev/phil-claude-plugin
- 0.570score
issue-board
pmvanev
Use when driving a GitLab or GitHub issue tracker or board from the command line with `glab` or `gh` — moving a card between board columns, reordering a…
SkillAFreshness: AClaude Code +9 - 0.570score
board-snapshot
pmvanev
Use when asked where an issue board stands right now rather than what is wrong with it — "summarise my board", "what's on the board", "where does the board…
SkillAFreshness: AClaude Code +9 - 0.570score
nwave-slice-status
pmvanev
Use when the user asks where an nWave feature stands — "how many steps are in this slice", "which ones are done", "which one are we on", "what's next", "is…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-wave-summary
pmvanev
Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle"…
SkillAFreshness: AClaude Code +9 - 0.566score
groom-issues
pmvanev
Skill bundle for the phil:groom-issues, phil:groom-fix, phil:groom-set and phil:groom-ask commands — reads a whole issue board in one list call per forge —…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-issue-board
pmvanev
Use for any GitLab or GitHub board or tracker work in an nWave repo — one holding `.nwave/` or `docs/feature/` — including putting a feature on the tracker as…
SkillAFreshness: AClaude Code +9 - 0.565score
edd
pmvanev
Skill bundle for phil:edd command — Expectation-Driven Development front-door.
SkillAFreshness: AClaude Code +9 - 0.565score
adversarial-review
pmvanev
Skill bundle for phil:adversarial-review command — a general-purpose independent adversarial critic.
SkillAFreshness: AClaude Code +9 - 0.565score
red-team-prose
pmvanev
Skill bundle for phil:red-team-prose command — reviews a doc, README, or release note for AI-generated tells, Elements of Style clarity, and fitness for its…
SkillAFreshness: AClaude Code +9 - 0.561score
ai-eos
pmvanev
Skill bundle for phil:ai-eos command — detects the stylistic tells that mark technical prose as AI-generated, with a density verdict and ranked findings.
SkillAFreshness: AClaude Code +9 - 0.561score
redesign-tests
pmvanev
Skill bundle for phil:redesign-tests command — human-approved, behaviour-changing test redesign loop with a coverage-equivalence claim per rewrite
SkillAFreshness: AClaude Code +9 - 0.561score
refactor-loop
pmvanev
Skill bundle for phil:refactor-loop command — gated closed-loop refactoring with a separate proposer and correctness critic, hard test gates, and a DAG ledger
SkillAFreshness: AClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 10
- Last commit (this folder)
- Oct 20, 2026 (8 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/pmvanev/phil-claude-plugin
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from pmvanev
- 0.570score
issue-board
pmvanev
Use when driving a GitLab or GitHub issue tracker or board from the command line with `glab` or `gh` — moving a card between board columns, reordering a…
SkillAFreshness: AClaude Code +9 - 0.570score
nwave-slice-status
pmvanev
Use when the user asks where an nWave feature stands — "how many steps are in this slice", "which ones are done", "which one are we on", "what's next", "is…
SkillAFreshness: AClaude Code +9 - 0.570score
board-snapshot
pmvanev
Use when asked where an issue board stands right now rather than what is wrong with it — "summarise my board", "what's on the board", "where does the board…
SkillAFreshness: AClaude Code +9 - 0.566score
groom-issues
pmvanev
Skill bundle for the phil:groom-issues, phil:groom-fix, phil:groom-set and phil:groom-ask commands — reads a whole issue board in one list call per forge —…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-issue-board
pmvanev
Use for any GitLab or GitHub board or tracker work in an nWave repo — one holding `.nwave/` or `docs/feature/` — including putting a feature on the tracker as…
SkillAFreshness: AClaude Code +9 - 0.566score
nwave-wave-summary
pmvanev
Use when asked what finished work decided, rather than where it stands or what you were doing — "what did DISCUSS decide", "what did that stage settle"…
SkillAFreshness: AClaude Code +9
Cite this page
board-setup skill. Agent Mart. https://agentmart.dev/skills/pmvanev-board-setup (last updated 2026-10-24)