Repository navigation
Sources: move guest role and dropout options into input rows (#590) - #844
Conversation
|
Combined local review package is now built: beta-2026-10-09-review8cf80f4, source 8cf80f4 on codex/operator-review-20261009. It combines #842/#843/#844 with the installed grading/framer work; individual PRs remain focused. Combined evidence: 4,065 managed tests pass (1,620 WinUI, 2,361 MediaCore, 84 Control); nine self-contained real-XAML operator checks; nine native/grading checks; runtime probe; archive validator covering 854 files; ZIP/installer hashes and source manifest verified. Native source is unchanged from 34b0afc and reused native binary hashes match that package. Installer and REVIEW.md are saved locally in operator-ux-587/artifacts/releases/beta-2026-10-09-review8cf80f4. This package was not installed or published. Installed navigation/status/support export, OHG opt-in/configuration and source persistence acceptance remain open; physical display/frame-delivery qualification is not claimed. Short installed review is separate from the weekend meeting bake. |
…ead them (#852) * docs(plan): mac parity batch implementation plan Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(parity): correct the audit — the Mac is fenced BELOW parity, not over budget The unmerged 2026-09-27 re-audit (888c45c) never landed, so origin/main still carried the 2026-08-07 doc describing a product ~940 commits stale. Worse, two of the re-audit's own claims had since gone wrong: §5.1 read the Zoom-source ceiling as a missing guard a Mac operator could exceed, when the core-side 1080P cap (ZoomSubscriptionResolutionPolicy.h:94) already reaches Mac and the core deliberately fences Mac OUT of that tier (h:71-72) — the gap runs under-parity, not over-budget. §5.2 (recording-folder resolution) was left an open question; checked now, AppModel.swift:2334 computes it absolutely at send time, so the Windows T2.8 bug class cannot occur and it closes as a non-gap. Starts from the 888c45c text, applies both corrections with file:line evidence, reclassifies T3.5 (tiles colour pickers) as N/A-until-Tiles (Mac has no Tiles wall surface to put pickers on), adds §8 covering the 2026-09-27 -> 10-09 window (150 commits; mac-shell untouched save for #823 diagnostics; 7 open feature PRs touch zero mac-shell files), and replaces §7 with this batch's task list so Tasks 2-5 have a correct spec to cite. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(mac): budget-ordered, camera-on, capped spine subscriptions The wire kind stays 'video' (the core's 720P fence) and the wire purpose stays 'program' (purpose is subscription identity for kind 'video'); this lands the ordering/filter/cap machinery the 1080P flip needs. Camera-off sources no longer hold video subscriptions, so a hasVideo flip now re-pushes the spine — without that, a camera turned on after assignment never re-subscribes (the Windows 2026-08-09 frozen-tile defect, mirrored). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(mac): flip spine wire to kind participant-video, real purposes Completes the 1080P flip on the Mac spine wire, built atop Task 2's budget-ordered subscriptions (ZoomSourceBudget). spineSubscriptionPayloads now emits kind "participant-video" (the tiered kind the core already fences at 720P for the legacy "video" kind) and entry.purpose instead of the fenced "video"/"program" pair. Why this is safe to flip now: - E3: the core's 1080P concurrency cap (kMaxConcurrentFullResolutionCameras = 8) already reaches Mac and is granted in payload (budget) order — this task activates it for Mac cameras instead of leaving them fenced below parity. - E4: the core deliberately fenced Mac at 720P via kind "video"; moving to "participant-video" is the documented unfence path, not a bypass of any rule. - E5/camera-on filter: ZoomSourceBudget (Task 2) already orders/caps/filters to camera-on sources before this payload is built, so participant-video's "no videoOn check" engine behavior is covered upstream. - E6: participant-video's engine identity ("participant-video-<pid>-camera") excludes purpose, so varying purpose per entry no longer churns warmed subscriptions — this is what makes entry.purpose safe to send verbatim. Native header touch is comments-only (two blocks, ~L71-74 and ~L100-102) describing the new Mac wire shape; no constant or logic changed (kMaxConcurrentFullResolutionCameras, wantsFullResolution, and requestedResolution are untouched). TDD: edited testSpineSubscriptionWireShape to the new contract first (RED: 2 failures on kind/purpose), flipped the two literals in spineSubscriptionPayloads (GREEN: 2272/2272 shell checks, self-check PASS). Native stub build (cmake+ninja, mirroring CI's native-stub-macos job): 1412/1412 tests, ContractParity 11/11, ctest 100%. Mutation testing (revert kind; hardcode purpose) each reds exactly the targeted assertion and both were reverted before this commit. Step 6 (LIVE ACCEPTANCE — owner meeting, >=3 cameras, Diagnostics/churn/ toggle/soak checks) is PENDING, deferred to the controller/owner per this batch's task split. This commit does not claim it. Full evidence: .superpowers/sdd/2026-10-09-mac-parity-batch/task-3-report.md Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(mac): per-source dropout policy — surface, persistence, wire The §4.1 core half of dropout policy (set-source-policy, #535 slice 4a) shipped and already reaches the Mac spine sync, but the Mac shell had no operator control and nothing persisted it. Windows is moving the same control into its input rows right now (PR #844); this adds the matching SlotRow control on Mac. AppModel.ShowInputSlot gains dropoutPolicy (""=unset, core default "hold" applies). AppModel.sourcePolicyCommands(slots:) is zoom-only (a non-zoom sourceId pushes a sticky scene-validation warning on every sync — the expensive regression the test guards), ordinal-sorted by sourceId for determinism, and keep-first deduped so two slots holding the same participant can't race the core. An explicit "hold" is always sent (PRESENT-OR-KEEP: only an explicit value can overwrite a stored "black"). appendSourcePolicies appends after the scene commands already in a batch, since load-scene-graph clears the core's scene-validation warnings and a policy sent before it would have any refusal silently wiped. Persistence mirrors chromaKeys/capturePairings: PersistedSlotPolicy is keyed by slot (zoom pids churn across meetings; the slot is the stable operator concept), with all four ShellPrefs additive-safety touch points (property, CodingKeys case via synthesis, decodeIfPresent, and a populated roundTripSelfCheck value) so an older prefs file still loads cleanly. SlotRow gets a borderless Menu (Hold last frame / Black) on zoom-assigned slots only, styled with the existing Studio.field/Studio.border/.grotesk(11) row idiom used by the capture audio-pairing menu beside it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(mac): ISO-armed-with-capture-off loud warning (T5) ISO writers open lazily at their first frame, so a never-fed source leaves no downstream warning. Warn when ISOs are armed and capture is OFF (observed or intent). Intent OFF is itself a fact the shell owns; nil observation with intent ON is unobserved and does not warn. Parity with Windows T3.7 (E11). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(parity): mark Tasks 2-5 SHIPPED with commit SHAs Mark §5.1 (budget-ordered capped spine subscriptions, 1080P flip) and §4.1 (dropout policy) and T3.7 (ISO-armed-with-capture-off warning) as SHIPPED in the task list, with branch commit SHAs and pending PR status. Record Task 3's live-acceptance pending status plainly. Gate: mac-shell release build, 2290 shell checks passed, self-check and design lint green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(mac): close out final whole-branch review findings (F1-F9) Doc layer still described the pre-branch product after Tasks 2-5 shipped. Fixes the final review's full findings list: - F1: docs/mac-parity-plan.md §4.1/§4.2/§5.1/§6 — add CLOSED-on-this-branch banners with commit SHAs, convert CURRENT-tense gap claims to past tense, mark the ZoomSubscriptionResolutionPolicy.h header quote as superseded by deb2689e, and split §6's "Verified directly" so the dropout-policy absence and 1080P kind fence read as verified-then-closed rather than still-current. - F2: ZoomSourceBudget.swift header — drop the stale "fenced at kind video / until the flip task" framing (the flip shipped in deb2689e); state the current wire (participant-video + real purpose, budget order) and cite ZoomSourceSetPolicy.cs + ZoomEngineRuntime.cpp:435-470. - F3: add a docs/BACKLOG.md row for the 1080P flip's live acceptance soak (plan Task 3 Step 6), and reference it from §7's PENDING line. - F4: restore the dropped index-1 priority assertion in testSpineSubscriptionWireShape. - F5/F7: give the intent-ON/observed-OFF ISO preflight branch its own copy ("re-arm Capture" instead of the wrong "Turn Capture on"), and move the IsoCapturePreflight enum below RecordingCommandPolicy so the file's header comment documents the right declaration again. - F6: guard the slotDropoutPolicies prefs restore on slot kind == "zoom". - F8: wrap the AppModel.swift:2446 call site to the file's column style. - F9: reword the displayName follow-up note to point at the real blocker (Metal slate text, TODO(4a-metal-text) in MetalCompositorAdapter.mm:1209). Verified: swift build -c release clean; COREVIDEO_SHELL_TESTS=1 2292/0; COREVIDEO_SHELL_SELFCHECK=1 PASS; scripts/lint-mac-design.sh clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs(parity): note the #837-#849 queue merged post-audit; rebase verified no contract drift The audit's §8 described the Windows feature queue as open; it merged to main overnight. The rebase over it hit zero conflicts, touched no mac-shell file, and left the three core contracts this branch's wire depends on unchanged (verified by diff: set-source-policy, participant-video tiering, subscribedVideoFeeds). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: John Wallace <jwallace@Johns-MacBook-Pro.local> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Addresses #590.
Zoom guests currently have Role and On dropout controls in a duplicate feed-health panel below the input inspector. Move those controls into a guest Options flyout beside each Zoom source picker, remove the duplicate health panel, and give capture devices the available full width. Existing inspector Format/Rec/status data and production commands/storage remain unchanged.
An open flyout captures its editor and guest identity. Reassignment or container recycling rejects stale edits; initial selection does not write preferences. Unavailable guests retain editable saved dropout policy while role assignment waits for their return.
Validation: Release WinUI build; all 1,607 WinUI tests; six real-XAML probe checks, including stale-target rejection and the compiled ten-row Zoom/capture/media template at 900/1,100-pixel widths. The visible-control audit and acceptance limits are in docs/qa/sources-controls-2026-10-09.md.
Draft pending packaged real-source/keyboard review and restart persistence acceptance. No sustained media qualification is claimed.