15f6a6c713
Add operator health checks (make doctor) wrapping platform CLIs, and the fixtures-only daily board skill library with unit tests (make verify).
96 lines
2.8 KiB
Markdown
96 lines
2.8 KiB
Markdown
---
|
|
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)
|