Открой терминал в папке с файлом и выполни U3 — он ловит битый файл за 10 секунд, до всякой возни со звуком. ```bash ffmpeg -v error -i file.wav -f null - && echo OK ``` Пустой вывод = файл декодируется целиком. Любая строка = дальше не иди, чини источник. ---
Installs into .claude/skills of the current project.
Sponsors
SSkills DirectorySkills Directory
Know which skills are safe — weekly.
SSkills DirectorySkills Directory
Is that skill safe to install?
Are you the author of Decomposition 2026 11 05?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/siririn77-decomposition-2026-11-05-2fe629c5)
Открой терминал в папке с файлом и выполни U3 — он ловит битый файл за 10 секунд, до всякой возни со звуком.
```bash
ffmpeg -v error -i file.wav -f null - && echo OK
```
Пустой вывод = файл декодируется целиком. Любая строка = дальше не иди, чини источник.
---
## Граф
| Узел | Что | Почему важно | Якорь (чем мерить) | Когда |
|---|---|---|---|---|
| A1 Контейнер и кодек | WAV / AIFF / FLAC / MP3 / AAC | lossy→lossy перекодирование режет верх навсегда; из MP3 обратно в WAV качество не вернёшь | `ffprobe -show_streams` | первый |
| A2 Частота и битность | 44.1 или 48 кГц, 16 или 24 бит | 44.1 на видео-площадке = рассинхрон на монтаже | `ffprobe` | вместе с A1 |
| A3 Каналы | моно / стерео, пустой канал, фаза | инвертированный канал гасит звук в моно-сумме; половина слушателей в моно | `ffprobe` + прослушать моно-сумму | после A2 |
| A4 Длительность | совпадает с заявленной | обрезанный хвост = потерянный последний слог | `ffprobe format.duration` | после A1 |
| A5 Имя файла | по шаблону проекта | площадка отклоняет пробелы и кириллицу в имени | regex | последний |
| B1 Цель по громкости | LUFS площадки | площадка нормализует сама; разница в 3 LU = разный характер | спецификация площадки | до B2 |
| B2 Интегральная громкость | I, LUFS | тихий файл после нормализации звучит сжато | `ebur128` | после A |
| B3 True peak | ≤ −1.0 dBTP | AAC-энкод добавляет до +0.5 дБ; -1.0 dBFS на выходе клиппует | `ebur128=peak=true` | вместе с B2 |
| B4 Диапазон громкости | LRA | LRA < 3 LU утомляет на длинном файле | `ebur128` | вместе с B2 |
| C1 Клиппинг | сэмплы на 0 dBFS | срез верхушки слышен как треск только на хороших наушниках | `astats` Number of clipped samples | после A |
| C2 Шум и гул | 50/60 Гц, широкополосный шум | гул на −45 dB неслышен в наушниках, слышен в машине | спектрограмма | после C1 |
| C3 Щелчки и обрывы | разрывы, цифровые щелчки | щелчок на склейке = слушатель думает, что файл битый | прослушивание | после C2 |
| C4 Речевые артефакты | дыхание, плевки, свистящие | чинятся только вручную, до финального рендера | прослушивание | вместе с C3 |
| C5 DC offset | постоянная составляющая | съедает запас по пикам, щёлкает на старте | `astats` DC offset | вместе с C1 |
| D1 Начало | первые 2 с | обрезанный первый слог не восстановить | прослушивание | после C |
| D2 Конец | последние 2 с, фейд | фейд < 10 мс = щелчок | прослушивание | вместе с D1 |
| D3 Склейки и дубли | места вырезки, room tone | другой room tone на склейке слышен как «другая комната» | прослушивание | вместе с C3 |
| E1 Теги | title, artist, ISRC | пустой title = площадка ставит имя файла в каталог | `exiftool` | после D |
| E2 Обложка | вшита, ≥ 1400×1400 | часть площадок берёт только вшитую | `ffprobe -show_streams` | вместе с E1 |
| E3 Права на музыку и сэмплы | лицензия в папке проекта | claim приходит через 3 недели, снимать 4 недели | файл лицензии рядом с аудио | после D |
| E4 Маркировка контента | explicit flag, возрастное | без флага площадка снимает с витрины | тег / поле при загрузке | после E1 |
| E5 Транскрипт и субтитры | если формат требует | площадка не примет без дорожки | файл `.srt`/`.vtt` рядом | после E1 |
Рёбра:
- A1 → A2 (содержит: кодек определяет, какие параметры вообще есть в файле)
- B1 → B2 (причина: цель задаёт допустимый LUFS; без цели число B2 не с чем сравнивать)
- B2 ↔ B4 (повтор: один прогон `ebur128` даёт оба; не запускай дважды)
- C1 → B3 (причина: клиппинг до нормализации гарантирует провал по true peak)
- D3 ↔ C3 (повтор: склейка — самая частая причина щелчка; проверяй вместе)
- C5 → C1 (причина: DC offset съедает запас, клиппинг появляется раньше)
- E1 ↔ A5 (противоречие: имя файла и тег title расходятся; площадка берёт тег, человек — имя)
Вне графа: художественные решения (темп, паузы, выбор дубля). Это не проверка, это правка. Проверка только фиксирует, что правка не сломала файл.
---
## План
Файл плана: `audio-preflight.md`. Ниже — его содержимое.
### [?] Неизвестные, закрыть до старта
| # | Вопрос | Закрыть до | Как закрыть |
|---|---|---|---|
| ?1 | Целевая площадка и её спецификация (LUFS, контейнер, лимит размера) | U4 | Открыть страницу спецификации площадки, скопировать три числа в файл |
| ?2 | Максимальная длительность файла на площадке | U2 | Там же |
| ?3 | Есть ли в файле музыка или сэмплы третьих лиц | U10 | Спросить у автора музыки, не угадывать |
Без ?1 единица U4 не выполнима: сравнивать LUFS не с чем.
---
### U1. Инструменты
- Вход: машина с shell.
- Действие: `ffmpeg -version`, `ffprobe -version`, `exiftool -ver` — по одной команде.
- Выход: три строки версий.
- Проверка, которая может упасть: любая из трёх команд печатает `command not found`. Тогда поставить пакет (`brew install ffmpeg exiftool` / `apt install ffmpeg libimage-exiftool-perl`). Время: 5 мин.
### U2. Техпаспорт
- Вход: путь к файлу.
- Действие: `ffprobe -v error -show_streams -show_format file`.
- Выход: таблица codec / sample_rate / channels / bit_depth / duration / bitrate.
- Проверка: sample_rate ∈ {44100, 48000}; channels ∈ {1, 2}; duration > 0 и ≤ лимита из ?2; bit_depth = 24, если исходник WAV. Любое «нет» — стоп, вернуть на экспорт. Время: 5 с.
### U3. Декодирование целиком
- Вход: файл.
- Действие: `ffmpeg -v error -i file -f null -`.
- Выход: пустой stderr.
- Проверка: любая строка в stderr = битые кадры или обрезанный контейнер. Файл не публикуется. Время: 10–60 с (декодирование идёт примерно 100× быстрее реального времени).
### U4. Громкость и пики
- Вход: файл, целевой LUFS из ?1.
- Действие: `ffmpeg -i file -af ebur128=peak=true -f null - 2>&1 | tail -40`.
- Выход: I (LUFS), LRA, True peak (dBTP).
- Проверка: |I − цель| ≤ 0.5 LU; true peak ≤ −1.0 dBTP; LRA ≥ 3 LU. Провал любого — вернуть на нормализацию, не править громкость в редакторе вручную. Время: 30 с.
### U5. Статистика сигнала
- Вход: файл.
- Действие: `ffmpeg -i file -af astats=metadata=1 -f null - 2>&1 | grep -E "DC offset|Peak level|Flat factor|Number of clipped"`.
- Выход: четыре числа.
- Проверка: DC offset < 0.001; Number of clipped samples = 0; Flat factor < 10. Время: 10 с.
### U6. Спектрограмма
- Вход: файл.
- Действие: `ffmpeg -i file -lavfi showspectrumpic=s=1920x1080 spec.png`.
- Выход: картинка.
- Проверка: нет горизонтальной линии на 50 или 60 Гц выше −60 dB; нет ровного среза верха у WAV (у lossy срез выше 16 кГц — норма, не флаг). Время: 30 с.
### U7. Прослушивание целиком
- Вход: файл, наушники, лист бумаги.
- Действие: слушать от начала до конца, один раз, на скорости 1×. Каждое замечание — таймкод плюс одно слово (дыхание / щелчок / склейка / гул).
- Выход: список таймкодов.
- Проверка: каждая строка списка имеет решение «оставить» или «править». Строка без решения = единица не закрыта. Время: 1× длительности файла (30-минутный файл — 30 мин; это самая долгая единица).
### U8. Края
- Вход: файл, таймкоды 0:00–0:02 и конец − 2 с.
- Действие: прослушать два фрагмента отдельно.
- Выход: два фрагмента.
- Проверка: нет обрезанного первого и последнего слога; на концах фейд ≥ 10 мс, если это не речь встык. Время: 5 мин.
### U9. Метаданные
- Вход: файл.
- Действие: `exiftool file`.
- Выход: список тегов.
- Проверка: title, artist заполнены; нет тега `encoder` с чужим именем (признак чужого экспорта); обложка вшита и ≥ 1400×1400 (проверить `ffprobe -show_streams`, поток с `disposition: attached_pic`). Время: 2 мин.
### U10. Права
- Вход: папка проекта.
- Действие: сверить файл лицензии на музыку/сэмплы с треком из ?3.
- Выход: имя файла лицензии.
- Проверка: имя лицензии совпадает с именем трека; для сэмплов указан источник. Нет файла — публикация остановлена. Время: 5 мин.
### U11. Имя, загрузка, контрольная копия
- Вход: файл.
- Действие: переименовать по шаблону `YYYY-MM-DD_slug_vN.wav`, загрузить на площадку, скачать обратно.
- Выход: скачанный файл.
- Проверка: имя проходит regex; скачанный файл прогнан через U3 и U4 и даёт те же I и true peak ±0.1. Площадка перекодировала или обрезала — стоп. Время: 10 мин.
**Бюджет:** 30-минутный файл — 1 ч 5 мин, из них 30 мин это U7.
### Журнал дрейфа (append-only)
Формат строки: `дата | единица | что изменилось | причина`. Не редактировать прошлые строки, только дописывать.
### Пост-мортем, раздел «план против факта»
Заполняется после публикации. По каждой единице: что план обещал, что случилось, чем мерили. Единица, где факт разошёлся с планом, получает строку в журнал дрейфа и правку в план для следующего файла.
---
**Что теперь работает