Skip to content

Add rollout posture (Step 1.9): feature flags as a recorded decision - #10

Open
petaltank wants to merge 2 commits into
feat/roadmap-0.4from
feat/rollout-posture
Open

petaltank wants to merge 2 commits into
feat/roadmap-0.4from
feat/rollout-posture

Conversation

@petaltank

Copy link
Copy Markdown
Collaborator

Summary

Roadmap item 4 (meta/roadmap-0.4.md). Based on #6; GitHub retargets to master once #6 merges. Independent of the other feature PRs (if #8 or #9 also land, the spec's principles list needs a one-line renumber — each adds an "18.").

The improvement note was app-specific ("this app uses feature flags — dstack should ask"). Built as the general form, with flags as the main case:

  • New Step 1.9 — Rollout posture, same shape as Step 1.8. Asked once per project: none (recommended default; recorded, not skipped) / flags / staged (beta cohort, per-tenant, canary). For flags/staged, the convention (flag service, naming, add/toggle/remove, cleanup expectation) is located CLAUDE.md-first, exactly like the repo profile. Persists as rollout_posture / rollout_convention_location; unset → none.
  • Pass 1 then requires a per-feature Rollout: line under MVP surface — behind flag x, default off, visible to … or not flagged, because …. Unknown → a ledger row, never silence.
  • Pass 3 / Fork B marks flagged tickets 🚩 (soft signal, same semantics as 🎨) and — when the flag is temporary — adds a cleanup ticket to the DAG, blocked by the last 🚩 ticket. Removing a flag is work; work gets a node that the next-ticket pick will find after launch.
  • Tier 3 / Linear: tickets/<id>.md and Fork A issue descriptions carry a one-line Rollout: field (flag, default, cleanup ticket) — the "guidance for Linear issues" the note asked for.
  • dstack-ticket calls 🚩 out like 🎨; dstack-yolo Step 6 confirms the flag is wired and defaults per the convention before [x] (mismatch → re-spec note, not a silent ship; a flag that turned out permanent drops its cleanup node in the same commit).
  • Spec: new "Rollout posture" section after Design posture + principle 18. Reference project records rollout_posture: none with the reason (digest is opt-in per user — the toggle is the gate) and shows the 🚩 legend line. README: walkthrough step 2, Decision guide entry, FAQ fallback.

Verification

  • ./install.sh into a scratch repo; grep rollout_posture / 🚩 across spec, skill, commands, example, README.
  • Read Step 1.9 next to 1.8 for parallel wording.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NLMK6F3vQ1HzyU1Mxqt6Kr

petaltank and others added 2 commits September 11, 2026 21:10
In a codebase that gates new behavior behind feature flags, "is this flagged?" was a
decision no pass asked — it got invented mid-ticket or skipped. New grounding step, same
shape as design posture: record once per project whether a rollout mechanism exists
(none / flags / staged) and where its convention lives, CLAUDE.md-first.

When it does: Pass 1 requires a per-feature Rollout: line; Pass 3 marks each ticket that
ships behind the flag 🚩 (soft signal, like 🎨) and, for a temporary flag, adds a cleanup
ticket to the DAG blocked by the last flagged one — removing a flag is work, and work
gets a node. Ticket detail and Fork A issue descriptions carry a one-line Rollout: field.
dstack-ticket calls the marker out; dstack-yolo confirms the flag is wired and defaults
per the convention before [x]. Unset → none.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NLMK6F3vQ1HzyU1Mxqt6Kr
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NLMK6F3vQ1HzyU1Mxqt6Kr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant