Docs/Skills and code/skill script-cohort-analysis
.claude/skills/script-cohort-analysis/scripts/checklist.js
What the file says about itself
Rubric v3 (2026-10-24; v2 plus H5, H6, C5, K4, K5 and the stakes_load dimension G1-G4, from the Moser Baer script review): every dimension is a set of observable yes/no checks. A dimension's score is the share of its checks that pass.
Mentioned on: page 07
// Rubric v3 (2026-10-24; v2 plus H5, H6, C5, K4, K5 and the stakes_load dimension G1-G4, from the Moser Baer script review): every dimension is a set of observable yes/no checks. A dimension's score is
// the share of its checks that pass. This file is the single source of truth: prepare.js
// renders it into <run>/checklist.md (the exact checklist a run used) and check.js validates
// rater output against it. Edit it only between cohorts.
const CHECKLIST = {
hook: [
['H1', 'Within the first 30s a concrete element appears: a specific number, named person, vivid scene, or explicit contradiction.'],
['H2', 'By 60s the core question or promise of the video is stated or unmistakably implied.'],
['H3', 'The first 30s contain no greeting, channel intro, subscribe/like request or sponsor.'],
['H4', 'The opening raises a question that is NOT answered within the first 60s.'],
['H5', 'By about 30s the opening has confirmed the promise with something concrete (a scene, fact or number that the title implied), AND by 60s it has signalled something beyond that promise (a stranger, bigger or additional payoff still to come). Quote both.'],
['H6', 'The opening hints at the shape or direction of the answer (where this is going) without stating the cause or the route, so the viewer knows the destination but not how it is reached.'],
],
curiosity: [
['C1', 'An explicit question or teaser for later content appears in the middle third of the runtime.'],
['C2', 'At least one section boundary contains a re-hook (a teaser of what is coming, or a "but here is where it changes" turn).'],
['C3', 'At least once, answering one question explicitly opens a new, bigger question.'],
['C4', 'Your loop list has no stretch longer than 3 minutes with no open question.'],
['C5', 'At least three quarters of section endings set up the next section with an open question or unresolved consequence that the next section then answers (a forced handoff, not just a new topic).'],
],
causality: [
['K1', 'The final answer or conclusion explicitly uses facts established in at least two earlier sections.'],
['K2', 'No section treats something as already known before the transcript has introduced it (your references_unintroduced lists are all empty).'],
['K3', 'More than half of section transitions are a consequence ("therefore") or complication ("but") of the previous section, not just "next topic".'],
['K4', 'At most one section transition is a plain "and then / next / meanwhile / in <year>" jump or a list-style signpost ("here is the second thing") with no consequence or complication. Name each flat jump you find.'],
['K5', 'Swapping any two adjacent sections would break the logic, because each depends on what the one before it established.'],
],
value_density: [
['V1', 'At least three quarters of sections contain a specific number, name, date or mechanism.'],
['V2', 'No passage restates earlier material without adding anything new (any near-verbatim repeat fails this).'],
['V3', 'There is at least one non-obvious insight a typical viewer likely did not know (cite it).'],
['V4', 'Recap / summary / wind-down material totals under 90 seconds.'],
],
clarity: [
['L1', 'Every technical or jargon term is explained in plain words when first used (list any that are not; pass only if none).'],
['L2', 'The main abstract idea is accompanied by a concrete example or analogy.'],
['L3', 'The script signposts its structure (what is next / where we are) at least twice.'],
],
emotion_story: [
['E1', 'A specific person or character (real or hypothetical) carries at least part of the explanation.'],
['E2', 'That person faces a decision, conflict or stake whose outcome the viewer follows.'],
['E3', 'At least one scene is concrete enough to picture (a time, a place and an action).'],
['E4', 'At least two distinct emotional registers appear (e.g. humor, surprise, tension, empathy, awe).'],
],
voice: [
['O1', 'The speaker addresses the viewer directly (you / आप / तुम or second-person verb forms) at least five times.'],
['O2', 'The speaker states their own opinion or judgment at least once.'],
['O3', 'The speaker voices a likely viewer objection or question and responds to it.'],
],
escalation: [
['S1', 'The single biggest reveal or insight comes after the midpoint.'],
['S2', 'After the midpoint, the stakes or scope increase at least once (bigger consequence, bigger number, wider impact).'],
['S3', 'The last third is mostly new material, not recap or repetition.'],
],
payoff: [
['P1', 'The core question or promise from the opening is explicitly answered (cite the timestamp).'],
['P2', 'The answer is specific (a number, a clear verdict, or a concrete decision rule), not only "it depends".'],
['P3', 'The script adds at least one insight beyond what was literally promised.'],
['P4', 'The video ends within about 90 seconds of delivering the answer (no long wind-down).'],
],
stakes_load: [
['G1', 'Every key number or fact in the first third is preceded or immediately framed by a reason to care (a person, a loss, a question, a prediction or a contrast). List any figure that arrives with no stake; pass only if none.'],
['G2', 'No 30-second stretch contains more than four distinct figures or newly introduced named entities.'],
['G3', 'Each technical or jargon term is glossed in plain words at its first use, and no section introduces more than one new concept.'],
['G4', 'At least one large figure is translated into a human-scale or comparative form (per person, per rupee, per year, against something familiar), and derived figures are presented as derived.'],
],
credibility: [
['R1', 'Key numbers are attributed or explained (a source, an assumption or a method is given).'],
['R2', 'At least one limitation, caveat or counterpoint is acknowledged.'],
['R3', 'No sensational claim is stated as fact without support (list any; pass only if none).'],
['R4', 'Fictional or hypothetical content is clearly framed as such (pass if there is none).'],
],
};
const DIMS = Object.keys(CHECKLIST);
const ITEM_IDS = DIMS.flatMap((d) => CHECKLIST[d].map(([id]) => id));
const DIM_OF = Object.fromEntries(DIMS.flatMap((d) => CHECKLIST[d].map(([id]) => [id, d])));
function renderMarkdown() {
const out = ['# Checklist (rubric v3)', '', 'Answer every check with `pass: true/false`, a timestamp and a short quote with an English gloss. If a check cannot apply, answer `true` only where the check says so (R4); otherwise answer `false`.', ''];
for (const d of DIMS) {
out.push(`## ${d}`);
for (const [id, text] of CHECKLIST[d]) out.push(`- **${id}**: ${text}`);
out.push('');
}
return out.join('\n');
}
module.exports = { CHECKLIST, DIMS, ITEM_IDS, DIM_OF, renderMarkdown };
Shown as it is in the repository at build time (2026-11-03); the home directory appears as <home>. If this page and the file differ, the file is right. Back to the catalogue.