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
@@ -0,0 +1,31 @@
{
"id": "chatcmpl-1x092OMeEwmeoSzn7cE1GLkJlskrslR0",
"content": "The number of ways is the number of derangements of 8 elements, which equals **40320**. This counts permutations of 8 rooks (one per row and column) where none lands on the main diagonal (a fixed point would place a rook on the diagonal).",
"reasoning_content": "The question asks about 8 rooks on a chessboard that don't attack each other, with none on the main diagonal.\n\nRooks that don't attack each other means exactly one rook per row and one rook per column. This is equivalent to a permutation matrix. So the number of ways to",
"tool_calls": [],
"finish_reason": "stop",
"cache_n": 15,
"prompt_n": 55,
"predicted_n": 126,
"reasoning_tokens": 63,
"progress": [
[
70,
15,
15
],
[
70,
15,
66
],
[
70,
15,
70
]
],
"reasoning_events": 63,
"content_events": 60,
"tool_events": 0
}
@@ -0,0 +1,36 @@
{
"id": "chatcmpl-LMYge0IefEaKdgrXAjafeR0nrNUicPF2",
"content": "The box is made. (run 6aac4728)",
"reasoning_content": null,
"tool_calls": [],
"finish_reason": "stop",
"cache_n": 0,
"prompt_n": 46,
"predicted_n": 16,
"reasoning_tokens": 0,
"progress": [
[
46,
0,
0
],
[
46,
0,
15
],
[
46,
0,
42
],
[
46,
0,
46
]
],
"reasoning_events": 0,
"content_events": 15,
"tool_events": 0
}
@@ -0,0 +1,51 @@
{
"id": "chatcmpl-l28a5WTzw2ZnKeMg92QlUvh4jZ1Tys3u",
"content": "ok (run 6aac47",
"reasoning_content": null,
"tool_calls": [],
"finish_reason": "length",
"cache_n": 15,
"prompt_n": 7029,
"predicted_n": 8,
"reasoning_tokens": 0,
"progress": [
[
7044,
15,
15
],
[
7044,
15,
2063
],
[
7044,
15,
4111
],
[
7044,
15,
6159
],
[
7044,
15,
6528
],
[
7044,
15,
7040
],
[
7044,
15,
7044
]
],
"reasoning_events": 0,
"content_events": 8,
"tool_events": 0
}
@@ -0,0 +1,31 @@
{
"id": "chatcmpl-oSb4bEgcGEBGNn7Bn6LXqGrh20qMbo4f",
"content": "17 * 23 equals 391.",
"reasoning_content": "17 * 23. Let me compute: 17 * 23 = 17 * 20 + 17 * 3 = 340 + 51 = 391.\n",
"tool_calls": [],
"finish_reason": "stop",
"cache_n": 15,
"prompt_n": 40,
"predicted_n": 64,
"reasoning_tokens": 49,
"progress": [
[
55,
15,
15
],
[
55,
15,
51
],
[
55,
15,
55
]
],
"reasoning_events": 49,
"content_events": 12,
"tool_events": 0
}
@@ -0,0 +1,42 @@
{
"id": "chatcmpl-e9aFhGwvvU0YGs2GTOy83IQWDpVtNvcP",
"content": "I'll read the `/etc/hostname` file for you.\n\n",
"reasoning_content": null,
"tool_calls": [
{
"id": "wgE8iFI58Zni4WCTiCMNp4TzCcM8ou7F",
"name": "read_file",
"arguments": "{\"path\":\"/etc/hostname\"}"
}
],
"finish_reason": "tool_calls",
"cache_n": 0,
"prompt_n": 312,
"predicted_n": 41,
"reasoning_tokens": 0,
"progress": [
[
312,
0,
0
],
[
312,
0,
278
],
[
312,
0,
308
],
[
312,
0,
312
]
],
"reasoning_events": 0,
"content_events": 14,
"tool_events": 7
}
@@ -0,0 +1,31 @@
{
"id": "chatcmpl-1OEWBOVSZ1NthqfpaLOboUWbY9OJixgN",
"content": "Blue",
"reasoning_content": null,
"tool_calls": [],
"finish_reason": "stop",
"cache_n": 15,
"prompt_n": 29,
"predicted_n": 2,
"reasoning_tokens": 0,
"progress": [
[
44,
15,
15
],
[
44,
15,
40
],
[
44,
15,
44
]
],
"reasoning_events": 0,
"content_events": 1,
"tool_events": 0
}
@@ -0,0 +1,36 @@
{
"id": "chatcmpl-Po3MDTUPhb5xQOmzad8o6J8hupMG8HcE",
"content": "Green",
"reasoning_content": null,
"tool_calls": [],
"finish_reason": "stop",
"cache_n": 45,
"prompt_n": 30,
"predicted_n": 2,
"reasoning_tokens": 0,
"progress": [
[
75,
45,
45
],
[
75,
45,
47
],
[
75,
45,
71
],
[
75,
45,
75
]
],
"reasoning_events": 0,
"content_events": 1,
"tool_events": 0
}