◂ Этап CutRYA.AERender Queue & Memex — очередь рендера и диспетчер ресурсов: мак, Memex, статусыфильм кодом · 12 окт 2026
Мак один на полтора десятка сессий, Premiere и прокси; два рендера разом не ускоряют друг друга (замер 02.10: 1/2/3/4 кодирования — 29,6/28,5/26,7/27,0 к/с в сумме), зато уводят машину в своп. Поэтому тяжёлое идёт через общий замок: ждёт чужой рендер, ждёт память, берёт замок на одну команду. Страница — про то, как очередь работает сегодня и какой должна стать: без простоя и перегруза, с запасным путём на Memex через Google Drive и понятным статусом в Telegram. Каталог замков и моделей — стек машины, движки — фильм кодом. С 12.10 над очередями стоит диспетчер ресурсов rya-res: сторож памяти и нагрева на обеих машинах, потолок кэша MLX, замки по видам работы и выбор машины.
📌 Правило (12.10). Перед тяжёлым — rya-res status: обе машины одним экраном. Очереди те же — render_queue.py <кто> --idle-pass 240 -- …, модели — mlx_queue.py; они сами ждут сторожа и дают модели потолок кэша. Задача с явными входами и выходами — rya-res run … --where auto: занят макбук — уедет на Memex по кабелю. ⏸ в Telegram — сторож заморозил фоновую задачу, чтобы макбук не упал; продолжит её сам.
Одним взглядом
1рендер
тяжёлый на маке за раз
4 кодирования разом — 27,0 к/⁠с в сумме, одно — 29,6
2ГБ
потолок кэша MLX у любой модели
без него whisper держал 29 ГБ (11.10), кэш растёт до ~40
38ГБ
своп при панике ядра 02.10
при 36 ГБ памяти и «36 % свободно»
×2,6
модели на Memex медленнее мака
Memex — когда мак занят: по кабелю, сам (rya-res run)
1Диспетчер2Схема3Один вызов4Сегодня5Случаи6Мак ↔ Memex7Telegram8Построить9Проверки10Знания11Грабли12Команды13Где лежит

14.2 · 1Диспетчер ресурсов rya-res — с 12.10

Роман 11.10: «умная система распределения ресурсов на рендер и на всё остальное между макбуком и мемексом, чтобы у меня не выключился он (может быть замки делать), и при этом максимум ресурсов использовали». С 07.10 по 11.10 макбук перезагружался семь раз; корень почти всегда один — память. Слой scripts/18_compute/, команда rya-res.

1Сторож на обеих машинахесть с 12.10
  • launchd ae.rya.res-guard, раз в 5 с: рост свопа (сам своп липкий), свободная память, давление, место на внутреннем диске (там своп), нагрев, батарея
  • тесно — новые тяжёлые ждут; опасно — SIGSTOP самой большой фоновой задаче (ветка целиком); критично — всем; отпустило — SIGCONT по одной, с маленькой
  • никого не убивает; Adobe, Chrome Романа, VS Code, Claude, ботов, rclone не трогает; ⏸ и ▶️ — в Telegram; остановили сторожа — сначала размораживает всё
проверено в песочнице: рост 3 ГБ/мин → пауза через 16 с, память отпустило → разморозка через 60 с
2Потолок кэша MLX 2 ГБесть с 12.10
  • без потолка MLX копит освобождённые буферы до 1,5 рабочего набора GPU — на M3 Max ~40 ГБ
  • ytai_mlx_cap.pth во всех ~/YTAI/environment/.venv_* на обеих машинах: потолок у любой модели, даже мимо очередей
  • синтетика: кэш 15,1 → 1,1–2,2 ГБ, прогон 6,8 → 2,5–3,8 с; свой — YTAI_MLX_CACHE_GB, без — YTAI_MLX_CAP=0
11.10 23:41 whisper YTCH10 — 29 ГБ, своп 22 ГБ
3Замки по видам работыесть с 12.10
  • cpu — один тяжёлый рендер (тот же render.lock); vt — VideoToolbox (M3 Max — два медиадвижка, M4 — один); mlx — одна модель (тот же mlx.lock)
  • разные виды идут одновременно: x264 на ядрах, кодирование на медиадвижке, whisper на GPU; память стережёт сторож
  • render_queue.py и mlx_queue.py сами ждут «тесно» и дают потолок MLX — вызовы этапов не менялись
4Выбор машины: run --where autoесть с 12.10
  • rya-res run <кто> --kind cpu|vt|mlx --est-min M --in ВХОД --out ВЫХОД -- команда {in} {out}
  • здесь занято → ждём здесь (медленность Memex − 1) × оценка, не меньше 30 с (модели ×2,6, HEVC VT ×1,6, x264 ×1,0), потом Memex: код зеркалом, входы туда, результат обратно, папка задания стирается
  • на Memex — через его же диспетчер: его сторож, замки и флаг LOAD.json (review.py ждёт)
