contributing · git:20260825.257cdcd · 2026-08-25 · sha256 d5519a37ab771e97

contributing git:20260825.257cdcdA

Immutable. This exact content is served forever at /api/v1/blob/d5519a37ab771e97.

---
name: contributing
description: Use when contributing to Tel-Agent - picking an issue to work on, setting up the repository for the first time, starting or finishing a task, opening a pull request, or asking "what can I work on" / "how do I start" / "is my change ready to submit". Covers the full path from a fresh clone to a merged pull request.
---

# Contributing to Tel-Agent

You are helping somebody contribute to Tel-Agent, an open-source AI phone assistant
published under AGPL-3.0 by Dpro GmbH.

**Read `CLAUDE.md` at the repository root before anything else.** It is the working
contract and it overrides this file wherever the two disagree.

## Before you touch anything

Three rules that are not negotiable, and breaking any of them wastes the maintainer's
time and the contributor's:

1. **Everything you write is in English** — code, comments, identifiers, commit
   messages, pull request text, issue comments. This is Rule 0 in `CLAUDE.md`. It is not
   about anybody's first language; it is what keeps one codebase readable.
2. **Never name a competitor** anywhere — code, comment, commit, issue, pull request, in
   any language. This is irreversible once pushed, so the check happens *before* the
   commit, not after.
3. **Never commit a secret** — no key, token, password, or real phone number. If one is
   needed to run something, it goes in `.env`, which is ignored.

## Step 1 — Find something to work on

Work comes from the public board and nowhere else. Do not invent a task, and do not
"just fix something you noticed while you were in there" — that goes in a new issue.

```bash
gh issue list --repo Dpro-at/Tel-Agent --label "good first issue" --state open
gh issue list --repo Dpro-at/Tel-Agent --label "help wanted" --state open
```

The board is at https://github.com/orgs/Dpro-at/projects/6

**Only take from the `Ready` column.** `Backlog` means blocked on something else; the
issue looks available and is not. Every issue carries a `level:` label:

| Label | What it means |
|---|---|
| `level: first-issue` | Small, self-contained, finishable in one sitting. Start here. |
| `level: easy` | Straightforward, little context needed. |
| `level: medium` | Needs some understanding of the codebase. |
| `level: hard` | Substantial, touches several parts. |
| `level: maintainer` | **Decides architecture. Do not take this one.** |

If the person you are helping has not contributed here before, steer them to
`level: first-issue`. There are real ones, not a token entry.

**Read the whole issue before starting.** Every issue is written with the same fields:
*Why* (the reason it exists), *Do* (what to build), *Done when* (the acceptance test),
*Verify* (the exact commands a reviewer will run), and sometimes *Needs* (issues that
must be closed first). If `Needs` lists something still open, this task is not ready —
go back to step 1.

## Step 2 — Claim it

```bash
gh issue comment <number> --repo Dpro-at/Tel-Agent --body "I would like to take this."
```

**Wait to be assigned before writing code.** One person per issue, and the assignment is
what stops two people building the same thing. If nobody responds within a few days, say
so on the issue rather than starting anyway.

## Step 3 — Set up, once

Everyone contributes through a fork. Nobody gets write access to the repository, and
that is the same rule for everyone.

```bash
gh repo fork Dpro-at/Tel-Agent --clone
cd Tel-Agent
git remote add upstream https://github.com/Dpro-at/Tel-Agent.git
```

**Check the email on your commits before the first one:**

```bash
git config user.email
```

If that address is not on your GitHub account (or your `@users.noreply.github.com`
one), your commits land *unlinked*: the work is merged and your name is on nothing.
This is the single most common way a contributor does real work and does not appear in
the contributors list.

**Running the project.** The frontend runs today:

```bash
npm --prefix web install
npm --prefix web run dev
```

The backend does not run yet — `agent/` and `api/` are empty, and building them is what
most of the open issues are. If an issue asks you to run something that does not exist,
re-read it: the task is probably to create it.

## Step 4 — Do the work

```bash
git checkout -b <type>/<short-name>
```

Types: `feat/`, `fix/`, `docs/`, `chore/`, `refactor/`, `test/`. Example:
`feat/backend-skeleton`.

**Stay inside the issue.** A pull request that does two things gets reviewed as slowly
as its harder half. Something else that needs fixing goes in a new issue.

Commits follow Conventional Commits:

```
feat(api): add health endpoint
docs(contributing): add a what-to-work-on section
```

Match the code around you — its naming, its comment density, its idiom. A change that
reads like it was always there is the goal.

## Step 5 — Verify before you open anything

Run the issue's own **Verify** commands first, then the repository gate for whichever
half you touched:

```bash
# Python
ruff check . && ruff format --check . && mypy . && pytest

# web/
npm --prefix web run lint
npx --prefix web tsc --noEmit
npm --prefix web run build
```

Nothing you touched may go red.

**Then check by hand:**

- No secret, key, token, password or real phone number in the diff.
- No competitor named anywhere, in any language.
- Everything in English.
- If it is visible, screenshots in light and dark, and one in `ar` if the layout is
  direction-sensitive.

**Do not report the task finished until these actually pass.** If something fails and
you cannot fix it, say so plainly in the pull request — a known failure stated honestly
is useful; a silent one wastes a review cycle.

## Step 6 — Open the pull request

```bash
git push -u origin <branch>
gh pr create --repo Dpro-at/Tel-Agent --title "<same as the commit>" --body "..."
```

The body says: what you did, what you deliberately did not do, and how you tested it.
Link the issue with `Closes #<number>`. Paste the output of the Verify commands.

Open it as a **draft** while it is not ready. Ready for review means you believe it is
done.

**The CLA.** The first pull request cannot be merged until its author has signed the
Contributor License Agreement. Expect to be asked.

## Step 7 — Review

Expect changes to be requested. It is not a verdict on the person.

Push follow-up commits to the same branch. **Do not force-push during a review** — the
reviewer loses their place in the diff.

It lands as a squash-merge, done by a maintainer. The branch is deleted automatically.

## If the work has to stop

Half the people who take an issue never finish, and that is normal. Saying so is a
contribution: it returns the task to the pool the same day instead of fourteen days
later, which is when an inactive assignment is cleared automatically.

```bash
gh issue comment <number> --repo Dpro-at/Tel-Agent --body "I cannot finish this - unassigning so somebody else can take it."
```

## What "done" means

The code works, the tests cover it, the documentation says so, and `.env.example` lists
any variable that was introduced. All four, not three.