29 Commits
Author SHA1 Message Date
asus 3eeb529e3d feat: paste overrides through a reviewable dialog, any origin (REQ-190)
navigator.clipboard.readText() only exists in a secure context, so on plain http
over a LAN address it is absent, not merely refused — the previous one-click
paste could never work there. A keyboard paste into a focused textarea is an
ordinary user gesture and is not gated, so paste now opens a dialog: the YAML
goes in a textarea, prefilled only when the browser allows the read.

Nothing is written until Apply, and Apply stays disabled while the text does not
parse, so a typo cannot be clicked through. A live line names the classes the
block matched, the container flags it would flip and the classes it would ignore.
Esc closes and returns focus to the button; Enter is left to the textarea,
because YAML needs newlines.

planPaste() produces that review line and applyPasted() does the writing, keeping
the selected-classes-only rule and the single batched container PATCH.
2026-10-05 14:41:22 +07:00
asus 4575c46f4c feat: copy/paste per-class auto-annotate overrides as YAML (REQ-186, REQ-190)
Copy now emits YAML instead of the one-line "class <name> conf ..." text: one
block per selected class, fields named after the row labels, globals resolved
into the block, a name quoted only when YAML would misread it.

Paste reads the clipboard back and fills the overrides for the classes selected
in that modal, naming any it ignored — an override for a deselected class would
otherwise ride along in class_params unseen. container diffs go out as one
PATCH /projects/{id} and revert together if the save is rejected.

Parsing is parseClassYaml, a strict subset reader for exactly what Copy emits,
so no YAML dependency: any malformed line throws with its line number and
applies nothing. Values must look like numbers, not merely start like them —
parseFloat would have taken "0.5abc" as 0.5.

Both are real buttons with Lucide icons plus a status line reporting the
outcome, and both live in the shared table so the mass modal carries them too.
2026-10-05 14:17:17 +07:00
asus 4f15335092 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.
2026-10-05 13:46:24 +07:00
asus f6b0335c93 revert: undo chained/seed-grown track 5 frames, back to b71f1d4
Reverts 1530bbc and 9c95a4a. Track 5 Frames sends the drawn box unchanged to
all five frames - no chaining, no growth. Both were rejected: chaining let a
wrong read on one frame poison the next, and growth was an attempt to follow a
moving object that the user did not want.

REQ-189, ui-spec and tasks.md return to the b71f1d4 wording.
2026-10-05 12:43:23 +07:00
asus 9c95a4a759 fix: unchain track 5 frames so one bad read cannot poison the rest
The chained attempt (1530bbc) fed each run's result into the next frame's
seed, so a wrong read on one frame carried into the ones after it. Runs are
independent again: every frame is seeded from the drawn shape, frames 2-5
with it grown x1.5 about its centre for motion tolerance. REQ-189, ui-spec
and tasks.md updated to the independent contract.
2026-10-05 12:35:17 +07:00
asus 1530bbc999 feat: chain track 5 frames so a moving object is re-seeded (REQ-189)
trackForward sent the identical box to all five target frames. On batch 19
(extracted at 0.5 fps - one frame every 2 s) a truck entering the frame
outruns a static seed, so the action either missed it or grabbed the wrong
part.

- geometry handling lifted to module-level shapeBox(), reused for the drawn
  shape and for each assist result
- first frame still uses the drawn box exactly; frames 2-5 are seeded with
  the previous run's shape grown x1.5 about its centre (SEED_GROWTH)
- a frame SAM3 refuses keeps the last good seed for the next attempt
- REQ-189 rewritten to the chaining contract, including the accepted cost:
  a bad read can carry forward; this is not tracking, no motion model
2026-10-05 12:21:18 +07:00
asus b71f1d4bf2 fix: track 5 frames works for bbox and polygon shapes (REQ-189)
trackForward read geometry.coordinates, a key the backend never emits, and
had no bbox branch - the action silently no-op'd for every shape (flagged
dead in docs/audit-2026-08-07.md:103).

- bbox points used as-is, polygon reduced to its bounding box
- guards speak instead of returning silently
- a frame SAM3 refuses no longer aborts the remaining frames
- a press during an in-flight run is ignored (would double-write)
- REQ-189 added; non-goal requirements.md:22 amended to keep exemplar
  propagation out while admitting this one-shot hand-off
2026-10-05 12:01:59 +07:00
asus 2971f9192c style: stack per-class override rows instead of a wide table (REQ-181 layout)
The width:100% table plus the new MaxBox column let the Class column absorb
the slack, stranding the Container checkbox away from its class. One block
per class now: name + Container checkbox on the first line, Conf/IoU/MinBox/
MaxBox inputs in a wrapping grid below. Behavior identical - KEYS,
buildClassParams, compose() copy line, toggleContainer revert, aria labels.
2026-10-05 11:01:26 +07:00
asus d3a6aa49b6 feat: per-class max box fraction (REQ-188)
- labeling/preview/autolabel: max_box_frac + per-class max_box_fracs
  ceiling filter (0=none, 1=off) before NMS, mirrors min_box_frac
- exemplar review-assist: ceiling before max_detections truncation;
  ExemplarLabelRequest + filter panel 'Max box size' slider
- ClassParamsTable: MaxBox column; copy line now REQ-186 amended
  order: class <name> conf <v> iou <v> minbox <v> maxbox <v> container