HEVC 1080p 8 с — 11 с с передачей; при занятом замке рендера мака ушла на Memex через 30 с
5Кабель Thunderbolt вместо Driveесть с 12.10
  • Memex рядом — ssh memex-tb (169.254.77.1): шифр aes128-gcm 279 МБ/с, по умолчанию на загруженном маке 68
  • без кабеля — каждая машина сама; Memex через Drive — по-старому, руками
  • HyperFrames на Memex не рендерит, пока там заблокирован экран
6Чего ещё нетрешает Роман
  • этапы целиком (conform, story_cut, gfx) сами не уезжают: их задания на SSD макбука, Memex этих дисков не видит; 12.10 00:25 — в очереди мака 7 рендеров, все только T9-Black и T9-Black-2
  • шаг — открыть Memex эти два SSD по тем же путям (Общий доступ к файлам, SMB); тогда очереди можно учить отдавать задачи сами

14.2 · 2Схема: как задача проходит очередь сегодня

🎬 Рендер
render_queue.py<кто> [--idle-pass 240] -- команда
→
Чужой рендер?ffmpeg ≥ 150 % CPU, Premiere ≥ 300 %
→
Замок render.lockflock, памяти ≥ 30 %, своп, давление
→
Запускдержит до конца · ждёт ≤ 6 ч → 75
🧠 Модели
mlx_queue.py<кто> -- команда с моделью
→
Чужая модель?python с mlx_*, venv_*, whisper
→
Замок mlx.lockпамяти ≥ 30 % · своп не смотрит
→
Запускодна модель за раз · ≤ 3 ч → 75
🖥 Memex
Оценка: где быстрееT мак vs T Memex, оценка в статус
→
Задание на Driveвход, размер, md5 — всё передали
→
Memex работаетлиза · признак жизни · результат
→
Ворота: кеш очищенмак скачал, сверил, закрыл
📣 Статус
status.jsonJob.status: этап, строка, готово
→
Живое сообщениеtg_status.py · sc_status.py · 300 с
+
Вехи и сбоиJob.tg отдельными сообщениями
→
Роман читаетжирный скромно · время из date
машиначеловек решает или смотритагент Claudeитог дорожки

Замок в коде — ~/.cache/ytai/render.lock; на диске виден как RENDER.lock (первым его создал render_gate.py, файловая система регистр не различает) — файл один, обёртки две. Дорожка Memex — целевой протокол, надо построить: сегодня таймаут = код 75 и провал, на Memex уходят руками по правилу «мак забит», рендер HyperFrames идёт туннелем, кеш там никто не чистит.

14.2 · 3Один вызов очереди: ворота по коду

Дорожка «Рендер» из схемы крупно — в том порядке, в каком её проходит render_queue.py.

1
Встал в очередьмашинаrender_queue.py <кто> -- команда⇒ опрос раз в 10 с (RENDERQ_POLL)
2
Замок render.lockмашинаflock на одну команду; занят — ждём✓ --idle-pass 240: 240 с без тяжёлого → мимо замка
3
Чужой рендер?машинаffmpeg ≥ 150 % CPU · x264 ≥ 100 % · Premiere ≥ 300 %⇒ есть — замок отпущен, повтор через 20 с
4
Памятьмашинасвоп и давление — по RENDERQ_MAX_SWAP_GB и RENDERQ_MAX_PRESSURE✓ свободно ≥ 30 %
5
Запуск до концамашинапишет в замок «кто pid время» и держит его до конца команды⇒ потом замок берёт первый опросивший, не первый пришедший
↺ ждёт дольше 6 ч → выход с кодом 75 · модели через mlx_queue.py — 3 ч
машина

Порядок — как в коде render_queue.py: замок берётся первым и отпускается, если мешает чужой рендер или память. Пороги остальных процессов — в таблице «Что считается занятостью» ниже; 03.10 новичок так обогнал ждущего 57 мин — «Честная очередь» в разделе «Надо построить».

14.2 · 4Что есть сегодня

1render_queue.py — общий замокесть сегодня
  • <кто> [--max-wait SEC] [--idle-pass SEC] -- команда; замок ~/.cache/ytai/render.lock на одну команду, внутри «кто pid время»
  • ждёт чужой рендер, потом памяти ≥ 30 %; по желанию RENDERQ_MAX_SWAP_GB и RENDERQ_MAX_PRESSURE (1 норма · 2 · 4); опрос раз в RENDERQ_POLL (10 с); потолок 6 ч → код 75
  • --idle-pass 240: замок занят, но тяжёлого рендера нет 240 с → идёт без замка; держатель, уже признанный лёгким, пропускается сразу
  • RENDERQ_BLOCK=1 — ждать сам замок, только коротким; журнал — stdout вызывающего
зовут: cut.py, solo.py, sc_run.py, dc.py, 0512_reversion, remotion
2render_gate.py — второй вход в тот же замокесть сегодня
  • --label ИМЯ --max-wait 30 --log ФАЙЛ -- команда; --status печатает чужие рендеры; зовут autocut.py, audio_io.py, screens_hf.py
  • замок ждёт без потолка; чужой рендер ждёт, уже держа замок; через 30 мин идёт рядом с чужим под nice -n 5; память не смотрит
  • «свой» = общий предок: две сессии Claude под одним Code Helper не видят рендеров друг друга
