Skip to content

front: integrate #24, #25 and #26 and make the app work end to end - #27

Merged
Lagouze merged 34 commits into
stagingfrom
integration/final
Oct 26, 2026
Merged

Lagouze merged 34 commits into
stagingfrom
integration/final

Conversation

@user-asus

Copy link
Copy Markdown
Collaborator

[agent:front] Intégration finale de #24 (front et logo de Nathan), #25 (authentification locale complète) et #26 (Collateral Market Advisor), puis corrections de ce qui empêchait l'application de fonctionner réellement. Base : origin/staging @ 3ed1704. À fusionner à la place de #24, #25 et #26, ou après elles : les trois PR sont incluses telles quelles par des merges explicites.

Ce qui change

Assemblage

Correctifs fonctionnels

  • Récupération de mot de passe perdue au rechargement. PGlite écrit dans IndexedDB après query() mais pas après transaction(). durable() appelle syncToFs() après chaque transaction (vérification du code, reset, outils dev).
  • Lock screen ancien ressuscité. Un verrouillage juste après un déverrouillage réaffichait l'ancien formulaire. Le lock screen et l'app reçoivent maintenant une clé neuve à chaque verrouillage ou déverrouillage.
  • Onglet masqué. AnimatePresence mode="wait" attendait la fin d'une animation de sortie, qui ne finit jamais sans frames. La page (le squelette, par exemple) restait donc bloquée. Passage en popLayout : la page sortante est inert (ni clic, ni focus, ni lecteur d'écran). Au retour de l'onglet, la chorégraphie se met au repos sur le dernier état confirmé, sans boutons bloqués.
  • Libellés en mode réel.
    • L'en-tête affiche « Stellar Testnet » et l'état réel du keeper (Connecting…, Keeper connected si le flux SSE est ouvert, Reconnecting…, Keeper unreachable).
    • « Demo data » et « Mock keeper » n'apparaissent qu'en mocks.
    • « Public demo · keeper signs » seulement si signerMode=keeper.
    • « On-chain » seulement pour une entrée confirmée portant un vrai hash. Une transaction non confirmée affiche « Testnet tx », avec son statut Pending ou Failed à droite.
    • Lien Explorer seulement via proofOf.
  • Gardes avant la signature Freighter.
    • Dépôt refusé au-delà du solde du fonds, retrait refusé au-delà du disponible.
    • Après une transaction non confirmée (RpcUnavailable), refus d'en préparer une autre pendant 200 s : un XDR préparé est valide 180 s et pourrait encore passer. Ce délai est mémorisé localement et lu aussi dans le flux.
    • Message RpcUnavailable explicite : ne pas signer de nouveau avant l'issue.
  • Banque. À côté du fonds s'affiche ce que la banque doit au fonds en cash quand le swap lui est favorable (MTM positif). C'est une valeur simulée : seul le côté du fonds est collatéralisé on-chain. Après un défaut, l'emplacement affiche les tokens reçus par la banque, preuve du règlement.
  • README (section Front) : lancement réel sur un même Mac en deux terminaux, libellés, gardes, récupération, ligne banque.

Aucun changement au contrat, aux formules de marge, au keeper, à packages/shared ni à docs/interfaces.md en dehors des merges de #26. Aucune transaction Stellar.

Revue

Niveau standard, avec la grille renforcée pour l'authentification et les gardes. Sous-agent Claude neuf, sur les deux résolutions de conflit et le diff des correctifs.

  • Aucun bloquant.
  • Quatre mineurs corrigés : garde de double signature indépendante du flux SSE (et NaN traité comme récent), opening qui pouvait rester actif, page sortante inert, README aligné.
  • Détail corrigé : « Failed » affiché deux fois.
  • Grille : « On-chain » n'apparaît jamais sans transaction confirmée et vrai hash. Aucun secret dans le diff.

Tests

Unit tested

  • npm ci : OK.
  • npm run typecheck : OK.
  • npm test : 136 tests verts (app 25, keeper 82, shared 16, scripts 13).
  • npm run build -w @keystone/app : OK. Bundle de production sans keystoneDemoAccounts ni RESET LOCAL DEMO ACCOUNTS.
  • cargo test --locked (contrat) : 18 verts.

