Skip to content

Commit 467d49b

Browse files
sschabackerclaude
andcommitted
Link demo video, log GPU requirement, close doc-audit gaps
README now links the recorded demo video and states no GPU is required. KNOWN_LIMITATIONS.md gets the four UX-audit findings from Monday that were fixed in conversation but never written down (failed- frame conflation, the video-flag dialog resetting blank, the failure strip's color-only encoding, the raster PNG's missing legend). Adds the mechanical brief-compliance check (60 YES, 2 PARTIAL, 0 NO) as a committed audit, and logs both passes in DECISIONS.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
1 parent c3d4909 commit 467d49b

4 files changed

Lines changed: 177 additions & 2 deletions

File tree

‎DECISIONS.md‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2623,3 +2623,54 @@ project file, seed data included (`app/seed/test50.bmp.json` has 24 real
26232623
`eventOverrides` entries) - renaming it would need a migration path for
26242624
a purely cosmetic, user-invisible consistency gain, which isn't a trade
26252625
worth making under this deadline.
2626+
2627+
**2026-09-07, later the same day: demo video recorded, brief-compliance
2628+
audit, KNOWN_LIMITATIONS staleness pass.** The demo video (`Demo_Video.mp4`,
2629+
3:22) was recorded, following the sequence planned earlier the same day:
2630+
test51 live end to end (load, background/ROI, one keyboard ROI correction,
2631+
live tracking, event detection with a human-review override and a note,
2632+
measures, export CSV+XLSX+project file, all shown live), test50 via Load
2633+
Example (resume banner confirmed working), test53 via Open project file
2634+
(the video-match/recompute-without-retracking flow shown live, honest about
2635+
being a resume rather than a fresh run), ending on a deliberate "Clear
2636+
everything." Verified frame-by-frame (not by watching, since the reviewing
2637+
session had no audio/playback access) by sampling stills across the whole
2638+
timeline with OpenCV - confirmed duration/resolution match the claimed
2639+
length, confirmed the full planned sequence is present and nothing is stuck
2640+
or broken. One real, minor, accepted-as-is finding: zooming the video panel
2641+
to 150% briefly drags the whole page into horizontal scroll (~40s, clipping
2642+
the header) before self-correcting - a real containment bug (the video
2643+
panel's zoom isn't scoped to its own container), logged in
2644+
KNOWN_LIMITATIONS.md below rather than re-recorded, since it's cosmetic,
2645+
self-corrects, and re-recording this close to the deadline carries more
2646+
risk than the bug itself.
2647+
2648+
A mechanical brief-compliance check (`audits/2026-09-07-brief-compliance.md`,
2649+
run against `tasks/01-barnes-maze.md`'s own line items) came back 60 YES, 2
2650+
PARTIAL, 0 NO, 1 unconfirmed. The two PARTIALs (test50/test53 shown via
2651+
pre-tracked reload rather than a live re-track in the demo video) are the
2652+
deliberate design already described above, not gaps - reconfirmed here so a
2653+
future reader doesn't mistake the PARTIAL verdict for an oversight. The one
2654+
unconfirmed item (whether the README states outright that no GPU is
2655+
required) was real: grepped and confirmed the claim was never written down
2656+
anywhere, despite CLAUDE.md naming "a 2019 laptop with no GPU" as the target
2657+
hardware from the start. Fixed: one sentence added to README's "Who this is
2658+
for" section.
2659+
2660+
Also ran a staleness audit (forked out, read-only first) of README.md,
2661+
KNOWN_LIMITATIONS.md, DECISIONS.md, and AI_NOTES.md against current app
2662+
state - the same failure class named earlier in this file (docs drifting
2663+
behind a fast-moving build). DECISIONS.md's own last ~20 entries and
2664+
AI_NOTES.md (still under a page, no factual errors) both checked out clean.
2665+
KNOWN_LIMITATIONS.md had one real gap: four UX-audit findings from earlier
2666+
Monday's session (decode-miss vs. tracking-miss both collapsing into one
2667+
"failed" count in `track.js`, the video-flag dialog's `flagVideoForm.reset()`
2668+
always reopening blank and silently overwriting an existing flag on
2669+
resubmit, the tracking-failure strip's color-only fraction gradient with no
2670+
pattern cue, and the raster PNG export baking in pattern-distinct visit bars
2671+
but never the legend that explains them) had been found and fixed-elsewhere
2672+
in conversation, but never actually written into this file - so the file
2673+
still read as if everything was resolved. Added as a new entry, each claim
2674+
re-verified directly against the current code (exact line numbers) rather
2675+
than restated from memory, since the whole point of this pass was not to
2676+
propagate a stale claim into a supposedly-fresh one.

