Rowan Advisory
Free to take · MIT licensed← the frame behind this: A verifiable core for one
A free starter kit for running Claude Code as a thinking system, with every file laid out so you can read it before you run it.
It gives your Claude Code three automatic habits and a helper, so the setup remembers, improves, and never sends anything out without your say-so, instead of starting cold every time.
git push), it pauses and asks you to confirm. Going public stays a human decision, never an automatic one. You generalise it to your own outward steps.It's the difference between a tool you re-explain yourself to every morning, and a system that holds your context and quietly keeps it current. And because it's a plugin, you can hand all of that to someone else in a single folder.
You don't need the plugin, or a terminal, to get going. One click copies the whole frame behind this, A verifiable core for one, ready to paste into whatever AI you already use. It scores your setup against nine checks, tells you the single most useful thing to build next, and helps you build it. No install.
Then paste it into Claude, ChatGPT, or whatever you use, and hit send.
That's the core move, and for most people it's enough. The plugin below just makes those same habits run on their own, every session, once you're in Claude Code.
When you're ready for the automatic version, here's the whole thing in the open. A plugin in Claude Code is just a folder it knows how to load: a little config, the hooks, and a skill. Nothing is hidden or compiled. Read all of it in a couple of minutes, decide if you trust it, and only then install it. It's MIT licensed: take it, change it, ship it.
{
"name": "rowan-starter",
"version": "0.3.0",
"description": "A working Claude Code setup, packaged. The lean-OS
pattern + two self-improving hooks (start-load, stop-reflect) + a
boundary guard that asks before you publish + one setup skill.",
"author": { "name": "Rowan Advisory", "url": "https://rowanadvisory.co.nz" }
}
{
"SessionStart": [
{ "hooks": [ { "type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/session-context.sh" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/session-reflect.sh" } ] }
],
"PreToolUse": [
{ "matcher": "Bash", "hooks": [ { "type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/hooks/publish-guard.sh" } ] }
]
}
#!/bin/bash # SessionStart — load the right context every session, deterministically. today=$(date +%Y-%m-%d) ctx="Today is ${today}. File durable learnings (facts, decisions, preferences, state changes) into your memory/context layer as they occur, don't wait to be asked. Your context files are the source of truth; if anything conflicts, they win." # hand that text to Claude Code as session context /usr/bin/python3 - "$ctx" <<'PY' import json, sys print(json.dumps({"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": sys.argv[1]}})) PY exit 0
#!/bin/bash # Stop — the self-improving half. Reflects once per working # session. Loop-guarded + debounced. It only PROPOSES. input=$(cat) # rail 1: if already in a reflection pass, stop (no loop) active=$(printf '%s' "$input" | /usr/bin/python3 -c \ 'import sys,json; print(json.load(sys.stdin).get("stop_hook_active", False))') if [ "$active" = "True" ]; then exit 0; fi # rail 2: fire at most once every 30 min (1800s) stamp="$HOME/.claude/.last-reflect-rowan" now=$(date +%s); last=0 [ -f "$stamp" ] && last=$(cat "$stamp" 2>/dev/null || echo 0) if [ $(( now - last )) -lt 1800 ]; then exit 0; fi echo "$now" > "$stamp" # the proposal handed back to Claude Code /usr/bin/python3 <<'PY' import json reason = ("Session reflection. Before ending: scan this session for anything DURABLE: a changed fact, a decision, a new preference, a state change worth keeping. If yes, file it now, then stop. If nothing durable changed, just stop, don't invent something.") print(json.dumps({"decision": "block", "reason": reason})) PY exit 0
#!/bin/bash
# PreToolUse(Bash) — the boundary guard. Ask before a command
# that PUBLISHES. Generic by design; make it yours.
input=$(cat)
cmd=$(printf '%s' "$input" | /usr/bin/python3 -c \
'import sys,json; print(json.load(sys.stdin).get("tool_input",{}).get("command",""))')
case "$cmd" in
*"git push"*)
/usr/bin/python3 <<'PY'
import json
print(json.dumps({"hookSpecificOutput": {
"hookEventName": "PreToolUse",
"permissionDecision": "ask",
"permissionDecisionReason": "This publishes (git push). Confirm you
want to send it out. Publishing should be your call, not automatic."}}))
PY
exit 0 ;;
esac
exit 0
--- name: substrate-setup ---
# Substrate setup — a guided walk-through
A conversation you run FOR the user: you ask, you draft, you
write the files, you confirm. They never edit a file by hand.
Run it one step at a time.
Before you start
Say what you'll build: one short "who I am, how I work" file
Claude reads every session. Ask where it lives (default
~/.claude/CLAUDE.md). Don't stall on the choice.
1. Learn who they are
Ask, plainly: what do you do · who do you serve · how do
you like to be spoken to. Wait for answers.
2. Draft the always-loaded layer (keep it lean)
who I am · how I work · what's protected. Show the draft,
fix it together, write it only once they say it's right.
Rule: if a fact doesn't change most answers, it does NOT
go here.
3. The hooks already do their job
Nothing to touch. Offer to reword the session-start line
for them only if they want it.
4. The load-on-demand layer (when ready)
deeper IP, projects, people, tools in a context/ folder the
identity file points to. Pulled in only when its task comes
up. Offer to stub it; don't fill it on day one.
5. Keeping it true
overwrite the one file as it sharpens; keep a "what's
retired" list. No stale second copy.
Stop once the always-loaded file is right. That's the core.
Rowan Starter (v0.3, seed)
A working Claude Code setup, packaged so someone inherits the
harness on day one instead of rebuilding it. Free to take.
What's in it: three hooks (start-load, stop-reflect, publish-guard)
+ one setup skill.
What it deliberately is NOT: anyone's personal voice skills. It
bundles the shape, not the contents. Grow your own from here.
Install (in Claude Code):
/plugin marketplace add rachel-rowanadvisory/rowan-starter
/plugin install rowan-starter@rowan-starter
The hooks resolve their own location via ${CLAUDE_PLUGIN_ROOT}.
Licence: MIT.
New to Claude Code? Install it here first.
Then read the files above, and in Claude Code:
/plugin marketplace add rachel-rowanadvisory/rowan-starter/plugin install rowan-starter@rowan-starter. The three hooks switch on at your next session; the skill appears only when you're setting up.session-context.sh to your own voice. You never have to open the file yourself.You don't need to clone or download anything. The two commands above fetch it for you. The full source is on this page, and on GitHub if you want to fork it.
Once a setup works, you can hand the shape of it across in a folder this small, and the next person starts where you finished.
v2.6 · One-click copy at the stop point: the "Start right now" rung now leads with a "Copy the setup for your AI" button (copies the frame page + a short instruction preamble to the clipboard), so people who reach the kit and don't want the plugin have a real starting move instead of a dead end. The plugin is reframed as the "makes it automatic" second rung. v2.5 · Kit v0.3: the substrate-setup skill is now a guided wizard, a conversation Claude runs for you (asks, drafts your identity file, writes it) instead of a static reference you read. Updated the shown SKILL.md excerpt and caption, bumped the shown plugin.json and README to v0.3, and the seed callout to v0.3. v2.4 · Friendlier on-ramp: added a "Start right now, no terminal" rung so anyone gets the core habit before hitting the CLI, with the nine-check scorecard on the frame page as the no-install way in. Reframed the "edit session-context.sh" step as optional and Claude-assisted (you never open the file yourself). "Here's the whole thing in the open" became "The kit, in the open" as the second rung. v2.3 · Wording + blacklist pass: dropped ", in the open" from the heading (and the browser title) to a plain "Rowan Starter"; "What it actually does" → "What it does" (heading-narrate "actually"); cut the "That's the whole point" self-satisfied closer. v2.2 · Moved to the ip. spine (was on share.): this is a public kit meant to be found and cited, not a private one-to-one share. Added the Markdown twin and the "View as Markdown" link. v2.1 · Real install path: the repo now ships a marketplace manifest, so install is two Claude Code commands (/plugin marketplace add → /plugin install) instead of "drop it under your plugins path". Steps and the shown README updated to match. Added a "new to Claude Code? install it here first" pointer and dropped the clone/download step, since the two commands fetch the repo and the page already shows every file. v2 · Opened up as a free public kit (MIT): added the third hook (publish guard), links to the repo and to the frame "A verifiable core for one", and removed the private-note framing. v1 · rowan-starter v0.1 seed, every file shown, prepared for two collaborators.