All work after the repository bootstrap follows this flow:
- Create or refine a GitHub issue with a narrow scope.
- Create a branch from
mainnamedcodex/<issue-number>-<slug>. - Implement only the work required for that issue.
- Use conventional commits.
- Open a pull request that references the issue.
- Merge to
mainonly through the pull request.
Direct pushes to main are not part of normal delivery.
Every issue must stay small enough to be reviewed comfortably in one pull request.
Each issue should define:
- goal
- scope
- out of scope
- acceptance criteria
- dependencies
- test plan
If the issue cannot be implemented and reviewed as a focused change, split it.
Use this branch format:
codex/<issue-number>-<short-slug>
Example:
codex/12-install-livewire
Use conventional commits:
type(scope): summary
Examples:
chore(repo): add issue templates
feat(auth): install fortify backend flows
fix(admin): stop impersonation after logout
Preferred types:
featfixchorerefactortestdocsci
Keep each commit atomic. If a commit message cannot describe one clear change, the change is probably too large.
Every pull request must:
- reference its issue
- stay within the issue scope
- describe user-facing or developer-facing impact
- list tests run
- note any follow-up work explicitly
PRs should avoid unrelated cleanup or opportunistic refactors unless the issue requires them.
main is the release branch. Merges to main are expected to use conventional commits so automated semantic versioning can infer the next release.
The repository uses Release Please on pushes to main. That workflow will:
- inspect merged conventional commits
- create or update a release pull request when needed
- tag releases using semantic versioning
A change is done when:
- the implementation matches the issue acceptance criteria
- tests appropriate to the change are added or updated
- local verification has been run
- the PR description is complete
- the change is small enough to review without broad architectural guesswork