Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

0.6.0 - 2026-11-11

Added

  • [breaking] speak MCP revision 2026-07-28 only.
  • serve llms.txt, llms-full.txt and an agent skill as MCP resources, and install the skill from sa-forge-signer-mcp.
  • add sa-forge-signer-mcp, MCP over stdio for a running service.
  • [breaking] move the service into its own binary, sa-forge-signer-serve.

Fixed

  • [breaking] require https for rpc_url, allowing http only for a loopback host.
  • simulate only unsigned copies, so the RPC never holds a transaction before its intent.
  • count only signs that were not refused toward a key’s rate limit.
  • escape caller text on approval prompts and cap it in audit entries.

Other

  • check the MCP handler’s messages against the Rust MCP SDK’s types.
  • say outright that sa-forge-signer-mcp needs a running sa-forge-signer-serve.
  • add a design decisions chapter, and show in the README how an agent connects.
  • split the engine into its pipeline, its rebuild gates, the approval prompt and the send loop.
  • split serve into its routes and its MCP handler, and give the URL and caller-text helpers their own modules.
  • split the crate into a library and a thin sa-forge-signer binary.

0.5.0 - 2026-11-09

Added

  • add opt-in tracing on stderr (SA_FORGE_SIGNER_LOG) with timed spans for each sign phase, RPC call and serve request, and a just bench recipe timing the audit log’s reads.
  • report the halt and the policy digest’s approval in the MCP key_show tool.
  • add a policy digest per key, recorded in sign audit entries, and optional require_policy_approval with key approve.
  • add instruction_table in report mode, reporting unknown instructions, wrong account counts and profiles other than the key’s as findings.
  • [breaking] bound ComputeBudget instructions and System transfers per key.
  • run check and sign through one policy function, and preview every sign-only refusal in check.
  • [breaking] add halt and resume, a stop on signing that only a person at a terminal can lift.
  • add the grant page, a local web page where the profile authority’s own browser wallet grants and revokes a SAGE session key.

Fixed

  • check a sent transaction’s status after 400 ms and back off to 1 s, and keep idle RPC connections for 2 minutes between signs.
  • keep one RPC connection pool per URL for the process, and reuse the genesis hash for 5 minutes, so a sign no longer pays a TLS handshake and an extra call.
  • drop serve’s plain access line while tracing is on, so a JSON log holds only JSON, and say how to turn tracing on after install.
  • read a key’s recent audit entries once per sign, and count its usage in linear time instead of quadratic.
  • read the audit log back from its end for each sign, so a sign’s cost no longer grows with the log’s age.
  • refuse a payload whose signature is already in the audit log unless a fresh blockhash changes it.

0.4.1 - 2026-11-07

Added

  • add an optional explorer_url to the config, defaulting to the cluster’s explorer, used for the explorer link in sign reports and shown by config show.
  • make key import of the same keypair a no-op that prints its config block again, still refusing a different key.
  • point config init and config show at key import as well as key new.
  • add key import, which copies an existing Solana CLI keypair file into the key store and prints its config block.
  • add config init, which writes the annotated example config, and config show, which prints the config as the signer resolves it.

Other

  • replace the bare allow on unless_stale with an expect that gives its reason.
  • move the Working on it chapters into docs/src/dev.
  • add a Getting started chapter with the full config for each setup, the minimal serve table, and a table of every setting and its default.
  • name the package in the cargo install command, which cargo requires once the repository holds a second binary package.
  • split the README into book chapters, and slim the README to a front page.
  • build, attest and attach prebuilt binaries to each release.
  • list the crate’s files in Cargo.toml, so CI and docs-only changes do not trigger a release.
  • group only minor and patch Dependabot updates, so each major bump gets its own PR.
  • (deps) bump Swatinem/rust-cache

0.4.0 - 2026-11-07

Fixed

  • (deps) update rustls-webpki 0.103.15 -> 0.103.16 and webpki-roots 1.0.9 -> 1.0.11 for RUSTSEC-2026-0382 and RUSTSEC-2026-0381.

Other

  • add weekly Dependabot updates for actions and cargo with a 7-day cooldown.
  • release with release-plz in git-only mode, and document Conventional Commits and what counts as breaking.
  • check the book on pull requests and deploy it to GitHub Pages from main.
  • build the docs as an mdBook with llms.txt for agents, and point agents at it from CLAUDE.md.
  • rustls 0.23.45 -> 0.23.46 for RUSTSEC-2026-0346..0349, allowed by a dated exception in the crate-age check (owner’s exception to the 7-day minimum age).
  • Refuse a sign whose blockhash is already past the finalized height, after one fresh re-sign: it can never land, so nothing is sent and a retry is safe.
  • Bump the version to 0.4.0 for the security review’s breaking changes.
  • Require the real System and token programs in ATA creates; check token authorization before the key lock.
  • Pinchy’s re-review of 2f942bf: the two P2 follow-ups
  • Close Pinchy’s re-review of 6d58901 (P1-1..3, P2)
  • Hardening and documentation from the review (P2)
  • Keep the profile authority behind a person at the terminal (review P1)
  • Serialize signs per key; reserve spend before sending (review P1)
  • Simulate the post-approval transaction before sending it (review P1)
  • Prove expiry against the finalized tip; bound every sign (review P1)
  • Refuse top-level account creation and token-program calls (review P0)
  • Add sa-forge-signer 0.3.3: a thin signer for SAGE on Z.ink testnet with structural checks, simulation, confirmation, a file key store, a hash-chained audit log, and serve with HTTP and MCP endpoints.