- docs: design/ui-spec/tasks updated (incl. stale 4-slider narrative)
2026-10-02 17:27:11 +07:00
asus dee58e4ae5 fix: resolve model weight paths against DATA_DIR (REQ-187)
- config.py: resolve_data_path (legacy abs + rel) + rel_data_path
- all file-opening reads wrapped: preview, autolabel, training, model
  download, live count, projects.get; training_start_point hack replaced
- new writes store paths relative to data/
- legacy stale rows (/home/asus/reTraining/...) resolve without migration
- requirements: REQ-187 added; REQ-188 (per-class max box) + REQ-186
  copy-line amendment drafted for the next task
2026-10-02 16:59:25 +07:00
asus 8f41c6c85a fix: exemplar draw keeps other classes' full-set preview (REQ-182 amended)
- AutoAnnotateModal: render merges last full-set detections for
  non-exemplared classes with conditioned results for exemplared ones
  (selected-not-exemplared filter); drawing an example no longer clears
  the other classes' detections
- Run Preview now always refreshes full-set first (exemplars: []) then
  re-runs exemplared classes
- docs: REQ-182 amended (merge semantics), design/ui-spec/tasks synced
2026-10-02 15:20:46 +07:00
asus 8fb65d2de9 feat: one-click copy of effective auto-annotate params (REQ-186)
- ClassParamsTable: Copy button above per-class overrides table —
  clipboard text, one line per class (class/conf/iou/minbox/container),
  effective values (override else global), present in both the
  per-batch and mass auto-annotate modals via the shared component
- clipboard.js: extract legacyCopy + copyText from ArchiveControls
  (insecure-context execCommand fallback), ArchiveControls now imports it
- docs: REQ-186 added; design/ui-spec/tasks synced
2026-10-02 14:28:46 +07:00
asus 6a36f102c9 Per-shape hide + dimmed shape list in review editor (REQ-185, amended REQ-183)
- ReviewPage: hiddenShapeIds/overriddenShapeIds session Sets, H toggles
  selected/marked shapes, purge effect removed (dimmed rows selectable
  from list), auto-override on draw/assist/copy into hidden class,
  class-eye toggle clears that class's overrides
- ReviewSidebar: all rows listed, dimmed rows get restore eye, header
  count = total shapes
- ShortcutsPanel: H entry
- docs: REQ-183 amended + REQ-185 added; design/ui-spec/tasks synced
2026-10-02 13:22:50 +07:00
asus 96a00267d9 feat: per-class exemplar preview, class hide toggle, container NMS flag (REQ-182, REQ-183, REQ-184) 2026-10-02 11:11:33 +07:00
asus 1a99f2ffe4 feat: per-class autolabel params + frame-scoped class clear (REQ-180, REQ-181)
- REQ-181: class_params {name: {threshold?, iou_threshold?, min_box_frac?}}
  on /preview and /autolabel, per-class override table in both modals;
  empty overrides take the unchanged global path
- REQ-180: x button on each review sidebar class row clears that class on
  the current frame only via bulk-delete, no confirmation
- includes REQ-178 empty date-folder cycle fix (archive_index.py)
2026-10-01 17:01:54 +07:00
Andrew-AAAA 4606c0adeb docs: add archive upload/copy-path implementation plan 2026-09-29 11:49:56 +07:00
Andrew-AAAA 4b33af54ae fix: use gpus:all for GPU passthrough, detect Docker Desktop in start.sh 2026-09-29 11:49:54 +07:00
Andrew-AAAA 5d8f1272ff docs: update read-only wording for archive upload in ui-spec and panduan 2026-09-29 09:42:22 +07:00
Andrew-AAAA 113db4559b docs: revise REQ-074 read-only wording for user-initiated uploads 2026-09-29 09:38:40 +07:00
Andrew-AAAA 085eb51229 docs: mark archive upload/copy-path tasks DONE with verification evidence 2026-09-29 09:35:55 +07:00
Andrew-AAAA 15cc9777b9 docs: revise REQ-010/163 for archive upload, add REQ-178/179 2026-09-29 08:58:34 +07:00
Andrew-AAAA d170cff0e4 feat: add descriptive model naming and inline rename
- Auto-generate model names: {arch}-{labelType}-{epochs}ep-{classNames}-{YYYYMMDD}
- Add PATCH /api/models/{id}/rename endpoint
- Inline rename UI on Models & Training page
- Download filename uses model name instead of v{N}
- DB migration: add name column to model_versions
- Update all docs to reflect new naming convention
2026-09-10 09:14:55 +07:00
Andrew-AAAA cf4c3370e1 feat: remap ports to 9000/9010, update documentation, and add Mermaid ERD 2026-09-01 09:15:49 +07:00
Andrew-AAAA 8ad35ed9d1 docs: add database entity relationship diagram (ERD.md) 2026-08-31 15:44:27 +07:00
asus c0cce17490 feat(docs): generate and add modern project logo to README header 2026-08-27 15:25:51 +07:00
asus 6485f59e26 docs: transform README into SaaS-grade reference manual and optimize repository hygiene 2026-08-27 14:27:29 +07:00
ervanfahriaw ac95674c07 feat: sync live-count, exemplar annotation modules, and update .gitignore 2026-08-24 14:57:42 +07:00
asus 5c7c122105 feat: add counting bench, triage, and dataset modules
This commit includes major additions and updates to the frontend and backend architectures, introducing new dataset management, live counting features, batch processing, and triage logic. Includes new UI pages, components, and API routes.
2026-08-14 16:28:52 +07:00
asus d07578462e feat: setup dataset enrichment app codebase and scripts 2026-08-05 11:52:27 +07:00