docs: FEAT-588 record the arriving breath as a gate, not a diminished practice - #483
Merged
MP2EZ merged 1 commit intoSep 10, 2026
Conversation
β¦ practice
The deliverable is a ruling, not a change. `philosopher` and `ux` ruled
independently and reached the same verdict: the Daily Loop's Aware Presence beat
is a gate wearing session chrome, and its differences from the standalone
practices are intent. No behaviour changes.
Five differences carry the ruling, all verified in source: the beat starts itself
(no Begin β all three standalone practices gate on PracticeToggleButton, and the
absence of that button IS the gate); it carries no name while it runs; it ends in
the next beat rather than a completion screen; it has no haptics at all, because
the opt-in promises eyes-closed practice and this beat is eyes-open by
construction; and it is absent from STANDALONE_PRACTICES.
One premise of the tester report is inverted, and it is the strongest item on its
list. Timer's built-in Pause/Resume is not borrowed practice vocabulary β it is
ORPHAN vocabulary. All three standalone practices pass `showControls={false}`
("using custom button below"); the only two live sites rendering Timer's own
transport are this beat and the closing coda. The practices refused this control.
Declined, all considered: dropping `showControls` (needs an accessibility
sign-off on WCAG 2.2.2 and intersects DEBUG-468's ruling that Pause is this
beat's stay-with-it affordance), `showProgress`, and 30000 -> 32000 ms.
Comment STYLE is what makes this free rather than a ~21-minute simulator gate.
`practices/dailyloop/` is a Protected Path, and Phase 2.5's inert filter strips
`//`, `/**`, `* ` and `*/` but not a JSX `{/* */}` block. FEAT-565's own
record-only commit 7bba8f4 is written that way and left 17 surviving lines, so
it paid a full gate run for a comment. Replaying the same filter over this diff
gives zero surviving lines in the .tsx; the docs bullet is outside app/ and never
enters the candidate set. Verified against both commits, not assumed.
`crisis` reviewed the recorded text (required for any dailyloop diff β the inert
filter exempts the Maestro half, never the agent half) and required three
corrections, all applied: the record said "no session haptics", which is a term
of art naming only the anchors and would have left scheduled breath cues reading
as open when FEAT-565 declined the whole hook; and the case against the duration
change listed only content rationales, when BREATH_DURATION_MS is load-bearing in
tenseMode.ts's crisis ruling that re-hosted quick's SUPPORT_LINE onto Sphere
Sovereignty. Both would have propagated silently through a record written to be
quoted back.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CkZagJp7dzojvrjY7uYwkh
MP2EZ
deleted the
feat/FEAT-588-arriving-breath-gate-vocabulary-ruling
branch
September 10, 2026 05:15
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes FEAT-588
The deliverable is a ruling, not a change
FEAT-588 asked whether the Daily Loop's arriving breath presents itself as a practice when its job is to be a gate.
philosopheranduxruled independently and reached the same verdict: no change. The beat is a gate wearing session chrome, and its differences from the standalone practices are intent.So what merges is the record. Nothing about the app's behaviour changes.
Why the ruling went that way
Five differences are the load-bearing evidence, all verified in source:
isBreathActiveinitialises toshowBreath, where all three standalone practices gate onPracticeToggleButton's Begin β Pause β Resume. The absence of a Begin button is the gate β you do not enter a threshold, you are already in it.breathCompletedflips and the same ScrollView re-renders β no completion screen, no quote, no Continue. A practice in this app always ends in a bounded artefact.STANDALONE_PRACTICESβ a doorway, not a room.One premise of the report is inverted
The strongest item on the "borrowed practice vocabulary" list turns out to point the other way. Timer's built-in Pause/Resume is not borrowed β it is orphan vocabulary. All three standalone practices pass
showControls={false}("using custom button below"); the only two live sites rendering Timer's own transport are this beat andDailyLoopCompleteScreen's coda. The practices refused this control. The beat is not a stripped-down practice; it is the raw Timer default, and the loop's two breaths share one internally consistent idiom.Deliberately not changed
All considered, none owed by the ruling: dropping
showControls(a real improvement both lenses liked, but it needs anaccessibilitysign-off on WCAG 2.2.2 β auto-starting motion over 5s β and it intersects DEBUG-468's ruling that Pause is this beat's stay-with-it affordance);showProgress; and 30000 β 32000 ms for four clean cycles, which is a refinement rather than a defect, would invalidate three shipped rationales written around 3.75 cycles, and would leave the coda's 15000 ms (1.875 cycles) inconsistent unless carried too.Where the record lives, and why the style matters
The in-code half is a
*-prefixed block inDailyLoopStepScreen's module header, plus a//anchor besidebreathCompleted. That is deliberate and it is the difference between this PR costing nothing and costing a simulator gate.practices/dailyloop/is a Protected Path, so Phase 2.5's inert filter is what decides. It strips//,/**,*and*/β but not a JSX{/* β¦ */}block, whose opener is{/*and whose body lines carry no*. FEAT-565's own record-only commit (7bba8f4c, +19/β0, pure prose) is written that way and left 17 surviving lines, so it paid a full gate run for a comment. Replaying the same filter over this diff gives 0 surviving lines in the.tsx; the docs bullet is outsideapp/, so it never enters the candidate set at all.Verified, not assumed β the filter was run against both commits.
The crisis pass changed the record
crisisis required for anydailyloop/diff, comment-only included β the inert filter exempts the Maestro half, never the agent half. It returned NEEDS_EDIT and all three corrections are applied:sessionStart/sessionEndanchors, but FEAT-565 declined the whole hook, both channels β so as written a reader could take scheduled breath cues to be open. Crisis-adjacent, not stylistic: wiring any haptic channel onto this beat would import DEBUG-587's recorded-and-unfixed 1β3 frame blur residual onto a surface that currently has none.BREATH_DURATION_MSis load-bearing in a crisis ruling:tenseMode.tsre-hosted quick depth's SUPPORT_LINE onto Sphere Sovereignty precisely because Aware Presence's reflection phase sits behind this 30s gate, and crisis review rejected the alternative as making quick's crisis affordance strictly less available than deep's. The header now says so.Both would have propagated silently β through a record written specifically to be quoted back at future readers. Confirmed independently: Aware Presence carries SUPPORT_LINE in no (depth, mode) combination, and the root FAB is live throughout the breath (
DailyLoopis inIMMERSIVE_ROUTES, notSUPPRESSED_ROUTES), so the gate delays no 988 affordance.philosopherruled during planning.Checks
Typecheck, lint baseline, 179 dailyloop tests,
test:accessibility456,test:integration162 β all green. No executable line changed.π€ Generated with Claude Code
https://claude.ai/code/session_01CkZagJp7dzojvrjY7uYwkh