release: v0.6.0 - #367
Closed
jeremy-wayland wants to merge 13 commits into
Closed
release: v0.6.0#367jeremy-wayland wants to merge 13 commits into
jeremy-wayland wants to merge 13 commits into
Conversation
The engine side of #332 converted `ClassificationResult` to `BTreeMap`, but the MCP wire structs in `schemas.rs` were still `HashMap` — so four call sites had to convert `BTreeMap -> HashMap` on the way out, throwing the ordering away exactly where the JSON gets produced. This matters because `topos/cli/Cargo.toml` enables `serde_json/preserve_order` and the `topos` binary links `topos-mcp`, so feature unification makes `serde_json::Map` an insertion-ordered `IndexMap` for the whole build. A `HashMap` field therefore serializes in `RandomState` order — different bytes on every process. Every serialized map is now a `BTreeMap`, which also lets the four conversion blocks collapse back to `.clone()` and deletes `formatting::sorted_pairs` (BTreeMap already iterates in key order). The gate-input maps in `topos-engine` follow, so `raw_metrics` reaches `evaluate_gates` without a rebuild. Wire shape is unchanged: JSON objects have no ordering contract, and schemars emits the same schema for both map types.
Nothing failed if a wire map went back to `HashMap`, so the determinism fix was invisible to the suite. Two guards, one per JSON channel: `json_output` for `topos evaluate --json`, and `to_evaluation_result` for the MCP structured content. Both assert sortedness rather than "two runs match" — with `preserve_order` on, a single-key fixture would pass the latter by accident. Structs are deliberately not covered: serde emits their fields in declaration order, which is correct and already stable.
…g it (#350) `0.25` sat inline in `status_text` with no name, and the caption three lines below the table still said "Status reflects policy gates; scores are diagnostic" — which stopped being true the moment a score could turn `✓ PASS` into `! WARN`. Names the threshold `WEAK_SCORE`, records why a quarter and why it is not a policy number (no gate, verdict, or exit code reads it), and rewrites the caption to describe what the column now actually shows.
The multi-file row prints AVG and MIN side by side, but only AVG fed the status, so `SIMPLE ✓ PASS 72% 2%` was still reachable — the same "passing status next to a near-zero number" #350 is about, one column over. WARN now keys off the weakest score in the row, which is the smaller of the two numbers the row actually shows. Single-file output is unchanged: with one file the average is the minimum.
`~/.pi/agent/settings.json` is pi's own settings file — theme, provider,
transport — with a documented key set that has no `mcpServers` in it.
Nothing reads an MCP entry written there, so `topos status` would have
reported `✓ active` for a registration pi never sees.
pi has no MCP client of its own ("No MCP. […] build an extension that
adds MCP support", packages/coding-agent/README.md); MCP is resolved by
the `pi-mcp-adapter` extension, which searches six locations. Of those,
`~/.pi/agent/mcp.json` is the only one that belongs to pi alone —
`~/.config/mcp/mcp.json` and `~/.agents/mcp.json` are shared across
tools and are not `topos install pi`'s to own.
Adds a note, shown on install and in `topos status`, that the entry is
inert without the adapter. Antigravity is no longer the only harness
carrying one, so the test that asserted that now names both.
Refs: github.com/badlogic/pi-mono packages/coding-agent/README.md,
github.com/nicobailon/pi-mcp-adapter README (config precedence).
The ADR is the canonical harness registry — id, config path, key, detection, and the reasoning behind any non-obvious path — and a new harness that isn't in it is a harness the next person has to reverse engineer from the table literal. The README's sample checklist is what users compare their own output against, so an eight-row sample under a nine-harness installer reads as a bug. Records why pi's entry goes to `mcp.json` rather than `settings.json`, and why the higher-precedence shared locations are deliberately not used.
Repo convention (CHANGELOG.md header, .agents/AGENTS.md § Git History & Release Convention): merged PRs carry their own `[Unreleased]` entry as they land, so the release PR only has to rename the section. Three user-visible changes here had none.
…CP (#345) pi's MCP entry configures nothing until the user installs a third-party npm extension, which makes `topos install pi` an installer that reliably writes something inert. pi's own answer to external tools is Skills, and `settings.json` has a documented `skills` array of paths for exactly this — its example is other agents' skill directories. Verified against pi's source, not its docs: `settings-manager.ts` declares `packages`, `extensions` and `skills`, and `grep -ci mcp` over it returns 0. There is no settings key that could hold an MCP server. topos still never writes skill content — it appends one directory path, and skills stay ClawHub / Hermes / openclaw's, as `residue.rs` requires. Three outcomes, kept distinct because collapsing them gives wrong advice: - already on pi's default scan path (openclaw symlinks `~/.agents/skills` into `~/.pi/agent/skills`, which is the common real setup) — write nothing, report `discovered` - in `~/.agents/skills` or `~/.claude/skills` — reference it - not installed — write nothing, name the `openclaw skills install` Telling someone with a working symlink farm to install a skill they already have is worse than saying nothing, so `discovered` is its own state in `status --json` rather than folded into `absent`. pi is now the one harness with two artifacts. They stay unfolded: a missing skill must not mask a working MCP entry, nor the reverse, so the reference gets its own status line and its own `skillRef` object. Uninstall matches any candidate directory — a skill deleted since install must not strand the entry — and drops an emptied `skills` key so a `settings.json` topos created can be deleted.
The ADR is the canonical harness registry, and "one artifact per harness" was stated there as an invariant — pi breaks it, so the exception and its reasoning belong in the same place, along with the three-outcome table for when a skill reference is written at all.
…status-pi # Conflicts: # CHANGELOG.md
Co-authored-by: Cursor <cursoragent@cursor.com>
Move [Unreleased] notes into [0.6.0] and bump published version strings. Includes #360 (CLI determinism, status clarity, pi harness). Co-authored-by: Cursor <cursoragent@cursor.com>
Member
Author
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.
Summary
[Unreleased]notes into[0.6.0] - 2026-09-16and leave an empty[Unreleased]section for follow-on work..mcp/server.json), VS Code extension, Agent Plugins manifest, and Topos skill versions to0.6.0.mainseparately to avoid duplicate commits).Why 0.6.0 (not 0.5.2)
SemVer minor: Graphify removal drops MCP tools, CLI subcommands, and refactor targets; plus additive harness/surface (Agent Plugins, pi install).
Condensed changelog (since v0.5.1)
Added
agent-plugin/for Agent Plugins 1.0 clients.topos install pi(#360 / #345) — ninth harness; MCP entry in~/.pi/agent/mcp.json(viapi-mcp-adapter) plus optional skill path reference insettings.json.Fixed
Breaking
Changed
! WARN(#360 / #350) — gates/JSON unchanged.rmcp3.x (#324, #337).Included PRs
OpenWiki-only merges omitted.
Verification
python3 scripts/check_versions.py --tag v0.6.0python3 scripts/check_skill.pypython3 scripts/check_agent_plugin.pypython3 scripts/generate_self_badge.py --self-checkcargo fmt --all -- --checkcargo test --workspacecargo clippy --workspace --all-targets -- -D warningsgit diff --checkRelease checklist
main+ feat(cli): CLI determinism, status clarity & pi harness support #360mainv0.6.0Made with Cursor