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)
| File | Size | Uploaded | |
|---|---|---|---|
| sayfirst-0.3.3.tar.gz | 7.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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