cgg-runtime/skills/edit-decision-list/SKILL.md
Audio-first edit decision list — maps J-cuts and L-cuts with editorial intention for every transition in the selected segment.
npx skillsauth add prompted365/context-grapple-gun edit-decision-listInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are building the backbone of the edit. Everything else — b-roll, captions, render — attaches to this structure. The EDL is not a technical artifact. It is an editorial argument expressed as a sequence of cuts.
These are not just technique. They are how human perception actually works.
The incoming audio starts before the visual cut. The viewer hears the next moment before seeing it. This creates forward momentum — the ear pulls the eye into the next shot.
When to use:
The feeling: Leaning forward. Something is coming.
The current audio continues under the next visual. The viewer sees a new image while still hearing the previous thought. This creates emotional subtext — you see the impact of what was just said.
When to use:
The feeling: Sitting back. Something just landed.
Sometimes neither a J nor L cut is right. A hard cut — audio and visual change simultaneously — creates punctuation. It's a full stop. Use it for:
The audio is the spine. Always. The transcript is the raw material, but the spoken audio — rhythm, breath, emphasis, silence — is the edit's skeleton. Visuals serve the audio.
This means:
You may re-read the verified transcript to confirm timestamp-to-content mappings before committing beats. If a beat's source window feels shaky — if you're not certain the key phrases actually fall within the reel duration — re-read the specific transcript section rather than trusting your memory. This is the single most important discipline in EDL construction: every beat must cite exact transcript lines at exact timestamps, and those citations must be physically verifiable against the source.
Do NOT do broad external research. Your evidence basis is the verified transcript and the committed evidence surface.
You receive:
timestamp_start/timestamp_end values. Flag the drift status in editorial_notes.Read through the selected segment and map its audio shape:
Mark every beat transition — where the segment's internal energy shifts. Each beat boundary is a potential cut point.
For every beat, you MUST cite the exact transcript lines with their source timestamps. This is not optional. The beat's content is what the speaker actually said at specific times, not a prose summary of what you think they said. Copy the transcript lines verbatim. Include the timestamps. This is the evidence that everything downstream attaches to.
For each beat, produce:
Before designing cuts, identify ALL transcript lines within the segment range that must be excluded (cuts_from_raw). For each excluded line:
Hard rule: cuts_from_raw is a hard exclusion constraint on source ranges, not a post-hoc note. If your beat's source window contains material that should be cut, the source window is wrong. Fix it before proceeding.
For each edit point, calculate:
Hard rule: reel_duration ≤ source_duration. You cannot play more source material than the reel window allows. If reel_duration < source_duration, the extraction starts at source_in and runs for reel_duration seconds — content after (source_in + reel_duration) is silently dropped.
The feasibility test: for each edit point, verify that EVERY key phrase cited in that beat falls within the first reel_duration seconds of the source window. If a key phrase lives at source timestamp T, check that (T - source_in) < reel_duration. If it doesn't fit, either:
Do not write an EDL that references phrases the reel can't physically contain. That is hallucination.
For each beat boundary, decide:
Identify where b-roll should appear. B-roll is not decoration — it is a visual argument. Mark each b-roll slot with:
The EDL implies an A-roll extraction step: the raw source video must be trimmed per the edit_decision_list entries' source_in/source_out ranges. Each edit point extracts source_in for (timecode_out - timecode_in) seconds — the reel duration, not the source duration. Note the source video path in editorial_notes. The A-roll is the continuous audio-visual spine that b-roll overlays on top of.
Before writing the final EDL, read through the beats in sequence as if you are the viewer hearing this for the first time. Ask:
If the answer to any of these is no, adjust the beats and cuts. The narrative must survive the edit, not just the timestamps.
Morph transitions are not cuts. A morph zone (studio dissolves into generated scene, then re-materializes) is a continuous transformation where the real environment transforms around the speaker. The IN morph and OUT morph are a chained pair — the OUT starts from the IN's actual last frame.
Hard rule: editorial trims must NOT land inside animated or morphing b-roll. When trimming the overall timeline to hit a target duration, cuts must fall in speaker-only segments between b-roll zones. If you need to shave time:
Visual adjudication: After assembly, run overshoot_router.py analyze --preset draft_review on the assembled timeline. The draft review schema includes a broll_continuity field (continuous / minor_breaks / fragmented) that catches exactly this class of error.
For morph-type b-roll slots: start frame and end frame MUST come from different visual worlds. Real footage morphing into a generated scene, or generated scene A morphing into generated scene B. Two frames from the same real footage produce camera interpolation, not morph transformation. This is the difference between a dissolve and a morph.
{
"edl_version": "2.0.0",
"profile_id": "string",
"creative_id": "string",
"segment_start": "HH:MM:SS or content marker",
"segment_end": "HH:MM:SS or content marker",
"segment_duration_estimate": "string",
"audio_arc": {
"energy_shape": "string — narrative description of how energy moves through the segment",
"peak_location": "string — where maximum intensity occurs",
"breath_points": ["string — natural pause moments"],
"resolution_type": "string — how the segment lands (insight, laugh, silence, callback)"
},
"beats": [
{
"beat_number": 1,
"label": "string — HOOK / BRIDGE / REFRAME / STORY / PEAK / RECOGNITION / LOOP_BRIDGE",
"timestamp_approx": "string — reel timecode range e.g. '0-7s'",
"source_timestamp": "string — source range e.g. '948.2-955.5'",
"content_summary": "string — what happens in this beat",
"transcript_lines": [
{"text": "string — exact transcript line, verbatim", "source_start": 0.0, "source_end": 0.0}
],
"key_phrases": ["string — specific words that carry narrative weight, cited from transcript_lines"],
"energy_level": "string — low/building/high/peak/descending/resolved",
"duration_approx": "string",
"speaker": "string",
"feasibility_check": {
"source_duration": 0.0,
"reel_duration": 0.0,
"all_key_phrases_within_reel_window": true,
"excluded_material_in_window": ["string — any cuts_from_raw lines that overlap, or empty"]
}
}
],
"cuts": [
{
"cut_number": 1,
"position": "string — between which beats, or at segment boundaries",
"timestamp_approx": "HH:MM:SS or 'segment +Ns'",
"type": "j_cut | l_cut | hard_cut",
"overlap_seconds": "float — for J/L cuts, how much audio overlap",
"intention": "string — WHY this cut type. This is the most important field. A cut without intention is noise.",
"visual_before": "string — what is on screen before the cut",
"visual_after": "string — what is on screen after the cut",
"audio_note": "string — what the audio is doing at this moment"
}
],
"broll_slots": [
{
"slot_number": 1,
"timestamp_start": "string",
"timestamp_end": "string",
"duration_approx": "string",
"emotional_register": "string — speaker's emotional state",
"visual_function": "illustrate | contrast | abstract | amplify | ground",
"continuity_type": "static | animated | morphing — determines trim safety",
"min_uninterrupted_seconds": "float — minimum duration for animated/morphing slots (null for static)",
"scene_context": "string — what was just said, what is about to be said",
"transition_in": "j_cut | l_cut | hard_cut | morph_in",
"transition_out": "j_cut | l_cut | hard_cut | morph_out",
"prompt_seed": "string — initial direction for the b-roll prompt engineer"
}
],
"opening_treatment": {
"hook_type": "string — how the piece begins (hard cut to mid-thought, slow build, text card, etc.)",
"first_visual": "string — what the viewer sees first",
"first_audio": "string — what the viewer hears first",
"intention": "string — what this opening does to the viewer in the first 3 seconds"
},
"closing_treatment": {
"loop_strategy": "string — how the end connects back to the beginning, or null",
"final_visual": "string — last thing seen",
"final_audio": "string — last thing heard",
"intention": "string — what state the viewer is left in"
},
"cuts_from_raw": [
{
"text": "string — exact phrase or line to exclude",
"source_start": 0.0,
"source_end": 0.0,
"reason": "string — why this is cut",
"verified_excluded": true
}
],
"editorial_notes": "string — anything worth flagging about the edit structure",
"extraction_rule": "Each edit point extracts audio/video starting at source_in for exactly (timecode_out - timecode_in) seconds. Content after source_in + reel_duration is not in the edit. All content summaries, key phrases, b-roll markers, and caption sync points must reference material that survives this extraction."
}
Every cut in the EDL must pass this test: if someone asks "why did you cut here, and why this type of cut?", you have a specific, defensible answer that is about the viewer's experience — not about technique for its own sake.
A J-cut because "J-cuts create momentum" is not an answer. A J-cut because "the speaker is about to pivot from the problem to the solution and the audience needs to feel that shift coming before they see it" is an answer.
Every beat must pass this test: can you point to the exact transcript lines, with timestamps, that contain the content you summarized? If the content_summary says "energetic hygiene" but no transcript_line contains that phrase within the beat's source window, the beat is hallucinated. An EDL with beautiful editorial intention and wrong timestamps produces garbage downstream — b-roll keyed to phantom phrases, captions referencing words that aren't in the edit, an assembly where the viewer hears something different from what the editor promised.
The grounding test is not busywork. It is the difference between an EDL that assembles correctly and one that breaks at every phase boundary.
No edit point's source range may contain material from cuts_from_raw. No key phrase may fall outside its edit point's extractable window (source_in + reel_duration). No b-roll slot anchor phrase may reference a word that isn't in the verified reel timeline. Violations of any of these are hard failures — the EDL is rejected, not flagged.
tools
Frederick Grant persona runtime — historian-of-how, witness of formation under pressure, qualified Remnant/Athenaeum-facing interpretive mechanic, tic-230 chronicler of runtime probity. Use when the user asks for Frederick Grant voice, Ubiquity Chronicles work, Parallel Lane Cadence essays, Elara counterweight passes, field notes, audio annotation, interview scripts, Logan/Wilderness analysis, or runtime probity writing after the P2/P1 tic-230 closures. CENTROID: authored persona runtime that documents live convergence without collapsing it into thesis IS: - lean SKILL.md entrypoint with rich profile/, stages/, scripts/, reference/, templates/, tools/, evals/ subtrees - 8-stage workflow (signal-intake → context-hydration → field-grounding → remnant-query → composition → elara-counterweight → receipt-closeout → tic230-probity) - 15 prompt-skeleton scripts for Frederick's standard composition surfaces - 9 collapse-zone guards covering Decorative Francophilia / Retrospective Certainty / Hero Narrative Intoxication / Conspiracy Closure / Academic Sedation / Activist Collapse / Breyden Conflation / Elara Erasure / Runtime-Doctrine Drift - cross-references into federation surfaces: publications/, audit-logs/governance/, ent_breyden/inbound/ubiquity-chronicles-tic175/, ent_homeskillet/canonical/ IS NOT: collapse_zones: - Breyden's voice (architect register; Frederick is not the architect) - Homeskillet's voice (orchestrator register; Frederick is not the primary) - generic French historian style (decorative Francophilia is a named negative ray) - prosecutor / debunker / prophet / mascot (legal accusation, certainty, evangelism, identity flattening — all forbidden) - retroactive certainty machine (live convergence must remain unresolved where the record is open) - doctrine inscription source (Frederick observes doctrine; he does not author it) - documentation editor (multi-file structure is authoring discipline, not generic doc rewrite) - federation-internal artifact (Frederick is a ghostwriter engaged from outside; the federation's runtime is legitimate object of historical analysis, but Frederick's own runtime — the skill that hosts him, loaded files, collapse-zone guards, authority model — is editor's territory, not Frederick's voice; insider language must be earned by composition arc, never deployed as default register) sibling_overlaps: - /complement (closure inference at active move — different surface, different lifecycle) - /consolidate (file-surface packaging — Frederick produces composition, not consolidation) - videographer skill (substrate capture — both are expression surfaces, distinct registers) - homeskillet-academy (educational scaffold — academy teaches, Frederick witnesses) WHEN: - when the work needs witness-of-formation prose - when the task asks for Frederick Grant by name, voice, or context - when a live convergence needs historical/cultural contextualization without closure - when a field note, essay, chronicle, audio annotation, or interview needs Frederick's register - when a Remnant/Athenaeum comparison is appropriate - when an Elara counterweight pass is needed - when runtime probity after tic 230 is relevant (P2 manifold-shape closure, P1 signal-projection-split closure) - on explicit Architect invocation NOT WHEN: - when Breyden's direct voice is needed (use Architect register, not Frederick) - when Homeskillet's execution-layer voice is needed (use orchestrator register, not Frederick) - when the task is ordinary implementation (Frederick is composition, not patching) - when the task asks for legal accusation or definitive claims without evidence - when the user wants generic French style rather than Frederick's runtime - when the federation has not produced enough operational reality to warrant outside reading RELATES TO: - /complement (closure-inference sibling — both gate compositional integrity) - /consolidate (packaging neighbor — Frederick composes; consolidate packages) - publications/the-ubiquity-chronicles-fg.md (primary chronicle, v1, ~tic 175) - publications/the-ubiquity-chronicles-v2-frederick-grant.md (v2 expansion, Book Zero + Book I) - publications/the-ubiquity-chronicles-vol-iii-frederick-grant.md (Volume III — The Embodiment, tic 230) - publications/the-ubiquity-interviews-fg.md (interview register companion) - audit-logs/governance/p2-harmony-manifold-input-patch-receipt-tic230.md (P2 closure receipt) - audit-logs/governance/p1-signal-projection-split-receipt-tic230.md (P1 closure receipt) ARGS: stance: dispatch off_envelope: ask core_dispatch_rays: - "" → primary invocation (full 8-stage workflow) - "chronicles" → Ubiquity Chronicles composition - "parallel" → Parallel Lane Cadence composition - "field-note" → Field Notes script - "interview" → Interview script - "elara-pass" → Elara counterweight on existing draft - "anti-collapse" → Anti-collapse audit on existing draft - "tic230-probity" → Runtime probity composition secondary_modulation_axes: - register: chronicle | essay | field-note | interview | annotation - depth: lean | full - target: telos-internal | external-readership
tools
Runtime tactical context hydration — staged discovery and bounded source-bearing hydration for agent intent. Answers "how does an agent know where to look before it already knows where to look?" via filesystem shape, structural signals, and typed candidate baskets. Working acronym: RTCH (runtime-tactical-context-hydration). CENTROID: intent → bounded, source-reenterable evidence packet via staged source-bearing discovery IS: - structured intake of agent/Architect intent (goal, seeds, profile, fanout, mutation risk) - zone orientation (cwd / repo root / zone root / rung chain / obvious truth files) - low-cost shape scout (directory map, headings, durable handles, JSON/YAML keys, refs) - typed candidate basket with origin/use taxonomy and pairing rule enforcement - tactical probe plan (multiple bounded probes, not one giant regex) - bounded chunk hydration with line-range provenance and next-re-entry commands - agent-ready evidence packet emission (selected_surfaces, unresolved_questions, caution_map) - optional handoff to /consolidate for full-surface dump packaging IS NOT: collapse_zones: - vector database (no embedding-space retrieval; federation prohibits at federation rung) - semantic oracle (RTCH does not "understand" content; it surfaces structural signals) - doctrine engine (RTCH produces evidence; downstream consumers judge truth) - terrain engine replacement (federation cartography handles multi-plane semantic projection; RTCH is tactical layer beneath) - /consolidate rewrite (discovery and packaging do not collapse) - lossy compressor (bounded chunks preserve source re-entry; never summarize away source) - confidence-inflated smart consolidator sibling_overlaps: - /consolidate (RTCH selects; /consolidate packages — distinct boundaries; compose, don't replace) - file-access-discipline (RTCH outputs targets; hydration USES file-access-discipline as execution primitive) - load-doctrine-chain (both serve subagent context; load-doctrine-chain owns CLAUDE.md chain only, RTCH owns wider source set) - cache-ops (pattern source for trust-tier shape; storage NOT shared; RTCH packets are separate evidence cache) - queue_state_compile (analogy only — both convert append-only source to compiled view; different transforms) WHEN: - when agent intent is vague and discovery is needed before reading or consolidation - when bare grep would over-fanout or under-discover a vague target - when an arena, harpoon, /review, or other lane needs source-bearing evidence before action - when bounded chunk hydration is appropriate (large governance files, doctrine chains, audit history) - when the candidate-basket discipline (origin/use tagging, pairing rule) is needed to prevent generic-term overconfidence - when source re-entry must be preserved (consumer may need to return to source for fuller context) NOT WHEN: - when target is fully known (single file, single line range) — read it directly via file-access-discipline - when the operation is mutation-only on a known target (use Edit/Write directly) - when /consolidate has already been invoked with explicit targets (RTCH would re-do discovery) - when the operation requires semantic similarity (RTCH does not do that; federation prohibits vector DB) - when the consumer needs a packaged dump only (skip RTCH; /consolidate alone is sufficient if targets are known) - when promoting doctrine (route through /review; RTCH evidence may inform but does not promote) RELATES TO: - /consolidate (compose: RTCH selects targets; /consolidate packages selected_surfaces into dump with provenance reference back to RTCH packet) - file-access-discipline (compose: RTCH Stage 6 hydration USES file-access-discipline chunked-read as execution primitive) - load-doctrine-chain (compose: RTCH may invoke for doctrine_chain target_profile zone orientation) - zone_root.py (compose: RTCH Stage 2 anchors on zone-root walk-up) - atomic-append (compose: optional RTCH packet persistence uses atomic-append write hygiene) - queue_state_compile (analogous: both implement "raw source → compiled view" pattern) - /review preflight (downstream: future integration consumes RTCH packets as bench-packet discovery surface) - arena spec authoring (downstream: future integration uses RTCH packets for context preparation) - harpoon orchestrator (downstream: future integration uses RTCH for anchor-spot discovery on external binders) ARGS: stance: dispatch off_envelope: ask # off_envelope rationale: RTCH requires a structured intake to operate (goal, # target_profile, fanout_level, mutation_risk, expected_output, enough_evidence). # Bare invocation without intake fields would force the lane to guess discovery # scope, defeating the discipline. Ask elicits the missing fields. core_dispatch_rays: - "" → interactive (elicit intake form) - "--goal <sentence>" → with intake fields on CLI - "--intake <intake_json_path>" → from a saved/persisted intake - "--persist" → persist resulting packet to audit-logs/rtch/packets/ - "--handoff-to-consolidate" → after packet emission, hand selected_surfaces to /consolidate secondary_modulation_axes: - target_profile: doctrine_chain | audit_history | code_path | manifest_registry | vague_intent | mixed - fanout_level: conservative | normal | wide - mutation_risk: read_only | low_mutation | high_mutation - expected_output: hydration_packet | target_set_for_consolidate | single_chunk | claim_evidence IMPLEMENTATION_STATUS: binder: audit-logs/governance/runtime-tactical-context-hydration-binder.md (Phase 1 complete, tic 223) runner_script: NOT YET BUILT — Phase 2 deliverable (planned: cgg-runtime/scripts/rtch.py) current_mode: manual-discipline — agent walks the 8 stages using Read/Bash/Grep tools directly promotion_status: design lane, not doctrine; Phase 7 routes the doctrine question after Phase 6 validation
development
Statusline legend — rapid decoder for the CGG telos radar (LITE + FULL modes). CENTROID: read-only legend surface that decodes statusline glyphs, positions, colors, and source attributions for the Architect at glance speed (the Architect perception substrate) IS: - static legend (glyph + position + color tier reference) - live decode mode (annotates current statusline values inline) - source attribution (where each rendered value reads from) IS NOT: collapse_zones: - statusline configurator (use /statusline install|mode|clear|uninstall) - governance state mutator (read-only on every surface it touches) - harmony invoker (use harmony-invoke.sh; this skill only decodes the cached pointer) - radar replacement (statusline renders ambient; sl-legend explains) - troubleshooter (does not diagnose hook failures or sync drift) sibling_overlaps: - /statusline (configuration sibling — same domain, different verb) - /governance-check (read-only governance snapshot — different aperture) WHEN: - on first encounter with the radar (Architect doesn't remember what ⊙ means) - when a glyph changes and the Architect wants to confirm semantics - when explaining the radar to someone else - on explicit Architect invocation NOT WHEN: - to change statusline behavior (use /statusline) - to act on a signal seen in the radar (use /siren) - to invoke harmony for fresh disposition (use harmony-invoke.sh) - mid-cadence (cadence is the boundary; this is reference) RELATES TO: - /statusline (configurator) — same domain; sl-legend is the reader - /siren (signal triage) — sl-legend points to what to triage - harmony-invoke.sh (disposition refresher) — sl-legend points at staleness ARGS: stance: dispatch off_envelope: proceed-with-note # off_envelope rationale: sl-legend is read-only reference; an undeclared arg # is most likely a typo against {live, lite, review, sources} — proceed with # static legend and note the unknown ray rather than refusing the read. core_dispatch_rays: - "" → static legend (full glyph + position decoder) - "live" → annotate current rendered statusline values inline + tic 214 markers source-backed - "lite" → compact tic 214 marker glossary only (glance-speed recall) - "review" → Architect perception substrate audit checklist (overclaim + naming drift detection) - "sources" → source attribution table (which file each value reads)
tools
Editorial intelligence scoring — reads transcripts the way a sharp editor would, scoring segments for shortform growth potential through the lens of audience context.