Add M2a plan: thirteen tasks, tests, fake server and recordings

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>
This commit is contained in:
2026-09-17 13:34:11 -07:00
co-authored by Claude Fable 5.1
parent a49db39b54
commit 76ccc251cd
56 changed files with 6367 additions and 3 deletions
+5
View File
@@ -37,6 +37,11 @@ Unix sockets. You are implementing it one task at a time.
no `thiserror`.
- Do not silence a lint with `#[allow(...)]` unless the task says so. Fix the code.
- Keep struct fields and enum variants in the order the task gives. The order is the wire format.
- Formats we define (config, grants, IPC messages, log records) reject unknown fields. Formats
another program defines (the inference server's JSON, later Mattermost's) ignore them: those
programs send fields we do not use and add more over time. Each task says which kind it handles.
- Everything read from a socket is bounded, and a number that came from a peer is never used to
index, allocate or cast without a check.
- Comments say why, not what. Match the amount of commenting you see in the task's examples.
## Lessons from earlier reviews