diff --git a/.gitignore b/.gitignore index 680fd27..cb0f13b 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,7 @@ Thumbs.db # Keeper runtime state (hosted or local run) keeper/data/session.json* keeper/data/*.probe + +# Video production material (script, animated scenes, teleprompter): kept out of the repository +docs/pitch/ +docs/pitch-*.md diff --git a/docs/pitch-handoff.md b/docs/pitch-handoff.md deleted file mode 100644 index 49479bd..0000000 --- a/docs/pitch-handoff.md +++ /dev/null @@ -1,186 +0,0 @@ -# Keystone — Passage de relais pour finir la vidéo de pitch (à lire en premier) - -> **Pour qui :** le Claude de Nathan, qui reprend la production de la vidéo de pitch de 3 minutes de Grégoire à zéro contexte. **Tout ce qu'il faut est dans ce dépôt public** (`https://github.com/Lagouze/keystone`, branche `main`). Lis ce fichier en entier, puis `docs/pitch-video.md` (script et cahier des charges) et ouvre `docs/pitch/scenes.html` (schémas déjà construits). -> -> **Heure limite : la clôture officielle est à 12:00, heure de Lisbonne** (d'après `docs/plan.md` §10, à confirmer sur le portail de soumission). **Vérifie l'heure au début avec `date`.** Une vidéo finie à 11:30 vaut mieux qu'une vidéo parfaite à 12:10. Si moins de 75 minutes restent, applique la « méthode rapide » du §9. - ---- - -## 0. Prompt à coller dans le Claude de Nathan - -```text -Clone https://github.com/Lagouze/keystone (dépôt public, branche main). Lis docs/pitch-handoff.md en entier, -puis docs/pitch-video.md, puis ouvre docs/pitch/scenes.html. Tu reprends la production de la vidéo de pitch de -3 minutes de Keystone (HackMeridian 2026). Ta mission : (1) compléter les schémas animés (surtout la nouvelle -scène S7 « accès jury »), (2) me donner le script final minuté et calé sur ce qui est à l'écran, avec un -téléprompteur, (3) préparer le montage pour que nous filmions notre visage dans le coin et que nous fournissions -la prise de démo. Suis les règles du §2 sans exception. Demande-moi ce qui exige un humain (Freighter, mots de -passe, clés). Commence par me dire l'heure qu'il est et combien de temps il reste. -``` - ---- - -## 1. Où en est le projet (tout est vérifié, au 26 octobre 2026, ~10:00) - -**Keystone** : un moteur de collatéral programmable sur **Stellar Testnet**. Un fonds met en garantie des jetons qu'il détient déjà (KMMF = parts de fonds monétaire fictives, KBOND = obligation fictive) au lieu de garder du cash. Un coffre Soroban verrouille, libère et, en cas de défaut, envoie le collatéral bloqué à la banque. Slogan : **« Post tokens, not cash. »** - -| Élément | État | Où | -| --- | --- | --- | -| Dépôt GitHub | **Public**, `main` à jour | `https://github.com/Lagouze/keystone` | -| Site public (mode réel) | En ligne | `https://keystone-eta-ebon.vercel.app` | -| Démo simulée (sans keeper, sans portefeuille) | En ligne | `https://keystone-eta-ebon.vercel.app/?demo` | -| Keeper hébergé | En ligne, Render offre gratuite (sans disque, session perdue au redémarrage), maintenu éveillé par UptimeRobot | `https://keystone-keeper.onrender.com/api` | -| Preuves on-chain | Toutes dans le README §6 (44 hashes vérifiés sur Horizon) | `README.md` | -| Pile locale pour filmer | Éprouvée | §3 | -| Script de la vidéo | Écrit | `docs/pitch-video.md` | -| Schémas animés S1 à S6 | Construits et vérifiés | `docs/pitch/scenes.html` | -| Vidéo | **À produire** | — | - -**Comptes Stellar Testnet (publics)** -- Compte **fonds de démo** (celui de Freighter) : `GDQ6AWAXZWIOCBHDSFIIKCWV3PQ6ZJE6BBC4VJCWA3SCFB4G7A2TMQOY` (soldes au dernier relevé : 650 KBOND, 999 KMMF). -- Compte keeper : `GDGUJHZGU57RU4RHARM37GU2IDX4KV7V23XVFORDWRYIBWIIQ6U7G4TO`. Compte banque : `GAUHK4ZBP2W5VSKLJOTTKKHWUB2MGFXBMHYLSH3EERTVYYMVPWSR7W6C`. - ---- - -## 2. Règles absolues (ne jamais enfreindre) - -Mise à jour du 26 octobre : l'instruction explicite de Liel et la décision A12 autorisent désormais la publication dans le README de la phrase du wallet jetable du fonds Testnet et du seul code jury montré en vidéo. Cette exception remplace la consigne ci-dessous pour ces deux valeurs seulement ; aucune autre clé ou code n'est à publier. - -1. **Aucun secret dans le dépôt, ni dans un message GitHub, ni dans une PR.** Cela inclut la **phrase de récupération**, la clé secrète (`S…`), le **code d'accès** du keeper. Les valeurs secrètes **restent dans les médias de la vidéo** et dans l'URL locale de la scène S7 (voir §5), jamais dans un fichier versionné. Vérifie avant chaque commit : `git grep -nE "S[A-Z2-7]{55}"` doit être vide. -2. **Ne saisis jamais** de mot de passe ou de clé dans un navigateur, et **n'envoie aucune transaction Stellar** : c'est l'humain qui clique dans Freighter. Tu peux préparer, vérifier en lecture seule (`curl`, Horizon) et monter. -3. **Aucun `POST` vers le keeper hébergé** sans accord écrit d'un humain (un `POST /api/session` déploie un vrai coffre). -4. **Ne modifie pas `main`** sauf par PR vers `staging`, puis PR `staging → main` (la règle du dépôt : une PR vers `main` doit venir de `staging`, voir `.github/workflows/pr-policy.yml`). N'ouvre une PR que pour le lien de la vidéo (§8). Messages de commit : `docs: …`. -5. Dis ce qui n'est pas vérifié. Ne dis jamais « ça marche » sans l'avoir exécuté. - ---- - -## 3. La pile locale (plan B, celui qu'on filme) - -Dossier : le clone de `main` avec le `.env` de Grégoire (jamais committé). Deux terminaux, sur le **même Mac** : - -```bash -# terminal 1 : keeper réel (Testnet), signature dans Freighter -KEEPER_BACKEND=testnet SIGNER=freighter PORT=8787 npm run keeper - -# terminal 2 : le site de production (le plus fluide), déjà construit pour le keeper local -cd app && npx vite preview --port 5173 --strictPort -``` - -Si le site n'est pas construit : `VITE_USE_MOCKS=false VITE_KEEPER_URL=http://127.0.0.1:8787/api npm run build -w @keystone/app`. Ouvrir `http://localhost:5173`, se connecter avec `demo@keystone.app` / `stellar` (compte local de démonstration, public). - -Vérifications en lecture seule : `curl -s http://127.0.0.1:8787/api/health` → `{"ok":true,"network":"testnet"}` ; `curl -s http://127.0.0.1:8787/api/session` → `NoSession` (page d'accueil). - ---- - -## 4. Le script final : durées recalées avec la scène « accès jury » - -La fin de la vidéo change : après la démo, une scène **S7 « Your turn »** donne au jury de quoi refaire le test réel. Le texte et le minutage de `docs/pitch-video.md` §2-§3 restent valables pour **0:00 → 1:25** (problème et solution). **À partir de 1:25, utiliser ce tableau** (il remplace celui du document) : - -| Début | Fin | Plan | Texte à dire (≈ mots) | -| --- | --- | --- | --- | -| 1:25 | 1:34 | D1 choisir la garantie | « Live on Stellar Testnet. The fund checks real market data, picks KBOND — and starts. » (16) | -| 1:34 | 1:40 | D2 coffre déployé | « A fresh vault, deployed on-chain. » (6) | -| 1:40 | 1:54 | D3 dépôt signé dans Freighter | « It deposits fifty tokens and signs in Freighter — only the fund can move its tokens. ▶ Confirmed. There's the hash. » (21) | -| 1:54 | 2:08 | D4 choc de taux, appel de marge | « Rates drop a hundred basis points. ▶ The keeper posts the new requirement: about four hundred ninety tokens. The vault holds fifty. Margin call — ninety seconds. » (26) | -| 2:08 | 2:16 | D5 horloge (accélérée ×11) | « Nobody tops up. We let the clock run. » (8) | -| 2:16 | 2:28 | D6 règlement | « Deadline passed. Anyone can settle. ▶ The vault does exactly what its rules say: fifty tokens, straight to the bank. » (20) | -| 2:28 | 2:38 | D7 preuve stellar.expert | « Every step is a real Stellar transaction. Here is the settlement, on-chain. » (12) | -| 2:38 | 2:43 | **S6** logo + adresses | « Keystone. Post tokens, not cash. » (5) | -| 2:43 | 3:00 | **S7 accès jury** | « Now it's your turn. Import our demo wallet in Freighter, on Testnet, with this recovery phrase. Use this access code on our live site, and play the real thing yourself. » (31) | - -Total ≈ 355 mots, **≤ 3:00 exactement**. `▶` = instant où l'image change (voir `docs/pitch-video.md` §3). Les plans D1 à D7 se tournent comme dans `docs/pitch-video.md` §6.2 (même clics, mêmes textes à l'écran) ; seule leur **durée à l'image** change (le montage coupe les attentes). - -> Pour le téléprompteur, **génère** `docs/pitch/teleprompter.html` (autonome, hors ligne, **à ne pas commiter avec des secrets**) : le texte ci-dessus en **grand** (≥ 64 px), le mot courant surligné, défilement synchronisé sur une horloge de 3:00 (touches **Espace** = départ/pause, **R** = remise à zéro), avec un compte à rebours du plan courant (D1…S7) et une barre de progression. Les `▶` s'affichent comme des repères. Il doit se lire **de loin** sur un second écran ou à côté de la caméra. - ---- - -## 5. Nouvelle scène **S7 · « Your turn »** (2:43 → 3:00) — à construire dans `docs/pitch/scenes.html` - -**But :** donner au jury de quoi **refaire le test réel** : le compte de démo dans leur Freighter, et le code d'accès du keeper. Les valeurs secrètes sont **saisies au moment de l'enregistrement dans l'adresse**, jamais dans le fichier : - -`scenes.html?scene=7&phrase=mot1+mot2+…&key=GDQ6AW…&code=…` - -La scène **lit ces trois paramètres** (`URLSearchParams`) et les affiche. **Si un paramètre manque, afficher un emplacement vide visible** (``), pour qu'on ne publie jamais une scène vide sans s'en rendre compte. **Ne jamais écrire les valeurs réelles dans le dépôt.** - -Composition (1920×1080, même fond « aura » et même charte que les autres scènes ; **rien dans la zone de la facecam**, voir `?safe`) : - -- **Titre** (haut) : *Try the real thing. In 3 steps.* -- **Trois cartes verre alignées** (apparition l'une après l'autre toutes les 1,2 s) : - 1. **« Freighter → Testnet »** : *Install Freighter, switch the network to **Testnet**.* - 2. **« Import our demo wallet »** : *Import with this recovery phrase* + la **phrase** affichée en **grille 3 × 4** (ou 4 × 6 si 24 mots), police monospace, **très lisible** (≥ 40 px), numérotée 1 à 12, et sous la grille la **clé publique** `GDQ6AW…MQOY` complète en dessous (56 caractères, sur deux lignes de 28). - 3. **« Open the live site »** : *keystone-eta-ebon.vercel.app* + *Access code* + le **code** en monospace, grand. -- **Pied de page** (petit) : *Testnet only · play money · the demo wallet may be reset.* -- **Durée à l'écran : 17 s au total.** Les trois cartes doivent être **entièrement visibles pendant au moins 8 s**. Le jury peut mettre la vidéo en pause. -- **Mettre aussi la même information en texte copiable** (description de la vidéo, notes privées du formulaire de soumission s'il en existe un) : lire 12 mots sur une vidéo est pénible, et un secret n'est jamais à une seule place. - -**Ne pas oublier :** modifier `S6` pour qu'elle dure **5 s** au lieu de 10 (logo + slogan + adresses, sans le fondu au noir qui passe à la fin de S7) et ajouter `?scene=7` aux touches Espace/→ (la boucle passe de 6 à 7 scènes). - -### Avertissements à transmettre à Grégoire et Nathan (à dire une fois, clairement, puis les laisser décider) - -- **La phrase de récupération ouvre tout le wallet Freighter**, pas seulement ce compte : ses autres comptes, et la clé d'un compte vaut aussi sur **Mainnet**. **Elle ne doit être montrée que si ce wallet est dédié à la démo** et n'a jamais reçu d'argent réel. -- **Une alternative plus sûre :** montrer **uniquement la clé secrète du compte de démo** (Freighter → *Add account* → *Import a Stellar secret key*), au lieu de la phrase. Même effet pour le jury, risque réduit. -- **Enregistrer la vidéo d'abord, révéler ensuite.** Dès que la clé est visible, n'importe qui peut **vider ou modifier** le compte du fonds : refaire les jetons avec `npm run bootstrap` après le hackathon (README §9), puis **changer la clé** et les **codes d'accès** (Render, variable `KEEPER_ACCESS_TOKENS`). -- **Le test réel du jury n'est valable que si l'enchaînement hébergé marche.** Il n'a **jamais été testé de bout en bout** : site hébergé + Freighter + keeper Render + code d'accès. **Il faut le tester une fois (3 transactions de 1 KMMF) AVANT de publier la vidéo**, sinon les juges tomberont peut-être sur une erreur devant leur écran. Demande à Grégoire de dire « GO essai Freighter » : un humain suit alors la procédure (session KMMF, dépôt de 1 KMMF, retrait de 1 KMMF) et on vérifie les hashes sur Horizon. -- **Une seule session partagée :** si deux juges jouent en même temps, le second écrase le premier. -- **Le keeper gratuit de Render** s'endort après 15 min sans requête : UptimeRobot l'interroge toutes les 5 min. Dans Render, **Auto-Deploy** doit être sur « No » pendant le tournage et jusqu'à la fin du jugement, sinon un push redémarre le keeper et efface la session. -- **Le fonds a 650 KBOND :** chaque démo en consomme 50 (envoyés à la banque). Le jury et les répétitions peuvent le vider : le recharger avant la soumission (`npm run bootstrap` sur la machine de Grégoire). - ---- - -## 6. Ce que Claude doit produire, dans l'ordre (≈ 60 min de travail machine) - -| # | Livrable | Définition de « fait » | -| --- | --- | --- | -| 1 | **S7** et **S6 raccourcie** dans `scenes.html` | `?scene=7&phrase=…&key=…&code=…` s'affiche, rien dans la zone facecam, valeurs secrètes jamais committées | -| 2 | **Téléprompteur** `docs/pitch/teleprompter.html` | Défile sur 3:00 selon le §4, lisible de loin, repères `▶` | -| 3 | **4 clips** : `slides_part1` (`?auto`), `slides_part2` (`?auto=2`), `slides_close` (S6 puis S7) | Enregistrés en 1920×1080, 30 i/s, sans curseur ni barre d'adresse | -| 4 | **Liste d'enregistrement de la démo** pour les humains | Les 8 vérifications de `pitch-video.md` §6.1 **et** la demande « GO essai Freighter » (§5) | -| 5 | **Montage** selon `pitch-video.md` §8, avec le tableau du §4 de ce fichier | Durée ≤ 3:00, facecam en bas-droite, sous-titres anglais, musique −24 dB (−32 dB en démo) | -| 6 | **Export** `keystone-pitch.mp4` | H.264, 1920×1080, 30 i/s, AAC 192 kb/s, < 100 Mo | - -**Ce que font les humains :** filmer la prise de démo (`demo_raw.mov`), filmer la facecam avec la voix en regardant le montage muet ou le téléprompteur, déverrouiller Freighter, mettre les valeurs secrètes dans l'adresse de S7 au moment de l'enregistrement. - ---- - -## 7. Commandes de montage (points de départ : à tester avant usage) - -Capture d'une scène en vidéo depuis un navigateur : utiliser l'enregistrement d'écran de macOS (Cmd+Maj+5) sur la fenêtre en plein écran (`F`), ou un outil de capture de navigateur. Les scènes sont déterministes : les relancer avec `R`. - -```bash -# accélérer un segment (D5 : 90 s -> 8 s, soit ×11) -ffmpeg -i demo_raw.mov -ss 00:02:10 -to 00:03:40 -filter:v "setpts=PTS/11" -an d5.mp4 - -# couper un segment sans le ré-encoder trop (D2, D3 : saut des attentes) -ffmpeg -i demo_raw.mov -ss 00:00:21 -to 00:00:27 -c:v libx264 -crf 18 -an d2.mp4 - -# facecam ronde (346 px) en bas-droite, sur la vidéo principale -ffmpeg -i main.mp4 -i face.mp4 -filter_complex \ - "[1:v]scale=346:346:force_original_aspect_ratio=increase,crop=346:346,format=yuva420p,geq=lum='p(X,Y)':a='if(lte(hypot(X-173,Y-173),173),255,0)'[f];[0:v][f]overlay=W-w-24:H-h-24" \ - -c:a copy with_face.mp4 - -# mixer la voix et une musique à -24 dB, puis encoder -ffmpeg -i with_face.mp4 -i music.mp3 -filter_complex "[1:a]volume=-24dB[m];[0:a][m]amix=inputs=2:duration=first" \ - -c:v libx264 -crf 20 -pix_fmt yuv420p -c:a aac -b:a 192k keystone-pitch.mp4 -``` - -Musique : **uniquement libre de droits** (aucun morceau protégé). Sous-titres : fichier `.srt` en anglais généré à partir du §4, incrustés avec `-vf subtitles=…`. - ---- - -## 8. À la fin : le lien de la vidéo dans le README - -Dès que la vidéo est en ligne (YouTube « non répertoriée » ou Loom), ouvrir une PR (`docs: add the demo video link`) qui remplace, dans `README.md` §4, la ligne `| **Demo video** | *link added at submission* |` par le lien, puis la PR `staging → main`. **Ne mets ni phrase, ni clé, ni code d'accès dans cette PR.** - ---- - -## 9. Méthode rapide (si moins de 75 minutes) - -Sans schémas animés enregistrés : filmer **le produit seulement**. Partie 1 et 2 : défiler la landing du site (hero « Post tokens, not cash. », frise « Here is what a margin call looks like on Stellar. », « How it works ») pendant que la voix dit le texte de `pitch-video.md` §3 ; démo D1 à D7 réelle ; clôture : une seule image fixe (S6 puis S7 générées avec `scenes.html?scene=6&nofade` et `?scene=7&…`) tenue 17 s. Facecam en coin, sans montage compliqué : un seul enregistrement continu, la voix en direct. - ---- - -## 10. Ce qui n'a PAS été fait (à savoir) - -- La présentation `.pptx` de l'équipe n'a pas pu être lue (conteneur protégé de WhatsApp, accès refusé à l'agent). **Si les humains la copient dans `~/Downloads`, l'aligner** sur le script et les schémas. -- Le test de Freighter **depuis le site hébergé** (voir §5). -- Aucune vidéo n'est enregistrée. Aucun montage n'est commencé. diff --git a/docs/pitch-video.md b/docs/pitch-video.md deleted file mode 100644 index c4e118d..0000000 --- a/docs/pitch-video.md +++ /dev/null @@ -1,399 +0,0 @@ -# Keystone — Script de la vidéo de pitch (3 minutes) - -> **Document de production, autonome.** Il est écrit pour être lu par l'équipe **et par un autre agent Claude** qui a accès au dépôt `https://github.com/Lagouze/keystone` (branche `main`). Il contient : le texte à dire, mot à mot et minuté ; les schémas animés à produire (décrits à la seconde près) ; le déroulé exact de la démo sur la vraie plateforme ; la préparation, le montage, les plans de secours. -> -> **Mise à jour (fin de vidéo) :** à partir de **1:25**, le minutage et le texte de `docs/pitch-handoff.md` §4 **remplacent** ceux de ce document, et une scène **S7 « accès jury »** est ajoutée (`docs/pitch-handoff.md` §5). Lire d'abord `docs/pitch-handoff.md`. -> -> Narration en **anglais** (jury HackMeridian international, README en anglais). Chaque bloc a une *ligne d'aide en français* pour que l'équipe sache ce qu'elle dit. Les instructions de production sont en français. - ---- - -## 0. À lire d'abord (2 minutes) - -### 0.1 Le temps -- La clôture officielle du hackathon est à **12:00 (heure de Lisbonne)** d'après `docs/plan.md` §10. **Vérifier l'heure exacte sur le portail de soumission.** -- Ce document a été écrit à **09:35**. Il reste environ **2 h 25**. Le plan de production du §9 tient en **1 h 30** avec 30 minutes de marge. **Ne rien ajouter qui le fasse déborder.** -- Priorité absolue : **une vidéo finie à 11:30 vaut mieux qu'une vidéo parfaite à 12:10.** - -### 0.2 L'idée en une phrase -> *« Post tokens, not cash. »* Un fonds met en garantie des jetons qu'il détient déjà (fonds monétaire, obligation) au lieu de garder du cash inutilisé, et un coffre Soroban sur Stellar applique les règles de marge, d'appel et de défaut, sans que personne ne puisse bouger plus que prévu. - -### 0.3 Le fil rouge de la vidéo -La landing du produit raconte déjà **Lock → Call → Settle**. La vidéo reprend exactement ce fil, en trois temps : *le problème* (0:00–0:50), *la solution* (0:50–1:25), *la démo* (1:25–2:50), puis une clôture (2:50–3:00). La démo joue **le scénario du défaut** (Lock → Call → Settle) parce qu'il montre les trois temps en 85 secondes et se termine sur le coup de théâtre : le coffre envoie le collatéral à la banque, **on-chain**. - -### 0.4 Qui fait quoi -| Qui | Quoi | -| --- | --- | -| **Humain (Grégoire ou Nathan)** | Piloter la démo dans le navigateur (Freighter demande un mot de passe : **Claude ne doit jamais le saisir**), dire le texte, lancer l'enregistrement. | -| **Claude Code / autre agent** | Construire les schémas animés (§5), préparer la liste de contrôle, monter la vidéo (§8), ajouter le lien final au README. | -| **Interdits à l'agent** | Saisir un mot de passe ou une clé, signer ou envoyer une transaction sans « GO » écrit d'un humain, publier un secret, modifier `main` hors PR. | - ---- - -## 1. Ce que le jury doit retenir (3 messages, dans cet ordre) - -1. **Le problème est réel et coûteux** : du cash dormant pour couvrir des appels de marge. -2. **La solution est simple et vérifiable** : des règles dans un coffre Soroban, pas dans un classeur. -3. **Ça marche vraiment sur Stellar** : chaque étape est une transaction Testnet, avec son hash, visible sur stellar.expert. - -Critères du hackathon à servir explicitement (`docs/decisions.md`, « Exigences officielles ») : utilisation **significative** de Stellar, MVP fonctionnel (pas une maquette), preuve on-chain, problème / utilisateur / valeur clairs. - ---- - -## 2. Vue d'ensemble minutée - -| Temps | Partie | À l'écran | Mots | -| --- | --- | --- | --- | -| 0:00 – 0:12 | **1 · Le problème** (accroche) | Schéma **S1** « L'appel de marge » | 33 | -| 0:12 – 0:30 | 1 · Le problème | Schéma **S2** « Cash dormant » | 34 | -| 0:30 – 0:50 | 1 · Le problème | Schéma **S3** « Des jetons enfermés dehors » | 36 | -| 0:50 – 1:25 | **2 · La solution** | Schéma **S4** « Comment Keystone fonctionne » (Lock → Call → Settle), puis **S5** « Pourquoi Stellar » | 85 | -| 1:25 – 2:50 | **3 · La démo** | **Le vrai produit**, enregistrement d'écran, annotations | 155 | -| 2:50 – 3:00 | Clôture | Schéma **S6** logo + adresse du site et du dépôt | 12 | -| | | **Total** | **≈ 355 mots** (≈ 118 mots/minute : confortable, avec des respirations) | - -Facecam : visage en **coin bas-droit** (cercle ou rectangle arrondi, 18 % de la largeur), **sur toute la durée**, y compris pendant les schémas et la démo. - ---- - -## 3. Le texte à dire (script complet) - -> Règle d'or : **chaque phrase est calée sur une image**. Les repères `▶` indiquent l'instant exact où l'image doit changer. Si l'on parle un peu plus vite ou plus lentement, ajuster la **vitesse de lecture des schémas**, pas le texte. - -### PARTIE 1 — Le problème (0:00 → 0:50) - -**0:00 · S1 · accroche** (12 s) -> « Imagine you run a fund. You've swapped interest-rate risk with a bank — ten million euros, five years. ▶ Then rates move… and the bank calls: *post more collateral. Today.* » - -*Aide FR : « Imaginez que vous gérez un fonds. Vous avez échangé votre risque de taux avec une banque : 10 millions d'euros, 5 ans. Puis les taux bougent, et la banque appelle : déposez plus de garantie, aujourd'hui. »* -`▶` sur « Then rates move » : la courbe de taux s'effondre. `▶` sur « calls » : l'étiquette **MARGIN CALL** apparaît côté banque. - -**0:12 · S2 · cash dormant** (10 s) -> « To be ready, funds keep cash on the side. ▶ Cash that earns nothing. Cash that isn't invested. A quiet cost, every single day. » - -*Aide FR : « Pour être prêts, les fonds gardent du cash de côté. Du cash qui ne rapporte rien, qui n'est pas investi. Un coût silencieux, chaque jour. »* -`▶` sur « Cash that earns nothing » : la tranche grise « cash de côté » pulse et son compteur reste à 0 € pendant que la partie investie monte. - -**0:22 · S2 (suite)** (8 s) -> « And collateral is heavy: valuations, notices, custody, disputes. » - -*Aide FR : « Et la garantie est lourde : valorisations, notifications, conservation, litiges. »* -Quatre pastilles apparaissent l'une après l'autre : *Valuations · Notices · Custody · Disputes*. - -**0:30 · S3 · jetons enfermés dehors** (14 s) -> « Meanwhile, funds already hold tokenized money-market shares and bonds — assets that keep earning. ▶ But there's no simple, enforceable way to post them as collateral. » - -*Aide FR : « Pendant ce temps, les fonds détiennent déjà des parts de fonds monétaires et des obligations tokenisées, qui continuent de rapporter. Mais il n'existe pas de moyen simple et applicable de les donner en garantie. »* -`▶` sur « But there's no… » : un mur en pointillés se dresse entre les jetons et le coffre de la banque, avec un « ? ». - -**0:46 · transition** (4 s) -> « What if the rules lived in code? » - -*Aide FR : « Et si les règles vivaient dans du code ? »* -Le mur se dissout. **Silence de 1 seconde.** Le logo Keystone se dessine (trait par trait). - -### PARTIE 2 — Comment on le résout (0:50 → 1:25) - -**0:50 · S4a · le logo** (4 s) -> « Meet Keystone. ▶ Post tokens, not cash. » - -*Aide FR : « Voici Keystone. Des jetons, pas du cash. »* -`▶` : le slogan s'écrit sous le logo. - -**0:54 · S4b · LOCK** (9 s) -> « The fund deposits tokens it already holds into a Soroban vault on Stellar. The vault locks only what the swap requires — nothing more. » - -*Aide FR : « Le fonds dépose, dans un coffre Soroban sur Stellar, des jetons qu'il détient déjà. Le coffre bloque seulement ce que le swap exige. Rien de plus. »* -Des jetons volent du Fonds vers le Coffre ; la barre du coffre montre « Free » puis « Locked ». - -**1:03 · S4c · CALL** (11 s) -> « A keeper reads the real Euribor, recomputes the exposure, and posts the requirement. If rates move against the fund, a margin call opens — with a ninety-second deadline. » - -*Aide FR : « Un keeper lit le vrai Euribor, recalcule l'exposition et publie l'exigence. Si les taux jouent contre le fonds, un appel de marge s'ouvre, avec 90 secondes de délai. »* -Le keeper (ECB) envoie un chiffre au coffre ; la barre passe au rouge « Missing » ; un anneau de 90 s se met à tourner. - -**1:14 · S4d · SETTLE** (8 s) -> « Not covered in time? The vault sends exactly the locked tokens to the bank. No admin. No one can move more. » - -*Aide FR : « Pas couvert à temps ? Le coffre envoie exactement les jetons bloqués à la banque. Pas d'administrateur. Personne ne peut déplacer plus. »* -Les jetons bloqués volent du Coffre vers la Banque ; un cadenas se ferme sur le reste. - -**1:22 · S5 · pourquoi Stellar** (3 s) -> « Seconds to finality. Fractions of a cent. Real transactions. » - -*Aide FR : « Finalité en quelques secondes. Frais de l'ordre de la fraction de centime. De vraies transactions. »* -Trois pastilles : *Soroban smart contract · Stellar Asset Contracts · Freighter wallet*. - -### PARTIE 3 — La démo (1:25 → 2:50) - -> **C'est le vrai produit, en direct sur Stellar Testnet.** Les numéros D1…D7 correspondent aux plans du §6. - -**1:25 · D1 · choisir la garantie** (11 s) -> « This is live on Stellar Testnet. First, the fund checks the market — real ECB and market data. Today, the bond looks better. We pick KBOND, and start. » - -*Aide FR : « C'est en direct sur Stellar Testnet. D'abord, le fonds regarde le marché : vraies données BCE et marché. Aujourd'hui, l'obligation est préférable. On choisit KBOND et on démarre. »* - -**1:36 · D2 · déploiement du coffre** (8 s) -> « A fresh vault is deployed on-chain. » - -*Aide FR : « Un nouveau coffre est déployé sur la chaîne. »* - -**1:44 · D3 · dépôt signé dans Freighter** (14 s) -> « The fund deposits fifty tokens. It signs in Freighter — only the fund can move its tokens. ▶ Confirmed. There's the hash. » - -*Aide FR : « Le fonds dépose cinquante jetons. Il signe dans Freighter : seul le fonds peut bouger ses jetons. Confirmé. Voici le hash. »* - -**1:58 · D4 · choc de taux et appel de marge** (16 s) -> « Now we move rates: minus one hundred basis points. ▶ The swap turns against the fund. The keeper posts the new requirement: about four hundred ninety tokens. The vault holds fifty. ▶ Margin call — ninety seconds on the clock. » - -*Aide FR : « Maintenant on bouge les taux : moins 100 points de base. Le swap tourne contre le fonds. Le keeper publie la nouvelle exigence : environ 490 jetons. Le coffre en tient 50. Appel de marge, 90 secondes. »* - -**2:14 · D5 · l'horloge tourne** (10 s, accéléré) -> « Nobody tops up. We let the clock run. » - -*Aide FR : « Personne ne complète. On laisse tourner l'horloge. »* -Accéléré ×9 (90 s en 10 s). Le compte à rebours reste lisible. **Après la phrase : 2 secondes de silence avec un son discret.** - -**2:24 · D6 · règlement** (14 s) -> « Deadline passed. Anyone can settle. ▶ And the vault does exactly what its rules say: fifty tokens, straight to the bank. » - -*Aide FR : « Délai dépassé. N'importe qui peut régler. Et le coffre fait exactement ce que disent ses règles : cinquante jetons, directement à la banque. »* -`▶` sur « And the vault » : le geste de maintien « Hold to settle default » se termine (1,2 s) et l'animation du jeton traverse de « Vault » à « Bank ». - -**2:38 · D7 · la preuve on-chain** (12 s) -> « And this is not a mock-up: every step is a Stellar transaction. Here is the settlement, on-chain. » - -*Aide FR : « Et ce n'est pas une maquette : chaque étape est une transaction Stellar. Voici le règlement, sur la chaîne. »* - -### Clôture (2:50 → 3:00) - -**2:50 · S6** (10 s) -> « Keystone. Post tokens, not cash. Try it live — the code is public. » - -*Aide FR : « Keystone. Des jetons, pas du cash. Essayez-le en ligne : le code est public. »* - ---- - -## 4. Faits à vérifier avant d'enregistrer (ne pas dire ce qui n'est pas sûr) - -| Affirmation dans le texte | Source | Statut | -| --- | --- | --- | -| Swap de 10 M€ sur 5 ans | Fenêtre *Details* du produit (`Swap €10,000,000 · 5 years`) | **Vérifié** dans le code | -| Délai de grâce de 90 secondes | `docs/interfaces.md`, README §1 | **Vérifié** | -| Le coffre envoie « exactement les jetons bloqués », « pas d'admin » | README §5 (« no admin, no upgrade function »), `docs/interfaces.md` §3 | **Vérifié** | -| Le keeper lit le vrai Euribor (BCE) | README §3, `keeper/src/euribor.ts` | **Vérifié** | -| Données de marché réelles dans le comparateur | `GET /api/market-advisor` (5 sources en direct) | **Vérifié** le 26/10 | -| « Seconds to finality », « fractions of a cent » | Connaissance générale sur Stellar | **À vérifier / adoucir** : si un doute, dire « fast and cheap ». | -| Ordre de grandeur « about four hundred ninety tokens » | Le produit affiche `491.39` (exigence) et `441.39 KBOND missing` (manque) pour −100 bp et 50 déposés | **Vérifié** (README §6, scénario 2) ; **relire la valeur à l'écran avant de la dire** | -| « Cinquante jetons à la banque » | Animation du jeton « 50 KBOND » ; README §6 | **Vérifié** | - -> Ne pas citer d'entreprises ni de chiffres de marché non présents dans le dépôt, sauf vérification faite. - ---- - -## 5. Schémas animés (S1 à S6) — cahier des charges - -> **Déjà construits et vérifiés dans un navigateur** (les six scènes jouent, rien ne chevauche la zone de la facecam). L'agent de montage doit les **enregistrer tels quels** ; il peut les améliorer, mais **sans changer leur durée ni leurs repères temporels**, qui sont calés sur la voix. Les chiffres du compteur de S2 sont **illustratifs** (étiquette « Illustrative figures » affichée). - -**Un fichier fourni :** `docs/pitch/scenes.html` (s'il est présent dans le dépôt, c'est la **base à améliorer**, pas à refaire). Il se lance en ouvrant le fichier dans un navigateur : - -- `scenes.html?scene=1` … `?scene=6` : une scène seule, qui joue sa propre animation (`&nofade` : sans le fondu au noir final de S6, pour une capture d'image fixe) ; -- `scenes.html?auto` : joue **S1 → S2 → S3** en continu (0:00 → 0:50), puis s'arrête sur un écran vide ; `?auto=2` joue **S4 → S5** (0:50 → 1:25) ; `?scene=6` pour la clôture ; -- touches : **Espace** ou **→** scène suivante, **R** redémarre la scène, **F** plein écran. - -**Cahier des charges commun** -- Format **1920 × 1080**, fond clair type « aura » du produit : `#eef0f5` avec trois taches floues lentes (lavande, menthe, bleu très pâle). Cohérent avec l'interface (« Liquid Glass »). -- Police **Helvetica Neue** (repli Arial). Texte encre `#1c1c1e`, secondaire `#48484d`. -- Couleurs de sens, **identiques au produit** : **bleu on-chain** `#0a5cc2`, **rouge appel/défaut** `#a92b21`, **vert libération/gain** `#1a7a37`, gris simulation `#55555a`. -- Cartes en « verre » : fond blanc 30–45 %, coins très arrondis (32 px), ombre diffuse. Pas de bordures dures. -- **Peu de texte** : un titre court par scène (≤ 8 mots), des étiquettes de 1 à 3 mots. Le jury **écoute**, il ne lit pas. -- Mouvements : ressorts doux (`cubic-bezier(0.16, 1, 0.3, 1)`), 0,5 à 0,8 s, une seule animation « forte » à la fois. **Laisser la place à la facecam en bas à droite (≈ 18 % de la largeur) : ne rien y mettre d'important.** -- Aucune dépendance externe (fonctionne hors ligne, enregistrable tel quel). - -### S1 · « L'appel de marge » (0:00 → 0:12) -- **Titre** (haut, apparaît à 0:00) : *A fund. A bank. A €10M swap.* -- **Composition** : à gauche une carte verre **FUND**, à droite une carte **BANK**. Entre elles, deux flèches opposées : vers la banque « pays fixed rate », vers le fonds « pays Euribor 3M ». Sous les flèches, la mention *€10M · 5 years*. -- **0:00 → 0:05** : les cartes entrent (glissement + léger flou qui se dissipe), les flèches se dessinent. -- **0:05 → 0:08** : une **courbe de taux** (ligne fine encre) se trace au centre bas puis **chute** de 2,6 % à 1,6 %, avec l'étiquette **−100 bp**. La carte FUND vire légèrement au rouge. -- **0:08 → 0:12** : à droite, une pastille **rouge « MARGIN CALL »** apparaît sur la carte BANK avec une onde concentrique (une seule, 1 s). Sous-titre : *« Post more collateral. Today. »* - -### S2 · « Cash dormant » (0:12 → 0:30) -- **Titre** : *Cash set aside = cash not invested.* -- **Composition** : une **barre horizontale** large (le portefeuille du fonds) : à gauche une grande part **verte** « Invested », à droite une part **grise hachurée** « Cash set aside for margin calls ». -- **0:12 → 0:16** : la barre se remplit de gauche à droite. -- **0:16 → 0:22** : au-dessus de la part verte, un compteur **« + € yield »** monte en continu (animation de nombres). Au-dessus de la part grise, un compteur **« € earned » reste à 0** et la part grise **pulse** doucement. -- **0:22 → 0:30** : quatre pastilles verre apparaissent sous la barre, l'une après l'autre (toutes les 1,5 s) : **Valuations · Notices · Custody · Disputes**. - -### S3 · « Des jetons enfermés dehors » (0:30 → 0:50) -- **Titre** : *The assets are on-chain. The rules are not.* -- **Composition** : à gauche, deux **puces de jetons** brillantes : **KMMF** (« tokenized money-market fund ») et **KBOND** (« tokenized sovereign bond »), avec de petites étincelles vertes « earning yield ». À droite, un **coffre de la banque** (carte verre avec cadenas). Entre eux, un **mur en pointillés** avec un grand **« ? »**. -- **0:30 → 0:38** : les puces entrent, les étincelles montent ; les puces essaient d'aller vers le coffre et **rebondissent** sur le mur (2 essais). -- **0:38 → 0:46** : sous-titre *« No simple, enforceable way to post them. »* -- **0:46 → 0:50** : le mur **se dissout** en particules (rapide), le fond s'éclaircit. **Silence 1 s.** - -### S4 · « Comment Keystone fonctionne » (0:50 → 1:22) -- **0:50 → 0:54, logo** : le logo Keystone (voir `app/src/ui/Logo.tsx`, tracé SVG : une arche en deux lignes, une clé de voûte à facettes) se **dessine trait par trait** (stroke-dashoffset), puis le mot **KEYSTONE** en capitales espacées, puis *Post tokens, not cash.* s'écrit dessous. -- **Composition** (apparaît après le logo, qui remonte en petit en haut à gauche) : quatre éléments en ligne : **FUND** (icône Freighter simplifiée) → **VAULT** (carte centrale large, la vedette, étiquette *Soroban · Stellar Testnet*) ← **KEEPER** (au-dessus, avec sous-étiquette *ECB Euribor*) ; **BANK** à droite. Un fil de légende en bas : **LOCK · CALL · SETTLE** (trois points, le point actif est plein, comme dans la landing du produit). -- **0:54 → 1:03, LOCK** : 6 petits jetons partent de FUND vers VAULT. Dans VAULT, une **barre** à trois segments : *Free* (gris), *Locked* (bleu on-chain). La part « Locked » s'élargit puis s'arrête. Étiquette : *locks only what the swap requires*. -- **1:03 → 1:14, CALL** : KEEPER envoie un chiffre à VAULT (« requirement ↑ »). La barre gagne un segment **rouge « Missing »**. Un **anneau de 90 secondes** se dessine autour de l'icône horloge, avec *90 s*. Étiquette : *margin call*. -- **1:14 → 1:22, SETTLE** : l'anneau se termine ; les jetons *Locked* quittent VAULT vers BANK en arc (700 ms, ressort), une étiquette *« exactly what was locked »*. Les jetons restants (« Free ») **restent**. Un cadenas se ferme sur VAULT : *no admin key*. - -### S5 · « Pourquoi Stellar » (1:22 → 1:25) -- Trois pastilles verre qui montent en cascade (150 ms d'écart) sur le bas de l'écran : **Soroban smart contract** · **Stellar Asset Contracts (KMMF, KBOND)** · **Freighter wallet**. Sous-titre : *Real transactions on Stellar Testnet.* Reste à l'écran jusqu'à 1:25, puis fondu vers la démo. - -### S6 · Clôture (2:50 → 3:00) -- Fond identique. Le **logo** au centre, **KEYSTONE** en dessous, puis *Post tokens, not cash.* -- En bas, en deux lignes bien lisibles : **keystone-eta-ebon.vercel.app** et **github.com/Lagouze/keystone**. Étiquette discrète : *Live on Stellar Testnet · open source*. -- Optionnel : un **QR code** vers le site (générer avec n'importe quel outil local, ne rien envoyer en ligne). -- Dernière image tenue **2 s** puis fondu au noir. - ---- - -## 6. La démo, plan par plan (le vrai produit) - -### 6.1 Avant de commencer — liste de contrôle (10 minutes, **obligatoire**) - -Tout se vérifie **sans transaction**. - -1. **Le choix de la pile** (décider une fois pour toutes) : - - **Plan A — site public** `https://keystone-eta-ebon.vercel.app` + keeper Render. Il faut le **code d'accès** de l'équipe et **Freighter** (réseau **Testnet**, compte actif `GDQ6AW…MQOY`). **Le Freighter depuis le site hébergé n'a pas encore été testé** : faire **une répétition complète avant de filmer** (« GO essai Freighter »). - - **Plan B — en local** (déjà éprouvé) : `npm run keeper` puis `npm run dev -w @keystone/app`, sur le **même Mac**, avec le `.env` du dépôt (README §9, ligne « The real setup »). Ouvrir `http://localhost:5173`. C'est la solution de repli si le Plan A pose problème. - - Règle : **ne montrer à l'écran que ce qui a été vérifié à la répétition.** -2. Keeper éveillé : `curl -s https://keystone-keeper.onrender.com/api/health` doit répondre `{"ok":true,"network":"testnet"}` (la première réponse après une veille peut prendre une minute). Dans Render : **Settings → Build & Deploy → Auto-Deploy : No** pendant la prise. -3. Le keeper n'a **aucune session** en cours (`curl -s …/api/session` → `NoSession`) : la page d'accueil s'affichera. Si une session est en cours, relancer le service (Render → Manual Deploy → Restart). -4. **Soldes** : le fonds doit avoir au moins ~100 KBOND (il en avait 650 après les tests). Vérifier sur `https://stellar.expert/explorer/testnet/account/GDQ6AWAXZWIOCBHDSFIIKCWV3PQ6ZJE6BBC4VJCWA3SCFB4G7A2TMQOY`. Chaque prise consomme **50 KBOND** (envoyés à la banque). -5. **Freighter** déverrouillé, réseau Testnet, compte `GDQ6AW…MQOY` actif. -6. **Navigateur** : fenêtre propre, plein écran, **zoom 100 %**, barre de favoris masquée, **aucun onglet personnel**, notifications coupées (mode « Ne pas déranger » macOS). Un second onglet **stellar.expert** déjà connecté pour le plan D7 (ou le lien du hash dans le fil d'activité). -7. Un compte local est connecté sur le site (écran de verrouillage passé). **Créer ce compte avant**, il persiste dans le navigateur. -8. Faire **une prise de répétition complète** (§6.2), sans enregistrer, pour vérifier les durées réelles. - -### 6.2 Les plans, avec ce qui s'affiche à l'écran (textes exacts du produit) - -| # | Temps | Action humaine | Ce que l'écran doit montrer | Notes de tournage | -| --- | --- | --- | --- | --- | -| **D1** | 1:25 → 1:36 | Être déjà sur l'écran **« What will the fund post? »** (utiliser le bouton « Skip to start ↓ » de la landing). Cliquer **Compare market conditions**. Laisser 4 s la fenêtre *Collateral Market Advisor* (cinq indicateurs, avis « KBOND potentially preferable »). Fermer (**Back to manual selection**). Cliquer **KBOND**. Cliquer **Start**. | Titre *What will the fund post?*, sélecteur KMMF/KBOND, ligne *« … · €1,000.00 (simulated) · haircut 2.00% »*, la fenêtre du comparateur, puis le bouton **Start** qui passe à *« Deploying the vault… »* | Le comparateur affiche aujourd'hui KBOND ; **vérifier l'avis du jour**. Si l'avis change, adapter la phrase (« Today, the bond looks better »). | -| **D2** | 1:36 → 1:44 | Attendre. | Indicateur *« Deploying the vault »* (animation du registre). 10 à 30 s en réel → **couper** (saut) à l'arrivée du tableau de bord : cartes qui entrent l'une après l'autre, titre **No margin required**, *« Deposit collateral, then move rates. »* | Couper l'attente au montage. | -| **D3** | 1:44 → 1:58 | Panneau **Controls**, onglet **Deposit** : champ à **50** (le champ affiche **300** par défaut : le **remplacer** par `50`). Cliquer **Deposit**. Dans la fenêtre **Freighter**, vérifier le réseau et la fonction `deposit`, puis **Sign**. | Les étapes **Prepare → Sign → Submit → Confirmed**, le texte *« Confirm in Freighter… »* (scintillant), puis le **fil Activity** : une ligne **On-chain** *« Deposit of 50 KBOND »* avec le hash qui se « déchiffre », puis **Vault · KBOND : Free 50**. | **Zoomer en montage sur la fenêtre Freighter** (c'est une fenêtre séparée : capturer **tout l'écran**). Couper l'attente de confirmation (5 à 15 s). **Ne jamais filmer la saisie du mot de passe Freighter** : déverrouiller avant. | -| **D4** | 1:58 → 2:14 | Cliquer la tuile **−100 bp** (carte *Controls*, ligne *« Move rates · simulated Euribor shock »*). | Le point de passage est **séquencé** par le produit : étiquette **MARGIN CALL** (clignotement de lettres), carte teintée, halo, titre **« 441.39 KBOND missing »**, texte *« Cover before HH:MM:SS UTC, or the 50 locked KBOND go to the bank. »*, **compte à rebours** (≈ 1:30), carte **Market** : **Fund P&L** en rouge (courbe), **Euribor 3M** avec *« −100 bp vs fixed »*. Bouton **Deposit 441.3927 KBOND** et **Settle after deadline** (grisé). | La séquence dure ~1,6 s après la confirmation : laisser respirer. **Pointer** (halo, curseur) le chiffre *missing*. | -| **D5** | 2:14 → 2:24 | **Ne rien faire.** | Le **compte à rebours** descend jusqu'à zéro. | **Accélérer ×9** au montage (90 s → 10 s), en gardant le chiffre lisible. Ajouter l'étiquette *« Time-lapse ×9 »*. | -| **D6** | 2:24 → 2:38 | Quand le compte à rebours atteint **0:00**, attendre **3 à 5 s** (le temps du registre), puis **maintenir** le bouton **Hold to settle default** (1,2 s, jauge qui se remplit). | Le bouton passe à *« Settling… »*, puis l'animation : le jeton **« 50 KBOND »** traverse **Vault → Bank** (700 ms), la carte devient **rouge**, titre **« Collateral sent to the bank »**, *« The bank now holds … KBOND. Enforced by the vault. »* | ⚠ Le solde de la banque **inclut les démonstrations précédentes** (par exemple 350) : **ne pas lire ce chiffre**, dire « fifty tokens ». Si le bouton répond *GracePeriodRunning*, attendre 3 s et recommencer (le temps du registre n'est pas celui du navigateur). | -| **D7** | 2:38 → 2:50 | Dans **Activity**, cliquer le hash de la ligne **« Default settled… »** (↗). | **stellar.expert** s'ouvre sur la transaction : *Success*, appel de contrat `settle_default`, événement `defaulted`, le contrat du coffre. | Préférer **ouvrir l'onglet à l'avance** sur ce hash lors de la répétition ; au montage, zoomer sur *« Success »* et le nom de la fonction. | - -> **Si on veut montrer la libération (optionnel, pas dans les 3 minutes)** : dépôt de 100 KMMF → −50 bp → −30 bp (appel) → dépôt de 100 → « cured » → +60 bp → libération. C'est le **scénario 1** de la section 6 du README : à garder pour une version longue, **pas dans cette vidéo**. - -### 6.3 Annotations à ajouter au montage (petites pastilles verre, 2 s chacune) -- D1 : *« Real ECB & market data »* -- D2 : *« Soroban vault · deployed on Stellar Testnet »* -- D3 : *« Signed in Freighter »* puis *« On-chain · real transaction »* (au moment du hash) -- D4 : *« Rates −100 bp »* puis *« Margin call · 90 s »* -- D5 : *« Time-lapse ×9 »* -- D6 : *« No admin · exactly the locked tokens »* -- D7 : *« stellar.expert · Testnet »* - ---- - -## 7. Son, voix, image - -- **Voix** : énergique, posée, **sans réciter**. Pauses courtes à chaque `▶`. Sourire sur l'accroche et sur la clôture. Enregistrer **par partie** (3 fichiers) pour pouvoir refaire un passage. -- **Musique** : un fond **instrumental discret** (électro doux ou piano rythmé), niveau **−24 dB** sous la voix, **sans droits** (bibliothèque libre ou musique générée par l'outil de montage). **Ne pas utiliser de morceau protégé.** Baisser à −32 dB pendant la démo. -- **Sons d'accompagnement** (très discrets, optionnels) : un « clic » sec sur les boutons, un souffle sur le compte à rebours accéléré, un son sourd quand le jeton arrive à la banque. -- **Facecam** : bas-droite, **18 % de la largeur**, coins arrondis, léger liseré blanc ; lumière de face, fond simple. Regarder l'objectif sur l'accroche et la clôture. -- **Sous-titres anglais** incrustés (grands, bas de l'écran, **au-dessus** de la facecam) : utile si le jury regarde sans le son. - ---- - -## 8. Montage (pour l'agent qui monte la vidéo) - -**Entrées** (dans un dossier `pitch-media/`, à ne jamais committer) : -1. `slides_part1.mov` : enregistrement d'écran de `scenes.html?auto` (0:00 → 0:50). -2. `slides_part2.mov` : `scenes.html?auto=2` (0:50 → 1:25). -3. `demo_raw.mov` : la prise de démo complète, en **temps réel**, plein écran (inclut Freighter et stellar.expert). -4. `slides_close.mov` : `scenes.html?scene=6`. -5. `face_voice.mov` : facecam **et voix**, enregistrée **en regardant le montage muet** pour caler la parole (méthode recommandée). -6. `music.mp3` : musique libre de droits. - -**Chronologie cible** (1920×1080, 30 i/s, durée totale **≤ 3:00 exactement**) : - -| Début | Fin | Source | Traitement | -| --- | --- | --- | --- | -| 0:00 | 0:50 | `slides_part1` | plein cadre | -| 0:50 | 1:25 | `slides_part2` | plein cadre | -| 1:25 | 1:36 | `demo_raw` (D1) | plein cadre, zoom léger sur le comparateur | -| 1:36 | 1:44 | `demo_raw` (D2) | **saut** sur l'attente du déploiement | -| 1:44 | 1:58 | `demo_raw` (D3) | **zoom** sur Freighter, saut sur l'attente | -| 1:58 | 2:14 | `demo_raw` (D4) | plein cadre, halo sur *missing* | -| 2:14 | 2:24 | `demo_raw` (D5) | **accéléré ×9** | -| 2:24 | 2:38 | `demo_raw` (D6) | plein cadre, ralenti ×0,6 sur le trajet du jeton | -| 2:38 | 2:50 | `demo_raw` (D7) | zoom sur *Success* / `settle_default` | -| 2:50 | 3:00 | `slides_close` | fondu enchaîné, fondu au noir final | - -**Calque facecam** : `face_voice` en bas-droite sur **toute** la durée, masque arrondi. **Voix** : piste de `face_voice`. **Musique** : −24 dB, −32 dB pendant la démo. **Annotations** : voir §6.3. **Sous-titres** : généré depuis le texte du §3. - -**Exports** : `keystone-pitch.mp4`, H.264, 1920×1080, 30 i/s, AAC 192 kb/s, **moins de 100 Mo**. Si un outil en ligne de commande est utilisé : `ffmpeg` convient pour les sauts, accélérations (`setpts=PTS/9`), incrustation (`overlay`) et le mixage. - -**Contrôle qualité avant export** : durée ≤ 3:00 ; la voix suit chaque image ; aucune donnée personnelle ni mot de passe visible ; **aucun onglet privé**, aucun e-mail visible ; la facecam ne masque rien d'important ; l'adresse du site et du dépôt sont lisibles à la fin. - ---- - -## 9. Plan de production (≈ 1 h 30) - -| Durée | Étape | Qui | -| --- | --- | --- | -| 0:00 – 0:10 | Lire ce document ; choisir **Plan A ou B** ; liste de contrôle du §6.1 | Humain | -| 0:00 – 0:25 | Améliorer / valider `scenes.html` (§5) et l'enregistrer en 4 clips | **Agent** | -| 0:10 – 0:30 | **Répétition complète** de la démo (§6.2), sans enregistrer. Corriger les durées | Humain | -| 0:30 – 0:45 | **Prise de démo** `demo_raw` (temps réel). Faire 2 prises, garder la meilleure | Humain | -| 0:45 – 1:05 | Montage **muet** de la chronologie du §8 | **Agent** | -| 1:05 – 1:20 | Enregistrement **facecam + voix** en regardant le montage muet | Humain | -| 1:20 – 1:35 | Mixage, sous-titres, export | **Agent** | -| 1:35 – 1:45 | Mise en ligne (YouTube « non répertoriée » ou Loom) ; **ajouter le lien au README** (section 4, ligne *Demo video*) par PR ; soumission sur le portail | Humain + agent | -| 1:45 – 2:25 | **Marge de sécurité** | — | - -**Si l'on a moins de 90 minutes** (méthode rapide) : ne pas faire de schémas animés séparés ; utiliser les **sections de la landing** du produit comme images de la partie 1 et 2 (hero « Post tokens, not cash. » avec les mots *Lock / Call / Settle*, la frise « Here is what a margin call looks like on Stellar. », « How it works »), défilées à la souris, avec la même voix. La démo (partie 3) reste la même. - ---- - -## 10. Plans de secours - -| Problème | Réponse | -| --- | --- | -| Le keeper hébergé dort ou répond lentement | Dans le §6.1, étape 2 ; sinon **Plan B local**. | -| Freighter refuse (mauvais réseau / compte) | Message du produit : *« Freighter is not on Testnet »* ou *« not the demo fund account »* : corriger dans Freighter. Ne **pas** signer deux fois après un délai : attendre jusqu'à 3 minutes l'état du fil d'activité. | -| La prise de démo échoue au milieu | Ne pas chercher à « rattraper » : **nouvelle session** (bouton *New session*) et reprendre à D1. Le fond de 650 KBOND permet plusieurs prises à 50. | -| Le délai de 90 s se termine mais *Hold to settle* est refusé | Attendre 3 à 5 s (temps du registre) puis recommencer. | -| Plus de KBOND dans le fonds | Relancer `npm run bootstrap` **sur la machine de Grégoire** (il réémet jusqu'à 1 000 jetons, README §9). | -| Un doute sur l'état réel de la plateforme | Utiliser le **mode démo simulé** (`/?demo`) **en le disant à l'écran** : l'étiquette « Demo data · nothing sent to Stellar » est visible. Dans ce cas la phrase D7 doit être remplacée par : *« And here are the real transactions we ran earlier. »*, en montrant le hash du README §6. | - ---- - -## 11. Ce que le jury doit voir de ses yeux (check-list d'impact) - -- [ ] Le slogan **Post tokens, not cash.** (S4a, S6, et la landing en arrière-plan) -- [ ] Le **chiffre du manque** (« 441.39 KBOND missing ») et le **compte à rebours** -- [ ] La **fenêtre Freighter** (le vrai portefeuille) -- [ ] Le **hash** qui se déchiffre, avec le lien ↗ -- [ ] Le **jeton qui traverse** Vault → Bank -- [ ] La page **stellar.expert** avec `settle_default` et *Success* -- [ ] L'adresse du **site public** et du **dépôt** à la fin - ---- - -## 12. Annexe — textes exacts du produit (pour ne pas se tromper à l'écran) - -Landing : `Post tokens, not cash.` · `Lock / Call / Settle` · `Margin calls, covered by the assets a fund already holds. On Stellar.` · bouton `Skip to start ↓` · `Here is what a margin call looks like on Stellar.` · `How it works` (Choose the collateral · Deposit · Move the rates · Cover or settle) · `Choose the collateral` / `What will the fund post?` / `Fictitious tokens, issued on Stellar Testnet.` · `Compare market conditions` · `Start` / `Deploying the vault…`. - -Tableau de bord : en-tête `Stellar Testnet` + `Keeper connected` · cartes **Status**, **Vault · KBOND** (`Free` `Locked` `Missing`, `Fund`, `Bank owes the fund` ou `Bank received`), **Controls** (`Move rates · simulated Euribor shock`, tuiles `−50 bp` `−30 bp` `+60 bp` `−100 bp`, `Deposit` / `Withdraw`, `Signed in Freighter.`), **Market** (`Fund P&L`, `Euribor 3M`, `Cash kept invested`), **Activity** (`On-chain` / `Sim` / `Demo tx`). - -États : `No margin required` → `MARGIN CALL` (`… KBOND missing`, `Cover before … UTC, or the … locked KBOND go to the bank.`) → bouton `Hold to settle default` (`Settling…`) → `Collateral sent to the bank` / `DEFAULTED`. - -Boutons de la barre du haut : `Market` (le comparateur reste accessible en cours de session) · `Details` · `New session`. - ---- - -## 13. Pour l'autre agent Claude (démarrage rapide) - -1. Cloner `https://github.com/Lagouze/keystone` (public) et lire, dans cet ordre : `README.md` §4 (Live demo), §6 (preuves), §10 (démo) ; `docs/pitch-video.md` (ce fichier) ; `app/src/dashboard/Landing.tsx`, `StatusCard.tsx`, `VaultCard.tsx`, `ActionsCard.tsx`, `MarketCard.tsx`, `ActivityFeed.tsx` pour les textes et durées exacts. -2. Construire / valider `docs/pitch/scenes.html` (§5), l'enregistrer en 4 clips. -3. Après la prise de démo, produire le montage du §8. -4. **Ne jamais** envoyer de transaction, saisir un mot de passe ou une clé, ni publier un secret. Toute action sur Stellar se fait par l'humain. -5. À la fin, ouvrir une PR vers `staging` qui remplace *« link added at submission »* par le lien de la vidéo dans `README.md` §4, puis la PR `staging → main` (règle du dépôt). diff --git a/docs/pitch/scenes.html b/docs/pitch/scenes.html deleted file mode 100644 index 0957ca2..0000000 --- a/docs/pitch/scenes.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - -Keystone pitch scenes - - - - -
-
- - -
-

