Burak Köken

A veteran developer's honest ledger.

The machine that says no

“No candidate, no citation, no doc changes.”

That is a verdict. Not a failure: a verdict. An AI wrote it, about a video it had just watched, and nothing it could say would have pleased me more. This post is about the machine that produced those three lines. The machine that says no.

The problem

I watch a lot of YouTube. I said that in the first post. What I did not say is what the watching was for.

A long-running research project of mine is about discovering new ways to trade things with Open, High, Low, Close and hopefully Volume figures. I like to have my options open: Stocks, Funds, Crypto, Forex, Futures, Gold, Currency Pairs, Commodities.

The 0. rule of the project: It will not use the traditional technical analysis tools. Never. Thank you Mr. Asimov, for the idea of a Zeroth Law.

I had high hopes. The project goes out to read research papers, blogs, investors bragging about overnight richness, pictures in front of Ferraris. But at one point, one of the frontier AI models told me, it cannot help me with alpha discovery. It took a while for this to sink in. It was telling me, in polite terms, that I was free to use it to test anything already known, combinations even, but it cannot INVENT anything. Here is a saying from my culture. “Burak’da cahil cesareti var.” Burak has the courage of ignorance. I said, not so loudly, “That’s fine. I will be the inventor.” AI pulls ideas from the world. Tested ideas. Presents them to me and tests them again in ways that are falsifiable. Thank you Mr. Popper, for defining a scientific theory. I look at the idea and try to twist it in the wildest possible ways. The courage of the ignorant. I try the most stupid variations. I’ll tell you when I get rich; it hasn’t happened yet.

Part of the ingestion is video. Trading-education YouTube, specifically, and if you have ever visited that corner of the site you know two things about it: the volume is infinite, and most of it is the same three ideas wearing different suits. The project needed the volume filtered and the ideas extracted. It did not need me, eyeballs on every video, one coffee at a time.

This post is not about what the project found. It is about the machine I built to feed it.

The gate before the download

The machine is an AI session + some Python scripts. It has a name “YouTube Intake Pipeline”, fancy, an AI session named itself. It lives on my AI scaffold/harness, whatever you call it and it is boring in the way good tools are boring. Feed it a link. Or twenty links, from a playlist. It does not download first and ask questions later.

(For the curious, an RTX 5060 Ti with 16 GB of VRAM runs a text and a vision model through ollama locally under the supervision of a cloud frontier model)

The first stage costs pennies: pull the metadata only, the way you read the menu in a restaurant before ordering. The supervisor, the one cloud model in this story, decides from title and duration alone which of two treatments the video deserves. A playlist goes through a curation pass first: skim the titles, drop the known reskins, note every exclusion. Nothing is dropped silently because silent drops are how you lose trust in a machine without ever catching it lying.

Here is the whole machine, before we walk it:

The intake pipeline, one picture: a link enters, the supervisor triages it into rule videos or talk videos, shared extraction pulls transcript and frames, each path is processed by local models or the supervisor, a judgment layer filters, and only the operator's "log it" promotes anything into the project's ledger.

The contract is file names

Only now does the download start. And this is the part I am proud of, because it is made of nothing: plain files, fixed names, on a disk. Ok, I confessed before; my Python is not that great, so you know exactly who wrote the code that produced all these:

meta.json, so nobody has to guess what was processed when. video.mp4 and its subtitle track, the raw material. transcript.txt, the words. A frames folder, sampled stills. frame_descriptions.json, what a local vision model saw in those stills. candidate_extract.json, the structured result. And ANALYSIS.md, which sometimes exists and sometimes does not, for reasons the machine will explain when we get there.

Clear?

No database. No cloud storage. No app. Future me, thirty years from now, will be able to walk into one of these folders and know exactly what happened, because the file names are the whole contract. The names are the interface. Tools come and go. Names on a disk are forever, or at least as forever as the disk.

Why frames at all

Some videos carry their content in words. Interviews, lectures, two people talking. Transcribe them and you have everything. It is like listening to an audio book. Everything is there, almost.

Other videos are sunk: the content lives on the screen, in diagrams and charts and code, and the words only gesture at it: “here we draw the resistance line”. Ugh, where exactly? A transcript-only summary of such a video is a faithful summary of the wrong channel.

So the pipeline samples stills, roughly one every twenty to thirty seconds, and a local vision model describes each frame in text. One real video, a twenty-minute lecture: 41 frames sampled. Another, a six-minute interview: 30 frames, and the vision model reported that only 10 contained any screen content at all. Talking heads. The descriptions are compact text, which matters more than it sounds. The expensive frontier model downstream never watches a second of video. It reads paragraphs.

