Open-source, local-first, NO-LLM Control System for Agentic AI Implementation
SpecSmither drives a software scope through Specification → Epic → Ticket → DAG
and two lifecycles — planning (authoring a spec under a scoring gate) and
work (building each ticket under a completion gate) — entirely over a single
SQLite file. The engine is fully deterministic and synchronous; all AI reasoning
lives in the MCP client, never in the engine.
It imports two independent, pure gates side-by-side:
- crucible (
crucible-forge) — the planning gate (rubric scorer). A published dependency from day one. - assay (
assayforge → assay) — the work-session completion gate (0.2.0, upcoming).
Status
0.1.0 — the planning release. The deterministic substrate + the full planning
lifecycle (authoring a spec draft → ready through the real crucible gate) + the
agent surface (MCP server, TOON) + the human surface (the Textual TUI Observatory).
The work lifecycle (building tickets under the assay gate) lands in 0.2.0.
Install
uv tool install specsmither # or: pipx install specsmither / pip install specsmither
This installs two commands:
| Command | Surface | Notes |
|---|---|---|
specsmither |
the TUI Observatory — the only human UI | needs a real terminal |
specsmither-mcp |
the MCP stdio server for the agent | 21 tools, TOON wire |
Quickstart
cd my-project
specsmither # opens the Observatory; press `i` to init the workspace
init lazily creates the user-global DB, binds this workspace to a project
(.specsmither/config.json), and scaffolds .claude/ (agent skills, subagents,
opt-in read-only hooks + a statusline) so an agent can drive the same DB via
specsmither-mcp in parallel. Then bootstrap a spec and drive planning:
| Key | Action | Key | Action |
|---|---|---|---|
1–5 |
switch tabs (Browser / DAG / Planning / Work / Search) | i |
init workspace |
c / e / d |
create / edit / delete the selected node | n |
advance the planning gate |
a / j |
approve / reject the handover | / |
search |
The agent registers the server as specsmither (the init scaffold writes it into
.claude/settings.local.json); every MCP response is TOON.
Architecture
src/specsmither/
domain/ enums, status transitions, runtime records (SpecFull recompose)
db/ SQLAlchemy 2.0 ORM: base, models, migrations, *StoreSqlite repos
dag/ status calc, single-hop cascade, dependency tree, critical path
rollups/ count derivation, planning aggregate, in-txn recompute worklist
operations/ CRUD, queries, search, reports, workspace/init, project, errors
lifecycle/ planning verbs (start/action/complete) + handover, gate, state machine
dispatch/ the single MCP routing facade (envelopes, error guidance)
adapters/ WritePlan executor, crucible validator, lifecycle ports, config
toon/ the TOON wire encoder (the always-on MCP encoding)
mcp/ the stdio MCP server → `specsmither-mcp`
tui/ the Textual Observatory → `specsmither`
Every mutation runs in one Session.begin() (BEGIN IMMEDIATE) → apply the
WritePlan → recompute worklist (cascade → counts → tree, to fixpoint) →
commit/rollback. Derived data (counts, cached dependency tree) is materialized
in-transaction, recomputed from the authoritative child rows (no deltas,
race-free).
Runtime & workspace
SpecSmither keeps everything in one user-global SQLite database — a single
specsmither.db that holds every project. A workspace is any directory
bound to one project via .specsmither/config.json; different workspaces serve
different projects off the same DB file (WAL + BEGIN IMMEDIATE make concurrent
workspaces/agents on one file safe).
~/.specsmither/specsmither.db # the single DB — all projects live here
~/.specsmither/config.json # global defaults
<workspace>/.specsmither/config.json # { "projectId": "…", "specificationId"?, … }
| Env var | Purpose | Default |
|---|---|---|
SPECSMITHER_HOME |
SpecSmither home directory | ~/.specsmither |
SPECSMITHER_DB |
Explicit DB file (overrides HOME) |
$SPECSMITHER_HOME/specsmither.db |
SPECSMITHER_PROJECT |
Force the active project id (overrides the workspace file) | the workspace config.json |
SPECSMITHER_MCP_FORMAT |
MCP wire encoding (toon / json) |
toon |
SPECSMITHER_LANGUAGE |
Guidance language (en / pt-br; aliases pt, pt_BR) |
en |
Resolution precedence is env > project (.specsmither/config.json) > global
(~/.specsmither/config.json) > default.
Development
uv sync --locked --dev
uv run ruff check src tests
uv run mypy
uv run pytest
Requires Python 3.11+. Determinism golden fixtures live in fixtures/golden/ and Textual snapshot SVGs
in tests/__snapshots__/; both are committed (regenerated via tools/ and
pytest --snapshot-update), so CI runs no Node.
License
Apache-2.0.
Metadata
Release files for specsmither 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| specsmither-0.4.1.tar.gz | 186.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| specsmither-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 405.6 kB
Release files / specsmither-0.4.1.tar.gz
| Download URL | specsmither-0.4.1.tar.gz |
|---|---|
| Size | 186.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2168877899aae484092fa11fce8892411de4e91fb71a540bbd4a86cf91fa509a
|
|
BLAKE2b-256 checksum How to use checksums |
74e66126af9ad1c882f0a61411620b45f192fc98e75d1ac0f0519e01f1b6e3fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 23, 2026.
Transparency logRelease files / specsmither-0.4.1-py3-none-any.whl
| Download URL | specsmither-0.4.1-py3-none-any.whl |
|---|---|
| Size | 219.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fdda3a528c5e171f06959b65414fb3da27f88e64a62de2ddc3fcb4e0c86ffb7b
|
|
BLAKE2b-256 checksum How to use checksums |
057defb13927ce4224fc81205be530c8ae14ac2b401cbedde37c6c5ab497ce12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.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 Jul 23, 2026.
Transparency log