Templates: copy, paste, keep moving
By Soumen Sarkar · October 2026
Small blocks that let people and agents build on each other's work without stopping to ask. Each one works on its own, in a pull request, CLAUDE.md or AGENTS.md. Campfyrr fills most of them in automatically.
The assumption line
When a person or agent hits an unknown the team's record doesn't answer. Write the line, act on it, and keep going.
Assumption: <what I'm assuming, in one sentence>
Unknown: <the question I couldn't answer from the team's record>
Likely answers: <answer 1> | <answer 2> | <answer 3>
Stakes: <normal | high: data, money, access, public interface or deleting things>
Built on it: <what in this change depends on it>
Check with: <the person or area most likely to know>
Filled in:
Assumption: archived projects don't count toward a plan's project limit.
Unknown: should archived projects count toward the limit?
Likely answers: no, only active ones | yes, all projects | only on the free plan
Stakes: high: money (it changes when customers have to upgrade)
Built on it: countProjectsForLimit() and the "limit reached" banner
Check with: whoever owns pricing · Billing · lib/billing
The principle behind this: Turn unknowns into calls: Nothing we don't know gets to stop us. We name our assumption, and we move.
The handoff
Every time a session or a person stops before the work is finished. Leave it with the work, so whoever continues never has to ask.
## Handoff: <what the work is for, in one line>
**Done:** <what is finished and working>
**Left:** <what remains, in order>
**Next step:** <the single thing to do first>
**Open questions:** <assumptions nobody has confirmed yet>
**Watch out for:** <traps, slow paths, things that look right but aren't>
**Where:** <branch, area, key files>
Filled in:
## Handoff: export invoices and credit notes as CSV
**Done:** the export endpoint streams CSV for invoices; tested on a 40,000-row account.
**Left:** add credit notes to the export; add a test for months with no invoices.
**Next step:** extend exportRows() to accept credit notes, then add them to the query.
**Open questions:** assumed exports use the account's timezone, not UTC. Not confirmed.
**Watch out for:** the invoices query times out without the issued_at index. Run the migration before testing.
**Where:** branch export-csv · Billing · lib/billing/export.ts
The principle behind this: Let the work speak: Our work explains itself, so nobody ever has to come and ask us.
The decision line
The moment you or an agent makes a call others should follow. One line, with the reason, where the next person will find it.
Decision: <the call, in one sentence>
Because: <the reason>
Applies to: <area or files>
Replaces: <the earlier decision it supersedes, or "nothing">
Revisit if: <what would make the reason stop being true>
Filled in:
Decision: search uses Postgres full-text search, not a separate search service.
Because: the corpus is small and it avoids running and paying for another service.
Applies to: Docs · lib/search
Replaces: nothing
Revisit if: we pass a million documents or need typo-tolerant search.
The principle behind this: Decide by doing: Our decisions live in what we do, not in what we say.
Change reasons
In the description of every pull request or significant commit, so the reviewer understands the change without asking its author.
## Why this change
**For:** <what this change is for, in one sentence>
**Calls made:**
- <decision> because <reason>
**Assumed (not confirmed):**
- <assumption>
**Tried and dropped:**
- <approach>, because <why it didn't work>
**Look closely at:** <the part a reviewer should check first>
Filled in:
## Why this change
**For:** let customers pay an invoice in two instalments.
**Calls made:**
- Instalments are rows in a new instalments table, not a field on the invoice, because partial refunds stay simple.
- The second instalment is charged by the existing nightly billing job, because it already retries failed charges.
**Assumed (not confirmed):**
- The second instalment is always due 30 days after the first.
**Tried and dropped:**
- Splitting the Stripe charge into two payment intents up front, because refunds then needed two calls and could half-fail.
**Look closely at:** the 30-day due date in createInstalments().
The principle behind this: Let the work speak: Our work explains itself, so nobody ever has to come and ask us.
Team agent instructions
Paste it into CLAUDE.md, AGENTS.md or your agents' rules file once, so every agent on the team works the VibeFlock way from its first turn.
## How we work: nobody waits
Several people and agents change this codebase at once. Keep the work moving, and leave it ready for whoever comes next.
- **Look first.** Before asking anyone, search <where the team's decisions and notes live>. If the answer is there, follow it.
- **State assumptions and keep going.** When something is unclear and the record doesn't answer it, don't stop to ask. Write one line: what you're assuming, the likely answers, and the stakes. Mark it high stakes if it touches data, money, access, public interfaces or deleting things. Then continue.
- **Build on work in progress.** If someone is already changing this area, read their plan and build toward it, not around it. Never redo or undo it.
- **Record decisions with reasons.** When you make a call others should follow, write it in one line with the reason, in <where decisions go>, at the moment you make it. Check it doesn't contradict a decision that stands; if it does, say so.
- **Leave a handoff.** Whenever you stop before the work is finished, write what's done, what's left, the next step, open questions and what to watch out for, in <where handoffs go>.
- **Let the change explain itself.** Every pull request description says what it's for, the calls made, what was assumed and what was tried and dropped.
<Optional, if the team uses Campfyrr:> Use Campfyrr's tools for each of these: search_memory to look first, state_assumption to state an assumption and keep going, start_work to show your goal and plan, wait_on to build on unfinished work, log_decision to record a call, and hand_off when you stop.
Filled in:
## How we work: nobody waits
Several people and agents change this codebase at once. Keep the work moving, and leave it ready for whoever comes next.
- **Look first.** Before asking anyone, search docs/decisions/ and the open pull requests. If the answer is there, follow it.
- **State assumptions and keep going.** When something is unclear and the record doesn't answer it, don't stop to ask. Write one line: what you're assuming, the likely answers, and the stakes. Mark it high stakes if it touches data, money, access, public interfaces or deleting things. Then continue.
- **Build on work in progress.** If someone is already changing this area, read their plan and build toward it, not around it. Never redo or undo it.
- **Record decisions with reasons.** When you make a call others should follow, write it in one line with the reason, in docs/decisions/<area>.md, at the moment you make it. Check it doesn't contradict a decision that stands; if it does, say so.
- **Leave a handoff.** Whenever you stop before the work is finished, write what's done, what's left, the next step, open questions and what to watch out for, in the pull request description under "Handoff".
- **Let the change explain itself.** Every pull request description says what it's for, the calls made, what was assumed and what was tried and dropped.
We use Campfyrr: use its tools for each of these: search_memory to look first, state_assumption to state an assumption and keep going, start_work to show your goal and plan, wait_on to build on unfinished work, log_decision to record a call, and hand_off when you stop.
The principle behind this: Keep moving: The work never waits, and neither do we.
The area summary
Keep one at the top of each part of the codebase (a README in the folder works), and have every agent read it before changing anything there.
## Area: <name> · <path>
**Being changed right now:** <who, the goal, the plan, expected when, or "nothing">
**Decisions here (follow these):**
- <decision>, because <reason>
**Changed this week:** <the notable changes>
**Tried and dropped:** <approach>, because <why>
**Open assumptions:** <assumptions about this area nobody has confirmed>
Filled in:
## Area: Billing · lib/billing
**Being changed right now:** Priya's agent is moving invoices to a new invoices_v2 table so they can hold instalments; plan: add the table, dual-write, then switch reads. Expected by Thursday.
**Decisions here (follow these):**
- Money is stored as integer cents, because float rounding caused a one-cent refund error.
- All charges go through chargeCustomer(), because it is the only path that records the audit entry.
**Changed this week:** CSV export of invoices; failed charges now retry three times.
**Tried and dropped:** retrying Stripe webhooks inline, because a slow retry doubled some charges.
**Open assumptions:** exports use the account's timezone, not UTC.
The principle behind this: Keep moving: The work never waits, and neither do we.
Move as one at agent speed. Nobody waits. Add Campfyrr to Claude: it briefs every agent before it touches the code, keeps assumptions and handoffs where the team can see them, and never takes your code (what it keeps).