27 Commits

Author SHA1 Message Date
clement abdb6bec2c gamebook: allow GAMEBOOK_OUT_DIR override
Repo State / repo-state (pull_request) Failing after 55s
Validate Zacus refactor / validate (pull_request) Failing after 5m47s
Repo State / repo-state (push) Failing after 37s
Validate Zacus refactor / validate (push) Failing after 5m44s
2026-06-20 10:47:54 +02:00
clement 41c574b1c5 feat(gamebook): PLIP phone audio pack + bump fw
Repo State / repo-state (pull_request) Failing after 44s
Validate Zacus refactor / validate (pull_request) Failing after 6m28s
Validate Zacus refactor / validate (push) Failing after 5m57s
Repo State / repo-state (push) Failing after 13m53s
Build the phone audio gamebook pack (narration WAVs with spoken numbered
choices + a story menu WAV + per-book JSON + library.json) and stage it
on the PLIP SD. Bumps ESP32_ZACUS for the PLIP audio gamebook and the
master full-height scrolling nav.
2026-06-19 23:58:09 +02:00
clement 05c4c11c0b feat: gamebook authoring + demo + bump fw
Repo State / repo-state (pull_request) Failing after 35s
Repo State / repo-state (push) Failing after 40s
Validate Zacus refactor / validate (pull_request) Failing after 5m58s
Validate Zacus refactor / validate (push) Failing after 7m16s
Context:
The new firmware gamebook mode needs a book on the Freenove SD, plus a
reusable way to author one. We also want a playable demo to prove the
whole chain (button -> navigation -> WAV narration from SD -> screen).

Approach:
Author the book in a human-friendly YAML; a generator renders each
passage's narration with macOS say (16 kHz mono, canonical WAV — the
Apple FLLR chunk is stripped so the firmware parser decodes it),
emits a compact gamebook.json, and stages WAVs + JSON onto the master
SD via POST /game/file?path=sd/gamebook/.

Changes:
- game/gamebooks/zacus_demo.yaml: a branching mini-adventure (the
  Professeur Zacus lab) — 8 passages, 3 endings.
- tools/gamebook/build_gamebook.py: reusable/idempotent generator
  (--book/--ip/--sd-dir/--dry-run); ASCII-folds on-screen text (fonts
  have no accents) while the WAV keeps the accented narration; choices
  carry label + goto (navigation is generic, D-pad + click).
- .gitignore: ignore the generated WAV pack (tools/gamebook/build/).
- Bump ESP32_ZACUS to the gamebook-mode firmware.

Impact:
Authors can write a gamebook in YAML and stage it to the Freenove in
one command; the bundled demo plays end to end, fully offline.
2026-06-19 14:31:50 +02:00
clement e73db8800c feat(tts): PLIP SD voice-pack generator + bump fw
Repo State / repo-state (pull_request) Failing after 55s
Validate Zacus refactor / validate (pull_request) Failing after 6m2s
Validate Zacus refactor / validate (push) Failing after 6m7s
Repo State / repo-state (push) Failing after 13m24s
Pre-render directory greetings + scene hints with macOS say (16 kHz
mono FR) and stage them on the PLIP microSD via POST /game/file — gives
the phone local voice content with no model in RAM. Reusable/idempotent
(tools/tts/generate_plip_sd_pack.py). Bumps ESP32_ZACUS for the SD write
path. Generated WAVs gitignored (reproducible).
2026-06-18 17:43:08 +02:00
clement b05264aafe feat(atelier): barre de menu — ouvrir/charger/enregistrer/partager un scénario
Repo State / repo-state (push) Failing after 41s
Repo State / repo-state (pull_request) Failing after 6m58s
Validate Zacus refactor / validate (pull_request) Successful in 11m13s
Ajoute une barre de menu en haut de l'Atelier :
- Ouvrir : menu déroulant de 3 scénarios de départ embarqués (format
  blocks_studio v2) — intro+énigme sonore, maître du jeu adaptatif,
  énigmes→coffre.
- Charger / Enregistrer : import depuis / export vers un fichier .yaml local.
- Partager : publie le scénario sur la gateway et copie un lien court ?s= ;
  useShareLink réimporte automatiquement le scénario au chargement du lien.

Gateway : endpoints publics sans token POST/GET /v1/share (taille plafonnée,
YAML validé), adossés à un store fichier (share-store/).

Corrige aussi l'inlining de VITE_GATEWAY_BASE_URL : accès statique
import.meta.env pour que le build prod vise la vraie gateway
(zacus.saillant.cc/api) — ce qui répare au passage le DeployPanel en prod.
Le build web prod utilise désormais un mode Vite dédié `webdeploy`
(.env.webdeploy) pour ne pas polluer le bundle desktop.

Ajoute ops/deploy-frontend.sh (typecheck → build → tar-over-ssh → reload →
vérif du hash live), le déploiement n'étant pas scripté jusqu'ici.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 12:53:57 +02:00
Claude Worker claude2 9e78dd7b6b chore: ignore .worktrees/ 2026-06-10 22:52:22 +02:00
L'électron rare 695b7f770b security: gitignore + .env.example + boot warns
Problem: the LITELLM master key was committed in plain text across five
files. The .gitignore did not block .env files, leaving the door open
for future accidental commits of real credentials. Admin DELETE on the
voice-bridge cache and the hints engine sessions endpoints fall back to
no-auth when their ADMIN_KEY env is unset, with no warning to operators.

