Pull mirror of github.com/fabrig-ai/smith
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Free Ekanayaka d9a67acabd Honor admitted host finish requests in Open runs
Decision 650: Message.finish_requested wakes Open main into its existing
wind-down only after admission. Carry the request through Start and
preparation, retain an explicit host cause, and preserve fences, ACK credit,
reserve limits and Cancel. Finite processes the bit as an ordinary amendment.

Move the one-version channel schema to v5 for the added Message boolean,
including Start messages, and preserve it through host and agent adapters.

Proof: tests::open::admitted_finish_request_wakes_listening_and_next_reply_parks
failed before the change (heavy 554) and passes with the typed request.
Focused serial measure run: 1173 tests passed in 6.370s (heavy 586).
Final run/domain/channel subset after encoder refactor: 308 passed in 0.948s
(heavy 596). Workspace all-target check passed (heavy 591); focused
all-target clippy with -D warnings passed (heavy 600).

Live smoke proof (director 654, hel8 dev arm, source deac3df4):
probes-smoke-tools-deac3df4-20261023T060103Z/01: completed, pass;
13.465 s, USD 0.001115; summary attempts=1, pass.
Binary SHA-256: 2f37e9814a6c2202701d536edde5eb879bf9e812f6cb8ca1309eaf027d9f8019.
Arm: deac3df4801db545ff1b2599efbafbec051a54e3-2f37e9814a6c2202701d536edde5eb879bf9e812f6cb8ca1309eaf027d9f8019.
Heavy build token: 532651b727b84183a0b62ce9bd0a1a4d (46 s).
Heavy gate token: e244999b799e4fc99c946741e013be37 (15 s).
Log: hel8 ~/src/rust/tmp/director/land/smoke-deac3df4.log.
Hetzner2's earlier setup refusal reflects the harness login being on hel8;
the director ran the required smoke there. No source rebase since this proof.

Complete channel-v5 test fixtures: check-format expectation, scripted host
maximum version, and codec fuzz golden seed paths. Focused check-format test
passes (heavy 613), all 93 process-world tests pass (heavy 622), and both codec
fuzzy tests pass (heavy 636). Production is identical to smoked deac3df4.

Gate-Tree: 90a403f9a1
Gate-Result: scripts/check.sh passed: 3191 tests / 5.632 s; 45 tests / 4.669 s; 15.352203369140625 s in all
Gate-Policy: sha256:921e8fa3a7925e962befd40afc34a0d81a1b2246aa3f177c9cd910983241ade8
2026-10-23 06:28:11 +00:00
.config test: provisionally double harness and nextest time caps 2026-10-22 18:36:40 +00:00
benchmarks test: provisionally double harness and nextest time caps 2026-10-22 18:36:40 +00:00
crates Honor admitted host finish requests in Open runs 2026-10-23 06:28:11 +00:00
docs Honor admitted host finish requests in Open runs 2026-10-23 06:28:11 +00:00
scripts Run smith's gate without nextest's double spawn 2026-10-14 01:02:59 +01:00
src Check program accounts before startup and report account sources 2026-10-20 13:35:41 +00:00
tests Honor admitted host finish requests in Open runs 2026-10-23 06:28:11 +00:00
.gitignore Establish smith's workspace and shared-world consumer checks 2026-10-05 10:56:12 +01:00
AGENTS.md docs: provisionally double test-time caps at the user's request 2026-10-22 16:27:25 +00:00
Cargo.lock Pin skein f043ea16 for the shared Open tuple 2026-10-22 19:13:27 +00:00
Cargo.toml Check and sign out program sources through the host half 2026-10-20 03:27:08 +00:00
clippy.toml Split step and shell lint rules 2026-10-09 09:45:45 +00:00
LICENSE License every smith workspace package under MIT 2026-10-19 13:45:07 +01:00
README.md Run the live suite on smith's own accounts 2026-10-20 20:07:42 +00:00
rustfmt.toml Establish smith's workspace and shared-world consumer checks 2026-10-05 10:56:12 +01:00

smith

Protocol-driven agent loop for AI applications.

A Rust kit for LLM agents that a host drives over a protocol, sending each run its instructions, tools, budget and what counts as done.

The idea

  • Policy is data. A host shapes a run entirely by its charter and its answers: instructions, a brief, the tools the agent may call and those the host serves, what counts as done, a budget. smith knows no workflow vocabulary: no roles, task kinds, forges or pull requests.
  • Not only a coding agent. A chat assistant, a researcher, a reviewer, an operator acting through its host's tools, a coordinator of other agents and a producer of code changes are runs of the same loop, told apart by their charters. A workspace is optional.
  • One vocabulary, in a process or inline. An agent runs as a process its host spawns, over one channel, or as smith's domains inside the host's own process. The host speaks the same vocabulary either way.
  • Any model, any provider. The conversation is provider-neutral, and a run may give its sub-agents other models than its own.
  • Failures are visible. The LLM sees what went wrong, bounded in size, and so does the person running it, in words, never replaced by a fixed message.
  • Built on skein, tested whole. Every part is a domain, a protocol layer and io, so a host imports the layer it needs; a world of domains and fakes runs everything an agent does, with no io at all.

Start here

Before changing code, read AGENTS.md and docs/development/workflow.md. main moves only through skein's land, which runs the gate, scripts/check.sh.

Live tests

The live profile runs smith's account stories and the Claude Code probes one at a time, without retries. It stays outside the default and fuzzy suites. Install claude on PATH and /usr/bin/python3 for the prompt-shape probe's MCP fixture, then prepare a private directory and its user layer once per machine:

export SMITH_LIVE=~/.local/state/smith-live
umask 077
mkdir -p "$SMITH_LIVE/config/smith"
cat > "$SMITH_LIVE/config/smith/config.toml" <<EOF
credentials = "$SMITH_LIVE"

[accounts.chatgpt]
provider = "openai"
source = "sign_in"

[accounts.claude]
provider = "anthropic"
source = "program"

[accounts.anthropic-key]
provider = "anthropic"
source = "env"
variable = "ANTHROPIC_API_KEY"
EOF
XDG_CONFIG_HOME=$SMITH_LIVE/config smith login chatgpt  # approve in the browser
XDG_CONFIG_HOME=$SMITH_LIVE/config smith login claude   # Claude Code's sign-in
cargo nextest run --profile live

Set ANTHROPIC_API_KEY for the key story. A missing setup fails by name; each story checks only the accounts it uses. To run an account's stories alone, select them with nextest's test filter. An optional SMITH_TEST_LIVE_GIT_REMOTE names a writable remote for the push story; without it that story reports the omission on stderr and passes. The push story removes its remote branch, including on a failed assertion.

The directory holds host-id, tokens/chatgpt, programs/claude/ and config/smith/config.toml. Smith refreshes its own records in place under their locks. Each test keeps its HOME, workspace and chats in scratch; the suite never rewrites the live user layer or borrows a personal login. A directory unused past the issuer's refresh-token lifetime needs another sign-in. See testing.md, section 2.3.

The family

These are the repositories of Fabrig, an agent-driven software factory: write, prove, run.

Repository Builds on
skein One thread, one loop, no async
smith Protocol-driven agent loop for AI applications skein
jig Engine for agentic applications skein, smith
temper Agent-driven software development on a forge skein, smith, jig
hearth Immutable machines, built from a revision skein