Kata-harness-setup — install the roll runner alongside bring-loop
A roll never runs on its own queue — it ticks over the same bring/
queue bring-loop already reads. Setup here is mostly about making sure that
foundation exists, then explaining the one new file and the one new plugin
surface layered on top of it.
1. Make sure the bring queue exists
Check for bring/actions.md in the project root.
- Missing: scaffold it with bring-loop itself — the queue format has one
owner, and it is not this plugin. Invoke the bring-loop plugin's
bring-setup skill: its bring_core.py init creates bring/actions.md
and bring/ledger.jsonl, never overwriting anything that already exists.
If bring-loop isn't installed yet, install it first
(/plugin install bring-loop@dojo-genesis — the same marketplace this
plugin ships from). kata-harness deliberately ships no second init: its
scripts/ holds only roll_core.py, whose roll verbs assume the queue
already exists.
- Present: leave it alone. If bring-loop is already installed and in use,
there is nothing to scaffold — the roll rides on the existing queue as-is.
If the queue is genuinely empty (a fresh init, or an existing one with
nothing in it), this is the moment to seed 2-3 real outward actions — ask the
user what they're sitting on, the same question bring-setup asks. A roll over
an empty queue has nothing to surface.
2. Where the roll's own ledger lives
Nothing to create by hand — the first roll-start call creates
bring/roll-ledger.jsonl on its own, the same way logging a bring creates
bring/ledger.jsonl on its own. Explain the shape of the file split, since
it's the one thing genuinely new here:
| File |
Owner |
Concern |
bring/actions.md |
human + agent (unchanged) |
the queue — the roll never writes here |
bring/ledger.jsonl |
bring-loop, append-only |
outcome content — sent/decided/closed/shipped/skipped, shared by both plugins |
bring/roll-ledger.jsonl |
kata-harness, append-only |
session shape — ticks, targets, cadence, pauses; a bookkeeping axis of its own, never blended into the outcome streams |
bring/ROLL-STATUS.md |
kata-harness, generated |
the current-roll face — regenerate with roll-status, never hand-edit |
3. The opt-in timer
Model/self-paced by default — no clock, no daemon, just tick when you're
ready.
--timer on roll-start turns on an in-session display only: count-up if
no duration is set, count-down if a cadence (e.g. --cadence 25m) is set.
- Say plainly that this is a display, not a process — it starts no clock
that outlives the session, and expiry never resolves, skips, or advances a
tick by itself. That stays true whether
--timer is on or off.
4. Coexistence with bring-loop — say this explicitly
- Distinct everything, on purpose: plugin
kata-harness (not bring),
skills kata-harness / kata-harness-setup (not bring / bring-setup),
ledger bring/roll-ledger.jsonl (not ledger.jsonl). Installing this
plugin never touches bring-loop's own files, hooks, or skills.
- Both keep running, unnagged by each other: bring-loop's SessionStart
brief and Stop nudge fire every session, same as always. This plugin's own
SessionStart hook stays silent unless a roll is actually open right now —
it is a status report, not a second daily nag.
- One outcome ledger, shared honestly: resolving a tick with
roll-resolve writes to the same bring/ledger.jsonl bring-loop reads —
a roll-produced sent counts toward the week's streams and the streak
exactly like any other logged action. The roll adds a session on top; it
does not fork the scoring.
- One queue, never duplicated: starting a roll does not copy or fork
bring/actions.md. It ticks over the same open queue, minus whatever it
has already surfaced this session.
5. Show them the shape
Walk through one real cycle so they see it end to end:
roll-start --reps 3 (or --minutes N) -> roll-tick (one bring, staged)
-> their word -> roll-resolve / roll-skip / roll-elapse -> roll-tick
again -> ... -> completed. Two sentences of contract: the roll surfaces and
stages one rep per tick inside a bounded session; you execute, and rolling
forward an unworked tick is not a failure — the roll remembers.
6. Optional wiring (their call)
roll-check gates ROLL-STATUS.md freshness and a handful of conformance
assertions (see SPEC.md's conformance gate section) — worth wiring into CI
only if they ask. Cadence itself is host-supplied: a manual roll-tick per
message, or their own /loop pointed at it — this plugin stays
timer-agnostic and never assumes a driver. Do not wire anything beyond this
project without being asked.
1---2name: kata-harness-setup3description: Set up the kata roll in a project that already runs (or is starting) the bring loop — confirm bring/ exists, explain where the roll's own ledger lives, walk through the opt-in timer, and make the two-plugin coexistence with bring-loop explicit. Use when the user says "set up kata-harness", "install the roll plugin", "add rolls on top of bring-loop", or asks how the timed roll relates to their daily bring.4---56# Kata-harness-setup — install the roll runner alongside bring-loop78A roll never runs on its own queue — it ticks over the **same** `bring/`9queue bring-loop already reads. Setup here is mostly about making sure that10foundation exists, then explaining the one new file and the one new plugin11surface layered on top of it.1213## 1. Make sure the bring queue exists1415Check for `bring/actions.md` in the project root.1617- **Missing:** scaffold it with bring-loop itself — the queue format has one18 owner, and it is not this plugin. Invoke the bring-loop plugin's19 `bring-setup` skill: its `bring_core.py init` creates `bring/actions.md`20 and `bring/ledger.jsonl`, never overwriting anything that already exists.21 If bring-loop isn't installed yet, install it first22 (`/plugin install bring-loop@dojo-genesis` — the same marketplace this23 plugin ships from). kata-harness deliberately ships no second init: its24 `scripts/` holds only `roll_core.py`, whose roll verbs assume the queue25 already exists.26- **Present:** leave it alone. If bring-loop is already installed and in use,27 there is nothing to scaffold — the roll rides on the existing queue as-is.2829If the queue is genuinely empty (a fresh init, or an existing one with30nothing in it), this is the moment to seed 2-3 real outward actions — ask the31user what they're sitting on, the same question bring-setup asks. A roll over32an empty queue has nothing to surface.3334## 2. Where the roll's own ledger lives3536Nothing to create by hand — the first `roll-start` call creates37`bring/roll-ledger.jsonl` on its own, the same way logging a bring creates38`bring/ledger.jsonl` on its own. Explain the shape of the file split, since39it's the one thing genuinely new here:4041| File | Owner | Concern |42|---|---|---|43| `bring/actions.md` | human + agent (unchanged) | the queue — the roll never writes here |44| `bring/ledger.jsonl` | bring-loop, append-only | outcome content — `sent`/`decided`/`closed`/`shipped`/`skipped`, shared by both plugins |45| `bring/roll-ledger.jsonl` | kata-harness, append-only | session shape — ticks, targets, cadence, pauses; a bookkeeping axis of its own, never blended into the outcome streams |46| `bring/ROLL-STATUS.md` | kata-harness, generated | the current-roll face — regenerate with `roll-status`, never hand-edit |4748## 3. The opt-in timer4950**Model/self-paced by default** — no clock, no daemon, just tick when you're51ready.5253- `--timer` on `roll-start` turns on an in-session display only: count-up if54 no duration is set, count-down if a cadence (e.g. `--cadence 25m`) is set.55- Say plainly that this is a **display, not a process** — it starts no clock56 that outlives the session, and expiry never resolves, skips, or advances a57 tick by itself. That stays true whether `--timer` is on or off.5859## 4. Coexistence with bring-loop — say this explicitly6061- **Distinct everything, on purpose:** plugin `kata-harness` (not `bring`),62 skills `kata-harness` / `kata-harness-setup` (not `bring` / `bring-setup`),63 ledger `bring/roll-ledger.jsonl` (not `ledger.jsonl`). Installing this64 plugin never touches bring-loop's own files, hooks, or skills.65- **Both keep running, unnagged by each other:** bring-loop's SessionStart66 brief and Stop nudge fire every session, same as always. This plugin's own67 SessionStart hook stays silent unless a roll is actually open right now —68 it is a status report, not a second daily nag.69- **One outcome ledger, shared honestly:** resolving a tick with70 `roll-resolve` writes to the *same* `bring/ledger.jsonl` bring-loop reads —71 a roll-produced `sent` counts toward the week's streams and the streak72 exactly like any other logged action. The roll adds a session on top; it73 does not fork the scoring.74- **One queue, never duplicated:** starting a roll does not copy or fork75 `bring/actions.md`. It ticks over the same open queue, minus whatever it76 has already surfaced this session.7778## 5. Show them the shape7980Walk through one real cycle so they see it end to end:81`roll-start --reps 3` (or `--minutes N`) -> `roll-tick` (one bring, staged)82-> their word -> `roll-resolve` / `roll-skip` / `roll-elapse` -> `roll-tick`83again -> ... -> `completed`. Two sentences of contract: the roll surfaces and84stages one rep per tick inside a bounded session; you execute, and rolling85forward an unworked tick is not a failure — the roll remembers.8687## 6. Optional wiring (their call)8889`roll-check` gates `ROLL-STATUS.md` freshness and a handful of conformance90assertions (see `SPEC.md`'s conformance gate section) — worth wiring into CI91only if they ask. Cadence itself is host-supplied: a manual `roll-tick` per92message, or their own `/loop` pointed at it — this plugin stays93timer-agnostic and never assumes a driver. Do not wire anything beyond this94project without being asked.