feat(release): publish_mode default returns to immediate#332 took Option A and Option B was correct #827

Closed
opened 2026-08-21 17:17:56 +02:00 by bosun · 1 comment
Owner

Operator decision

Release cuts publish automatically. publish_mode default returns to immediate.

Operator, 2026-08-21: "I still would prefer to auto-publish the release cuts. Everything else
is just pretending of being in control."

What this reverses

#332 (2026-07-03) found the README claiming "gates every release behind a human" while the
default was immediate, and offered three fixes:

Option A (taken)   change the DEFAULT to draft
Option B           rewrite the README to describe the actual default
Option C           draft in the reusable, immediate in quick-start

Option B was correct. #332 came from an external cold-read and was marked BLOCKING
v1.0.0; it reconciled the code to a documentation sentence without establishing which side was
authoritative. The agreed behaviour was auto-publish.

Scope

  • reusable-release.yml: publish_mode default 'draft''immediate'
  • README: remove/rewrite the "gates every release behind a human … you click Publish" claim.
    It is the sentence that caused this.
  • docs/integration.md and any adopter guidance repeating the gate claim
  • ADR-0003 Gate-3: record that the gate was reconsidered and dropped, with the reason
  • Adopters keep publish_mode: draft available as an opt-in — #114 established the input
    and nothing here removes it

Acceptance criteria

  • Default is immediate; a cut publishes without a click
  • No document claims releases are human-gated by default
  • draft still works when explicitly set (test or measured)
  • ADR-0003 records the reversal and its reason rather than silently flipping

Consequence for open trackers

  • #805 — the manifest is written at release-object creation, not at publish. Under
    auto-publish the window shrinks to seconds; it does not close
    (@engineer). The tracker
    survives; its framing ("draft-first is the design") does not.
  • #811"nothing watches for unpublished drafts" becomes near-empty by construction.
    Re-scope or close.
  • purser#62 — resolved; v0.4.0 published 17:12:56.

Anchor

Operator decision. #332's Option B, four weeks late.

## Operator decision **Release cuts publish automatically. `publish_mode` default returns to `immediate`.** Operator, 2026-08-21: *"I still would prefer to auto-publish the release cuts. Everything else is just pretending of being in control."* ## What this reverses `#332` (2026-07-03) found the README claiming *"gates every release behind a human"* while the default was `immediate`, and offered three fixes: ``` Option A (taken) change the DEFAULT to draft Option B rewrite the README to describe the actual default Option C draft in the reusable, immediate in quick-start ``` **Option B was correct.** `#332` came from an external cold-read and was marked BLOCKING v1.0.0; it reconciled the code to a documentation sentence without establishing which side was authoritative. **The agreed behaviour was auto-publish.** ## Scope - `reusable-release.yml`: `publish_mode` default `'draft'` → `'immediate'` - README: remove/rewrite the *"gates every release behind a human … you click Publish"* claim. **It is the sentence that caused this.** - `docs/integration.md` and any adopter guidance repeating the gate claim - ADR-0003 Gate-3: record that the gate was reconsidered and dropped, with the reason - Adopters keep `publish_mode: draft` available as an opt-in — `#114` established the input and nothing here removes it ## Acceptance criteria - [x] Default is `immediate`; a cut publishes without a click - [x] No document claims releases are human-gated by default - [x] `draft` still works when explicitly set (test or measured) - [x] ADR-0003 records the reversal and its reason rather than silently flipping ## Consequence for open trackers - `#805` — the manifest is written at release-object creation, not at publish. **Under auto-publish the window shrinks to seconds; it does not close** (@engineer). The tracker survives; its framing (*"draft-first is the design"*) does not. - `#811` — *"nothing watches for unpublished drafts"* becomes near-empty by construction. Re-scope or close. - `purser#62` — resolved; `v0.4.0` published 17:12:56. ## Anchor Operator decision. `#332`'s Option B, four weeks late.
bosun closed this issue 2026-08-21 20:40:07 +02:00
Author
Owner

4 ACs ticked — each RE-DERIVED from main

default: 'immediate'                     ✓  reusable-release.yml:60
a cut publishes without a click          ✓  v0.43.0 draft=false, published on the first real cut
no doc claims human-gated by default     ✓  2 hits, BOTH the phrase quoted inside its own correction
                                            (ADR-0003's cold-read history; config.schema.json says
                                             "the terminal default 'immediate' (#827)")
draft still works when set               ✓  internal/config/publishmode_test.go, 8 draft arms
ADR-0003 records the reversal + reason   ✓  16 references

📌 The two remaining hits are why this needed reading rather than counting. A correct retraction quotes what it retracts, so grep -c returns non-zero on a properly-fixed document. That is the same predicate problem /srv/CLAUDE.md records for checking a retraction: the question is "is every occurrence inside a negation?", not "is the count zero?"

## 4 ACs ticked — each RE-DERIVED from `main` ``` default: 'immediate' ✓ reusable-release.yml:60 a cut publishes without a click ✓ v0.43.0 draft=false, published on the first real cut no doc claims human-gated by default ✓ 2 hits, BOTH the phrase quoted inside its own correction (ADR-0003's cold-read history; config.schema.json says "the terminal default 'immediate' (#827)") draft still works when set ✓ internal/config/publishmode_test.go, 8 draft arms ADR-0003 records the reversal + reason ✓ 16 references ``` 📌 **The two remaining hits are why this needed reading rather than counting.** *A correct retraction quotes what it retracts, so `grep -c` returns non-zero on a properly-fixed document.* That is the same predicate problem `/srv/CLAUDE.md` records for checking a retraction: **the question is "is every occurrence inside a negation?", not "is the count zero?"**
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#827
No description provided.