11 Commits

Author SHA1 Message Date
clemsail 46eebd0066 feat(blockly): onCodeAssembled transition block (completes D4 puzzle-state branching)
Repo State / repo-state (push) Failing after 34s
Repo State / repo-state (pull_request) Failing after 37s
Validate Zacus refactor / validate (pull_request) Failing after 5m38s
2026-06-14 11:14:31 +02:00
clemsail e3b868cbe1 feat(blockly): real event transitions — onButton/onAudioDone/onUnlock/onSerial/onEspnow/onPuzzleSolved (D4) 2026-06-14 10:08:25 +02:00
clemsail 95f9e4fa98 feat(blockly): real SD media — mediaPlay block -> sound_play{path,board,loop} (D3) 2026-06-14 10:02:13 +02:00
clemsail 3ef4fbda53 feat(blockly): board binding — board field on puzzles + hwOnBoard context, compiled+validated to IR (D2) 2026-06-14 01:33:47 +02:00
clemsail ca80799393 feat(blockly): honest DSL — real vs future-hardware lanes + compile warning (D1)
Repo State / repo-state (push) Failing after 48s
Validate Zacus refactor / validate (pull_request) Failing after 10m22s
Repo State / repo-state (pull_request) Failing after 10m36s
2026-06-14 01:06:36 +02:00
electron 6dd78b3a69 feat(atelier): vagues 3+4 — énigmes manquantes + assemblage code/coffre
Repo State / repo-state (push) Failing after 23s
Repo State / repo-state (pull_request) Failing after 33s
Validate Zacus refactor / validate (pull_request) Successful in 11m37s
Vague 3 (énigmes, catalogue 59→68) : puzzleLED (P2), puzzleRadio (P4),
puzzleMorse (P5), puzzleNFC (P6), puzzleCoffre/keypad (P7), + hwNFCRead.
Types puzzle IR: led, radio, morse, nfc, keypad (validation firmware-miroir).

Vague 4 (catégorie Coffre) : codeAssembly (fragments→code final),
codeFragment (puzzle→positions), coffreVerify. Kinds IR: nfc_read,
code_assembly, code_fragment, coffre_verify.

Le scénario zacus_v3_complete est désormais entièrement exprimable en blocs.

