fix(P02): mandatory releases for every phase and milestone — correct versioning

---ci---
phase: 2
milestone: v0.2
status: execute
decisions:
  - id: D-016
    decision: Every ship creates a release — phases get patch, milestones get minor/major
    rationale: Releases are not optional. Every phase must be tagged and released. Milestone completion also gets a release. Major for schema changes, Minor for milestones, Patch for phases.
    confidence: 0.99
    alternatives: [optional releases, phase-only releases]
---/ci---

- ship.md: rewritten with mandatory release flow and versioning table (Major/Minor/Patch)
- run.md: COMPLETE stage now includes tag + release as mandatory steps
- branch-strategy.md: added Versioning and Releases section with merge→tag→release examples
This commit is contained in:
CI
2026-05-29 13:35:51 +00:00
parent 2f738c33b7
commit e4bb3a9970
3 changed files with 115 additions and 20 deletions
+40
View File
@@ -77,6 +77,44 @@ gitBranch.mergePhaseBranch("phase/01-git-native-architecture", "main", true);
Squash merge keeps main clean while preserving full development history in the phase branch. Phase branches can be deleted after merge if desired.
## Versioning and Releases
**Every merge to main creates a release. No exceptions.** Versioning maps to project structure:
| Version Part | When | Example |
|-------------|------|---------|
| **Major** (X.0.0) | Project-level refactor or schema change | `v1.0.0` |
| **Minor** (0.X.0) | Every milestone completion | `v0.3.0` |
| **Patch** (0.0.X) | Every phase completion | `v0.2.3` |
### Phase completion (patch release)
```bash
git checkout main
git merge --squash phase/01-git-native-architecture
git commit -m "docs(P01): complete git-native-architecture phase"
git tag -a v0.2.1 -m "v0.2.1: git-native-architecture"
git push origin main --tags
# Create Gitea release for v0.2.1
```
Phase number within the milestone determines the patch version (1st phase = .1, 2nd phase = .2, etc.)
### Milestone completion (minor release)
```bash
git checkout main
git merge --squash milestone/v0.2-git-native
git commit -m "docs(milestone): complete git-native"
git tag -a v0.2.0 -m "v0.2.0: git-native"
git push origin main --tags
# Create Gitea release for v0.2.0 with full milestone summary
```
### Major release
When the project undergoes a schema-breaking change (e.g., switching from file-based to git-native architecture), bump the major version. Major releases follow the same merge → tag → release flow.
## Phase Discovery
```typescript
@@ -117,6 +155,8 @@ status: execute
git checkout main
git merge --squash phase/01-git-native-architecture
git commit -m "docs(P01): complete git-native-architecture phase"
git tag -a v0.2.1 -m "v0.2.1: git-native-architecture"
git push origin main --tags
```
</branch_strategy>
+8 -1
View File
@@ -68,10 +68,14 @@ For each stage in order (starting from current or from `specify`):
### COMPLETE
- Merge phase branch into main (squash)
- Tag with patch version (e.g., `v0.2.3` — 3rd phase in milestone v0.2)
- Create Gitea release for the tag
- Update `.ci/REQUIREMENTS.md` requirement statuses
- Update `.ci/ROADMAP.md` phase status
- Commit: `docs(P##): complete [phase-name] phase`
Versioning: Major = project-level refactor/schema change, Minor = milestone completion, Patch = every phase.
## Step 4: Error Recovery
On stage failure:
@@ -82,6 +86,9 @@ On stage failure:
## Step 5: Advance or Complete
If more phases remain: advance to next phase, return to Step 3.
If all phases complete: report project completion.
If all phases complete:
- Tag milestone with minor version (e.g., `v0.3.0`)
- Create Gitea release for the milestone with full phase summary
- Report project completion
Error handling: commit escalations as `---ci---` blocks with `escalation` type.
+67 -19
View File
@@ -1,10 +1,15 @@
---
description: Ship CI phase — test, commit, tag, and optionally create release. Full autopilot: zero HITL after milestone setup.
description: Ship CI phase or milestone — test, tag, release. Every phase gets a patch release. Every milestone gets a minor (or major) release. Full autopilot.
---
# CI Ship
Ship a CI phase or milestone. Full autopilot: test, commit, tag, push, and release without human intervention.
Ship a CI phase or milestone. Every ship creates a release — no exceptions.
**Versioning rule:**
- **Major** (X.0.0): Project-level refactor or schema changes
- **Minor** (0.X.0): Every milestone completion
- **Patch** (0.0.X): Every phase completion
**Usage:** `ci-ship [phase_number|milestone]`
@@ -15,7 +20,12 @@ git log --max-count=10
git branch -a
```
Determine what is being shipped (specific phase or entire milestone).
Determine what is being shipped: a single phase (patch release) or an entire milestone (minor/major release).
Read `.ci/ROADMAP.md` to determine:
- Current milestone version (e.g., `v0.2`)
- Phase number within the milestone
- Whether this is the last phase in the milestone
Read `.ci/config.json` for autonomy level.
@@ -29,9 +39,21 @@ npm run build
If any fail: iterate autonomously until tests pass. Do NOT ask the user for guidance — debug and fix.
## Step 3: Merge Phase Branch
## Step 3: Compute Version
If shipping a single phase:
Determine the release version from what is being shipped:
| What's shipping | Version bump | Tag format | Example |
|----------------|-------------|------------|---------|
| Single phase | Patch | `vX.Y.Z` | `v0.2.3` (3rd phase in milestone v0.2) |
| Milestone completion | Minor | `vX.Y.0` | `v0.3.0` (milestone v0.3 complete) |
| Project refactor/schema change | Major | `vX.0.0` | `v1.0.0` (breaking schema) |
Count completed phases in the current milestone to determine the patch number. If this is the last phase in the milestone, the version bumps to minor instead of patch.
## Step 4: Merge Branch
### Phase ship (patch release)
```bash
git checkout main
@@ -40,7 +62,7 @@ git commit -m "docs(P##): complete [phase-name] phase
---ci---
phase: [N]
milestone: [vX.X]
milestone: [vX.Y]
status: complete
requirements:
covered: [REQ-01, REQ-02]
@@ -48,34 +70,56 @@ requirements:
---/ci---"
```
## Step 4: Tag Release
### Milestone ship (minor/major release)
```bash
git tag -a vX.X.X -m "vX.X.X: [phase-name]"
git checkout main
git merge --squash milestone/vX.Y-slug
git commit -m "docs(milestone): complete [milestone-name]
---ci---
phase: 0
milestone: [vX.Y]
status: complete
---/ci---"
```
## Step 5: Tag and Push
```bash
git tag -a vX.Y.Z -m "vX.Y.Z: [phase-name or milestone-name]"
git push origin main --tags
```
## Step 5: Create Release (if milestone)
## Step 6: Create Release
If shipping an entire milestone:
1. Merge milestone branch to main
2. Tag with milestone version
3. Generate release notes from git log
4. Create release via Gitea API
**Every ship creates a Gitea release. No exceptions.**
Generate release notes from git log:
```bash
git log v[previous_tag]..vX.Y.Z --oneline
```
Create the release via Gitea API:
```bash
curl -X POST "https://git.cloudinit.dev/api/v1/repos/continuous-intelligence/ci/releases" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tag_name":"vX.X.X","name":"vX.X.X","body":"[release notes]"}'
-d '{"tag_name":"vX.Y.Z","name":"vX.Y.Z","body":"[release notes from git log]"}'
```
## Step 6: Update .ci/ Files
For milestone releases, include a summary of all phases completed and requirements covered.
## Step 7: Update .ci/ Files
- Update `.ci/REQUIREMENTS.md` — mark shipped requirements as complete
- Update `.ci/ROADMAP.md` — mark shipped phase as complete
## Step 7: Report
Commit the file updates.
## Step 8: Report
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@@ -83,8 +127,9 @@ curl -X POST "https://git.cloudinit.dev/api/v1/repos/continuous-intelligence/ci/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Phase [N]: [name]
Milestone: [vX.X]
Tag: vX.X.X
Milestone: [vX.Y]
Version: vX.Y.Z
Release: https://git.cloudinit.dev/continuous-intelligence/ci/releases/tag/vX.Y.Z
Status: complete
Tests: PASS
@@ -93,5 +138,8 @@ Build: PASS
Requirements covered: [N]
Commits: [N]
[If milestone complete:]
All phases in milestone v0.2 complete. Milestone released.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```