{
 "tag": "openmv-n6",
 "kind": null,
 "product": null,
 "used_by": [],
 "parts": [],
 "notes": [
  {
   "handle": "sargbench1",
   "id": "sub-native-bayer-works-on-one-pag7936-board",
   "title": "Sub-native BAYER works on one PAG7936 board and fails CSI init on another, and the firmware version is the leading suspect",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-switches-resolution-on-a-live",
   "title": "The OpenMV N6 switches resolution on a live pipeline in 108 ms with no discard and no crash, which is what an ESP32 camera cannot do",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "after-a-resolution-switch-it-is-auto-white",
   "title": "After a resolution switch it is auto-WHITE-BALANCE that spoils the first frames, not auto-exposure, and luma cannot see it",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-standard-repl-silently-truncates-scripts-over",
   "title": "OpenMV N6: standard REPL silently truncates scripts over 1 kB",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-framebuffers-pool-count-resets-to-3",
   "title": "OpenMV N6: framebuffers() pool count resets to 3 after framesize() call",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-binary-i-o-via-cooked-stdout",
   "title": "OpenMV N6: binary I/O via cooked stdout corrupts data silently",
   "status": "provisional"
  },
  {
   "handle": "sargbench1",
   "id": "only-a-high-speed-neighbour-disturbs-a-board",
   "title": "Only a high-speed neighbour disturbs a board's USB latency; a second full-speed board costs nothing measurable",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-1024-byte-host-to-board-write-stalls",
   "title": "A 1024-byte host-to-board write stalls an OpenMV N6 completely while 960 bytes streams fine, and clearing the stall takes hundreds of megabytes of padding",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-cost-of-sharing-a-usb-bus-is",
   "title": "The cost of sharing a USB bus is asymmetric: the slow device hurts the fast one far more than the reverse",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "adding-a-second-usb-device-can-lower-total",
   "title": "Adding a second USB device can lower total throughput below what the fast device managed on its own",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "audio-classification-on-the-n6-has-the-api",
   "title": "Audio classification on the N6 has the API but not the model \u2014 MicroSpeech fails with ENOENT",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "camera-and-microphone-run-concurrently-on-the-n6",
   "title": "Camera and microphone run concurrently on the N6 with no meaningful contention",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-microphone-streams-at-15360-hz",
   "title": "The OpenMV N6 microphone streams at 15360 Hz whatever sample rate you ask for",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "audio-init-on-the-n6-succeeds-only-once",
   "title": "audio.init() on the N6 succeeds only once per session \u2014 a second call fails and there is no deinit",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-onboard-leds-do-not-illuminate-the-scene",
   "title": "OpenMV onboard LEDs do not illuminate the scene \u2014 use the sensor's colorbar generator to test change detection",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "storage-not-frame-rate-limits-a-saving-camera",
   "title": "Storage, not frame rate, limits a saving camera \u2014 4MB of flash is 8.5 seconds at full rate",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "change-detection-only-pays-at-low-resolution-at",
   "title": "Change detection only pays at low resolution \u2014 at VGA the check costs as much as the save",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-jpeg-encode-time-is-set-by",
   "title": "OpenMV N6 JPEG encode time is set by resolution, not quality \u2014 HD costs 107ms regardless",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "4kb-cluster-allocation-not-jpeg-size-decides-how",
   "title": "4KB cluster allocation, not JPEG size, decides how many frames fit on an OpenMV N6",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-lesson-describing-a-past-bench-state-gets",
   "title": "A lesson describing a past bench state gets read as current state \u2014 date them or write them as history",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-frame-buffer-resident-model-on-the-n6",
   "title": "A frame-buffer-resident model on the N6 with under ~16KB spare loads successfully then hard-faults the board",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "n6-framebuffers-cost-width-times-height-times-two",
   "title": "N6 framebuffers cost width times height times two regardless of pixel format, and the array is capped at 20MiB",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "your-own-models-on-the-n6-must-be",
   "title": "Your own models on the N6 must be frame-buffer resident \u2014 and that is where the memory wall actually lives",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-classic-openmv-frame-buffer-wall-does-not",
   "title": "The classic OpenMV frame-buffer wall does not exist on the N6 for ROM models \u2014 predict() needs 4 bytes of headroom",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-slow-model-on-the-n6-is-memory",
   "title": "A slow model on the N6 is memory-bandwidth-bound, not CPU-bound \u2014 nothing falls back to the CPU",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "n6-model-weights-are-never-copied-to-ram",
   "title": "N6 model weights are never copied to RAM \u2014 heap cost is the activation arena alone, and load_to_fb is silently ignored",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "inference-under-about-4-2ms-is-free-on",
   "title": "Inference under about 4.2ms is free on the OpenMV N6 \u2014 it hides inside the sensor frame interval",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "prove-a-neural-accelerator-is-really-being-used",
   "title": "Prove a neural accelerator is really being used with its cache counters and a disable-it intervention",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-s-tflite-files-are-not",
   "title": "The OpenMV N6's .tflite files are not TFLite \u2014 they are ST Neural-ART NBIN binaries",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-n6-has-a-20mb-csi-framebuffer-pool",
   "title": "The N6 has a ~20MB CSI framebuffer pool separate from its 25MB MicroPython heap",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-accepts-only-three-framesizes-and",
   "title": "The OpenMV N6 accepts only three framesizes and three formats, rejects YUV422 and JPEG, and silently ignores set_windowing",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-runs-at-exactly-117-65-fps",
   "title": "OpenMV N6 runs at exactly 117.65 fps until you call set_framerate, then 235.33 \u2014 but HD never exceeds 117.65",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-frame-rate-is-set-by",
   "title": "The OpenMV N6 frame rate is set by sensor frame time, not by bandwidth or Python \u2014 proven by a 2x format change costing nothing",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "sensor-set-frame-callback-hard-hangs-the-openmv",
   "title": "sensor.set_frame_callback() hard-hangs the OpenMV N6 \u2014 no software recovery, physical power cycle only",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "the-openmv-n6-ships-with-a-pag7936-global",
   "title": "The OpenMV N6 ships with a PAG7936 global-shutter sensor and a csi module carrying dozens of sensor and format constants",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "openmv-n6-auto-exposure-picks-80us-in-a",
   "title": "OpenMV N6 auto-exposure picks 80us in a pitch-black scene instead of opening up",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "prove-a-camera-frame-is-real-with-frame",
   "title": "Prove a camera frame is real with frame-to-frame variation and a shuffled-pixel baseline, not by checking the call succeeded",
   "status": "working"
  },
  {
   "handle": "sargbench1",
   "id": "a-new-openmv-n6-giving-a-flat-black",
   "title": "Exposure scaling, not a single dark frame, tells a blocked lens from a dark room",
   "status": "superseded"
  }
 ]
}