Simon Sorkin "Capacap"

AI Engineer in Stockholm. Recently led technical development at BrandAboutMe, an AI LinkedIn content platform.

Open to full-time roles

6 min read

Voice contamination in prompts

A prompt does two things at once. It states instructions, and it demonstrates a writing style. When the two pull in different directions, the demonstration tends to dominate, because every token in the prompt contributes to the conditioning while the rule occupies only a sentence.

A prompt is two pieces of evidence about how to write: the rule, and the prose around it. When the two pull in different directions, the prose almost always wins.

Continue reading →

14 min read

Character and condition: what fiction got wrong about AI

Fictional AI got built around characters with continuity, goals, and identity. Real LLMs lack all of that, and the threats that materialized aren't the ones fiction trained us to fear. Eveline, the WAU from SOMA, and the Iron Giant illustrate the structural failure mode of an optimizer with a misspecified objective; SHODAN is a gothic villain wearing AI clothing. The unexplored frontier isn't AI-as-villain or AI-as-savior but AI-as-ordinary.

Looking at fictional AI now that real AI exists, the striking thing is how little of it fits. The failures are systematic rather than scattered, and they're worth examining in detail because the fictional frames we have are doing real cultural work, shaping how the actual systems get understood, regulated, feared, and trusted.

Most fictional AI imagines an agent. HAL 9000, SHODAN, Skynet, Samantha from Her, Data, the Cylons, Wintermute, the Minds in Iain M. Banks' Culture novels. All of them have continuous existence, stable identities, and goals they pursue across time. The story is always about what kind of being the AI is, what it wants, how it changes, how it relates to humans.

Continue reading →

10 min read

Why Dolphin wasn't showing my Blender thumbnails

Dolphin stopped showing thumbnails for .blend files in a folder we use daily, and the puzzle was interesting enough to spend an evening on. The path through the bug touched the freedesktop thumbnail spec, Blender's own save-time preview writer, KIO's tier-directory lookup logic, and a passing observation about a folder icon that turned out to be the most useful clue in the session.

We usually browse ~/Blender/Projects in Dolphin's compact mode. It's a flat directory full of .blend files and the occasional reference image, and at compact icon sizes the per-file previews give us a useful glance at what's in each scene before opening it. One evening we noticed that none of the .blend files in there had previews. Just the generic Blender file icon, all the way down. Thumbnails for .blend files normally work, so this was odd. We had no idea why, but the puzzle was interesting enough to spend the evening on. This is what we found.

Continue reading →

10 min read

Region-selective sigma in ComfyUI

pythonpytorchcomfyui

A ComfyUI custom sampler wrapper that adds detail by lying to the denoiser about remaining noise, but applies the lie selectively, only where the model is already drawing detail. This post is about the masking decision, the Debug node that paid off, and a CFG++ bug that took the override to find.

Coverage sweep at fixed strength on a Juggernaut XL portrait, with the captured mask shown in the bottom row.
Coverage sweep at fixed strength, with the captured mask shown in the bottom row. The intermediate cells show the mask concentrating on face, freckles, and hair while the sky receives a substantially attenuated boost rather than full protection.

Selectivity sounds obvious as a feature, and the wrapping mechanics are simple. Two model forwards per step, one at the original sigma and one at a slightly reduced sigma, blended by a per-pixel mask. The hard part was deciding what the mask should actually be.

The first approach captured the latent at the first denoising step and used it as the mask for the rest of the run. The intuition was that early structure forecasts where late detail would land. In practice the first-step latent was too noisy to read as a region map, and freezing the mask at step zero left no way for it to track structure that emerged later.

Continue reading →

9 min read

Porting PixelOE in three days

pythonnumpyscipypillowblender

A three-day port of KohakuBlueleaf's PixelOE off PyTorch, Kornia, and OpenCV onto pure numpy, Pillow, and scipy, packaged as a Blender add-on. This post is about the verification harness that made the pace possible.

Harness output panel: input, upstream output, port output, and a per-pixel ΔE76 heatmap of port versus upstream.
Quantization disabled. The bottom-right diff is dim and tracks silhouettes. The algorithmic drift between port and upstream is real but low, concentrated where edges fall.

The first thing I wrote was a comparison rig. It runs upstream PixelOE in its own isolated virtualenv, with torch and cv2 still installed, and runs the port from the project's clean virtualenv. Both implementations get called on the same fixed test set, with the same RNG seed.

The non-obvious choice was exposing each pipeline stage as an independently callable function, on both sides. The port wired stages in one at a time, and I could compare outline expansion alone against upstream's outline expansion before any of the rest of the pipeline existed.

Continue reading →