feat: configurable track forward, track to end, skip-and-mark (REQ-189)

Track 5 Frames becomes Track Forward with a 1-100 count input, remembered in
localStorage (default 5). A separate -> End action runs to the last frame
behind a confirm and can be cancelled mid-flight.

Frames that already hold a shape of the tracked class are skipped instead of
re-annotated: hidden and dimmed shapes count as present. Skips are reported in
the result banner and marked with a dot plus a class name on the filmstrip
thumbnail. frames() now returns the class ids each frame holds, the same query
row, no migration.

Chaining and seed growth stay out: every frame is still seeded from the drawn
box only.
This commit is contained in:
asus committed 2026-10-05 13:46:24 +07:00
1 parent f6b0335c93
commit 4f15335092
9 files changed
+226 -52

No files matched your search

+15 -6
View File
@@ -169,12 +169,21 @@ changes.
- **REQ-043** — The user can ask SAM3 for help inside the editor: click or drag a box around
one object and the model produces its shape.
- **REQ-189** — In the review editor, the user can push the **selected shape's** box forward
with *Track 5 Frames* (`[T]`): the next five frames each get their own REQ-043 box-assist
run, seeded with that box, and the shape is written as `source=manual`. Both geometry types
work — a bbox shape supplies its own box, a polygon is reduced to its bounding box. Each
frame is an **independent** run: a frame SAM3 refuses (nothing inside the box) is reported
and the rest still run; nothing selected, an unusable shape, or the last frame says so
instead of doing nothing. This is one-shot hand-off across the next frames, **not**
with *Track Forward* (`[T]`): the next N frames each get their own REQ-043 box-assist run,
seeded with that box, and the shape is written as `source=manual`. N is **configurable**,
1–100, remembered between sessions, default 5; a separate **Track to End** action runs to
the last frame of the batch and confirms before starting. Both geometry types work — a bbox
shape supplies its own box, a polygon is reduced to its bounding box. Each frame is an
**independent** run: a frame SAM3 refuses (nothing inside the box) is reported and the rest
still run; nothing selected, an unusable shape, or the last frame says so instead of doing
nothing. A frame that **already holds a shape of the tracked class is skipped** — hidden or
dimmed shapes count as present — and the skip is reported in the result banner and marked
with a dot on that frame's filmstrip thumbnail, never silently passed over. A long run can be
**cancelled** mid-flight: cancelling stops the remaining frames, but a request already in
flight is not aborted server-side and may still save its shape. The box is never grown and never reseeded from a result, so there is
no size or position readjustment between frames: a fast-moving object can still leave the
seed window (denser extraction or a video-propagation requirement, not yet written, is the
fix). This is one-shot hand-off across the next frames, **not**
propagation of drawn exemplars (which stays a non-goal): nothing is carried frame to frame,
and the runs do not depend on each other.
- **REQ-044** — All annotations and review statuses are **persistent** — they survive a