The tasks build the agent loop on M2a's client: channel messages and
the usage record in proto, four config tables, the tool port and
registry with find_tool and call_tool, the baseline and replay, the
session store, the turn loop with its limits and the append-only
property test, the channel server, loopd serve, bxctl chat, and the
device checks including a four-turn conversation with a restart.
Checked against a private reference implementation: the gate passes
after every task in order, the new suites pass under CPU load, and the
reference passes make verify-device on straylight with no cache loss.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The branch passes every check, including make verify-device on
straylight and repeated timing runs under load. Reading and probing
found that inferproxy does not pass an upstream close on to a client
that is still sending, and that the chunked body reader delivers a
stream only when the caller's buffer fills or the stream ends. Both
were also gaps in the tasks and tests, so tasks 14 and 15 carry the
fixes with new tests checked against the reference.
The Model column is corrected: tasks 04 to 06 and 08 to 13 were Ornith.
Lessons gain four implementer tips and five task-writing tips; three
rules are promoted to AGENTS.md.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Implemented SlotGate (one request in flight per server slot, FIFO queue,
bounded) and chat_with_retry (retry only server-gone errors, jittered
backoff within a window and attempt budget). chat acquires the gate and
maps GateFull to Busy; Client gained a gate field.
Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)
The implementer log gains a Model column, filled by the owner. Tasks so
far: M1 and M2a 01 to 06 by Laguna S 2.1, M2a 07 by GLM-5.3. The commit
trailer no longer names a model.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The tasks build the inference path: emsha-backed SHA-256, inferproxy,
config, a hand-written HTTP and SSE client, request building, delta
assembly, the chat state machine, the thinking cap, the slot gate with
retry, the startup self-test and on-device verification.
Everything the tasks copy in was checked against a private reference
implementation: the gate passes after each task in order, the timing
tests pass repeatedly under CPU load, and the reference passes the
self-test and all four device checks on straylight. Expected results
for the recorded streams were derived by a separate script.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Requested by the owner so that future readers, agents included, learn
what each piece is for first. No behaviour changes.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A request pinned to a busy slot receives no bytes until the slot frees.
reasoning_control ends a thinking block on demand; the capped turn is
re-read once on the next request.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Tasks 08 and 09 pass the checklist and the reviewer's probes, so M1 is
complete. docs/implementer-lessons.md turns the review findings into
tips for the implementer and for task writing, each tied to its
evidence, with a column to record whether the defect comes back.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The branch passes the checklist: seven commits, copied files unchanged,
gate and audit green. Reading and probing found that AuditRecord and
ToolCall accept unknown fields, that large Timestamps panic when
formatted, and that the dependency-direction scripts miss table-form
dependencies and pass when their inputs are missing. The last two
families were gaps in the tasks, not only in the code.
Tasks 08 and 09 carry the fixes, defined by an exhaustive unknown-field
test, a bounded-Timestamp test and an extended gate-script self-test.
All three were checked against the reference implementation and fail on
the current branch.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Seven task files for the implementing model under docs/plans/M1/, with
the test files, byte-exact fixtures, Makefile, deny.toml and gate-script
self-test they copy into place. All of it was verified against a private
reference implementation: the gate passes after every task in order.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Threat model, data classes and provenance, approvals, IPC framing and
socket topology, the proto type list, log file rules, runtime layout,
the M1 gate, and how work is handed to the implementing model.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
spike/m0.py is throwaway. Findings are in docs/inference-contract.md:
cache reuse and tool parsing pass through chat-completions, the tools
array must stay fixed per epoch, and the shared router cannot meet the
slot contract. Clean throughput and slot pinning are still open because
another session was using the GPU.
docs/decisions.md lists the brief changes this implies as proposals.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/design.md now holds only the design brief, as the pack intended.
The session prompt and milestone table move to docs/milestones.md
verbatim. Open decisions move to docs/decisions.md, which also records
the four decisions made at kickoff.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
docs/design.md is the kickoff pack as written: design brief, session 1
prompt, and milestone outline. Committed unmodified so later edits to
the brief show up as diffs.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>