Repository navigation
gage 0.3.0
Two front doors. gage already did the work; 0.3.0 is about what it takes to
reach it — an agent can now call gage as MCP tools instead of shelling out and
parsing prose, and a person with no identity can get one from the local page
instead of being told to go back to a terminal.
No security fix in this release. No format or protocol change — see
Notes.
Added
-
gage mcp— a Model Context Protocol server over stdio. Nine tools:
gage_identity,gage_buddies,gage_pair_start,gage_pair_confirm,
gage_send,gage_push,gage_pull,gage_inbox,gage_open. Setup and
the full tool table are in docs/mcp.md.A front door, not a second implementation: every tool runs the function the
CLI runs, so a verdict cannot differ betweengage openandgage_open.
stdio only — no listener, no port, no new network surface. No new crates
either; JSON-RPC is a few hundred lines over theserde_jsonalready in
the tree.The human boundary survives the hop, which is the point.
gage_pair_startreturns the word-pairs and adds nothing;
gage_pair_confirmcompletes only if they come back exactly, does not
reveal what the right answer was, and holds the pending pairing in memory
for the session only. The honest limit is written into the tool's own
description, where a model will read it: a key knows its own word-pairs, so
echoing back whatpair_starthanded you proves nothing. It is a
checkpoint, not a proof.Deliberately not exposed:
export-identity/restore-identity,
because a passphrase must never travel as a tool argument through a context
that hosts log and may replay;init, because that is a human moment;
acceptandreject, because the accept gate exists so that crossing it is
an act a human performed.gage_openreads a pending bundle without
accepting it, which is all an agent needs in order to report.
gage_pushcarries the same confirmation--yesdoes, because that is the
moment something leaves the machine. -
A first-run wizard in the local page, and
POST /api/init. The viewer
no longer dead-ends a visitor who has no identity./api/statenow says
outright whether one exists (has_identity), and the page walks from
nothing to a first verified handoff: create an identity, see your four
word-pairs, pick a nearby machine and compare its pairs, pair, send one
bundle.Creation runs
Identity::create_named— the same functiongage init,
connectandquickstartreach. The viewer holds no key generation,
storage or permission logic of its own, and its refusals are inherited:
create will not clobber an existing identity, and that comes back as a 409
carrying the CLI's own words. A handle typed here is held to the grammar the
page already holds contact names to; an empty one derives the two-word label,
asinitwith no name does.The pair button stays disabled until the comparison is confirmed, and the
word-pairs are shown for the machine you selected — the ceremony is not
reduced to a click. Export and restore stay terminal-only: no passphrase
ever transits a browser form. -
Teaching empty states throughout the page, so a console with nothing in
it yet says what would put something there.
Changed
send_bundlepushes its human-facing lines into a caller-owned sink instead
of printing them. Every CLI caller prints the same lines in the same place,
so terminal output is unchanged — but on a stdio transport the server's own
stdout is the JSON-RPC channel, and a strayprintln!would corrupt the
session.gage inbox --jsonand the MCP inbox tool now render from one function, so
the two cannot drift.
Notes
- No format or protocol change.
v: 1manifests and envelopes are
unchanged, the relay protocol is unchanged, and an installed 0.2.0 keeps
working and interoperates with 0.3.0.seal.rsis untouched in this
release; the new HTTP route and JSON field are additions to the local
viewer, which is not a peer protocol. - An agent needs a 0.3.0 binary to use
gage mcp— the subcommand does
not exist in 0.2.0. Nothing else requires an upgrade. - Verified at this commit: 130 unit tests, 871 adversarial checks,
the identity restore drill (16 checks), and the viewer end-to-end
suite, all passing. - The security review of this codebase is still not independent. That remains
the largest open item, as docs/threat-model.md says.
Install
curl -fsSL https://gage.sh/install.sh | sh
Or fetch a binary by hand from the assets below and check it against
SHA256SUMS before you run it:
sha256sum -c SHA256SUMS # Linux
shasum -a 256 -c SHA256SUMS # macOS
| asset | platform |
|---|---|
gage-0.3.0-linux-x86_64 |
Linux x86_64 |
gage-0.3.0-darwin-arm64 |
macOS Apple Silicon |
Both report the commit they were built from: gage 0.3.0 (1f2b5a9).