feat(voix): l'émotion en balise, la musique qui se tait, le refus qui compte - #12
Merged
Conversation
… compte Trois choses reprises de l'agent « fullstack-agent » de jaredrhod, après audit de sa pile : les seules qui n'existaient pas déjà ici, et mieux que là-bas. - Les émotions passent par une balise `<<proud>>` glissée dans la réponse parlée plutôt que par un appel d'outil Bash. Le tour de modèle entier que coûtait `omarchy-shell macarchy.jarvis emote` disparaît ; la balise ne sort jamais par la voix, ni dans la bulle, ni dans le journal. Elle est parkée comme n'importe quel aparté : les deux surfaces dessinent l'état du pipeline par-dessus toute émotion tant qu'il travaille, donc une émotion tirée pendant qu'il parle ne serait jamais vue. - La musique se tait pendant qu'il parle et repart au retour à `idle` — pas à `followup`, qui est justement la fenêtre où le micro est ouvert pour une relance. Une fois par réponse, dans on_state_change, le seul entonnoir que toute transition traverse. - Un refus de permission laisse une note dans FAILURES.md, pour que les rêves proposent la rangée d'allowlist qui manque. Lu dans le champ `permission_denials` que le CLI publie lui-même : un `Permission denied` ordinaire, venu d'un outil autorisé qui bute sur un répertoire illisible, n'est pas un trou dans l'allowlist et ne doit rien noter. - Et quand la faute est dans son propre code, il dispatche une mission sur son arbre au lieu de répondre qu'il ne peut pas. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0144GFZfmBcCFEMmQdaz3cAt
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Trois choses reprises de l'agent fullstack-agent de jaredrhod, après audit de sa pile (
ai-memory-vault,backtalk,ai-visualizer,barehands) : les seules qui n'existaient pas déjà ici. Tout le reste — la FSM tracée, les réflexes, le journal, les rêves, le routage de cerveau, le filtre de bruit, l'undo, le doctor, le paquet — était déjà là, et plus abouti.Ce qui change
Les émotions passent par une balise. Le cerveau glisse
<<proud>>dans sa réponse parlée au lieu d'appeleromarchy-shell macarchy.jarvis emoteen outil Bash. Un tour de modèle entier économisé par émotion. La balise ne sort jamais par la voix, ni dans la bulle, ni dans le journal, ni dans la trace.Elle est parkée, pas envoyée : les deux surfaces dessinent l'état du pipeline par-dessus toute émotion tant qu'il travaille (
Service.qmlliemood !== "idle"en premier,touchbar.pyjette une émote horsidle), donc une émotion tirée pendant qu'il parle ne serait jamais vue.mascot_parkexiste exactement pour ça. Le gain de la balise est le coût, pas le timing.La musique se tait pendant qu'il parle et repart au retour à
idle— pas àfollowup, qui est justement la fenêtre où le wake daemon garde le micro ouvert pour une relance. Une fois par réponse, danson_state_change, le seul entonnoir que toute transition traverse.Un refus de permission laisse une note dans
FAILURES.md, pour que les rêves proposent la rangée d'allowlist qui manque. Lu dans le champpermission_denialsque le CLI publie lui-même dans son événementresult— pas en cherchant « permission » dans le corps d'un outil en échec : unPermission deniedordinaire, venu d'un outil autorisé qui bute sur un répertoire illisible, n'est pas un trou dans l'allowlist, et trois fausses notes suffisent à armer un rêve qui réécritLEARNED.md.Et quand la faute est dans son propre code, il dispatche une mission sur son arbre au lieu de répondre qu'il ne peut pas.
Ce qui a été refusé de cette pile
Le coffre Obsidian (
memory/+Journal.qmlle font sans dépendre d'une app GUI), le bus de fichiers.voice_state(l'IPCmacarchy.jarvisporte déjà chaque état), la galerie de quatre visages, la voie ElevenLabs (clé cloud et plan payant contre une âme locale-d'abord), barehands, le son de réflexion (le spritethinkingporte le même signal, en silence), et le wizard d'installation en markdown.Revue
Sept agents ont écrit, puis une passe de revue a sorti six défauts, tous corrigés dans la branche :
followup, dans le micro ouvert ;Permission deniedbanal ;<<Proud>>capitalisé passait au travers et piper lisait les chevrons ;resetressuscitait la carte du panneau et notifiait deux fois — supprimée ;playerctlbloquant sur l'arêtethinking → speaking.Le diff a fondu au passage : une regex, un drapeau global, un bloc dupliqué et une rangée de table en moins.
Vérification
./tests/run→ 420 réussite(s), 0 échec(s) (3 cas neufs : émotion parkée et jamais prononcée, ducking, refus d'allowlist — plus son miroir, lePermission deniedordinaire qui ne doit rien noter)shellcheck -S warning -x bin/jarvis bin/jarvis-fsm.sh bin/jarvis-wake install.sh bootstrap.sh tests/run→ proprepython3 -m pytest -q tests/test_touchbar.py→ 24 passed🤖 Generated with Claude Code
https://claude.ai/code/session_0144GFZfmBcCFEMmQdaz3cAt