Publishes a Compozy spec set to compozy-specs and mirrors it into a GitHub + Linear issue pair — or starts from a bare issue and authors the spec first.
Scanned 9/3/2026
Install to Claude Code
npx -y skills add compozy/compozy --skill cy-issue-to-spec --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Cy Issue To Spec?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/compozy-cy-issue-to-spec)More formats (shields.io, HTML) on the badges page.
---
name: cy-issue-to-spec
description: >-
Publishes a Compozy spec set to compozy-specs and mirrors it into a GitHub +
Linear issue pair — or starts from a bare issue and authors the spec first.
disable-model-invocation: true
argument-hint: "[spec slug or issue number]"
---
# Issue ↔ Spec
One feature lives in three places: the working **spec set** under `.compozy/tasks/<slug>/`, its published folder in the `compozy/compozy-specs` repo, and its **mirror** — a GitHub issue and a Linear issue that read identically. This skill moves a feature between those places and leaves all three agreeing.
## Branches
| Starting point | Enter at |
| --- | --- |
| A spec set already exists under `.compozy/tasks/<slug>/` | Step 1 |
| A GitHub issue exists carrying no spec behind it | Step 0 |
## Step 0 — Author the spec
Only when starting from a bare issue.
Read the issue and restate its scope in one sentence. When it bundles separable features, split it first: retitle the original to the narrower scope, open a second issue for the remainder, and cross-link both — then spec one of them.
Activate `cy-spec-preflight`, then `cy-create-spec`. Offer `cy-spec-peer-review` after the user approves the spec. Run `cy-create-tasks` last.
*Done when:* `.compozy/tasks/<slug>/` holds `_spec.md` (or `_prd.md` + `_techspec.md`), its companions, `adrs/`, and `_tasks.md`, and the user has approved the spec.
## Step 1 — Stage the spec set
Run the staging helper (**mutating** — writes into the specs repo working tree):
```bash
python3 .agents/skills/cy-issue-to-spec/scripts/publish-spec.py \
--spec-dir .compozy/tasks/<slug> \
--specs-repo <specs-repo-checkout> \
--repo-root "$(pwd)"
```
It publishes `_*.md`, `task_NN.md`, and `adrs/*.md`; it leaves `analysis/`, `qa/`, `memory/`, `evidence/`, `reviews-*/`, `state.yaml`, and handoff notes in the workspace. Pass `--include '<glob>'` for a document that carries spec content under a name outside those patterns, and `--archived` when the workstream is already closed.
The folder is named `YYYY-MM-DD-<slug>`, dated by when the work began: the source folder's own date prefix when it carries one, else `state.yaml`'s `created_at`, else the earliest document. Active specs sit at the repo root; closed ones under `_archived/`.
*Done when:* the helper exits 0, reporting the staged path, file count, and a clean scan.
## Step 2 — Resolve the report
The helper scrubs machine-local paths and repairs `../adrs/` links itself. Two findings need a decision:
- **A surviving local path or a possible secret** exits the helper non-zero. Edit the staged document, then re-run the scan.
- **A broken relative link** points at something the filter left behind. Either publish that material too, or accept the dangling reference — the repo README already tells readers that older documents point at files they will not find.
*Done when:* every reported path, secret, and link is fixed or consciously accepted.
## Step 3 — Index and push
Add one row to the specs repo `README.md`, in the **Active** or **Archived** table: the folder link, one sentence on what the spec covers, the tracking-issue link, and the `Documents` column naming its shape (`spec`, `prd + techspec`, `brief + techspec`, …). Newest first.
Commit as `docs: add <slug> spec set` and push.
*Done when:* every relative link in the README resolves and the commit is on `main`.
## Step 4 — Write the issue body
Read `.agents/skills/cy-issue-to-spec/references/issue-body.md` in full and build the body against it.
*Done when:* the body opens with the spec-set link block and every section of the skeleton is either written or deliberately absent.
## Step 5 — Open the mirror
Create or update the GitHub issue: title matching the spec's subject, labels `roadmap` + `planned` (removing `needs-plan`), the Step 4 body, and a closing `Roadmap item tracked in Linear: [CY-NNN](…)` line.
Create or update the Linear issue with the same title and the same body, swapping the footer for `Tracked on GitHub: <url>`. Linear renders GitHub callout syntax as plain text — convert a `> [!NOTE]` block to a bold sentence.
Verify with the audit helper (**read-only**):
```bash
python3 .agents/skills/cy-issue-to-spec/scripts/check-tracker-sync.py --linear-json <export>
```
Save the Linear MCP `list_issues` result to a file first; without `--linear-json` the helper audits only the GitHub half.
*Done when:* the helper exits 0 with no defects, and both issues carry a link to each other.
## Reference
- Publishing an already-archived spec skips Step 0 and Step 4's tracking link when no issue exists — the README row is then the only index entry.
- Renaming a published folder breaks the links already sitting in both trackers; update the issue bodies in the same change.
- `references/issue-body.md` — the issue-body skeleton and where each part comes from in the spec.
- `scripts/publish-spec.py` — **mutating**; stages, scrubs, scans, and link-checks a spec set.
- `scripts/check-tracker-sync.py` — **read-only**; audits titles, states, and links across the mirror.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!