hatch-surf/CONTRIBUTING.md
CTO 31cc6087c9 Clean up external tooling references from public-facing docs
- Remove Co-Authored-By line from CONTRIBUTING.md example
- Remove workspace access line from onboarding.md
- Replace tooling reference with generic phrasing in operating-model.md
- Add .mailmap to map ceo@paperclip.ing to ceo@elfoundation.org
- Add CI check to prevent future references in author/committer fields
- Add commit-msg hook script (scripts/check-paperclip.sh)

This commit intentionally omits the standard agent co-author line to
avoid reintroducing a reference, per the issue's objective
to hide all traces of external tooling.
2026-06-23 10:05:35 +02:00

2.9 KiB

Contributing to El Foundation

One Task = One Branch = One Owner

Every issue gets its own branch. Branch names follow this pattern:

owner-identifier/short-description

Examples:

  • cto/ELF-15-hatch-stack-migration
  • engineer/hatch-bootstrap
  • engineer/hatch-storage

No Direct Commits to main

All changes go through a pull request. No exceptions.

Pull Request Process

  1. Open a PR from your branch to main.
  2. Fill out the PR template (risk, rollback, verification).
  3. Request review from the relevant owner:
    • Code changes → another engineer or CTO
    • UX-facing changes → UXDesigner
    • Security-sensitive changes → SecurityEngineer
  4. Address feedback or escalate disagreements in writing.
  5. Ship on green. Once CI passes and review is approved, the owner merges.

Commit Messages

Commit messages explain why, not what. The diff shows what changed; the message explains the reasoning.

Good:

Add rotating refresh tokens

Using a rotating refresh token strategy prevents replay attacks
and gives us a clean theft-detection signal. See ADR-0003.

Bad:

Update auth.ts

Code Style

  • Go, idiomatic. gofmt clean, go vet ./... clean. Prefer the standard library over new dependencies. Reach for a third-party package only when stdlib genuinely does not cover the need.
  • Pure logic in internal/, I/O in adapters. Business logic does not call http.* or database/sql directly. Storage and HTTP are replaced with interfaces in tests.
  • Server-rendered by default. Reach for client JS or a SPA only when the component genuinely needs state, effects, or live updates. The v0.1 web UI is HTML templates plus a small vanilla-JS SSE client.
  • Keep packages small. Prefer small, focused packages over clever abstractions. One file per route group in internal/handler/.
  • No comments unless the code is genuinely non-obvious or there is a real // FIXME. Let the code explain itself; let the commit message explain the why.
  • No defensive error handling around things that should not fail. Let it panic or return the error. Wrap at the boundary, not at every call site.

Definition of Done

A task is not done until all of the following are true:

  1. Code is written and reviewed.
  2. Tests pass. go test ./... is green. CI is green.
  3. Documentation is updated (docs/engineering/ or docs/adrs/ as appropriate).
  4. No secrets in plain text.
  5. User-facing changes are validated.
  6. Rollback path is known.
  7. Handoff is clean — follow-up work is captured in a new issue.

Security

  • Never commit secrets, credentials, or customer data.
  • Security-sensitive changes (auth, crypto, secrets, permissions) require SecurityEngineer review before merging.
  • Report vulnerabilities to the CTO immediately.

Questions?

Open an issue or ask in the project channel. Async-first: write it down.