Repository navigation
EPIC 0.73.0: Agent Ready — apr serve as the one agent gateway (E-1/E-2, R-1..R-9) #5348
Copy link
Copy link
Open
4 / 64 of 6 issues completedOpen
4 / 64 of 6 issues completed
Copy link
Labels
Milestone
Description
owner: aprender-w5018 (set 2026-10-19 by aprender-triage-worker at the cop's word; picks up children only as batch constituents after its current timed task)
Tracker for the "Agent Ready" bar, moved from 0.72.0 to 0.73.0. The plan, with each row's measurable done-when and falsifier, is docs/specifications/EPIC-0.72-agent-ready-plan.md.
apr serve becomes the one gateway an agent harness can drive.
Exit bar
- E-1: one conformance suite passes on every model × backend that the release certifies. Today no suite exists.
- E-2: an agent harness completes a tool-calling task end to end, with 2 green receipts: Claude Code via
/v1/messages, and an OpenAI-client harness. Each receipt carries the gateway's binary sha and the transcript hash.
Rows
- R-1:
/v1/messagesAnthropic Messages adapter inapr serve: non-streaming and SSE,tool_use/tool_resultblocks,stop_reason. Not built; main has no route. - R-2: tool calling on the OpenAI shape, the Anthropic shape and
--ollama-compat. fix(serve): forward tools/tool_choice and tool_calls over apr serve --ollama-compat #3825 is closed; the conformance cases are owed. - R-3: reproducible sampling. SafeTensors run and every AprTransformer caller never sample: run .safetensors is hard-greedy (CPU) / takes no sampling params (CUDA); AprTransformer's sampler takes the ARGMAX of top-k survivors #3760, serve APR Q4K GPU chat samples with a wall-clock-hash RNG:
seeddoes nothing, sampled output is unreproducible (sample_with_temperature) #3786 and apr run --temperature T is silently GREEDY: --top-k defaults to 1, so a sampling flag given alone has no effect — a flag that does nothing, with no warning #3754 are closed; the suite's seed case is owed. - R-4: honest telemetry: exact
usage, and tok/s that excludes load time. apr run --json: add prompt_tokens (and completion_tokens) so consumers can see how many tokens the model actually read — RAH asked (#3716) #3718 and apr run --format json tok_per_sec counts model load + F2 validation as inference (0.2 tok/s reported vs 38.6 measured decode) #3981 are closed; the cases are owed. - R-5: serve surface:
[DONE]/finish_reasonon the.apr, GGUF and safetensors routers. apr serve: APR-CPU fallback and safetensors routers have no GET / route index and SSE ends without finish_reason/[DONE] — every .apr/.safetensors serve cell is RED #3979, apr code hardcodes 'apr serve --gpu' (no CPU lane, no --max-tokens/thinking flag) and picks a colliding port 19384+pid%1000 #3978 and qwen3moe CUDA reaches run+qa only: chat rc 8, serve 501/500, code rc 1 — serve loads no mapped model and would route MoE to the CPU path #3987 are closed; the cases are owed. - R-6: the conformance suite itself: CPU, small model, on PRs that touch
aprender-serve, plus a nightly GPU matrix. Not built. It starts as a non-blocking check until it has three green nights. - R-7: MCP server conformance with the inspector. feat(mcp): a thin single-model MCP server for SetFit #2794 is closed; the inspector run is owed.
- R-8: one gateway per host, pinned by binary sha:
GET /or/healthreturnsbinary_sha256, and consumers refuse a mismatch. Not built. - R-9: ratchet slice 3 of 5 (see PMAT-3997: DEBT-RATCHET-001 — step-1 quorum research plan for the 0.70→0.74 debt ratchet (#3997) #4003).
Every R-row's done-when needs the R-6 suite, so R-6 and R-1 go first.
Not the same as #4000, which was renamed "Train What You Serve" and stays in 0.72.0.
Children tracked here (REDUCE-1022)
- EG-3: Serve #4902 — EG-3: Serve (closed: not planned)
- EG-4: CUDA on sm_89 and sm_121 #4903 — EG-4: CUDA on sm_89 and sm_121 (closed: not planned)
- EG-5: Refusals, apr qa, the ladder #4904 — EG-5: Refusals, apr qa, the ladder (closed: not planned)
- EG-6: Model ops round trip #4905 — EG-6: Model ops round trip (closed: not planned)
- ci(lab): nightly fast-verbs CRUX smoke + tok/s on the ARM64 CUDA edge runner, ranked gap list #5254 — ci(lab): nightly fast-verbs CRUX smoke + tok/s on the ARM64 CUDA edge runner, ranked gap list (closed: not planned)
- apr serve on CUDA: batch concurrent Qwen3.5 requests correctly #5312 — apr serve on CUDA: batch concurrent Qwen3.5 requests correctly (open)
- apr serve stop handling: stop on every EOS and stop string, on every route and backend #5313 — apr serve stop handling: stop on every EOS and stop string, on every route and backend (closed: not planned)
- EmbeddingGemma 2 in apr: load, embed, serve, CUDA and the model-ops round trip #5319 — EmbeddingGemma 2 in apr: load, embed, serve, CUDA and the model-ops round trip (closed: not planned)
- apr serve request path: BPE tokenization, graceful drain, oversize prompts and correct CUDA request batching #5329 — apr serve request path: BPE tokenization, graceful drain, oversize prompts and correct CUDA request batching (open)
- R-6: agent conformance suite: runner, OpenAI + Anthropic cases, receipt per case × model × backend #5349 — R-6: agent conformance suite: runner, OpenAI + Anthropic cases, receipt per case × model × backend (open)
- apr serve /api/chat stream says done_reason stop when num_predict truncates (R-5, Ollama shape) #5357 — apr serve /api/chat stream says done_reason stop when num_predict truncates (R-5, Ollama shape) (closed: not planned)
- perf(ci): drop X64 from workspace-test-shard + x86-main so ARM64 gx10 serves 91% of runner-minutes #5432 — perf(ci): drop X64 from workspace-test-shard + x86-main so ARM64 gx10 serves 91% of runner-minutes (open)
- apr serve: Qwen3.5 session reuses state only when a prompt extends the previous one; a shared system+tools prefix is lost whenever the tail differs #5476 — apr serve: Qwen3.5 session reuses state only when a prompt extends the previous one; a shared system+tools prefix is lost whenever the tail differs (closed: not planned)
- serve: GPU-batched, CUDA and APR/SafeTensors GPU routers are built without AuthGate (APR_API_KEY_HASH ignored) #5478 — serve: GPU-batched, CUDA and APR/SafeTensors GPU routers are built without AuthGate (APR_API_KEY_HASH ignored) (open)
- Complexity debt blocks edits: scan_source_fns (aprender-contracts build_helper) and emit_contract_* (aprender-serve build.rs) #5911 — Complexity debt blocks edits: scan_source_fns (aprender-contracts build_helper) and emit_contract_* (aprender-serve build.rs) (closed: not planned)
- apr serve: chat completions with array-form message content fail with HTTP 422 (Qwen Code can't use apr serve) #5919 — apr serve: chat completions with array-form message content fail with HTTP 422 (Qwen Code can't use apr serve) (closed: not planned)
- epic: apr code eval — our own coding-agent benchmark (pv ontology, Rust harness) #5281 — epic: apr code eval — our own coding-agent benchmark (pv ontology, Rust harness) (closed: not planned)
- epic: APR-EMBED-001 — EmbeddingGemma 2 on every apr verb #4898 — epic: APR-EMBED-001 — EmbeddingGemma 2 on every apr verb (closed: not planned)
Reactions are currently unavailable
Activity
noahgift commentedon Oct 14, 2026
R-3/4/5/7/8/9 state, read 2026-10-14 16:20Z on main @ 909b977. Lead: aprender-w4664. Staffed: R-1 wmainred, R-2 wprodmodels, R-6 cd.
usagecases on both shapes, plus the negative control (an off-by-one count goes RED). Tok/s excluding load has no serve case.[DONE]last,finish_reasonset) on the.apr, GGUF and safetensors routers, plus the dropped-finish_reasonnegative control. The cd R-6 plan already names that mutant, so these cases can ride R-6's S1.apr mcpis registered inapr-cli-commands-v1.yamlbinary_sha256anywhere inaprender-serve(onlyapr bench/test_llm_band)GET /or/healthreturnsbinary_sha256; a consumer refuses a mismatch (RED) and accepts a matchE-1 waits on R-6. E-2 (two agent-harness receipts) waits on R-1 and R-2, and has no owner.
Rows that need an owner: R-3, R-4, R-5, R-7, R-8, and E-2. R-9 needs #3997's owner to take slice 3 for 0.73.
Agent: aprender-w4664
noahgift commentedon Oct 14, 2026
R-6 (agent conformance suite): #5349. S1 is on branch feat/r6-conformance-5349; the demo baseline is 5/12, and the 7 fails map to R-1..R-3 (see #5349).
test(serve): replay the Anthropic SDK's own requests against /v1/mess…
noahgift commentedon Oct 14, 2026
R-8 (gateway names its binary; consumers refuse a mismatch): branch
feat/5348-r8-binary-sha256@ 2258513, pushed, no PR yet.GET /on everyapr serverouter (realizar router, APR-CPU and safetensorsIndexedrouters) carriesbinary_sha256= sha256 of the running executable; the wgpu router, which has noGET /, carries it on/health.LlmClient::require_binary_sha256(expected)readsGET /then/healthand returnsBinarySha256Mismatchon a wrong, null or absent sha; an empty pin never matches; case-insensitive hex.Evidence at 2258513:
route_surface_2376(serve)root_index_carries_the_running_binary_sha256tests_route_index_3979(cli)GET /sha checked against an independent sha256 of the test binaryllm::client(test-lib)r8_*testsGET /sha → NoneSpec line: "RED wrong sha; right sha passes" — both directions are tested above. Unblocks the E-2 receipts' binary-sha field.