@skyphusion-labs/vivijure-core 1.24.0 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/clip-content-validate.d.ts +39 -3
  2. package/dist/clip-content-validate.d.ts.map +1 -1
  3. package/dist/clip-content-validate.js +96 -9
  4. package/dist/clip-content-validate.js.map +1 -1
  5. package/dist/clip-job-model.d.ts +18 -0
  6. package/dist/clip-job-model.d.ts.map +1 -1
  7. package/dist/clip-job-model.js.map +1 -1
  8. package/dist/clip-validate.d.ts +19 -0
  9. package/dist/clip-validate.d.ts.map +1 -1
  10. package/dist/clip-validate.js +112 -14
  11. package/dist/clip-validate.js.map +1 -1
  12. package/dist/film-model.d.ts +75 -0
  13. package/dist/film-model.d.ts.map +1 -1
  14. package/dist/film-model.js +88 -2
  15. package/dist/film-model.js.map +1 -1
  16. package/dist/film-orchestrator.d.ts +20 -1
  17. package/dist/film-orchestrator.d.ts.map +1 -1
  18. package/dist/film-orchestrator.js +186 -45
  19. package/dist/film-orchestrator.js.map +1 -1
  20. package/dist/film-output-key.d.ts +24 -1
  21. package/dist/film-output-key.d.ts.map +1 -1
  22. package/dist/film-output-key.js +31 -6
  23. package/dist/film-output-key.js.map +1 -1
  24. package/dist/render-orchestrator.d.ts +2 -1
  25. package/dist/render-orchestrator.d.ts.map +1 -1
  26. package/dist/render-orchestrator.js +21 -3
  27. package/dist/render-orchestrator.js.map +1 -1
  28. package/dist/render-output-payload.d.ts.map +1 -1
  29. package/dist/render-output-payload.js +23 -1
  30. package/dist/render-output-payload.js.map +1 -1
  31. package/dist/runpod-job-log.d.ts.map +1 -1
  32. package/dist/runpod-job-log.js +26 -2
  33. package/dist/runpod-job-log.js.map +1 -1
  34. package/dist/video-finish-assemble.d.ts +6 -1
  35. package/dist/video-finish-assemble.d.ts.map +1 -1
  36. package/dist/video-finish-assemble.js +41 -11
  37. package/dist/video-finish-assemble.js.map +1 -1
  38. package/package.json +1 -1
@@ -15,17 +15,38 @@ export interface InspectResult {
15
15
  error?: string;
16
16
  }
