---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
3.8 KiB
description
| 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. 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]
Step 1: Pre-Flight
git log --max-count=10
git branch -a
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.
Step 2: Run Tests
npm test
npm run typecheck
npm run build
If any fail: iterate autonomously until tests pass. Do NOT ask the user for guidance — debug and fix.
Step 3: Compute Version
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)
git checkout main
git merge --squash phase/NN-slug
git commit -m "docs(P##): complete [phase-name] phase
---ci---
phase: [N]
milestone: [vX.Y]
status: complete
requirements:
covered: [REQ-01, REQ-02]
partial: []
---/ci---"
Milestone ship (minor/major release)
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
git tag -a vX.Y.Z -m "vX.Y.Z: [phase-name or milestone-name]"
git push origin main --tags
Step 6: Create Release
Every ship creates a Gitea release. No exceptions.
Generate release notes from git log:
git log v[previous_tag]..vX.Y.Z --oneline
Create the release via Gitea API:
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.Y.Z","name":"vX.Y.Z","body":"[release notes from git log]"}'
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
Commit the file updates.
Step 8: Report
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CI ► SHIPPED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Phase [N]: [name]
Milestone: [vX.Y]
Version: vX.Y.Z
Release: https://git.cloudinit.dev/continuous-intelligence/ci/releases/tag/vX.Y.Z
Status: complete
Tests: PASS
Typecheck: PASS
Build: PASS
Requirements covered: [N]
Commits: [N]
[If milestone complete:]
All phases in milestone v0.2 complete. Milestone released.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━