Repository navigation
io-cli 0.38.2 - #104
Merged
Merged
io-cli 0.38.2#104
Conversation
0.38.1 adopted its fallback scope — the speller, the gated-run bound and the io-harness pin — so everything else the 2026-09-05 field test found moves here rather than being thrown away. None of this is finished work; it is carried so 0.38.2 starts from it instead of from nothing. What is here, and what state it is in: - README and `docs/CONTRACT.md` reach ACP, the tool mask, the schema contract and `RunOutcome::SchemaUnsatisfied`, and the tap and marketplace appear with the commands that use them. Four gates in `tests/docs.rs`. Context Collapse is deliberately absent: `grep -rn "Collapse" src/ tests/` is zero hits, so naming it would have been a false sentence. - The home line is drawn only on a run that created or moved something, instead of on every invocation. - The wizard names the configuration already in force rather than always claiming a first run. - A fenced block draws no bare language-tag line. - A thought is committed above the prose it produced, not under it. - A spawned child's outcome is drawn as words rather than as a Rust `Debug`. - `lock::sweep` removes the lock files of finished sessions at startup. It deliberately does NOT remove a session's own lock on exit — that reintroduces the inode-split race `src/lock.rs` is designed to avoid. - Timestamps carry a UTC marker in the session surfaces and in `/export`. Local time is not reachable: it needs a clock this module may not read and a timezone database that would be an eleventh dependency. - Help text no longer narrates release history, each subcommand's example names its own subcommand, and `io config get` on an unknown key says so. Known incomplete, and why: - `f9_plugin_search_with_no_match_says_nothing_matched` is RED. The speller `marketplace::nothing_matched` exists; both call sites are in `src/main.rs` and were not wired. - `io mcp disable` still prints the io-harness 0.69.0 note. It lives in `src/servers.rs` and `src/pluginview.rs`. - `io resume --list` gains nothing here. io-harness publishes no reader for a run's goal and none for a run's `created_at`, and `run_file` answers the same root for every run in a workspace. - `/commit` still authors as `[email protected]` when no `[run.commit_identity]` is set. Reading the operator's git identity needs either a third permitted process spawn or an INI parser for `.git/config` and `~/.gitconfig`. - The `io-harness-0.78.0/...` citations throughout `src/` are stale against the 0.79.0 pin, so `tests/docs.rs`'s `f19` fails on this branch.
chore(packaging): point the tap and the bucket at 0.38.1
The branch was cut mid-0.38.1 at 56835e0 and is behind the released 0.38.1 tree by seven commits, which made 0.38.1's own live gate look like a deletion.
0.81.0 declares one behaviour break and it is Linux-only: the Landlock rung no longer grants the whole system temporary directory. This crate declares no writable root and its contained runs write inside their own workspace, so nothing here changes — stated rather than assumed, because an assumption is what this release exists to delete. Three kinds arrive with the pin and none of them fails to compile, because EventKind is non_exhaustive and a kind with no row falls through the wildcard drawn by nothing. triage::TRIAGE and acp_map::MAPPING gain context_ceiling, step_usage and image_attached; acp_map::TOOL_KINDS gains expand_tools. Two of the three dispositions are Silent and say why: the cached-versus-fresh split is a footer this release does not build, and a picture the run was handed needs a renderer rather than a line naming a picture it cannot show. Thirty-two io-harness-0.79.0 citations move to 0.81.0 with every cited line re-read against the new tree rather than the version string rewritten. Twelve had moved and were re-derived by finding the code the sentence is about; zero claims turned out to be false. Three more citations of withheld_sentence had no version prefix at all, so the gate had never seen them — and all three were already pointing at a closing brace rather than at the function. They are prefixed now, which puts them under the gate for the first time.
… the run announced io-harness 0.81.0 added Provider::context_window and Provider::max_output_tokens so a run's context ceiling can follow the model it is running. Both default to None. This crate wraps Provider four times — Vendor, Chain, Watched, Printable — and every one of them inherited that default, which answers for the wrapper instead of for the provider it wraps. The tree compiled with no error and no warning, the whole suite passed, and every run went on assembling under the 24,000-token fallback that harness release exists to end. Nothing could have caught it. The gate added here reads the method list out of the trait declaration in the locked harness and the wrapper list out of this file, so a method the harness adds is in force the moment the pin moves and a fifth wrapper is covered by existing rather than by being remembered. Chain answers the minimum across its links rather than the head's, for the same reason accepts_images is a conjunction: a run assembles its context once, and sizing to a large head before falling through to a smaller link overflows the request exactly when the first link has already failed. Delegating those two then makes this crate's own denominator wrong in the other direction — the harness derives a real ceiling while the TaskContract still carries the budget it was built with, so ctx N% would read near 100% on a run a fifth of the way into its window. EventKind::ContextCeiling is what ctx N% and the /context page now divide by, through one expression, because those two surfaces disagreed once already and the fix then was to make them one. src/main.rs also carries the argv-door half of the empty plugin search here; the two changes are in one file and are not worth an unbuildable split.
…ng held io resume --list showed thirteen parked runs as thirteen rows differing only by a run id and a step number. It carries each run's start time, goal and root now. io-harness published a reader for none of the three until 0.81.0, which is why this was named as carried when the release was outlined rather than promised; Store::run_goal and Store::run_created_at closed io-harness#258 and it is delivered here instead. A run started before io-harness 0.7.0 has no stamp in the store, and renders unknown rather than a date — None there means either no such run or a run older than the column, and the oldest rows are exactly the ones somebody is trying to identify. The goal is folded to one line and never clipped: N6 holds src/exec.rs to composing nothing, because a headless stream is not a viewport, and it caught the first draft doing it. io plugin search with no match answers on both doors. The argv door writes to stderr, so a pipeline still reads exactly the hits — the older reading was right about the stream and wrong about the silence. The two older-binary warnings name io-cli 0.29.0, the release that first understood the key, instead of io-harness 0.69.0 and 0.70.0. Same boundary, stated in the version an operator can check, and it no longer goes stale every time the pin moves. Three mechanisms the branch had built were held by nothing, and one of them said otherwise: src/wizard.rs cited a test as holding the driver to calling Wizard::over and no such test had ever been written, so the feature was one deleted line from reverting in silence under a comment asserting it could not. That gate, the sweep's and the UTC marker's are written here, and n6 now fails the build for any comment naming a test that does not exist. Four pre-existing tests encoded the behaviour the branch changed and were left failing: the home line, the fence's language row, the session stamp's length, and a clock read in the sweep's own test. The stamp's other arm asserted the string contains no T, which the UTC marker falsifies by itself. A guide page said io-harness emits no event of any kind when the agent is handed an image. Since 0.81.0 it emits one, so the page became false on the pin bump.
…laim it falsified The suite was green, clippy was green, the record was unwritten and a read-only review of the diff found six. The largest is that this release's headline was false. Delegating context_window through the four wrappers does not move any number an operator sees. In io-harness 0.81.0 exactly one shipped provider implements it — Compatible — and it answers only from a catalogue models() has already fetched on that same instance, which this crate never does on the provider it hands a run. OpenRouter, Anthropic and OpenAi declare neither method. So the chain answers None, the harness reports source: fallback, and the ceiling is the same 24,000 it was in 0.38.1. The delegation is still right and still necessary: a wrapper that answers the trait's own default on behalf of the provider it wraps is wrong whatever the inner provider says, and that defect compiled clean and passed everything. What is withdrawn is the consequence. The CHANGELOG, the contract's outcome, its migrations note and its second risk all said an operator would see a different percentage; they now say what is true and why. Filed upstream as io-harness#266 with both halves of a fix. Recorded as US-IO-CLI-0.38.2-I01. Neither gate could have caught it. The delegation gate is a source-text sweep that proves a method is written and never that it answers, and the ceiling test supplies its own 128,000 by hand. That is the lesson worth the record. Five more, all real: - Status::note_context and the /status label still divided by the contract's budget, so a fold arriving on EventKind::Compacted and the window drawn beside the percentage would both have disagreed with the page the moment io-harness does answer — three denominators for one word on one screen, which is the defect this field has already been fixed for once. - Chain::max_output_tokens took the minimum across links by analogy with the window. The reserve is subtracted rather than divided into, so the minimum leaves the most room and overflows on the link that answers most — the same failure the window's minimum prevents, arriving through the arithmetic running the other way. It takes the maximum, with a behavioural test the text gate structurally could not provide. - The --json keys were described as appended. serde_json without preserve_order emits an object in key order, so goal now precedes run_id; nullability is what makes an existing reader safe, not position. - io config get answering "no such key" where it answered "default" is a script-facing behaviour change the CHANGELOG did not mention.
…ring lock::sweep_DELETED contains lock::sweep, so the arm renaming the call survived and the gate would have passed over a driver that no longer sweeps. The needle carries its opening paren now. Same family as the permitted-spawn set being compared with == rather than by substring: a needle that matches a longer name is a check that widens itself.
Commenting the call out leaves lock::sweep( in the file verbatim, so the second sabotage arm survived the first fix. The sweep now strips comment lines, which is what tests/dependencies.rs already does for its needles. Third gate in this release fooled by prose rather than by code.
The doc gates that read the manifest are only meaningful after this, so the full suite, the doctests, fmt and clippy were re-run against the bumped tree, and the release binary was built from it — an artifact whose own --version names the previous release is not evidence of this one.
CI checks this repository out with CRLF on Windows, so the "\n}\n" needle that finds the end of an impl never matched and the sweep panicked with "the impl is closed" — green on macOS and Linux, red on the one platform that cannot be reproduced locally. support::harness_source already normalises for exactly this and its comment calls it the third instance of the class here. This is the fourth, and the first to hit a file in the crate's own tree rather than a dependency's unpacked source. The sealed record is not amended: it claims a macOS suite of 1,982 over 107 binaries, which is still true, and it already records under known_limitations that the three-platform matrix runs on the pull request and that a green macOS gate is not evidence about Windows. No test was added, so no count moves.
io-cli 0.38.2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release pull request for io-cli 0.38.2.
The rest of what the 2026-09-05 field test found, finished and verified, plus the io-harness pin 0.79 → 0.81.0 — which answered one of the two items the roadmap had recorded as blocked upstream, and which turned out to carry a defect no gate in this repository could have seen.
io resume --listcarries each run's start time, goal and root.io plugin searchwith no match answers on both doors, the argv door on stderr. The two older-binary warnings name io-cli 0.29.0 instead of io-harness versions nobody installed.io setupsays which file it is about to write over — and the gate holding the driver to that call is onesrc/wizard.rshad been citing by name and that had never been written.The release withdrew its own headline before shipping it. All four
Providerwrappers now delegatecontext_windowandmax_output_tokens; that was a real defect, compiling clean and passing everything. It moves no number an operator sees, because io-harness 0.81.0 implements those methods onCompatiblealone and only from a catalogue this crate never primes. A live OpenRouter run emits"context_ceiling","max_tokens":24000,"source":"fallback". Filed as initorigin/io-harness#266, recorded asUS-IO-CLI-0.38.2-I01, and every claim to the contrary was removed from the CHANGELOG, the contract and the code before the seal.Sealed record
sha256:ebdfc3e5e7e9fd997e3d8427c5c3af89afe218f09459f18faf9d336f06e78d44,ultraship validateok over 126 checks. Feature PR #103 green on all nine checks;git diff --quiet feat/0.38.2 developis clean, so this ships exactly the tree the gates ran on.