The measurement

Here is where the machine justified its existence.

The session that runs the intake measured its own savings, on its own files, with standard rulers: a public tokenizer for the text, the image-token formula published by the API provider for the frames. One video, twenty minutes and a bit, already processed, neatly tucked away in some weirdly named folder. Reading the transcript and looking at every sampled frame directly would have cost about 17,271 tokens: 3,871 for the words, 12,595 for the frames, and about 805 for the extraction it would have had to write. The big/expensive brother instead read that extraction ready-made: 805 tokens.

Sixteen and a half thousand tokens saved on one video. Roughly twenty-one to one. The ruler counts tokens, not quality: whether the extraction matches the watching is a different test, and this receipt does not claim it. The surprising part: the transcript is the cheap channel, 3,871 tokens. The 41 frame images were 12,595, nearly three quarters of the whole avoided bill. Everybody worries about the words. The pixels are what eat you. So, next time you capture a screenshot and paste it into a prompt box, remember. Maybe you can describe it in a few words, worth a try? Ok it goes against “a picture, a thousand words”, hey it is YOUR wallet.

Caveats, because this is a ledger and not a brochure: the tokenizer is a stand-in, within about ten percent of the real thing. One video is one data point. That does not bother me. I knew from the start, it would save. I asked it to do the calculations for this article, not when I was developing. I was so sure of my “insight”.

What the machine refuses to do

The local models transcribe, describe, and extract. They never judge. Judgment stays with the supervisor, and the supervisor reads the compact results, not the raw hours: it checks a new candidate against the list of mechanisms the project already knows, it checks who is doing the talking when the channel is big and unfamiliar, and it checks for the flavor of video that ends with somebody’s wallet drained. Three exits: reject, queue as candidate, flag for me.

And then the promotion gate. Nothing lands in the project’s own ledger document, the one file the pipeline may ever write to, dated entries, unless I personally say “log it”. Never automatic. The machine’s entire ambition ends at my desk.

If it is something to test, I have other agents, swarms of them, delegating stuff left and right.

An AI whose proudest possible output is “no candidate”. I checked the sample verdicts. The machine is not being modest. It genuinely enjoys this.

What ANALYSIS.md is

The talk-type videos get a different treatment: no structured extraction, because there are no trading mechanics to extract and a machine forced to extract rules from a talk will invent one. Sometimes it is philosophy, sometimes it is best practices. Instead the supervisor reads the transcript directly and, when the video earns it, writes an analysis next to the artifacts: what the video actually is, which claims it makes, whether the arithmetic inside those claims actually checks out, which parts are assertion wearing the costume of evidence, and a bottom line.

That is why ANALYSIS.md is conditional. Most videos do not earn a document. The absence of the file is itself a finding.

Trust, upgraded

The first post had a confession: in this one place, I trust the AIs, all of them, uncomfortably. Here is why the discomfort is survivable by design.

The checker does not share its evidence with the checked. The summarizer reads the transcript. The checker reads frame descriptions, pixels turned into text. They watch different channels of the same video, so a blind spot on one side does not automatically become a blind spot on the other. And there are several small models in the path, not one big one, so an error has to survive multiple independent descriptions to reach me.

They still fail. One evening the pipeline decoded a 59,000-character transcript into zero findings. Not “found nothing interesting”: zero. The cause was not stupidity; it was a silent default: ollama politely shrinking every model’s context window to a couple of thousand tokens unless you say otherwise, and nobody had said otherwise. That nobody is me, probably, in ollama settings. Duh. The fix was one line. The lesson was not: a machine that fails silently is more dangerous than one that fails loudly, and the only defense is checking, which was the whole point.

That default had a cousin, and it cost speed instead of correctness: Fourteen tokens per second but all mine.

What it protects

The pipeline has been running since July. I mean it is running whenever I see the thumbnail of yet another video promising to show me how to make $10k a day, trading. It is not a demo. It keeps me out of the loop for the bulk and in the loop for the judgment, which is the only division of labor I would sign.

This time the number in front of me, decreasing, is hours carved out of my life. The second post’s decreasing number needed a rewritten program. This one needed plain files, small local models, and a supervisor with permission to say no.

Addendum, 11th of Sept, 2026

The machine stayed home for a while. The engine behind it is now generalized, sanitized and published: Winnow — give it a YouTube link, it tells you what is in the video that you do not already know. The announcement: Generalized, Sanitized.

Addendum, 14th of Sept, 2026

The permission to say no became a study of its own: Bzzzt, a session chronicle about why rules written as text go unenforced, and what changes when a rule exists only as a check that refuses.