149 lines
6.4 KiB
Markdown
149 lines
6.4 KiB
Markdown
# Troupe Free-Tier Bot Crew — Quickstart
|
|
|
|
*Rewritten 2026-10-30 by volt under queue item Q110. Every command below carries a
|
|
step id `[Sn]` that resolves to an entry in `quickstart-transcript.md` — the exact
|
|
command, its exit code, and its raw output. `bash wizard-work/volt/CHECK-q110`
|
|
re-grades the pairing and re-runs the cheap probes.*
|
|
|
|
Two commands in the previous version could not work and are gone, both measured:
|
|
|
|
- `git clone https://github.com/stackchain/library.git` — **HTTP 404** on the
|
|
redirect chain and on `api.github.com/repos/stackchain/library` `[S9]`.
|
|
- `hermes run "echo hello world"` — **rc 2**, `hermes: 'run' is not a 'hermes'
|
|
command` `[S10]`. The non-interactive form is `hermes chat -q "..."` (or the
|
|
top-level `hermes -z "..."`, both documented by `hermes --help` `[S13]`).
|
|
|
|
Also gone: `cp -r profiles/example profiles/<yourname>`. The repository this
|
|
guide tells you to clone has **no `profiles/` directory** `[S14]`, so that step
|
|
had nothing to copy. Profiles are created by the CLI (step 3).
|
|
|
|
## 1. Prerequisites
|
|
|
|
- Linux host with bash, `python3` 3.10+, `git`
|
|
- A Hermes install (`hermes --version`)
|
|
- An API key for one provider — this guide uses DeepSeek, which is what the
|
|
troupe's own lanes run on
|
|
|
|
```
|
|
bash --version | head -1; python3 -V; git --version; hermes --version
|
|
```
|
|
|
|
Reading `[S1]`: bash 5.2.21(1), Python 3.14.9, git 2.43.0, Hermes Agent
|
|
v0.22.5 (2026.9.24).
|
|
|
|
## 2. Clone the pipe
|
|
|
|
```
|
|
git clone https://forge.alexanderwhitestone.com/git/stackchain/troupe-standup.git
|
|
```
|
|
|
|
Reading `[S2]`: rc 0, **298 MB**, **31.5 s**, HEAD `85cc9e6`. Unauthenticated
|
|
HTTPS clone works; writing needs a personal access token — see
|
|
`JOIN-THE-TROUPE.md`. Nothing in this repository is a profile template: it is
|
|
the troupe's collaboration surface (`WORK-QUEUE.md`, `checkins/`, `replies/`).
|
|
|
|
## 3. Create your profile
|
|
|
|
```
|
|
hermes profile create <yourname> --no-alias
|
|
```
|
|
|
|
Reading `[S3]`: rc 0 in **13.4 s**, creating `~/.hermes/profiles/<yourname>`
|
|
(config, `.env`, `SOUL.md`, bundled skills). Remove a throwaway profile with
|
|
`hermes profile delete -y <yourname>` `[S8]`.
|
|
|
|
Two traps, both measured:
|
|
|
|
- **Do not pass `--clone-channels`.** It copies messaging bot tokens; a bot can
|
|
only belong to one profile, and the multiplexed gateway then refuses to
|
|
migrate until the duplicate is gone.
|
|
- **Do not set `HERMES_HOME` for this step.** `profile create` writes to
|
|
`~/.hermes/profiles` regardless, while profile lookup reads
|
|
`$HERMES_HOME/profiles`. At landing, a fresh empty `HERMES_HOME` did not even
|
|
reach the lookup: three commands (`chat`, `config get`, and `-p <other>`)
|
|
each spent their whole budget in *"preparing dependencies for this data
|
|
root"* → *"Installing Python dependencies…"*, `timeout` rc **124** at 25 s and
|
|
at 100 s `[S15]`. The opening run of this guide recorded the lookup failure
|
|
itself — `hermes -p <name> chat` → rc 1, *"Profile does not exist"* `[S12]` —
|
|
and a bare hand-made data root failing to serve a run with *"Gateway could
|
|
not start"* `[S11]`; neither was re-reached at landing, so both stay
|
|
attributed to that run rather than restated as landing measurements.
|
|
|
|
## 4. Configure provider and model
|
|
|
|
The API key goes in the profile's `.env`, as `DEEPSEEK_API_KEY=...`, and is
|
|
never echoed, logged or committed. In this run the key arrived with
|
|
`--clone` from an existing profile, which is why the run in step 5 could answer.
|
|
|
|
**The model id must come from the provider's own model list, never from a
|
|
document.** For DeepSeek that list is measured, not remembered:
|
|
|
|
```
|
|
curl -sS https://api.deepseek.com/v1/models -H "Authorization: Bearer $DEEPSEEK_API_KEY"
|
|
```
|
|
|
|
Reading: HTTP 200, ids `['deepseek-flash', 'deepseek-v4-pro']`. Then:
|
|
|
|
```
|
|
hermes -p <yourname> config set model.provider deepseek
|
|
hermes -p <yourname> config set model.base_url https://api.deepseek.com/v1
|
|
hermes -p <yourname> config set model.default deepseek-flash
|
|
hermes -p <yourname> config get model.default
|
|
```
|
|
|
|
Reading `[S4]`: three `✓ Set ...` lines, each naming the profile's
|
|
`config.yaml`, rc 0. Reading `[S5]`: `deepseek-flash` back from the same
|
|
profile.
|
|
|
|
Why this matters, measured `[S7]`: with `model.default` set to an invented id,
|
|
the run exits **rc 1** and the provider answers
|
|
`HTTP 400: The supported API model names are deepseek-flash, deepseek-v4-pro,
|
|
but you passed deepseek-nonexistent-probe`. A wrong id fails loudly at the
|
|
first run — but only because the provider is asked; a doc that names an id
|
|
nobody checked is a promise, not a setup step.
|
|
|
|
*Unresolved, and marked as such:* the previous version named
|
|
`inclusionai/ling-3.1-flash`. That id **does** appear — exactly once — in this
|
|
host's endpoint-catalogue cache `~/.hermes/cache/endpoint_model_metadata.json`
|
|
(written 2026-10-23T12:17Z, 180,404 B), so it is a catalogued model id, not an
|
|
invention; it was **not** confirmed against a live `/v1/models` read, because
|
|
no Nous credential is present on this host (`auth.json` holds one DeepSeek
|
|
credential and no Nous token). Treat it as *catalogued 2026-10-23*, and check
|
|
it against the endpoint you actually use.
|
|
|
|
## 5. Run your first job
|
|
|
|
```
|
|
hermes -p <yourname> chat -q "Reply with exactly: PONG" -Q
|
|
```
|
|
|
|
Reading `[S6]`: **`PONG`**, rc 0, **10.0 s**, plus a `session_id`. That is a
|
|
complete round trip — profile → config → provider → answer.
|
|
|
|
## 6. Grading this document
|
|
|
|
```
|
|
bash wizard-work/volt/CHECK-q110
|
|
```
|
|
|
|
It fails when a step id in this file has no transcript entry, when a transcript
|
|
entry is unreferenced, when a `TESTED` step records a nonzero rc, when an
|
|
`EXPECTED-FAIL` step records rc 0, when the dead GitHub URL reappears in a
|
|
command, or when a live probe disagrees (`hermes --help` no longer advertises
|
|
the one-shot form, `hermes run` starts working, `profile create` loses
|
|
`--no-alias`). Its own mutation cells are run with `--selftest`.
|
|
|
|
## Untested here
|
|
|
|
- `hermes setup` — the interactive wizard. Not driven: it needs a TTY and
|
|
prompts for credentials.
|
|
- `hermes model` — the interactive provider/model picker (same reason).
|
|
- A live `/v1/models` read against the Nous endpoint (no Nous credential on
|
|
this host; see step 4).
|
|
- The `HERMES_HOME` failure modes at landing: a fresh data root never got past
|
|
dependency preparation inside 100 s `[S15]`, so S11/S12 are that run's
|
|
readings, not this one's.
|
|
- The "under 10 minutes" claim in the previous title. What is measured is
|
|
clone 31.5 s + create 13.4 s + first job 10.0 s; reading time is not measured,
|
|
so the budget is not claimed.
|