LS0/100Chargement
Aller au contenu
Llavisahu
Contact
Des plans qui tiennent. Des supply chains qui ne cillent pas.
Dites bonjour ✦ContactContact
AccueilTravailBibliothèqueVoyagesJeuxLabBlogÀ propos
LinkedInGitHubEmail
© 2026 Lavi Sahu
07Lab — journal de construction

Je construis ce site comme je voudrais qu'un fournisseur d'IA construise un système de planification : montrer le diff, pas le pitch.

Lab — open source

Huit dépôts, pas une maquette

Du code public qui fonctionne, pas une slide de portfolio : des outils de planification supply chain, un système de config IA, une appli de dictée vocale hors ligne, et le design system avec lequel cette page même est construite. Choisissez une carte pour voir ce qu'elle fait vraiment.

Explore GitHub @LaviSahu
Resilience Radar — Python (stdlib only) — self-contained HTML dashboard
View on GitHub →

Supply chain resilience control tower — risk radar, what-if simulation (time-to-recover / time-to-survive), and mitigation ranking. No dependencies to install; the dashboard is one self-contained HTML file.

git clone https://github.com/LaviSahu/resilience-radar.git
What the code actually does
# risk_score = likelihood(1-5) * impact(1-5), range 1-25.
TIER_THRESHOLDS: list[tuple[int, RiskTier]] = [
    (20, RiskTier.CRITICAL),
    (12, RiskTier.HIGH),
    (6, RiskTier.MEDIUM),
    (1, RiskTier.LOW),
]

def likelihood_score(event: Event, classification: Classification) -> int:
    """1-5, from event confidence (0-1) plus a source-reliability adjustment."""
    base = event.confidence * 5
    adjustment = SOURCE_RELIABILITY_ADJUSTMENT.get(classification.source_category, 0)
    return _clamp(base + adjustment, 1, 5)

src/resilience_radar/scoring.py — classic likelihood × impact risk scoring, plus a per-source reliability adjustment (geopolitical/regulatory signals score noisier than, say, a supplier or logistics event).

Lab — journal de construction

Registre de vérification — ce qui précède, et comment chaque morceau a été réellement vérifié

Vu par des yeux humains

Every animation on the rebuilt pages

The merge-conflict resolutions of 2026-09-19

Lu, pas exécuté

The twin's system prompt

Each repo description (2 of 8 carry verbatim code excerpts)

Personne n'a vérifié

Everything the twin tells you

Whether anyone has ever used these repos

La troisième colonne est celle qui est honnête. Elle ne se vide que quand le manque se vide — pas avant.

Lab — journal de construction

Ne me croyez pas sur parole — bougez les leviers.

Trois outils en direct — simulateur de scénarios, calculateur de stocks, graphique de l'effet coup de fouet. Pas de slides, pas de vague : chaque chiffre est calculé dans votre navigateur pendant que vous bougez les leviers.

Lab — journal de construction

Une vraie fonctionnalité IA, pas une maquette

Ce n'est pas un chatbot embarqué. C'est une Cloudflare Pages Function qui appelle Workers AI directement — verrouillée sur ce domaine, limitée en débit par IP, avec un prompt système qui lui dit de répondre « je ne sais pas » plutôt que d'inventer un nom de client ou un chiffre. Demandez-lui quelque chose sur le S&OP ou la planification des stocks.

Demandez à mon jumeau IA

non vérifié

Une démo : un modèle de langage avec un court prompt dans ma voix. Il peut se tromper en toute assurance — n'agissez pas sur ce qu'il dit. Demandez-lui des choses sur le S&OP, l'IBP, o9, les stocks.

Posez n'importe quelle question sur la planification. Le jumeau répond dans ma voix.

Auto-évaluation du jumeau — Ton : proche. Faits : non vérifiés par qui que ce soit, moi compris. Modèle : @cf/meta/llama-3.3-70b-instruct-fp8-fast, plafonné à 512 tokens, invité à dire « je ne sais pas » plutôt que d'inventer un nom de client ou un chiffre. Un garde-fou, pas une garantie.

Généré par IA · ne remplace pas le vrai Lavi

Lab — journal de constructionFusionné, pas livré.

Journal de construction — 2026-09-19

Lab — journal de constructionrefkit

Refkit — 28 ports, 1 in production

