Skip to content

Contributing & Conventions

How we collaborate day-to-day: pull-request process, code-review etiquette, and pre-flight checklists.

Looking for how code reaches production — branches, previews, the staging freeze, releases, hotfixes? That's the Release Workflow, the single source of truth for the flow itself. This page covers the conventions layered on top of it.


Branching & flow

Shootify uses AtomiqFlow, a PR-based draft/ready release model. The full model — the branch table, cross-repo previews, the DRAFT/READY staging freeze, releases, and hotfixes — lives in Release Workflow, the source of truth. Don't duplicate it here; link to it.

The one convention you need before that page: name branches <ISSUE-CODE>/<short-slug> — e.g. SAR-1234/forgot-password. The issue-code prefix is how cliq finds your branch when it builds a cross-repo preview, so use it consistently across every repo you touch.

For the inner loop before a preview, run an isolated local stack with hot reload keyed to your task — cliq local up <slug> --task <ISSUE-CODE> (see cliq → local). Multiple slugs run in parallel, each on its own DB / Redis / ports / storage, so you can keep one task alive while validating another. Reach for cliq preview create (next section) once you need a public URL or real-OAuth / R2-transform behavior.


Commit and PR title invariant

Commit headers and PR titles use type(scope)[!]: subject, with a required lowercase scope and ! for incompatible public contracts. The exact 11 types, header rules, final-diff classification process, contract surfaces, and semantic-version mapping live only in Release Workflow → Commit and version contract.

Classify what the final diff implements. Do not infer the header from an issue, branch, history, or requested version bump, and do not let supporting tests or documentation override the primary effect.


Pull Request Process

Creating a Pull Request

  1. Push your branch to origin
  2. Open PR via GitHub (or gh pr create)
  3. Fill in the template completely

PR Template

## Summary

Brief description of the changes (2-3 sentences max).

## Changes

- Bullet point list of what changed
- Be specific about files/components affected
- Note any breaking changes

## Testing

- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] Manual testing completed
- [ ] Edge cases considered

## Screenshots

(If UI changes, include before/after screenshots)

## Related Issues

Closes #123

PR Requirements

Requirement Details
Title Contract header format, at most 72 characters (e.g., feat(auth): add SSO support)
Description Complete template with summary, changes, testing
Size Under 400 lines changed (split large PRs)
Tests New code must have tests
CI All checks must pass
Review At least 1 approval required

Linking to Issues

Use GitHub keywords to auto-close issues:

Closes #123
Fixes #456
Resolves #789

Code Review Guidelines

What Reviewers Look For

Category Questions to Ask
Correctness Does it do what it claims? Are edge cases handled?
Design Does it follow existing patterns? Is it maintainable?
Simplicity Is there unnecessary complexity? Can it be simpler?
Testing Are tests adequate? Do they test behavior, not implementation?
Security Any injection risks? Auth checks in place? Sensitive data exposed?
Performance Any N+1 queries? Unnecessary loops? Memory issues?

Giving Constructive Feedback

Do: - Ask questions: "What happens if X is null?" - Suggest alternatives: "Consider using X instead of Y because..." - Acknowledge good work: "Nice approach to handling the edge case" - Be specific: Point to exact lines, provide examples

Don't: - Be vague: "This is wrong" - Be personal: "You don't understand..." - Nitpick style when linters exist - Block on preferences vs. real issues

Feedback Prefixes

Use these prefixes to clarify intent:

Prefix Meaning
blocking: Must be fixed before merge
suggestion: Optional improvement
question: Seeking clarification
nit: Minor style issue, non-blocking
thought: Not actionable, just sharing perspective

Responding to Reviews

  • Address all comments before requesting re-review
  • Reply to each comment (resolved, fixed, or explained)
  • Don't take feedback personally—it's about the code
  • If you disagree, explain your reasoning

Response Time Expectations

Action Target Time
Initial review Within 1 business day
Follow-up review Within 4 hours
Author response to feedback Within 1 business day

CI checks

Every PR into dev must go green before it can merge. Two checks gate it directly:

  • ci-checks — lint + format + types and the test suites (Ruff/MyPy for Python; ESLint/Prettier/tsc for TypeScript; pytest + Jest).
  • check-title — enforces the authoritative PR title contract for feature and hotfix PRs.
  • Contract reviews — inspect each feature/hotfix diff and the aggregate release candidate for incompatible public contracts.

The full pipeline — security scanning, image build/push, and the staging/prod deploy triggers — is documented in CI/CD, with the deploy side covered by Release Workflow. Don't restate the stages here.

gh pr checks            # status on your PR
gh run view <run-id>    # inspect a specific run
gh run rerun <run-id>   # re-run failed checks

Releases & versioning

How a service release is cut, frozen, shipped, rolled back, and semantically versioned is documented in Release Workflow. All three service repositories derive strict semantic tags from eligible final commit headers with identical bump semantics. Backend and webapp first bootstrap at v1.0.0; compute-server intentionally starts from its current project.version, 0.1.0. prod-* tags identify deployments and are not semantic-version inputs. The docs repository follows the header rules but not the service release automation.


Hotfix review expectations

The mechanics of a hotfix — when one is warranted, branching from main, the PR to main, and the mandatory merge-back into dev — are in Release Workflow → Bug found in prod. What's specific to how we review and follow up on a hotfix lives here.

Hotfix Contract Review

Hotfixes are reserved for critical production issues that cannot wait for the normal cycle, but urgency does not preclassify them as fix or patch and does not waive title, contract-review, test, or approval gates. Classify the complete final diff, use ! for any incompatible public contract, and keep the direct-to-main change as small as possible.

Post-Hotfix

  • Create follow-up issue for proper fix if hotfix was a band-aid
  • Schedule retrospective if hotfix was for preventable issue
  • Update monitoring/alerting if issue wasn't caught

Development Checklist

Before Starting Work

  • Issue exists and is assigned to you
  • Requirements are clear (ask if not)
  • Branch created from latest dev
  • Local environment is working

Before Committing

  • Code compiles/runs without errors
  • Tests pass locally
  • Linting passes (ruff check, bun run lint)
  • No secrets or credentials in code
  • No console.log or debug statements

Before Opening PR

  • Final diff and public contract surfaces were inspected before choosing the header
  • All commit headers follow the authoritative contract
  • Branch is rebased on latest dev
  • PR template is filled out completely
  • Tests added for new functionality
  • Documentation updated if needed
  • Self-reviewed the diff

Before Merging

  • At least 1 approval received
  • All CI checks pass
  • All review comments addressed
  • No merge conflicts
  • Squash commits if messy history