Conversation
Runs the Pest suite on every pull request (opened, synchronize, reopened) using PHP 8.5, SQLite in-memory, and a Composer cache for fast reruns. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Four bugs prevented the HIIT timer from functioning:
1. $runner->start() was commented out in TimerScreen::start(), so tapping
Start (or wire:init auto-start) never transitioned the cursor from idle
to running — the JS ticker never fired and totalRemaining stayed at 0.
2. segmentLabel() used string literals ('pause', 'cooldown', etc.) in a
match against a StateMachine enum, so the match never hit and always
fell through to the default (phaseLabel).
3. resumeAs() in TimerCursor used clone(\$this, [...]) — not valid PHP —
causing a fatal error whenever the user resumed from pause.
4. repLabel() called in_array(\$this->state->value, ['pause', ...]) with
lowercase strings, but StateMachine values are uppercase ('PAUSE', etc.),
so the rep label rendered in states where it should be hidden.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The original clone($this, [...]) was valid PHP 8.5 (RFC clone_with_v2, voted 16-4, merged). My previous fix replacing it with new self() was unnecessary. Restore the idiomatic form, simplified to only override the one property that actually changes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Run history: - HistoryEntry readonly value object + HistoryLog JSON persistence (capped at 20) - WriteHistoryEntry queued job dispatched on program completion - config/queue.php with background driver (sync in tests via phpunit.xml) - TimerScreen shows last 20 runs on idle tab; greyed out for deleted programs Timer screen restyle: - SVG circular ring (5 px stroke, ~92 vw) as total-time visual countdown - Ring color follows phase/state (phase color → gray pause → orange cooldown → green complete) - Ring stays full and static during IDLE and PREPARE - Program name pushed to the top bar on program load (not only on Start) - Phase name, countdown digit, and rep counter stacked inside the ring - Phase strip kept at top for structural context PREPARE state (5-second "Get Ready" before first rep): - New StateMachine::prepare case; added to TimerCursor::isActive() - TimerRunner::start() enters prepare; tick() transitions to running after 5 s - Pause blocked during prepare (discard only) - Custom triple beep every second of the countdown; JS ticker extended to PREPARE Long-press pause gesture: - Hold anywhere in the ring area for 1.5 s to pause (RUNNING/PAUSE/COOLDOWN only) - LONG_PRESS_PAUSE=all|android env flag controls platform scope - Subtle ring dim on hold; ambient "Hold to pause" hint text Other: - Program editor last-phase cooldown field greyed with tooltip - TimerProgram::all() sorts by last_used_at (was created_at) - PHP 8.5 pipe operator in TimerProgram::load() and TimerScreen::syncCursor() - array_first() used in TimerRunner::currentPhase() - 81 tests, all passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Run history: - HistoryEntry readonly value object + HistoryLog JSON persistence (capped at 20) - WriteHistoryEntry queued job dispatched on program completion - config/queue.php with background driver (sync in tests via phpunit.xml) - TimerScreen shows last 20 runs on idle tab; greyed out for deleted programs Timer screen restyle: - SVG circular ring (5 px stroke, ~92 vw) as total-time visual countdown - Ring color follows phase/state (phase color → gray pause → orange cooldown → green complete) - Ring stays full and static during IDLE and PREPARE - Program name pushed to the top bar on program load (not only on Start) - Phase name, countdown digit, and rep counter stacked inside the ring - Phase strip kept at top for structural context PREPARE state (5-second "Get Ready" before first rep): - New StateMachine::prepare case; added to TimerCursor::isActive() - TimerRunner::start() enters prepare; tick() transitions to running after 5 s - Pause blocked during prepare (discard only) - Custom triple beep every second of the countdown; JS ticker extended to PREPARE Long-press pause gesture: - Hold anywhere in the ring area for 1.5 s to pause (RUNNING/PAUSE/COOLDOWN only) - LONG_PRESS_PAUSE=all|android env flag controls platform scope - Subtle ring dim on hold; ambient "Hold to pause" hint text Other: - Program editor last-phase cooldown field greyed with tooltip - TimerProgram::all() sorts by last_used_at (was created_at) - PHP 8.5 pipe operator in TimerProgram::load() and TimerScreen::syncCursor() - array_first() used in TimerRunner::currentPhase() - 81 tests, all passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Pest could not resolve Tests\TestCase because the namespace was missing from composer.json autoload-dev mappings. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.
No description provided.