Files
scrying-pool/_bmad-output/planning-artifacts/prds/prd-video-view-manager-2026-05-19/.decision-log.md
T
uberwald 7a0d935239 Story 5.2: Video Widget Width Customization
Implements configurable video widget widths for small and large dock layouts:
- Add widgetWidthSm and widgetWidthMd world settings (defaults: 83px, 150px)
- Add width dropdown selectors in Director's Board UI
- Apply width settings to participant avatars via CSS custom properties
- Update strip width/height calculations to use custom widths
- Add localization strings for widget width settings
- Add CSS styling for widget width dropdown controls
- Fix Handlebars template syntax for select element selected values

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-05-25 12:57:24 +02:00

235 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Decision Log — Video View Manager PRD
**Workspace:** `_bmad-output/planning-artifacts/prds/prd-video-view-manager-2026-05-19/`
**Created:** 2026-05-19
**Author:** Morr
**Last Updated:** 2026-05-26
---
## Decisions
### D-1 — PRD scope: full vision with roadmap
**Date:** 2026-05-19
**Decision:** PRD covers full product vision across all 3 priority tiers. v1.0 = Day 1 + Week 12 features (FR-1 through FR-26). Later-tier features are documented in §10 as a roadmap, not as FRs.
**Rationale:** User selected "Full vision PRD" during working mode selection.
**Status:** Captured in §10 Product Roadmap. **UPDATED:** Expanded to include FR-27 through FR-32 from live testing.
### D-2 — WebRTC track disabling preferred
**Date:** 2026-05-19
**Decision:** Real WebRTC track disabling is the preferred visibility implementation. CSS/DOM cosmetic hiding is the fallback. The choice is surfaced at runtime via a module config flag.
**Rationale:** User selected "Real WebRTC track disabling preferred" during working mode selection.
**Status:** Captured in FR-7. OQ-1 is the open research question to confirm feasibility.
### D-3 — FoundryVTT v14 minimum; no v13 backport
**Date:** 2026-05-19
**Decision:** Module targets FoundryVTT v14+ exclusively. No v13 compatibility.
**Rationale:** User selected "v14 only" during working mode selection.
**Status:** Captured in §5 Non-Goals and §6 MVP Scope.
### D-4 — Public community release (Foundry Hub)
**Date:** 2026-05-19
**Decision:** Module is intended for public listing on Foundry Hub / FoundryVTT package repository. PRD rigor calibrated to medium stakes (public community release).
**Rationale:** User selected "Public FoundryVTT module release" during stakes calibration.
**Status:** Informs Success Metrics (SM-1, SM-2) and Cross-Cutting NFRs (compatibility, privacy).
### D-5 — Progressive Enhancement Architecture as structural principle
**Date:** 2026-05-19
**Decision:** The module's UI and feature set is organized around 3 levels: Level 1 (right-click, zero new UI), Level 2 (Director's Board popout), Level 3 (Scene Presets + automation). Features are additive; Level 1 alone is a shippable product.
**Rationale:** From brainstorming SCAMPER-E result (#13). Confirmed as the structural model for §4 Features.
**Status:** Captured in feature descriptions for §4.1, §4.2, §4.3.
### D-6 — Seating chart metaphor for Director's Board
**Date:** 2026-05-19
**Decision:** The Director's Board uses a spatial seating chart layout, not a list or grid of raw settings.
**Rationale:** From brainstorming SCAMPER-S insight. Reinforced by Role Playing Persona 4 (Alex).
**Status:** Captured in FR-10.
### D-7 — Reaction Cam is opt-in at the player level
**Date:** 2026-05-19
**Decision:** Any automation that auto-spotlights a player's face (Reaction Cam, Combat Cinematics Mode) requires explicit player opt-in (or alternatively opt-out via Privacy Panel). The opt-out flag (FR-24) is included in v1.0 even though the Reaction Cam itself is a Later feature.
**Rationale:** Privacy tension between Marcus (GM) and Sofia (player) resolved in Role Playing phase: "Reaction cam opt-in resolved the Marcus/Sofia privacy tension elegantly."
**Status:** Captured in FR-24. Opt-out scaffolding ships in v1.0 to avoid a breaking change when Reaction Cam is released.
### D-8 — i18n string keys in v1.0; English strings only at ship
**Date:** 2026-05-19
**Decision:** All UI strings are externalized to i18n key files in v1.0 (enabling community translation contributions), but only English strings ship at the initial release.
**Rationale:** Standard FoundryVTT module convention. Community translation is a common contribution pattern in the ecosystem.
**Status:** Captured in §6.1 MVP Scope.
### D-9 — Native FoundryVTT socket API for state broadcast
**Date:** 2026-05-19
**Decision:** Visibility Matrix changes are broadcast via the native FoundryVTT socket API using a registered module event name. `socketlib` will not be added as a dependency.
**Rationale:** User confirmed: "Native Foundry socket API."
**Status:** Captured in FR-2 and §9 Assumptions Index. OQ-2 closed.
### D-10 — WebRTC track disable feasibility deferred to API inspection
**Date:** 2026-05-19
**Decision:** Whether real WebRTC track disabling is feasible will be determined by inspecting the FoundryVTT v14 AV API during development. CSS/DOM cosmetic hiding remains the safe default until confirmed.
**Rationale:** User confirmed: "Not sure, to be checked with the API itself." OQ-1 remains open but is unblocking — CSS fallback ships regardless.
**Status:** OQ-1 downgraded from hard phase blocker to development-time research item. FR-7 unchanged.
### D-11 — GM sees all activated feeds; own self-view is configurable
**Date:** 2026-05-19
**Decision:** The GM always sees all activated player webcams. The GM's own feed visibility in their own view is a configurable module setting ("Show my own feed to myself", default ON).
**Rationale:** User answer to OQ-3: "All activated webcam of players + himself as an option."
**Status:** Captured in FR-6. OQ-3 closed.
### D-12 — Native WebRTC only for v1.0; non-native AV backends deferred
**Date:** 2026-05-19
**Decision:** Only FoundryVTT's native WebRTC AV backend is supported in v1.0. Jitsi Meeting Server and other backends are not in scope.
**Rationale:** User answer to OQ-4: "Not planned in first steps, maybe later."
**Status:** Captured in §5 Non-Goals. OQ-4 closed; deferred to Later roadmap.
### D-13 — Reaction Cam / automation effects are opt-in (not opt-out)
**Date:** 2026-05-19
**Decision:** Any automation feature that auto-spotlights or visually modifies a player's feed requires explicit player opt-in. Default state is OFF.
**Rationale:** Reconciliation found the PRD had silently inverted the brainstorming's model. User confirmed opt-in is correct.
**Status:** FR-24, FR-25, and §4.5 description updated.
### D-14 — Director's Board supports both setup and live-monitor modes
**Date:** 2026-05-19
**Decision:** The Director's Board is valid as a pre-session setup tool and as a live monitor kept open during play. Both modes are explicitly supported.
**Rationale:** User confirmed both modes valid.
**Status:** FR-9 updated.
### D-15 — GM override guarantee as cross-cutting rule
**Date:** 2026-05-19
**Decision:** Every automation feature must expose a one-click GM override. Director's Board "Hide All" is the universal panic path.
**Rationale:** From brainstorming "panic button" + Marcus persona. Elevated to cross-cutting design rule.
**Status:** Added to Cross-Cutting NFRs.
---
## Live Testing Decisions (May 20-25, 2026)
### D-16 — Full AV Dock Replacement
**Date:** 2026-05-20
**Decision:** Replace FoundryVTT's native AV dock completely with custom ScryingPoolStrip and RoleRenderer components rather than hooking into the native dock.
**Rationale:** Live testing revealed limitations in hooking approach; full replacement provides better control over rendering, layout, and participant management. Enables consistent behavior across all AV states.
**Status:** Implemented in FR-27, FR-28. Captured in §4.6 Full AV Dock Replacement.
**Trade-offs:**
- PRO: Full control over UI/UX, consistent behavior, easier to extend
- PRO: Enables dock layout system and position persistence
- CON: Must handle all edge cases that native dock handles
- CON: Potential compatibility issues with other AV-related modules
### D-17 — Dock Layout System
**Date:** 2026-05-22
**Decision:** Implement configurable dock layouts with 6 options: vertical-sm, vertical-md, horizontal-sm, horizontal-md, mosaic-sm, mosaic-md.
**Rationale:** User feedback from live testing requested flexibility in how participant tiles are arranged to match different table setups and screen configurations. GM controls direction/size at world level; individual users can override size preference.
**Status:** Implemented in FR-29, FR-30. Captured in §4.7 Dock Layout System.
**Implementation Notes:**
- World-scoped `dockLayout` setting controls direction and canonical size
- Client-scoped `dockLayoutExpanded` setting allows per-user override ('' = inherit, 'sm' = small, 'md' = large)
- Director's Board includes visual selector for layout configuration
- Legacy boolean values automatically migrated to string format
### D-18 — Position Persistence
**Date:** 2026-05-24
**Decision:** ScryingPoolStrip window position persists across sessions using GM user flags.
**Rationale:** User feedback indicated frustration with repositioning the dock every session. Position persistence improves UX consistency.
**Status:** Implemented in FR-31. Captured in §4.8 Position Persistence.
**Implementation Notes:**
- Position (left, top) saved to GM user flags on move
- Loaded on module initialization via `_loadPosition()` method
- First-time users get default position
### D-19 — ApplicationV2 API Migration
**Date:** 2026-05-20
**Decision:** Migrate all UI components to use FoundryVTT v14 ApplicationV2 API with HandlebarsApplicationMixin.
**Rationale:** FoundryVTT v14 requires ApplicationV2 for proper window management, resizing, and lifecycle. Previous implementation had compatibility issues.
**Status:** Implemented in FR-32. Captured in §4.9 Implementation Quality.
**Implementation Notes:**
- ScryingPoolStrip extends HandlebarsApplicationMixin(ApplicationV2)
- DirectorsBoard extends HandlebarsApplicationMixin(ApplicationV2)
- Fixed jQuery parameter handling in _onRender methods
- Added proper PARTS and DEFAULT_OPTIONS static properties
### D-20 — PortraitFallbackHandler Integration
**Date:** 2026-05-23
**Decision:** Enhance portrait fallback system with dedicated PortraitFallbackHandler component for consistent image resolution.
**Rationale:** Live testing revealed inconsistent fallback behavior. Dedicated handler provides clear priority chain and better integration with custom portraits.
**Status:** Implemented in FR-8 enhancement, FR-26. Captured in Glossary and §4.1.
**Implementation Notes:**
- Priority chain: custom fallback portrait -> user.avatar -> user.character?.img -> mystery-man
- Integrated with RoleRenderer for participant list building
- Handled in buildParticipantList function
### D-21 — CSS Build Pipeline
**Date:** 2026-05-24
**Decision:** Add postinstall script to automatically build CSS from LESS source files.
**Rationale:** Streamlines development and distribution; ensures styles are always up-to-date.
**Status:** Implementation note in §6.1 MVP Scope.
**Implementation Notes:**
- Added postinstall script to package.json
- Moved styles to root styles/ folder for FoundryVTT compatibility
- Updated .gitignore to allow dist/styles/ for CSS distribution
### D-22 — Video Widget Width Customization (v0.1.1)
**Date:** 2026-05-26
**Decision:** Add configurable width options for small and large video tiles via dropdown selection in Director's Board.
**Rationale:** User feedback requested ability to customize video widget size to match screen space and table preferences. Extends the existing Dock Layout System (D-17) by adding granular control over tile dimensions.
**Status:** Planned for v0.1.1. Captured in FR-33, FR-34.
**Implementation Notes:**
- Two world-scoped settings: `widgetWidthSm` (default: 80px) and `widgetWidthMd` (default: 120px)
- Dropdown options: 60px, 80px, 100px, 120px, 150px, 200px
- Dropdown UI in Director's Board settings panel
- Applies to all dock layout variants (vertical, horizontal, mosaic)
- Independent of layout direction
- OnChange callback triggers strip re-render for all users
---
## Decision Summary Table
| Decision | Date | Status | Related FRs | Section |
|----------|------|--------|-------------|---------|
| D-1 | 2026-05-19 | Active | FR-1-34 | §1, §6, §10 |
| D-2 | 2026-05-19 | Active | FR-7 | §4.1, §9 |
| D-3 | 2026-05-19 | Active | All | §5, §6 |
| D-4 | 2026-05-19 | Active | All | §7, Cross-cutting |
| D-5 | 2026-05-19 | Active | FR-1-26 | §4 |
| D-6 | 2026-05-19 | Active | FR-10 | §4.2 |
| D-7 | 2026-05-19 | Active | FR-24 | §4.5 |
| D-8 | 2026-05-19 | Active | All | §6.1 |
| D-9 | 2026-05-19 | Active | FR-2 | §4.1, §9 |
| D-10 | 2026-05-19 | Active | FR-7 | §4.1, §8 |
| D-11 | 2026-05-19 | Active | FR-6 | §4.1, §9 |
| D-12 | 2026-05-19 | Active | All | §5 |
| D-13 | 2026-05-19 | Active | FR-24, FR-25 | §4.5 |
| D-14 | 2026-05-19 | Active | FR-9 | §4.2 |
| D-15 | 2026-05-19 | Active | All automation | Cross-cutting |
| **D-16** | **2026-05-20** | **Active** | **FR-27, FR-28** | **§4.6** |
| **D-17** | **2026-05-22** | **Active** | **FR-29, FR-30** | **§4.7** |
| **D-18** | **2026-05-24** | **Active** | **FR-31** | **§4.8** |
| **D-19** | **2026-05-20** | **Active** | **FR-32** | **§4.9** |
| **D-20** | **2026-05-23** | **Active** | **FR-8, FR-26** | **§4.1, §4.5** |
| **D-21** | **2026-05-24** | **Active** | **N/A** | **§6.1** |
| **D-22** | **2026-05-26** | **Planned** | **FR-33, FR-34** | **§4.7.5** |
---
## Open Questions Status
| OQ | Phase Blocker? | Status | Related Decisions |
|---|---|---|---|
| OQ-1: WebRTC track disable API access | No | Open — to be checked against v14 API during development; CSS fallback is safe default | D-2, D-10 |
| OQ-2: socketlib vs native socket API | No | **RESOLVED** — native FoundryVTT socket API | D-9 |
| OQ-3: GM own-feed hidden behavior | No | **RESOLVED** — GM always sees all activated feeds; own self-view is configurable | D-11 |
| OQ-4: Non-native AV backend support | No | **RESOLVED** — native WebRTC only for v1.0 | D-12 |
| OQ-5: Scene hook timing | No | Open — not a concern for first implementation stage | |
| OQ-6: Partial vs full preset application | No | Open — to be resolved during FR-15/FR-16 implementation | |
| **OQ-7: Full AV replacement edge cases** | **No** | **Open** — Does full AV dock replacement handle all edge cases? | **D-16** |
| **OQ-8: Widget width defaults** | **No** | **Open** — Optimal default width values for small (80px) and large (120px)? | **D-22** |
---
## PRD Version History
| Version | Date | Status | Author | Changes |
|---------|------|--------|--------|---------|
| 1.0 | 2026-05-19 | final | Morr | Initial PRD with FR-1 through FR-26 |
| **1.1** | **2026-05-25** | **draft** | **Morr** | **Added FR-27 through FR-32 from live testing; updated D-1, added D-16 through D-21** |
| **1.2** | **2026-05-26** | **draft** | **Morr** | **Added FR-33 through FR-34 for v0.1.1 (Video Widget Width Customization); added D-22, OQ-8** |