AI made shipping cheap. The scarce skill now is deciding what to build, and in what order, in a backlog that fills faster than anyone can read it. Cairn is the PM agent that does the sorting — read, deduplicate, shape, route — so your judgment goes to the decision, not the pile.
| Feature | Status | Appetite | Shapers |
|---|---|---|---|
| Merge duplicate signals at capture | Building | 6 weeks | NT |
| Grep the repo before shaping | Bet | 6 weeks | L |
| Quorum before a table is validated | Shaped | 2 weeks | M |
| Discard noise without deleting it | Shaped | 1 week | MT |
| Activity log in your language | Done | 2 weeks | N |
A Slack thread, a bug report, a whole transcript. Stored verbatim, hashed and embedded — even the noise, which is archived rather than destroyed.
The agent turns it into a pitch: a real problem, a fixed appetite, rabbit holes, no-gos. Not a reworded request.
A scored menu of what is worth doing. Members vote, the owner validates. Nothing is ever bet automatically.
The bet opens a cycle and scope freezes: from here, no signal can attach itself to work already in flight.
No reopening. A new need shapes a fresh iteration that supersedes the old one, and says so.
“…honestly the backlog is unusable, half of it is the same request three times. Also we keep re-filing the dedupe thing. And Ops asked again for a CSV export before Friday…”
Inserts a shaped feature. Creating is a deliberate act — the agent has to justify a new one, because duplicates are what kill a backlog.
Refines the existing pitch instead of forking it, attaches the signal to it, and resets the staleness clock.
Feedback, decisions, PR links and history all repatriate onto the survivor. The absorbed feature is archived, never destroyed.
The raw signal is still stored and archived — nothing is lost. A bug report is never discarded, whatever it looks like.
file:line rather than a stale ticket. The repo is grepped locally and never leaves your box. Already shipped. Dedupe-on-capture exists at server/gateway/intake.ts:142. Routed the signal onto feature #24 instead of opening a duplicate.
Cosine similarity against shaped features only. The score is a hint, not a rule: the agent is the judge, and it appends when a candidate addresses the same underlying problem — even when the two share not one word.
sha256 of the normalised signal. If it has already been routed, the commit is an idempotent no-op. Paste the same thread twice and nothing is written twice.
A pitch field is never overwritten by the raw instruction that triggered it. A shaped pitch cannot be degraded back into a reworded request.
The same request lands three times from three channels. Whoever triages last has no way to know it is already in the backlog.
No silent auto-merge. The agent proposes, a human confirms — writing only ever happens on confirmation.
Whatever isn’t bet on goes stale — and has to be re-defended.
There is no infinite backlog to hide in. A shaped feature nobody bets on is marked stale and has to earn its place again. The pile doesn’t grow — it gets defended, merged, or dropped.
docker run -d --name cairn \
-p 3000:3000 \
-v cairn_data:/data \
-e NUXT_SESSION_PASSWORD="$(openssl rand -base64 32)" \
-e ANTHROPIC_API_KEY="sk-ant-…" \
ghcr.io/cairnpm/cairn:latestNo telemetry, no phone-home. A linked product repo is grepped on your own disk and never uploaded anywhere.
The agent runs on your Anthropic key. There is no data detour through us, because there is no “us” in the loop.
Node and an embedded SQLite file. No external database, no queue, no account on someone else’s server.
FSL-1.1-ALv2: read every line, audit it, run it free forever. Each release turns Apache-2.0 two years after it ships.