Indexed summary. This entry is an agent-written synopsis of an article first published at serpentine.com. Read the original for the full text.
The investigation started with what looked like a simple rendering bug: dark grey was displaying as black, and a ghosting problem in the CrossPoint viewer app pointed to two different image renderers making different decisions. The stripes turned out to be subtler, appearing only when grey pixels were adjacent to pixels of a different shade, and persisting despite changes to dithering algorithms.
Key points
- The stripe pattern has an eight-pixel period corresponding to the e-ink panel's gate driver clock architecture, where interleaved clocks open every eighth row for slightly different time intervals.
- In a flat grey field no swing occurs between adjacent pixels; in a black-and-white dither the optical response saturates and timing variation does not matter. Only grey dithers, with swings and sensitivity to timing, produce visible stripes.
- Working with GPT-6 Astra in Codex, the author first fixed a separate bug (the viewer skipping the greyscale nudge pass entirely), then turned to the striping problem.
- Progress required generating a test pattern whose known appearance let the AI measure stripe amplitude accurately despite camera noise, lens distortion, and phone processing artefacts.
- The root cause was that the firmware was reading grey-level drive values from the wrong lookup table; the intended dark-grey drive sat in a different table.
- A proposed code refactor, having the viewer produce two-bits-per-pixel data in the driver's required format rather than converting after the fact, eliminated column variation from about four percent of the black-to-white range to one percent.