arizuko › products › 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
- A running arizuko instance with a public hostname (
WEB_HOST). See the getting started guide. - The
arizukobinary andarizuko-antagent image built (make build,sudo make images,sudo make agent). - Anthropic API access. No web-search egress is needed — the dataset is bundled.
- A dataset as one or more JSON files. Here:
topics.json,dependencies.json,clusters.jsonfrom the Marble Skill Taxonomy.
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
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>/settings → Model
→ Claude 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.
.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
curl -sI https://<WEB_HOST>/chat/<token>/ | head -1returns200.- Ask a question in the widget; a reply lands in a few seconds.
- Confirm the model actually took:
sudo journalctl -u arizuko_<instance> --since "5 min ago" | grep '<folder>' | grep 'models='showsmodels=claude-haiku-4-5-20251001, not the opus default. - Check for red flags:
… | grep -iE 'error|fatal'.
tuning
-
Answer length and citation. Edit the group
CLAUDE.md. A public bot wants short, cited answers — say so explicitly there. -
Latency. The two biggest costs are the fresh-container
cold start (~3.5s) and the number of sequential
jqround-trips the agent makes per answer. Steps 4 and 5 cut the model and prompt size; to cut round-trips, pre-digest the dataset (a summary file, precomputed indices) so common questions answer in one or two calls instead of ten. -
Rate limiting. Set
max_childrenon the group at/dash/groups/<folder>/settingsto cap concurrent turns — each visitor question is one container. -
Swap the dataset. Nothing here is Marble-specific.
Replace
taxonomy/*.jsonwith any dataset, rewrite theCLAUDE.mdto describe it, and the same bot answers over your data.
go deeper
- Taxonomy chat (Marble) — intro
- tokens — web-chat and hook token minting
- chat SDK — embedding the chat widget
- CLI reference — full command list
- supermarket agent — the live-web-search sibling of this shape