justinstimatze

Ticketvoice — Development skill for Claude Code

Development community

A Claude Code PreToolUse hook that gates ticket prose through cope and basanite before it posts, with a word budget as backstop.

How to install Ticketvoice

This entry records only its repository, not the path inside it, so there is no exact command to give. Open justinstimatze/ticketvoice and copy the folder into ~/.claude/skills/, or the file into ~/.claude/agents/.

What Ticketvoice does

A Claude Code PreToolUse hook that gates ticket prose through cope and basanite before it posts, with a word budget as backstop.

Alternatives in Development

  • Nopus — Deterministic prose checks for clearer coding-agent responses 239 ★
  • Claude Code Leaderboard — This CLI automatically monitors your token usage and posts your stats to the leaderboard after each Claude Cod 191 ★
  • Content OS — A self-improving daily content system — pulls from high-quality sources every morning and drafts posts in your 103 ★

README

ticketvoice

[![ci](https://github.com/justinstimatze/ticketvoice/actions/workflows/ci.yml/badge.svg)](https://github.com/justinstimatze/ticketvoice/actions/workflows/ci.yml)

A Claude Code `PreToolUse` hook that gates ticket prose through [cope](https://github.com/justinstimatze/cope) (voicing and structure) and [basanite](https://github.com/justinstimatze/basanite) (vocabulary tics) before it posts. Behind both sits a word budget — 150 words for an issue or PR description, 120 for a comment, fenced code excluded — as a narrower backstop: neither cope nor basanite is built to score sheer length, independent of register or vocabulary. Any of the checks flagging a body returns `permissionDecision: "deny"` — the reason goes to Claude, not a human, so it rewrites and retries on its own instead of paging anyone. No prompt when a body clears every check — on Linear it still tags the body as agent-authored before letting it through; see [Agent tag](#agent-tag).

Two more checks, both first-party (built here, not delegated to a sibling binary): an issue description must state its user-facing impact in plain language — see [Impact line](#impact-line) — and any ticket-id, file:line, or commit SHA a ticket cites gets verified against Linear, the local filesystem, and the local git repo, not trusted at face value — see [Ground-truth citations](#ground-truth-citations).

Covers two surfaces: Linear, via its MCP tools' structured `description`/`body` fields — issues, comments, and PR-review-thread ("diff") comments and reviews — and GitHub issues/PRs, via [`gh-write`](#gh-write-github-issues-and-prs) — a thin wrapper this repo also builds, which is the only way this hook can see a GitHub body at all (see that section for why a plain `gh issue create --body "..."` can't be gated).

Deliberately not covered on the Linear side: project/initiative descriptions, status updates, documents, milestones, release notes. Same reasoning as GitHub's release notes below — a different genre