decisions
Skill31 starsChanged 31 days agoMITView on GitHub
Builds the decision board for the current project: only the choices that are genuinely the user's to make right now, each with its options and, per option, why you'd pick it, what it costs and what it unblocks. Use when the user types /decisions or says "what do I need to decide", "show me my decisions", "decision board" or "what's waiting on me". Gathers candidates from the project's CHECKPOINT.md open threads (plus an optional folder of markdown task notes), classifies each with a fixed test, prints the verdicts, then shows the survivors as a board page whose picks the next run reads back, or as a numbered list in chat when no page host is available. An empty board is a correct result. Do NOT use for listing open work in general (that is the CHECKPOINT) or for a to-do list.
11 other projects use a version of this.
Adopted by
Most recently taken up by
- BuilderIO/agent-nativetheir own version, first seen Nov 1, 2026
- davidondrej/cloudroom-coretheir own version, first seen Nov 1, 2026
- davidondrej/cloudroomtheir own version, first seen Nov 1, 2026
- davidondrej/skillstheir own version, first seen Oct 29, 2026
- mikhin/claude-skillstheir own version, first seen Oct 13, 2026
- arbelh/perduretheir own version, first seen Oct 11, 2026
Used with
Projects with it also use adr-verbatim, file-tree and 5 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
davidondrejSkilladr-verbatim
Record concise ADRs that preserve the user''s decisions without conversational noise. Use for "adr-verbatim", "new ADR", "document that as an ADR", "record this decision", or supplied ADR wording.
Also in 3 projects that use this
davidondrejSkillfile-tree
Manually-invoked skill that prints a nice file tree of the current topic in a code block. Use when the user says "file-tree" or "file tree".
Also in 3 projects that use this
attentiondotnetSkillsetup-help
Walk the user through setting up anything step by step. Use when the user asks for help setting up, configuring, installing, or getting something working — "help me set up X", "walk me through this", "setup-help". Differentiator: gives one current step at a time, then always lists every remaining setup step after each response.
Also in 3 projects that use this
itgoyoSkillbrowser-harness
Direct browser control via CDP. Use when the user wants to automate, scrape, test, or interact with web pages. Connects to the user's already-running Chrome.
Also in 3 projects that use this
MicrosoftSkillhandoff
Compact the current conversation into a handoff document for another agent to pick up.
Also in 3 projects that use this
- +2 more from davidondrej
Other versions11 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 11
- BuilderIO/agent-native★ 7.6ksame name
- davidondrej/skills★ 4.3ksame name
- davidondrej/cloudroom★ 1.5ksame name
- davidondrej/cloudroom-core★ 1.5ksame name
- maragudk/skills★ 49same name
- apinizer/agentnizer-cookbook★ 2same name
- kamenkurtev/ui-consistency★ 1same name
- arbelh/perdure★ 0same name
- kwana117/claude-skills★ 0same name
- mikhin/claude-skills★ 0same name
1 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
The file
We split this skill into the rules it gives an agent
4 rules. 0 are common, 0 are distinctive, and 4 are very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 55
After recording, ArtifactData set receipts/<decision> to {rev, state: "applied", result: "<one line>", at: "<YYYY-MM-DD HH:MM UTC>"}.
- Very specific: line 71
Add -NotesDir <folder> (or set DECISIONS_NOTES_DIR) to include markdown task notes whose frontmatter carries project: <folder name>.
- Very specific: line 95
A carried decision gets no pass: Every decision on the last board (.decisions/board.json) goes through this test, the ownership check and …
- Very specific: line 155
Write <project>/.decisions/board.json as {project, generated, decisions, left} (generated = YYYY-MM-DD HH:MM UTC.
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
decisions -- the decision board for one project
The hard part is the classifier, not the page: a board that carries non-decisions makes the user whittle them off one at a time, and every fake decision teaches them to ignore the real ones. Classify FIRST, show the reasoning, build only what passes.
Requires PowerShell 5.1+ or pwsh 7+ (collector) and Python 3 (renderer, validator). State lives
in the project's .decisions/ folder: board.json (the last board), board.html (a preview),
url.txt (the hosted page, once one exists).
Copy this checklist into your reply and tick each line:
- 0 picks from the last board read and recorded
- 1 candidates collected
- 2 verdict table printed
- 3 decisions written
- 4 board validated, then shown (page or chat)
- 5 report
0 -- record the picks from the last board before anything else
Picks exist in one of two places: the hosted board's database (when .decisions/url.txt exists
and the session has the ArtifactData tool), or answers the user gave in chat to the last chat
board. For a hosted board, ArtifactData list the picks collection and the receipts
collection on that URL. Each pick is {decision, option, note, at, rev, unpicked?}.
- Skip a pick whose receipt has the same
revandstate: "applied": already recorded. - A pick: on the CHECKPOINT Open-threads bullet the decision came from (its
sourcesin.decisions/board.json), addowner decision -- <YYYY-MM-DD>: <option label>plus the note copied character for character, and drop the[owner]tag when the pick leaves only agent work. For a decision from a task note, prepend<YYYY-MM-DD> -- you picked "<option label>" on <at>(plus: <note>) to the note'sreplyfield, newest first, joined with|, keeping its YAML valid. - Note-only record (
optionnull): a question or comment on a decision not picked yet. Answer it in chat, carry the answer into that decision'sbackgroundat the rebuild, leave the decision open. Exception: a note that states a choice outright ("drop it", "do B") is recorded as that choice, in the user's words. - Removed pick (
unpickedset,optionnull): strike the earlierowner decisionline and mark the bullet undecided again. For a task note, prepend<YYYY-MM-DD> -- you removed your pick "<old option label>" on <at>to itsreply: the collector reads that entry as reopening the question, so the next run puts it back on the board. - After recording,
ArtifactData setreceipts/<decision>to{rev, state: "applied", result: "<one line>", at: "<YYYY-MM-DD HH:MM UTC>"}. Never write into a pick document; the page replaces it whole on every save. - A pick is recorded, never acted on in this run. "Go build it" becomes an
[agent]thread; build, apply or edit nothing the pick approves unless the user asks for it in chat, because a board press is a decision, not a work order, and the user is not watching this run. - Tell the user what they picked and what that set in motion, one line each.
1 -- collect candidates (mechanical)
pwsh -NoProfile -File <this skill's folder>/collect_decisions.ps1 -ProjectDir <project folder>On Windows without PowerShell 7, run the same line with powershell in place of pwsh.
Add -NotesDir <folder> (or set DECISIONS_NOTES_DIR) to include markdown task notes whose
frontmatter carries project: <folder name>; it is optional, and without it the CHECKPOINT is the
only source. Output is JSON: candidates[] of kind thread (Open-threads bullets, with tags and
owner: owner when tagged [owner]) and note (not-done task notes, with answered +
answered_line when the note's reply already holds a dated decision). The collector never
classifies. If it warns the CHECKPOINT is missing, say so and continue with what it found.
A candidate already decided is not a candidate: one whose bullet carries an owner decision
line, a note with answered: true, or one a step-0 pick just settled goes in left with verdict
already decided: <their answer, in their words> (<date>).
2 -- classify every candidate (the load-bearing step)
A candidate is a DECISION only if ALL three hold:
- a genuine fork: materially different options with different outcomes;
- it needs the USER's judgment (taste, strategy, product intent, risk appetite): a session cannot settle it with a recommendation and just do it. A technical fork is never theirs (implementation route, tool, library, architecture). Research until the evidence settles it, then decide and record it as a model decision. The "risk appetite" label does not rescue a technical fork: if a genuine value trade-off survives the research, the board carries only that trade-off, worded with no technical terms ("accept a small, unreported account-ban risk for a faster in-game panel?").
- it is live now: not parked behind a precondition whose answer is already obvious.
A carried decision gets no pass. Every decision on the last board (.decisions/board.json)
goes through this test, the ownership check and the discard list again, from its own words and
sources; having been on a board is no evidence it is a decision. Never copy one forward.
Then the ownership check, because a choice that is not an answer to their ask is not theirs to make. A candidate must pass all three, or it is not a decision: answer it or drop it.
- a. It answers the device, scope or thing the user named, not a neighbour or substitute of it.
- b. It raises no purchase or spend (new hardware, a subscription, an account) they never raised.
- c. It is not already settled by a dated decision of theirs in the CHECKPOINT, a note's
reply, or a board pick.
Discard, naming the reason, anything that is:
- the project's normal improve-loop ("fold in what makes it better"): that is the job, not a choice;
- already decided or obvious from the user's stated intent (a stale "idea to explore" thread does not reopen it);
- scheduling, opportunity cost, token budget ("when do I spend the time on this obviously-fine thing");
- verification or execution ("prove it works", "run the staged step", "click deploy");
- mechanical, one right answer, a session can just do it;
- deferred behind an obvious precondition (a network that needs users who do not exist yet);
- a life to-do tracked under a project (a bill, a call, a purchase): it belongs in a to-do list. The board is for forks that GATE AGENT WORK in the project;
- finding users, testers or an audience: never on a board, not even in
left, because when the user goes looking for people is their own call.
Signals, none sufficient alone: an [owner] thread whose text is "run X / paste Y / click Z" is
execution; a [gates: go] thread is a decision only if the go is a real fork (build A vs B vs not
at all), not a rubber stamp on obvious work. A spec or thread existing is not evidence the user
wants the thing.
Print the verdict table BEFORE building: candidate, verdict (decision / not: <category>), one-line
reason. The user vetoes in chat; remove the struck ones and continue. If nothing passes, say
"nothing needs deciding right now: <the one-line shape of what is open instead>", still write the
empty board when a hosted page exists (so the page is honest), otherwise stop. Never manufacture
a decision to fill the page.
3 -- write each surviving decision plainly
For each decision, in plain words a stranger could act on:
id: a short unique slug, stable across rebuilds (the page saves picks under it).title: the fork as a question, under 100 chars, no field names or project shorthand.background: a LIST of 2-4 paragraph strings (the template calls.mapon it, so a single string renders a blank page): what the thing is, where it came from, what was found, what the options are about. A title plus options without this is not a decision.why_now: one sentence.sources: a list of{label, path}, always including the research, spec, doc or URL the decision came from, and the CHECKPOINT line or task note that listed it.- 2-8
options, each withkey(a short unique slug: the page saves it as the pick and matchesdefaultagainst it),label,choose_if,cost,unblocks(concrete, no workflow jargon). default+default_reason: a suggested pick only with a one-sentence reason saying why that option beats the others, naming one piece of evidence (file:line, command output, URL, or a dated quote of the user), or saying "no evidence beyond judgment".defaultis akey, never a label. If the honest answer turns on their taste, risk appetite or a fact only they have, setdefault: nulland say so indefault_reason. Never suggest by habit or because it is the status quo.nullis never the answer when the user's recorded intent or the research points at an option: recommend it and name that intent or evidence.- Collect the discards as
left[](title,verdict) so the board shows what was left off and why (outreach items excepted, per step 2).
4 -- validate, then show the board
Write <project>/.decisions/board.json as {project, generated, decisions, left} (generated =
YYYY-MM-DD HH:MM UTC; project = the folder name). Then:
python <this skill's folder>/validate_board.py <project>/.decisions/board.json
python <this skill's folder>/render_board.py <project>/.decisions/board.jsonShow the board only on the validator's ok: the template has no error handling, so one
wrong-shaped field gives a blank page. The validator also fails a why_now or default_reason
about the user's time or schedule; that is step 2's scheduling discard, so drop the decision
rather than reword the reason.
Pick the route by what this session has:
Hosted page (the session has the Artifact and ArtifactData tools):
- Rebuild by database write, not by republish, because republishing a page that declares the
dbcapability asks the user for consent again. When.decisions/url.txtexists, immediately before the write:ArtifactData listpicksagain; if any pick was saved since step 0 ran, record it per step 0 (read its sources and option labels from the board it was picked on, theboard/currentdocument, since the new file may no longer carry it), move its decision toleftas already decided, and re-validate and re-render (a board built before the pick would show the answered question as open). ThenArtifactData set, collectionboard, doccurrent, from the validatedboard.json. The open page updates live. - First board for the project: publish
.decisions/board.publish.html(it carries no data, since the data holds local paths a hosted page should not; it fills fromboard/current) withcapabilities: {db: {}},icon: "scale", a one-sentence description; save the returned URL to.decisions/url.txt; then writeboard/currentas above. Open the page once and confirm the decisions are on it: a green validator is not a rendered board. - The board is private by default; never share it on the user's behalf.
Chat board (no page host): print each decision as a numbered block: the title, the
background, then the options lettered with choose if / costs / unblocks, and the suggested pick
with its reason. Ask the user to answer as "1B, 2A: <note>". When they answer, record each pick
per step 0's rules (no receipt step). board.html from the renderer is a read-only preview that
opens in any browser.
5 -- report (this cap binds)
At most six lines: where the board is (URL, or "above"), how many decisions are on it, the one-line list of their titles, what was left off (count; the fuller table is on the board), and any pick from step 0 that was recorded. Nothing about the classifier's mechanics, the template or the state files.
Rules
- Classify before building; never build then whittle.
- One project at a time: the folder the session is in. Ask which project only if that folder has no CHECKPOINT.md and the user named none.
- Same page per project, fresh data each run: never a second hosted board for the same project.
- Tests:
python validate_board_tests.pybeside this file.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

