Fixes to the rendering

This commit is contained in:
2026-07-25 14:20:42 +02:00
parent a84e02b494
commit 409145f214
2 changed files with 39 additions and 8 deletions
+23 -5
View File
@@ -4817,10 +4817,28 @@ def _cmd_render_impl(
print(f" Warning: {w}")
print(" Passed.")
# Stage 3: Transform (alignment, unless a prior events.json pins the times)
# Stage 3: Transform.
# build (plan_only): align the manuscript to the transcript (or reuse an
# existing events.json), producing the timing layer.
# render: NEVER aligns — it requires the precomputed events.json/scaffold.json
# and executes them. If they're missing it errors, so `down` + `render` is
# all the rig ever needs and the output can't silently diverge from the build.
from . import scaffold as _scaffold
_existing_events = None if realign else _scaffold.read_events(project_path)
if not plan_only:
if _existing_events is None or _scaffold.read_scaffold(project_path) is None:
print(
f"Error: render requires the precomputed timing layer "
f"({_scaffold.EVENTS_FILE} + {_scaffold.SCAFFOLD_FILE}), which is missing.",
file=sys.stderr,
)
print(
f" Render does not align — run 'gnommo -p {project_path.name} build' first "
f"(then 'up'; on the rig, 'down' brings them over).",
file=sys.stderr,
)
return 1
_timings_override = (
_scaffold.events_to_marker_timings(_existing_events) if _existing_events else None
)
@@ -4895,10 +4913,10 @@ def _cmd_render_impl(
]
_write_tasks_file(project_path, missing_videos, alignment_issues)
# --- Timing layer: derive events, keep hand-edits, persist events.json + scaffold.json ---
# Only for a full-timeline pass — partial (--slides) and internal chunk renders
# read the override but must never overwrite the complete events.json/scaffold.json.
if slide_range is None and _output_path_override is None:
# --- Timing layer (BUILD only): derive events, keep hand-edits, persist
# events.json + scaffold.json, and print the plan. Render never runs this — it
# only consumes the files — so the timing layer is written exactly once, by build.
if plan_only and slide_range is None and _output_path_override is None:
_events = _scaffold.derive_events(marker_timings, slides, videos, audio)
# merge restores each id's human `adjustment` (the relative tweak).
_events = _scaffold.merge_events(_events, _existing_events)
+16 -3
View File
@@ -27,7 +27,10 @@ from typing import Optional
_COMMITS_LOG = "commits.log"
# Dirs/patterns excluded on down (mirrors what up never pushes).
# Dirs/patterns excluded on down (mirrors what up never pushes). Note: events.json
# and scaffold.json are NOT excluded — they must reach the rig so `down` + `render`
# is all that's needed there. The render never rewrites them, so they stay identical
# on both ends (no clobbering).
_DOWN_EXCLUDES = [
"media/narration/processed/",
"media/narration/intermediate/",
@@ -57,8 +60,18 @@ def _build_manifest(project_path: Path) -> list[str]:
except (json.JSONDecodeError, OSError):
pass
# Fixed project-root files
for fixed in ["project.json", "manuscript.txt", _COMMITS_LOG, "citations.json"]:
# Fixed project-root files. events.json / scaffold.json are the precomputed
# timing layer the render needs — events.json also carries the human `adjustment`
# tweaks — so they must travel UP to the rig. (They're excluded on `down` so the
# rig's regenerated copies can't clobber the local edits.)
for fixed in [
"project.json",
"manuscript.txt",
_COMMITS_LOG,
"citations.json",
"events.json",
"scaffold.json",
]:
if (project_path / fixed).exists():
files.add(fixed)