docs/v1-audit.md

V1 completion and verification audit

This audit answers #83: how much of v1 is built, and how much of it has been tested, on one fixed revision. It is a snapshot taken on 6 November 2026. It owns no fact of its own. Release scope owns what v1 is, the acceptance ledger owns acceptance results, known limitations owns limitations, and GitHub Issues own the work. When this page and one of those owners disagree later, the owner is right.

Audited revision

ItemValue
App revisionmain at 6edff137, the merge of #304
Engine pinvendor/paneru at ee896478 (engine ee89647) on branch miri/v0.5.2 of samanyudas/paneru
Same code asa5853509. The three later commits change only docs, issue templates, and the command guard tests.
Tested artifactMiri Developer.app built from 6edff137 with make build, signed with Miri Developer Local Signing, engine source ee896478
Release artifactNone. No GitHub release, release disk image, or Homebrew cask exists.
macOS27.0.1 (26A434)
HardwareMacBook Air, Apple M3 (Mac15,12), built-in display 2048 x 1332 and a 2560 x 1440 external display as the main display, side by side

Evidence gathered on this revision:

  • Automated tests. CI run 42036549784 on 6edff137 passed every job on attempt 2. Attempt 1 failed one engine test, slice_photos::a_press_while_a_revealed_photo_waits_never_shows_its_window_beside_it. The previous commit 3668b75a has the same engine code and passed, so this test is flaky.
  • Lifecycle model check. make verify-engine-lifecycle exited 0 on 6edff137. All seven rules hold in 196 states, all three mutants break as expected, and the covered code is unchanged since sync commit f9d4ab38.
  • Native run. verify-miri run 20261106-090237 drove the tested artifact with synthetic key presses and Accessibility presses on the hardware above. It is an automated native observation, not a hand check, and its files stay on Sam's Mac in ~/.cache/miri/verify-miri/runs/. The results are in Observed on the audited revision.

Status words

Each requirement below gets the furthest status that has evidence. The statuses are separate kinds of evidence, and a later one does not imply an earlier one.

StatusMeaning on this page
Not builtNo code on 6edff137 does it.
Partly builtSome of the requirement is on 6edff137, and a named part is missing.
MergedThe code is on main at 6edff137. Every built item on this page is merged, because the audit reads main only.
Automatically testedA Swift Testing suite, an engine test, or a selftest covers it and passed in CI on 6edff137, or the lifecycle model check (TLA) covers it. CI does not run the model check. It passed when run locally on 6edff137.
Natively testedA verify-miri run or a selftest drove Miri Developer on Sam's desktop with synthetic input. The column names the revision.
Hand checkedSam used real input on real hardware, or Sam physically changed displays, the lid, or sleep. The column names the revision.
Hardware acceptedA check in the acceptance ledger passed on a frozen release candidate.
PublishedA signed, notarized release is available to the public.

On 6edff137, no requirement is hardware accepted, because no release candidate is frozen and every ledger check is Pending. No requirement is published, because Miri has no release. Every native and hand check below ran on an older revision than 6edff137, except the native run of 6 November 2026. An older result is stale when code it covers changed afterwards. The notes say so where PROGRESS.md or an issue records such a change.

Summary

The denominator is the 98 requirements in the requirement map. Each one is an accepted rule from release scope, split as the map shows, plus #302, which Sam accepted into v1 on 5 November 2026. A requirement counts as complete for a status only when the whole requirement reached it. Counted on 6edff137 with a script that reads the map's tables:

Status reachedRequirements
Built and merged84 of 98
Partly built6 of 98
Not built8 of 98
Automatically tested82 of 98
Natively tested or hand checked on some revision66 of 98
Natively tested on 6edff1376 of 98, and one of them, LAY-3, failed
Hardware accepted0 of 98
Published0 of 98

The automatically tested count includes 3 partly built requirements whose built part has tests. The native and hand count includes results on old revisions, so it says what was ever seen, not what holds now.

The acceptance ledger has 105 checks: S-1 to S-7, 70 app checks, and 28 multi-monitor checks. 0 of 105 pass, because none has run on a frozen release candidate. 0 of 3 required full runs have passed.

