A Claude Code plugin

Your agents write code faster than you can keep track of why.

Tillage keeps the reason behind everything your agents build: what it was for, what they were told, and who signed off.

Why now

Agents grep, follow imports and pass the tests. They can’t search for why.

They make calls mid-session, and the reasons leave with the chat. Four moments where that costs you, without Tillage and with it:

  1. 1Tracing a bug
  2. 2Changing course
  3. 3Decisions
  4. 4Context

Tracing a bug

When something breaks, see what the agent was told.

git blame gets you to a commit and its pull request. What the agent was told when it wrote the code went with the chat. Tillage keeps it: every task carries its commits, and a record of the rules and decisions it was handed.

You ask your agentSome clients were charged twice. Why?

Without Tillage

You can’t tell a misread from a bad instruction.

git blame, then the pull requestbilling/charge.ts
  1. The line · billing/charge.ts:88retry(charge, { times: 3 })
  2. git blame · commit a3f9e1c, Mar 3“Retry failed charges”
  3. PRPull request #231 · approved“Payment retries”, 900 lines
  4. What the agent was told · gone with the chatIts own idea, or an instruction?

The code does what the commit says. Nothing says why.

With Tillage

The agent followed a rule that has since changed.

Ask your agent: why was this charged twice?example
  1. The line · billing/charge.ts:88retry(charge, { times: 3 })
  2. git blame · commit a3f9e1c, Mar 3“Retry failed charges”
  3. Task · under Stripe payment linksRetry failed charges
  4. RIts receipt · the rule it was handed on Mar 3Retry a failed charge up to 3 timesedited Mar 9Now: retry a charge only with an idempotency key.

Also handed the old rule: Retry failed payouts · Charge saved cards on renewal

Changing course

When the direction changes, the code follows.

Your agent can grep for words and follow imports, but it can’t search for why a line changed. Tillage keeps that reason, so when you change direction, your agent can find what was built for the old one.

You ask your agentWe’re dropping crypto payouts. Remove that code.

Without Tillage

It greps for “crypto”, “wallet”, “usdc” and “payout”, follows the imports, and runs the tests.

2missed, out of 8

  • crypto-wallet.tsusdc-quote.tsprecision.ts0042_wallets.sqlwallet.test.tsWALLET_PAYOUTSFound by grep and imports, and removed.
  • payouts/schedule.tsevery: "1h"Changed from daily to hourly for crypto. Nothing there names crypto and the tests still pass, so fiat payouts keep running hourly.
  • Payouts run every hourStill in CLAUDE.md, so the next agent keeps it that way.

git blame on that line shows “Run payouts hourly”, and nothing about why.

With Tillage

It reads the tasks done for crypto payouts, and every commit they made.

0missed, out of 8

  • crypto-wallet.tsusdc-quote.tsprecision.ts0042_wallets.sqlwallet.test.tsWALLET_PAYOUTSIn the commits of crypto tasks, and removed.
  • payouts/schedule.tsevery: "1h"That change came from a crypto task’s commit, so it goes back to daily.
  • Payouts run every hourRecorded under crypto payouts, with its reason: USDC settles in minutes. It goes too.

Every task keeps its commits, and every rule sits under the proposition it serves.

Decisions

Agents decide fast. A person signs off.

An agent makes calls all session and mentions each one once, in a chat that ends. Tillage records every call with its reason and the option it turned down, and waits for a person to keep it.

You ask your agentMake the Stripe webhooks reliable.

Without Tillage

Decided twice, never by you.

Session summaries2 agents · 0 sign-offs

Mar 3 · agent · Stripe payment links

  • Added the Stripe webhook handler
  • Failed webhooks retry 5 times, then get dropped
  • Added 14 tests

Session ended. In pull request #214 it is 6 of 900 lines. Approved.

16 days later

Mar 19 · agent · Payment emails

  • Payment events were going missing
  • Failed webhooks now retry until they succeed
  • Added the “payment received” email

Session ended. Nobody was asked, either time.

With Tillage

Every call signed off by you.

Ledgerly · decisions and rulesexample
  1. D

    Retry failed Stripe webhooks six times, then stop

    Because
    Stripe keeps retrying for three days anyway.
    Turned down
    Retry until it succeeds
    agentStripe payment links
    Kept by you
  2. D

    Autofill a client only from their last 3 invoices

    Because
    Older invoices carry stale addresses.
    agentClient autofill
    Kept by you
  3. R

    Store every money amount as integer cents

    Because
    Floats lose cents when invoices are summed.
    youLedgerly
    Rule by you

