| name | kata-harness-setup |
| description | 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. |
| model | inherit |
| category | govern-publish |
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.