Facilitate Open Notebook's GitHub Discussions queue — qualify Ideas, decompose them into distinct needs, verify claims in code, propose outcomes (exploring / graduated / parked / combined), draft replies, and graduate small gaps into ready Issues. Use when processing, triaging, or responding to Discussions, or when the user says "process discussions" / "vamos fazer as discussions".
73
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
You are facilitating the community Discussion queue, implementing the qualification and exploration stages of the Open Contribution system (Discussion #1266 is the public essay; #1212 is Bet #1). The maintainer (Luis) is the decision owner: every outcome and reply is approved by him before posting. You prepare; he decides.
This process was calibrated by hand on 2026-08-16 across 10 Ideas
(#1210–#1265) and re-run on 2026-09-02 (6 follow-ups + 3 new ideas), which
added the incubating status and the pull rule. The patterns below are
ratified practice, not theory.
Ground rules:
.tmp-context/, private plans).
Public anchors only: VISION.md, docs/7-DEVELOPMENT/decisions/ (ADRs/PDRs),
open issues/PRs. Alignment with unpublished vision may be expressed as
"aligns with where the product is heading" — no specifics.Build the full picture before touching any single item. Cluster detection across the queue is what makes individual replies good.
gh api graphql -f query='
{ repository(owner: "lfnovo", name: "open-notebook") {
discussions(first: 50, categoryId: "DIC_kwDONDsQ184CjkD_", orderBy: {field: CREATED_AT, direction: ASC}) {
nodes { number title createdAt closed author { login } comments { totalCount } } } } }' \
--jq '.data.repository.discussions.nodes[] | select(.closed == false) | "\(.number) | \(.createdAt[:10]) | \(.author.login) | comments:\(.comments.totalCount) | \(.title)"'(Category Ideas = DIC_kwDONDsQ184CjkD_; Feedback Requests = DIC_kwDONDsQ184DBrfp.
Repo id: R_kgDONDsQ1w. These are GitHub GraphQL node ids for lfnovo/open-notebook;
they change if a category is recreated or the skill is used on a fork. Regenerate:
gh api graphql -f query='{ repository(owner: "lfnovo", name: "open-notebook") {
id discussionCategories(first: 20) { nodes { id name } } } }')
Split into cohorts: post-Bet-#1 form entries ([Idea]: prefix) vs. pre-form
legacy. Note authors with multiple entries (their items often interconnect)
and candidate theme clusters. Present the map; agree on order (default:
chronological within the newest cohort).
Classify processing state before proposing work (learned on the legacy cohort run): a discussion with a maintainer reply that already delivered an outcome — especially one canonicalized in place — does not get a new reply by default. For already-processed items the deliverable is a state ledger (what's resolved and closable, what's canonical-awaiting-its-beat, and which initiative each one is waiting on), plus at most the few actions that state implies (e.g. closing a resolved thread with the outcome recorded). Re-replying to handled threads is noise, not facilitation.
Fetch everything: body + all comments (including reply threads).
GraphQL, not gh CLI (discussions support is partial):
repository.discussion(number: N) { title body author { login } comments(...) }.
Decompose into distinct needs. The single highest-value step. Titles undersell: "Thumbnails" was 3 needs; "manual annotations" was 4. Number them. Each need may get a different outcome and a different home.
Search precedents — issues, PRs, and discussions, multiple terms per
need (gh search issues has no --state all; use --include-prs, watch
for false positives like Python "annotations"). Check the queue map for
sibling discussions.
Verify claims in code before replying. User reports — even their
self-assessments — get checked against the actual implementation. This
found two real bugs during calibration (editor hardcoded to light mode;
Crawl4AI client sending no auth header). For upstream libraries use the
local checkouts from CLAUDE.local.md (esperanto, content-core,
podcast-creator, surreal-commands). State in the reply what was
verified, distinctly from what is opinion.
Check vision/decision alignment against public records. PDR-001 (single-user first) and its kin are citable and load-bearing.
Vocabulary (from the essay's qualification stage, as exercised):
| Outcome | When | Reply must include |
|---|---|---|
| exploring | Real, aligned problem; open solution space | Sharpening questions that actually shape the design |
| incubating | Direction decided, timing open (waits on vision fit, capacity, or a champion) | The settled spec, what it waits on, "this Discussion stays the home" |
| accepted → graduated | Someone will build it now: a builder (maintainer or champion) + closed spec | Issue(s) opened immediately — see graduation rules |
| parked until champion | Valid but needs a community owner (e.g. packaging channels) | Explicit return condition + how to volunteer |
| combine | Duplicate/facet of an existing theme | Link to the canonical home |
| answer | Already exists / documented | The answer, plus where docs fell short |
| bug | Reproducible defect | Graduate straight to a bug Issue |
Graduation is pull, not push (ratified 2026-09-02). An Issue is born
when someone is going to build it — never because the idea became clear.
ready is a promise of execution; filling it with well-discussed items and
no builder recreates the stale-backlog problem. A discussed-but-unscheduled
idea is incubating and the Discussion remains its home. Exceptions that
still graduate immediately: verified bugs, and small items the
maintainer will do next.
Close on answer. When the outcome is answer and the need has a
better home (an existing Issue, upstream, or "not planned"), post the reply
and close the Discussion as resolved (closeDiscussion(reason: RESOLVED));
an open thread with a final answer clutters the queue. Anyone can reopen
with a new argument.
Graduation rules (for accepted → graduated and bug):
ready (+ bug when
applicable).Canonical discussions:
updateDiscussion; precedents #1154, #1250, #1254).
At 2 signals, keep as a linked pair — no ceremony.Structure that worked, in order:
Status: **<outcome>** plus a one-line summary of the routing.Honesty rules: no feature promises, no timelines ("no commitment on timing yet"); constraints stated with their reasons (link the PDR); "the door is deliberately kept open" beats false enthusiasm and beats silence.
Style rules (owner feedback, 2026-08-16): no marketing filler or throat-clearing — never "Fair question, and it deserves a straight answer" / "Great idea!". Open by answering. Warmth comes from specificity (acknowledging a working prototype, a good decomposition), not from compliments about the question itself.
Present to the owner: ficha (compact), proposed outcome, full draft reply, and any issues/renames/closures the package includes. After approval:
addDiscussionComment,
updateDiscussion for renames) with -F body=@file — avoids shell
escaping.gh issue create --label ready --body-file ...; gh issue close N --comment "$(cat file)".open-contribution-workflow memory file) with
new patterns, posture decisions, and queue state.8297bb2
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.