Authoritative detail: See
.squad/ceremonies.mdfor the full ceremony definitions, command examples, and gate checklists.
- User creates or refines
plan.md(via/planmode or[[PLAN]]prefix) - User approves
plan.md— no GitHub objects are created before user sign-off - Aragorn runs the Plan Ceremony:
- Creates the GitHub Milestone via
gh api - Derives sprint groupings (5–8 issues per sprint, by logical dependency)
- Creates a GitHub issue for each todo; assigns
sprint-{N}andsquad:{member}routing labels - Posts a board summary: milestone number, sprint themes, issue assignments
- Creates the GitHub Milestone via
Work is routed to domain specialists — not done by "Team" as a unit: UI/Blazor → Legolas · Tests → Gimli · CI/DevOps → Boromir · MongoDB/persistence → Sam · Docs/prose → Frodo · Architecture/CQRS → Aragorn
-
Assigned squad member picks up their issue
-
Creates a worktree on a new branch based on
origin/dev:Branch name: squad/{issue-number}-{kebab-case-slug} Worktree path: ../IssueTrackerApp-sprint
- Implements the feature, including tests and documentation, following all
.github/instructions/coding standards - All new C# (
.cs) files must include the copyright block header —.razorfiles do not get copyright headers
-
Run the full local test suite in Release configuration:
dotnet test tests/Unit.Tests tests/Blazor.Tests tests/Architecture.Tests \ --configuration Release -
Zero test failures, zero build errors, zero warnings required
-
Resolve any failures before proceeding — CI must never be the first place failures are discovered
- Commit changes, push branch, open PR:
- Branch must be
squad/* - PR body must reference the issue (
Closes #{N}) and have at least one filled[x]checkbox from the PR template .squad/files must NOT appear in the diff
- Branch must be
Ralph checks all gates before spawning reviewers:
| Gate | Pass condition |
|---|---|
| CI green | All checks pass |
| No merge conflicts | MERGEABLE |
| Branch naming | Starts with squad/ |
| PR template filled | At least one [x] checkbox |
-
Aragorn reads GitHub Copilot's automated review comments first — bugs and security issues flagged by Copilot must be addressed; style suggestions are discretionary
-
Ralph spawns parallel domain reviewers — Aragorn always reviews; relevant specialists (Legolas, Gimli, etc.) review their domain
-
Reviewers post verdicts via GitHub PR review (
--approveor--request-changes) -
If CHANGES_REQUESTED: PR author is locked out; a different squad member fixes and pushes to the same branch — then re-review begins
-
Unanimous approval + CI green → Ralph squash-merges into
devand deletes the branch:gh pr merge {N} --squash --delete-branchWhy squash? One commit per PR keeps
git log --oneline devreadable as a changelog. GitHub auto-links the squash commit to the PR and issue, so full traceability is preserved without merge-commit topology noise.The squash commit message must follow Conventional Commits format and include the issue reference — this makes
git logdouble as release notes:feat: add label suggestions to issue form (Closes #201) fix: resolve race condition in bulk operation queue (Closes #198) docs: rewrite New Work process to reflect squad ceremonies (Closes #215) -
Ralph runs Post-Merge Orphan Branch Cleanup ceremony automatically — removes stale local and remote
squad/*refs and the sprint worktree
- Ralph monitors: when all issues in a sprint are merged and closed, the sprint is complete
- The previous sprint's PR must be merged to
devbefore the next sprint begins — this eliminates merge conflicts and ensures each sprint builds on a stable, fully-integrated baseline - Begin next sprint (return to Phase 2)
- All sprints merged, all issues closed → Close the Milestone
milestone-blog.ymlfires automatically — creates a Ralph review issue (squad:ralph+pending-reviewlabels) with a release checklist- Ralph reviews and applies one of two labels to the issue:
release-candidate— work is shippable and warrants a GitHub Releaseblog-only— improvements noted but no release needed
milestone-release-decision.ymldetects the label and routes automatically:
release-candidate
└─ squad-milestone-release.yml → GitHub Release created (tag + release notes)
└─ release-blog.yml fires on publish → squad:bilbo brief issue created
blog-only
└─ squad:bilbo brief issue created directly
- Bilbo picks up the brief, writes the blog post, and adds a row to
docs/blog/index.md blog-readme-sync.ymldetects the index change and auto-updates the README Dev Blog section — no manual README edit needed