0001 — OpenSpec as the spec-driven framework for patterson-agents
Status: Accepted
Date: 2026-08-12
Decider: Daniel Bodnar
Scope: program-level planning across the patterson-agents org
Context
Section titled “Context”The patterson-agents program spans several independent repos and is executed largely by
delegating workstreams to subagents. It needed one place where a unit of work is written down
before it is built, and one format that a subagent can be pointed at.
Three inputs bore on the choice:
HANDOFF.md§1E prescribed building the scoping completely in both spec-kit and OpenSpec underspecs/spec-kit/andspecs/openspec/, reviewing, then deleting the loser. Its stated preference was already vendor-agnostic, TypeScript over Python.- Prior research —
downloads/patterson/sdd-landscape.html, a survey of the spec-driven-development landscape — profiles both tools on identical axes. It describes spec-kit (github/spec-kit, MIT, v0.15.x) as constitution-driven and phase-gated, Python 3.11+ viauv, roughly eight files per spec, weak on small iterative changes. It describes OpenSpec (Fission-AI/OpenSpec, MIT) as change-driven and brownfield-first, Node/TypeScript, roughly four files per change, with an explicit ADDED/MODIFIED/REMOVED delta format and nativeSKILL.mdbinding. Its recommendation for brownfield change work and for the shortest path to a working loop is OpenSpec. - An existing spec-kit investment in
cli/— a live feature tree atcli/specs/001-patterson-cli-v1/plus a ratified constitution atcli/.specify/memory/constitution.md(v1.0.0, seven binding principles). This was the strongest argument on the spec-kit side and is recorded here as such.
Decision
Section titled “Decision”OpenSpec v1.8.0 (@fission-ai/openspec) is the spec-driven framework for the
patterson-agents program. patterson-corp is the program’s OpenSpec planning root.
Rationale, in the order it carried weight:
- Vendor-agnostic. Plain Markdown in
openspec/; the CLI is a scaffolder, not a runtime dependency. Nothing is locked to one agent vendor. - TypeScript/Node-native. spec-kit is Python and
uv. Python is forbidden outright by this machine’s global rules and by theHANDOFF.mdground rules (Phase 0 asserts zero.pyfiles); adopting spec-kit at program level would require breaking a standing constraint. - Fits delegate-to-subagents. Each workstream is its own directory under
openspec/changes/with a small, fixed artifact set, so a subagent can be handed exactly one change viaopenspec show <change>rather than a whole-repo spec tree. - It initialized cleanly.
openspec/config.yamlcarries the Patterson context and proposal rules, and ten workstreams already exist as change directories —add-repo-furniture,add-github-security-scanning,reconcile-plugin-name-collisionsand seven others. (The eleventh entry,changes/archive/, is OpenSpec’s standard container for completed changes, currently empty — not a workstream.)
cli/ is explicitly out of scope. Its spec-kit tree and constitution remain as-is.
Consequences
Section titled “Consequences”Positive
Section titled “Positive”- One planning root for the program, in a format every supported agent can read without a plugin.
- The delta model suits the actual work, which is overwhelmingly modification of things that already exist (marketplaces, plugins, settings) rather than greenfield services.
- No Python toolchain enters the program, so the Phase 0 “zero
.pyfiles” check stays green. - Per-change directories give subagent delegation a natural unit of work and a natural boundary.
Negative
Section titled “Negative”- Version drift in the evidence base. The research describes OpenSpec v1.4.x; the
installed CLI is v1.8.0. Every v1.4-era claim below is therefore unverified against
1.8.0 and must be re-checked before it is relied on:
- Telemetry. The research states anonymous telemetry is on by default, opting out with
OPENSPEC_TELEMETRY=0orDO_NOT_TRACK=1. Treat this as live until re-verified — set one of those variables in the program’s environment, and confirm the current default on 1.8.0 before any Approved Software submission, since telemetry posture is exactly what that review asks about. - No constitution equivalent. Cross-cutting architectural governance is thinner than
spec-kit’s; the program carries its conventions in
openspec/config.yamlcontext instead. - Support is Discord-centric rather than documented issue threads.
- Weaker for true greenfield, since there is nothing to delta against yet.
- Telemetry. The research states anonymous telemetry is on by default, opting out with
- A spec-kit island remains.
cli/keeps.specify/memory/constitution.mdandspecs/001-patterson-cli-v1/. Two spec formats now coexist in the org, and anyone moving between repos has to know which one they are in. - No comparative evidence was produced. If the choice is ever challenged, there is no bake-off to point at — only this record and the prior research.
Neutral
Section titled “Neutral”openspec/specs/is currently empty. That is expected: under the change-driven model, specs accumulate only as changes are archived.- New
cli/work documents itself in that repo’s established spec-tree style — aspecs/002-…mini-spec — while program-level planning uses OpenSpec here. No migration ofcli/is planned. HANDOFF.md§1E remains accurate as a record of the original directive; this ADR is the record of its supersession.
Alternatives considered
Section titled “Alternatives considered”spec-kit (github/spec-kit)
Section titled “spec-kit (github/spec-kit)”The case for it was real. cli/ already runs it: a ratified seven-principle constitution and
a full feature tree that cli/AGENTS.md names as the source of truth, winning on any drift. That
is a working, non-trivial investment, and the constitution mechanism — binding principles every
feature inherits — has no OpenSpec equivalent.
Why it lost:
- Python runtime.
uv tool install specify-cli, Python 3.11+. Python is forbidden by this machine’s global rules and by theHANDOFF.mdground rules. This alone was disqualifying at program level. - Weight. Per the research, roughly eight files per spec and a phase-gated pipeline, weak on small iterative changes — a poor fit for a program made of many small, parallel workstreams.
- The bake-off that would have tested these claims was superseded by a direct decision before it ran. spec-kit was not evaluated head-to-head here.
The cli/ investment argument is answered by scope rather than by rebuttal: cli/ keeps
spec-kit, and nothing in it is migrated.
Neither / no framework
Section titled “Neither / no framework”Rejected. Delegating workstreams to subagents without a written, addressable unit of work was the failure mode this program was already hitting.
References
Section titled “References”HANDOFF.md§1E “spec-kit AND OpenSpec, then an ADR” —/workspaces/code/github.com/patterson-agents/HANDOFF.md- SDD landscape research (describes OpenSpec v1.4.x) —
/workspaces/code/github.com/patterson-agents/downloads/patterson/sdd-landscape.html - Existing spec-kit constitution,
cli/—/workspaces/code/github.com/patterson-agents/cli/.specify/memory/constitution.md - OpenSpec — https://github.com/Fission-AI/OpenSpec
- spec-kit — https://github.com/github/spec-kit
- Program OpenSpec root —
openspec/config.yaml,openspec/changes/
Source of truth: docs/decisions/0001-spec-framework.md in the patterson-corp repository.