Last updated: 2026-04-06 (v2.7.2)
Scrutinizer is a Restricted Focus Viewer that replaces Gaussian blur with a biologically-grounded peripheral pipeline. The architecture table shows what each pipeline stage implements and where it comes from:
| Biology | Computation | Source | Since |
|---|---|---|---|
| Oculomotor | Velocity, fixation, saccade detection | — | v1.0 |
| Retinal GC | 12-band DoG via hardware MIP chain | Kuffler 1953, Rodieck 1965 | v1.5 |
| LGN gating | Structure + saliency gate | McAlonan et al. 2008 | v1.6 |
| V1 crowding | Density-gated noise displacement | Pelli 2008 | v1.9 |
| Chromatic decay | Per-channel castleCSF attenuation (Oklab) | Ashraf et al. 2024, Bowers et al. 2025 | v2.0 |
| Oblique effect | Oriented DoG band attenuation | Appelle 1972, Furmanski & Engel 2000 | v2.2 |
| V1/V2 texture | Oriented noise synthesis (WebGPU compute) | Freeman & Simoncelli 2011 | v2.3 |
| Clutter | Feature Congestion scoring | Rosenholtz et al. 2007 | v1.8 |
| CMF geometry | Isotropic cortical sectors (FOVI) | Blauch, Alvarez & Konkle 2026 | v2.6 |
| Reading span | Asymmetric foveal envelope | Rayner 1998 | v2.4 |
| Saliency | Oklab DoG + face detection + DOM structure | Itti et al. 2001 | v1.7 |
| Acuity-gated saliency | Resolution-dependent protection decay | Strasburger et al. 2011 | v2.7 |
| Eccentricity congestion | Two-scale Feature Congestion (foveal + peripheral) | Rosenholtz 2007, Pelli & Tillman 2008 | v2.7 |
| Pyramid synthesis | Laplacian pyramid + cross-scale correlations (Tier 2.75) | Portilla & Simoncelli 2000, Walton 2021 | v2.7 |
| V4 decouple | Eccentricity-direct V4 effects, independent of V1 displacement | Mullen 1991, Curcio 1990 | v2.7.1 |
The full pipeline preserves salient content up to 10× better than eccentricity-matched Gaussian blur (the model used by BubbleView, ViewSer, ScreenMasker, and mouseview.js). The 3× baseline advantage comes from the DoG band architecture; the additional 5–8× comes from saliency gating.
Active design documents in docs/specs/. Completed specs are in docs/specs/implemented/.
| Spec | Status |
|---|---|
| isotropic_cortical_sampling.md | Shipped (v2.6) |
| oriented_dog_bands.md | Shipped (v2.2) |
| ratio_reconstruction.md | Shipped (v2.3) |
| option_a_decouple_spec.md | Shipped (v2.7.1) — V4 decoupled from V1 |
| mongrel_textures.md | Tier 2.5 shipped (v2.3); Tier 3 unblocked by Option A |
| oblique_effect_validation.md | Validation in progress |
| gaussian_blur_comparison.md | Shipped (v2.1) |
| wave6_coco_periph_validation.md | Scaffolding (v2.4) |
| linguistic_priming.md | Planned — information scent via goal embeddings |
| metamer_mode.md | Planned — summary-statistic pooling |
| scanpath-replay-spec.md | Planned — replay recorded mouse/gaze data |
| human_subjects_data_collection.md | Planned |
| brown_dataflow_integration.md | Reference — Brown et al. 2023 dataflow architecture |
| halverson_hornof_validation.md | In progress |
| continuous_chromatic_mip.md | In progress |
Completed / shipped specs
| Spec | Shipped |
|---|---|
| implemented/chromatic_pooling.md | v1.9, updated v2.0 |
| density_gated_crowding.md | v1.9.1 |
| cmf_mip_derivation.md | v1.8 |
| blueprint_mods.md | v2.0 |
| isotropic_cortical_sampling.md | v2.6 |
Full texture-statistics pooling (Tier 3). The WebGPU compute path synthesizes oriented noise but not full summary statistics per Rosenholtz 2012. Covariance computation within isotropic sectors is feasible on WebGPU but not yet implemented. This is the gap between "preserves luminance variance" and "perceptually indistinguishable from originals in the periphery."
Suprathreshold correction across channels. The power-law exponent (0.5) from Jiang et al. 2022 was measured for luminance. Applied to chromatic channels without evidence the same exponent holds. The parafovea (2–8°) is where most UI interaction happens — over-desaturating it is the highest-cost error the model can make. Eccentricity-dependent exponents or channel-specific fits to Bowers 2025 data are the likely fix.
Visual memory mask gradient. The memory mask uses a 3-stop radial gradient (1.0→0.5→0.0) with a hard memoryStrength > 0.7 bypass threshold in the shader. This creates visible circular splotches at recalled fixation locations — the boundary between "clear original" and "pipeline processed" is too abrupt. Fix: soften the gradient tail and lower the bypass threshold, or replace the binary bypass with a smooth blend across the full memoryStrength range.
Spacing-dependent crowding. Current V1 stage modulates distortion strength by density, not spacing by flanker distance. Bouma's rule predicts critical spacing as ~0.5× eccentricity. Requires a pooling-region pass that the single-pass fragment shader cannot express.
Gaze-cursor coordination as cognitive signal. Recent work (Stone & Chapman 2023, Zhu et al. 2023) shows that the relationship between gaze and cursor carries richer signal than either alone — coordination breakdown indicates UX friction, cross-modal fusion improves activity classification by 7.4%. Eye-tracker integration via the gaze-input branch point would let Scrutinizer capture this coordination signal alongside the peripheral rendering.
Scanpath replay. Replay recorded mouse or gaze data through the pipeline for offline analysis. mouseview.js records position data but has no replay capability. Spec: scanpath-replay-spec.md.
Experiment framework integration. mouseview.js (Anwyl-Irvine et al. 2021) demonstrated that cursor-directed apertures integrate with jsPsych, PsychoJS, and Gorilla for web-based experiments. Scrutinizer's richer peripheral model could serve the same role — a jsPsych plugin would let researchers compare biologically-grounded filtering against Gaussian blur within standard experiment frameworks.
Semantic guidance (information scent). Top-down attentional control via goal embeddings. User specifies intent, DOM text nodes are embedded via Transformers.js, cosine similarity scores flow into the saliency texture. No shader changes — enters through existing LGN saliency gate. Spec: linguistic_priming.md.
Cognitive architecture integration. The saliency branch point accepts any bitmap as attentional input, making Scrutinizer a rendering front-end for cognitive models such as SNIF-ACT (Fu & Pirolli 2007) and ACT-R's vision module (Salvucci 2001).
scrutinizer-audit CLI. Headless Feature Congestion scoring via Puppeteer — batch-score URLs, sitemap crawling, CI integration (--fail-above threshold). Shipped in v1.9 (cli/scrutinizer-audit.js). Planned: integrate isotropic sampling metrics, OCR readability scores, and saliency protection ratios into the audit output.
MCP server. The audit tool exposes an MCP server for Claude Code integration — score pages during design review sessions without launching the Electron renderer. Shipped v1.9.
Cross-platform builds. macOS signed. electron-builder for Windows (.exe) and Linux (.AppImage) not yet configured. Auto-update via electron-updater planned.
Calibrated visual angles. Separate physical calibration (px_per_deg from blind spot method) from comfort zone (foveaRadius from user preference). v2.4 added foveal radius presets; the calibration separation is not yet implemented.
Saliency resolution upgrade. Bottom-up saliency worker at 256px cannot resolve UI elements <60px. Face detection at 640px is the dominant signal. Options: higher worker resolution, dedicated small-element detector, or multi-resolution pass.
Distribution. macOS signed. Cross-platform builds (Windows, Linux), notarization, and auto-update not yet implemented.
- Fix visual memory silently activating on launch when set to Off (
0 || 20falsy bug)
- Unified eccentricity master curve: 6 overlapping smoothsteps → 1 C2-continuous curve + power functions, eliminating Mach bands in parafoveal color transitions
- Luma/chroma split foveal blend (Mullen 1991): progressive chromatic decay visible on uniform surfaces
- Rod desaturation deferred to far periphery when castleCSF active (t³ onset)
- Visual memory: parafoveal radius (2.5× fovea) for recalled fixation footprint
- Visual memory: V4 color effect suppression in remembered regions (memoryStrength → processV4)
- Comfort Mode: +1° clear zone via shader distance offset (microsaccade envelope)
- Scanpath replay: ScanpathPlayer (GazeModel drop-in), COCO-Search18 importer, CLI replay + visualization
- Gazeplot mode: visual memory accumulation across fixation sequence
- FOVI-derived isotropic sector geometry as default for all modes
- Jacobian-corrected LOD selection (textureGrad with distorted UV derivatives)
- 19-test geometry validation suite
- OCR readability validation (Tesseract)
- All BibTeX entries audited and corrected; DOIs added
- arXiv draft updated (new Section 4.6, RFV framing)
- Reading span: asymmetric foveal envelope during reading (Rayner 1998)
- Fovea degree correction: fovea_deg 2.0→1.0, default radius 90→45px
- Saccadic blindness default ON
- Wave 6 COCO-Periph validation scaffolding
- Citation export metadata fields
- Tier 2.5 mongrel pipeline: tile-based Oklab statistics + oriented noise synthesis
- Two WGSL compute passes (~900 LOC), under 0.3ms on integrated GPU
- Auto-fallback safety harness
- Ratio reconstruction: dual-LOD structure map sampling
- Soft density gate
- 12 half-octave DoG bands
- Five-wave psychophysical validation
- Gaussian blur comparison — 5–10× saliency preservation advantage
- 15 open-source HTML stimulus pages
- Minecraft Mode, Blueprint Mode
- Density-gated crowding
- Chromatic decay recalibration (castleCSF)
- DoG band decomposition via hardware MIP chain
- Feature Congestion scoring (ρ=0.93 vs MATLAB)
- Face detection saliency, DOM structure extraction, LGN gating
- Oklab color space, WebGL 2.0 upgrade
- 10 pipeline modes in declarative JSON registry