Skip to content

release: v0.6.0 - #367

Closed
jeremy-wayland wants to merge 13 commits into
mainfrom
release/v0.6.0
Closed

jeremy-wayland wants to merge 13 commits into
mainfrom
release/v0.6.0

Conversation

@jeremy-wayland

Copy link
Copy Markdown
Member

Summary

  • Move the current [Unreleased] notes into [0.6.0] - 2026-09-16 and leave an empty [Unreleased] section for follow-on work.
  • Bump Cargo workspace, MCP Registry (.mcp/server.json), VS Code extension, Agent Plugins manifest, and Topos skill versions to 0.6.0.
  • Includes #360 (merged on this branch for a single release cut; close or skip merging feat(cli): CLI determinism, status clarity & pi harness support #360 into main separately 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 Plugins package (#311) — portable agent-plugin/ for Agent Plugins 1.0 clients.
  • topos install pi (#360 / #345) — ninth harness; MCP entry in ~/.pi/agent/mcp.json (via pi-mcp-adapter) plus optional skill path reference in settings.json.

Fixed

  • Byte-deterministic JSON (#360 / #332) — sorted map keys on CLI and MCP wire payloads.
  • Discovery and path filtering (#358).
  • TypeScript parsing & CPG sinks (#359).

Breaking

  • Graphify integration removed (#326) — MCP tool count 18 → 17; lower context-budget ratchet.

Changed

  • Near-zero passing pillars show ! WARN (#360 / #350) — gates/JSON unchanged.
  • MCP SDK rmcp 3.x (#324, #337).
  • Security overlay short-circuit (#331).

Included PRs

PR Notes
#311 Agent Plugins 1.0
#324, #337 rmcp 3.x
#326 Graphify removal
#331 Security overlay perf
#358 CLI discovery / ignores
#359 TypeScript / CPG fixes
#360 Deterministic JSON, WARN status, pi harness (on release branch only until this merges)

OpenWiki-only merges omitted.

Verification

  • python3 scripts/check_versions.py --tag v0.6.0
  • python3 scripts/check_skill.py
  • python3 scripts/check_agent_plugin.py
  • python3 scripts/generate_self_badge.py --self-check
  • cargo fmt --all -- --check
  • cargo test --workspace
  • cargo clippy --workspace --all-targets -- -D warnings
  • git diff --check

Release checklist

Made with Cursor

jeremy-wayland and others added 13 commits August 23, 2026 23:08
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.
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>
@jeremy-wayland

Copy link
Copy Markdown
Member Author

Resetting release workflow: release/v0.6.0 is back on main with no merge of #360. Merge #360 to main first, then open a fresh release PR that is version bumps only (CHANGELOG section rename + 0.6.0 strings).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant