jlegal.pro Site Review — June 6, 2026

Reviewed by: 6 AI agents (2 pro, 2 con, 2 judges) Methodology: Two agents assessed strengths and opportunities. Two assessed weaknesses, risks, and technical problems. Two weighed the findings and ranked recommendations by impact, effort, and risk.


What the Site Does Well

Three-track color system (story.html) — Red, teal, and gold map Building, Assault, and Family to distinct visual channels. The hover highlighting across all three track columns lets a reader see simultaneity without being told about it. This is the single strongest information-design choice on the site.

Hinge-Date Matrix (story.html, section 8) — Forces the reader to look across rows and see that Feb 28, Apr 15, May 6, and May 10 each have entries in multiple columns. The convergence becomes self-evident from the data layout alone.

Meta tags and Open Graph — Every page has unique og:title, og:description, og:image, and twitter:card. Link previews on social media and search results render correctly and distinctly per page.

Alt text on all evidence photos — All 42 images in evidence-photos.html have specific, descriptive alt text (e.g., “FSK tape on AC exhaust hose at 113 degrees F, FLIR infrared”). Zero empty alt attributes.

Accessibility scaffolding — Skip links, aria-label, aria-hidden, aria-expanded, prefers-reduced-motion support, and focus-visible outlines appear across all pages. Unusually thorough for a hand-built static site.

Live countdown bar — Displaced days and trial countdown create urgency without editorializing. It is a clock, not a claim.

AI discoverability — robots.txt explicitly allows GPTBot, ClaudeBot, PerplexityBot. Companion llms.txt and agents.md files are referenced. Forward-thinking for search and AI indexing.

Lazy loading and print classes — Images use loading=”lazy” throughout. Print-specific CSS hides navigation and forces page breaks.


1. Self-host the Bob Faith headshot

2. Add JSON-LD structured data to index.html

3. Fix multiple <h1> tags on index.html

4. Add rel="canonical" to subpages

5. Pin CDN versions and add SRI hashes to external scripts

6. Add video poster frames to evidence-photos.html

7. Add prev/next navigation between narrative pages

8. Add print/PDF styles for the main report

10. Fix WCAG contrast on bad-faith-bob.html hashtags


Extract shared CSS/JS into external files — Correct observation. index.html has 400+ lines of inline CSS duplicated across 20 pages. High-leverage long term, but medium effort, touches every file, and risks breaking the two nav systems. Save for a dedicated refactoring session.

Unify the two navigation systems — index.html uses a navy sticky nav-bar with dropdown; the other pages use a green jl-nav system. Two different nav experiences is jarring. But unifying them is medium effort with medium breakage risk. Worth doing, but not in a quick pass.

Build a structured evidence index — A single page listing every cited document (date, type, source, where referenced) would be valuable. But it requires auditing every citation across 7,650 lines. Medium effort. Better done as a standalone project.

L&I deadline math — One reviewer flagged that 20 business days from May 1 might be approximately May 29, not June 1. The site text specifies Memorial Day excluded and filing day not counted. Worth double-checking the exact count to ensure the “past its own deadline” framing is airtight.

SEO satellite domain links on bad-faith-bob.html — Links to bob-faith-greystar-ceo.com, bobfaith-greystar.com, greystar-bad-faith-bob.com, and greystar-rentals-hell.com at the bottom of the page. One reviewer flagged that an adversary or court could cite these as evidence of a coordinated harassment campaign rather than protected advocacy. Consider whether these links help or hurt the site’s “documented narrative” framing.

Swimlane chart mobile fallback (story.html) — The three-track swimlane chart loses its structure on mobile (lane labels and axis are display:none). A stacked-card layout preserving color coding would retain the convergence argument on phones. Medium effort.

Search function performance — The highlightText() function walks every text node in the 538KB page on each keystroke. Could freeze the UI on slow devices. A TreeWalker or requestIdleCallback optimization would help. Low priority.