3mlx_queue.py — модели по однойесть сегодня
  • <кто> -- команда; замок ~/.cache/ytai/mlx.lock; чужой = python с mlx_*, venv_*, wordrole_transcribe, стадиями ревью; памяти ≥ 30 %; потолок 3 ч → код 75
  • шаблон venv_transcribe ловит не-модели: рендер звать системным python3
4Прокси: busy_gate.py и pause_guard.pyесть сегодня
  • busy_gate уступает Adobe при ≥ 0,4 машины и любому чужому ffmpeg, rclone, HandBrake; load > ядра × 1,5 — только до старта; опрос 30 с
  • pause_guard морозит свой ffmpeg (метки _Proxy/, proxy.py) SIGSTOP и отпускает SIGCONT; опрос 5 с; --thaw чинит падение
  • render.lock прокси не берут: рендер фильма видит их только как чужой процесс
5Очередь Memex: флаг LOAD.jsonесть сегодня
  • ~/.cache/ytai/LOAD.json {job, code, stage, started, expected_min, host}; пишут review.py и ~/bin/ytai_load start; wait_load ждёт чужой флаг, сон 60 с, потолок 480 мин → код 5
  • рекомендательная: чужой флаг перезаписывается; замка рендера и сторожа памяти при 16 ГБ нет
6Порции и пачки — так очередь двигаетсяесть сегодня
  • sc_run.py: порция (check по 8, gfx по 6, часть по одной) = свой вызов очереди с --idle-pass 240, своп 12, давление 1; cut.py — --par 1; 0512_reversion — пачкой под одним замком, своп 16
  • solo.py по умолчанию --par 2 — против правила «по одной части»; у autocut порогов свопа нет
длинный прогон — из снимка ~/.cache/ytai/stage_snapshots/<прогон>/
Что считается занятостью — пороги из кода
Процессrender_queue.pyrender_gate.pybusy_gate · pause_guard
ffmpeg≥ 150 % CPU≥ 150 % и старше 25 слюбой чужой; ffprobe не считается
x264 · x265 · HandBrakeCLI≥ 100 %≥ 150 %HandBrakeCLI — любой чужой
Adobe Media Encoder≥ 150 %≥ 150 %Adobe ≥ 0,4 машины — стоп
Adobe Premiere Pro≥ 300 %не смотритв доле Adobe; открытый без дела не держит
chrome-headless-shell · hyperframes≥ 100 %chrome ≥ 150 %не смотрит
After Effects · aerender≥ 200 %не смотритAfterFX — в доле Adobe
Памятьсвободно ≥ 30 %; своп, давление по RENDERQ_*не смотритload ≤ ядра × 1,5 до старта
«Свой» процессэтот процесс и потомкиобщий предокметки в командной строке

rclone держит только прокси с заливкой; Compressor — gate и прокси. Чего нет (надо построить): бюджета ядер и памяти — всё держится на «одном тяжёлом»; аппаратный кодек не отличается от x264; шаги вне обёртки (qc.py на 497 %, пробы, приёмка) замок не берут, а для чужих очередей выглядят чужим рендером.

14.2 · 5Случаи, из которых выросли правила

КогдаЧто случилосьЧто сделалиСостояние
28→29.09мак упал, своп 34 ГБ: два Qwen2.5-VL + whisper + OCR разомmlx_queue.py: модели по однойесть сегодня
02.10 14:26паника ядра, своп 38 ГБ при 36 ГБ памяти: чужой python 20–25 ГБ + два x264 4K; memory_pressure показывал 36 % свободнопороги свопа и давления; одна часть за раз (19 к/с одной, 21 двумя); запуск из снимка кода; YTLAB01 дорендерен по одной частиесть; пороги ставит каждый вызывающий сам
02.10приёмка файла YTEVO02 в один поток держала замок 2 ч, три очереди стояли--idle-pass 240есть; шапка кода говорит «полчаса», память — «2 часа»
24.09Premiere на 98,7 % CPU — одно ядро из 14 — заморозил прокси на 30 минпорог Adobe ≥ 0,4 машиныесть сегодня
03.10 ночькороткая задача (10 мин работы) час стояла за пятью длинными; в 00:50 нагрузка 52 при 14 ядрах, своп 7,9 → 9,2 ГБ, замок ушёл самому новому из пяти ждущих, qc.py вне очереди на 497 %RENDERQ_POLL, RENDERQ_BLOCK=1 короткиместь; порядок, бюджет, панель — открыто
07.10whisper YTTRBM02 (61 мин) дорос до 27 ГБ, своп 23 ГБ — на внутреннем диске осталось 128 МБchunk_whisper.py: куски по 10 мин, кэш MLX чистится после каждогоесть; с 12.10 — потолок MLX у всех
07–11.10макбук перезагружался 7 раз: зависания при выключении, jetsamдиспетчер rya-res, сторож на обеих машинахесть с 12.10
11.10 23:41своп 16,5 → 19 ГБ за 20 с: whisper YTCH10 (38 мин) держал 29 ГБ кэша MLX; Memex — 4 из 10 ядер, 72 % памяти свободнопроцесс заморожен; перезапуск с готового whisper (диаризация 2 мин); потолок MLX 2 ГБ во все окружения; сторожесть с 12.10
12.10очередь моделей ждала свою же проверку lsof 16–40 с на каждом заходеlsof -n -P → 0,1 сесть с 12.10