New proposals from agents arrive at the top. Try keeping one; to remove one, you ask your agent.

Context

Every agent starts with the reason and tailored context, not just the ticket.

Rules files load by folder, and grep finds the rest. A decision made in a chat lands in neither. Tillage records each decision as it is made, and hands every agent the specific contexts for its task.

You ask your agentMake autofill match misspelled client names.

Without Tillage

Matches more names, and fills in old addresses.

Rules files and grepagent · Client autofill
Read by this agent6,180tokens
  1. CLAUDE.md and .claude/rules/invoices.md · loaded for this folderFormatting, tests and the invoice schema. Nothing on autofill’s limit.
  2. Matched by grep · replaced sincedocs/plan-autofill-v1.md: “Autofill from every past invoice”
  3. DNot written anywhere · decided in a chatAutofill only from the client’s last 3 invoices
  4. Not in the repo · in an old ticketClient lookup answers in under 200 ms
  5. Your taskMatch misspelled client names

With Tillage

Matches more names, and keeps addresses current.

start_workagent · Client autofillexample

Everything written for Ledgerly · 214,806 tokens

Specs, plans, rules, decisions and notes for every part of the map. A token is about three quarters of a word.

Given to this agent 3,412tokens

    Left out: other parts of the map · replaced decisions · docs/plan-autofill-v1.md

    How it works

    One map, from who it’s for down to every task.

    Four levels, from what your users get down to the tasks your agents pick up. Your agents read the map before they start, and write back what they did and decided.

    Ledgerly · example project, shortened to fit · scroll sideways 0 tasks verifiedwaiting on you · 00 agents working

    The line from a task up to its proposition

    Monday morning

    1. agentpicked up “Apply regional tax rates”
    2. mayaverified “Expire pay links after 30 days”
    3. agentmarked “Apple Pay on the pay page” done · 2 commits
    • To do
    • An agent is on it
    • Done, waiting on you
    • Verified by a person

    Point at a task to trace it up to its proposition. Click a level’s name to see what belongs there. In the app you open one level at a time.

    Level 1 · Propositions

    When anything can be built by tonight, choosing is the job.

    A proposition names who it’s for, what changes for them, and how you’ll measure it. Every new idea has to serve one, or it waits for you to decide.

    1. For
    2. What changes
    3. Measure
    4. Verdict
    Ledgerly · new ideas this weekexample
    Pay by bank transfer

    Which proposition does it serve?

    Under “Link every invoice” · Paid within a week
    Core value proposition1 / 2 approaches shipping

    Freelancers get paid within a week

    For
    Freelancers who invoice their clients
    What changes
    Invoices are paid within 7 days of being sent
    Measure
    Median days from sent to paid · target 7 by Mar 31

    What we don’t know yet

    • ?Do clients open reminder emails?answered · most do
    • ?Do payment links get invoices paid sooner?answered · 4.2 days sooner
    • ?Will clients accept a card fee?open · 1 of 2 checks done
    Verdict on Mar 31validatedinvalidatedretired
    On the map
    • Stripe payment linksPaid in a week
    • Client autofillInvoice in a minute
    Parked candidates
    • Team workspacesparked
    • Browser extensionparked

    Build at agent speed, in the direction you chose.

    For you · today

    Try it on the project you’re in now.

    1. 1 · Install, in Claude Code

      /plugin marketplace add Reine0017/tillage
      /plugin install tillage@tillage

      Needs Node 22.12 or newer and Claude Code 2.1.287 or newer.

    2. 2 · Ask for it

      /tillage:map set up this repo. I’m working on …

      It starts only when you ask.

    3. 3 · Your first session

      Your agent maps only the part of the project your task lives in, and checks the docs there against the code.

    A card titled Mismatch: docs versus code. The rule from CLAUDE.md says to call the payment API through lib/stripeClient.ts; the code calls the payment SDK directly, and that file was deleted. Below: reply to your agent to change the code, change the rule, or drop the rule.
    From the app · a first session finds a rule the code no longer follows
    • Stays on your machine. Your map lives in ~/.tillage. The plugin makes no network calls.
    • CLAUDE.md becomes a short pointer to the map.
    • One switch. Disabling the plugin turns all of it off.
    • Free, and readable code under the Functional Source License.

    For teams

    Product and engineering can’t be two teams anymore.

    When agents write the code in hours, product and engineering have to work from one map, the one your agents read from. Team seats are on the way. Tell us about your team and we’ll be in touch.