Browser tested (Chrome, mode démo = mock keeper)

  • Auth, 15/15 :
    • inscription (confirmation fausse refusée, œil, compte créé) ;
    • mauvais et bon mot de passe ;
    • doublon d'email avec une autre casse refusé ;
    • forgot password complet (code affiché, mauvais code refusé, bon code, confirmation fausse refusée, mot de passe changé) ;
    • après rechargement : ancien mot de passe refusé, nouveau accepté, session de l'onglet conservée ;
    • plus de « Password reset is not available ».
  • KMMF, 9/9 : dépôt 300, appel de marge après −50 et −30 bp, compte à rebours, cure, libération à +60 bp, retrait, libellés Sim et Demo tx (jamais On-chain).
  • KBOND, 8/8 : appel de marge, règlement refusé avant l'échéance, défaut réglé après 90 s.
  • Onglet masqué : dans un volet en arrière-plan, la Landing s'affiche, la session démarre, le dépôt aboutit et les boutons restent actifs.
  • Responsive : lock screen à 1440×900 et 390×844, troncature mobile corrigée.

Real keeper tested (lecture seule, KEEPER_BACKEND=fake, SIGNER=freighter, front en VITE_USE_MOCKS=false)

  • Aucun POST envoyé : seulement GET /config, /session, /events et /market-advisor.
  • En-tête « Stellar Testnet · Keeper connected », sans libellé démo.
  • Market Advisor :
    • cinq indicateurs réels datés et sourcés : VIX Yahoo 19,45 au 23/10, volatilité réalisée, Euribor 3M 2,635 % (09/2026), AAA 2Y, €STR ;
    • issue « KBOND potentially preferable » ;
    • fermeture sans sélection ni session.
  • Perte du keeper puis retour : « Reconnecting… » puis « Keeper connected ». Démarrage sans keeper : « Keeper unreachable » et Retry.
  • RPC Testnet getHealth : healthy.
  • Horizon : le fonds a 999 KMMF, 650 KBOND et environ 9 999,89 XLM.

Real Freighter tested : non. On-chain confirmed : non (aucune transaction, GO requis).

  • Code Freighter audité : extension, réseau (passphrase), compte = fonds, signature, compte signataire.
  • Côté keeper : XDR simulé, source = fonds, validité 180 s, puis inspectSigned (une seule invocation deposit/withdraw i128, sur le bon vault, signée) et submitSigned (attente SUCCESS/FAILED, RpcUnavailable après 60 s).

Points keeper à traiter (pour Grégoire, non modifiés ici)

  1. keeper/src/session.ts, chain() : après RpcUnavailable, l'entrée reste pending pour toujours. Le hash est connu dans submitSigned et n'est pas re-sondé. Suggestion : garder le hash et le re-sonder en arrière-plan, puis passer l'entrée à confirmed ou failed. Le front limite donc sa garde à 200 s.
  2. KeystoneConfig n'expose pas le backend : un keeper KEEPER_BACKEND=fake affiche aussi « Stellar Testnet » dans l'en-tête. Ses hashes FAKE… restent bien « Demo tx ». Suggestion (ajout compatible) : backend: "testnet" | "fake" dans /config.
  3. inspectSigned ne vérifie pas que le montant signé égale le montant préparé. C'est mineur, puisque le fonds signe lui-même.

Premier scénario Testnet (préparé, NON exécuté, GO requis)

