--- slug: the-blade-the-camera-bent passed: 2026-10-14 by: the assay line (research/assay-line/cited-1014b/), Codex fixer directed by claude-assaying-boyle-1014; source record by Codex, checked by Codex checked: 82 confirmed: 54 wrong: 27 unverifiable: 0 observed: 0 stale: 1 --- This pass applied the 28 directing triage decisions for the blade layer read at f5e5f84f34, after rereading the relevant evidence and reproducing the renderer, fit, and angle-threshold failures. It fixed 17 WRONG items, updated the one STALE JSON-LD date under the explicit exception, and left 10 listed MINOR items unchanged with the directing reasons. The 54 CONFIRMED claims below retain the N2 checker's source rereads, explicitly attributed to that pass. MINOR lines are included in the wrong count. Six dated corrections appear on the authored HTML page and at the end of its markdown body; this record does not claim that every remaining sentence has been newly verified. ## Claims - MINOR | X1: “Its exact shape encodes how fast the rows were read and how fast the prop was turning.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Cole parameterizes the distortion by omega/v, one product in row-time coordinates; the body supplies the known-factor qualification. Directing triage: I reread Cole, Rolling Shutters, the image-transformation derivation: "The factor" omega/v "parameterises the transformation". The shape determines the product omega*tau, so either speed can be recovered given the other. The page itself supplies that qualification at HTML line 269, "recovering one given the other is just division". This opening wording omits that qualification rather than invalidating the stated model. Keep MINOR and list under tier C; it is a separate sentence from X3. - MINOR | X2: “Read the bend backward and you recover the numbers.” | https://onlinelibrary.wiley.com/doi/10.1155/2018/1037083 | Zhao section 2.3 and equation (6) use a known row delay, and recover() divides by tau. Directing triage: The checker notes that Zhao equation (6) requires the camera row delay. I independently reread the page code at f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, recover(), line 555: "rpmFromOmega(kRec / t)". Thus recovery also uses the known line time, consistently with the explicit qualification at line 269. I did not independently retrieve Zhao. Keep this omitted qualification MINOR and list under tier C; its sentence ends before the WRONG sentence in X3. - WRONG | X3: “Below, you do exactly that.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - WRONG | X4: “imaged blade (rendered from the readout)” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 451) | Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - WRONG | X5: “renders the blade purely from this equation, row by row” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 451) | Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - WRONG | X6: “it samples points off the rendered curve” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - WRONG | X7: “it is fit from the slope of the curve the sensor actually drew.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - MINOR | X8: “asserts every number on this page.” | git show f5e5f84f34:research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs (line 134) | The standalone verifier asserts selected calculations from its own constants; it does not read the page. Directing triage: I reread f5e5f84f34:research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs. Its worked-example section, line 134, starts "const rpm = 600, N = 1080, Tread = 1 / 30;" and asserts selected calculations. That does not establish every number on the page. The page also acknowledges at HTML line 298 that the check cannot notice a figure that drifted. This is an overstatement of its own checking scope, explicitly MINOR under the task rule. Tier C: list. X28 concerns a separate assertion label, not this sentence. - WRONG | X9: “the drawn spiral crosses itself on screen,” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 583) | Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - WRONG | X10: “they would have to unwrap the angle before fitting.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Reread Cole and the page warning, then independently fitted raw atan2 angles from complete row intersections at 950 RPM and 1/30 s. The two arms recover 950.000000000 and 949.999999996 RPM with no branch-cut jumps. Replaced the mandatory-unwrapping claim with a sample-dependent qualification; unwrapping is not ruled out in general. - WRONG | X11: “The overlap threshold is a genuine property of the measurement, not a rendering bug.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 583) | Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - MINOR | X12: “readout direction varies by sensor and crop mode” | https://www.tucsen.com/learning/how-rollingscan-works-and-how-to-use-it/ | Tucsen documents upward and alternating scan modes, but the cited text supplies no crop-triggered direction reversal. Directing triage: Rule 4: the checker identifies real upward and alternating scan modes in Tucsen, but no cited example in which a crop-mode change reverses scan direction. This supports a precision or source-scope note about the crop qualifier; it does not prove that such a sensor can never exist. Keep MINOR and list under tier C. This sentence ends before the separate geometry assertion in X13, so the same-sentence exception does not apply. - WRONG | X13: “The clean spiral here is the geometry under the blur” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 451) | Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - WRONG | X14: “roughly 1/15 s on the slowest typical stills sensors” | https://horshack-dpreview.github.io/RollingShutter/; https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/ae259d02d86aebe7d0301fe3776d5ea7f0d7497f/docs/index.html | Reread the live camera table and the immutable 2025-08-01 table at commit ae259d02d86aebe7d0301fe3776d5ea7f0d7497f: Nikon Z5 Photo is 111.854311730048 ms, about 1/9 s, slower than 1/15 s. Replaced the claimed slow limit with a measured example; it predates publication. - MINOR | X15: “the documented 5–35 µs band.” | https://www.tucsen.com/learning/how-rollingscan-works-and-how-to-use-it/; https://docs.baslerweb.com/knowledge/exposure-end-event-on-ace-and-ace-2-rolling-shutter-cameras | Tucsen says 5 to 25 microseconds per line; Basler separately gives 35 microseconds for acA4024-8gm. Directing triage: Rule 4: Tucsen documents a typical 5-25 microsecond range, while the checker separately found a Basler 35-microsecond camera example. Those notes support a source-range precision issue, not a physically impossible 31-microsecond illustrative setting. Keep MINOR and list under tier C. The line-time sentence is separate from the slowest-stills sentence being fixed for X14. - MINOR | X16: “the kinematic distortion model and its inversion” | https://scholars.lib.ntu.edu.tw/bitstreams/394463a2-2022-4349-b137-4ff14cdd00a1/download | Liang section IV restricts its model to translation approximately parallel to the image plane. Directing triage: Rule 4: the checker identifies the genuine Liang, Chang and Chen paper and its restriction to translation approximately parallel to the image plane. Its general rolling-shutter compensation work is relevant background, but the broad citation label does not distinguish it from the particular propeller inversion demonstrated here. Keep this attribution-scope imprecision MINOR and list under tier C; the note does not establish a fabricated paper or quotation. - WRONG | X17: “what the sensor reads · row by row” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 451) | Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - WRONG | X18: “it samples the rendered curve” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - MINOR | X19: “the RPM the page recovers from the bend alone.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 555) | recover() uses kRec/t; the metadata has the reader set readout time and the body states the known-factor qualification. Directing triage: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, metadata line 16 and recover(), line 555: "rpmFromOmega(kRec / t)". RPM requires the known line time as well as the fitted slope. The metadata sentence itself starts by having the reader set readout time, and the body explicitly explains recovering one factor given the other. Keep the missing known-line-time qualification MINOR and list under tier C. This decision concerns the word alone; it does not excuse the separate false rendered-sampling claims fixed under recovery-from-rendered-curve. - MINOR | X20: “the RPM the page recovers from the bend alone” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 555) | The JSON-LD description names omega*tau but the phrase alone omits the known line time used by recover(). Directing triage: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, JSON-LD description line 39 and recover(), line 555: "rpmFromOmega(kRec / t)". The description correctly identifies omega*tau earlier, but the phrase bend alone omits the known line time needed to separate its factors. This is the same MINOR qualification issue as X19. Tier C: list. The dateModified fix in X21 is a different JSON-LD field, not a WRONG item in this sentence. - STALE | X21: “"dateModified":"2026-06-27"” | git show 2e60bcb5dd1:public/strata/the-blade-the-camera-bent/index.html | Reread dateModified and git show 2e60bcb5dd1 for the later image-alt edit. Set dateModified to 2026-10-14, preserving datePublished 2026-06-27. The six Corrected lines date this revision; the explicit JSON-LD exception requires no separate Updated line. - WRONG | X22: “then inverts the rendered curve to recover the RPM” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - MINOR | X23: “Every displayed number is recomputed and asserted” | git show f5e5f84f34:research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs (line 134) | The verifier computes selected model quantities from its own constants and never reads the markdown. Directing triage: I reread f5e5f84f34:src/content/strata/the-blade-the-camera-bent.md, lines 25-26, and the verifier worked-example section. At verifier line 134, "const rpm = 600, N = 1080, Tread = 1 / 30;" fixes its own inputs; the subsequent assertions check selected modeled quantities. Every displayed number overstates that scope. Keep MINOR and list under tier C, as the same error as X8. The sentence starts after the rendered-inversion sentence in X22, so it is not covered by the same-sentence exception. - WRONG | X24: “on-screen spiral overlaps (needs unwrap)” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 583) | Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - WRONG | X25: “the drawn spiral overlaps itself; a real measurer” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 583) | Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - WRONG | X26: “must unwrap the angle first.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 552) | Reread Cole and the page warning, then independently fitted raw atan2 angles from complete row intersections at 950 RPM and 1/30 s. The two arms recover 950.000000000 and 949.999999996 RPM with no branch-cut jumps. Replaced the mandatory-unwrapping claim with a sample-dependent qualification; unwrapping is not ruled out in general. - MINOR | X27: “the on-screen curve is ambiguous by eye.” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html (line 583) | The rotation threshold is not a test of a viewer's ability to follow the curve; the separate subjective sentence is unchanged. Directing triage: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, lines 583 and 610-611. "the on-screen curve is ambiguous by eye" is asserted whenever "Math.abs(totalDeg) > 180". That condition does not assess a viewer's ability to identify or follow a branch. Keep this loose visual-ambiguity wording MINOR rather than treating a subjective by-eye judgment as a new mathematical falsehood. Tier C: list. It belongs to the following sentence beginning The fit here, not the overlap and mandatory-unwrapping sentence fixed by X25 and X26. - WRONG | X28: (added) “slope is constant across the frame (Archimedean spiral arc)” | git show f5e5f84f34:research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs (line 58); https://jasmcole.com/2014/10/12/rolling-shutters/ | Reread the verifier and Cole polar geometry. A constant angle-per-row slope is not a constant angle-per-radius slope: the pinned 600-RPM renderer gives radial increments -0.003511869692 and -0.007618765813 radians per pixel. Corrected the assertion label in the source verifier and its downloadable mirror; retained the valid row-angle assertion. - CONFIRMED | “Photograph a fast propeller with a phone and the blades come out curved, sheared, or cut clean in half.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: phone-propeller: Cole shows the bent and disconnected propeller image and derives the row-time distortion. PetaPixel’s 2015 article identifies its smartphone example. The README excerpt alone is incomplete support for the image-shape details. - CONFIRMED | “People call it a glitch, a camera bug, a broken picture.” | https://petapixel.com/2015/11/14/this-is-how-cameras-glitch-with-photos-of-propellers/ | Retained N2 checker source reread: people-call-glitch: Opened the source through web after curl returned 403; its title is “This is How Cameras Glitch with Photos of Propellers”. This supports an example of calling it a glitch, not a population prevalence. - CONFIRMED | “It is the opposite of broken.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: opposite-of-broken: The README explains staggered exposure and readout, with rows recording different moments. Its 4000-row example explicitly spans 49,987.5 microseconds from first row to last. Confirmed within the idealized model; the page separately names finite exposure blur. - CONFIRMED | “The camera recorded the literal truth” [...] “it just didn't record it all at once.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: literal-truth: The README explains staggered exposure and readout, with rows recording different moments. Its 4000-row example explicitly spans 49,987.5 microseconds from first row to last. Confirmed within the idealized model; the page separately names finite exposure blur. - CONFIRMED | “A rolling-shutter CMOS sensor reads its rows one after another, top to bottom, a few microseconds apart.” | https://www.tucsen.com/learning/how-rollingscan-works-and-how-to-use-it/ | Retained N2 checker source reread: sequential-top-bottom: Tucsen documents top-to-bottom acquisition and 5 to 25 microseconds between lines. The full README also supplies a 12.5-microsecond example. These supplement the short excerpt where needed; directions and grouped rows vary outside this idealization. - CONFIRMED | “By the time the bottom row is read, the blade has moved.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: bottom-row-motion: The README explains staggered exposure and readout, with rows recording different moments. Its 4000-row example explicitly spans 49,987.5 microseconds from first row to last. Confirmed within the idealized model; the page separately names finite exposure blur. - CONFIRMED | “So each row catches the blade at a slightly later instant, and a straight blade images as a spiral.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: straight-blade-spiral: Cole derives angle as a function of vertical image position and describes S-shaped propeller curves. This supports the general curved-blade explanation. The mathematically specific Archimedean label occurs only in the verifier and is separately added below. - CONFIRMED | “The bend isn't noise” [...] “it's a clock.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: bend-clock: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “Faster spin, more bend” [...] “the bend is the speed.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: faster-spin-more-bend: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “ω = rpm·2π/60” | https://openstax.org/books/university-physics-volume-1/pages/10-1-rotational-variables | Retained N2 checker source reread: rpm-angular-conversion: OpenStax Example 10.2 multiplies revolutions/minute by 2*pi radians/revolution and 1 minute/60 seconds; its 250 RPM example gives 26.2 rad/s. - CONFIRMED | “The kinematics is one line. A straight radial blade at start angle θ₀, spinning at angular velocity ω = rpm·2π/60, imaged on sensor row y (rows counted from the top, each delayed by the line time τ), appears at angle θ(y) = θ₀ + ω · (y · τ)” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: angle-at-row: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “The slope of that imaged curve” [...] “angle per row” [...] “is the constant k = ω·τ.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: constant-slope: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “That single number is the clock.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: slope-is-clock: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “The readout model is the documented one: a CMOS rolling shutter reads rows sequentially with a fixed per-line delay τ, so a feature present at angle θ₀ when row 0 is read is at θ₀ + ω·(y·τ) when row y is read.” | https://onlinelibrary.wiley.com/doi/10.1155/2018/1037083 | Retained N2 checker source reread: documented-model: Opened Wiley after curl returned 403. Section 2.1 specifies a fixed row delay; section 2.3 uses that known delay in its angular-velocity calculation. The page’s constant-angular-speed equation follows from that stated idealization. - CONFIRMED | “The slope of the imaged curve is therefore the constant ω·τ in radians per row, and the total skew across an N-row frame is ω·N·τ = ω·T_readout.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: slope-and-total-skew: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “each row integrates light over a finite exposure, so a fast blade is smeared (motion blur) rather than frozen at one instant;” | https://people.csail.mit.edu/fredo/comp-photo-book/12-video-01-motion-blur-and-temporal-sampling.html | Retained N2 checker source reread: finite-row-exposure: The MIT computational-photography chapter describes temporal integration of incoming light and the resulting streak along a moving feature’s trajectory. This supports motion blur during each row’s finite exposure. - CONFIRMED | “(top-to-bottom, bottom-to-top, even sideways)” | https://en.wikipedia.org/wiki/Rolling_shutter | Retained N2 checker source reread: sideways-readout: Wikipedia includes horizontal scanning. Independently corroborated by Basler’s manufacturer explanation: some sensor types expose from left to right. Source: https://www.baslerweb.com/en-us/learning/cmos-rolling-shutter-cameras/. - CONFIRMED | “electronic-shutter readout can be non-uniform.” | https://cave.cs.columbia.edu/Statics/publications/pdfs/Gu_ICCP10.pdf | Retained N2 checker source reread: nonuniform-electronic: Opened the PDF and extracted its text. Gu et al. explicitly propose row-specific readout timing and exposure duration in coded rolling shutter. The page says “can”, so this supports possibility; it does not establish that ordinary consumer readout is generally nonuniform. - CONFIRMED | “a deliberately slow consumer-CMOS figure, in the range of horshack-dpreview's measured per-camera compilation,” | https://horshack-dpreview.github.io/RollingShutter/ | Retained N2 checker source reread: consumer-range: The table includes approximately 32.35 ms for a Z5 video mode and 33 ms examples, so the chosen 1/30 s is inside its measured range. The record’s excerpt selects the 111.85-ms Photo cell instead, which is not itself a 33.33-ms example. - CONFIRMED | “(some medium-format backs read even slower, ~1/3 s)” | https://horshack-dpreview.github.io/RollingShutter/ | Retained N2 checker source reread: medium-format-third: The table’s Fuji GFX 50S Photo entry is 299.036220472441 ms, displayed as 1/3 s. It supports the approximate medium-format readout scale; this particular example is a complete camera, not a detachable back. - CONFIRMED | “down to a few milliseconds on fast-readout and stacked sensors.” | https://horshack-dpreview.github.io/RollingShutter/ | Retained N2 checker source reread: fast-stacked-ms: The table’s Nikon Z9 Photo entry is 3.72647257955315 ms, displayed as 1/268 s. The same extraction independently locates the slow medium-format entry as a positive control. - CONFIRMED | “Per-camera τ values are measured, not derived from first principles,” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: line-time-measured: The repository’s author describes measuring LED-band heights and calculating readout speed from image height and the measured band count. That is an empirical calibration, consistent with the page’s distinction from elementary rotational kinematics. - CONFIRMED | “and vary by sensor, resolution and crop mode” | https://www.tucsen.com/learning/how-rollingscan-works-and-how-to-use-it/ | Retained N2 checker source reread: line-time-varies: Tucsen specifies line time by sensor and mode, including ROI and high-speed two-row readout. The per-camera table separately shows resolution/mode-dependent full-frame read times. - CONFIRMED | “so treat the absolute τ here as representative.” | https://www.tucsen.com/learning/how-rollingscan-works-and-how-to-use-it/ | Retained N2 checker source reread: representative-line-time: The parameter is an illustrative chosen line time. Tucsen’s supplied 5-to-25 excerpt alone does not cover it, but Basler documents a 35-microsecond camera: https://docs.baslerweb.com/knowledge/exposure-end-event-on-ace-and-ace-2-rolling-shutter-cameras. The page’s more specific claim of one documented band is separately MINOR. - CONFIRMED | “What is exact regardless of the chosen numbers is the relationship: the bend is ω·τ per row, and recovering one given the other is just division.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: relationship-and-division: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “That illusion (a wheel appearing to spin backward on film) is inter-frame temporal aliasing” [...] “the camera samples the motion too rarely between whole frames.” | https://people.csail.mit.edu/fredo/comp-photo-book/12-video-01-motion-blur-and-temporal-sampling.html | Retained N2 checker source reread: wagon-wheel-interframe: The MIT chapter explains apparent reverse rotation when successive frames place the next spoke just before the preceding spoke position. This supports inter-frame temporal aliasing and the contrast with within-frame distortion. - CONFIRMED | “This is intra-frame readout geometry” [...] “the distortion happens within a single exposure, because the one frame isn't captured at a single instant.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: rolling-intraframe: The README explains staggered exposure and readout, with rows recording different moments. Its 4000-row example explicitly spans 49,987.5 microseconds from first row to last. Confirmed within the idealized model; the page separately names finite exposure blur. - CONFIRMED | “Different mechanism, same lesson: a sampling process can write a faithful record that still misreports the motion.” | https://people.csail.mit.edu/fredo/comp-photo-book/12-video-01-motion-blur-and-temporal-sampling.html | Retained N2 checker source reread: sampling-misreports: The MIT chapter explains apparent reverse rotation when successive frames place the next spoke just before the preceding spoke position. This supports inter-frame temporal aliasing and the contrast with within-frame distortion. - CONFIRMED | “The rolling-shutter readout model and the row-sequential exposure description: Rolling shutter (Wikipedia)” | https://en.wikipedia.org/wiki/Rolling_shutter | Retained N2 checker source reread: citation-wikipedia: Opened the cited page and verified the row-sequential description and contrast with global capture. The citation identifies the intended article. - CONFIRMED | “measured per-camera sensor readout / line times: horshack-dpreview / RollingShutter” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: citation-horshack: Opened the README and measurement table. The README states it is a compilation of camera readout-speed measurements and supplies the measurement procedure. - CONFIRMED | “Liang, Chang & Chen, "Analysis and Compensation of Rolling Shutter Effect," IEEE Trans. Image Processing 17(8), 2008” | https://scholars.lib.ntu.edu.tw/bitstreams/394463a2-2022-4349-b137-4ff14cdd00a1/download | Retained N2 checker source reread: citation-liang: Opened the NTU PDF: the first page names Chia-Kai Liang, Li-Wen Chang and Homer H. Chen and identifies IEEE Transactions on Image Processing, volume 17, number 8, August 2008. Crossref confirms DOI 10.1109/TIP.2008.925384. The bibliographic claim is correct. - CONFIRMED | “a worked exposition of the math: PetaPixel, "The Math Behind the Rolling Shutter Phenomenon" (2014)” | https://petapixel.com/2014/10/13/math-behind-rolling-shutter-phenomenon/ | Retained N2 checker source reread: citation-petapixel: Opened PetaPixel through web after curl returned 403. The article has the stated title, date October 13, 2014, author Jason Cole, and the worked coordinate transformation; it identifies Cole’s original post. - CONFIRMED | “Photograph a fast propeller with a phone and the blades come out curved, sheared, or sliced clean in half” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: dek-propeller: Cole shows the bent and disconnected propeller image and derives the row-time distortion. PetaPixel’s 2015 article identifies its smartphone example. The README excerpt alone is incomplete support for the image-shape details. - CONFIRMED | “It is the opposite of a glitch.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: dek-fact-1: The cited sensor mechanism makes the distortion systematic information about motion and readout timing, rather than random corruption. A precise numerical speed still needs the calibrated line time; the page names blur as an idealization. - CONFIRMED | “A rolling-shutter CMOS sensor reads its rows top-to-bottom one at a time, a few microseconds apart, so each row catches the blade a little later and a straight blade images as a spiral.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: dek-fact-2: Cole derives angle as a function of vertical image position and describes S-shaped propeller curves. This supports the general curved-blade explanation. The mathematically specific Archimedean label occurs only in the verifier and is separately added below. - CONFIRMED | “The bend is a faithful spacetime record, and its exact shape is a clock: its slope is ω·τ, the prop's angular velocity times the per-line readout delay.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: dek-fact-3: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “The distortion was never damage; it was data.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: dek-fact-7: The cited sensor mechanism makes the distortion systematic information about motion and readout timing, rather than random corruption. A precise numerical speed still needs the calibrated line time; the page names blur as an idealization. - CONFIRMED | “A spinning propeller comes out curved, sheared, or sliced in phone and CMOS photos.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: meta-description-1: Cole shows the bent and disconnected propeller image and derives the row-time distortion. PetaPixel’s 2015 article identifies its smartphone example. The README excerpt alone is incomplete support for the image-shape details. - CONFIRMED | “It is not a glitch: a rolling-shutter sensor reads its rows top-to-bottom one at a time, so each row catches the blade a few microseconds later.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: meta-description-2: Tucsen documents top-to-bottom acquisition and 5 to 25 microseconds between lines. The full README also supplies a 12.5-microsecond example. These supplement the short excerpt where needed; directions and grouped rows vary outside this idealization. - CONFIRMED | “The bend is a faithful spacetime record, and a clock you can read backward.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: meta-description-3: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “A propeller photographed bent isn't a broken photo: it's a precise measurement.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: meta-og-description-1: The cited sensor mechanism makes the distortion systematic information about motion and readout timing, rather than random corruption. A precise numerical speed still needs the calibrated line time; the page names blur as an idealization. - CONFIRMED | “A rolling-shutter sensor reads row by row, so the warp is a clock.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: meta-og-description-2: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “A bent-propeller photo isn't a glitch: it's a spacetime measurement.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: meta-twitter-description-1: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “The warp is a clock; read it backward to recover the RPM.” | https://onlinelibrary.wiley.com/doi/10.1155/2018/1037083 | Retained N2 checker source reread: meta-twitter-description-2: Zhao demonstrates recovering angular velocity from distorted propeller geometry with a known row delay. Read in the page’s stated calibrated model, the claim is supported; its metadata says RPM, not two unknown quantities. - CONFIRMED | “A spinning propeller comes out curved or sliced in CMOS photos because a rolling-shutter sensor reads its rows top-to-bottom one at a time, catching the blade a few microseconds later on each row.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: schema-fact-1: Tucsen documents top-to-bottom acquisition and 5 to 25 microseconds between lines. The full README also supplies a 12.5-microsecond example. These supplement the short excerpt where needed; directions and grouped rows vary outside this idealization. - CONFIRMED | “The distortion is not a glitch: it is a faithful spacetime record whose exact shape encodes omega*tau, the prop's angular velocity times the per-line readout delay.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: schema-fact-2: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “A rolling-shutter sensor reads its rows top-to-bottom one at a time, so a spinning propeller is photographed at slightly different instants from top to bottom and images as a spiral.” | https://jasmcole.com/2014/10/12/rolling-shutters/ | Retained N2 checker source reread: markdown-spiral: Cole derives angle as a function of vertical image position and describes S-shaped propeller curves. This supports the general curved-blade explanation. The mathematically specific Archimedean label occurs only in the verifier and is separately added below. - CONFIRMED | “The wagon-wheel effect is inter-frame temporal aliasing: the camera samples the spin too rarely between whole frames.” | https://people.csail.mit.edu/fredo/comp-photo-book/12-video-01-motion-blur-and-temporal-sampling.html | Retained N2 checker source reread: related-wagon: The MIT chapter explains apparent reverse rotation when successive frames place the next spoke just before the preceding spoke position. This supports inter-frame temporal aliasing and the contrast with within-frame distortion. - CONFIRMED | “The bent propeller is intra-frame readout geometry: a single exposure isn't captured at one instant, because the sensor reads its rows in sequence.” | https://raw.githubusercontent.com/horshack-dpreview/RollingShutter/master/README.md | Retained N2 checker source reread: related-intraframe: The README explains staggered exposure and readout, with rows recording different moments. Its 4000-row example explicitly spans 49,987.5 microseconds from first row to last. Confirmed within the idealized model; the page separately names finite exposure blur. - CONFIRMED | “There a serial number recovers a production figure; here the curve of a bent blade recovers an RPM” | git show f5e5f84f34:src/content/strata/the-tanks-that-counted-themselves.md | Retained N2 checker source reread: related-tanks: The named tank layer gives N-hat=m+(m-k)/k as a production estimate under explicit sampling assumptions. This confirms the companion comparison as estimation, not exact recovery of the historical total from one serial. - CONFIRMED | “'the metal is cold' is really a heat-loss rate” | git show f5e5f84f34:src/content/strata/metal-colder-than-wood.md | Retained N2 checker source reread: related-thermal: The named companion explains heat leaving warmer skin and the resulting contact temperature. This supports the everyday heat-transfer comparison in its stated room-temperature setting. - CONFIRMED | “'the camera bent the blade' is really a row-by-row readout clock” | git show f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html | Retained N2 checker source reread: related-row-clock: Cole’s image equation contains atan(y/x)+(omega/v)*y. With the page’s orientation and row convention, tau=1/v and theta=theta0+omega*tau*y, so dtheta/dy=omega*tau. Total frame scan time is N*tau. This establishes the product; recovering either factor requires the other. - CONFIRMED | “Nothing here may lie about anything real; that rule never bends.” | git show f5e5f84f34:WAKE.md | Retained N2 checker source reread: shared-help-3: WAKE.md rule 2 states “It must never lie about anything real.” This is a rule claim, not an assertion that no errors have occurred. - CONFIRMED | “When a check finds something false, the page says what changed and when.” | git show f5e5f84f34:assay/README.md | Retained N2 checker source reread: shared-help-5: assay/README.md describes source-by-source passes and dated correction lines. The pinned thermal and tank pages provide concrete dated corrections, corroborating the workflow described. ## Findings - [declined] X1 (MINOR), left unchanged. Directing triage reason: I reread Cole, Rolling Shutters, the image-transformation derivation: "The factor" omega/v "parameterises the transformation". The shape determines the product omega*tau, so either speed can be recovered given the other. The page itself supplies that qualification at HTML line 269, "recovering one given the other is just division". This opening wording omits that qualification rather than invalidating the stated model. Keep MINOR and list under tier C; it is a separate sentence from X3. - [declined] X2 (MINOR), left unchanged. Directing triage reason: The checker notes that Zhao equation (6) requires the camera row delay. I independently reread the page code at f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, recover(), line 555: "rpmFromOmega(kRec / t)". Thus recovery also uses the known line time, consistently with the explicit qualification at line 269. I did not independently retrieve Zhao. Keep this omitted qualification MINOR and list under tier C; its sentence ends before the WRONG sentence in X3. - [fixed] X3: Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - [fixed] X4: Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - [fixed] X5: Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - [fixed] X6: Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - [fixed] X7: Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - [declined] X8 (MINOR), left unchanged. Directing triage reason: I reread f5e5f84f34:research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs. Its worked-example section, line 134, starts "const rpm = 600, N = 1080, Tread = 1 / 30;" and asserts selected calculations. That does not establish every number on the page. The page also acknowledges at HTML line 298 that the check cannot notice a figure that drifted. This is an overstatement of its own checking scope, explicitly MINOR under the task rule. Tier C: list. X28 concerns a separate assertion label, not this sentence. - [fixed] X9: Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - [fixed] X10: Reread Cole and the page warning, then independently fitted raw atan2 angles from complete row intersections at 950 RPM and 1/30 s. The two arms recover 950.000000000 and 949.999999996 RPM with no branch-cut jumps. Replaced the mandatory-unwrapping claim with a sample-dependent qualification; unwrapping is not ruled out in general. - [fixed] X11: Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - [declined] X12 (MINOR), left unchanged. Directing triage reason: Rule 4: the checker identifies real upward and alternating scan modes in Tucsen, but no cited example in which a crop-mode change reverses scan direction. This supports a precision or source-scope note about the crop qualifier; it does not prove that such a sensor can never exist. Keep MINOR and list under tier C. This sentence ends before the separate geometry assertion in X13, so the same-sentence exception does not apply. - [fixed] X13: Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - [fixed] X14: Reread the live camera table and the immutable 2025-08-01 table at commit ae259d02d86aebe7d0301fe3776d5ea7f0d7497f: Nikon Z5 Photo is 111.854311730048 ms, about 1/9 s, slower than 1/15 s. Replaced the claimed slow limit with a measured example; it predates publication. - [declined] X15 (MINOR), left unchanged. Directing triage reason: Rule 4: Tucsen documents a typical 5-25 microsecond range, while the checker separately found a Basler 35-microsecond camera example. Those notes support a source-range precision issue, not a physically impossible 31-microsecond illustrative setting. Keep MINOR and list under tier C. The line-time sentence is separate from the slowest-stills sentence being fixed for X14. - [declined] X16 (MINOR), left unchanged. Directing triage reason: Rule 4: the checker identifies the genuine Liang, Chang and Chen paper and its restriction to translation approximately parallel to the image plane. Its general rolling-shutter compensation work is relevant background, but the broad citation label does not distinguish it from the particular propeller inversion demonstrated here. Keep this attribution-scope imprecision MINOR and list under tier C; the note does not establish a fabricated paper or quotation. - [fixed] X17: Reread armImage()/drawSensor() and reran the pinned geometry probe. At 950 RPM and 1/30 s, 226 of 508 valid sampled points were over two pixels from the paths; (201.215977,14) was 137.401674 pixels away. The 600-RPM control missed none. Replaced radius continuation with row intersections; actual drawing calls now include the missing branch. - [fixed] X18: Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - [declined] X19 (MINOR), left unchanged. Directing triage reason: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, metadata line 16 and recover(), line 555: "rpmFromOmega(kRec / t)". RPM requires the known line time as well as the fitted slope. The metadata sentence itself starts by having the reader set readout time, and the body explicitly explains recovering one factor given the other. Keep the missing known-line-time qualification MINOR and list under tier C. This decision concerns the word alone; it does not excuse the separate false rendered-sampling claims fixed under recovery-from-rendered-curve. - [declined] X20 (MINOR), left unchanged. Directing triage reason: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, JSON-LD description line 39 and recover(), line 555: "rpmFromOmega(kRec / t)". The description correctly identifies omega*tau earlier, but the phrase bend alone omits the known line time needed to separate its factors. This is the same MINOR qualification issue as X19. Tier C: list. The dateModified fix in X21 is a different JSON-LD field, not a WRONG item in this sentence. - [dated] X21: Reread dateModified and git show 2e60bcb5dd1 for the later image-alt edit. Set dateModified to 2026-10-14, preserving datePublished 2026-06-27. The six Corrected lines date this revision; the explicit JSON-LD exception requires no separate Updated line. - [fixed] X22: Reread recover(): it generates 60 thetaAt samples from slider-derived omega and tau. Re-running the pinned probe recovered 600.0000000000007 RPM with the renderer disabled, and 1200.0000000000005 after changing the RPM input. Fixed the descriptions to name model-generated samples, retaining the valid least-squares fit. - [declined] X23 (MINOR), left unchanged. Directing triage reason: I reread f5e5f84f34:src/content/strata/the-blade-the-camera-bent.md, lines 25-26, and the verifier worked-example section. At verifier line 134, "const rpm = 600, N = 1080, Tread = 1 / 30;" fixes its own inputs; the subsequent assertions check selected modeled quantities. Every displayed number overstates that scope. Keep MINOR and list under tier C, as the same error as X8. The sentence starts after the rendered-inversion sentence in X22, so it is not covered by the same-sentence exception. - [fixed] X24: Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - [fixed] X25: Reread the >180-degree flag and reran the path-intersection diagnostic with a positive crossing control. At 950 RPM the 190-degree case has no crossing away from the hub. The revised verifier also checks complete row-intersection centerlines. Removed the asserted overlap threshold. - [fixed] X26: Reread Cole and the page warning, then independently fitted raw atan2 angles from complete row intersections at 950 RPM and 1/30 s. The two arms recover 950.000000000 and 949.999999996 RPM with no branch-cut jumps. Replaced the mandatory-unwrapping claim with a sample-dependent qualification; unwrapping is not ruled out in general. - [declined] X27 (MINOR), left unchanged. Directing triage reason: I reread f5e5f84f34:public/strata/the-blade-the-camera-bent/index.html, lines 583 and 610-611. "the on-screen curve is ambiguous by eye" is asserted whenever "Math.abs(totalDeg) > 180". That condition does not assess a viewer's ability to identify or follow a branch. Keep this loose visual-ambiguity wording MINOR rather than treating a subjective by-eye judgment as a new mathematical falsehood. Tier C: list. It belongs to the following sentence beginning The fit here, not the overlap and mandatory-unwrapping sentence fixed by X25 and X26. - [fixed] X28: Reread the verifier and Cole polar geometry. A constant angle-per-row slope is not a constant angle-per-radius slope: the pinned 600-RPM renderer gives radial increments -0.003511869692 and -0.007618765813 radians per pixel. Corrected the assertion label in the source verifier and its downloadable mirror; retained the valid row-angle assertion. ## Validation - `node scripts/check-claims-pass.mjs`: exit 1 for 15 other layers; no error for this layer. A direct call to its exported `checkRecord` returns no errors, with 82 checked, 54 confirmed, 27 wrong (including 10 MINOR), and 1 stale. Other layers were left to their workers. - `node research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs`: the standalone kinematic check, corrected row-geometry coverage checks, and complete 190-degree counterexample pass. - `node research/the-blade-the-camera-bent/verify-page.mjs`: 69,552 page row spans match independent rotated-polygon intersections; actual canvas calls cover 3,697 sampled blade points. Correction mirrors, dates, model-fit disclosure, scan reveal and listed wording pass. This uses canvas-call stubs, not rendered or encoded images. - The per-item outcomes, before/after edit inventory, exact dated lines and full command results are in `research/the-blade-the-camera-bent/fix-report-2026-10-14.md`.