annotate: make full-episode subtask coverage unconditional

Remove the subtask_full_coverage config flag. Stitching subtask spans
into a contiguous full-episode cover is now always applied in
_generate_subtasks — a sparse / gap-ridden subtask timeline is never
desirable for conditioning, so there's no reason to make it optional.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pepijn
2026-06-02 15:36:23 +02:00
parent 799d0e3bcc
commit 79f9a84407
2 changed files with 11 additions and 13 deletions
@@ -73,15 +73,12 @@ class PlanConfig:
# nothing). +1 VLM call/ep.
subtask_verify: bool = True
# ``subtask_full_coverage``: deterministic post-step (no VLM call)
# that stitches the surviving subtask spans into a contiguous cover
# of the whole episode — first subtask pulled back to t0, each span's
# end snapped to the next span's start, last span extended to t_last.
# Without it the verify pass (which prunes spans) can leave the
# subtask timeline starting late or full of gaps, so frames fall
# through with no active subtask. On by default; disable only if a
# downstream consumer genuinely wants sparse (non-tiling) subtasks.
subtask_full_coverage: bool = True
# NOTE: subtask spans are ALWAYS stitched into a contiguous
# full-episode cover (first subtask pulled back to t0, gaps closed,
# last span extended to t_last) as a deterministic post-step in
# ``_generate_subtasks._stitch_full_coverage``. This is not
# configurable — a sparse / gap-ridden subtask timeline is never
# desirable for conditioning, so it is unconditional.
# When True (and backend supports it, e.g. ``openai``), the ``plan``
# module sends a ``video_url`` block pointing at a per-episode mp4
@@ -578,10 +578,11 @@ class PlanSubtasksMemoryModule:
# The VLM (especially after the verify pass prunes spans) can
# leave the first subtask starting after t0 or leave gaps between
# spans, so the subtask timeline no longer tiles the whole
# episode and frames fall through with no active subtask. Stitch
# the surviving spans into a contiguous cover of [t0, t_last].
if getattr(self.config, "subtask_full_coverage", True):
cleaned = self._stitch_full_coverage(cleaned, record)
# episode and frames fall through with no active subtask. Always
# stitch the surviving spans into a contiguous cover of
# [t0, t_last] — there is no scenario where a sparse, gap-ridden
# subtask timeline is desirable for conditioning.
cleaned = self._stitch_full_coverage(cleaned, record)
return cleaned