Every card below is a real VengeanceUI port — working code, not a screenshot. Exactly one of them, VeCreepy, is actually load-bearing right now: it's the Connect link in this site's own footer. The other twenty-seven are verified to render, not yet asked to carry a real page's weight. Same rule as the build log above — a component only counts as shipped once it's doing a job, not once it looks good in a gallery.

Lab — essays

Five frameworks, worked through properly

Not case studies from my own client work — original, research-driven essays on real named frameworks and formulas (bullwhip ratio, TTR/TTS resilience, the Kraljic matrix, Theory of Constraints, digital twins), each grounded in a cited real source, not invented. Pick a card for the summary, or read the full essay.

For the fuller story behind the bullwhip math — two 2000s-era factory fires and what they cost — see Buffer Shock, on the Blog →

Simulateur de scénarios S&OP

En direct

Bougez les leviers qu'un planificateur contrôle vraiment — regardez les arbitrages bouger en temps réel. Modèle illustratif.

0%
100%
95%
4 sem
Niveau de service projeté90.5%
Utilisation de la capacité100%
Indice de stock (plan = 100)100
Risque d'obsolescence0%

Point de fonctionnement équilibré. Le service tient près de la cible avec un stock et une utilisation dans une plage saine.

Ce que ça cache : un SKU, une ligne, une saison. L'obsolescence ici est un proxy, pas un modèle de dépréciation. La version pour laquelle je suis payé a un plan de demande qui se dispute avec la baseline statistique — cette dispute est là où l'arbitrage se règle vraiment.

Optimisation des stocks

En direct

EOQ (quantité économique de commande), stock de sécurité et point de commande à partir de vos propres chiffres — les maths derrière chaque politique de réapprovisionnement.

4,767
EOQ (unités)
563
Stock de sécurité
5,183
Point de commande

Commandez environ 4,767 unités, 25.2× par an. Repassez commande à 5,183 en stock — en portant 563 unités de stock de sécurité pour tenir un niveau de service de 97% sur un délai de 14 jours.

Ce que ça cache : σ est la variabilité journalière de la demande, pas l'erreur de prévision — la version de production utilise l'erreur de prévision, plus grande et moins polie. Le z vient d'une table de dix lignes, pas de la courbe normale complète. Et 97 % n'est qu'une cible — vérifiez si le stock de sécurité est dimensionné pour le niveau de service que vous avez réellement promis.

Visualiseur de l'effet coup de fouet

En direct

Une petite oscillation au rayon devient une tempête en amont. Regardez la variabilité de la demande s'amplifier étage par étage. Modèle illustratif.

20%
4
100Détaillant120Distributeur144Grossiste173Entrepôt régional

Les petites variations de demande au rayon s'amplifient en grandes variations de commandes en amont — à l'étage 4 (Entrepôt régional), un CV de 20% devient un indice de commande de 173. La visibilité de la demande, des délais plus courts et le lissage des commandes amortissent le fouet.

Ce que ça cache : chaque étage multiplie l'amplitude par un-plus-CV — un modèle pédagogique, pas une simulation. Les vrais coups de fouet, ce sont les rationnements joués et les commandes groupées. Les amortisseurs de la note sont ceux qui survivent au contact d'un vrai carnet de commandes.

> cat build-log.md

Cinq branches de fonctionnalités — Home, Work, Library, Travel, Games, About, 404 — chacune construite indépendamment sur environ deux semaines, restées non fusionnées. Aujourd'hui elles sont devenues une seule branche : cinq commits de fusion, trois nécessitant une résolution manuelle de conflits — tous dans le même fichier, tous résolus en gardant les deux côtés, un vrai bug d'import dupliqué repéré et corrigé avant de pouvoir partir en production.

Ce qui a failli se perdre : 207 fichiers et environ 10 Mo de travail antérieur — nouveaux composants d'animation, un rig de démontage image par image, une build 3D avec ses deux bugs connus corrigés, l'ancêtre de cette page même — n'avaient jamais été commités. Posés dans un dossier sur un seul portable. Réglé avec une commande ; à un mauvais git clean près, tout pouvait disparaître.

Ce qui reste ouvert : le pipeline qui a fait ce travail sait compiler le site et relire son HTML, mais ne sait pas rendre un seul pixel. Chaque animation de cette page, et des quatre pages d'avant, est pour l'instant vérifiée par la relecture de code et des yeux humains — pas par ceux d'une IA. Ce manque est écrit ici exprès, pas lissé.