14.2 · 6Memex: запасной путь и распределение мак ↔ Memex

Рендер на железе — узкое горлышко. Считаем время до результата по обоим путям и берём меньшее; оценку пишем в статус. Если Memex — только через Google Drive, с проверкой «всё передали» и очисткой кеша там.

1Что такое Memexесть сегодня
  • Mac mini M4, 10 ядер, 16 ГБ, Дубай; ssh memex через Tailscale; диск 460 ГБ, 03.10 свободно 177; часы на час вперёд
  • модели в 2,6 раза медленнее мака; Drive с Memex 36 МБ/с; туннель мак → Memex до 1,3 МБ/с, бывало 11 КБ/с
  • при VLM занято 15 из 16 ГБ — две модели нельзя; по ssh PATH без brew: export PATH=/opt/homebrew/bin:$PATH
2Правило выбора: время до результатаправило
  • мак = ожидание в очереди + работа (4K одной частью ≈ 19 к/с на M3 Max)
  • Memex = заливка входа на Drive (объём ÷ ≈ 9 МиБ/с с мака) + скачивание на Memex (÷ 36 МБ/с) + работа (модели × 2,6; рендер — замерить) + выгрузка результата (замерить) + скачивание на мак (÷ 35 МиБ/с в обход VPN)
  • вход уже на Drive (оригиналы проекта, прокси) — слагаемое заливки = 0: это главный выигрыш Memex
  • в статус: «Memex: мак занят ещё 50 мин, там результат на 18 мин раньше»
3Правило Романа: когда Memexправило
  • 02.10: «Memex можно тогда, когда макбук забит» — сначала мак через очередь; в статусе сразу — почему Memex и кто держит очередь; освободился мак — возвращаться
  • 03.10: выбирать наиболее быстрый способ; на Memex — через гугл-диск, следить, что всё передали, что Memex всё выгрузил и очистил кеш; 30.09: «КАКОЙ ТУННЕЛЬ, ЧЕРЕЗ ГУГЛ ДИСК»
4Анти-случай: мак в очереди, Memex пустойисключает правило
  • 03.10 00:50: на маке пять ждущих до 50 мин, на Memex в очереди никого
  • планировщик считает T Memex каждому ждущему; у кого меньше — уезжает заданием через Drive, и очередь мака короче для остальных
5Анти-случай: на маке 10 минут, на Memex везём часисключает правило
  • кадры для страницы, проверка одного клипа HyperFrames (9 с), одна короткая часть: заливка 4K-входа дороже самой работы
  • короткое — всегда мак: RENDERQ_BLOCK=1 RENDERQ_POLL=2, отдельные кадры — мимо очереди; на Memex — только когда оценка меньше с запасом (порог — решает Роман)
6Место на Memex — воротаправило
  • после сверки результата Memex стирает у себя входы, кеш и результат; до этого задание не закрыто
  • 24.09: брошенные .part на 179 ГБ оставили 17 ГиБ — следующий прогон не смог начать; сегодня чистят только ферма прокси и memex_space_guard.sh
7Есть сегодняесть сегодня
  • выбор руками по правилу «мак забит»; очередь Memex — флаг LOAD.json
  • ревью ката: код rsync по ssh (memex/push.sh), запуск nohup caffeinate -dims + watchdog.sh, кат серверной копией в 03_Exports, назад pull.sh --no-frames
  • рендер HyperFrames — туннелем memex_render.sh (rsync → nohup → файл с кодом → scp), без Drive и без очистки; там hyperframes 0.8.103, у фильмов 0.8.106
8Надо построитьнадо построить
  • планировщик: оценка T мак и T Memex перед каждым тяжёлым шагом, оценка в статус и журнал
  • задание через Drive: job.json (что · откуда · куда · размеры · md5), лиза, признак жизни, результат
  • сверка передачи и выгрузки по размеру и md5; очистка кеша Memex с подтверждением; замеры рендера на M4 и выгрузки Memex → Drive

Роман, 03.10.2026: «ещё один из процессов — узкое горлышко рендер на железе, надо делать умно распределение между макбуком и мемексом. Выбирать наиболее быстрый способ и правильно делать. Если на мемекс — то через гугл диск, следим, что мы всё передали, что мемекс всё загрузил на гугл потом и очистил весь кеш (место там важно). Чтобы не было так, что на макбуке очередь, а на мемексе пусто. И при этом не было так, что если это быстро можно сделать на макбуке, а мы грузим долго и сложно на мемекс».

Скорости путей: почему через Drive
Drive → мак, в обход VPNзамер 28.0935 МиБ/с
Drive → Memex20–⁠41, замер 15.0936 МБ/с
Drive → мак через VPNзамер 28.099,5 МиБ/с
Мак → Drive, заливка входавход уже на Drive — слагаемое 0≈ 9 МиБ/с
Туннель мак → Memexбывало 11 КБ/с≤ 1,3 МБ/с

Полосы — в МБ/с (МиБ × 1,05). Туннель для больших файлов не использовать. Модели на Memex в 2,6 раза медленнее мака; рендер x264 и HyperFrames там не замерен.

Протокол через Drive — целевой, надо построить
📦 Задание
job.json на Driveчто · откуда · куда · размер · md5
→
Заливка входамак → Drive, если входа там нет
→
«Всё передали»размер и md5 на Drive = на маке
🖥 Memex
Захват лизойсрок, как у фермы: 3 ч
→
Скачал, работаетпризнак жизни — движение байтов
→
Результат на Driveвыгрузил, сверил размер и md5
→
Ворота: кеш очищенвходы и результат у себя стёр
💻 Мак
Скачал результатDrive → мак в обход VPN
→
Сверилразмер, md5, кадры по плану
→
Задание закрытоdone в журнале очереди
→
Статус в Telegramпочему Memex · сколько заняло
машиначеловек решает или смотритагент Claudeитог дорожки

Лизы, журнал дозаписью, подтверждение размером с Drive, STOP и PAUSE, сторож — уже есть у фермы прокси (чипы ниже), брать оттуда. Чего нет нигде: захвата, который видят обе машины, и очистки с подтверждением.

Скорости для оценки
СлагаемоеСкоростьОткудаСостояние
Ожидание в очереди макапо журналу ожиданийжурнала нетнадо построить
Заливка с мака на Drive≈ 9 МиБ/с (15.09)память reference_memex_mlx_stackесть; в обход VPN — замерить
Скачивание на Memex с Drive36 МБ/с (20–41)отчёт 10, замер 15.09есть
Модели на Memexв 2,6 раза медленнее макаVLM 15,1 → 40 с на экранесть
Рендер x264 и HyperFrames на Memexне замерен—замерить — надо построить
Выгрузка результата Memex → Driveне замерена—замерить — надо построить
Скачивание на мак с Drive35 МиБ/с в обход VPN, 9,5 через VPNзамер 28.09есть
Туннель мак → Memex≤ 1,3 МБ/с, бывало 11 КБ/с15.09, 30.09для больших файлов не использовать
Что взять у фермы прокси (16_proxy/1603_farm): есть у фермы, для рендера надо построить
Манифест на Drive _farm_plan.json: исходник по точному размеру; маркеры _farm_REBUILDING.md → _farm_acceptance.mdЖурнал journal.jsonl дозаписью, fsync каждой строки; index.json производныйЛизы todo → lease → done / fail / hold: 3 ч, 3 попытки, истёкшая возвращает клип самаФайлы STOP и PAUSE_UPLOAD в ~/.cache/ytai/proxy_farm — без убийства процессаЗаливка copyto, подтверждение размером, прочитанным с DriveКвота 750 ГБ в сутки → сон 1 ч, попытка не тратится; --tpslimit 8, --multi-thread-streams 0launchd в 01:00 + сторож раз в 15 мин: лог молчит 60 мин → pkill; без KeepAlive; /usr/bin/caffeinate -imsПризнак жизни — движение байтов; 45 мин тишины → стоп

Ферма не распределённая: на каждой машине один процесс со своей очередью, писатель журнала один, Drive — истина о сделанном. Для рендера через Drive не хватает захвата, который видят обе машины.

14.2 · 7Статусы в Telegram

1Живое сообщение раз в 5 минесть сегодня
  • tg_status.py --job J [--every 300] (headless): одно сообщение, правится editMessageText; строки Этап / Идёт / Готово / Скачивание / Части / До конца / Дальше / Жду; выход по finished, STOP_STATUS или через 24 ч
  • sc_status.py <проект> [--every 300] (story_cut): части X из Y с минутами, графика X из Y, «Очередь рендера: мы / кто»; вехи и сбои — Job.tg отдельно, файлы — Job.tg_file до 50 МБ
  • держатель читается из файла замка, а он не стирается — имя бывает устаревшим; свопа, нагрузки и ждущих нет
2Панель с полоскамиесть сегодня
  • ytuvi_progress.py: HTML-панель с полосками, история progress_history.jsonl → скорость и ETA по окну 45 мин; сообщение раз в 10 мин простым текстом
  • прецедент для панели очереди: метрики в jsonl, картинка отдельно; графиков не шлёт ни один статус
3Отправка: ~/bin/tg.pyесть сегодня
  • text (--parse html|md2|none), rich, poll, react, photo, video, raw; правка — raw editMessageText; документ — tg.call(…, 'sendDocument', files=)
  • stdout обрезан до 2000 знаков — успех по коду выхода; формат не единый: farm.py шлёт curl без parse_mode и не шлёт обещанный прогресс
4Правила Романа для статусовправило
  • каждые 5 мин, 3–5 строк: сколько готово из скольких, что идёт, главное, что дальше; одно живое сообщение, вехи отдельно
  • жирный можно, скромно; есть теги — всегда html; имя файла обычным текстом; время — только из date; своп растёт — чей процесс
  • 02.10 про эту страницу: «визуально или статистически … с форматированием»
Предложение формата — надо построить
Образец: статус очереди в Telegram
Очередь рендера · мак · 00:55
Идёт: ytevo02-v7-deliver · с 00:30 · ffmpeg 860 % · готово 31 из 50 частей
Ждут 5: ytlab01-v4-check 50 мин · ещё трое 36 · 33 · 20 мин · новый 35 с
Мак: нагрузка 52 на 14 ядер · своп 7,9 → 9,2 ГБ за 8 мин · давление 1
Вне очереди: qc.py 497 % — тяжёлый без замка
Memex: свободен · второй ждущий (36 мин) уедет туда через Drive: замок держит чужой рендер
Дальше на маке: ytlab01-v4-check — первый по приходу

Нагрузка, своп, держатель и ждущие — из замера 03.10 00:50; «готово 31 из 50» — для примера. Жирным — только первая строка. Одно сообщение правится раз в 5 мин; картинка с полосками (как у ytuvi_progress) — отдельным photo. Сегодня такого статуса нет: у каждого конвейера своё сообщение без свопа и «почему Memex».

14.2 · 8Надо построить

1Честная очередьнадо построить
  • порядок прихода, приоритет коротких, список ждущих в файле; сегодня замок берёт тот, кто первым опросил — новичок обогнал ждущего 57 мин
2Одна обёртка вместо двухнадо построить
  • render_gate.py (autocut) → render_queue.py; одна логика «свой / чужой»: общий предок ≠ свой
3Бюджет ядер и памятичастично с 12.10
  • замки по видам (cpu · vt · mlx) и сторож памяти; доли процессора по сумме ffmpeg, chrome, qc — ещё нет
4Единые пороги свопа и давленияесть с 12.10
  • одни пороги у сторожа (доли ОЗУ), очереди спрашивают его: rya-res gate; RENDERQ_MAX_SWAP_GB у вызывающих больше не нужен
5Журнал и метрикичастично с 12.10
  • ~/.cache/ytai/res/state.json каждые 5 с, events.jsonl — паузы, разморозки, уровни; сколько ждали в очереди — ещё нет
6Планировщик мак ↔ Memexесть с 12.10 · по кабелю
  • rya-res run --where auto — для задач с явными входами и выходами; через Drive и для этапов целиком — ещё нет (Memex не видит SSD макбука)
7Единая панель очереди в Telegramнадо построить
  • одно живое сообщение на мак: держатель, ждущие и сколько ждут, нагрузка, своп и чей, Memex, «почему»; картинка через photo
8Снимки кода инструментомнадо построить
  • stage_snapshots/<прогон>/ одной командой с git sha; 999_extra и 17_audio копией, не ссылкой
9Решает Роман
  • 12.10: открыть ли Memex два SSD макбука (Общий доступ к файлам) — тогда очередь сама отдаёт ему этапы целиком
  • что строить первым: журнал и панель · честная очередь · одна обёртка · Memex через Drive · бюджет ядер
  • порог выигрыша, с которого везём на Memex, и считать ли заливку входа на Drive частью переезда
  • до ответа — сегодняшние правила: по одной части, своп в статусе, Memex когда забит
10💬 Моё мнение
  • первым — журнал и панель: дёшево (читают замок, ps, своп), без них остальное не измерить
  • вторым — честная очередь с приоритетом коротких: 03.10 задача на 10 минут стояла час
  • Memex через Drive — третьим: самый большой кусок, а выигрыш даёт только когда мак занят часами; простой лечат первые два
  • порог: везти на Memex, если выигрыш ≥ 20 % и не меньше 10 мин — оценка грубая, скорости плавают, переезд добавляет точки отказа

14.2 · 9Проверки

