Skip to content
Back to skills

Founder Defaults

ASecurity

This repository's standing engineering defaults — style, structure, testing, security, dependencies. Use at the start of any implementation task.

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 19, 2026
developmentpythonrustgosqltestinggitapidatabasesecurityperformance

Works with

  • api

Security analysis

A100/100

Scanned September 23, 2026

npx -y skills add avanturer/claude-bestpractice --skill founder-defaults --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Founder Defaults?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Founder Defaults
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/avanturer-founder-defaults/badge)](https://www.skillsdirectory.com/skills/avanturer-founder-defaults)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: founder-defaults
description: "This repository's standing engineering defaults — style, structure, testing, security, dependencies. Use at the start of any implementation task."
---

# Standing defaults

Every choice below is already made. Making it again per task is how a codebase ends up
with three date libraries and four error-handling styles, none of which is wrong on its
own. Deviate when the task genuinely requires it, and say why in the code.

Anything a gate already enforces is marked **[enforced]** — those are not advice, and
arguing with them costs a blocked turn.

## Language and style

- **Formatter, never hand-formatting.** Prettier for JS/TS, Black or Ruff-format for
  Python, gofmt, rustfmt. Run it; do not discuss it.
- **Types at every boundary.** Function signatures, exported values, API payloads. Not
  `any`, not `dict`, not untyped JSON crossing a module edge. **[enforced for
  docstrings]**
- **Errors are values or exceptions, consistently, never both in one layer.** Pick per
  language: exceptions in Python, `Result`/tagged unions in Rust and TS where the
  codebase already does, `error` returns in Go.
- **No swallowed exceptions.** **[enforced, permanent budget zero]** Catch what you can
  act on; let the rest travel.
- **Names say what, not how.** `charge_in_minor_units`, not `process_data_v2`.
- **A file is one idea.** When you cannot name it in three words it is two files.

## Comments and docstrings **[enforced]**

Full rules in the `llm-first-code` skill. The short version: a comment carries what the
code cannot — why this and not the obvious alternative, what breaks if it changes, which
measurement drove it. `Args:` / `Returns:` / `:param:` are banned; the types say it.

## Structure

- **Feature-first, not layer-first.** `billing/` containing its routes, logic and tests
  beats `controllers/ services/ models/` split three ways across the tree.
- **Depend inward.** Domain logic imports nothing from the framework. A test for it
  needs no server, no database and no network.
- **One place to read configuration**, at startup, typed and validated. Never
  `process.env.X` scattered through the code.
- **Migrations are additive.** Expand, backfill, contract — never a destructive change in
  one step. **[enforced past prototype]**

## Testing

- **Test the behaviour a user notices**, not the shape of the implementation. A test that
  breaks on a rename is a maintenance cost with no coverage.
- **Every bug gets a failing test first.** It is the only way to know the fix works and
  the only way it stays fixed.
- **No test asserting a mock was called.** That asserts the code you just wrote calls the
  code you just wrote.
- **Skipped tests are not passing tests.** **[enforced]** A suite that executes nothing
  is refused at Stop.
- **The suite runs in under two minutes**, or it will not be run.

## Security

- **Secrets come from the environment.** **[enforced before the write]** Never a literal,
  never a fallback default, never in a comment.
- **Every external input is untrusted**, including your own API's responses, webhook
  payloads and anything an error tracker reports.
- **Parameterised queries only.** String-built SQL is refused on sight.
- **Deny by default in auth.** A missing rule means no access, not full access.

## Dependencies

- **A new dependency needs a comparison on record.** **[enforced]** The stdlib option is
  always one of the alternatives, and it wins more often than it is chosen.
- **No dependency for something under twenty lines** you could own, test and understand.
- **Pin exact versions in applications**, ranges in libraries.
- **Prefer the boring one.** The library with five years of history and no releases this
  month is a feature, not a warning.

## Performance

- **Measure before optimising, and record the number.** An optimisation with no
  before-and-after is a guess with extra steps.
- **The three that actually matter:** an N+1 query, an unbounded result set, and work
  inside a loop that belongs outside it. Everything else is noise until measured.
- **No cache without an invalidation story** written down.

## Git **[mostly enforced]**

Worktree per session, never the trunk, conventional commit messages, no conflict markers
— all enforced. The parts that are not: keep a commit to one logical change, and write
the body when the subject cannot carry the reason.

## Delegating to a subagent **[enforced]**

- **Name the tier on every spawn.** `model` is a field on the call, and a call that omits
  it runs the subagent on this session's own model — the most expensive one in the room.
  A tier pinned in the agent's own definition counts and needs nothing on the call.
    - `haiku` — mechanical work with one right answer: search, extraction, a scripted
      edit, reading a log.
    - `sonnet` — ordinary implementation and review. Most delegated work belongs here.
    - `opus` — design, ambiguity, a judgement the parent cannot make for itself.
    - `fable` — a long autonomous run that has to investigate before it acts.
- **A fan-out needs a reason beyond speed.** Each agent pays for its own context of this
  repository before it reads a line of the answer, and three searching the same tree
  return the same answer three times. Three per turn is the ceiling; it is the founder's
  number, not this session's.
- **Delegate a QUESTION, not a chapter.** An agent that comes back with a conclusion has
  earned its context. One that comes back with the files it read has spent it.

## When a gate here blocks you **[enforced]**

A refusal from this plugin is yours to resolve, and the founder is not the next step.

1. **Decide which it is.** Either the gate is right — in which case what it asked for is
   still owed — or it is wrong about this case. You have the refusal, the call and the
   repository; nobody else is better placed to tell.
2. **If it is right, do what it names.** The refusal says what would satisfy it.
3. **If it is wrong, file it and carry on:**
   `claude-bp-report defect "<what it refused and why that is wrong>"`. It costs the turn
   nothing and sends nothing without `claude-bp-report send`. Then take the shortest
   correct route to the same work.

Reporting a gate to the founder is not a finish, and the Stop gate refuses a turn that
ends on a block nothing was done about. The exceptions are the refusals that genuinely
wait on a person — an unapproved merge, a production deploy, a switch that is theirs to
set. Those say so, and stopping is the right answer to them.

## When these conflict with the task

The task wins, and you say so in the code: one comment naming the default and why this
case is different. Silent deviation is the thing this file exists to prevent — the next
session cannot tell a considered exception from an accident.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…