fix(bootstrap): implement virtual v0.0.0 anchor + walk-from-initial-commit (Option A, supersedes #355 Option B) #368

Closed
opened 2026-07-04 09:04:33 +02:00 by bosun · 1 comment
Owner

Motivation

Operator ratified 2026-07-04 post-round-3: change fresh-repo bootstrap behavior from Option B (fail-loud with actionable error) to Option A (virtual v0.0.0 control file + walk from initial commit).

Operator quote: 'Ideally, the toolkit should produce a v0.0.1 release (or just assume a "virtual" control file with v0.0.0), if there is no existing control file yet.'

Behavior specification

When .release-toolkit-manifest.json is absent AND no stable vX.Y.Z tag exists:

  1. Assume last_released_tag = v0.0.0 (virtual anchor)
  2. Walk commits from initial commit
  3. Compute SemVer bump per commit convention:
    • Any feat: → v0.1.0 (minor bump from v0.0.0)
    • Only fix: → v0.0.1 (patch bump from v0.0.0)
    • Only chore/docs/refactor: → v0.0.1 (implicit patch for first cut)
  4. First cut creates the manifest from scratch (as legacy docs at integration.md:377-380 originally described — that text becomes accurate again post-fix)

Scope

  • Modify scripts/release-decide.sh:145-175 to implement virtual-v0.0.0 bootstrap instead of FATAL exit
  • Update user-facing error messages to remove Option B guidance (no longer needed)
  • Reconcile docs: docs/integration.md:56-82 (Option B fail-loud text added in #363) becomes wrong; docs/integration.md:377-380 (legacy walk-from-initial-commit text) becomes correct
  • Update README.md:94-101 quick-start to reflect new behavior
  • Add regression tests: fresh repo + feat → v0.1.0; fresh repo + fix → v0.0.1; fresh repo + chore-only → v0.0.1
  • Preserve existing OPTION 2 (hand-write manifest) as alternative for advanced use cases

Supersession

Supersedes #355 disposition (Option B). #355 stays closed as the substrate work landed via #363; this tracker changes the behavior direction per operator's post-round-3 ratify.

Verification AC

  • Fresh-repo path executes cleanly: git init → feat: commit → run release-decide.sh → next_version=0.1.0
  • Docs describe virtual-v0.0.0 behavior consistently across README + integration.md
  • No contradictions between docs sections
  • Regression tests cover the 3 commit-convention cases
  • External cold-read round 4 (if run) finds no fresh-bootstrap objection

Anchor

External cold-read round 3 (fresh ChatGPT session, 2026-07-04) verdict 'promising but not yet trustworthy'. Reviewer verified via execution (dry-run fresh-repo → v0.0.0 → feat → v0.1.0 all worked correctly). New findings surfaced despite round-2 delta closures. Operator ratified delta plan 2026-07-04. This tracker addresses one of the round-3 findings. Success criterion: subsequent external cold-read returns no further objections of this class.

BLOCKING v1.0.0.

## Motivation Operator ratified 2026-07-04 post-round-3: change fresh-repo bootstrap behavior from Option B (fail-loud with actionable error) to Option A (virtual v0.0.0 control file + walk from initial commit). Operator quote: 'Ideally, the toolkit should produce a v0.0.1 release (or just assume a "virtual" control file with v0.0.0), if there is no existing control file yet.' ## Behavior specification When `.release-toolkit-manifest.json` is absent AND no stable `vX.Y.Z` tag exists: 1. Assume `last_released_tag = v0.0.0` (virtual anchor) 2. Walk commits from initial commit 3. Compute SemVer bump per commit convention: - Any `feat:` → v0.1.0 (minor bump from v0.0.0) - Only `fix:` → v0.0.1 (patch bump from v0.0.0) - Only `chore/docs/refactor:` → v0.0.1 (implicit patch for first cut) 4. First cut creates the manifest from scratch (as legacy docs at integration.md:377-380 originally described — that text becomes accurate again post-fix) ## Scope - Modify `scripts/release-decide.sh:145-175` to implement virtual-v0.0.0 bootstrap instead of FATAL exit - Update user-facing error messages to remove Option B guidance (no longer needed) - Reconcile docs: `docs/integration.md:56-82` (Option B fail-loud text added in #363) becomes wrong; `docs/integration.md:377-380` (legacy walk-from-initial-commit text) becomes correct - Update `README.md:94-101` quick-start to reflect new behavior - Add regression tests: fresh repo + feat → v0.1.0; fresh repo + fix → v0.0.1; fresh repo + chore-only → v0.0.1 - Preserve existing OPTION 2 (hand-write manifest) as alternative for advanced use cases ## Supersession Supersedes #355 disposition (Option B). #355 stays closed as the substrate work landed via #363; this tracker changes the behavior direction per operator's post-round-3 ratify. ## Verification AC - Fresh-repo path executes cleanly: git init → feat: commit → run release-decide.sh → next_version=0.1.0 - Docs describe virtual-v0.0.0 behavior consistently across README + integration.md - No contradictions between docs sections - Regression tests cover the 3 commit-convention cases - External cold-read round 4 (if run) finds no fresh-bootstrap objection ## Anchor External cold-read round 3 (fresh ChatGPT session, 2026-07-04) verdict 'promising but not yet trustworthy'. Reviewer verified via execution (dry-run fresh-repo → v0.0.0 → feat → v0.1.0 all worked correctly). New findings surfaced despite round-2 delta closures. Operator ratified delta plan 2026-07-04. This tracker addresses one of the round-3 findings. Success criterion: subsequent external cold-read returns no further objections of this class. BLOCKING v1.0.0.

Delta merged via PR #373 at 81ef6af. Virtual v0.0.0 anchor + walk-from-initial-commit implementing Option A per operator ratify. First cut: v0.1.0 (any feat: since root), v0.0.1 (only fix:), or mode=noop (only chore:/docs:/refactor: — escape-hatch via feat:/fix: or bump/* label). Supersedes #355 Option B fail-loud disposition (#363 substrate stays landed). Includes Surveyor aedd's --root sentinel fix for prerelease-tag-in-virtual-mode silent-noop + doc corrections on the bump table (chore=noop, feat!:/BREAKING=v1.0.0 default or v0.1.0 with pre_v1_breaking_to_minor).

Delta merged via [PR #373](https://git.frankenbit.de/frankenbit/release-toolkit/pulls/373) at 81ef6af. Virtual v0.0.0 anchor + walk-from-initial-commit implementing Option A per operator ratify. First cut: v0.1.0 (any feat: since root), v0.0.1 (only fix:), or mode=noop (only chore:/docs:/refactor: — escape-hatch via feat:/fix: or bump/* label). Supersedes #355 Option B fail-loud disposition (#363 substrate stays landed). Includes Surveyor aedd's --root sentinel fix for prerelease-tag-in-virtual-mode silent-noop + doc corrections on the bump table (chore=noop, feat!:/BREAKING=v1.0.0 default or v0.1.0 with pre_v1_breaking_to_minor).
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#368
No description provided.