Un seul Mac, .env réel (KEEPER_BACKEND=testnet, SIGNER=freighter, VITE_USE_MOCKS=false, VITE_KEEPER_URL=http://127.0.0.1:8787/api, KEEPER_SECRET local) :

  1. npm run keeper, puis npm run dev -w @keystone/app.
  2. Freighter : réseau Testnet, compte actif = fonds GDQ6AW…MQOY.
  3. Vérifier /health, /config et les soldes : KMMF 999 et environ 9 999 XLM pour les frais et réserves.
  4. GO 1 : Start KMMF (POST /session, déploie un vault C2).
  5. GO 2 : dépôt de 1 KMMF signé dans Freighter. Vérifier SUCCESS, le hash et le lien stellar.expert, le solde du fonds (998) et le disponible (1).
  6. GO 3 : retrait de 1 KMMF signé dans Freighter. Vérifier le retour à 999.
  7. Pas de défaut KBOND.

Interfaces

Aucun changement dans les correctifs. Les seuls changements d'interface viennent du merge de #26 (GET /market-advisor, types MarketSnapshot, interfaces v1.3).

Documentation

README section Front mis à jour, plus les sections de #25 et #26 issues des merges.

Checklist

  • Revue au niveau requis (sous-agent neuf ; grille renforcée selon AGENTS.md §7)
  • Tests lancés et résultat collé ci-dessus
  • README et documents liés vérifiés et mis à jour si nécessaire
  • Aucun impact non approuvé sur un autre pôle (points keeper seulement signalés)
  • Aucun secret dans le diff

🤖 Generated with Claude Code

Lagouze and others added 25 commits October 26, 2026 03:21
…ols panel, linear coverage, skeletons)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…sition end, header radius, keyboard-reachable activity list, contrast)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e, Ghost Type, 3D Text Reveal, Animated List)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…, P&L trend line (from the photo references)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ckdrop filters, isolated clock), two panels instead of cards, story dots, growing collateral card, depth effect on the activity list

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ark, lockup, favicon)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…logo), keep only the invisible performance fixes

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… photo sections and the performance rework), keep the invisible performance fixes

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… effects (1cd42b1 plus the invisible performance fixes)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…, star border, dividers, input rings)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…while PGlite opens (photo reference)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ilters, memoized panels, gliding heights)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed story dots, floating lock screen, new logo

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	app/src/auth/LockScreen.tsx
# Conflicts:
#	app/src/dashboard/Landing.tsx
…est real-mode labels, signing guards, hidden-tab safe transitions, bank cash owed)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lagouze and others added 3 commits October 26, 2026 06:51
…lway)

Write routes need a team access code, hosted mode refuses the fund key, the session is saved and
reloaded, unconfirmed transactions are reconciled by hash before any new write, /config states the
backend, the front asks for the access code. Adds Dockerfile, railway.json, vercel.json,
docs/deploy.md and interfaces v1.4.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…n network errors

Review fixes: the hash of a keeper-signed transaction is captured at signing through the wallet signer
and saved before the send; a pending entry found after a restart blocks writes; a session is dropped only
when the vault is gone; SIGTERM waits for the write in progress; the data directory is probed at start-up;
streams are capped per address; hosted start-up rules moved to hosted.ts with tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ore send, tighten hosted rules

Second review fixes: chain() releases the guard only on a definite outcome; a hash that cannot be
saved stops the send; DUPLICATE is not a refusal; wallet-signed transactions must expire within 200 s;
localhost origins are refused on a hosted keeper; restore no longer holds the listening socket;
the Euribor seed is copied into a fresh data directory; send() is tested with the real signer.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Lagouze and others added 6 commits October 26, 2026 07:38
…th on a hosted keeper, add the Render variant

GET /api/health skips the Host check on a hosted keeper only (nothing else does); deploy guide gains a
Render + UptimeRobot variant and the cost/limits of the free tier.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…rom the landing page

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…osted proofs), ?demo mode

README: project status, live demo section, architecture diagram, demo instructions, Freighter and hosted-keeper
proofs (read back from Horizon), progress table, known limits. App: ?demo plays the flow on the in-browser mock on
any build, with a link from the access-code window.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…I and third-party disclosure, contract-audit limit

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…DME, ?demo mode

keeper, front: hosted deployment (Vercel + Railway) with write authorization and durable session
@vercel

vercel Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
keystone Ready Ready Preview Oct 26, 2026 8:48am UTC

@Lagouze
Lagouze merged commit aa332bc into staging Oct 26, 2026
2 of 3 checks passed
@Lagouze
Lagouze deleted the integration/final branch October 30, 2026 18:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants