AI operations for my festival agency STEZA and my production company since February 2026: agents, deterministic gates, human sign-off
I am a graduate of Alexander Sokurov's directing workshop, with 6 films and more than 50 festival selections. Since February 2026, AI agents in Claude Code and Codex have handled correspondence, applications, editing, publishing and bookkeeping for STEZA and my production company. No email, post or application leaves until a script has checked the recipient and the figures and I have said "ok". Below are the systems I run every day, with figures as of the check date. I can build the same mix of agents and checks for your team.
what I am looking forAI operations in a company, team enablement, AI video; employment, contract or project; Barcelona, remote or on site, CET; Russian native, English working
Claude CodeCodexMCPhooksPythonNodeTelethonlaunchdHetznerFastAPISQLiteborgObsidian
00 · Summary as of 12 October 2026
96%
of last week's tasks went to cheaper models picked by a script; the expensive model set each task and accepted the result (161 delegations, 130 accepted on the first pass)
10
guard hooks at the environment level: an email or post goes out only with a ticket, and only a script can issue one
707
automated checks, ALL GREEN, in my open-source MCP server for video editing
150
times cheaper to review images on contact sheets than one by one
7
scheduled jobs run without me, from daily to monthly
9
agents on my own server, about 7 euros a month at list price
00a · How I can help
1
AI operations in a company
I come in and look at the work people repeat every day (client emails, reports, content, bookkeeping), then build agents for it: an agent drafts the client email, a script checks the recipient and the figures, an employee presses "send". I train the team to work with the agents and stay until the system runs without me.
2
Team enablement
Group intensives and one-on-one sessions with owners and managers. We build each person a working agent and decide where it must stop and ask. Then we set up a way to measure its work.
3
Video with generative models
Brand and product videos generated from real footage, with style held from shot to shot and cut straight against live action. The Grave Stakes film teaser is in the Video section below.
Working terms
focus
AI operations in a company, team enablement, AI video
format
employment, contract or project
location
Barcelona, remote or on site
time zone
CET
languages
Russian native, English working
00b · Video: teaser and generated shots
Grave Stakes film teaser: live action cut together with generated shots.
Generated shots for the teaser: Seedance 2.5 started from stills of the real shoot, upscaled in Topaz. Each shot runs 4-10 seconds, no sound.
00c · Architecture
one picture for all eight cards, the numbers point to them; I am marked in green: tasks leave me, results and verdicts come back to meFor engineers: container diagram (C4)
C4PersonContainerExternal system
01-08 · System cards
Task router and model ladder
01
task-router.py · 540 lines of Python · 0 tokens per routing decision
what it is
Before delegation, each task gets a class (A mechanical, B heavy compute, C closed or open, D judgment, voice, money, outbound) and a model. Fable plans and accepts key work, Opus reviews and runs open tasks, Sonnet executes, Haiku handles small mechanical jobs. A script assigns the class and model from a rules table without calling any model, so routing costs zero tokens.
how it works
The routing script (task-router.py) has the commands route, outcome, solo, consult, calibrate and status. It learns from verdicts: two failures in a row move a task type one step up the ladder. Moving down is allowed only for classes A and B after five clean accepts, and a rollback freezes the rule for 30 days. Route log: 1965 entries.
in a company
Rules pick the model for each task so the token bill stays under control. The expensive model sets the task and accepts the result, cheaper ones do the work.
human check
I or an Opus reviewer accept each subagent result; the verdict goes into the log and changes future routes.
result
Week to 12 October: 161 delegations (Sonnet 81, Opus 75, main session 5), 130 accepted, 2 sent back for rework, 1 escalation, 3 failures, 23 consultations with the senior model. Orchestration share 96%.
prices are API rates per million tokens, input / output; source token-economy.md$ python3 task-router.py status # trimmed
No email, message or job application leaves my system without a ticket. A script issues the ticket when the conditions line up: the recipient is known, the text has no money and no unverified third-party facts, and I have said "ok".
how it works
Three ticket types. Red covers one recipient for 30 minutes and needs my "ok" quoted word for word. Batch lasts 6 hours and works only for a fixed address list. Green lasts 60 minutes and needs one of three grounds: an approved template, a reply in a live thread or a short service reply. The risk light (risk-gate.py) defaults to red and decides by rules, with no model involved. It learns from verdicts and incidents, and an incident freezes the ground it slipped through. Claims map: the script refuses a red ticket until every third-party name and number in the email has a line saying where it came from and who confirmed it. Before drafting, the agent rereads the recipient file: what we already wrote to them, what we promised, what we turned down. Follow-up corrections are banned: once an email is sent, nobody amends or retracts it.
in a company
Sales emails to clients: the agent writes, a script checks the recipient and the figures, an employee presses "send".
human check
Any money marker in the text stops the send until a senior model has reviewed it and I have given a word-for-word "ok".
result
Risk light selftest 15 of 15; 867 risk-light decisions in the log; 235 verified claims (names, sums, dates) in recipient files. A send counts as done only when the receiving side shows it (the Sent folder, the channel itself).
$ python3 risk-gate.py selftest
[PASS] service reply, green: exit 0 (expected 0)
[PASS] plain amount of money: exit 2 (expected 2)
[PASS] masked amount (NBSP+ZW): exit 2 (expected 2)
[PASS] red marker "EUR sign": exit 2 (expected 2)
[PASS] red domain from the government list: exit 2 (expected 2)
[PASS] red address in cc: exit 2 (expected 2)
[PASS] service reply with two recipients: exit 2 (expected 2)
[PASS] thread with no history: exit 2 (expected 2)
[PASS] thread with clean history: exit 0 (expected 0)
[PASS] thread with red history (any_red): exit 2 (expected 2)
[PASS] unregistered template: exit 2 (expected 2)
[PASS] telegram channel: exit 2 (expected 2)
[PASS] long service reply: exit 2 (expected 2)
[PASS] attachment in a service reply: exit 2 (expected 2)
[PASS] daily limit: 20 green, the next one exits 2 (expected 2)
SELFTEST PASS: 15 scenarios, live state untouched
output translated from Russian
an email's path from draft to log; the green box is the hook that stops a send without a fresh ticket
Guard hooks at the environment level
03
10 registrations in settings.json · PreToolUse, PostToolUse, Stop, UserPromptSubmit
what it is
Checks that the environment runs before and after agent actions. A hook fires before a tool call and blocks it when a condition fails.
how it works
Outbound. The hook blocks an email without a fresh ticket. It also blocks publishing, editing or deleting a post on social networks and Telegram without a ticket. outbound-guard, publish-guard
Token budget. A subagent gets a warning at its 60th call and loses its tools at the 100th. Subagents go to the background only when told to. Screenshots shrink to 1568 px, and PDFs are read as text, not as images. subagent-step-limit, agent-foreground-default, shrink-image, pdf-to-md
Housekeeping. The agent does not create files "for the owner to read"; content goes to the chat. Every turn gets an exact timestamp. A changed skill triggers a registration reminder, and the knowledge base syncs after each session. reader-guard, now-stamp, skill registration, knowledge base sync
in a company
Agent restrictions live in the environment settings and run before every action: a sales agent cannot send an email without an issued permission.
human check
The hook returns a refusal that says what to get (a ticket, a quoted "ok"), and the turn comes back to me.
result
Without a ticket, the hook blocks the call to the send tool. Lesson from the 19 September 2026 audit: one invalid line in settings.json silently disabled the whole file along with its hooks. Since then a script (claude doctor) checks the hooks after every config edit.
$ hooks from settings.json, file names
PreToolUse ['pdf-to-md-guard.sh', 'shrink-image-hook.sh', 'publish-guard.py', 'outbound-guard.py', 'reader-guard.py', 'subagent-step-limit.sh', 'agent-foreground-default.py']
PostToolUse: reminder to register a changed skill
Stop ['claude-obsidian-sync.sh']
UserPromptSubmit ['now-stamp.sh']
Several models read every important decision and every outbound text before I accept it. The internal council follows the DMAD scheme: five advisor subagents with different roles, a devil's advocate and a chair, and confidential material can go there. External panels take non-confidential work: six model families on NVIDIA NIM and six models on OpenRouter, with Codex joining as a second agent through an MCP bridge I wrote. A monthly smoke test checks that the models still respond. I write the synthesis and make the call. A council of 12 agents that wrote 15 rules into a skill took 15 minutes (measured), and a copy of the panel runs on the server for Hermes.
premiere-claude-bridge: MCP server for Premiere Pro and DaVinci Resolve
Open-source tool that lets Claude Code or Codex work inside an editing program as an assistant editor. I built it for my production company and published the code.
how it works
Node MCP server with ten pr_* tools: status, project, sequence, timeline, selection, playhead, markers, export to Adobe Media Encoder, arbitrary ExtendScript. Python core of 25 modules: silence and best-moment search, audio mixing with ducking, subtitles and transcript checks, color gate and technical file QC, edit variants and revisions to a hand-built cut, XML handoff. Adapters for Premiere, DaVinci Resolve (Studio Python API) and FCPXML. Bundle for Claude Desktop and server.json for the MCP registry.
in a company
An editor hands routine work inside their own program to the agent: logging, finding pauses, checking a file before delivery. Meaning and rhythm stay with the editor.
human check
The director decides the meaning and rhythm of the cut. Every error from a real job becomes a code check with a test.
result
28 test suites, 707 checks, ALL GREEN on 12 October 2026; tested on real footage: 108 source files, 4.4 GB.
$ core.tests # premiere-claude-bridge, tail of output
xml_handoff: 11 passed, 0 failed
ALL GREEN
28 suites, 707 checks, 2 skipped
Hermes: server agent with narrow rights
06
Hermes Agent v0.20.2 · Hetzner CPX22 · 9 profiles
A round-the-clock agent that keeps working when my laptop is off: it answers people in support bots, keeps the family books and sends morning digests. It runs as a separate user without root, with one narrow wrapper as its only way into sudo. Approval mode is set to smart, the no-confirmation mode is banned, and mail keys are not in its environment. Nine isolated profiles split the work, all on free models through NVIDIA NIM (Nemotron 3 Ultra, with DeepSeek and Gemini Flash as fallbacks). A bridge script on my Mac (hermes-task.sh) hands it tasks without spending main-session tokens, and it passes hard questions to me in a staff chat. The server costs about 7 euros a month at list price. One profile, Kassa, is a family bookkeeping agent: two models read every receipt independently.
One panel runs my Telegram channel, VK, Instagram and LinkedIn. The panel has no "publish" button: a script publishes once there is a ticket and my "ok".
how it works
FastAPI and SQLite panel on the server, with an in-process scheduler, a calendar and a text version for each platform. Only I can approve a post, by a tap in the Telegram bot, a word in the agent chat or the "Approve" button on the post page; any edit to the text, image or platform list removes the approval. Before drafting, the agent runs a TF-IDF repeat check against every channel post and the topic map. Before publishing, a script checks the text (text-gate.py: personal stoplist, platform limits, markup) and issues a 30-minute ticket. After publishing, a check script (tg-verify.py) looks at the real rendered post, because an API "ok" does not count as proof. The feed guard (tg-scan.py) rereads the whole feed after 2 and 15 minutes, and a duplicate means stop and report. A long post with an image goes out from my own account through Telethon (a user-account Telegram client), only with a ticket and my "ok". A nightly job saves view counts and a morning card sums up the channel.
in a company
A content team where one person holds the button: agents prepare posts for each platform, and only the manager releases them.
human check
The agent sends me the full post text in chat. I read all of it and write "ok" for specific platforms. Then the script issues a ticket and the pipeline publishes.
result
621 posts of history imported (146 Telegram, 475 VK); 212 posts in the repeat-check base. I dropped the stylometric detector after an audit showed 18-20% false positives on my own texts and replaced it with the repeat check and topic map.
The agent writes in Russian in my voice, and I measure acceptance by draft survival: the share of the draft that stays after my edit. It is 84% over the last ten texts, against a target of 90%.
how it works
Corpus of 25 confirmed texts of mine (about 6400 words) with a provenance map that separates my own voice from character speech and quotes. I log each edit as a dated pair, "agent's phrase, my phrase", and error classes come out of the pairs: 6 classes of things I cut, 12 classes of things I fix. A class needs at least two examples, and the agent writes down what an edit means only after a short interview with me. Stoplist: 15 hard rules and 12 warnings, all from my direct bans. Before showing a draft, the agent runs a "stranger test": a fresh context checks every verb-plus-object pair with three questions.
in a company
Letters and posts in a manager's name: the agent writes in their voice, and the share of edits shows how close it gets.
human check
I edit, and the system learns from the pairs; a whole draft never becomes a reference text.
result
47 dated pairs in the log. Draft survival: target 90%, now 84%, log open.
$ draft survival metric
average over the last 10 drafts: 84% (target >= 90%)
output translated from Russian
09 · Systems week and my week
runs without me
daily, about 09:00mail summary cards
daily, 09:45festival submission watch
weekdays, 10:00watch on a client's film
Mondays, 09:30weekly calibration of the risk light and task router
Mondays, 10:30family bookkeeping reconciliation
1st of the month, 09:40 and 10:00model panel smoke test, monthly finance close
every night, 03:40channel view snapshot
after every sessionknowledge base sync; the server pulls it every 15 minutes
on a launchd schedulebackups
what I do
week to 12 Octoberassigned 161 tasks to subagents, accepted 130, sent 2 back for rework, consulted the senior model 23 times
every outbound textI read it in full and say "ok"
every incidentI take it apart and write down a rule
10 · Time taken
task
time
who did it
date, 2026
Internal council of 12 agents and 15 rules written into a skill
15 min
subagents and me
15 September
Audit of a client's website and chats, transcription of 5 voice messages, edits, deploy, check
21 min
session
15 September
Project mail audit: 118 threads by script in 1 minute, 59 threads reviewed
25 min
script and session
15 September
Senior-model review of five emails (6.5 minutes), tickets, sending, check in Sent
20 min
Fable and scripts
15 September
Five parallel searches by subagents
21 min for the longest
Sonnet
15 September
Press kit in English
3.5 min
Opus
6 October
143 frames and 5 contact sheets
32 s
Sonnet
6 October
Smoke test of 22 models and panel line-up rebuild
about 0.8 h
-
2 October
First encrypted archive: 18073 files, 15.4 GB
34 min
borg
4 September
Upscale from 720p to 4K, 217 frames
1.5 min
Topaz from the terminal
28 September
30 seconds of music
6 min
ACE-Step, local
-
Audit of 1297 bookshop catalogue cards against shelf photos, three passes
11.4 active hours
-
9 September
Rework of someone else's fork of keySwitcher (keyboard layout switcher): source recovered from transcripts, 4 fixes, build, signing, autostart
1.4 h
session and subagent
15 September
active hours counted from transcripts; pauses under 15 minutes count as work
11 · Incident → rule → guard
date, 2026
incident
rule
guard
8 September
stylometry gave 18-20% false positives on my own texts
detector dropped
repeat check and topic map
15 September
I posted by hand after the agent hit its limit, and the panel reported "not published"
only the channel itself confirms that a post went out
tg-verify.py, reading the channel
15 September
inflated time estimates
estimates come only from measurements; the word "weeks" is banned for scripted work
measurement table time-calibration.md
19 September
one invalid line in the config silently switched off all hooks
a check after every config edit
claude doctor in brain-doctor.sh
6 October
repeated topics in the channel
repeat check before the draft
post-dedup.py (TF-IDF) and topic map
8 October
duplicate post in the channel
the whole feed is the source of truth; a duplicate means stop and report
tg-scan.py rereads the feed after 2 and 15 minutes
12 · How it was built
February to August on the upper axis, September and October zoomed in on the lower one; green marks the token audits that produced a rule and two guard hooks
13 · Also in production
toolkit by layer; the rules layer is marked in green, and I carry it over to any model
Operations for STEZA festival agency
Agents pick festivals, check rules and deadlines, write to programmers and prepare submissions. Each film has a live Google Sheet with tabs "Status", "Submissions", "Needed from the author" and "Materials", kept up by the Google command-line client (gog) without a browser. A scheduled job watches submissions every day.
Memory
322 working memory files for the agent; Obsidian as an external brain, 3519 notes, 1219 of them in the graph with 2646 links; sync between the Mac, a private GitHub repo and the server every 15 minutes; a script checks the brain's health for 0 tokens.
Skills
138 skills, 108 of them lazy. The skill router loads one domain profile and 1-3 instructions into context and nothing else; scripts audit the system.
$ skill counter: folders and lazy
folders: 138 lazy: 108
Scheduled jobs
7 recurring jobs (morning mail cards, festival submission watch, weekly calibration, family bookkeeping check, monthly finance close, model panel smoke test) plus one-off jobs for events. On the Mac, launchd runs backups and the nightly channel snapshot.
Backups
borg with an encrypted repository on the server: 7 daily, 4 weekly, 6 monthly archives. The first archive held 18073 files, 15.4 GB. The panel and bot databases have their own backups.
Video
Generation: Seedance 2.5 queued by script, Veo 3.1 through Google Flow. Processing: Topaz Video from the terminal, mlx-whisper transcription, music with ACE-Step 1.5 locally and Suno. Editing: DaVinci Resolve and Premiere through my own script sets, Remotion for infographics.
Token accounting
token-usage-report.py reads the session logs. Audits on 14 and 19 September 2026 found leaks (subagent GUI loops, an invalid settings.json), and I closed them with hooks. Contact sheets of 24 images cut the cost of reviewing one frame by a factor of 150.
Barcelona audio walk
Telegram bot that guides a walk through the Gothic Quarter, with a FastAPI control panel and Stripe in test mode.
14 · How to read the terms
MCP
standard that connects an agent to programs and data.
Guard hook
check the environment runs before and after each agent action, whatever the task text says.
Deterministic gate
code makes the decision by fixed rules; no model takes part.
Ticket
one-time, time-boxed permission for one outbound action.
Subagent
separate model instance that gets one task from the main session and hands the result back.
Orchestration share
the main model assigns tasks and accepts results while subagents do the work; the share is the percentage of tasks handed to subagents.
Skill
instruction for one kind of work that the agent loads into context on demand.
Token
unit of text that model usage is billed by.
Draft survival rate
share of an agent's draft that stays after my edit.
Contact sheet
one sheet with 24 thumbnails, so a batch of images gets reviewed at a glance.
Selftest
built-in run of preset scenarios that checks the script decides as expected.
DMAD
multi-agent debate scheme with assigned roles and a devil's advocate.
Telethon
user-account Telegram client: a script posts as a person, not as a bot.