Feature work and release readiness are separate:

  • Features. Most accepted window-management behavior is built and automatically tested. The gaps are new-window width (#305), the swipe target and its setting (#212), the login item state (#201), Karabiner-Elements and Hyper key support (#302), and undoing macOS tiling after a drop on another display (#123).
  • Release. None of the signing, notarization, update, or Homebrew work exists (#82), no release candidate is frozen, and no acceptance or endurance check has passed.

Requirement map

Columns:

  • Built is Built, Partly, or Not built.
  • Tests names the automated coverage, or None.
  • Latest native or hand evidence names the newest observation on real hardware, its kind, and its revision. Native means natively tested with synthetic input, and Hand means hand checked by Sam.
  • Checks are the acceptance ledger rows that verify the requirement.

Abbreviations: SC is Sources/MiriCore, SM is Sources/Miri, E is vendor/paneru/src, T is Tests/MiriCoreTests, ET is vendor/paneru/src/tests, and TLA is the lifecycle model check.

App controls and window recovery

IDRequirementBuiltTestsLatest native or hand evidenceChecks
APP-1Start and Stop in the menu and Settings, and a Stop shortcutBuilt: SM/AppModel.swift, SM/Views.swiftTLANative, 6edff137, run 20261106-090237: ⌃⌥Q stopped, Start startedAL-1 to AL-3
APP-2Permission guidanceBuilt: SC/SetupChecker.swift, SM/InitialSetup.swiftSetupCheckerTestsNone with a grant. The CI permission selftest on e516edd ran without one and left attribution unresolvedAP-1, AP-2
APP-3Gap and width preset settingsBuilt: LayoutSettingsConfigurationTestsNative, gap stepper on the #228 branch, 1 Nov, branch commit not recorded. Width presets: noneAC-1
APP-4Shortcut editingBuilt: SM/ShortcutsSettings.swift, SM/ShortcutRecorder.swiftShortcutsTestsNative, c4ba432e, run 20261105-160539AS-1, AS-13, AS-14
APP-5Access to logsBuilt: AppModel.showLogsInFinderRotatingLogTestsNative, #220 branch on e8d69276, 2 NovAU-3
APP-6Closing Settings keeps management runningBuiltNoneNoneAL-1
APP-7Stop pauses, and Quit stops the app and the engineBuilt: AppModel.stop, prepareToQuitTLA, EngineTestsNative, Stop on 6edff137. Quit on 4c30e66b, run 20261102-165439AL-2, AL-3
APP-8Every managed window stays reachable after Stop, Quit, or an engine failureBuilt: SC/WindowRecovery.swift, E/parent_watch.rsWindowRecoveryTests, EngineTests, recovery selftestNative, 6edff137: after Stop, all 12 windows lay inside the two displays. Which windows were off screen before the Stop was not recorded. Recovery selftest on e120875c, 4 NovAW-1 to AW-6

Privacy and diagnostics

IDRequirementBuiltTestsLatest native or hand evidenceChecks
PRV-1No telemetry or window data leaves the MacBuilt: no network code in Sources or the engineNoneNoneAU-4
PRV-2Copy Diagnostics with a preview, covering versions, displays, permission, engine status, and redacted logsBuilt: SM/Views.swift DiagnosticsView, SC/Diagnostics.swiftDiagnosticsReportTestsNoneAU-3
PRV-3Titles, paths, user names, and raw configuration excludedBuilt: Redactor.redactRedactorTestsNoneAU-5

Default shortcuts and layout

IDRequirementBuiltTestsLatest native or hand evidenceChecks
LAY-1Default shortcuts follow the keybinding referenceBuilt: SC/Bindings.swiftBindingsTestsNative, c4ba432e, run 20261105-160539AS-4
LAY-2Presets [0.25, 0.33, 0.5, 0.66, 0.75] and 8-point gapsBuilt: MiriSettingsConfigurationTestsNative, fresh install on the #92 branch, 26 Oct, branch commit not recorded, before the version 5 defaultsAC-7
LAY-3New windows start at 50% of display widthNot built. Miri writes no width ruleNoneNative, 6edff137: a 380-point window tiled at 388 points on a 2560-point displayAS-5, #305
LAY-4Existing windows keep their widthsBuiltET/session_restore.rsNative, 4c30e66b, #153, 2 NovAS-5
LAY-5Width and height change by five percentage points per pressBuilt: window_resize_stepET/tiling.rsNative, 4c30e66b, #153, 2 NovAS-6
LAY-6Shortcuts and the recorder work with non-US layouts, including AZERTY, QWERTZ, and DvorakBuilt: SC/KeyLayout.swift, and AppModel restarts the engine when the layout changesShortcutsTests, BindingsTests on US, French, German, and Dvorak layoutsHand, a327d90 with engine 28f550f, 27 Oct, #31: on AZERTY, ⌃⌥ with the number-row 1 and 2 keys focused the first and second columns, and ⌃⌥0 equalized a stack. QWERTZ and Dvorak have no press resultAS-2

Startup and crash recovery

IDRequirementBuiltTestsLatest native or hand evidenceChecks
REC-1Management starts once Accessibility is grantedBuilt: AppModel.launch, pollSetupUntilReadyTLANative, make check on e120875c, 4 Nov. Attribution unresolvedAP-2
REC-2A Stop persists across launchesBuilt: managementStoppedTLANative, 6edff137: relaunch started no engine and showed StoppedAL-2
REC-3Launch at login, on by defaultPartly: on by default, but Settings does not show the login item's stateNoneNoneAL-4, #201
REC-4The engine restarts after an isolated crash and restores the layoutBuilt: EngineSupervisor.exitedEngineTests, ET/session_restore.rsNative, 6edff137: after kill -9, a new engine ran within 2 s, restore matched 12 windows, fixture frames unchangedAL-5, HQ-7, HR-1
REC-5Three crashes in five minutes stop retries and show the failure, logs, and RestartBuilt: CrashPolicyEngineTestsNative, #220 branch on e8d69276, 2 NovAL-6, HR-2
REC-6A successful manual restart resets the crash countBuilt: restartManuallyEngineTestsNative, 929a2c10, run 20261104-171657AL-7
REC-7A floating rule beats a saved tiled placement, except a window tiled with the float toggle (#15, #93)Built: E/ecs/tile_overrides.rsET/session_restore.rsNative, #93: an engine restart kept the override on engine e7036de (same tree as 6325638), and Calculator stayed tiled across a Miri restart on engine ae05362, both with synthetic inputNone

Setup and conflicts

IDRequirementBuiltTestsLatest native or hand evidenceChecks
SET-1Refuse to start while a competing window manager runs, name it, and leave its configuration aloneBuilt for Paneru, AeroSpace, Amethyst, and yabaiSetupCheckerTestsNative, c4ba432e, yabai stand-in, run 20261105-160539AP-4
SET-2Refuse while Displays have separate Spaces is off, and explain the log outBuiltSetupCheckerTestsNoneAP-5
SET-3Report Stage Manager, the three macOS tiling options, and gesture conflicts, without blockingBuiltSetupCheckerTestsNative, gesture advice on e120875c, 4 Nov. Tiling, 23 Oct, revision not recorded. Stage Manager: noneAP-6
SET-4Link to System Settings and never change macOS settingsBuilt: read-only SetupProbeNoneNative, as SET-3AP-6
SET-5An unreadable setting shows Not checked, never passedBuiltSetupCheckerTestsNoneAP-7

Configuration

IDRequirementBuiltTestsLatest native or hand evidenceChecks
CFG-1Separate configuration and process identities, and standalone Paneru's files untouchedBuilt: EnginePaths.environmentConfigurationTestsNoneAC-6
CFG-2Valid changes apply at once and persist, including external editsBuilt: ConfigurationStore, ConfigurationWatcherConfigurationTestsNative, external edit for #26, 26 Oct, engine 03a7420, app revision not recordedAC-1 to AC-3
CFG-3Invalid TOML keeps the last valid settings and shows the error and its lineBuiltConfigurationTestsNative, #221 branch on e8d69276, 2 NovAC-4
CFG-4A write failure is reported, and the last valid settings stayBuilt: .unwritableBindingsTestsNoneAC-5
CFG-5Upgrades back up the file first and keep user valuesPartly: a backup is made only when the default shortcut version changes or on ResetBindingsTests, ShortcutsTestsNative, version 4 to 5 migration of Sam's file on 554a4fc9, run 20261104-225455AC-8
CFG-6A migration that cannot keep user values leaves the file and shows an errorBuilt for shortcut migrationBindingsTestsNoneAC-9

Supported platforms

IDRequirementBuiltTestsLatest native or hand evidenceChecks
PLT-1macOS 27 or later on Apple siliconBuilt: Package.swift, scripts/build-app.shscripts/check-compat.pyEvery native run, on macOS 27None

Multiple monitors

IDRequirementBuiltTestsLatest native or hand evidenceChecks
MON-1One strip per display and native Space, with independent order, focus, and scrollBuiltET/display.rs, ET/mission_control.rsHand, 0b596031: a swipe on each display moved only its strip, 3 NovHQ-2, HA-5
MON-2Native fullscreen windows stay unmanaged and return to their columnBuilt: E/ecs/workspace.rsET/interaction.rs native_fullscreen_transition_removes_window_from_original_strip_without_focus_markerNoneHD-7
MON-3A swipe moves the strip under the pointer by defaultNot built. The engine moves the active display's stripNoneNone. Sam's swipes on 0b596031 on 3 Nov did not separate the pointer's display from the active displayS-1, #212
MON-4A setting chooses the focused window's strip insteadNot builtNoneNoneS-1, #212
MON-5Keyboard commands act on the focused stripBuiltEngine testsNative, c4ba432e, 5 NovAS-4
MON-6Virtual workspaces off, with their commands and indicator hiddenBuiltConfigurationTestsNoneAS-12
MON-7Horizontal and vertical arrangementsBuiltET/display.rs, ET/side_by_side.rsNative, c356ad7a, run 20261103-021450: 20 of 20 arrangement steps. External display below the laptop: noneHA-1 to HA-3, HQ-1
MON-8Mixed arrangements on three displaysBuilt in the engineEngine testsNone. Needs a friend's three-display MacHA-1 to HA-6 on that Mac
MON-9Directional monitor focus and move, and nothing moves toward a side with no displayBuiltBindingsTests, ET/display.rsNative, 554a4fc9 and c4ba432e, 4 NovHM-1 to HM-3, HQ-3
MON-10Focus and Move column cross to a touching display at the strip's end (#104)BuiltET/column_moves.rsNative, c4ba432e, 4 Nov. Sam's side-by-side hand check is openHQ-3
MON-11Off-screen windows stay on their own displayBuilt: E/ecs/shared_edge.rsET/side_by_side.rsNative, c356ad7a, 3 NovHQ-1, HA-4

Display changes

IDRequirementBuiltTestsLatest native or hand evidenceChecks
DSP-1On disconnect, strips follow their Space and keep their orderBuiltET/reconnect.rsHand, cable unplug, 28 Oct, engine e1705af, app revision not recordedHQ-4, HD-1
DSP-2On reconnect, each window returns to its display, column, and stack, and unmoved windows keep their placeBuilt: E/ecs/display_homes.rsET/reconnect.rsHand, one cable replug on c356ad7a, 3 Nov. #265 is not reproducedHQ-4, HD-1
DSP-3The same for lid close and openBuiltET/reconnect.rsHand, lid cycle with a stack on 37abded6, engine 200109e, 5 NovHQ-5, HD-2
DSP-4The same for sleep and wakeBuiltNoneHand, one sleep and wake, 16 of 16 windows, on fabf16d4, engine 589b44b, 1 Nov. #144 changed this path on 5 NovHQ-6, HD-3
DSP-5A strip that cannot re-attach floats its windowsBuiltET/reconnect.rsNoneNone
DSP-6Display rearrangement, main display, resolution, and fullscreen changes keep every window reachableBuiltET/reconnect.rsNative, Arrange sheet drags on d77f8d46, 3 Nov: 1 failure in 36, accepted as a limitationHD-4 to HD-7

Strip gestures

IDRequirementBuiltTestsLatest native or hand evidenceChecks
GES-1Three fingers, four fingers, or Off, and five fingers unavailableBuilt: StripGestureGestureTestsNative, e120875c, 4 NovAG-1
GES-2Initial setup recommends four fingers and enables it only when verifiedBuilt: SM/InitialSetup.swiftGestureTestsNative, 050bac63, 1 Nov. Hand, Sam's four-finger test, 1 NovAG-2, AG-3
GES-3The strip follows the fingers, with a saved setting to reverse itBuiltConfigurationTestsHand, four-finger swipes on two displays on 0b596031, 3 Nov. Reverse: noneAG-4, AG-5
GES-4A confirmed conflict turns the swipe off and shows steps, and never changes macOSBuiltGestureTestsNative, 050bac63, 1 NovAG-7, AG-12
GES-5Unable to verify offers a gesture test, and only movement plus confirmation counts as Verified by user testBuilt: SM/GestureTest.swiftGestureTestsHand, Sam's three-finger test, 1 Nov, revision not recordedAG-8, AG-9, AG-11
GES-6The result survives restarts and is invalidated by finger, direction, macOS, engine, or macOS gesture changes, or a user reportBuilt: GestureState.evaluateGestureTestsNoneAG-10, AG-13 to AG-15
GES-7Keyboard management continues while the swipe is OffBuiltNoneNoneAG-6, AG-16

Settling after a swipe

IDRequirementBuiltTestsLatest native or hand evidenceChecks
STL-1The strip settles on the column nearest the centre, counting momentum, and focuses itBuilt: E/ecs/scroll.rsET/settling.rsNative, Option-scroll stand-in, run 20261103-022523, 3 Nov, app revision not recorded. No real trackpad settling is recordedS-3
STL-2No empty space past an end, a stack lands on its last-used window, and a strip that fits resistsBuiltET/settling.rsNoneS-3
STL-3Modifier-scroll with a mouse wheel settles after a pauseBuiltET/settling.rsNative, run 20261103-022523, 3 Nov, app revision not recordedS-3

V1 interactions

IDRequirementBuiltTestsLatest native or hand evidenceChecks
INT-1Fixed-size windows and Miri's Settings floatBuiltET/tiling.rs, ConfigurationTestsNative, d67550a with engine 3bdae94, the final #93 pass. #249 and #250 changed new-window handling on 5 NovAS-7
INT-2Picture-in-Picture windows float above others, take focus once, stay on their display, and the player returns to its placeBuiltET/tiling.rsNative, a5853509 with engine ee89647, runs 20261105-220252 and 20261105-222020. Hand, Sam's drags on engine 972a001, the same tree as ee89647AS-7
INT-3Focus moves the strip only as far as needed, and Centre column still centresBuiltET/settling.rsNative, focus moves on 38b851c8, 2 Nov. The distance moved was not measuredS-2, AS-8
INT-4The layout reserves the visible DockBuiltET/maximize.rsNative, Dock changes for #215, 1 Nov, engine 8b585cc, app revision not recordedAS-9
INT-5Reduce Motion or the animation setting makes movement instantBuiltConfigurationTests, ET/settling.rsNoneAS-10, AS-11
INT-6A keyboard slide is an exponential ease-out that retargets from the remaining distance (#278)Built: ease_out_factorET animation testsNot recorded. #280 reports a first-frame jump and is ready for an agent to reproduce on current mainNone
INT-7Numbered jumps focus the stack's last-focused windowBuiltET column jump testsNative, c4ba432e, run 20261105-160539AS-4
INT-8The pointer alone does not change focus, and commands do not move the pointer (#90)Built: engine defaultsET focus testsNative, engine 8fa68be. Hand, 4798e5c with engine d4340b7, for closing windows (#90)None
INT-9⌃⌥⌘ with arrows, HJKL, and WASD, and Shift to moveBuiltBindingsTestsNative, 48b104e, #79, 31 Oct. #279 and #104 changed key handling on 4 NovAS-4
INT-10Karabiner-Elements shortcuts work, and the recorder records a Hyper key chord (#302)Partly: four-modifier chords parse, and nothing has run with Karabiner-ElementsBindingsTestsNoneNone

Stacks

IDRequirementBuiltTestsLatest native or hand evidenceChecks
STK-1Equal heights on membership change, set heights kept, and no overlap while windows fitBuilt: E/ecs/layout.rsET/stacks.rsNative, 0d878f80, #124, 2 NovS-4
STK-2Width rules for windows that cannot grow or shrink (#93)BuiltET/stacks.rsNative, 3710a40 with engine 4216682, synthetic keys. #93 also records a hand check by Sam, revision not recordedNone
STK-3An overflowing stack overlaps only below each top bar, and the focused window comes forwardBuiltET/stacks.rs, ET/focus.rsNative, 0d878f80, 2 Nov. Sam's hand check is openS-5
STK-4Stack limit: default 5, never above what fits, Stack past it starts a column, and lowering it keeps existing stacksBuilt: StackLimit, Layout pickerConfigurationTests, ET/stacks.rsNative, the 34f2f6d tree with engine f831216, 24 Oct, and stack_limit = "fit" on fd16a22 with engine 1fd95b1, 27 Oct. Sam's hand check is openS-7

Dragging windows

IDRequirementBuiltTestsLatest native or hand evidenceChecks
DRG-1A title-bar drag moves only that window, on its display or another, to the target under the pointer (#43, #203)Built: E/ecs/drag.rsET/drag.rsHand, Sam's trackpad drags, 5 of 5, 1 Nov, engine ffe0673S-6
DRG-2Insertion lines, refusal with a not-allowed symbol, and the window returnsBuiltET/drag.rsHand, 31 Oct, engine 5e90388S-6
DRG-3Edge holds scroll the strip, including over a column cut off at a shared edge (#205)BuiltET/drag.rsNative, synthetic drags, 31 Oct, revision not recordedS-6
DRG-4Floating windows never join the layout by dragBuiltET/drag testsNot recordedS-6
DRG-5If macOS tiles a dropped window, the engine returns it to its placePartly: a drop on another display that macOS tiles is not undone (#123). Sam kept this case in v1 on 6 November 2026ET/drag testsNot recordedS-6

Maximizing a window

IDRequirementBuiltTestsLatest native or hand evidenceChecks
MAX-1⌃⌥F and a title-bar double-click toggle a display-wide column that fills the usable area, and restore returns its width (#88, #106)Built: E/ecs/maximize.rsET/maximize.rsNative, fd16a22, engine 1fd95b1, 27 OctAS-15
MAX-2A stacked window pops out on the side the setting chooses and returns on restoreBuiltConfigurationTests, ET/maximize.rsNative, branch on engine 3fee523, 27 OctAS-16
MAX-3A window_fullwidth binding works as the maximize toggleBuiltShortcutsTestsNative, branch on engine 3fee523, 27 OctAS-17
MAX-4Width, stack, float, edge drag, and drop rules for a maximized windowBuiltET/maximize/restore_first.rsNative, fd16a22 with engine 1fd95b1, 27 Oct, #88AS-15
MAX-5A display move keeps it maximized (#87)BuiltET/maximize.rs, ET/column_moves.rsNative, #87, 1 Nov, engine 8b585cc, app revision not recordedHR-3
MAX-6The session restores it maximized after an engine restartBuiltET/maximize/session.rsNative, one display and no stack, engine 3fee523, 27 OctHR-3

System access and licence

IDRequirementBuiltTestsLatest native or hand evidenceChecks
SYS-1Accessibility permission only, with SIP onBuiltSetupCheckerTestsNative, e120875c, 4 Nov. Attribution on a Developer ID build is unresolvedAP-1, AP-2
SYS-2Screen Recording only for the opt-in shared-edge switch, off by defaultBuilt: SC/ScreenRecording.swiftScreenRecordingTests, ET/slice_photos.rsHand, 29 and 30 Oct, #150, revision not recordedNone
SYS-3Each undocumented API has an assessment and a fallbackPartly: the review against the pinned engine is openNoneNoneNone
SYS-4Distributed source and licence notices follow GPL-3.0-or-later and keep Paneru's MIT noticesPartly: LICENSE exists, and no release exists to checkNoneNoneAR-3

Signing, distribution, and updates

These rows are part of the denominator. Packaging, distribution, and endurance reports them in detail.

IDRequirementBuiltTestsLatest native or hand evidenceChecks
DST-1A disk image signed with Developer IDNot builtNoneNoneAR-1
DST-2Notarized by AppleNot builtNoneNoneAR-1
DST-3Sparkle updates that also deliver engine upgradesNot builtNoneNoneAU-2
DST-4A daily check that asks before installing, and an optional silent install at startupNot builtNoneNoneAU-1, AU-2
DST-5A Homebrew caskNot builtNoneNoneAR-2
DST-6Development builds as Miri Developer with their own bundle IDs and local signingBuilt: scripts/build-app.shscripts/check-compat.pyEvery native runNone

Observed on the audited revision

verify-miri run 20261106-090237 on 6 November 2026 drove the tested artifact on the hardware above. Each line is an automated native observation with synthetic input. None of them passes a ledger check, because none ran on a frozen release candidate.

StepResult
Open three resizable AXFixture windows, 380 points wideEach tiled at 388 points on a 2560-point display. LAY-3 expects 1280 points. Filed as #305.
Press ⌃⌥QThe status read Stopped, managementStopped was 1, and the engine exited 0.8 s after the press.
Read every window frame while stoppedAll 12 windows lay inside the two displays.
Relaunch while stoppedNo engine started, and Settings showed Stopped.
Press Start Window ManagementThe status read Managing windows, and managementStopped was 0.
kill -9 the engine with Settings openA new engine started 1.8 s later under the same app, the session restore matched 12 windows, and all three fixture frames were unchanged.
V endSam's build relaunched, and the layout check found all 9 of Sam's windows where they were at the start.

The 6 November run did not drive Restart, the crash limit, Quit, setup checks, or shortcut editing. Run 20261105-160539 on c4ba432e drove all of them except Quit. The app code for the lifecycle, setup checks, and shortcut editing is unchanged from c4ba432e to 6edff137, and only the engine pin moved.

Partial behavior, missing checks, known failures, and stale evidence

Known failures

  • New windows keep their own width instead of 50% (#305, observed on 6edff137).
  • A drop on another display that macOS then tiles stays tiled (#123). Sam kept this case in v1 on 6 November 2026, so it is a gap in v1, not a deferral.
  • One Arrange sheet drag in 36 moved System Settings into the other display's strip. Sam accepted it as a limitation when #103 closed.
  • The engine test slice_photos::a_press_while_a_revealed_photo_waits_never_shows_its_window_beside_it is flaky in CI.

Reports not reproduced

#78, #122, #166, #177, #210, #265, and #280 are open without a reproduction on a current build.

Checks with no evidence on any revision

AP-3, AP-4 for tools other than the four detected, AP-5, AP-7, AL-1, AL-4, AW-1, AW-2 with windows known to be off screen, AW-6, AC-2, AC-5, AC-6, AS-5 as a pass, AS-10, AS-12, AG-16, AU-1, AU-2, AU-4, AU-5, AR-1 to AR-3, HA-3, HD-1 to HD-3 at their required counts, HD-5 to HD-7, HR-1, HE-1, and HE-2.

Stale evidence and records

  • Every native and hand result in the map, except the 6 November run, predates a5853509. Later changes touched key handling (#279 and #104, 4 Nov), startup focus (#248, 4 Nov), stack rejoining across Spaces (#144, 5 Nov), and new-window tiling (#249 and #250, 5 Nov).
  • Known limitations still names main at fabf16d4 and engine 589b44b as its baseline. It lists the Mission Control drag as a confirmed defect, but #143 closed with a verified fix on 3 November. It lists swipe lag as a confirmed defect, but #66 closed as not planned on 5 November, after Sam could no longer reproduce it. It lists the 8-point drag gap as a confirmed defect, but #122 did not reproduce on 6edff137.
  • Design tree status says it was reconciled with main at e516edd on 20 October.
  • #302 moved Hyper key recording into v1 on 5 November, but release scope, the keybinding reference, the v2 roadmap, design tree status, and the v1 specification still defer it to v2.
  • #278 is still open, although Sam decided it and #282 is merged.
  • These closed issues left acceptance boxes unticked, or their closing comments name a hand check that is still open: #42, #43, #44, #106, #159, #183, #199, #205, and #219.

Remaining blockers

Owners come from issue comments and PROGRESS.md. No issue has an assignee.

BlockerNext concrete actionOwner
Apple Developer Program enrollmentEnroll, so Developer ID signing and notarization can startSam
#82 signing, notarization, Sparkle, release disk image, Homebrew caskSplit it into child tasks, with the steps that need Sam's Apple account labelled ready-for-humanAgent to split, Sam for account steps
Accessibility attribution on a Developer ID buildGrant permission to the first signed, notarized build and check both the app and the engineSam
#305 new windows at 50% widthTriage, then build the engine rule for newly created windows onlySam to triage, then agent
#212 swipe under the pointer and its settingTriage, then build the engine target, the configuration key, and the Settings controlSam to triage, then agent
#201 launch at login stateBuild the login item state in Settings, then check a log out and log inAgent to build, Sam to log out and in
#302 Karabiner-Elements and Hyper keyUpdate the five decision documents, then run the manual checks with Karabiner-ElementsAgent for documents, Sam for the manual checks
#104 display crossingHand check side by side, then closeSam
S-5 and S-7 stack overflow and limitHand check on the frozen candidateSam
Real trackpad gestures and settling, S-1, S-3, AG-4Run with a real trackpad on the frozen candidateSam
Release candidateFreeze a candidate after the items above, then run the app and multi-monitor checklists 3 times in a rowAgent for app checks, Sam for hardware checks
Memory-stability rule for HE-1Define a measurable pass ruleUnknown
Endurance HE-1 and HE-2, and Q6See Packaging, distribution, and enduranceSam
Configuration keys, validation ranges, and private API fallbacksReview them against the pinned engine, as design tree status listsAgent
#123 a drop on another display that macOS tiles is not undone. Sam kept it in v1 on 6 November 2026. Whether it blocks the release is not decidedSam chose on 6 November 2026 that the window stays where the drop put it, which #310 records in release scope, and accepted the criteria on #123. Reproduce it on current main, which likely needs a hand drag, because synthetic title-bar drags did not move a window on 6edff137 (#122). Then fix it from undo_for in E/ecs/drag.rs, which skips drops on another display, with an engine test, and verifySam for the hand reproduction, then agent
Flaky engine testMake the slice photo test deterministicAgent

Packaging, distribution, and endurance

These requirements gate a public release, not feature completion.

RequirementState on 6edff137Evidence
Development disk imagemake package builds a development disk image of Miri Developer.appCI run 42036549784, job "Build, selftest, and package on macOS 27"
Release disk image, signed with Developer IDNot built. scripts/build-app.sh signs with the local identity or ad hocNo notarytool or stapler call in scripts/
NotarizationNot builtAs above
Sparkle updates and the update policyNot builtNo Sparkle code in Sources/ or Package.swift
Homebrew caskNot builtNo cask file in the repository
Release bundle IDsPartly: the engine has a release Info.plist, and no script builds the release appvendor/paneru/assets/Info.plist
Distributed source and licence noticesNot checked, because no release existsAR-3
8-hour session with two displays, stable engine memoryNot run, and no memory-stability rule existsHE-1
2-week daily use at both locations without a lost window or repeated crashesNot started. A bug that loses windows restarts the periodHE-2
3 consecutive full checklist runs on the release candidate0 of 3Acceptance ledger

Q6

Release scope describes one 2-week daily-use period across both locations. The multi-monitor checklist requires 3 consecutive full runs, and each full run includes that 2-week period, which implies 6 weeks. Q6 asks how the two combine. On 15 October 2026, Sam deferred Q6 to the final check before publishing v1, as design tree status and the v1 specification record. Until then, both requirements stay as written. This audit keeps Q6 deferred, and nothing on this page depends on its answer.

The 17 feedback requests

#77 to #93 came from 17 points of feedback, one issue per point. Their own text puts 13 in v1, of which 10 are release blockers, and 4 in v2. #83 is this audit.

IssueRelease in the issueIn accepted v1 scopeState
#77 Picture-in-Picturev1 blockerYes, V1 interactionsClosed
#78 Interaction delaysv1, not a blockerNot in release scopeOpen, not reproduced
#79 Arrow, HJKL, and WASDv1 blockerYes, V1 interactionsClosed
#80 Reveal overflow stacksv2NoOpen
#81 First-run tourv2No, the tutorial is deferredOpen
#82 Release deliveryv1 blockerYes, Signing, distribution, and updatesOpen
#83 This auditv1, not a blockerNot a product requirementOpen
#84 Stack creation and resetv2NoOpen
#85 Missing windowsv1 blockerNot a separate ruleClosed
#86 Liquid Glass drag feedbackv2NoOpen
#87 Maximized windows across displaysv1 blockerYes, Maximizing a windowClosed
#88 Double-click to maximizev1 blockerYes, Maximizing a windowClosed
#89 One strip per display and Spacev1 blockerYes, Multiple monitorsClosed
#90 Focus independent of the pointerv1 blockerYes, V1 interactionsClosed
#91 Limitations inventoryv1, not a blockerNot a product requirementClosed
#92 Bracket directionsv1 blockerYes, through the keybinding referenceClosed
#93 Constrained window sizesv1 blockerYes, StacksClosed