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".
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, and again on 2026-09-05
(4 follow-ups), which added the one-decision-at-a-time format and the
close-when-graduated-work-lands 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.
Close when graduated work lands (ratified 2026-09-05). A thread whose
needs have all either shipped or been routed elsewhere is done the moment
the last fix is merged to main — do not wait for a versioned release.
Post a closing reply that names the merged PR(s), says the change ships
with the next release, and points testers at the v1-dev Docker image
(rebuilt on every push to main), then close as resolved. Precedents:
#1236 (editor bugs), #1243 (Crawl4AI token). Detecting this state is part
of Phase 0: for every graduated Issue linked from an open thread, check
whether it closed since the last run.
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.
One decision at a time (owner preference, 2026-09-05). After the Phase 0 ledger, present decisions sequentially — never a batch. Each one uses this fixed format, in the owner's language:
On approval, execute the whole package in the order below (side actions first, reply last), report the URLs, then present the next decision. Number them ("Decisão 2 de 4") so the owner knows the size of the session. 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.3127f14
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.