v0.25.1 - a process can belong to a tool you already have
Two things, both found by running the product.
stable arrived in the queue and none of the buttons fitted
Warp's macOS binary is called stable, after its release channel. It was in the registry for one release and came out again in 0.25.0 — it is a word, and any process named stable was being silently excused as Warp. The queue asks instead. That was the point.
But the queue could only offer three answers and none of them was true:
| why not | |
|---|---|
| Add to registry | invents a tool called stable with no domains, matching nothing, beside the Warp that already exists — and a portal entry cannot extend a shipped tool anyway, _merged_registry drops it on an id collision |
| Names nothing | false. It names Warp. |
| Dismiss | closes the card and leaves the process on the Agentic view for ever — the exact failure the third disposition was added to fix |
So there's a fourth: belongs to a tool the registry knows, picked from the tools that exist. Refused if the tool doesn't — inventing one from a process name is what add to registry is for, and it produces something that matches nothing.
Recorded once, read by every view that reads a process name, and the receiver stops asking. Same trade the queue makes everywhere else: a maintained guess replaced by an observed fact somebody confirmed. Guessing stable in a release is precisely what went wrong.
A second plan could not cover the same tools
Not saved: claude-code is already covered by the claude Team subscription
Wrong, and mine. The covers rule I shipped in 0.25.0 excused only the tool itself when comparing two plans of one product, so the moment either named a second tool they collided — which is every real Claude subscription, since Team and Max both include Claude Code.
A Max seat includes Claude Code exactly as a Team seat does. Their covered sets are supposed to be identical: different contracts, different people, different member lists, and the spend is each subscription's own seats times its own price.
The rule exists to catch one licence modelled as two subscriptions, which happens between different tools. That half is untouched and still tested:
claude/Team covers claude-code, then claude/Max 20 covers claude-code -> allowed
claude/Team covers claude-code, then cursor/Pro covers claude-code -> 422
Checked
Suites: registry 23, portal 630, scanner 210, receiver 305. Plus collector parity, build.py --check, both byte-identical invariants, chart copies, identifier guard.
Not verified: the picker rendering in a browser. Same standing gap as the budget page — managed mode needs a login I've avoided.