17
17
  /** Call the video-finish container's POST /inspect, retrying the transient gateway statuses (503/504) the
18
- * way callVideoFinish does for /finish. backoffMs is injectable so tests do not wait. Returns the parsed
19
- * result, or null on an unreachable container / non-JSON / non-2xx (the caller treats null as skip). */
18
+ * way callVideoFinish does for /finish. backoffMs is injectable so tests do not wait.
19
+ *
20
+ * Returns the parsed result, or an UNREACHABLE marker the caller can act on (core#321). The
21
+ * distinction is not cosmetic: contentValidateDoneClips walks shots SEQUENTIALLY, so a container
22
+ * that is down costs its whole retry budget once per shot.
23
+ *
24
+ * A THROWN fetch (NXDOMAIN, connection refused, a container that died before binding 8000, which is
25
+ * cf#851's exact signature) is NOT the gateway-busy condition the backoff was written for, and one
26
+ * attempt establishes it. It used to retry anyway, because the loop's break tested
27
+ * `resp && resp.status !== 503 ...` and a throw leaves resp null, which is falsy, which is not a
28
+ * break. Three attempts at 1500ms, per shot, sequentially: about 3s a shot, roughly 51s of a finish
29
+ * pass on a 17-shot film, re-paid on later ticks because core#30 says not to persist the skip.
30
+ *
31
+ * The 503/504 retry is UNCHANGED and deliberately so: that one is the container saying "busy, come
32
+ * back", and cutting it would trade this latency problem for a coverage problem, i.e. more false
33
+ * `unmeasured` records, which is the state cf#856 exists to make visible. */
20
34
  export declare function callVideoFinishInspect(env: Env, payload: {
21
35
  clipUrl: string;
22
36
  keyframeUrl?: string;
23
37
  }, opts?: {
24
38
  retries?: number;
25
39
  backoffMs?: number;
26
- }): Promise<InspectResult | null>;
40
+ }): Promise<InspectResult | {
41
+ unreachable: true;
42
+ } | null>;
27
43
  export interface ContentVerdict {
28
44
  verdict: "ok" | "suspect" | "corrupt" | "skip";
45
+ /** core#321: this skip means "the container is not serving", not "this one clip could not be
46
+ * inspected". The per-pass breaker trips on THIS FIELD, never on a reason string: a string match
47
+ * is not a relationship, and a reason is prose that someone will reword without thinking about a
48
+ * breaker. */
49
+ unreachable?: true;
29
50
  reason?: string;
30
51
  metrics?: InspectResult["metrics"];
31
52
  keyframe_similarity?: number | null;
@@ -40,4 +61,19 @@ export declare function contentValidateClip(env: Env, clipKey: string, keyframeK
40
61
  * `clip.content_validate` structured event per shot. Returns true iff it changed any shot; the CALLER owns
41
62
  * the job-doc write. A no-op (returns false immediately) when the video-finish tier is not installed. */
42
63
  export declare function contentValidateDoneClips(env: Env, job: ClipJob, inspect?: (env: Env, clipKey: string, keyframeKey?: string) => Promise<ContentVerdict>): Promise<boolean>;
64
+ /** cf#856: what Layer 2 actually MEASURED on this clip job, for the render record.
65
+ *
66
+ * THE LADDER, the same three states cf#836 established for the per-stage degrades, because the
67
+ * failure they both prevent is the same one (two states reported as one):
68
+ * undefined -> Layer 2 never ran on this job at all. NOT MEASURED. (Self-host with no
69
+ * VIDEO_FINISH_URL is exactly this, and it is honest: the tier is not installed.)
70
+ * unmeasured 0 -> it ran on every done clip and every one got a verdict.
71
+ * unmeasured n -> it could not measure n of them, and `reasons` says why, verbatim.
72
+ *
73
+ * Counts the population Layer 2 covers: DONE shots that produced a clip. */
74
+ export declare function contentValidationView(job: ClipJob): {
75
+ checked: number;
76
+ unmeasured: number;
77
+ reasons: string[];
78
+ } | undefined;
43
79
  //# sourceMappingURL=clip-content-validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clip-content-validate.d.ts","sourceRoot":"","sources":["../src/clip-content-validate.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD,8GAA8G;AAC9G,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;yGAEyG;AACzG,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA0B/B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;kFACkF;AAClF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAalH;AAED;;;;;0GAK0G;AAC1G,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAuB,GAC1G,OAAO,CAAC,OAAO,CAAC,CAgClB"}
1
+ {"version":3,"file":"clip-content-validate.d.ts","sourceRoot":"","sources":["../src/clip-content-validate.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD,8GAA8G;AAC9G,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,sBAAsB,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtG,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;8EAgB8E;AAC9E,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAClD,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,aAAa,GAAG;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAsCvD;AAOD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C;;;mBAGe;IACf,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;kFACkF;AAClF,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAgBlH;AAED;;;;;0GAK0G;AAC1G,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAuB,GAC1G,OAAO,CAAC,OAAO,CAAC,CAuDlB;AAED;;;;;;;;;6EAS6E;AAC7E,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,GACX;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAgBxE"}
@@ -22,8 +22,22 @@ import { presignR2Get } from "./presign.js";
22
22
  import { emitStructuredEvent } from "./structured-events.js";
23
23
  const INSPECT_TTL_SECONDS = 1800;
24
24
  /** Call the video-finish container's POST /inspect, retrying the transient gateway statuses (503/504) the
25
- * way callVideoFinish does for /finish. backoffMs is injectable so tests do not wait. Returns the parsed
26
- * result, or null on an unreachable container / non-JSON / non-2xx (the caller treats null as skip). */
25
+ * way callVideoFinish does for /finish. backoffMs is injectable so tests do not wait.
26
+ *
27
+ * Returns the parsed result, or an UNREACHABLE marker the caller can act on (core#321). The
28
+ * distinction is not cosmetic: contentValidateDoneClips walks shots SEQUENTIALLY, so a container
29
+ * that is down costs its whole retry budget once per shot.
30
+ *
31
+ * A THROWN fetch (NXDOMAIN, connection refused, a container that died before binding 8000, which is
32
+ * cf#851's exact signature) is NOT the gateway-busy condition the backoff was written for, and one
33
+ * attempt establishes it. It used to retry anyway, because the loop's break tested
34
+ * `resp && resp.status !== 503 ...` and a throw leaves resp null, which is falsy, which is not a
35
+ * break. Three attempts at 1500ms, per shot, sequentially: about 3s a shot, roughly 51s of a finish
36
+ * pass on a 17-shot film, re-paid on later ticks because core#30 says not to persist the skip.
37
+ *
38
+ * The 503/504 retry is UNCHANGED and deliberately so: that one is the container saying "busy, come
39
+ * back", and cutting it would trade this latency problem for a coverage problem, i.e. more false
40
+ * `unmeasured` records, which is the state cf#856 exists to make visible. */
27
41
  export async function callVideoFinishInspect(env, payload, opts = {}) {
28
42
  if (!videoFinishReachable(env))
29
43
  return null;
@@ -34,30 +48,47 @@ export async function callVideoFinishInspect(env, payload, opts = {}) {
34
48
  headers: await mediaFinishHeaders(env),
35
49
  body: JSON.stringify(payload),
36
50
  };
37
- let resp = null;
51
+ let last;
38
52
  for (let attempt = 0; attempt < retries; attempt++) {
53
+ let resp;
39
54
  try {
40
55
  resp = await videoFinishFetch(env, "/inspect", init);
41
56
  }
42
57
  catch (e) {
43
58
  if (isMediaFinishAuthError(e))
44
59
  throw e;
45
- resp = null;
60
+ // The transport itself failed. No amount of waiting makes a name resolve or a dead process
61
+ // bind, so stop here instead of sleeping twice to ask the same question.
62
+ return { unreachable: true };
46
63
  }
47
- if (resp && resp.status !== 503 && resp.status !== 504)
64
+ // videoFinishFetch RESOLVES to null when the door is unset or could not be reached at all.
65
+ // Same class as a throw, equally unhelped by waiting, and it used to sit in the retry loop too
66
+ // because the old break condition (`resp && ...`) read null as "keep trying".
67
+ if (!resp)
68
+ return { unreachable: true };
69
+ last = resp;
70
+ if (resp.status !== 503 && resp.status !== 504)
48
71
  break;
49
72
  if (attempt < retries - 1)
50
73
  await new Promise((r) => setTimeout(r, backoffMs));
51
74
  }
52
- if (!resp || !resp.ok)
53
- return null;
75
+ // Exhausted the 503/504 budget, or a non-2xx answer: the tier is up but not serving this call.
76
+ if (!last || !last.ok)
77
+ return { unreachable: true };
54
78
  try {
55
- return (await resp.json());
79
+ return (await last.json());
56
80
  }
57
81
  catch {
82
+ // It answered 2xx with a body that will not parse. That is the container misbehaving on THIS
83
+ // clip, not the tier being down, so it is not an unreachable marker and must not trip the
84
+ // per-pass breaker.
58
85
  return null;
59
86
  }
60
87
  }
88
+ /** True when the inspect call could not reach a serving container at all (core#321). */
89
+ function isUnreachable(r) {
90
+ return r !== null && r.unreachable === true;
91
+ }
61
92
  /** Presign the clip (and its keyframe, when known) and ask the container for a content verdict. Skips
62
93
  * honestly (never throws, never fails a render) when the tier is unavailable. */
63
94
  export async function contentValidateClip(env, clipKey, keyframeKey) {
@@ -74,6 +105,9 @@ export async function contentValidateClip(env, clipKey, keyframeKey) {
74
105
  return { verdict: "skip", reason: `presign failed: ${e instanceof Error ? e.message : String(e)}` };
75
106
  }
76
107
  const r = await callVideoFinishInspect(env, { clipUrl, keyframeUrl });
108
+ if (isUnreachable(r)) {
109
+ return { verdict: "skip", reason: "video-finish /inspect unreachable or errored", unreachable: true };
110
+ }
77
111
  if (!r || !r.ok || !r.verdict)
78
112
  return { verdict: "skip", reason: "video-finish /inspect unreachable or errored" };
79
113
  return { verdict: r.verdict, reason: r.reason, metrics: r.metrics, keyframe_similarity: r.keyframe_similarity };
@@ -88,6 +122,12 @@ export async function contentValidateDoneClips(env, job, inspect = contentValida
88
122
  if (!videoFinishReachable(env))
89
123
  return false;
90
124
  let changed = false;
125
+ // core#321: once ONE shot has established that the container is not serving, the remaining shots
126
+ // in this pass do not re-probe it. They still get the cf#856 unmeasured record, because the film
127
+ // is equally unvouched-for either way and a record that depended on probe ORDER would be a worse
128
+ // lie than no record at all. O(shots) transport failures become O(1) per pass, and nothing is
129
+ // latched beyond this pass: the next tick starts clean and tries again.
130
+ let tierDown;
91
131
  for (const shot of job.shots) {
92
132
  // #30: "skip" (a transient /inspect outage or the tier being unavailable) is NOT a validation result, so
93
133
  // it must not short-circuit re-inspection -- only a terminal verdict (ok / suspect / corrupt) counts as
@@ -95,10 +135,30 @@ export async function contentValidateDoneClips(env, job, inspect = contentValida
95
135
  // (the pixel/noise gate) for the whole pass and the clip ships ungated.
96
136
  if (shot.status !== "done" || !shot.clip_key || (shot.content_validated && shot.content_validated !== "skip"))
97
137
  continue;
98
- const v = await inspect(env, shot.clip_key, shot.keyframe_key);
138
+ const v = tierDown
139
+ ? { verdict: "skip", reason: tierDown, unreachable: true }
140
+ : await inspect(env, shot.clip_key, shot.keyframe_key);
141
+ if (v.unreachable && !tierDown)
142
+ tierDown = v.reason ?? "video-finish /inspect unreachable";
99
143
  // Don't persist "skip" as a verdict: leave it unset so a later tick re-inspects.
100
144
  if (v.verdict !== "skip")
101
145
  shot.content_validated = v.verdict;
146
+ // cf#856: but DO say that it could not run. Measured on a live film while the container was
147
+ // crashing: 5 skips, 0 passes, and the film advanced with nothing anywhere recording that the
148
+ // pixel gate never looked at a single clip. A skip left only in a log line is indistinguishable
149
+ // from a pass to every reader except one who happened to have `wrangler tail` attached.
150
+ // SEPARATE from content_validated on purpose (see #30 above): the verdict stays unset so
151
+ // re-inspection still happens, and this carries the reason meanwhile. Written only when it
152
+ // CHANGES, so a down inspector does not rewrite the doc every tick, and cleared the moment a
153
+ // terminal verdict lands, so it cannot go stale.
154
+ const unmeasured = v.verdict === "skip" ? (v.reason ?? "content validation could not run") : undefined;
155
+ if (shot.content_unmeasured !== unmeasured) {
156
+ if (unmeasured)
157
+ shot.content_unmeasured = unmeasured;
158
+ else
159
+ delete shot.content_unmeasured;
160
+ changed = true;
161
+ }
102
162
  emitStructuredEvent({
103
163
  ev: "clip.content_validate",
104
164
  job_id: job.job_id,
@@ -121,4 +181,31 @@ export async function contentValidateDoneClips(env, job, inspect = contentValida
121
181
  }
122
182
  return changed;
123
183
  }
184
+ /** cf#856: what Layer 2 actually MEASURED on this clip job, for the render record.
185
+ *
186
+ * THE LADDER, the same three states cf#836 established for the per-stage degrades, because the
187
+ * failure they both prevent is the same one (two states reported as one):
188
+ * undefined -> Layer 2 never ran on this job at all. NOT MEASURED. (Self-host with no
189
+ * VIDEO_FINISH_URL is exactly this, and it is honest: the tier is not installed.)
190
+ * unmeasured 0 -> it ran on every done clip and every one got a verdict.
191
+ * unmeasured n -> it could not measure n of them, and `reasons` says why, verbatim.
192
+ *
193
+ * Counts the population Layer 2 covers: DONE shots that produced a clip. */
194
+ export function contentValidationView(job) {
195
+ const covered = job.shots.filter((s) => s.status === "done" && s.clip_key);
196
+ const checked = covered.filter((s) => s.content_validated && s.content_validated !== "skip").length;
197
+ const blocked = covered.filter((s) => typeof s.content_unmeasured === "string" && s.content_unmeasured.length > 0);
198
+ if (checked === 0 && blocked.length === 0)
199
+ return undefined;
200
+ const seen = new Set();
201
+ const reasons = [];
202
+ for (const s of blocked) {
203
+ const r = s.content_unmeasured;
204
+ if (seen.has(r))
205
+ continue;
206
+ seen.add(r);
207
+ reasons.push(r);
208
+ }
209
+ return { checked, unmeasured: blocked.length, reasons };
210
+ }
124
211
  //# sourceMappingURL=clip-content-validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clip-content-validate.js","sourceRoot":"","sources":["../src/clip-content-validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clip-content-validate.js","sourceRoot":"","sources":["../src/clip-content-validate.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,wGAAwG;AACxG,uGAAuG;AACvG,qGAAqG;AACrG,qGAAqG;AACrG,yGAAyG;AACzG,8CAA8C;AAC9C,EAAE;AACF,0GAA0G;AAC1G,uGAAuG;AACvG,uGAAuG;AACvG,qGAAqG;AACrG,0FAA0F;AAC1F,0GAA0G;AAC1G,gFAAgF;AAChF,EAAE;AACF,sGAAsG;AACtG,oEAAoE;AAGpE,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE5H,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAYjC;;;;;;;;;;;;;;;;8EAgB8E;AAC9E,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAQ,EACR,OAAkD,EAClD,IAAI,GAA6C,EAAE;IAEnD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IACzC,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,MAAM,kBAAkB,CAAC,GAAG,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC;IACF,IAAI,IAA0B,CAAC;IAC/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACnD,IAAI,IAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,sBAAsB,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAC;YACvC,2FAA2F;YAC3F,yEAAyE;YACzE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,2FAA2F;QAC3F,+FAA+F;QAC/F,8EAA8E;QAC9E,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACxC,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM;QACtD,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,+FAA+F;IAC/F,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAkB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,6FAA6F;QAC7F,0FAA0F;QAC1F,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,SAAS,aAAa,CAAC,CAA+C;IACpE,OAAO,CAAC,KAAK,IAAI,IAAK,CAA4B,CAAC,WAAW,KAAK,IAAI,CAAC;AAC1E,CAAC;AAcD;kFACkF;AAClF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAQ,EAAE,OAAe,EAAE,WAAoB;IACvF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,0DAA0D,EAAE,CAAC;IAC/H,IAAI,OAAe,CAAC;IACpB,IAAI,WAA+B,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,IAAI,WAAW;YAAE,WAAW,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAC3F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACtG,CAAC;IACD,MAAM,CAAC,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8CAA8C,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACxG,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8CAA8C,EAAE,CAAC;IAClH,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC;AAClH,CAAC;AAED;;;;;0GAK0G;AAC1G,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAQ,EACR,GAAY,EACZ,OAAO,GAAiF,mBAAmB;IAE3G,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,iGAAiG;IACjG,iGAAiG;IACjG,iGAAiG;IACjG,8FAA8F;IAC9F,wEAAwE;IACxE,IAAI,QAA4B,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,yGAAyG;QACzG,wGAAwG;QACxG,wGAAwG;QACxG,wEAAwE;QACxE,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,KAAK,MAAM,CAAC;YAAE,SAAS;QACxH,MAAM,CAAC,GAAmB,QAAQ;YAChC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE;YAC1D,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,QAAQ;YAAE,QAAQ,GAAG,CAAC,CAAC,MAAM,IAAI,mCAAmC,CAAC;QAC3F,iFAAiF;QACjF,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM;YAAE,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC;QAC7D,4FAA4F;QAC5F,8FAA8F;QAC9F,gGAAgG;QAChG,wFAAwF;QACxF,yFAAyF;QACzF,2FAA2F;QAC3F,6FAA6F;QAC7F,iDAAiD;QACjD,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,kCAAkC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,IAAI,IAAI,CAAC,kBAAkB,KAAK,UAAU,EAAE,CAAC;YAC3C,IAAI,UAAU;gBAAE,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;;gBAChD,OAAO,IAAI,CAAC,kBAAkB,CAAC;YACpC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,mBAAmB,CAAC;YAClB,EAAE,EAAE,uBAAuB;YAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,CAAC,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,KAAK,GAAG,mCAAmC,CAAC,CAAC,MAAM,IAAI,gCAAgC,EAAE,CAAC;YAC/F,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;YACtB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,MAAM,IAAI,2BAA2B,CAAC,CAAC,yCAAyC;YAC1G,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;6EAS6E;AAC7E,MAAM,UAAU,qBAAqB,CACnC,GAAY;IAEZ,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,iBAAiB,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACpG,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,kBAAkB,KAAK,QAAQ,IAAI,CAAC,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CACnF,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,kBAA4B,CAAC;QACzC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,SAAS;QAC1B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAC1D,CAAC"}
@@ -21,8 +21,26 @@ export interface ClipShot extends ClipShotInput {
21
21
  runpod_job_id?: string;
22
22
  cancel_sent?: boolean;
23
23
  validated?: "pass" | "fail" | "skip";
24
+ /** core#310: why Layer 1 COULD NOT RUN on this shot, when it could not.
25
+ *
26
+ * The same split core#30 made for Layer 2 and cf#856 gave a word to, applied one layer down:
27
+ * `validated` holds a VERDICT and stays unset on a skip so the next tick re-validates, while
28
+ * this carries the honest reason meanwhile. Before this, a skip was written into `validated`,
29
+ * where it is truthy, so the idempotence guard short-circuited and a shot whose artifact was
30
+ * momentarily unreadable was never structurally checked again. Cleared the moment a verdict
31
+ * lands. */
32
+ validated_unmeasured?: string;
24
33
  content_validated?: "ok" | "suspect" | "corrupt" | "skip";
25
34
  content_degraded?: string;
35
+ /** cf#856: why Layer 2 COULD NOT RUN on this shot, when it could not.
36
+ *
37
+ * Deliberately NOT `content_validated = "skip"`. #30 established that a skip must not be
38
+ * persisted as a verdict, because a truthy value there short-circuits re-inspection and one
39
+ * inspector blip disables the pixel gate for the whole pass. So the two facts are separate
40
+ * fields: `content_validated` stays UNSET so the next tick re-inspects, and this says out loud
41
+ * that the last attempt could not measure anything. Cleared the moment a terminal verdict lands,
42
+ * so it can never be stale. */
43
+ content_unmeasured?: string;
26
44
  delivered_fps?: number;
27
45
  delivered_frames?: number;
28
46
  /** cf#507b: the clip's ACTUAL pixel dimensions, as probed from its mp4 `tkhd` box.
@@ -1 +1 @@
1
- {"version":3,"file":"clip-job-model.d.ts","sourceRoot":"","sources":["../src/clip-job-model.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAS,SAAQ,aAAa;IAC7C,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC,iBAAiB,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;uFAQmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAGtC,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAKrD"}
1
+ {"version":3,"file":"clip-job-model.d.ts","sourceRoot":"","sources":["../src/clip-job-model.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,QAAS,SAAQ,aAAa;IAC7C,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACrC;;;;;;;iBAOa;IACb,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;oCAOgC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;uFAQmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sEAAsE;IACtE,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAGtC,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAIzB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAKrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"clip-job-model.js","sourceRoot":"","sources":["../src/clip-job-model.ts"],"names":[],"mappings":"AAAA,iFAAiF;AA4EjF,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;AACpG,CAAC"}
1
+ {"version":3,"file":"clip-job-model.js","sourceRoot":"","sources":["../src/clip-job-model.ts"],"names":[],"mappings":"AAAA,iFAAiF;AA8FjF,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACrE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,MAAM,KAAK,KAAK,EAAE,CAAC;AACpG,CAAC"}
@@ -30,4 +30,23 @@ export interface MoovInfo {
30
30
  export declare function parseMoov(buf: Uint8Array, start?: number, end?: number): MoovInfo;
31
31
  export declare function judgeClip(checks: ClipValidateChecks): ClipValidateResult;
32
32
  export declare function validateClipArtifact(env: Env, key: string, expectedSeconds: number): Promise<ClipValidateResult>;
33
+ export declare const FILM_MIN_BYTES = 2048;
34
+ export declare const FILM_MIN_DURATION_S = 0.15;
35
+ /** PURE: the film verdict over the same checks. Fails ONLY on positive evidence, like judgeClip.
36
+ *
37
+ * HONEST LIMIT, stated so nobody reads this as more than it is: the floor is structural. A film
38
+ * that concatenated 3 of its 12 shots is a structurally perfect mp4 and passes here. Shot-count
39
+ * honesty is the #697 duration gate's job, upstream, on the container's per-clip report. */
40
+ export declare function judgeFilm(checks: ClipValidateChecks): ClipValidateResult;
41
+ /** Is the assembled film at `key` a deliverable film? Three outcomes, and the difference between
42
+ * the last two is the whole point:
43
+ * - "fail": positive evidence it is NOT a film (absent, under the byte floor, not an mp4, no
44
+ * video track, zero frames). The render fails loud rather than shipping it as complete.
45
+ * - "skip": the object IS there and over the floor, but its bytes could not be read this tick.
46
+ * That is an R2 condition, not a verdict on the artifact, and a fully rendered film must not
47
+ * die on a read blip. The caller ships it and says so.
48
+ * - "pass": parsed and sane.
49
+ *
50
+ * NEVER throws. */
51
+ export declare function validateFilmArtifact(env: Env, key: string): Promise<ClipValidateResult>;
33
52
  //# sourceMappingURL=clip-validate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clip-validate.d.ts","sourceRoot":"","sources":["../src/clip-validate.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAM9D,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAIxC,eAAO,MAAM,cAAc,QAAkB,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAmCD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAMD,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,SAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,QAAQ,CAIxF;AAyED,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAqBxE;AA4BD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CtH"}
1
+ {"version":3,"file":"clip-validate.d.ts","sourceRoot":"","sources":["../src/clip-validate.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oCAAoC,CAAC;AAM9D,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAIxC,eAAO,MAAM,cAAc,QAAkB,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAmCD,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAMD,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,SAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,QAAQ,CAIxF;AAyED,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAqBxE;AAyFD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqBtH;AAYD,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAIxC;;;;6FAI6F;AAC7F,wBAAgB,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,CAiBxE;AAED;;;;;;;;;oBASoB;AACpB,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoB7F"}
@@ -176,11 +176,17 @@ export function judgeClip(checks) {
176
176
  // its size, never downloaded). moov may be at the front (faststart) or after mdat; both are handled.
177
177
  async function locateStructure(read, totalBytes) {
178
178
  let ftypOk = false;
179
+ // cf#835: an object HEAD says exists whose first box header will not come back is an I/O
180
+ // condition, not evidence about its content. The CLIP judge does not use this -- its verdict on an
181
+ // unreadable body is unchanged (a fail, via container:false) -- and the FILM judge does, because
182
+ // failing a fully rendered film on a read blip would be the opposite of what this gate is for.
183
+ let readable = false;
179
184
  let offset = 0;
180
185
  for (let i = 0; i < MAX_TOPLEVEL_BOXES && offset + 8 <= totalBytes; i++) {
181
186
  const hdrBytes = await read(offset, 16);
182
187
  if (!hdrBytes || hdrBytes.length < 8)
183
188
  break;
189
+ readable = true;
184
190
  const h = readBoxHeader(hdrBytes, 0);
185
191
  if (!h)
186
192
  break;
@@ -190,24 +196,19 @@ async function locateStructure(read, totalBytes) {
190
196
  ftypOk = true;
191
197
  }
192
198
  if (h.type === "moov")
193
- return { ftypOk, moov: { offset, size: h.size, headerSize: h.headerSize } };
199
+ return { ftypOk, readable, moov: { offset, size: h.size, headerSize: h.headerSize } };
194
200
  if (h.size === 0)
195
201
  break; // last box extends to EOF and is not moov
196
202
  offset += h.size;
197
203
  }
198
- return { ftypOk };
204
+ return { ftypOk, readable };
199
205
  }
200
- // Async wrapper: bounded R2 reads -> structural checks -> verdict. NEVER throws; an unreadable artifact
201
- // is a "skip" (transient), not a fail, so a blip cannot false-reject a real render. Returns skip when
202
- // validation is disabled or the object is absent.
203
- export async function validateClipArtifact(env, key, expectedSeconds) {
206
+ async function probeMp4Artifact(env, key, expectedSeconds) {
204
207
  const empty = { container: false, video_track: false, duration_s: null, expected_s: expectedSeconds, frames: null, width: null, height: null, bytes: 0 };
205
- if (!CLIP_VALIDATE_ENABLED)
206
- return { verdict: "skip", reason: "clip validation disabled", checks: empty };
207
208
  try {
208
209
  const head = await env.R2_RENDERS.head(key);
209
210
  if (!head)
210
- return { verdict: "skip", reason: "clip artifact not found in R2", checks: empty };
211
+ return { present: false, readable: false, threw: false, checks: empty };
211
212
  const totalBytes = head.size;
212
213
  const checks = { ...empty, bytes: totalBytes };
213
214
  const read = async (offset, length) => {
@@ -238,15 +239,112 @@ export async function validateClipArtifact(env, key, expectedSeconds) {
238
239
  }
239
240
  // #25: payloadLen <= 0 (a header-only moov where size === headerSize, or a size-0 "extends to EOF"
240
241
  // box) is a CORRUPT container, not a trustworthy one. Fall through leaving video_track FALSE so
241
- // judgeClip fails the "no video track" gate, instead of the old blanket `else` trusting it and
242
+ // the judge fails the "no video track" gate, instead of the old blanket `else` trusting it and
242
243
  // shipping a degenerate ftyp+empty-moov+noise-mdat clip (the self-host path with no VIDEO_FINISH_URL
243
244
  // content-validate is most exposed).
244
245
  }
245
- return judgeClip(checks);
246
+ return { present: true, readable: loc.readable, threw: false, checks };
247
+ }
248
+ catch {
249
+ // Reading/parsing threw: report it as an unreadable probe and let each judge decide. Neither
250
+ // judge fails a render on this: the clip gate skips, the film gate skips.
251
+ return { present: false, readable: false, threw: true, checks: empty };
252
+ }
253
+ }
254
+ // Async wrapper: bounded R2 reads -> structural checks -> verdict. NEVER throws; an unreadable artifact
255
+ // is a "skip" (transient), not a fail, so a blip cannot false-reject a real render. Returns skip when
256
+ // validation is disabled or the object is absent.
257
+ export async function validateClipArtifact(env, key, expectedSeconds) {
258
+ const empty = { container: false, video_track: false, duration_s: null, expected_s: expectedSeconds, frames: null, width: null, height: null, bytes: 0 };
259
+ if (!CLIP_VALIDATE_ENABLED)
260
+ return { verdict: "skip", reason: "clip validation disabled", checks: empty };
261
+ const probe = await probeMp4Artifact(env, key, expectedSeconds);
262
+ if (probe.threw)
263
+ return { verdict: "skip", reason: "clip validation errored", checks: empty };
264
+ if (!probe.present)
265
+ return { verdict: "skip", reason: "clip artifact not found in R2", checks: empty };
266
+ // core#310: the docstring above has always promised that an unreadable artifact is a SKIP, and for
267
+ // one of the three ways to be unreadable the code did the opposite. When HEAD said the object
268
+ // exists but a ranged GET came back empty, locateStructure broke out with ftypOk false and
269
+ // judgeClip reported "not a valid mp4 (no ftyp/moov box tree); corrupt or wrong format" -- a
270
+ // positive claim about CONTENT, from a read that returned no content, which then failed the shot.
271
+ //
272
+ // ORDER MATTERS AND THIS IS THE WHOLE SUBTLETY: the byte floor is judged FIRST, so a 0-byte or
273
+ // truncated clip still FAILS on its size rather than being excused as unreadable. An empty body
274
+ // and an unreadable body are indistinguishable at the transport level, and size is the thing that
275
+ // separates them. Same order, for the same reason, as validateFilmArtifact (cf#835).
276
+ if (probe.checks.bytes < CLIP_MIN_BYTES)
277
+ return judgeClip(probe.checks);
278
+ if (!probe.readable) {
279
+ return { verdict: "skip", reason: "clip artifact present but its bytes could not be read this tick", checks: probe.checks };
280
+ }
281
+ return judgeClip(probe.checks);
282
+ }
283
+ // --- cf#835: the same parser, judged for an ASSEMBLED FILM ------------------------------------
284
+ //
285
+ // Clips get a real gate (CLIP_MIN_BYTES, duration bounds, an ftyp/moov parse) and the film did not:
286
+ // the done transition decided on `head(key) !== null` and threw the size away, so a 0-byte film.mp4
287
+ // satisfied the #122 R2 shortcut and shipped as `done`. The PARSER is the right thing to reuse; the
288
+ // JUDGE is not, and reusing judgeClip wholesale would have been worse than no gate at all --
289
+ // CLIP_MAX_DURATION_S is 900s, so it would REFUSE any film longer than 15 minutes as a runaway.
290
+ //
291
+ // So: one probe, two judges.
292
+ export const FILM_MIN_BYTES = 2048; // same lenient floor as clips: catches 0-byte / truncated, never content
293
+ export const FILM_MIN_DURATION_S = 0.15; // a zero / near-zero duration container
294
+ // Deliberately NO upper duration bound. A film is as long as its storyboard; the clip cap exists to
295
+ // catch a runaway single SHOT and has no meaning here.
296
+ /** PURE: the film verdict over the same checks. Fails ONLY on positive evidence, like judgeClip.
297
+ *
298
+ * HONEST LIMIT, stated so nobody reads this as more than it is: the floor is structural. A film
299
+ * that concatenated 3 of its 12 shots is a structurally perfect mp4 and passes here. Shot-count
300
+ * honesty is the #697 duration gate's job, upstream, on the container's per-clip report. */
301
+ export function judgeFilm(checks) {
302
+ if (checks.bytes < FILM_MIN_BYTES) {
303
+ return { verdict: "fail", reason: `film is ${checks.bytes} bytes (< ${FILM_MIN_BYTES} floor); truncated or empty`, checks };
304
+ }
305
+ if (!checks.container) {
306
+ return { verdict: "fail", reason: "not a valid mp4 (no ftyp/moov box tree); corrupt or wrong format", checks };
307
+ }
308
+ if (checks.duration_s != null && checks.duration_s < FILM_MIN_DURATION_S) {
309
+ return { verdict: "fail", reason: `film duration ${checks.duration_s.toFixed(3)}s is below the ${FILM_MIN_DURATION_S}s floor`, checks };
310
+ }
311
+ if (!checks.video_track) {
312
+ return { verdict: "fail", reason: "no video track in the film (audio-only or corrupt container)", checks };
313
+ }
314
+ if (checks.frames != null && checks.frames <= 0) {
315
+ return { verdict: "fail", reason: "video track has zero frames (empty/corrupt film)", checks };
316
+ }
317
+ return { verdict: "pass", checks };
318
+ }
319
+ /** Is the assembled film at `key` a deliverable film? Three outcomes, and the difference between
320
+ * the last two is the whole point:
321
+ * - "fail": positive evidence it is NOT a film (absent, under the byte floor, not an mp4, no
322
+ * video track, zero frames). The render fails loud rather than shipping it as complete.
323
+ * - "skip": the object IS there and over the floor, but its bytes could not be read this tick.
324
+ * That is an R2 condition, not a verdict on the artifact, and a fully rendered film must not
325
+ * die on a read blip. The caller ships it and says so.
326
+ * - "pass": parsed and sane.
327
+ *
328
+ * NEVER throws. */
329
+ export async function validateFilmArtifact(env, key) {
330
+ const probe = await probeMp4Artifact(env, key, 0);
331
+ // A probe that ERRORED knows nothing, including the size, so it must not reach the byte floor
332
+ // below: that would read 0 bytes off a failed read and fail a film that may be perfectly fine.
333
+ if (probe.threw) {
334
+ return { verdict: "skip", reason: "film artifact could not be probed this tick", checks: probe.checks };
335
+ }
336
+ if (!probe.present) {
337
+ return { verdict: "fail", reason: "film artifact not found in R2", checks: probe.checks };
338
+ }
339
+ // BYTES BEFORE READABILITY, deliberately: a 0-byte object reads back as an empty body, which at
340
+ // the transport level is indistinguishable from a read blip. Judging size first is what keeps the
341
+ // headline case of cf#835 (a 0-byte film.mp4 shipped as done) on the FAIL side of that line.
342
+ if (probe.checks.bytes < FILM_MIN_BYTES) {
343
+ return { verdict: "fail", reason: `film is ${probe.checks.bytes} bytes (< ${FILM_MIN_BYTES} floor); truncated or empty`, checks: probe.checks };
246
344
  }
247
- catch (e) {
248
- // Reading/parsing threw: do NOT fail the shot on an I/O hiccup; skip and let the render proceed.
249
- return { verdict: "skip", reason: `clip validation errored: ${e instanceof Error ? e.message : String(e)}`, checks: empty };
345
+ if (!probe.readable) {
346
+ return { verdict: "skip", reason: "film artifact present but its bytes could not be read this tick", checks: probe.checks };
250
347
  }
348
+ return judgeFilm(probe.checks);
251
349
  }
252
350
  //# sourceMappingURL=clip-validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"clip-validate.js","sourceRoot":"","sources":["../src/clip-validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"clip-validate.js","sourceRoot":"","sources":["../src/clip-validate.ts"],"names":[],"mappings":"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"}