Skip to main content

sayfirst — ask before you act

This distribution is the product, installed whole. It installs no code of its own: it depends on the three distributions that carry the three commands, each at this same version, and names those commands so that one install exposes them.

$ uv tool install sayfirst
$ sayfirst-daemon up --quickstart
$ sayfirst instrument run --pack subprocess --scope local -- python3 my_agent.py
Command What it is The distribution that owns it
sayfirst the product client: ask, trace, explain, evidence, approvals, instrument, packs sayfirst-cli
sayfirst-daemon the control plane's daemon: serve, up --quickstart, down sayfirst-control-plane
sayfirstd the daemon's operator surface: status, whoami, plugins, conformance sayfirstd

The client's QUICKSTART.md walks all of it from the second command on; its first command is the three-package install that this distribution replaces. Each command is documented where it is declared.

What it is not

  • Not the client alone. A program that only asks, reads and verifies needs sayfirst-cli, which brings the contract and the boundary and never the daemon. This distribution brings the daemon on purpose.
  • Not a place where anything is decided or documented. Every sentence about what the product does, and does not do, is on the pages of the distributions above.

Coming from the three-package install

Before this distribution existed, the same three commands were installed as one tool named sayfirst-cli. uv refuses to write a command another tool already owns, so stop the quickstart daemon, if up started one, and remove the tool first. If the three commands were installed as three tools instead, all three have to go, and the second line is uv tool uninstall sayfirst-cli sayfirst-control-plane sayfirstd.

$ sayfirst-daemon down
$ uv tool uninstall sayfirst-cli
$ uv tool install sayfirst

None of these lines removes the policy, the configuration or the evidence under ~/.sayfirst/quickstart: they are kept, and the next sayfirst-daemon up --quickstart finds them.

uv's refusal offers --force. It installs this tool over the old one and leaves the old one installed; removing sayfirst-cli afterwards removes the three commands again, and uv tool install --reinstall sayfirst puts them back.

Removing it

Stop the quickstart daemon first, if up started one. Once the commands are gone, nothing is left to stop it with:

$ sayfirst-daemon down

Then, as a tool, remove the tool: uv tool uninstall sayfirst. In an environment of your own, remove the product whole, since this distribution and the three it depends on each declare the commands:

$ pip uninstall sayfirst sayfirst-cli sayfirst-control-plane sayfirstd sayfirst-contract sayfirst-boundary

Removing sayfirst alone from such an environment removes the three commands and leaves the distributions that own them installed, without their commands. pip install --force-reinstall --no-deps of an owner puts its command back.

Metadata

Release files for sayfirst 0.3.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sayfirst 0.3.3
File Size Uploaded
sayfirst-0.3.3.tar.gz 7.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sayfirst 0.3.3
File Interpreter ABI Platform
sayfirst-0.3.3-py3-none-any.whl Python 3 none any Details

Total release size: 14.7 kB

Release files / sayfirst-0.3.3.tar.gz

Download URL sayfirst-0.3.3.tar.gz
Size 7.3 kB
Tags Source
SHA-256 checksum
How to use checksums
5340deaf052df7de5a3deec2303089af033c4ba00b99ef6ae7a87fac7bb161c2
BLAKE2b-256 checksum
How to use checksums
1448caede7eb38ea539f9d050905fd4ea3ab3b05093d92ee31008f70691a9e9b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / sayfirst-0.3.3-py3-none-any.whl

Download URL sayfirst-0.3.3-py3-none-any.whl
Size 7.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
072c192f360e81406697b50dc5b3c3488efa3d12a4ad0a9807bf47edf40bec5a
BLAKE2b-256 checksum
How to use checksums
0961de47fc2bde32bcc8b542dc776693e197ab9cc623e96d97c364f28b320cd0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.3 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page