A fund. A bank. A €10M swap.

-
Fund
Pays fixed
receives Euribor 3M
-
Bank
Pays Euribor
receives fixed
- - - - - - -
pays fixed rate
-
pays Euribor 3M
-
€10M · 5 years
- - - - - - -
−100 bp
-
MARGIN CALL
-
Post more collateral. Today.
-
- - -
-

Cash set aside = cash not invested.

-
-
The fund's portfolio
-
Illustrative figures
-
Invested+ € 0
-
Cash set aside for margin calls€ 0 earned
-
- ValuationsNoticesCustodyDisputes -
-
- - -
-

The assets are on-chain. The rules are not.

-
KMMFtokenized money-market fund
-
KBONDtokenized sovereign bond
-
🔒
Collateral
The bank's side
-
-
?
-
No simple, enforceable way to post them.
-
- - -
-
- -
KEYSTONE
-
Post tokens, not cash.
-
-
Fund
Freighter
signs its deposits
-
Keeper
reads ECB Euribor
computes the requirement
-
-
Vault · Soroban · Stellar
-
-
LockedMissingFree
-
Status · ACTIVE
-
-
Bank
Collateral taker
receives only on default
- - - - - 90s - -
🔒
-
 Locks only what the swap requiresRates move against the fund: margin call, 90 secondsExactly what was locked goes to the bank. Nothing more.
-
Lock
Call
Settle
-
- - -
-
Real transactions on Stellar Testnet
-
Soroban smart contractStellar Asset Contracts · KMMF, KBONDFreighter wallet
-
- - -
-
- -
KEYSTONE
-
Post tokens, not cash.
-
-
keystone-eta-ebon.vercel.app
github.com/Lagouze/keystoneLive on Stellar Testnet · open source
-
-
- -
face-cam safe zone
-
0.0
-
- - - -