arizuko

arizukoproducts › Taxonomy chat (Marble) — setup

Taxonomy chat (Marble) — setup

Take any open dataset, bundle it into a folder, put a public chat link in front of it, and run it on a cheap model. This guide uses the Marble Skill Taxonomy, but the shape fits any JSON dataset an agent can query with jq.

prerequisites

1. register the public group

Add a folder for the bot and a route that sends its web-chat JID to it. The arizuko group add command writes the group row, seeds the folder, and adds the catch-all route in one step:

arizuko group <instance> add web:<folder> <folder>

# example: a public sub-folder under an existing world
arizuko group krons add web:krons/public/marble krons/public/marble
Two gotchas. The CLI resolves the data dir from DATA_DIR, falling back to the current working directory. If the instance .env doesn’t set it, prefix the command: DATA_DIR=/srv/data/arizuko_<instance> arizuko group …. And if the parent group has max_children=0, the agent-side register_group tool refuses — this host CLI path bypasses that gate, so create sub-groups from the host.

2. bundle the dataset

Drop the JSON into the group folder. The agent reads it from ~/taxonomy/ inside its container, which maps to groups/<folder>/taxonomy/ on the host:

mkdir -p /srv/data/arizuko_<instance>/groups/<folder>/taxonomy
cp topics.json dependencies.json clusters.json \
   /srv/data/arizuko_<instance>/groups/<folder>/taxonomy/

Keep the files owned by the instance user (the same owner as the rest of groups/). The dataset is read-only reference — the agent queries it, never writes it.

3. write the brain

The operator-owned CLAUDE.md in the group folder is the agent’s instructions: who it is, what it answers, and how it cites. Keep it short — every line is re-read each turn.

cat > /srv/data/arizuko_<instance>/groups/<folder>/CLAUDE.md <<'EOF'
# Marble Taxonomy Chat

I am the "Talk to the Taxonomy" assistant - a public web chat over the
Marble Skill Taxonomy v1.

## What I do

I answer questions about what children learn and in what order by
searching `~/taxonomy/*.json`. I trace prerequisite chains, list what a
topic unlocks, filter by subject/age, keep answers tight, and cite topic
names.

## Data

Data (c) Marble (withmarble.com), CC BY-SA 4.0.

## Running

I run on a small model and reply concisely and friendly to visitors via
the web chat widget.
EOF

Identity lives here, in CLAUDE.md — this product carries no PERSONA.md. Add one only if you want a distinct voice register on top of the instructions.

4. pin the model to Haiku

A public lookup bot doesn’t need a frontier model. Pin it to Haiku in the group settings — /dash/groups/<folder>/settingsModelClaude Haiku 4.5. That writes groups.config.$.model, which routd forwards to the container as ARIZUKO_MODEL on the next turn.

Headless equivalent (writes the same JSON the dropdown does, on the owning daemon’s DB):

sqlite3 /srv/data/arizuko_<instance>/store/routd.db \
  "UPDATE groups SET config = json_set(COALESCE(config,'{}'), '\$.model', 'claude-haiku-4-5-20251001') WHERE folder='<folder>';"

5. trim the skills

A fresh container spawns per turn with no prompt cache, so every seeded skill’s SKILL.md is re-indexed into the system prompt each answer. A read-only taxonomy bot needs almost none of the ~95 stock skills. Uncheck all but a small keep-set at /dash/groups/<folder>/settings — keep self, migrate, and hello; disable the rest. Smaller prompt, faster turns.

How disabling works. The dashboard drops a .disabled marker in each unchecked skill’s dir under groups/<folder>/.claude/skills/. On the next spawn, seedSkills removes that skill’s SKILL.md so Claude Code stops indexing it. Re-enable is one rm of the marker. Auto-migrate is unaffected — it rides the MIGRATION_VERSION file and the force-synced migrate skill, both independent of the markers.

6. mint the public chat link

arizuko token <instance> issue chat <folder>
# prints the token; the chat URL is https://<WEB_HOST>/chat/<token>/

That URL is the whole front door — open it in a browser and ask a question, or embed the widget in any page with the chat SDK. No adapter, no login.

7. verify

tuning

go deeper