Community guide
This guide describes how the HAI-Co² community works: where to file what, how an Issue moves from filed to deployed, and the conventions that keep the project legible to outside contributors. If you are about to file an issue, open a PR, or start a Discussion, you are in the right place.1. Two development pathways
HAI-Co² accepts contributions on two pathways that converge at the same review gate. The bar for merging is identical. Only the author differs.
A maintainer applies the
path:* label during triage. The default is traditional; the absence of a path label means traditional. On the AI pathway the maintainer also picks the engine via the label (path:ai-automation = Claude by default, or -codex / -copilot); see the maintainers’ handbook.
On the AI pathway a maintainer labels the issue, Coco plans it and warns in the plan about any higher-risk traits, and a human authorizes the work by commenting /approve-plan on the PR. It is not a hard checklist: the plan surfaces traits like a DB schema change or migration, a new dependency, a public-API change, or an architectural decision, and Coco raises an explicit ⚠️ warning only for a security-sensitive surface (auth, crypto, file uploads, deserialization) or a destructive or irreversible migration. The maintainer approves with /approve-plan, or re-routes to a human with path:traditional. See ADR-0002 for the rationale.
Once on the AI pathway, a stage:* label tracks progress automatically (stage:planning through stage:awaiting-merge), so you can see at a glance where each item is; the full state diagram and the commands that drive each transition are in ai-pathway.md.
Examples
path:ai-automation: “Submit button is misaligned on mobile”, “Add missingNonecheck inagents/retrieval.py”, “Add a happy-path test forPOST /api/preferences”.path:traditional: “Add OAuth login support”, “Migrate the checkpointer to use Redis”, “Improve type coverage across the entire backend”.
2. Where to file what
Why the split between Issues and Discussions
- The Issues tab is a clean inventory of work. Each open issue represents a decided change, scoped enough that someone could pick it up.
- Discussions is where ideas incubate. Open-ended threads belong here until consensus emerges and they can be promoted to an Issue.
- Q&A never becomes an Issue; the answer stays in the discussion thread and benefits the next person who searches.
3. Issue lifecycle
Filing
Use one of the issue forms. The forms ask for the structured fields a reviewer will need anyway: area, repro steps, acceptance criteria, plus an optional Reviewer(s) field (on the AI pathway, the reviewer(s) requested on Coco’s plan PR come from it, defaulting to the repo’sREVIEWER_LOGIN when blank). Filling them up front saves a round trip.
Triage
A maintainer reviews new issues at least weekly. Triage produces:- One
type:*label (type:bug,type:enhancement, …). - One
area:*label (area:backend,area:frontend, …). - One
priority:*label and oneeffort:*label. - A pathway decision (
path:ai-automationor no path label = traditional). - Optionally
good first issueif the change is newcomer-friendly. - Removal of
needs-triage. - Adding the issue to the Project board and (if appropriate) a milestone.
Claiming
Comment “I’d like to take this” and wait for a maintainer to assign. For internal contributors with write access, self-assignment is fine. For AI issues, the maintainer adds thepath:ai-automation label, which sets the pathway in motion (Coco drafts a plan).
Implementation
For human authors:- Fork (if external) and create a branch from
develop. Naming follows<type>/<short-kebab-description>. - Implement the change. Write tests. Run
pytest/npm run lint. - Push the branch and open a PR against
develop. The PR template prompts for the right pieces.
/approve-plan, Coco implements into that same PR. The maintainer promotes to dev with /promote dev, tests there, and iterates by commenting /coco <change> on the PR. When satisfied, marking the PR ready for review runs Coco’s automated review, and a human does the final merge.
Linking the PR to the issue
In the PR body (not the title), use a closing keyword:
Multi-issue PRs: each issue needs its own keyword, e.g.
Closes #123, closes #124. Cross-repo: Closes owner/repo#123. Auto-close fires when the PR merges into the default branch (develop); the later promotion to main does not re-trigger.
Review
- One CODEOWNERS approval is required.
- All CI checks must pass.
- Coco’s automated review (on
path:ai-automationPRs; see ai-pathway.md) leaves comments; they are advisory, not blocking. - A human reviewer (often the same maintainer who triaged) signs off.
Merge
- Squash merge. The PR title (Conventional Commits) becomes the commit message; the PR body is appended below it.
- The branch is auto-deleted.
- The linked issue auto-closes on merge into
develop. - The Project board moves the issue to Done.
Deploy
- A maintainer pushes
dev-vX.Y.Zfromdevelop. The existing CI workflow builds images and deploys to the dev environment. - After validation on dev, the maintainer fast-forwards
develop → mainand pushesvX.Y.Z. The same CI workflow deploys to production.
4. PR title convention: Conventional Commits
Use<type>(<scope>): <description>:
feat(backend): add OAuth callback endpointfix(frontend): correct submit-button alignment on mobilerefactor(agents): extract retrieval factorydocs: expand contributing guide with linking ruleschore(deps): bump fastapi to 0.115
type values: feat, fix, hotfix, refactor, docs, test, chore, experiment. They match the branch-name types in CONTRIBUTING.md.
Why this convention:
- The PR title becomes the squash-commit message: a readable
git log. - Release Drafter groups release notes by
type:labels (auto-applied from the PR title). - It is the most widely-adopted convention in open source, so there is no friction for arriving contributors.
#123 in the title. GitHub auto-appends (#PR_NUMBER) on squash-merge, and the body contains the issue link.
5. Branch naming
Enforced by.github/workflows/branch-name.yml and locally by .githooks/pre-push (opt-in).
<type>/<short-kebab-description>: see CONTRIBUTING.md for the full table. Optionally include the issue number after the type:
gh-aw-generated branch name automatically; both styles coexist.
6. Linking artefacts
The lifecycle is auditable because each artefact links to the others.Closing keywords (PR body → Issue)
See §3, Linking the PR to the issue.Discussion → Issue promotion
The recommended flow for non-trivial features:- Someone files a 💡 Idea discussion describing the use case.
- Community + maintainers discuss; consensus emerges (or doesn’t).
- If consensus: a maintainer uses the discussion’s ⋯ menu → “Convert to issue”. The original Discussion remains, with a link to the new Issue.
- Triage applies labels and (if appropriate)
path:ai-automation.
Task lists for epics
For work too large for one PR, the parent Issue lists child Issues:1 of 3 completed. As each child PR merges with Closes #234, the parent’s progress updates in real time. GitHub’s newer sub-issues feature makes the parent/child relationship first-class: visible as a panel in the Issue UI and navigable in the Project board.
The “Development” sidebar
The right sidebar of every Issue has a Development section. Use it when:- A PR exists but does not include closing keywords.
- You want to associate a branch with an Issue before a PR exists.
- The PR targets a non-default branch and you still want the auto-close link.
7. Cheat-sheet
8. Sources and related docs
docs/maintainers-handbook.md: the maintainer-facing companion (triage, label discipline, release flow).docs/labels-reference.md: the full taxonomy and what each label means.docs/adr/README.md: how we record architectural decisions.CONTRIBUTING.md: branching, release, PR rules.SUPPORT.md: where to get help.SECURITY.md: vulnerability reporting.