Git
How change is recorded.
Workflow
- Work on the branch defined for the task at hand. Never push directly to
main. - Create new commits rather than amending. Never force-push or skip hooks without explicit permission.
- Task PRs target their milestone branch; milestone PRs target the latest
main. Work outside a milestone stays on a feature branch and PRs only when explicitly asked.
SSH agent timeouts
Pushes and fetches occasionally time out. The 1Password SSH agent backs the
github.com-*host aliases, and it intermittently stalls — surfacing asOperation timed outon port 22, orPlease make sure you have the correct access rights and the repository exists.This is expected and transient. Wait and retry first. It is not a credential, permission, or connectivity fault, and it does not mean the remote, the key, or the repo is misconfigured.
If it persists, fall back to a token-authenticated HTTPS push or fetch, passing the URL explicitly on the command line:
git push https://github.com/<owner>/<repo>.git HEAD:<branch> git fetch --prune https://github.com/<owner>/<repo>.git "+refs/heads/*:refs/remotes/origin/*"- The
gh auth git-credentialhelper supplies the token. Never embed it in the URL — that leaks it into the reflog, config, and process list. - Match the active
ghaccount to the repo owner first (gh auth switch -u <account>); the helper serves the active account's token, so a mismatch 404s on private repos.
- The
The fallback is temporary and per-command. Never
git remote set-urlto HTTPS, never add aurl.*.insteadOfrewrite, and never switch tossh.github.com:443, regenerate keys, edit~/.ssh/config, or re-authenticategh. The configured SSH remote stays exactly as it is; only the single command takes the detour.After an explicit-URL push, refresh the tracking refs. Pushing to a URL does not update
refs/remotes/origin/*, so the branch keeps reporting "ahead" despite being pushed. Run thefetchabove to makegit statusaccurate again.Commits are unaffected. Local commits already succeeded; only the push is pending. Retry the push later rather than amending, resetting, or recommitting.
Conventional Commits
All commit subjects follow Conventional Commits:
<type>(<optional scope>): <imperative summary>- Allowed types:
feat,fix,docs,style,refactor,perf,test,build,ci,chore,revert. - Scopes match the affected area: the surface (
home), the layer (templates,tokens,constants), or the docs (prd,docs). Omit when global. - Subject: ≤ 72 characters, lowercase, no trailing period.
- Body: explain the why when the diff alone doesn't.
- Breaking changes:
!suffix and aBREAKING CHANGE:footer for route moves, renames, or behavior changes.
- Allowed types:
Branch naming
Branches follow the same type vocabulary as commits:
<type>/<short-kebab-summary>- ≤ 40 characters, lowercase, hyphen-separated.
- Milestone and task branches carry their identifiers:
feat/m02-works,feat/m02-t04-works-ledger. - Branches outside a milestone reference the affected area:
fix/date-zoning,docs/initial-plan.
Attribution
- No AI/agent attribution in commits, PRs, or issues: no
Co-Authored-By: Claude/Codex, no "Generated with Claude Code" markers, noclaude.ai/codesession links.
Review
- Read the project's own vendored skills before reviewing the diff. Skills under
.claude/skills//.agents/skills/are that project's actual, current standards, not generic advice; load the ones relevant to the changed files (componentsfor a component diff,datafor a constants/data change,nextjsfor routing, etc.) and check the diff against what they specifically say before reaching for anything else. - Then apply conventional best practice: correctness, security, performance, test coverage, readability — the concerns a project's skills don't cover because they're universal rather than project-specific.
- A skill deviation is a finding on its own, distinct from a generic style nit: name the skill and the rule it violates, not just "this looks off."
- When a project has no vendored skills, or the change touches an area none of them cover, fall back to conventional best practice alone — don't invent a project standard that isn't written down anywhere.