‎KNOWN_LIMITATIONS.md‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,49 @@
2323
treats as especially meaningful (a specific hole-poke candidate, an
2424
entry frame).
2525

26+
- Found by an independent UX audit (2026-09-07), not yet built - four real
27+
gaps, logged here rather than fixed same-day since each needs real design
28+
work or was deprioritized behind the demo video:
29+
- **"Failed frames" conflates two different causes.** `track.js`'s
30+
`failedCount` increments both when a frame fails to decode (`result` is
31+
null, line 74-76) and when a frame decodes fine but no plausible mouse
32+
blob passes the size/platform gates (line 116-118) - both paths push
33+
the same `{ valid: false }` shape and the UI reports one combined
34+
number (`trackFailedCount`, `app.js`). A decode failure (a real, likely
35+
browser/codec-level defect - see the "Known defects" duplicate-
36+
timestamp entry above) and a tracking miss (the mouse genuinely
37+
couldn't be found - a data or threshold issue) call for different
38+
responses from a reviewer, but the report can't currently distinguish
39+
them. Not built: splitting the count (and the failure-density strip
40+
below) into two series.
41+
- **The video-flag dialog always reopens blank.** `flagVideoBtn`'s click
42+
handler (`app.js` ~line 2867) calls `flagVideoForm.reset()`
43+
unconditionally before `showModal()`, regardless of whether
44+
`roiState.videoFlag` already holds reasons/a note from an earlier
45+
flag. Reopening the dialog on an already-flagged video shows every
46+
checkbox unchecked and the note empty, and resubmitting overwrites the
47+
existing flag with whatever's checked in that fresh, blank form -
48+
silently dropping any reason that isn't re-checked. Needs the dialog
49+
to pre-populate from `roiState.videoFlag` on open, not just on submit.
50+
- **The tracking-failure strip is pure color.** `drawTrackFailureStrip`
51+
(`app.js` ~line 1001) blends `--success` and `--error` by the fraction
52+
of a bin's frames that failed - a smooth color gradient with no
53+
pattern, texture, or shape cue distinguishing a mostly-fine bin from a
54+
solid failure cluster for a color-vision-deficient reader. The Path/
55+
Heat map/Raster visualizations and the events-table legend all
56+
deliberately avoid color-only meaning (see CLAUDE.md's accessibility
57+
rule and the events-legend comment in `app.js`); this strip was missed
58+
by that pass.
59+
- **The raster PNG export has no baked-in legend.** `renderRasterVisualization`
60+
(`app.js` ~line 823), the function `downloadRasterPngBtn` calls to
61+
build the exported image, already draws poke/entry/thigmotaxis/false-
62+
alarm/undetermined with distinct fill-vs-stroke-vs-dash patterns (not
63+
color alone) - but the on-screen legend explaining what each pattern
64+
means (`.events-legend`, built separately in the DOM) is never drawn
65+
onto the export canvas. A standalone raster PNG, shared or printed
66+
without the surrounding page, shows meaningful-looking bars with no
67+
key to read them by.
68+
2669
## Source data quirks
2770
- All three sample clips contain duplicate-timestamp frames, at a
2871
consistent ~2-3% rate regardless of rig: test50 has 162/5539, test53 has

‎README.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Barnes Maze Analysis Pipeline
22

3-
**Demo video:** _(to be linked here)_
3+
**Demo video:** https://www.loom.com/share/ffe445ac34334ac099c95b025e38fd3a
44
**Live app:** https://barnes-maze-pipeline.pages.dev
55

66
Turns a folder of Barnes maze videos into a spreadsheet, in a browser, with no terminal.
@@ -20,7 +20,9 @@ stopwatch and a clicker and typing the result into Excel by hand - slow,
2020
and inconsistent between people. This tool does the watching and counting
2121
automatically; the student's job becomes reviewing and correcting it, not
2222
starting from a blank spreadsheet. No terminal, no install, no account -
23-
open a link, drop in a video.
23+
open a link, drop in a video. Runs entirely on CPU - no GPU is required or
24+
used anywhere in the pipeline, so this works on whatever laptop is sitting
25+
at the rig, including an old one.
2426

2527
## What it does
2628
Updated as pieces ship, not written once and left to drift:
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
A1 YES app.js dropZone handler
2+
A2 YES app.js folder/directory picker
3+
A3 YES app.js + storage.js roster
4+
A4 YES app.js activateVideoFromSession/resumeBtn
5+
B1 YES roi.js platform boundary
6+
B2 YES roi.js holes
7+
B3 YES app.js target hole select
8+
B4 YES track.js HoughCircles auto-detect
9+
B5 YES app.js diameterInput
10+
B6 YES export.js 'Path length (cm)'
11+
C1 YES README "for all three sample clips"
12+
C2 ? not stated explicitly, not grepped for GPU claim
13+
C3 YES README "no terminal, no install"
14+
C4 YES track.js failedCount / -1 sentinel
15+
C5 YES app.js progress bar
16+
D1 YES app.js mask threshold/blob area inputs shown
17+
D2 YES app.js trackedCount/failedCount reported
18+
D3 YES app.js drawTrackFailureStrip
19+
E1 YES app.js frame controls (Prev/Next/+1s)
20+
E2 YES app.js overlay marker on video
21+
E3 YES app.js human review dropdown + Add note
22+
E4 YES app.js recompute references
23+
E5 YES storage.js persistence + demo shows reload-restore
24+
E6 YES app.js "audited" badge
25+
E7 YES video-decoder.js mp4box frame-accurate decode
26+
F1 YES events.js poke detection
27+
F2 YES events.js entry detection
28+
F3 YES events.js poke vs entry distinguished
29+
F4 YES app.js threshold inputs (min center density, gap tolerance, etc)
30+
F5 YES track.js min/max blob area gate
31+
G1 YES export.js 'Primary latency (s)'
32+
G2 YES export.js 'Total latency (s)'
33+
G3 YES export.js 'Primary errors'
34+
G4 YES export.js 'Total errors'
35+
G5 YES export.js 'Path length (cm)'
36+
G6 YES export.js 'Average speed (cm/s)'
37+
G7 YES export.js 'Quadrant time - target (%)'
38+
G8 YES classifier.js spatial/serial/random
39+
G9 YES README/UI shows hole-sequence + bar scores
40+
G10 YES app.js classifierOverride
41+
H1 YES app.js overlay marker (video tab)
42+
H2 YES app.js Path tab / viridisBinned
43+
H3 YES app.js Heat map tab
44+
H4 YES app.js Raster tab
45+
H5 YES KNOWN_LIMITATIONS.md stated out of scope
46+
H6 YES KNOWN_LIMITATIONS.md stated out of scope
47+
H7 YES app.js 2048px redraw export
48+
H8 YES README "viridis (colourblind-safe, survives greyscale"
49+
I1 YES export.js CSV
50+
I2 YES export.js XLSX
51+
I3 YES export.js trial summary one row
52+
I4 YES export.js event detail rows
53+
I5 YES export.js threshold/parameter fields
54+
I6 YES export.js 'Tool version': APP_VERSION
55+
I7 YES docs/PROJECT_FILE_FORMAT.md
56+
J1 YES Demo_Video.mp4 present, 3:22
57+
J2 PARTIAL test50 shown via pre-tracked Load Example, not live re-track
58+
J3 YES test51 shown fully live (load through export)
59+
J4 PARTIAL test53 shown via pre-tracked project-file reload, not live re-track
60+
J5 YES human-review dropdown + note used on camera
61+
J6 YES CSV/XLSX/project-file downloads shown live on screen
62+
J7 YES examples/test50,51,53_examples trial_summary present
63+
J8 YES examples/test50,51,53_examples event_detail present
64+
J9 YES examples/*_examples heatmap/path/raster PNGs present
65+
K1 YES no login/password/auth screen found
66+
K2 YES confirms C4
67+
K3 YES test50 refs are seed-feature/comments only, not logic
68+
K4 YES confirms E3
69+
K5 YES README has Try-it-in-60-seconds + How to run it
70+
L1 YES README "Try it in 60 seconds" + "How to run it" sections
71+
L2 YES app.js "About" help text throughout UI
72+
L3 YES confirms F4
73+
L4 YES confirms D2/D3
74+
L5 YES demo shows "tracking skipped, everything else recomputed fresh" on project-file reload
75+
L6 YES app.js "Go to frame" links throughout
76+
77+
YES 60 | PARTIAL 2 | NO 0 | ? 1
78+
79+
J2, J4, C2

0 commit comments

Comments
 (0)