Auto-évaluation — Planification : 8/10 (une spec existait et a été suivie). Vérification : 4/10 (la QA visuelle est bloquée dans cet environnement — un vrai manque, divulgué, pas caché). Décisions prises sans demander d'abord : plusieurs (le nouveau plafond de bundle, le style de résolution des conflits de fusion, le commit du travail antérieur non commité) — toutes réversibles, aucune poussée en production.

Prochaine entrée, pas encore écrite : donner des yeux au pipeline — un navigateur headless dans la CI qui rend les animations de cette page et diff chaque image contre la dernière connue comme bonne. Si ça arrive, le score de Vérification ci-dessus bougera. Sinon, cette ligne restera, sans date, comme reçu.

refkit · VengeanceUI ports

The port wall

28 components ported from the VengeanceUI registry to plain POP-token CSS — every demo below is live. The heavy WebGL pieces wait until you scroll to them. Tap a card's name for what it demonstrates and its real-vs-demo status.

VeAnimatedTooltipVengeanceUI port
What is this?
VeMaskedAvatarsVengeanceUI port
  • Ada
    Ada
  • Bram
    Bram
  • Cleo
    Cleo
  • Dario
    Dario
  • Esme
    Esme
VeDiagonalCarouselVengeanceUI port

Harbor Line

Kiln Study

North Pier

Paper Hills

Tidal Steps

VePerspectiveCarouselVengeanceUI port

Harbor Line

Kiln Study

North Pier

Paper Hills

Tidal Steps

VeImageTrailVengeanceUI port
VeStatsCounterVengeanceUI port
0ports
0batches
0new deps
VeInteractiveBookVengeanceUI port

Porting Notes

refkit

Porting Notes

Interactive Edition

1

Why port

Each piece starts as a registry component and lands here as one TSX file plus a CSS batch.

2
2
3

Token pass

Tailwind classes go first, swapped for POP tokens: ink outlines, hard shadows, cream ground.

4
4
5

Motion pass

Springs move to motion/react and every animation learns to sit still under reduced motion.

6
6

The End

Click to Open
VeScrollDissolveRevealVengeanceUI port — WebGL, mounts on scroll
VeLineHoverLinkVengeanceUI port
Slide underlineArc underlineScribble underline
VePerspectiveGridVengeanceUI port
VeImageRevealListVengeanceUI port
  • Field Notes on Slow Mail01Field Notes on Slow MailEssay
  • The Torii Trail at Dawn02The Torii Trail at DawnTravel
  • Shipping a Type Foundry03Shipping a Type FoundryInterview
  • Notes from the Night Market04Notes from the Night MarketPhoto
VeTeamRevealGridVengeanceUI port

The people behind the product

Meet the team

A small, multidisciplinary team building thoughtful tools for ambitious people.

VeGlowBorderCardVengeanceUI port
glow ring
VeTypingKeyboardVengeanceUI port
VePixelatedImageTrailVengeanceUI port
VeAsciiGlitchRippleVengeanceUI port
VeMorphTextVengeanceUI port
SHIPSHAPESHOW

one word morphs into the next

VeLiquidTextVengeanceUI port — WebGL, mounts on scroll
VeAnimatedFooterVengeanceUI port

Refkit

VeImageScatterVengeanceUI port

VeStaggeredGridVengeanceUI port
POP
ExploreProjects
ExploreWriting
ExploreContact
ExploreProjects
ExploreWriting
ExploreContact
ExploreProjects
ExploreWriting
ExploreContact
ExploreProjects
ExploreWriting
ExploreContact
ExploreProjects
ExploreWriting
ExploreContact
ExploreProjects
Builds

Builds

Builds
Notes

Notes

Notes
Reach out

Reach out

Reach out
ExploreWriting
ExploreContact
Built with refkitMore demos
VeCircularGalleryVengeanceUI port
VeVerseCardsVengeanceUI port
Work
Atlas
Nimbus
Vertex
Harbor
Quill
Click the front card to deal it away.
VeGooeyTextRevealVengeanceUI port

Goo in, goo out.

Lines split, blur, and snap back into focus.

VeInteractiveParticlesVengeanceUI port — WebGL, mounts on scroll
VeMusicPlayerVengeanceUI port — dark zone, white-on-glass UI
Paper Signals artwork
Paper Signals
Refkit Radio
VeBooksShowcaseVengeanceUI port — WebGL, mounts on scroll
VeCreepyVengeanceUI port
Don't hoverDon't hover
btn-ve-pophand-made — refkit-vengeance.css