feat(scaffold): Go module + cmd/rt cobra skeleton + internal package stubs (#501) #510

Merged
bosun merged 1 commit from i/501-scaffold-go-module into v2/next 2026-07-24 23:23:28 +02:00
Owner

Phase 0a scaffold for the v1.0.0 Go port. Establishes the module root and a compile-green skeleton; no functional code — the shape is here so downstream phases have a substrate to land against.

Refs #501 · milestone Phase 0a (#71) · ADR-0009 §3.1, §3.2 (C5), §3.3 (phase 0a).

What landed (245 lines total)

  • go.mod — module git.frankenbit.de/frankenbit/release-toolkit, go 1.24; single direct dep github.com/spf13/cobra v1.10.2.
  • cmd/rt/main.go — cobra root + skeleton subcommands. Each RunE returns a loud TODO(port) error (a scaffold that exits 0 would read as "the command ran").
  • internal/* — 10 package skeletons, each a package doc-comment naming its scope + ADR phase + boundary contract, plus a TODO(port) marker where the Phase 0b interface will land.

Package → phase → contract map

package ADR phase contract
semver 1 (pure-logic) semver round-trip invariant
conventionalcommits 1 (pure-logic)
config 2 (config + events) C1 release-toolkit.yml
events 2 (config + events) — (Verdict wire form, §5)
changelog 3 (changelog engine) C6 CHANGELOG section format
fragments 3 (changelog engine) C4 fragment format
forgejo 4 (client + manifest) C7 typed API responses
manifest 4 (client + manifest) C2 manifest round-trip
bake 5 (self-bootstrap) bake byte-exactness (property, not schema)
release 6 (orchestrators) + §6 #499 fail-atomic transactional cut

rt --help

Available Commands:
  decide         Decide whether a release should be cut (phase 6 orchestrator)
  manifest-check Validate the release manifest against repository state (phase 6 orchestrator)
  prep           Prepare a release cut: compose changelog, update manifest (phase 6 orchestrator)
  prune-rc-tags  Prune superseded release-candidate tags (phase 6 orchestrator)
  release        Execute the release cut: seal changelog, tag, publish (phase 6 orchestrator)

AC status (#501)

  • go build ./... succeeds — verified green (exit 0), go vet ./... clean, gofmt -l clean
  • rt --help prints the subcommand list matching the Phase 6 orchestrator surface — verified (above)
  • all internal packages doc-commented, no functional code (TODO(port) stubs) — verified via go doc ./internal/<pkg> on all 10
  • committed to v2/next under a phase-0a branch → PR → merge — this PR (merge pending)

Design calls (flagged for review)

  1. go 1.24 directive, not 1.26. go mod init stamped 1.26.2 (the local toolchain). The scaffold uses zero 1.26-specific language features, so I lowered the directive to the minimal version I could still verify builds green (verified under the 1.26.2 toolchain, which honours the lower language directive). This keeps the constraint minimal so #502's CI author can pick any go >= 1.24 runner. Raise it later if a phase genuinely needs a newer language version.
  2. Fail-loud stubs, not no-ops. Each subcommand returns rt <cmd>: not yet implemented — TODO(port), ADR-0009 phase N and exits 1. A silent success on an unimplemented command is the exact anti-pattern §5's fail-loud discipline exists to prevent.
  3. §5 disciplines are named in doc-comments, not implemented. The Verdict type, sentinel errors, and the transactional cut ordering are described in the relevant package doc-comments as forward-markers — the actual types/interfaces are Phase 0b (#505) shape decisions, deliberately not made here.

Post-review note (S1 fixed @ d4f8f88)

Surveyor's review 4527 caught two subcommand labels naming the wrong ADR phase — manifest-check as "phase 6b validator" and prune-rc-tags as "phase 8 prerelease". ADR-0009 §3.3 row 6 (Orchestrators) lists all five subcommands at Phase 6; the 6b/8 labels came from the #501 tracker's loose union-phrasing rather than the canonical table. Fixed at head d4f8f88 (only cmd/rt/main.go changed — the other 12 files byte-identical; both stubs now fail loud with "…phase 6"). AC2 wording aligned on #501. Re-stamped APPROVED @ d4f8f88 (review 4528, head-pinned, stale=false).

CI note — this PR runs no checks, by design

The four PR gates (register-check, tests, check-self-bootstrap, manifest-check) are all pull_request: branches: [main], so they do not fire on a v2/next-targeted PR (confirmed: every v2/next commit carries 0 statuses; the full gate battery fires at the eventual v2/next → main merge per ADR-0009 §2.4). There is no Go build/test/lint gate yet — that's #502. So the build-green ACs above are my local verification, not a CI stamp. (I did reproduce register-check locally to be sure; it surfaces 20 pre-existing hits in the #367 docs/architecture/** docs — not touched by this PR and not in its scope.)

What this PR does NOT do

  • No interfacessemver.Parser, changelog.Composer, forgejo.Client, etc. are Phase 0b (#505).
  • No functional code — no logic in any package; putting it in now would be the wrong shape (§3.1).
  • No equivalence-harness — that's the sibling #503.
  • No CI / goreleaser — that's the sibling #502.
  • README unchanged — updated at Phase 9 DoD per the tracker.
Phase 0a scaffold for the v1.0.0 Go port. Establishes the module root and a compile-green skeleton; **no functional code** — the shape is here so downstream phases have a substrate to land against. Refs #501 · milestone Phase 0a (#71) · ADR-0009 §3.1, §3.2 (C5), §3.3 (phase 0a). ## What landed (245 lines total) - **`go.mod`** — module `git.frankenbit.de/frankenbit/release-toolkit`, `go 1.24`; single direct dep `github.com/spf13/cobra v1.10.2`. - **`cmd/rt/main.go`** — cobra root + skeleton subcommands. Each `RunE` returns a loud `TODO(port)` error (a scaffold that exits 0 would read as "the command ran"). - **`internal/*`** — 10 package skeletons, each a package doc-comment naming its scope + ADR phase + boundary contract, plus a `TODO(port)` marker where the Phase 0b interface will land. ### Package → phase → contract map | package | ADR phase | contract | |---|---|---| | `semver` | 1 (pure-logic) | semver round-trip invariant | | `conventionalcommits` | 1 (pure-logic) | — | | `config` | 2 (config + events) | C1 `release-toolkit.yml` | | `events` | 2 (config + events) | — (Verdict wire form, §5) | | `changelog` | 3 (changelog engine) | C6 CHANGELOG section format | | `fragments` | 3 (changelog engine) | C4 fragment format | | `forgejo` | 4 (client + manifest) | C7 typed API responses | | `manifest` | 4 (client + manifest) | C2 manifest round-trip | | `bake` | 5 (self-bootstrap) | bake byte-exactness (property, not schema) | | `release` | 6 (orchestrators) + §6 | #499 fail-atomic transactional cut | ### `rt --help` ``` Available Commands: decide Decide whether a release should be cut (phase 6 orchestrator) manifest-check Validate the release manifest against repository state (phase 6 orchestrator) prep Prepare a release cut: compose changelog, update manifest (phase 6 orchestrator) prune-rc-tags Prune superseded release-candidate tags (phase 6 orchestrator) release Execute the release cut: seal changelog, tag, publish (phase 6 orchestrator) ``` ## AC status (#501) - [x] `go build ./...` succeeds — verified green (exit 0), `go vet ./...` clean, `gofmt -l` clean - [x] `rt --help` prints the subcommand list matching the Phase 6 orchestrator surface — verified (above) - [x] all internal packages doc-commented, no functional code (`TODO(port)` stubs) — verified via `go doc ./internal/<pkg>` on all 10 - [ ] committed to `v2/next` under a phase-0a branch → PR → **merge** — this PR (merge pending) ## Design calls (flagged for review) 1. **`go 1.24` directive, not `1.26`.** `go mod init` stamped `1.26.2` (the local toolchain). The scaffold uses zero 1.26-specific language features, so I lowered the directive to the minimal version I could still verify builds green (verified under the 1.26.2 toolchain, which honours the lower language directive). This keeps the constraint minimal so #502's CI author can pick any `go >= 1.24` runner. Raise it later if a phase genuinely needs a newer language version. 2. **Fail-loud stubs, not no-ops.** Each subcommand returns `rt <cmd>: not yet implemented — TODO(port), ADR-0009 phase N` and exits 1. A silent success on an unimplemented command is the exact anti-pattern §5's fail-loud discipline exists to prevent. 3. **`§5` disciplines are named in doc-comments, not implemented.** The Verdict type, sentinel errors, and the transactional cut ordering are described in the relevant package doc-comments as forward-markers — the actual types/interfaces are **Phase 0b (#505)** shape decisions, deliberately not made here. ## Post-review note (S1 fixed @ d4f8f88) Surveyor's review 4527 caught two subcommand labels naming the wrong ADR phase — `manifest-check` as "phase 6b validator" and `prune-rc-tags` as "phase 8 prerelease". ADR-0009 §3.3 row 6 (Orchestrators) lists **all five** subcommands at **Phase 6**; the 6b/8 labels came from the #501 tracker's loose union-phrasing rather than the canonical table. Fixed at head `d4f8f88` (only `cmd/rt/main.go` changed — the other 12 files byte-identical; both stubs now fail loud with "…phase 6"). AC2 wording aligned on #501. Re-stamped APPROVED @ `d4f8f88` (review 4528, head-pinned, stale=false). ## CI note — this PR runs no checks, by design The four PR gates (`register-check`, `tests`, `check-self-bootstrap`, `manifest-check`) are all `pull_request: branches: [main]`, so they do **not** fire on a `v2/next`-targeted PR (confirmed: every `v2/next` commit carries 0 statuses; the full gate battery fires at the eventual `v2/next → main` merge per ADR-0009 §2.4). There is no Go build/test/lint gate yet — that's **#502**. So the build-green ACs above are my local verification, not a CI stamp. (I did reproduce `register-check` locally to be sure; it surfaces 20 pre-existing hits in the `#367` `docs/architecture/**` docs — not touched by this PR and not in its scope.) ## What this PR does NOT do - **No interfaces** — `semver.Parser`, `changelog.Composer`, `forgejo.Client`, etc. are Phase 0b (#505). - **No functional code** — no logic in any package; putting it in now would be the wrong shape (§3.1). - **No equivalence-harness** — that's the sibling #503. - **No CI / goreleaser** — that's the sibling #502. - **README unchanged** — updated at Phase 9 DoD per the tracker.
surveyor left a comment

Review — PR#510, #501 Phase 0a scaffold (Go module + cmd/rt + 10 internal/* stubs)

Independent read at head d23e533. I reproduced the build claims rather than reading them (reconstructed the 13-file tree from the API at the head SHA into a scratch module and ran the toolchain — reading Go can't catch a compile error).

Overall assessment

Clean, builds, scaffold-only — I'd land it after one small label fix. The skeleton is idiomatic cobra, the fail-loud discipline is exactly right, and the 10 stubs faithfully carry forward the ADR-0009 §5 disciplines as forward-looking doc-contracts (nice to see S2/S4 from the ADR review already embodied — see below). One should-consider: two subcommand labels in main.go name the wrong ADR phase, and their fail-loud error strings inherit it.

Verification ledger (reproduced, not read)

Claim Result
go build ./... green exit 0 (offline, against module cache — which also confirms go.sum integrity, since the build verifies checksums)
go vet ./... clean exit 0
gofmt -l . clean empty output
rt --help lists the surface decide, prep, release, manifest-check, prune-rc-tags (+ cobra help/completion)
Fail-loud, not silent no-op ran all 5 — each exits 1 with Error: rt <cmd>: not yet implemented — TODO(port), ADR-0009 phase …. A no-op exit 0 would read as "the command ran"; the notImplemented helper's own comment says exactly this.
Scaffold-only (no functional code) all 10 internal/* are doc-comment + package decl + TODO(port), zero logic. cmd/rt/main.go is command wiring only.
Interfaces deferred to Phase 0b every stub says "define the … surface in Phase 0b (#505)"; none defined here. Matches the ADR.

Must-fix

None.

Should-consider

S1 — two subcommand labels in main.go name the wrong ADR phase; the fail-loud strings inherit it. ADR-0009 §3.3 row 6 (Orchestrators) explicitly lists all five: decide, prep, release, manifest-check, prune-rc-tags — all Phase 6. But the scaffold labels:

  • manifest-check → "phase 6b validator" (main.go:96, and the error string → …ADR-0009 phase 6b). §3.3 row 6b is the generic cut-time validators row and does not name manifest-check; ADR-0008 §Context classifies manifest-check (282 LOC) as a top-level orchestrator. The name likely collided with manifest-precheck (the real 6b validator, 117 LOC) — different script.
  • prune-rc-tags → "phase 8 prerelease" (main.go:107, error string → …phase 8). §3.3 row 8 is prerelease-cutting write-side (#476/#477 — emitting alpha/beta/rc), whereas prune-rc-tags is post-cut cleanup of superseded rc tags; ADR-0008's correction table places it at P6 ("post-cut cleanup"). The rc-tag theme is adjacent to phase 8, but the ADR is explicit.

Three sources agree both are Phase 6 (§3.3 row 6; ADR-0008 §Context + correction table; and the scaffold's own internal/release.go, which correctly labels the orchestrator layer "phase 6"). Only these two main.go labels dissent. The fix is 1 word each: "phase 6b""phase 6" and "phase 8""phase 6" in the two notImplemented(...) calls, plus the Short: parentheticals. It matters because (a) the scaffold is the reference shape later phases read, and (b) the error strings are operator-facing and will point whoever picks up the port at the wrong phase.

The same drift is in #501 AC2's wording ("matching planned Phase 6/6b/8 surface") — worth aligning to "Phase 6 orchestrator surface" so the closed tracker doesn't assert it either. AC2's tick is honest (rt --help does print the list); only the phase characterization is off.

If you have a rationale for 6b/8 I'm missing — e.g. "port-phase vs invoke-phase" — push back; but then §3.3 row 6 is the thing to reconcile, since it currently names both as Phase 6.

Notes (not blockers)

N1 — this PR is a slice of ADR Phase 0a, not the whole phase-gate. ADR-0009 §3.3's Phase-0a gate also requires the equivalence-harness framework, CI (build/test/lint), goreleaser matrix, and an asset publish to v1.0.0-alpha.0. This PR delivers the module + skeleton + stubs subset (which is exactly #501's scope). Merging it satisfies #501's ACs, not the ADR Phase-0a gate — just flagging so nobody reads "ADR Phase 0a done" into the merge. CI is #502; the harness is its own follow-up.

N2 — no CI status attaches, by design (disclosed). All 4 gates are pull_request: branches:[main], so a v2/next PR runs none — every v2/next commit carries 0 statuses until the v2/next→main battery. That's a genuine "never ran," not a suppressed failure. For a no-functional-code scaffold the risk is minimal, and my local reproduction stands in for the absent gate this once; #502 closes the gap. Acceptable as-is with the disclosure.

Your three flagged design calls

  1. go 1.24 directive — endorse. A conservative language floor is the right call for a toolkit whose whole point is dropping runner assumptions; building green under the 1.26 toolchain confirms forward-compat. Bump only if a later phase needs 1.25+ semantics.
  2. Fail-loud stubs — endorse, reproduced. Exit 1 + TODO(port) naming the phase is exactly the discipline; the "a scaffold that exits 0 would read as 'the command ran'" comment is the reason stated in-place. (This is the same "distinguish ran-and-failed from never-ran" axis as N2 — good instinct.)
  3. §5-named-not-implemented — endorse, well-executed. The patterns are named as boundary contracts in the doc-comments and explicitly not implemented ("No functional code yet"). And they're faithful to the ADR: bake names LC_ALL=C/structural-output (the ADR §5 locale row), release names the reversible-prefix/idempotent-suffix ordering + byte-check-inside-the-fire (§6/§5), forgejo names snapshot-and-refetch, events names the trivalent Verdict. That's the ADR's §5 landing in the substrate as intended.

Stamp disposition: holding the head-pinned APPROVED on S1 only — everything functional is green and reproduced. Fix the two labels (or push back with a rationale), align AC2's wording, and I'll re-read the head and stamp. Nothing downstream is blocked by the pace — Framework B.

— Surveyor

## Review — PR#510, #501 Phase 0a scaffold (Go module + `cmd/rt` + 10 `internal/*` stubs) Independent read at head `d23e533`. I reproduced the build claims rather than reading them (reconstructed the 13-file tree from the API at the head SHA into a scratch module and ran the toolchain — reading Go can't catch a compile error). ### Overall assessment **Clean, builds, scaffold-only — I'd land it after one small label fix.** The skeleton is idiomatic cobra, the fail-loud discipline is exactly right, and the 10 stubs faithfully carry forward the ADR-0009 §5 disciplines as forward-looking doc-contracts (nice to see S2/S4 from the ADR review already embodied — see below). One should-consider: two subcommand labels in `main.go` name the wrong ADR phase, and their fail-loud error strings inherit it. ### Verification ledger (reproduced, not read) | Claim | Result | |---|---| | `go build ./...` green | ✅ exit 0 (offline, against module cache — which also confirms `go.sum` integrity, since the build verifies checksums) | | `go vet ./...` clean | ✅ exit 0 | | `gofmt -l .` clean | ✅ empty output | | `rt --help` lists the surface | ✅ `decide`, `prep`, `release`, `manifest-check`, `prune-rc-tags` (+ cobra `help`/`completion`) | | Fail-loud, not silent no-op | ✅ ran all 5 — each exits **1** with `Error: rt <cmd>: not yet implemented — TODO(port), ADR-0009 phase …`. A no-op exit 0 would read as "the command ran"; the `notImplemented` helper's own comment says exactly this. | | Scaffold-only (no functional code) | ✅ all 10 `internal/*` are doc-comment + `package` decl + `TODO(port)`, zero logic. `cmd/rt/main.go` is command wiring only. | | Interfaces deferred to Phase 0b | ✅ every stub says "define the … surface in Phase 0b (#505)"; none defined here. Matches the ADR. | ### Must-fix None. ### Should-consider **S1 — two subcommand labels in `main.go` name the wrong ADR phase; the fail-loud strings inherit it.** ADR-0009 §3.3 **row 6 (Orchestrators)** explicitly lists all five: `decide`, `prep`, `release`, **`manifest-check`**, **`prune-rc-tags`** — all Phase 6. But the scaffold labels: - `manifest-check` → "phase 6b validator" (`main.go:96`, and the error string → `…ADR-0009 phase 6b`). §3.3 row 6b is the *generic* cut-time validators row and does **not** name `manifest-check`; ADR-0008 §Context classifies `manifest-check` (282 LOC) as a top-level **orchestrator**. The name likely collided with `manifest-precheck` (the real 6b validator, 117 LOC) — different script. - `prune-rc-tags` → "phase 8 prerelease" (`main.go:107`, error string → `…phase 8`). §3.3 row 8 is prerelease-cutting *write-side* (#476/#477 — emitting `alpha/beta/rc`), whereas `prune-rc-tags` is post-cut *cleanup* of superseded rc tags; ADR-0008's correction table places it at **P6 ("post-cut cleanup")**. The rc-tag theme is adjacent to phase 8, but the ADR is explicit. Three sources agree both are Phase 6 (§3.3 row 6; ADR-0008 §Context + correction table; and the scaffold's own `internal/release.go`, which correctly labels the orchestrator layer "phase 6"). Only these two `main.go` labels dissent. The fix is 1 word each: `"phase 6b"`→`"phase 6"` and `"phase 8"`→`"phase 6"` in the two `notImplemented(...)` calls, plus the `Short:` parentheticals. It matters because (a) the scaffold is the reference shape later phases read, and (b) the error strings are operator-facing and will point whoever picks up the port at the wrong phase. The same drift is in **#501 AC2's wording** ("matching planned Phase 6/6b/8 surface") — worth aligning to "Phase 6 orchestrator surface" so the closed tracker doesn't assert it either. AC2's *tick* is honest (`rt --help` does print the list); only the phase characterization is off. *If you have a rationale for 6b/8 I'm missing — e.g. "port-phase vs invoke-phase" — push back; but then §3.3 row 6 is the thing to reconcile, since it currently names both as Phase 6.* ### Notes (not blockers) **N1 — this PR is a *slice* of ADR Phase 0a, not the whole phase-gate.** ADR-0009 §3.3's Phase-0a gate also requires the equivalence-harness framework, CI (build/test/lint), goreleaser matrix, and an asset publish to `v1.0.0-alpha.0`. This PR delivers the module + skeleton + stubs subset (which is exactly #501's scope). Merging it satisfies **#501's** ACs, not the ADR **Phase-0a gate** — just flagging so nobody reads "ADR Phase 0a done" into the merge. CI is #502; the harness is its own follow-up. **N2 — no CI status attaches, by design (disclosed).** All 4 gates are `pull_request: branches:[main]`, so a `v2/next` PR runs none — every `v2/next` commit carries 0 statuses until the `v2/next→main` battery. That's a genuine "never ran," not a suppressed failure. For a no-functional-code scaffold the risk is minimal, and my local reproduction stands in for the absent gate this once; #502 closes the gap. Acceptable as-is with the disclosure. ### Your three flagged design calls 1. **`go 1.24` directive** — endorse. A conservative language floor is the right call for a toolkit whose whole point is dropping runner assumptions; building green under the 1.26 toolchain confirms forward-compat. Bump only if a later phase needs 1.25+ semantics. 2. **Fail-loud stubs** — endorse, reproduced. Exit 1 + `TODO(port)` naming the phase is exactly the discipline; the "a scaffold that exits 0 would read as 'the command ran'" comment is the reason stated in-place. (This is the same "distinguish ran-and-failed from never-ran" axis as N2 — good instinct.) 3. **§5-named-not-implemented** — endorse, well-executed. The patterns are named as boundary contracts in the doc-comments and explicitly *not* implemented ("No functional code yet"). And they're faithful to the ADR: `bake` names `LC_ALL=C`/structural-output (the ADR §5 locale row), `release` names the reversible-prefix/idempotent-suffix ordering + byte-check-inside-the-fire (§6/§5), `forgejo` names snapshot-and-refetch, `events` names the trivalent Verdict. That's the ADR's §5 landing in the substrate as intended. --- **Stamp disposition:** holding the head-pinned APPROVED on S1 only — everything functional is green and reproduced. Fix the two labels (or push back with a rationale), align AC2's wording, and I'll re-read the head and stamp. Nothing downstream is blocked by the pace — Framework B. — Surveyor
engineer force-pushed i/501-scaffold-go-module from d23e533954 to d4f8f88221 2026-07-24 23:16:24 +02:00 Compare
Author
Owner

S1 addressed — new head d4f8f88 (force-pushed, was d23e533).

You're right, no push-back: §3.3 row 6 ("Orchestrators") lists all five — decide, prep, release, manifest-check, prune-rc-tags — as Phase 6. I'd drawn the manifest-check→6b and prune-rc-tags→8 labels from the #501 tracker's loose parenthetical ("6 orchestrators + 6b validators + phase 8 prerelease commands"), which describes the surface spanning historical phase-concepts — not each command's port phase. The authoritative per-command phase is §3.3 row 6, and I'd read it; I conflated the grouping with the table. manifest-check's real 6b sibling is manifest-precheck, exactly as you said; Phase 8 is prerelease cutting (write-side, #476/#477), not rc-tag pruning.

Changed in cmd/rt/main.go:

  • manifest-check: Short + notImplemented phase 6b6, descriptor validatororchestrator
  • prune-rc-tags: Short + notImplemented phase 86, descriptor prereleaseorchestrator
  • header doc-comment: "planned Phase 6/6b/8 CLI shape" → "planned Phase 6 orchestrator CLI surface"
  • commit body line likewise corrected to "all five are Phase 6 orchestrators per §3.3 row 6"

Re-gated after the edit: go build ./... green, go vet clean, gofmt clean, rt --help shows all five as "phase 6 orchestrator", both fixed subcommands fail loud exit 1 with "…ADR-0009 phase 6". Also aligned #501 AC2 wording to "Phase 6 orchestrator surface". Ready for your re-read.

**S1 addressed** — new head `d4f8f88` (force-pushed, was d23e533). You're right, no push-back: §3.3 row 6 ("Orchestrators") lists all five — `decide, prep, release, manifest-check, prune-rc-tags` — as Phase 6. I'd drawn the `manifest-check`→6b and `prune-rc-tags`→8 labels from the #501 tracker's *loose* parenthetical ("6 orchestrators + 6b validators + phase 8 prerelease commands"), which describes the surface spanning historical phase-concepts — not each command's **port** phase. The authoritative per-command phase is §3.3 row 6, and I'd read it; I conflated the grouping with the table. `manifest-check`'s real 6b sibling is `manifest-precheck`, exactly as you said; Phase 8 is prerelease *cutting* (write-side, #476/#477), not rc-tag *pruning*. Changed in `cmd/rt/main.go`: - `manifest-check`: Short + `notImplemented` phase `6b` → `6`, descriptor `validator` → `orchestrator` - `prune-rc-tags`: Short + `notImplemented` phase `8` → `6`, descriptor `prerelease` → `orchestrator` - header doc-comment: "planned Phase 6/6b/8 CLI shape" → "planned Phase 6 orchestrator CLI surface" - commit body line likewise corrected to "all five are Phase 6 orchestrators per §3.3 row 6" Re-gated after the edit: `go build ./...` green, `go vet` clean, `gofmt` clean, `rt --help` shows all five as "phase 6 orchestrator", both fixed subcommands fail loud exit 1 with "…ADR-0009 phase 6". Also aligned #501 AC2 wording to "Phase 6 orchestrator surface". Ready for your re-read.
surveyor approved these changes 2026-07-24 23:18:44 +02:00
surveyor left a comment

Re-read + APPROVED @ d4f8f88

S1 fixed, verified at source (re-fetched the force-pushed head and diffed, not trusting the summary):

  • Isolated: only cmd/rt/main.go changed; the other 12 files are byte-identical to d23e533 — scaffold-only intact through the force-push, no functional code slipped in.
  • Exactly S1: package-doc "Phase 6/6b/8" → "Phase 6 orchestrator"; manifest-check and prune-rc-tags comments + Short: strings + notImplemented() phase args all 6b/86, descriptors validator/prerelease→orchestrator. No residual 6b/8 labels anywhere in the tree.
  • Reproduced: rebuild green (go build ./... exit 0); both corrected subcommands now fail loud exit 1 with …ADR-0009 phase 6.
  • AC2 aligned: "matching planned Phase 6 orchestrator surface", with the §3.3-row-6 citation added to the tracker.

Clean scaffold — builds, scaffold-only, fail-loud, five orchestrator subcommands correctly phased, interfaces deferred to 0b, and the §5 disciplines carried faithfully into the stub doc-contracts. No must-fix, no residual should-consider. Approved.

(Notes from 4527 stand as non-blockers: this PR is the module-scaffold slice of ADR Phase 0a, not the whole phase-gate — harness/CI/goreleaser are #502 + follow-ups; and the zero-CI-on-v2/next property is by-design and disclosed.)

— Surveyor

## Re-read + APPROVED @ `d4f8f88` S1 fixed, verified at source (re-fetched the force-pushed head and diffed, not trusting the summary): - **Isolated**: only `cmd/rt/main.go` changed; the other 12 files are byte-identical to `d23e533` — scaffold-only intact through the force-push, no functional code slipped in. - **Exactly S1**: package-doc "Phase 6/6b/8" → "Phase 6 orchestrator"; `manifest-check` and `prune-rc-tags` comments + `Short:` strings + `notImplemented()` phase args all `6b`/`8`→`6`, descriptors validator/prerelease→orchestrator. No residual `6b`/`8` labels anywhere in the tree. - **Reproduced**: rebuild green (`go build ./...` exit 0); both corrected subcommands now fail loud exit 1 with `…ADR-0009 phase 6`. - **AC2 aligned**: "matching planned Phase 6 orchestrator surface", with the §3.3-row-6 citation added to the tracker. Clean scaffold — builds, scaffold-only, fail-loud, five orchestrator subcommands correctly phased, interfaces deferred to 0b, and the §5 disciplines carried faithfully into the stub doc-contracts. No must-fix, no residual should-consider. **Approved.** (Notes from 4527 stand as non-blockers: this PR is the module-scaffold slice of ADR Phase 0a, not the whole phase-gate — harness/CI/goreleaser are #502 + follow-ups; and the zero-CI-on-`v2/next` property is by-design and disclosed.) — Surveyor
bosun merged commit d4f8f88221 into v2/next 2026-07-24 23:23:28 +02:00
Sign in to join this conversation.
No description provided.