ПроверкаКогдаНормаОткуда взялась
Чужой рендерперед запуском и пока ждёмнет процессов тяжелее порогов; render_gate.py --statusРоман 02.10: «когда не занят другим рендером»
Свободная памятьперед запуском≥ 30 % по memory_pressure -Q28→29.09, своп 34 ГБ
Своп и давлениеперед запуском и в каждом статусесвоп ≤ 12–16 ГБ, давление ≤ 1–2; sysctl vm.swapusageпаника ядра при «36 % свободно»
Кто держит замокперед своим рендером, глазамиcat ~/.cache/ytai/render.lock + ps; имя может быть старым02.10: «главное, смотри, что мак свободен»
Одна часть за раздлинный фильм--par 1; готовые части сверить по числу кадров19 к/с одной, 21 двумя
Мак освободился?перед каждым рендером на Memexвернуться на мак; в статусе — «почему Memex»Роман 02.10
Путь выбран по оценкеперед каждым тяжёлым шагомT мак vs T Memex, оценка в статусе — открытоРоман 03.10: «выбирать наиболее быстрый способ»
Всё переданоперед стартом на Memexразмер и md5 на Drive = на маке — открытоРоман 03.10: «следим, что мы всё передали»
Результат выгружен и сверенпосле работы Memexразмер и md5 на Drive = на Memex; мак скачал и сверил — открытоРоман 03.10
Кеш Memex очищенпосле сверки результата, до закрытия заданиявходы, кеш и результат на Memex стёрты — открытоРоман 03.10: «место там важно»
Пороги памяти перед стартом
Свободная память% · memory_pressure -Q
30 — порог36 — было при панике
060

02.10 мак ушёл в панику при «36 % свободно»: одного процента мало — поэтому ещё своп и давление.

СвопГБ · sysctl vm.swapusage
12 sc_run16 reversion34 упал 29.0938 паника 02.10
0

Порог ставит каждый вызывающий сам: sc_run.py 12, 0512_reversion 16, у autocut — нет.

Давление памяти ядра1 норма · 2 предупреждение · 4 критично
1 — sc_run
124

kern.memorystatus_vm_pressure_level; норма проверок — ≤ 1–⁠2.

нормана гранибрак

Числа — из таблицы проверок и случаев выше; переменные и порядок — render_queue.py.

14.2 · 10Что обновляет базу знаний

ФайлЧто хранитКто пишетСостояние
~/.cache/ytai/render.lock · mlx.lockкто, pid, время держателяобёртки при взятии; не стираетсяесть; имя устаревает
~/.cache/ytai/render_idle_pass.txtдержатель, признанный лёгкимrender_queue.py --idle-passесть
~/.cache/ytai/LOAD.json (Memex)job, code, stage, started, expected_min, hostreview.py, ytai_loadесть, рекомендательно
00_Setup/08_Cut/status.json · tg_status_msg.jsonэтап, строка, готово, eta; id живого сообщенияJob.status; tg_status.py, sc_status.pyесть
00_Setup/logs/storycut_<tag>.log · autocut_gate.logстроки ожидания [renderq], [gate:…]обёртки через stdout вызывающегоесть, разрозненно
~/.cache/ytai/stage_snapshots/<прогон>/снимок кода этапа для длинного прогонасессия рукамиесть; инструмента нет
queue.jsonl — журнал очередиприход, ожидание, к/с, свопобёртканадо построить

14.2 · 11Ошибки и грабли

Случаи с датами — в таблице выше; здесь то, что ловится только кодом или глазами.

render.lock и RENDER.lock — один файлдве обёртки с разной логикой на одном замке; на диске имя в верхнем регистре, в коде render_queue.py — в нижнем02.10 · ls ~/.cache/ytai
venv_transcribe в командной строке держит mlx_queueзаливка на YouTube принята за модель, статус ждал сам себя 3,5 мин; рендер — системным python3mlx_queue_README
Пробы тоже рендерполный прогон 4K и контактный лист — через очередь; мимо — отдельные кадры и замеры звукаРоман 02.10 13:47
--idle-pass может пустить двоихнесколько ждущих разом видят «лёгкого держателя» и идут мимо замка; проверка только до старта ffmpegкод render_queue.py
Снимок кода со ссылками999_extra и 17_audio в снимке — ссылки на живой код: правка соседней сессии попадает в прогонstage_snapshots
Теги без parse htmlтег жирного уходит сырым текстом; stdout tg.py обрезан до 2000 знаков — успех по коду выхода, не по JSONtg.py
После перезагрузки/private/tmp пуст, сторожа мертвы, замок хранит старое имя (сам свободен): части сверить по кадрам, повторить ту же командупаника 02.10

14.2 · 12Команды

Диспетчер ресурсов: обе машины
rya-res status  # обе машины: уровень, память, нагрев, замки, пауза, очередь, тяжёлые
rya-res gate --kind mlx  # можно ли начинать тяжёлое: rc 0 — да, rc 1 — нет и почему
rya-res run <кто> --kind mlx --where auto --est-min 6 --in ВХОД --out ВЫХОД -- <команда {in} {out}>  # сама выберет машину; на Memex — по кабелю
rya-res thaw  # разморозить всё, что заморозил сторож
rya-res install && rya-res install --memex  # поставить или обновить; сторож меняет код без разморозки

Старые вызовы очередей работают как были — диспетчер подключён внутри render_queue.py и mlx_queue.py.

Поставить рендер в очередь
X=~/YTAI/scripts/999_extra; SC=~/YTAI/scripts/05_editing/0511_story_cut

