внутренняя модель перестроена вокруг аудиозаписи

- audiorecords вместо transcribe_jobs: приложения (texts, structures,
  recognitions, record_events, topics) живут своими коллекциями, ссылки на
  исходник и на приведённую копию перестали переставляться
- рубеж называет достигнутое, отказ стал признаком остановки с причиной, а
  сторожей стало двое: число отказов и время в рубеже
- воркеры потеряли специализацию, их число задаётся [pipeline] workers, шаг
  выбирается по рубежу, а захват отдаёт идентификатор и признак захвата
This commit is contained in:
av
2026-08-14 20:20:33 +03:00
parent d079f03350
commit 1576d06735
84 changed files with 8973 additions and 2865 deletions
+50
View File
@@ -0,0 +1,50 @@
package entity
// Источник события журнала записи.
const (
// EventOriginPipeline — событие произвёл шаг конвейера.
EventOriginPipeline = "pipeline"
// EventOriginHuman — событие произвёл человек: перезапуск виден в журнале с
// указанием, кто его сделал.
EventOriginHuman = "human"
)
// Исход события.
const (
EventOutcomeDone = "done"
EventOutcomeFailed = "failed"
EventOutcomeHalted = "halted"
EventOutcomeResumed = "resumed"
)
// AllEventOrigins — закрытый перечень источников для схемы хранилища.
func AllEventOrigins() []string {
return []string{EventOriginPipeline, EventOriginHuman}
}
// AllEventOutcomes — закрытый перечень исходов для схемы хранилища.
func AllEventOutcomes() []string {
return []string{EventOutcomeDone, EventOutcomeFailed, EventOutcomeHalted, EventOutcomeResumed}
}
// RecordEvent — строка журнала событий одной записи.
//
// Пишется на смену рубежа, на остановку и на снятие остановки — не на каждое
// откладывание опроса: часовая запись дала бы сотни строк ни о чём. Ни один шаг
// конвейера этот журнал не читает, чтобы решить, что делать дальше: решение
// принимается по рубежу записи, и второй источник решения разошёлся бы с первым
// молча.
//
// Содержимое записи сюда не попадает — инвариант приватности действует здесь
// наравне с журналом сервиса. Поле текста отказа зовётся `OutcomeText`, а не
// `error_text`: последнее имя названо поимённо инвариантом о секрете, и две
// колонки с этим именем сделали бы инвариант двусмысленным.
type RecordEvent struct {
Id string
RecordID string
Origin string
Step string
Outcome string
OutcomeText string
DurationMs int64
}