Validé: catalogue 68/68 cohérent, build atelier OK, round-trip gateway +
validation runtime3 (happy path + négatifs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 02:15:05 +02:00
electron a85f39ba9a feat(atelier): vague 2 — blocs « Maître du jeu » (game-master adaptatif)
8 blocs pour la couche adaptative du scénario (catalogue 51→59) :
phase, gmRule (condition→proactive_hint/skip_to_next/add_bonus_puzzle),
npcSetMood, giveHint (niveau), proactiveHint (intervalle), setParcours
(profil→puzzles), scoreBonus (conditionnel), scorePenalty.
gmRule/scoreBonus réutilisent les reporters de la vague 1.
Nouveaux kinds IR: gm_phase, gm_rule, npc_mood, give_hint, proactive_hint,
set_parcours, score_bonus, score_penalty (+ validation runtime3_common).

Validé: catalogue 59/59 cohérent, build atelier OK, round-trip gateway OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 01:57:41 +02:00
electron 4d169bb990 feat(atelier): vague 1 — blocs Scratch opérateurs/expressions + contrôle
Repo State / repo-state (push) Failing after 43s
Ajoute 10 blocs pour rendre les conditions composables (avant: chaînes
opaques tapées à la main) :
- Reporters: opCompare, opBool, opNot, opArith, valVar, valScore,
  valNumber, valText → sérialisés vers la grammaire d'expression existante
  (ex: "score > 5", "(pct >= 60) and (lives > 0)")
- Contrôle: loopRepeat, loopWhile (nouveau kind IR "loop")
- logicIf/sceneBranch acceptent un reporter branché OU le champ texte
  (rétrocompat totale)

Catalogue 41→51 blocs, catégories Opérateurs + Contrôle. Compilateur
gateway (_reporter_to_expr) miroir du serializeReporter() TS. Hub
Blockly régénéré.

Validé: build atelier OK, 18 tests scenario-engine, round-trip
bloc→IR (reporters + loops + rétrocompat).

NB: le kind IR "loop" exige un support firmware runtime3 (à ajouter
dans une passe firmware) ; les conditions sont déjà évaluées par le
firmware existant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 01:41:24 +02:00
Claude Worker claude2 27544fecd1 feat(blocks): scene/puzzle blocks in atelier
Catégorie « Énigmes » dans le catalogue Blockly canonique :
zacus_scene (écran maître title/subtitle/symbol/effect),
zacus_puzzleQR et zacus_puzzleSound. L'export blocks_to_runtime3
les attache au step courant comme objets IR scene/puzzle (pas des
actions), avec clamping/troncature vers les limites strictes du
gateway pour que l'IR émis valide toujours. Copie hub régénérée
via sync_blockly_catalog.sh. 14 tests d'export ajoutés (60 verts).
2026-06-11 03:34:21 +02:00
Claude Worker claude2 089cea409e feat(atelier): Runtime 3 scene toolbox, shared
Repo State / repo-state (push) Failing after 49s
Repo State / repo-state (pull_request) Failing after 1m0s
Validate Zacus refactor / validate (pull_request) Successful in 11m31s
The Atelier exposed a legacy 12-block gameplay-config language whose
export the gateway could not compile (no blocks_studio_version) — and
no start/end blocks. It now speaks the same language as the zacus-hub
native Studio: the 38-block scene catalog (sceneStart/sceneEnd, npcSay
voice lines, HW/ESP-NOW/M5/PLIP, logic) lives once in
@zacus/shared/blockly; the hub copy is GENERATED via
tools/dev/sync_blockly_catalog.sh.

- Export/import rewritten to blocks_studio_version: 2 (flat nodes,
  next pointers, logicIf slots) via shared blocks-doc.ts — what
  POST /v1/flash compiles to Runtime 3 IR, and what the hub Studio
  reads/writes (full interop).
- « Zacus dit » gains voice (voice-bridge voice_ref), emotion and rate
  fields; the compiler forwards them as optional tts_say fields
  (omitted at defaults, backward compatible).
- Editor validation now mirrors compiler rules: missing sceneStart,
  duplicate scene ids, unknown goto targets, empty voice lines.

Verified: tsc clean, vite build green, v2->IR round-trip OK
(entry STEP_intro, tts_say{voice_ref,emotion,rate}).
2026-06-10 11:35:24 +02:00
L'électron rare 3babe2b3ab feat(apps): zacus-hub SwiftUI hub (macOS + iOS)
New multiplatform SwiftUI app under apps/zacus-hub/ generated via
XcodeGen (project.yml). Three modes share a HubSession actor that
talks to tools/zacus-gateway over Tailscale-only HTTP/WS.

Game-master: live state stream (WebSocket /v1/state/ws), backend
health badges, hint trigger, journal.

Companion: push-to-talk via AVAudioRecorder (M4A AAC 16 kHz),
fallback file picker, hint request, transcript via voice-bridge
proxy.

Studio: YAML editor with validate/save (existing /v1/studio
routes), plus a Scratch tab hosting a Blockly + zelos-renderer
workspace in WKWebView. 38 custom Zacus block types across 10
categories (Scènes, NPC, Audio, LCD, Hardware ESP32, ESP-NOW,
BOX-3, M5, PLIP, Logique), .sb3 export/import via JSZip (procedure
calls + embedded YAML for lossless round-trip), Flasher sheet that
calls /v1/flash/{board} with auto/hot/cold strategies and shows
per-board step results including the cold-flash idf.py command.

ATS exception domains cover the Tailscale CGNAT range plus the
electron-server / studio / macm1 hostnames so the WebView and
URLSession can hit plain HTTP on the tailnet without TLS.

Token stays in the Keychain (cc.saillant.zacus.hub) — never
committed to source.
2026-05-24 10:51:26 +02:00