--- name: daily-board description: "Today's salon board: appointments, gaps, and confirmation flags" domain: operations --- # daily-board Today's salon board: appointments, gaps, and confirmation flags. ## Description Builds a structured daily board from scheduling data showing: - **Appointments** — time, client, service, staff, status - **Gaps** — unbooked slots ≥30 minutes between appointments - **Confirmation flags** — appointments that still need client confirmation - **Summary** — total booked time, gap time, appointment count All data is labeled with its source. When using fixtures, output is clearly marked `📋 FIXTURE DATA` so the owner never sees silent fake live data. ## Data sources | Source | Status | Label in output | |--------|--------|-----------------| | Fixtures (JSON) | ✅ Implemented | `📋 FIXTURE DATA` | | Vagaro | Not yet | `📅 LIVE DATA` (future) | | Square | Not yet | `📅 LIVE DATA` (future) | ## Constraints - Deterministic facts from fixtures; no model inference for board data. - No silent send or publish. - Cancelled appointments are excluded from the board view. - Gaps under 30 minutes are not shown (too short for a meaningful slot). - Output always labels fixture/offline — never silent fake live data. ## Usage ### CLI ```bash # Build board from fixtures (default demo data) python skills/daily-board/scripts/build_board.py # Build board for a specific fixture file python skills/daily-board/scripts/build_board.py \ --fixtures data/fixtures/scheduling/claire_bennett_2026-07-28.json # Output as JSON python skills/daily-board/scripts/build_board.py --format json # Specify date and salon name explicitly python skills/daily-board/scripts/build_board.py \ --date 2026-07-28 --salon "Lumina Hair Studio & Spa" ``` ### Programmatic ```python from lumina_skills.providers.scheduling.fixture_provider import load_fixtures from lumina_skills.board_builder import build_board, format_board_text appointments = load_fixtures("data/fixtures/scheduling/claire_bennett_2026-07-28.json") board = build_board(appointments, date="2026-07-28", salon_name="Lumina Hair Studio & Spa") print(format_board_text(board)) ``` ## Output format ### Text (default) Structured text with sections for appointments, gaps, confirmation flags, and summary. ### JSON ```json { "date": "2026-07-28", "salon_name": "Lumina Hair Studio & Spa", "source": "fixtures", "is_offline": true, "appointments": [...], "gaps": [...], "needs_confirmation": [...], "total_booked_minutes": 420, "total_gap_minutes": 120 } ``` ## Design references - Use case: [A1 — Morning / day board](../../design/use-cases.md) - Scenario: [S8 — Morning board on WhatsApp](../../design/scenarios.md) - Deterministic boundary: [design/det-vs-inf.md](../../design/det-vs-inf.md)