Spec packs for coding agents

Hand your agent a spec pack. Skip the back‑and‑forth on the basics. Then customize it for your use case.

Each pack spells out every decision a product needs, with tests for each one. Your agent builds from it without stopping to ask you questions, runs the tests until everything passes, and the code lives in your own repo.

$ symbola pull kausalflow/lightkone
Browse packs How to use a pack
spec pack the decisions Python { } Go { } TypeScript { } 1 fail any builder, any language
One pack, built in three languages. Its tests tell each build what still needs fixing.

Why packs

Software isn't about the code anymore.

Every new product starts with the same groundwork: importing data, search, duplicates, deleting and restoring, the odd date format. None of it makes your product special, yet it takes the first weeks and is where many bugs hide. A coding agent can type the code quickly, but it still has to guess how each piece should behave.

A pack settles that groundwork in advance. Every behaviour is written down with a test, so your agent builds to a clear target, the tests tell it when it is done, and you start on the part that is actually yours.

{ Python } a startup { Go } a bank { TypeScript } your team the pack one pack

Skip the groundwork

The everyday features most products need, worked out case by case. Your time goes to what makes your product different.

Nothing left to guess

Each behaviour has a written answer and a test that checks it. The Lightkone pack, for example, settles 72 decisions with 360 tests.

Yours to keep and change

The result is plain code in your own repo, with no runtime and no lock-in. Change it however you like, or rebuild it in another language from the same pack.

Browse packs

Ready-made specs for real products. The green dots show how much of each pack has a build that passes its tests.

How it works

From a pack to running code in three steps.

in → out briefobligationsassumptionschecks every decision has a test
One

Pick a pack

A pack holds the product's brief, every decision it needs, and the tests that check each one. Nothing is left for your agent to guess.

A field left empty:guess, or ask? The pack decides:field-edge-cases no guessing, in any language
Two

Your agent builds it

Give pack.md to Claude Code or any coding agent and pick a language. Questions it would normally stop and ask you are already answered.

search-query kausalflow/lightkone 106 / 106 checks passed impl 9c094f87…e2a39 PASSED done when every test passes
Three

The tests say when it's done

The pack's tests run as your agent works, so it knows what is still wrong and fixes it. When everything passes, the build is done and the code is yours.

Using a pack

You send three messages. Your coding agent does the rest, checked by the pack at every step.

~/my-library
Your part: pull, ask, and say what to change.The agent's part: read the spec, write the code, run every check, fix what fails, and finish the job.

One decision, end to end

A real rule from the kausalflow/lightkone pack, and how its test stops an agent from guessing wrong. The search data is simplified.

Obligation · decided

Trashed papers appear only with is:trash, and then only trashed papers appear; an empty trashed field is not trashed.

search.trashdecided4 checks

Two reasonable builders could easily disagree here. Should a deleted paper still turn up in search? The pack settles it once, so nobody has to guess.

Example check

p1Bayesian priors for small samples
p2Causal graphs in practice
p3Causal notes, old draft in trash
SearchMust return
causalp2
is:trashp3

p3 matches "causal" too, but it is in the trash, so it must stay hidden.

Running the check

SearchExpectedBuild A, GoBuild B, Python
causalp2p2 ✓p2, p3 ✗
is:trashp3p3 ✓p3 ✓

Both builds look fine in a quick demo. Build B guessed that trashed papers still match a search. The check catches it, so Build B gets no passing result for this part until it is fixed.

The finished result

pack kausalflow/lightkone, version 1 component search-query build kausalflow/lightkone result 106 of 106 checks passed code sha256:9c094f87…0e2a39 checked 2026-10-25, reproducible

This is Lightkone's own result for this part, shown on the pack page with the pack's other test results.

For publishers

Know how a product should work? Package it once, and every coding agent can build it.

Python Go TypeScript Rust Java Swift your pack ♥ by you

Write it once, built everywhere

People you will never meet build your pack in Python, Go, TypeScript and more. Every build follows your decisions, because your tests check each one.

Your agent writes most of it

symbola extract drafts a pack from software you already have. You read through the decisions, settle the open ones, and publish.

Credit and support

Each pack page shows who published it, with your profile and support links such as GitHub Sponsors or Buy Me a Coffee. Paid packs are coming later.

See it working in the wild

Builds that pass your tests are listed on your pack page, so you can see who is using your spec and in which languages.

  1. 1
    Start a packsymbola pack init or symbola extract
  2. 2
    Settle the decisionsMark each one decided, a default, or open for builders
  3. 3
    Publishsymbola publish, or upload it on the site

Built for agents to read

Every page has a plain-text twin.