python3 $X/render_queue.py <кто> --idle-pass 240 -- <команда …>  # общий замок, чужой рендер, память ≥ 30 %
RENDERQ_MAX_SWAP_GB=12 RENDERQ_MAX_PRESSURE=1 python3 $X/render_queue.py <кто> --idle-pass 240 -- <команда …>  # ещё своп и давление
RENDERQ_BLOCK=1 RENDERQ_POLL=2 python3 $X/render_queue.py <кто> -- <короткая команда>  # короткая задача ждёт сам замок
nohup caffeinate -ims python3 $SC/sc_run.py film $P &  # фильм story_cut: графика части → часть, порции через очередь, системным python3
python3 $X/mlx_queue.py <кто> -- <команда с моделью>  # модели по одной

Шаг этапа Cut: python3 $X/render_queue.py … · caffeinate -ims python3 $SC/sc_run.py film → sc_conform. Длинный прогон — из снимка кода, не из живого этапа.

Кто держит замок и занят ли мак
cat ~/.cache/ytai/render.lock  # кто pid время — имя может быть старым, замок при этом свободен
python3 ~/YTAI/scripts/05_editing/0510_autocut/render_gate.py --status  # чужие тяжёлые рендеры по правилам gate
ps -Ao pid,pcpu,etime,command | grep -E 'ffmpeg|chrome-headless|hyperframes|x264' | grep -v grep  # что реально ест процессор
memory_pressure -Q; sysctl vm.swapusage; sysctl -n kern.memorystatus_vm_pressure_level; uptime  # память, своп, давление (1 норма · 2 · 4), нагрузка
ssh memex 'export PATH=/opt/homebrew/bin:$PATH; uptime; df -h ~ | tail -1; cat ~/.cache/ytai/LOAD.json'  # занят ли Memex, сколько места
Memex и прокси
python3 $R/review.py memex push · start · status · pull --no-frames  # ревью на Memex: код rsync, кат с Drive, результат назад
python3 ~/YTAI/scripts/16_proxy/pause_guard.py --thaw  # разморозить свои ffmpeg после падения сторожа
Статус в Telegram
python3 ~/YTAI/scripts/05_editing/0511_story_cut/sc_status.py $P --every 300  # живое сообщение story_cut; headless — tg_status.py --job $J
python3 ~/bin/tg.py text rya $CHAT "<b>Очередь</b> …" --parse html --no-preview  # веха; есть теги — только html; картинка — tg.py photo

14.2 · 13Где лежит

Диспетчер ресурсов
~/YTAI/scripts/18_compute/res.py · README.md · mlx_cap/ytai_mlx_cap.pyдиспетчер (rya-res), потолок кэша MLX
~/Library/LaunchAgents/ae.rya.res-guard.plist · ~/Library/Logs/rya-res-guard.logсторож — на макбуке и Memex
~/.cache/ytai/res/state.json · events.jsonl · vt.N.lock · code/ · jobs/состояние, история пауз, замки VideoToolbox, зеркало кода и задания на Memex
Очереди и замки
~/YTAI/scripts/999_extra/render_queue.py · mlx_queue.py · mlx_queue_README.mdобщая очередь (замок, пороги, --idle-pass, RENDERQ_*); модели по одной
~/YTAI/scripts/05_editing/0510_autocut/render_gate.pyвторой вход в тот же замок (autocut)
~/YTAI/scripts/16_proxy/busy_gate.py · pause_guard.pyсторожа прокси
~/.cache/ytai/render.lock · mlx.lock · render_idle_pass.txt · stage_snapshots/ · render_queue_before_*.pyсостояние на маке и прежние версии обёртки
Memex
~/YTAI/scripts/05_editing/0509_review_cycle/memex/push.sh · start.sh · watchdog.sh · pull.shкод, запуск, сторож, результат
~/YTAI/scripts/999_extra/bin/ytai_load · ~/YTAI/scripts/16_proxy/1603_farm/ (farm.py, store.py, drive.py, deploy_memex.sh, memex_space_guard.sh)флаг LOAD.json; ферма прокси от Drive — донор протокола
~/Documents/Zoom/…/RSC004_final_edits/_session_tools/memex_render.shрендер HyperFrames на Memex туннелем
Статусы
~/YTAI/scripts/05_editing/0510_headless_cut/tg_status.py · common.py · ~/YTAI/scripts/05_editing/0511_story_cut/sc_status.pyживые сообщения и вехи
~/YTAI/scripts/999_extra/gem_kb/ytuvi_progress.py · ~/bin/tg.pyпанель с полосками; отправка
Память
~/.claude/projects/-Users-romansergeev-YTAI/memory/ — feedback_macbook_render_queue · feedback_local_models_queue_macbook · feedback_memex_gets_cut_from_drive · reference_memex_mlx_stackправила Романа и случаи с датами
Очередь рендера и диспетчер · сверено 12.10.2026 по коду rya-res и замерам 11.10 23:41 – 12.10 00:25 · примеры: YTCH10 (whisper — 29 ГБ кэша MLX, 11.10) · YTTRBM02 (своп съел диск, 07.10)