Agent skills

Open in Claude.md

rd-issues

File a plan as a real tree (parent, children, blocked-by edges) and read every issue back to prove the fields landed.

rd-issues takes .radial/plans/<slug>.md and turns it into issues: the parent, each child with its body and parent link, the dependency edges between them, and then a verification pass that reads every issue back. A create that returned 200 is not proof the field landed, and the read-back is what makes the tree true rather than probable.

File a plan as a real tree in Radial, the keyboard-first issue tracker: one parent, its children, the blocked-by edges between them, and a read-back that proves every field landed.

When to use it

Right after rd-plan, once the plan has been argued with. Not for editing issues that are already filed: radial update is faster and does not need a skill.

What it asks you

Which mode, if you have not said. The default files everything into the backlog, unassigned, with no agent label: the plan exists, nobody is on it yet. --start means you are building this now, so children land in progress, assigned to you, carrying the label of the agent doing the work. It also stops and asks if a search turns up an issue that already covers this. Two trees for one change is the mess /rd-cleanup exists to undo.

What it writes

The parent, then each child with --parent, then one radial link <child> blocked-by <other> per edge, then status, assignee and label when --start is on. If a prototype is sitting in .radial/prototypes/ it attaches it and puts the Preview URL in the parent body. Then it reads every issue back with radial show --json and fixes anything that did not land.

Events it pushes

This is where a drafted build becomes the issue's. bind replays the plan and prototype stages at the times they really happened, so the timeline reads 14:21 rather than "created at bind time", and the build is opened at its earliest stage rather than at the bind.

VerbEventCorrelation
radial build bind <PARENT>build.opened, carrying the draft's stages and sessionsBinds the journal to the issue key
radial build stage start materializestage.startedBuild, stage id, attempt, session id
radial build stage done materializestage.done with the issues created or reused, the labels and the edgesSame

The two rules it carries

Calls run one at a time. Filing a tree is a burst of writes, and parallel radial calls race the token refresh: the failure looks like a random 401 halfway through a half-created tree.

Labels are added with --add-label, never -l. Plain -l replaces the whole set, which is how a type label disappears the moment an agent adds its own attribution label.

Also, -d is inline text. Passing a file path to -d stores the literal path as the description, so every body goes in through --description-file.

Extension points

HookWhat a section here adds
extra-fieldsFields this team always sets: a project, a cycle, an estimate, a required label, a default assignee
file-barRaise the bar before the read-back: require a prototype, a due date, a linked design doc
after-fileFollow-ups once the tree is verified: post the parent URL, open a branch, notify a reviewer

A worked wrapper

markdown
---
name: platform-issues
description: Platform team filing rules on top of rd-issues.
extends: rd-issues
---

Read rd-issues first, then apply the sections below at their hooks.

## extra-fields

- Every issue gets `--project Platform` and the current cycle.
- Every parent gets an estimate; ask if the plan does not imply one.

## file-bar

- A tree with any `[ui]` tag may not be considered filed until a prototype is
  attached to the parent and its Preview URL is in the body.

## after-file

- Post the parent URL to #platform with the child count and the first child to
  be picked up.

What it never does

It never files a tree without reading every issue back. It never uses -l to add a label, and never replaces a label set it did not author. It never creates a second parent for a plan that already has one, and it never moves an issue to done. Closing work is a human decision.