GitHub - tamarillo-ai/theta-spec: harness agnostic configuration standard · GitHub
/" data-turbo-transient="true" />
Skip to content
Search or jump to...
Search code, repositories, users, issues, pull requests...
-->
Search
Clear
Search syntax tips
Provide feedback
--><br>We read every piece of feedback, and take your input very seriously.
Include my email address so I can be contacted
Cancel
Submit feedback
Saved searches
Use saved searches to filter your results more quickly
-->
Name
Query
To see all available qualifiers, see our documentation.
Cancel
Create saved search
Sign in
/;ref_cta:Sign up;ref_loc:header logged out"}"<br>Sign up
Appearance settings
Resetting focus
You signed in with another tab or window. Reload to refresh your session.<br>You signed out in another tab or window. Reload to refresh your session.<br>You switched accounts on another tab or window. Reload to refresh your session.
Dismiss alert
{{ message }}
tamarillo-ai
theta-spec
Public
Notifications<br>You must be signed in to change notification settings
Fork
Star
main
BranchesTags
Go to file
CodeOpen more actions menu
Folders and files<br>NameNameLast commit message<br>Last commit date<br>Latest commit
History<br>1 Commit<br>1 Commit
assets
assets
docs
docs
schemas/2026-04
schemas/2026-04
.gitignore
.gitignore
CONTRIBUTING.md
CONTRIBUTING.md
README.md
README.md
STYLE.md
STYLE.md
harnesses.toml
harnesses.toml
mkdocs.yml
mkdocs.yml
pyproject.toml
pyproject.toml
uv.lock
uv.lock
View all files
Repository files navigation
theta-spec
theta-spec is a declarative, harness-agnostic configuration standard for AI coding agents. One theta.toml file defines the full configuration surface, i.e. instructions, rules, tools, skills, subagents. A protocol is specified for the lifecycle of this configuration file, and any theta-spec compliant implementation can resolve, lock, and cast it to any supported harness.
theta is the default implementation of this spec — a Rust CLI that resolves, locks, and casts theta.toml to any supported harness.
Docs
All the documentation for the specification is present here and can also be built and served locally by running
uv run mkdocs serve --livereload
Motivation
Agent harnesses are here to stay. Each one ships its own configuration format but still all of them share similarities. Maintaining and declaring configurations is a burden. There is no standard way to share, version, or reproduce an agent configuration.
Parametrizing the configuration surface into a single manifest:
Displays the exhaustive configuration at a glance
Provides an entrypoint for searching the resources that define an agent
Enables reproducible configurations between people and between agents
Makes mutation strategies explicit and diffable
Facilitates maintenance across harness updates
Enables a project lifecycle tool, which is why the theta CLI exists
A parametrized function and a well-defined cost function enables function approximation. If the goal is to optimize the way we work with agents, this is the first tiny step towards building the tooling needed to cover at least one gap, the parameters.
Understanding the spec: theta.toml
Most of the spec is read-self-explanatory for anyone familiar with agent harnesses. A detailed and exhaustive description of each one of the defining fields can be found condensed here and also in the manifest section of this doc.
This is how a theta.toml looks:
"]<br>model = "claude-sonnet-4-20250514"
[instructions]<br>system = "instructions/system.md"
[instructions.rules.concise]<br>src = "instructions/rules/concise.md"<br>apply = "always"
[instructions.rules.rust]<br>src = "instructions/rules/rust.md"<br>apply = "glob"<br>apply_to = ["*.rs"]
[tools.context7]<br>command = ["npx", "-y", "@upstash/context7-mcp@latest"]
[tools.playwright]<br>command = ["npx", "@anthropic-ai/playwright-mcp"]
[tools.memory]<br>command = ["npx", "-y", "@modelcontextprotocol/server-memory"]
[skills.osint]<br>source = { path = "skills/osint" }
[[subagents]]<br>name = "scraper"<br>description = "scrapes github repos for harness config patterns"<br>prompt_path = "subagents/scraper.md"<br>model = "claude-sonnet-4-20250514"<br>tools = ["playwright"]
[[subagents]]<br>name = "analyst"<br>ref = "agents/analyst/theta.toml"">[theta]<br>schema = "2026-04"
[agent]<br>name = "harness-researcher"<br>description = "researches agent harness configurations across public repos"<br>version = "0.1.0"<br>authors = ["ivan "]<br>model = "claude-sonnet-4-20250514"
[instructions]<br>system = "instructions/system.md"
[instructions.rules.concise]<br>src = "instructions/rules/concise.md"<br>apply = "always"
[instructions.rules.rust]<br>src = "instructions/rules/rust.md"<br>apply = "glob"<br>apply_to = ["*.rs"]
[tools.context7]<br>command = ["npx", "-y", "@upstash/context7-mcp@latest"]
[tools.playwright]<br>command = ["npx", "@anthropic-ai/playwright-mcp"]
[tools.memory]<br>command = ["npx", "-y", "@modelcontextprotocol/server-memory"]
[skills.osint]<br>source = { path = "skills/osint"...