Skip to content
Merged
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
through `web/src/catalogue.js`, generated from the Python and grouped by status, with a test that
fails when the generated file has drifted from `catalogue.py`.

- Two transcripts of `find-and-kick` piloted by **Qwen 2.5 Coder 14B on LM Studio**, seeds
5 and 6, land in `docs/assets/transcripts/` with a table reading them in
`docs/local-llms.md`, from the contributor whose memory feature they were recorded for.
The README, `local-llms.md` and PLAN.md no longer say "no transcript in this
repository". The pair is not a chain: they ran against different memory directories,
so one shows the write and the other the read, and neither shows a note surviving
from one run into the next. Thanks to [@Bayway](https://github.com/Bayway) (#7),
whose runs and whose transcripts these are.

### Changed

- **The LeRobot arm adapter stops taking the arm's word for four things it never said.**
Expand Down
10 changes: 6 additions & 4 deletions PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,12 @@ not before.
one is assumed equal to the training maximum, so every lateral request is sent at full
scale. The assumption is in `GAIT_THRESHOLD`'s note and in the state's `assumptions`, and
the fix is the same script that produced the other two.
- 🔨 **A transcript from a live local server** (Ollama, vLLM, llama.cpp). None on the dev
machine. PR #5's contributor reports `find-and-kick` against Qwen 2.5 Coder 14B through LM
Studio on seeds 5 and 6, both successes with memory read and written, but no transcript from
it is in the repository, so the README says exactly that.
- 🔨 **A transcript from a live local server other than LM Studio** (Ollama, vLLM,
llama.cpp). Still none on the dev machine. LM Studio is now covered: #7 landed two
`find-and-kick` transcripts against Qwen 2.5 Coder 14B in `docs/assets/transcripts/`,
read in [docs/local-llms.md](docs/local-llms.md). They are one model on one machine on
one afternoon, and they are not a chain, so what is still open is a second server and a
run where a note written by one run is read by the next.
- ⏸ **Exercise `remember` against a cloud model.** The scripted pilot has no script for it, so
`--provider fake` writes episodes and never a note.
- ⏸ Upload `docs/assets/social-preview.png` under Settings → Social preview. There is no API
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,7 @@ Version 0.8, simulator and mocks. What has been built, and how far each piece ha
| MCP server (`quackd serve-mcp`) | ✅ Claude Code and Claude Desktop, one robot or a flock with `--robots` or `--flock NAME` (nine `robot_*` tools, tested in process against the simulator and the mocks), no Claude Desktop session on record |
| Memory between runs (`quackd memory`, `remember`) | ✅ one JSONL file per `adapter:backend`, or per registered robot name, notes and run outcomes into the next prompt, tested end to end offline, 🧪 the `remember` tool itself exercised by one local model on one machine and by no cloud model ([docs/memory.md](docs/memory.md)) |
| Providers: eleven cloud vendors, fake | ✅ implemented, tested offline against stubbed SDK clients, with one hand curated catalogue of 115 model ids that `--model` is checked against before any call (`quackd list-models`), real model hero recording pending an API key |
| Local models (Ollama, vLLM, llama.cpp, LM Studio, any OpenAI compatible server) | ✅ implemented and tested against the OpenAI wire format, 🧪 one live run by a contributor (Qwen 2.5 Coder 14B on LM Studio, two seeds), no transcript in the repo, more welcome |
| Local models (Ollama, vLLM, llama.cpp, LM Studio, any OpenAI compatible server) | ✅ implemented and tested against the OpenAI wire format, 🧪 two live runs by a contributor (Qwen 2.5 Coder 14B on LM Studio, seeds 5 and 6), never on this machine, transcripts in [`docs/assets/transcripts/`](docs/assets/transcripts/), more welcome |
| Registered robots and flocks (`quackd robot`, `quackd flock`) | ✅ both command groups over `~/.quackd/robots.json` and `~/.quackd/flocks.json`, so `--robot NAME` means the same thing in every command that takes a robot and `--flock NAME` in `run` and `serve-mcp`, tested offline, `robot list --probe` answered by the mocks, 🧪 never pointed at hardware ([docs/registry.md](docs/registry.md)) |
| Pilot flocks, several robots on one task (`--flock NAME`) | ✅ one whole pilot per body, any backend, same or different bodies, 2 to 8, each with its own executor, allowlist, budget, heartbeat, memory and verdict, dividing the work with `tell` over the bus, 🧪 experimental, exercised on mock and sim2d bodies with the scripted pilot, by no real model and on no hardware |
| Coordinator flock, one referee instead (`--flock N`) | ✅ deterministic auction and bus, one planner LLM call at most, ground truth checked in tests, 🧪 experimental and sim2d Microducks only. Its capability aware role auction (spotter/kicker) is unit tested but has no bundled two-robot demo today |
Expand Down Expand Up @@ -630,7 +630,7 @@ The physics simulator costs what physics costs. Measured here on one Windows lap
- `grab` is open loop upstream and unreliable here on purpose. `fetch` says so in its file.
- A manifest can be smaller than the robot. The LeRobot arm's `real` backend claims no camera and no `pick` until it connects, and even then `pick` appears only when a policy object was injected in code. A rosbridge base over `ws` has no camera verbs unless the address names an image topic, and a ToddlerBot has no `move` unless a walk checkpoint is staged.
- The model catalogue is hand curated. It was read off the eleven vendors' own documentation on 2026-09-12 and it is a snapshot of that day, not a live list. A vendor can retire, rename or add an id between quackd releases, and this build would then refuse an id that is real and offer one that is gone. `quackd list-models` prints exactly what this build knows, which is the only thing `--model` accepts for a cloud vendor.
- Local model quality is unmeasured. The JSON text fallback and the one retry exist because small models often miss native tool calls. One contributor reports `find-and-kick` succeeding against Qwen 2.5 Coder 14B through LM Studio on two seeds, and no transcript from it is in this repository.
- Local model quality is unmeasured. The JSON text fallback and the one retry exist because small models often miss native tool calls. One contributor ran `find-and-kick` against Qwen 2.5 Coder 14B through LM Studio on two seeds, both successes, one of them reading an earlier run's memory. The two transcripts are in [`docs/assets/transcripts/`](docs/assets/transcripts/) and read in [docs/local-llms.md](docs/local-llms.md).
- The pilot flock takes any body and has run on `mock` and `sim2d` ones only: N simulated members are N separate worlds with no shared arena, it costs one budget and one model call per member per turn, and `tell` has been exercised by the scripted pilot and by no real model. The coordinator flock is simulator only, ships one choreography and exactly two roles (spotter and kicker, unit tested but with no bundled multi-role starter), and knows only the Microduck. Separation uses sim ground truth, and two robots share no frame of reference on hardware.
- LAN discovery and the MQTT bus have each been exercised once, on one machine. Nothing has crossed to a second machine, the MQTT bus is a library with no `--bus` flag, and a coordinator flock across machines also needs a clock across machines, which does not exist yet. A pilot flock needs no such clock and has simply never been tried across two.

Expand Down
2 changes: 2 additions & 0 deletions docs/assets/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
| `transcript-example.jsonl` | The transcript of that run: system prompt, each observation, each tool call, each verb result, token counts. Predates the trace kinds ([ADR-0029](../adr/0029-tracing.md)), so it carries `llm`, `verb` and `frame` and none of `llm_request`, `verb_start`, `gate`, `intent`, `verb_end` or `note`. Re-record it with the next hero, and move the replay test that reads it (`tests/test_cli_trace.py`) onto a fixture of its own first: it is the only old-shape transcript in the repository, and `quackd trace` has to keep reading one. | Copied from `runs/<timestamp>/transcript.jsonl`. |
| `flock.gif` | Flock mode: three ducks split the search, auction the kick, the closest one takes it. Left: the shared world. Right: the claimant's camera. | `quackd record flock-kick --provider fake --seed 3` — the **scripted planner and deterministic coordinator**, no LLM in the loop (docs/flock.md). |
| `open-duck.gif` | The 0.5 headline body: an Open Duck Mini v2 finds the ball and walks up to it, because it has no kick. Left: the world from above. Right: the duck's camera. | `quackd run open-duck-scout --robot open_duck:sim2d --provider fake --seed 3 --gif-size 320` — the **scripted pilot**, not an LLM, like every other asset here. |
| `transcripts/qwen2.5-coder-14b-lmstudio-find-and-kick-seed6-memory-read.jsonl` | A real local model piloting `find-and-kick`: Qwen 2.5 Coder 14B through LM Studio, seed 6, success in 8 steps, with an earlier run's episode in the prompt and no `remember` call. | `quackd run find-and-kick --provider lmstudio --model qwen/qwen2.5-coder-14b --seed 6`, copied from `runs/<timestamp>/transcript.jsonl` with the contributor's home directory removed from `duck_path`; `memory.path` is relative because the runs used `--memory-dir` next to the checkout, not `~/.quackd`. Read in [docs/local-llms.md](../local-llms.md). |
| `transcripts/qwen2.5-coder-14b-lmstudio-find-and-kick-seed5-remember.jsonl` | The same model and duck once `remember` sat in strategy step 5: seed 5, success in 4 steps, one `remember` call with a fact from the verb results. | Same command with `--seed 5`, same scrubbing. |
| `contributors.svg` | The circle of faces under *Contributing* in the README: everyone who has contributed, humans only, ordered by lines added, every avatar clipped to the same circle. | Generated by [`contributors.py`](contributors.py) from the GitHub contributors API, avatars inlined so the file needs no network. Regenerated by `.github/workflows/contributors.yml` on every push to `main` and weekly, committed only when it changes. |

Every recording here is driven by the scripted pilot rather than a model, and every caption
Expand Down
Loading