Run the project's suggested-task ledger, the chips. /chips alone brings every open task up to date: it applies what the ledger helper says, settles stale and split tasks, cards what can start and reports the board. Use for /chips, /chips offer, start or drop, "what chips are open", "suggest a task for X", "update the chips", "clean up the chips", "which chips are stale", and whenever pstack would file a tracked issue, a follow-up, a reflect Backlog item or an out-of-band PR.
69
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
Chips are a project's suggested tasks, the side work outside a run's target, or a measurement that does not fit a run's one-hour budget, that the owner can start in a new session. They live as rows in one ledger per project, and a card in a suggest tool is only a view of one. The law is .agents/pstack/rules/chips.md, which sync-pstack renders into every project. Read it in full before this session's first ledger write. This skill runs its modes; it adds no rule of its own.
Every command below is node .agents/pstack/decisions-check.mjs <command>, run from the project's checkout, which a card session that opened in its own worktree names by the path its brief prints. Get this session's id from the runtime's session tool, such as Claude Code desktop's get_session with self, and pass --session <id> to every board read. A runtime with no session tool reads the board without it.
| Mode | Use it to |
|---|---|
Sweep, /chips with no argument, /chips all or /chips codex | bring this session's open tasks up to date, card what can start and report the board; all also takes the tasks no live session owns, and codex forces the Codex handoff on each card it offers |
| Offer | add a finding, the one way new work enters the ledger |
| Start | begin a task a card opened, in the card's session |
| Drop | record the owner's word to drop a task |
pstack calls these modes too. Where a pstack step files a tracked issue, a follow-up or a reflect Backlog item, or puts an out-of-band fix in its own PR, the lead runs Offer instead. At each hand-back, after each compaction and at the close, it runs a quick sweep, which skips step 3. A question about open chips, such as "what's next" over side work, runs steps 1 and 6 without step 1's cleanup and writes nothing.
Run chips --session <id> and chips stale. The stale report lists each open task with its age, the paths it writes that were deleted since its offer or are missing, the commits on its paths since its offer, its closed PR waits and its card, the likeliest stale first.
Then clean up the card sessions of landed tasks, as chips.md's Cleanup says. Save the session tool's list of every session, archived ones included, such as Claude Code desktop's list_sessions with include_archived and a limit above the session count, as a JSON array in the run directory, and run chips cleanup --sessions <file> --session <id>. Archive each session it lists under Archive with the session tool, save the list again, run chips cleanup again and run the scan.mjs --remove command it prints. Keep the first run's Report lines for step 6. Under /chips all, read the board again with chips all --session <id> --sessions <file>, using the list saved last, as chips.md's Owner says, and use that board from here on. A runtime with no session tool skips this.
Apply the pass the Do list shows, together with the run's own rows that chips.md's Sweep lists, in one append --from <file> batch:
uncarded with a card item's card: when the tool reports its session archived or gone. For a started task whose rows name no session, find it as the item says and log started with its session:. When the tool reports a started task's session archived, read its last report with the tool, then log landed when a commit holds the change or that report says the session delivered it, with patch: when it names one. When that report hands back a patch it never applied, land the patch as chips.md's Landing says and log landed with patch:. Log dismissed stopped only when that report hands back no patch and neither this checkout nor the session's own worktree holds an uncommitted edit on the task's paths. Otherwise, or when the tool cannot find the session, the task stays started, and step 6 says why.Run chips --session <id> again and repeat until the Do list shows only the card pass or nothing you can apply. When append refuses a batch, fix or drop the refused row as its message says and append the rest.
Judge each task the stale report gives a fact, from its brief, those facts and the code, and append the rows in one batch:
dismissed done, citing the commit.dismissed superseded. When a path only moved, log updated with the new writes:.git ls-files and log updated with it, or leave a path the task creates. A carded task's updated only drops paths, so its session names the real one in its started row.updated with the waits it has now.dismissed dup that chips.md's Sweep gives. When the keeper holds a card or is started, log waits: task:<keeper> on the other instead.landed when a commit holds its change. Step 2's check item settles the rest from its session, so never ask the owner whether that session still runs.folded row. When this session holds the task's card, withdraw it first. When another session holds it, fold the finding once that card leaves the queue. When no source holds the finding, leave the task as it is. Step 6 says which tasks stay thin.updated with its waits plus task:<that id>, which a carded task takes.updated with the right effort: when they differ, which a carded task takes.Repeat step 2 for what step 3 changed.
Card pass: before each card, judge whether the task needs the result of another open task, starting with each one its Ready line says shares its paths, or of an open design question its work builds on. When it does, log updated with its waits plus task:<that id> instead of the card. Also check the effort its brief shows against chips.md's Title rule, and log updated with effort: high for an (xhigh) fix whose finding names its cause and where it lives, or effort: xhigh for a bug or slowness whose cause nobody has located. Then offer each card the Do list names with what chips brief <id> prints as its prompt, verbatim, and the effort its brief shows, while the suggest tool's last result lists fewer than 20 pending cards, all in the same turn, then log carded with card: and session:, plus codex: always under /chips codex. A runtime with no suggest tool lists each Ready task in the plan's ## Open work instead, as chips.md's Limits says. Before each card, check whether the task's writes: touch an active plan, one whose Status: starts with a word status.mjs counts as active, such as building. That plan's files are the plan itself, its decision log and its subject file <plans>/topics/<topic>.md. The topic is its Topic: line, or the first entry of the frontmatter list that pageTopic.field in .agents/pstack.json names. Its session is rewriting those files, and chips sees only ledger tasks, so log updated with the task's waits plus run:<that plan> instead of the card.
Report first the cleanup's Report lines, each task the sweep cleaned up with its commit links, and each worktree scan.mjs --remove kept with its reason. Then report in plain words each row this sweep logged, one line each, then what can start and whether it has a card, with start <id> beside each Ready task the 20-card limit left uncarded, what is started, why it stays open and that "drop " closes it, what waits and on what, grouped by the thing waited on, and the fast work owed a review. When a task waits on landed work the owner has not committed, the report suggests that commit before it lists what can start, naming each landed task and how many waiting tasks its commit frees, because the next wave starts only after it. Name each task by id and title. Write each commit it names as a link to that commit on GitHub, https://github.com/<owner>/<repo>/commit/<sha>, with the owner and repository read from the checkout's origin remote. The report asks the owner nothing. The owner reverses a dismissal by asking, and the lead offers the task again.
While any task is started or carded, and where the runtime re-invokes the lead when a background command exits, run chips wait --session <id> in the background, as chips.md's Waves says. When it exits naming a started session, look that session up with the session tool. Lower it to its brief's effort when it still runs at its card's effort, which chips wait prints, or at yours when the suggest tool took none, as chips.md says. Then run this sweep again.
chips --session <id> first, and read the brief of each open task whose topic or title touches the finding with chips brief <id>.folded row on it with what the finding adds.waits: task:<id>. chips merges it into a carded task once the card is withdrawn.chips id, a plain imperative title, (xhigh) only where chips.md's Title rule gives it, and its writes:, topic:, kind:, waits:, owns: and session:, this session's id, which makes it this session's task, as chips.md's Owner says. Its waits: include run:<plan> for each active plan whose files it writes, as Sweep step 5 finds them. Reuse a topic the board lists when the finding answers its question. A new topic names one owner question, never an area.append <plans>/suggested-tasks.decisions.tsv chip "<id> <title>" "<finding>" "<tokens>" <result>. When append refuses the row, its message names the route; follow it.A session a card opened, or one the lead started on the owner's "start ", runs this before it writes anything, as chips.md's Sweep says.
chips brief <id> and work from what it prints, not from the card's prompt.chips. When the task is neither Ready nor Started, tell the owner what it waits on and stop.started with writes: naming any path the brief lacks and session: naming this session's id where the runtime's session tool gives one, then run chips brief <id> again, because the task could change until that row. When the session tool shows this session above the brief's Effort:, say so to the owner in your first reply, because a session cannot lower its own effort.started row with it. When append refuses that row because another started task writes that path outside the checkout, leave the path alone and tell the owner.landed with patch:, merge your run directory into the checkout without overwriting, and remove the worktree as the last command once the cleanup scan's --landed check passes. A review task's session first logs reviewed on each task it reviewed.dismissed stopped.started and tell the owner. Otherwise log dismissed declined with its card:, in place of uncarded, so no merge lands between the two.dismissed declined with that card:.dismissed declined.udecode/plate
ae66aa7
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.