15f6a6c713
Add operator health checks (make doctor) wrapping platform CLIs, and the fixtures-only daily board skill library with unit tests (make verify).
2.8 KiB
2.8 KiB
name, description, domain
| name | description | domain |
|---|---|---|
| daily-board | Today's salon board: appointments, gaps, and confirmation flags | 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
# 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
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
{
"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
- Scenario: S8 — Morning board on WhatsApp
- Deterministic boundary: design/det-vs-inf.md