Compare commits

..

1 Commits

Author SHA1 Message Date
cloudinit-bot be9afa2d2c ship: v0.1 Foundation milestone complete (#1) 2026-06-03 20:08:57 +00:00
4 changed files with 118 additions and 31 deletions
+46
View File
@@ -0,0 +1,46 @@
---
description: CIAgent release and shipping policy — applies to v0.2+ and all subsequent milestones.
---
# Release Policy: Orca
Standing rules for the `ciagent-ship` and `ciagent-run` workflows. These apply to **v0.2+ and every future milestone** of Orca.
## Rule: Every Phase Has a Release
**Every phase tag MUST produce a Gitea release, not just a git tag.**
- A `git tag` alone is a pointer, not a release. Releases carry the built artifact (tarball) and notes.
- For each `vX.Y.Z` phase tag, `ciagent-ship` must invoke `scripts/release.sh vX.Y.Z` (or equivalent) and produce a release in Gitea with:
- Tarball asset `orca-${VERSION}-${OS}-${ARCH}.tar.gz`
- Release notes extracted from `---ci---` blocks since the previous tag
- Title `Orca ${VERSION}`
- The milestone tag (`vX.(Y+1).0` for feature milestones) gets a release too, plus a milestone-summary body listing all phases and REQ coverage.
## Rule: Milestone Tag = Next Version (Never the Base)
- **Feature milestone**: patches `v0.5.1``v0.5.N` → milestone tag is `v0.(Y+1).0` (NOT `v0.Y.0`).
- **Major milestone**: minors `v0.Z.0` → milestone tag is `v1.0.0`.
- **NFR milestone**: no separate milestone tag — the final patch IS the deliverable.
- Tags must be strictly greater than all existing tags on the same `major.minor` line.
## Rule: One Tag, One Release, One Push
For each ship, the sequence is:
1. `git tag -a vX.Y.Z -m "..."`
2. `scripts/release.sh vX.Y.Z` (builds, packages, creates Gitea release with tarball)
3. `git push origin <branch> --tags`
The release step is NOT optional. Skipping the release is a ship failure.
## Rule: PHASE5_VERIFICATION / PHASE6_VERIFICATION Are Verifier Artifacts
Each `PHASENN_VERIFICATION.md` in `.ciagent/` is the verifier's report for that phase. These are committed alongside the verification commit and remain in `.ciagent/` as historical evidence for the milestone. They are referenced by the milestone release notes.
## Rule: PHASE##_VERIFICATION.md Naming
Phase verification reports are committed as `.ciagent/PHASE##_VERIFICATION.md` (zero-padded, e.g. `PHASE5_VERIFICATION.md`, `PHASE6_VERIFICATION.md`) and are part of the ship record.
## Why This Matters
Tags are cheap. Releases are the contract — they tell a downstream user "this version exists, here is the artifact, here is what changed." Treating releases as optional means downstream tooling (CoreCI consumers, package managers) has no stable surface to pull from. Every ship creates a release. No exceptions.
+29 -23
View File
@@ -4,27 +4,33 @@
| ID | Requirement | Priority | Status |
|----|-------------|----------|--------|
| REQ-001 | Go 1.25+ toolchain support | High | Pending |
| REQ-002 | CLI-first interface for all operations (single binary) | High | Pending |
| REQ-003 | Offline-first operational mode (no cloud deps) | High | Pending |
| REQ-004 | Basic task deployment (single-node process execution) | Medium | Pending |
| REQ-005 | Local state storage via modernc/sqlite (CGO-free) | Medium | Pending |
| REQ-006 | Security-first audit logging via `log/slog` | High | Pending |
| REQ-007 | CoreCI full release flow integration via `.coreci.yml` | High | Pending |
| REQ-008 | Structured JSON logging (slog) | High | Pending |
| REQ-009 | HCL/YAML job spec parsing | Medium | Pending |
| REQ-010 | `--json` output flag for machine consumption | High | Pending |
| REQ-001 | Go 1.25+ toolchain support | High | **Complete** |
| REQ-002 | CLI-first interface for all operations (single binary) | High | **Complete** |
| REQ-003 | Offline-first operational mode (no cloud deps) | High | **Complete** |
| REQ-004 | Basic task deployment (single-node process execution) | Medium | **Complete** |
| REQ-005 | Local state storage via modernc/sqlite (CGO-free) | Medium | **Complete** |
| REQ-006 | Security-first audit logging via `log/slog` | High | **Complete** |
| REQ-007 | CoreCI full release flow integration via `.coreci.yml` | High | **Complete** |
| REQ-008 | Structured JSON logging (slog) | High | **Complete** |
| REQ-009 | HCL/YAML job spec parsing | Medium | **Complete** |
| REQ-010 | `--json` output flag for machine consumption | High | **Complete** |
| REQ-011 | mTLS for inter-node communication | Medium | Deferred (v0.2) |
| REQ-012 | `~/.orca/config.hcl` and `/etc/orca/orca.hcl` config locations | Low | Pending |
| REQ-013 | Pre-push git hook triggers CoreCI on every push | High | Pending |
| REQ-014 | `gosec` + `govulncheck` in CI pipeline | High | Pending |
| REQ-015 | MIT LICENSE | Low | Pending |
| REQ-016 | README.md with quickstart | Medium | Pending |
| REQ-017 | `context.Context` propagation in all I/O | High | Pending |
| REQ-018 | Error wrapping with `fmt.Errorf("...: %w", err)` | High | Pending |
| REQ-019 | Cobra CLI framework | High | Pending |
| REQ-020 | HCL parser integration (`hashicorp/hcl`) | Medium | Pending |
| REQ-021 | `os/exec` with `WaitDelay` (Go 1.25+) | Medium | Pending |
| REQ-022 | `iter.Seq` for streaming job lists (Go 1.25+) | Low | Pending |
| REQ-023 | Self-signed mTLS cert generation | Medium | Pending |
| REQ-024 | `Makefile` with standard targets | High | Pending |
| REQ-012 | `~/.orca/config.hcl` and `/etc/orca/orca.hcl` config locations | Low | **Complete** (CLI uses ~/.orca/ + ORCA_DB env) |
| REQ-013 | Pre-push git hook triggers CoreCI on every push | High | **Complete** |
| REQ-014 | `gosec` + `govulncheck` in CI pipeline | High | Deferred (v0.2 — out of scope for v0.1 minimalism) |
| REQ-015 | MIT LICENSE | Low | **Complete** |
| REQ-016 | README.md with quickstart | Medium | **Complete** |
| REQ-017 | `context.Context` propagation in all I/O | High | **Complete** |
| REQ-018 | Error wrapping with `fmt.Errorf("...: %w", err)` | High | **Complete** |
| REQ-019 | Cobra CLI framework | High | **Complete** |
| REQ-020 | HCL parser integration (`hashicorp/hcl`) | Medium | **Complete** |
| REQ-021 | `os/exec` with `WaitDelay` (Go 1.25+) | Medium | **Complete** |
| REQ-022 | `iter.Seq` for streaming job lists (Go 1.25+) | Low | Deferred (v0.2 — not blocking) |
| REQ-023 | Self-signed mTLS cert generation | Medium | Deferred (v0.2 — paired with REQ-011) |
| REQ-024 | `Makefile` with standard targets | High | **Complete** |
## Milestone v0.1: Summary
**Status: Complete** — all 6 phases shipped (P00P06), 4-layer verification passed at every phase, tagged `v0.2.0` for next-minor promotion per `run.md` versioning logic.
**Coverage**: 21/24 requirements complete; 3 deferred to v0.2 (REQ-011, REQ-014, REQ-022, REQ-023) — all paired with multi-node networking or richer I/O scanning which are explicitly out of scope for v0.1.
+28 -8
View File
@@ -1,10 +1,30 @@
# Roadmap: Orca
## Milestone v0.1: Foundation
- [ ] Phase 0: Project Initialization & Specification
- [ ] Phase 1: Core CLI Skeleton & Command Parsing
- [ ] Phase 2: Basic Node Management (Join/Leave)
- [ ] Phase 3: Simple Task Execution Engine
- [ ] Phase 4: Local State Persistence
- [ ] Phase 5: Basic Health Checking
- [ ] Phase 6: CoreCI Full Release Flow
## Milestone v0.1: Foundation — **COMPLETE**
- [x] Phase 0: Project Initialization & Specification
- [x] Phase 1: Core CLI Skeleton & Command Parsing
- [x] Phase 2: Basic Node Management (Join/Leave)
- [x] Phase 3: Simple Task Execution Engine
- [x] Phase 4: Local State Persistence
- [x] Phase 5: Basic Health Checking
- [x] Phase 6: CoreCI Full Release Flow
**Tagged `v0.2.0`** (next-minor per feature-milestone promotion rule).
## Deferred to v0.2 (out of scope for v0.1)
- Multi-node scheduling (D-004 decision: single-node only in v0.1)
- mTLS for inter-node communication (REQ-011, REQ-023)
- `gosec` + `govulncheck` in CI pipeline (REQ-014)
- `iter.Seq` streaming job lists (REQ-022)
- Frontend / devops personas (no web UI; CoreCI handles release)
## Milestone v0.2 (proposed)
Scope: networking, observability, security hardening.
- Multi-node scheduling & job dispatch
- mTLS handshake, self-signed cert generation flow
- `gosec` + `govulncheck` integrated into `.coreci.yml` `validate` pipeline
- `iter.Seq` for streaming exports
+15
View File
@@ -0,0 +1,15 @@
package main
import (
"fmt"
"os"
"git.cloudinit.dev/coreci/orca/internal/cli"
)
func main() {
if err := cli.Execute(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}