Approach: keep the placeholder default so the LAN-only dev workflow
keeps working without any breaking change, but make every operator
aware of the risk. Added gitignore patterns (.env*, *.secret,
secrets.{yaml,yml,json}, credentials.json, *-secret.*) with a
!.env.example whitelist for the template. Created
tools/macstudio/.env.example documenting the four secrets (master key,
two admin keys, CORS) and recommending ~/.zacus.env as the local store.
Voice-bridge and hints engine now log a boot WARN when the default key
or no admin key is in use. README gained a Security section listing the
LAN-only assumption, the no-auth surfaces, and a four-step
pre-deployment checklist (rotate key, source env, audit Cloudflare
tunnel routes, verify boot logs).

Tradeoffs: chose loud-warning over fail-fast because smoke runs and
tests would otherwise need the real key wired before they can boot at
all; loud warnings surface the issue without breaking dev. Did not
rewrite git history to scrub the placeholder — its value is now
treated as known-public, and any deployment outside the closed LAN
must rotate it before going live.
2026-05-04 00:58:34 +02:00
L'électron rare 7336da9da8 feat(macstudio): commit service_down.wav asset 2026-05-03 21:12:31 +02:00
L'électron rare a76a882cf1 feat(macstudio): F5 watchdog + cache + safe wav
- voice-bridge main.py: cache disque indexed by sha256(text+ref+steps), GET /tts/cache/stats + DELETE /tts/cache, GET /tts/service_down, F5 timeout default 8s, default steps 4. - watchdog.sh: crontab */2 keepalive, restarts voice-bridge if pgrep fails. - service_down.wav: hardcoded graceful degradation asset (FR, 6.86s). - generate_npc_pool.py: --backend f5 (calls voice-bridge), manifest with cache_key for server-side cache priming. - tools/CLAUDE.md: documents both backends. - .gitignore: hotline_tts/ pool artefacts (reproducible).
2026-05-03 21:12:12 +02:00
L'électron rare fbaefcdde4 chore: clean up .gitignore
- Replace 60+ individual MP3 lines with globs
- Add NPC generated audio patterns
- Add hotline_tts manifest exception
2026-04-02 08:10:56 +02:00
L'électron rare bd47f94cbf fix: pin Node 22 via .nvmrc, gitignore stale dirs
Local Node 25 breaks vitest/rollup ESM exports.
CI uses Node 22 which works. Pin to 22 for local
dev parity.

- Add .nvmrc pinning Node 22
- Update lockfile (minor dep bumps)
- Gitignore stale local directories
2026-04-02 03:57:20 +02:00
Clément SAILLANT c2fc583bae Refactor scenario validation to support V2 schema and update related tests
- Updated `validate_scenario.py` to handle V2 scenario YAML files, introducing new required keys and validation logic.
- Added support for legacy V1 scenarios with an option to allow migration.
- Modified `run_content_checks.sh` to validate V2 scenarios and associated audio and printables manifests.
2026-03-05 19:29:48 +01:00
Clément SAILLANT 134677fa2f feat(web-ui): big-bang sveltekit + designer perf pass 2026-03-01 15:33:30 +01:00
Clément SAILLANT e2bdd8b66c Add SceneGyrophare effect implementation
- Introduced SceneGyrophareConfig structure for configuration parameters.
- Implemented SceneGyrophare class with methods for creating, destroying, and updating the gyrophare effect.
- Added rendering functions for background, beams, and warning triangle.
- Integrated timer for animation updates based on frame rate.
- Created a log file for ESP32 audio kit boot information.
2026-03-01 11:41:15 +01:00
Clément SAILLANT 520f98d2b9 freenove: publish current story/ui source of truth 2026-02-27 14:48:29 +01:00
Clément SAILLANT e5c37af552 chore: untrack Voicebox.app app bundle 2026-02-24 09:20:45 +01:00
Clément SAILLANT c421b0b102 big refactor 2026-02-24 09:01:36 +01:00
Clément SAILLANT 5dcd820221 feat: Enhance stress test scenarios and add new validation tools
- Refactor scenario handling in run_stress_tests.py to support multiple profiles (standard, combined_la).
- Introduce SCENE_LA_DETECTOR.json for visual feedback in the LA detector.
- Add verify_la_random_generator_test.py to generate random tones and validate LA detection.
- Implement verify_mic_live.py to validate microphone metrics over serial.
- Create verify_story_default_flow.py to check the default story screen flow on Freenove.
2026-02-23 00:54:18 +01:00
Clément SAILLANT 17fee5974e add zeroclaw preflight flow and docs for zacus (#99) 2026-02-21 01:24:48 +01:00
Clément SAILLANT b8323ccc29 Add zacus tooling entrypoint for VS Code tasks 2026-02-15 16:37:57 +01:00
Clément SAILLANT 633bf60bca Add Zacus automation driver 2026-02-15 15:34:06 +01:00
Clément SAILLANT 5cc9787888 chore: ignore local caches 2026-02-15 05:52:23 +01:00
Clément SAILLANT 2965e8cac5 Improve RC live resolver 2026-02-15 05:30:31 +01:00
Clément SAILLANT b5ef09a9d4 Add Zacus test menu implementation with curses and fallback support
- Introduced a terminal test menu for Zacus tooling, allowing users to navigate options using curses or a fallback method.
- Implemented various action handlers for executing content checks, running serial suites, and managing UI links.
- Added support for user confirmation prompts and command execution with subprocess.
- Enhanced error handling for missing dependencies and invalid inputs.
- Included functionality for listing and selecting serial ports dynamically.
2026-02-15 04:56:47 +01:00
Clément SAILLANT 587797cc0e feat(firmware): integrate VSCode WIP 2026-02-14 14:47:28 +01:00
Clément SAILLANT ad061e9047 Fix extraction issue by untracking generated binary assets 2026-02-13 23:15:24 +01:00
Clément SAILLANT 9bdfdc9ba8 chore: normalize gitignore for workspace artifacts 2026-02-12 22:05:37 +01:00