Open-source, local-first, NO-LLM reimplementation of the SpecForge engine (Specification → Epic → Ticket → DAG) over a single SQLite file.
Project description
SpecSmither
Open-source, local-first, NO-LLM reimplementation of the SpecForge engine.
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).
Status
Pre-alpha. Building M0 — Foundation: the deterministic substrate (domain models, SQLite/ORM persistence, the DAG engine, the in-transaction recompute worklist, CRUD primitives, and the query/search/report surface) with native tests. No lifecycle, MCP server, or CLI yet.
Architecture (M0 layers)
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, lookup, errors, reopen, link-PR
adapters/ WritePlan executor, in-memory operations projector
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).
Development
uv sync --dev # resolves crucible-forge from ../crucible (see pyproject)
uv run ruff check src tests
uv run mypy
uv run pytest
Requires Python 3.11+. Determinism golden fixtures live in fixtures/golden/
and are committed (regenerated from the TS reference via tools/); CI runs no
Node.
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"?, … }
Running init in a workspace (once) lazily creates the DB if it's absent, then
creates — or reuses — that workspace's project and writes the binding file.
| 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 |
Resolution precedence is env > project (.specsmither/config.json) > global
(~/.specsmither/config.json) > default.
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file specsmither-0.1.0.tar.gz.
File metadata
- Download URL: specsmither-0.1.0.tar.gz
- Upload date:
- Size: 253.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bdfd9b5be77ca844527232a35b11a20b9a1b06eb0f44a3e18d4f1114d637387e
|
|
| MD5 |
57669e5ae2970659fddf18a60f7a98c6
|
|
| BLAKE2b-256 |
76c55d91dd9a7892c942322cca0dde07e56b02c806bb33189b19b6dc952a6c7a
|
Provenance
The following attestation bundles were made for specsmither-0.1.0.tar.gz:
Publisher:
publish.yml on blacksmithers/specsmither
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
specsmither-0.1.0.tar.gz -
Subject digest:
bdfd9b5be77ca844527232a35b11a20b9a1b06eb0f44a3e18d4f1114d637387e - Sigstore transparency entry: 2037413133
- Sigstore integration time:
-
Permalink:
blacksmithers/specsmither@0264f14530f8b3920ab646dd10edccec1076274e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blacksmithers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0264f14530f8b3920ab646dd10edccec1076274e -
Trigger Event:
push
-
Statement type:
File details
Details for the file specsmither-0.1.0-py3-none-any.whl.
File metadata
- Download URL: specsmither-0.1.0-py3-none-any.whl
- Upload date:
- Size: 321.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ad92c1ef7e9ae4f5a7d0f756477990f0eeb908cc35bd1eda4007fc4b929bc80a
|
|
| MD5 |
e1a2eeb58a5b271780e27a6d23c57ba9
|
|
| BLAKE2b-256 |
bfa156435f2878e5ad94bb965678935998c2f765ac882e40c2936a59bd605e8e
|
Provenance
The following attestation bundles were made for specsmither-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on blacksmithers/specsmither
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
specsmither-0.1.0-py3-none-any.whl -
Subject digest:
ad92c1ef7e9ae4f5a7d0f756477990f0eeb908cc35bd1eda4007fc4b929bc80a - Sigstore transparency entry: 2037413345
- Sigstore integration time:
-
Permalink:
blacksmithers/specsmither@0264f14530f8b3920ab646dd10edccec1076274e -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blacksmithers
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0264f14530f8b3920ab646dd10edccec1076274e -
Trigger Event:
push
-
Statement type: