A stopped Lenis still eats the wheel
You opened a full-screen menu, stopped the page's smooth scroll, and now the menu itself will not scroll. Nothing is broken. Lenis is doing exactly what it says.
// 4 notes written here · 18 threads with a test
Short, opinionated and runnable. The notes are things that broke while we built vorluno.dev and what held afterwards; the threads are repositories with a claim in the title, the argument in the README and a test that makes it true — clone it, run it, disagree with it.
You opened a full-screen menu, stopped the page's smooth scroll, and now the menu itself will not scroll. Nothing is broken. Lenis is doing exactly what it says.
A canvas effect that runs at 60 fps on a laptop can still hang a phone — not because it draws too often, but because it rebuilds too often, on the one thread the browser cannot spare.
The fix was in production for seven hours and the client kept seeing the bug. The CDN was doing exactly what we had asked it to do the day before.
Generated OpenGraph images fail silently when the font you serve to browsers is not a font the image renderer can parse. The fix is a second copy of the font — in a format the site never ships to users.
It is one you cannot compare. The action degrades to "ask a human" every single time, nothing errors, and nobody reports it — because asking a human is exactly what a careful system is supposed to do.
Reusing one signal for a second, similar question works right up until the two answers stop agreeing — and they stop agreeing on the case the gate was built for. The symptom is a check that is correct about everything except what matters.
And the check that is supposed to prove it — break the code, see if the suite notices — lies back at you in a way almost nobody accounts for: a mutation that comes back green is not evidence until you know it changed something.
One switch for the whole agent forces a choice between an agent that is useless and one that is dangerous. Reading a balance can be automatic while issuing a credit note needs approval — in the same agent, in the same turn.
A registry each module reports into cannot see the module that forgot to report — which is the only one you needed it to find. It answers "is everything I was told about classified?", and reports green while an address walks out of an erasure request. A check whose universe is supplied by the thing being checked cannot report an omission.
Around 93% of approval requests are approved without being read. If your defence is that somebody said yes, you do not have a defence. What protects you is that the thing executed is identical to the thing shown, checked again at the moment of execution.
Your balance check is correct. It is also the only door with a lock, in a building with four doors — and the one that gets used at 2 a.m. is the migration script.
A guardrail in the prompt is a suggestion — it is made of the same material as the attack. A guardrail in the function that writes is a wall. The difference shows up the moment the model is talked into something, and the wall does not try to win the argument.
Six situations that need six different people to do six different things, compressed into one bit. The owner reads "it did not run" and cannot tell whether to change a switch, grant a role, configure a ceiling — or do nothing at all, because it already happened.
It compiles. The unit tests pass. Two tenants, both correct. And then a background job borrows a connection and reads somebody else's rows — with the policy applied, not bypassed.
Forbidding modifications is right, and it holds until the day you need to fix an entry that is wrong — and discover your own rule standing in the way of a correction everybody agrees with. What happens next in most systems is a "temporary" admin script with the constraint switched off. From that day the table is append-only in prose only.
Deriving the idempotency key from the turn, the request or the run looks reasonable and silently deletes the second legitimate action of the same turn. And there is a second decision nobody writes down — where the key is checked — that duplicates instead of losing.
If a model can emit an id, a hostile message can decide which record you act on. If it can only emit search terms, the worst an injection achieves is finding nothing — and the version that would let it through does not compile.
Two hand-written clients drift. Generate both from one schema and they stop drifting — the drift moves into the generator, where a single missing line is wrong in every language at once, quietly. Then it moves one place further, into the test that was supposed to catch it.
A soft delete satisfies the right to restrict processing. It does not satisfy the right to be forgotten — and in a database with backups, deleting for real is not something you can do at all. The test is the restore.
The exit code of a pipeline is the exit code of its last stage. A check that ends in | tee log.txt or | head -5 reports success no matter what happened on the left, and the error is printed right there in the green job.
Thirty days of notice, a changelog entry, a clean removal — and a live Approve button that can never work again, because the thing it would run was frozen against a contract you just deleted. Then somebody patches the error away, and it starts issuing four thousand dollars where forty were asked for. A proposal cannot outlive the contract it was frozen against — so either it expires first, or the
You declared which files are public. You wrote a check that they do not import anything private. It passes. The tree it approves does not compile.