v0.22.0
The remaining open issues after the self-audit, in one pass: the last Broad-Side roadmap item (#141), the retry serialization it uncovered (#206), the Codex verification gap (#218), and the repository's own workspace state (#276). A minor because codecarto_broadside and /codecarto-broadside gain parameters and the models listing changes shape.
Added
-
Broad-Side model selection on both surfaces.
core/already routed lenses through config.yaml'slens_models, but neither surface took a model, so themodelsaction helped choose one that could then only be applied by hand-editing the file.codecarto_broadsidesubmit takesmodelandlens_models(validated before anything is priced);/codecarto-broadsidetakes--model=IDand a repeatable--lens-model=LENS:ID, split on the first colon since a batch id carries one. A lens set both on the call and in the file takes the call's. Either path reaches the existing pre-flight — priced from the catalog, refused without structured-output support, clamped to the model's ceiling. #141. -
The
modelslisting is advisory, and says so. OpenRouter's catalog returns a:batchid for models whose Batch API then refuses the job (does not have a :batch endpoint), with nothing in the entry to tell them apart. A submit now records what the provider said about each model it posted to inbroadside/batch-endpoints.json— accepted, or refused for that reason; a quota or network failure says nothing about the endpoint — and the listing tags rows[no batch endpoint, refused <date>]/[batch OK <date>], untried rows carrying no tag. The MCP result carriescatalogAdvisory: trueand theendpointsmap. #141. -
Codex can be verified headlessly.
codex execrefuses MCP tool calls under its forcedapproval_policy=never; the per-server keymcp_servers.<name>.default_tools_approval_mode = "approve"lifts it without disabling the shell sandbox. Verified against this build (codecarto_initthencodecarto_statusthrough Codex 0.154.0 over stdio, workspace on disk, tool text echoed). CONTRIBUTING carries the recipe and what a failed approval looks like;docs/client-surfaces.mdreplaces the four-release "unknown" row with the run. #218.
Changed
-
The truncation retry runs as one batch per model. Each truncated slice used to be submitted as its own single-request batch and polled to terminal before the next was submitted — the serialization #136 removed from the lens pass, still present here — so a model that truncated 11 of 13 slices turned one collect into eleven sequential round trips and eleven of the sixteen concurrent-job quota. Bumped requests are now grouped by the model they must run on, submitted as one batch per model, polled together against the caller's remaining deadline, and matched back by
custom_id; per-slice bookkeeping is unchanged, the batch's cost is added once, and theonStatuslabel isretry:<model>. #206. -
Broad-Side refusals say what to do. A rejected lens in the submit report was a bare
rejected; it now carries the reason, and the two refusals a run meets in practice are explained: the missing batch endpoint above, andjob-submission-count— the per-account limit on concurrent batch jobs, which one job per lens fills after a few runs on the same key. The quota can also fill after acceptance, in which case the batch completes with every request failed and the lens readcompleted, 0 result(s)with the reason buried in<id>.error.json; collect now reportsall N request(s) failed: <reason>on that lens. #141. -
This repository's
.codecarto/workspace files are pristine. The trackedBACKLOG.md,THREAD_LOG.md, andcloseouts/carried a 2026-05-02 framework session. Init never copied them and the tarball negates them, so no user received them; but a fresh clone reported an existing workspace, the GUIDE's first-time heuristic was wrong from the first call, and the self-audit appended to that session's log. They now equal their templates,closeouts/holds a.gitkeep, and the framework's own history lives indocs/history/. No ignore-rule change: a user's backlog, log, and closeouts are their project's history and stay tracked. #276.