Base uses GitHub Issues as the public product backlog and Git worktrees for parallel pull request trains. This page captures the repository workflow so humans and AI-assisted development agents follow the same rules.
Base uses GitHub default-style labels instead of type:* labels.
Use one primary category label on each issue:
bugUnexpected behavior, correctness issues, regressions, and defects.enhancementNew capabilities, product improvements, refactors, and most maintenance work.documentationDocumentation-only changes.ciGitHub Actions, test automation, release automation, and CI reliability.securitySecurity hardening, dependency pinning, static analysis, and permission tightening.needs-demoChanges that should update Base's self-demo, thebase-demoreference project, or demo documentation. See Demo Maintenance.
Avoid creating new type:* labels. Older issues may still carry historical
type:fix, type:feat, type:chore, or type:docs labels, but new work
should use the labels above.
Issues created by Codex or other automation for the Base repository should be
assigned to codeforester.
If assignment fails, the automation should mention that in its summary instead of silently leaving the issue unassigned.
Use basectl gh as the preferred interface for Base repository GitHub
workflows when it supports the operation.
This keeps Base dogfooding its own workflow tool for common issue, branch, PR,
and repository hygiene tasks. For example, prefer basectl gh issue create,
basectl gh issue start, basectl gh pr create, and basectl gh branch prune
over hand-written gh commands when those commands are available and local
tooling is authenticated.
Fallbacks are allowed when basectl gh does not support the needed operation,
when local GitHub CLI authentication is unavailable, or when the GitHub
connector provides a safer structured API for the task. In those cases, use the
GitHub connector, raw gh, or git as appropriate and keep the resulting
issue labels, branch names, assignments, and PR bodies aligned with this
policy.
Branch names should be derived from the issue category:
<category>/<issue>-<YYYYMMDD>-<slug>
Examples:
bug/245-20260529-fix-profile-project-prompt
enhancement/222-20260529-add-changelog
documentation/241-20260529-document-github-workflow
ci/246-20260529-pin-shellcheck-version
security/247-20260529-restrict-log-permissions
Use enhancement/ for maintenance work unless the issue is more specifically
documentation, ci, or security.
All pull request implementation work should happen in a dedicated worktree.
The main checkout can stay as the user's active working copy:
~/work/base
Issue work should use:
~/work/base-worktrees/<slug>
Create a worktree from current origin/master:
git fetch origin master
git worktree add -b documentation/241-20260529-document-github-workflow \
~/work/base-worktrees/documentation-241-github-workflow origin/masterAfter a pull request is merged:
git -C ~/work/base pull --ff-only origin master
git -C ~/work/base worktree remove ~/work/base-worktrees/<slug>
git -C ~/work/base branch -d <branch>
git -C ~/work/base push origin --delete <branch>Delete remote branches after merge unless there is a specific reason to keep one around.
Base can also help with branch cleanup:
basectl gh branch prune
basectl gh branch prune --yes
basectl gh branch prune --remote --yes
basectl gh worktree prune
basectl gh worktree prune --yesThe command is dry-run by default. It reports merged local branches as delete
candidates, reports branches attached to worktrees as skipped, and treats
--remote as GitHub remote branch cleanup plus stale origin/* tracking-ref
cleanup. Because Base usually uses squash merges, pruning checks GitHub PR state
when available and falls back to Git ancestry when offline.
Remote branch pruning is deliberately conservative. Base deletes a GitHub branch
only when GitHub confirms a merged pull request for that exact branch name. It
does not delete the default branch, the current branch, or a branch attached to a
local worktree. After safe GitHub branches are deleted, Base prunes stale local
origin/* refs.
Worktree pruning is also dry-run by default. It removes only clean, non-current worktrees whose branches are confirmed merged into the default branch or through a merged GitHub PR, then deletes the now-free local branch when safe.
Base pull requests are issue-backed by default. The issue is the planning record: it owns the problem statement, category, priority, milestone, and Project tracking. The PR is the implementation and review record: it explains what changed, how it was validated, and whether the change is ready to merge.
Keep each PR scoped to one issue by default.
PR bodies should include:
- a short summary of the change
- the validation commands that were run
Fixes #<issue>orCloses #<issue>when the merge should close the issueDemo Impactwhen the issue or PR carriesneeds-demo
Prefer small PR trains over large mixed PRs. A train may contain several worktrees and PRs, but each PR should still close one issue cleanly.
When a PR is opened for an issue, inherit metadata selectively:
- Copy the primary category label from the issue to the PR.
- Copy special workflow labels such as
needs-demoto the PR. - Assign the PR to the implementer when assignment is useful for review queues.
- Link the PR to the issue with
Closes #<issue>when the merge should close the issue. - Use
Refs #<issue>when the PR is related to an issue but should not close it.
Do not copy milestone or GitHub Project fields to the PR by default. Keep those
on the issue so release planning and Project views do not double count the same
work. When a PR opens, move the issue's Project status to In Review instead
of adding a separate PR item to the Project.
PR reviewers are PR-specific and should be selected from the implementation surface, ownership, and risk of the change rather than copied from the issue.
One PR may close multiple issues only when the work is atomic and splitting it would create artificial churn. Acceptable examples include:
- one small implementation that naturally fixes two related bugs
- a mechanical documentation or test cleanup across several tiny issues
- a parent issue plus tightly scoped sub-issues
- one refactor that unlocks several tightly related follow-ups
Split the PR instead when:
- the issues have different milestones or release intent
- the issues have different primary categories
- one issue is user-facing and another is internal cleanup
- one issue requires demo, migration, security, or release-note handling and the other does not
- review would be harder because the concerns are unrelated
For a multi-issue PR, choose one primary issue:
- The branch name uses the primary issue number.
- The PR title is based on the primary issue.
- Inherited labels come from the primary issue plus any special labels needed for the full PR scope.
- The PR body lists every closed or referenced issue.
Example:
## Issue
Closes #123
Closes #124
Refs #130Use Refs for related or partial issues that should remain open.
Base uses a minimal standard PR body:
## Summary
-
## Issue
Closes #
## Validation
-
## Demo Impact
None.
## Notes
None.Demo Impact is required for Base PRs so demo-related changes are considered
intentionally. Use None. when the change does not affect Base's demo,
Base-managed demo project, demo docs, or user-visible flows that should be
shown in a demo.
When the issue or PR carries needs-demo, Demo Impact must explain what demo
content should change. Do not leave it as None. for a needs-demo PR.
Additional sections are added only when a Base policy, label, or touched area requires them. Examples include:
Security Notesfor security-sensitive changesMigration Notesfor breaking manifest, config, or CLI behaviorRelease Notesfor user-visible release highlightsDocs Impactfor changes that require external documentation updates
Do not add every possible section to every PR. Extra sections should carry signal, not template noise.
This policy is for the Base repository. Future Base-managed projects should be
able to declare their own PR workflow requirements instead of inheriting
Base-specific sections such as Demo Impact unconditionally.
Base should provide the workflow mechanism and defaults. Each project should own its labels, required sections, path-triggered sections, and review policy.
Milestones represent release intent, not workflow state.
Suggested Base milestones:
v0.1.0 - Public baselineCurrent public baseline for Base's first installable product shape.v0.2.0 - Adoption polishInstaller, Homebrew, README, changelog, issue templates, and workflow polish.v0.3.0 - Project orchestrationProject test execution, mise integration, manifest refinement, and a real Base-managed demo project.v0.4.0 - CI and Linux foundationLinux runtime support, CI-oriented behavior, andbasectl ciplanning.v1.0.0 - Stable public releaseStable manifest contracts, compatibility expectations, and upgrade policy.
Every issue does not need a milestone. Use milestones when the issue contributes to a concrete release goal.
Use one GitHub Project first: Base Roadmap.
Recommended fields:
Status: Triage, Backlog, Ready, In Progress, In Review, DonePriority: P0, P1, P2, P3Area: CLI, Setup, Manifest, Shell, Python, Docs, CI, Packaging, Security, ProductSize: S, M, LPR Train: optional text field for batch work
Useful views:
- Board by status
- Priority view
- Release view grouped by milestone
- Bugs and CI
- Ready for PR train
Projects show workflow and prioritization. Milestones show release grouping.