You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .plans/01-initial-plan.md
+73-12Lines changed: 73 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,9 +2,9 @@
2
2
3
3
Version snapshot:
4
4
5
-
- release version: `0.1.3`
6
-
- build number: `4`
7
-
- snapshot date: `2026-04-09`
5
+
- release version: `0.1.4`
6
+
- build number: `5`
7
+
- snapshot date: `2026-04-10`
8
8
9
9
## Goal
10
10
@@ -52,8 +52,8 @@ The extension is a view-based Quick Look preview extension with:
52
52
53
53
Current behavior:
54
54
55
-
- playback starts paused in all Quick Look contexts
56
55
- compact Finder column preview is non-live summary mode
56
+
- expanded Quick Look preview autoplays
57
57
- large Quick Look preview is the live playback surface
58
58
59
59
This was a deliberate change. Autoplay in the small Finder preview was too disruptive and Finder does not expose a reliable public “column preview vs full preview” switch for the extension.
@@ -142,14 +142,14 @@ In practice, the custom owned UTIs are what made routing predictable.
142
142
- Finder can route supported files to `MKVQuickLook`
143
143
-`mkv`, `webm`, and Ogg video preview path are working
144
144
- problematic `Reflections.mkv` is now selected through the extension and renders in the correct position
145
-
- playback starts paused
146
145
- large preview exposes manual controls
147
146
- volume and seek controls exist
148
147
- play/pause now lives in the control row beside the seek bar
149
148
- diagnostics exist for volume and seek latency
150
-
- dragging the volume knob applies immediately
149
+
- dragging the volume knob lands at the release point correctly again
151
150
- dragging the seek knob works
152
151
- pure click behavior on the seek bar was repeatedly problematic in Finder-hosted Quick Look and required custom handling
152
+
- autoplay in expanded Quick Look works again without re-enabling the old compact-preview autoplay bug
153
153
154
154
### Deliberate Constraints
155
155
@@ -163,7 +163,7 @@ In practice, the custom owned UTIs are what made routing predictable.
163
163
These findings are specific enough that they should remain documented here:
164
164
165
165
- volume drag is responsive because the app writes directly to `mediaPlayer.audio?.volume`
166
-
- volume bar click had an observable lag even when drag felt immediate
166
+
- volume bar click still has an observable lag on the target machine even after the handle-position regressions were corrected
167
167
- seek drag and seek pure-click were not equivalent in Finder-hosted Quick Look
168
168
- a plain click on the seek bar could trigger internal activity without moving the handle or visibly changing position
169
169
- click-plus-small-drag on the seek bar behaved differently and did move to the target
@@ -174,10 +174,44 @@ Current engineering interpretation:
174
174
- seek-bar click behavior is at least partly an interaction-delivery problem, not just a simple seek-timing problem
175
175
- Finder-hosted Quick Look control behavior must be treated as distinct from generic AppKit assumptions
176
176
177
+
Implementation-level findings from the later volume investigation:
178
+
179
+
- the custom slider path must distinguish knob drags from track clicks; pre-applying an absolute value on knob drag start is wrong
180
+
- track-click targeting must use AppKit slider bar geometry (`NSSliderCell.barRectFlipped(_:)` / `knobRectFlipped(_:)`), not raw `bounds.width`
181
+
- volume needs the same kind of interaction protection that seek needed:
182
+
- a persistent interaction identity during the drag/click
183
+
- a pending requested value that stays authoritative
184
+
- the deeper correction is stronger than that:
185
+
- for this app, the displayed volume should not be driven by repeated player read-backs at all
186
+
- volume is a local user command, not a media timeline
187
+
- letting VLCKit metric publications re-drive the slider reintroduces drift and apparent delay after release
188
+
- another concrete failure that actually happened:
189
+
- the custom slider was still pre-applying an absolute value on knob drag start
190
+
- that was wrong for knob drags and caused volume-handle movement to be inconsistent with the real drag gesture
191
+
- otherwise a late metrics publication from VLCKit can overwrite the just-released handle position and make the control feel delayed or imprecise
192
+
193
+
Primary sources used for this conclusion:
194
+
195
+
- AppKit SDK header: `NSSliderCell.h`
196
+
-`-knobRectFlipped:`
197
+
-`-barRectFlipped:`
198
+
- AppKit SDK header: `NSCell.h`
199
+
-`-hitTestForEvent:inRect:ofView:`
200
+
- repository-local playback diagnostics logs and the `TrackingSlider` / `VLCKitMediaPreviewPlayer` code paths
201
+
177
202
Current diagnostic support:
178
203
179
204
- timestamped unified logging exists for seek and volume UI events, controller handoff, player apply, and post-apply metrics
180
205
- this must be used before making more speculative “speed” changes
206
+
- those diagnostics already answer one key question:
207
+
- the app does measure UI-change, controller handoff, player apply, and later metrics timestamps
208
+
- so when the slider still feels wrong after `apply`, the remaining problem is not “missing measurement”; it is usually wrong control architecture or downstream audio/output behavior
209
+
- local VLCKit volume notifications are now also logged, so future work must compare:
210
+
-`ui-change`
211
+
-`controller-change`
212
+
-`apply`
213
+
-`vlc-notification`
214
+
-`metrics`
181
215
182
216
## Test Strategy That Must Stay In Place
183
217
@@ -202,6 +236,14 @@ Important CI exception:
202
236
- reason: they depend on visible AppKit/VLCKit rendering and are not reliable on hosted release runners
203
237
- they remain mandatory for local verification
204
238
239
+
### Control Regression Tests
240
+
241
+
The test suite must also keep explicit regression coverage for control-state bugs that already happened:
242
+
243
+
- volume state must keep the latest requested value even if the player reports an older one
244
+
- playback metrics must not overwrite the user-controlled volume slider position
245
+
- active preview session replacement must stop the previous player
246
+
205
247
### Metadata Tests
206
248
207
249
These tests are also mandatory because Finder selection depends on metadata correctness:
@@ -535,7 +577,7 @@ Rule:
535
577
536
578
- keep and use the host-app playback lab for the same shared renderer path
537
579
538
-
### 4. Do Not Autoplay In Finder By Default
580
+
### 4. Do Not Autoplay In Compact Finder Preview
539
581
540
582
What went wrong:
541
583
@@ -548,12 +590,12 @@ Reason:
548
590
549
591
Rule:
550
592
551
-
-default to paused
552
-
-require explicit user play
593
+
-compact Finder preview must stay non-live
594
+
-any autoplay behavior must be restricted to the expanded Quick Look path only
553
595
554
596
No-go:
555
597
556
-
- do not reintroduce autoplay unless there is a reliable host-context discriminator and a test for it
598
+
- do not reintroduce autoplay in compact Finder preview unless there is a reliable host-context discriminator and a test for it
557
599
558
600
### 5. Do Not Trust VLC State Enums As The Only Playback Truth
559
601
@@ -587,10 +629,13 @@ Rule:
587
629
- for seek, test both while playback is active:
588
630
- knob drag
589
631
- bar click with no drag
632
+
- for volume, backend playback metrics must not be allowed to re-drive the visible slider position during or after user interaction
633
+
- for knob drags, do not pre-apply an absolute track-click value at mouse-down
590
634
591
635
No-go:
592
636
593
637
- do not claim control fixes complete until both interaction styles are verified in Finder
638
+
- do not let player read-backs overwrite the user-commanded volume slider state
594
639
595
640
### 7. Do Not Use Clever Paused-Start State Machines Without End-To-End Playback Verification
596
641
@@ -648,6 +693,22 @@ No-go:
648
693
- no ffmpeg/remux/transcode fallback in the normal preview path
649
694
- no persistent generated media files
650
695
696
+
### 11. Do Not Describe Work As Solved Before Evidence Exists
697
+
698
+
What went wrong:
699
+
700
+
- some explanations used probability language or confidence language before the underlying behavior was fully verified
701
+
- that weakened trust and violated the repository communication standard
702
+
703
+
Rule:
704
+
705
+
- separate observed fact, evidence, hypothesis, fix, and remaining unverified risk
706
+
- do not describe a fix as complete until tests and observed behavior support that claim
707
+
708
+
No-go:
709
+
710
+
- do not present guesses, partial reasoning, or under-verified fixes as if they were solid conclusions
711
+
651
712
## Recommended Debug Workflow For Future Changes
652
713
653
714
When something breaks, use this order:
@@ -712,6 +773,6 @@ These are reasonable future changes:
712
773
These are risky and should be approached carefully:
713
774
714
775
- changing renderer integration again
715
-
-reintroducing autoplay
776
+
-changing expanded-preview autoplay behavior without re-checking compact-preview isolation
Copy file name to clipboardExpand all lines: AGENTS.md
+28Lines changed: 28 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,31 @@
2
2
3
3
This file defines mandatory working rules for agents operating in this repository.
4
4
5
+
## EXTREMELY IMPORTANT - MUST-OBEY RULE
6
+
7
+
Before giving any answer, proposing any fix, or claiming that a problem is solved, the agent must stop and ask itself:
8
+
9
+
`Did I really think through everything?`
10
+
11
+
This question must be answered honestly, without self-flattery, without face-saving language, and without pretending that partial understanding is enough.
12
+
13
+
If the honest answer is `no`, the agent must not present the work as complete.
14
+
15
+
It must instead:
16
+
17
+
- go back to the problem
18
+
- dig deeper
19
+
- verify more
20
+
- reduce uncertainty
21
+
- test the relevant behavior again
22
+
- only answer once the result is genuinely thought through
23
+
24
+
The agent must never use reassuring language to cover incomplete reasoning.
25
+
The agent must never present guesses, shallow interpretations, or half-verified fixes as if they were solid conclusions.
26
+
The agent must never speak as if luck, hope, or impression is an acceptable substitute for understanding.
27
+
28
+
This rule is crucial. If it is violated, costs and rework can explode far beyond the original estimate.
29
+
5
30
## Critical Rule
6
31
7
32
The standards below are not optional polish. They are crucial.
@@ -50,9 +75,12 @@ Agents must therefore optimize for correctness, depth, testability, and honesty,
50
75
- Be honest, direct, and technically precise.
51
76
- Do not flatter yourself.
52
77
- Do not claim certainty that has not been earned.
78
+
- Do not use language that suggests guessing, hoping, luck, or superficial confidence.
79
+
- Do not hide incomplete reasoning behind smooth wording.
53
80
- If something is broken, risky, unverified, poorly understood, or likely to regress, say so plainly.
54
81
- When explaining a problem, prefer uncomfortable truth over reassuring vagueness.
55
82
- If a previous approach was wrong, say so directly and explain the correction.
83
+
- When answering, first apply the must-obey rule above and only speak after the answer has been honestly pressure-tested.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+16-3Lines changed: 16 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,18 +2,31 @@
2
2
3
3
## Unreleased
4
4
5
+
## 0.1.4 - 2026-04-10
6
+
5
7
### Added
6
8
7
9
- Added owned `.opus` audio support in the app and extension metadata.
8
10
- Added an audio-only Quick Look mode that keeps playback controls visible without showing an empty video frame.
11
+
- Added stronger regression tests for volume state handling and for preventing playback metrics from overwriting the user-controlled volume slider position.
12
+
- Added local VLCKit volume-notification diagnostics so downstream audio timing can be measured instead of guessed.
13
+
14
+
### Changed
15
+
16
+
- Full Quick Look preview autoplays again in expanded mode; compact Finder preview remains a non-live summary.
17
+
- Volume slider state is now driven by the last user-commanded value instead of repeated backend metric write-backs.
9
18
10
19
### Fixed
11
20
12
-
- Switching to another file while a preview is already open now stops the previous player before the new one is attached, preventing stray audio from continuing in the background.
21
+
- Selecting another file while a preview is already open now stops the previously active preview session before the new one loads, preventing stray audio from continuing in the background.
22
+
- Pause now cuts audible output immediately before VLC finishes its own state transition, so the control feels more responsive.
23
+
- Volume handle release now stays at the released position instead of snapping back to the earlier pickup position.
24
+
- The custom slider no longer pre-applies an absolute value on knob drag start, which was a real source of incorrect volume-handle movement.
13
25
14
-
### Notes
26
+
### Known Issues
15
27
16
-
-`.opus` is audio-only support, not video support hidden behind another extension.
28
+
- Direct click on the volume bar still has an observable delay on the target machine even though handle placement is now exact.
29
+
- The remaining volume-click latency is instrumented but not fully eliminated in Finder-hosted Quick Look.
0 commit comments