Show what the picture check found, beside what the audio check found

Every clip has been transcribed and compared with its script since the first
film. Nothing looked at the picture, which is where this engine actually
fails - two identical photographs on a mantel, half a car, a person nobody
asked for. This renders the visual verdict the same way, and lists each
fault with the wording change that would have prevented it.
This commit is contained in:
gator 2026-09-17 20:57:07 +00:00
parent 4d0d375dbb
commit 5eb4aac2cc

View file

@ -92,6 +92,12 @@
.chk{font-size:12px;border-radius:999px;padding:1px 8px;border:1px solid var(--line);color:var(--muted)} .chk{font-size:12px;border-radius:999px;padding:1px 8px;border:1px solid var(--line);color:var(--muted)}
.chk.ok{color:var(--accent2);border-color:var(--accent2)} .chk.ok{color:var(--accent2);border-color:var(--accent2)}
.chk.bad{color:#e0685f;border-color:#e0685f} .chk.bad{color:#e0685f;border-color:#e0685f}
.eyes{margin:8px 0 0;font-size:12.5px}
.eyes .f{margin:4px 0;padding-left:10px;border-left:2px solid var(--line)}
.eyes .f.serious{border-left-color:#e0685f}
.eyes .f b{color:var(--ink)}
.eyes .fix{color:var(--muted);display:block;margin-top:1px}
.eyes .sum{color:var(--muted);font-style:italic;margin-bottom:5px}
.ins{border-top:1px dashed var(--line);text-align:center;padding:6px 0} .ins{border-top:1px dashed var(--line);text-align:center;padding:6px 0}
.ins button{font-size:12px;padding:4px 12px;color:var(--muted)} .ins button{font-size:12px;padding:4px 12px;color:var(--muted)}
.rough{width:100%;box-sizing:border-box;margin-top:8px;font:inherit;font-size:13px; .rough{width:100%;box-sizing:border-box;margin-top:8px;font:inherit;font-size:13px;
@ -754,6 +760,23 @@
+ '">+ Add a scene ' + (after === "start" ? "at the start" : "after " + esc(after)) + '</button></div>'; + '">+ Add a scene ' + (after === "start" ? "at the start" : "after " + esc(after)) + '</button></div>';
} }
// The faults themselves, with the prompt change that would prevent each -
// which is the half that makes the check actionable rather than a verdict.
function faultsHtml(s) {
var vc = s.vision_check;
if (!vc || !(vc.faults || []).length) return "";
return '<div class="eyes">'
+ (vc.summary ? '<div class="sum">' + esc(vc.summary) + '</div>' : '')
+ vc.faults.map(function (f) {
return '<div class="f ' + (f.severity === "serious" ? "serious" : "")
+ '"><b>' + esc(f.kind || "") + '</b>'
+ (f.at != null ? ' at ' + Number(f.at).toFixed(1) + 's' : '')
+ ' &middot; ' + esc(f.what || "")
+ (f.prompt_fix ? '<span class="fix">fix: ' + esc(f.prompt_fix)
+ '</span>' : '') + '</div>';
}).join("") + '</div>';
}
function shotHtml(s, voice) { function shotHtml(s, voice) {
if (s.writing) { if (s.writing) {
return '<div class="shot"><div class="num">' + esc(s.id) + '</div><div class="body">' return '<div class="shot"><div class="num">' + esc(s.id) + '</div><div class="body">'
@ -799,6 +822,21 @@
+ '</span>'; + '</span>';
} }
// What the eyes found, if they have looked. Kinds: render (the picture is
// broken), continuity (the frames disagree), script (wrong shot, well made).
var vc = s.vision_check || null;
var eyeHtml = "";
if (vc && vc.verdict) {
var bad = vc.verdict === "broken";
var faults = vc.faults || [];
eyeHtml = '<span class="chk ' + (bad ? "bad" : (faults.length ? "" : "ok"))
+ '" title="' + esc(vc.summary || "") + '">picture ' + esc(vc.verdict)
+ (faults.length ? ' &middot; ' + faults.length + ' fault'
+ (faults.length === 1 ? '' : 's') : '')
+ (vc.people_on_screen != null ? ' &middot; ' + vc.people_on_screen
+ ' on screen' : '') + '</span>';
}
var tools; var tools;
if (s.drawing) tools = '<span class="busy">drawing…</span>'; if (s.drawing) tools = '<span class="busy">drawing…</span>';
else if (s.filming) tools = '<span class="busy">filming…</span>'; else if (s.filming) tools = '<span class="busy">filming…</span>';
@ -814,7 +852,7 @@
+ (s.opening_url ? 'Redraw' : 'Draw') + ' &middot; $0.14</button>' + (s.opening_url ? 'Redraw' : 'Draw') + ' &middot; $0.14</button>'
+ (s.opening_url ? '<button type="button" class="btn" data-filmone="' + esc(s.id) + '">' + (s.opening_url ? '<button type="button" class="btn" data-filmone="' + esc(s.id) + '">'
+ (s.clip_url ? 'Film it again' : 'Film this shot') + ' &middot; $0.75</button>' : '') + (s.clip_url ? 'Film it again' : 'Film this shot') + ' &middot; $0.75</button>' : '')
+ chkHtml + chkHtml + eyeHtml
+ '<button type="button" class="btn" data-delete="' + esc(s.id) + '">Remove</button>'; + '<button type="button" class="btn" data-delete="' + esc(s.id) + '">Remove</button>';
} }
@ -830,6 +868,7 @@
+ (s.camera ? '<p class="cam">camera: ' + esc(s.camera) + '</p>' : '') + (s.camera ? '<p class="cam">camera: ' + esc(s.camera) + '</p>' : '')
+ (s.continuity ? '<p class="cont">continuity: ' + esc(s.continuity) + '</p>' : '') + (s.continuity ? '<p class="cont">continuity: ' + esc(s.continuity) + '</p>' : '')
+ lines + lines
+ faultsHtml(s)
+ '<div class="tools">' + tools + '</div>' + '<div class="tools">' + tools + '</div>'
+ '<textarea class="note" rows="2" data-note="' + esc(s.id) + '" ' + '<textarea class="note" rows="2" data-note="' + esc(s.id) + '" '
+ 'placeholder="Your note on this shot, for the next full revision.">' + 'placeholder="Your note on this shot, for the next full revision.">'