Bug Fixes, Identity Systems, and Responsive Design
Morning: Applyr External ATS Bugs
Ran live testing of the job automation system for the first time. Selected 5 jobs from a CSV, let it run. Watched everything break in increasingly interesting ways.
Bug 1: NaN URLs
The job CSV has a job_url_direct column for external ATS links. LinkedIn jobs don't have this—the value is NaN (pandas missing value). When I converted it to string: str(float('nan')) → "nan" string. Passed that to page.goto() → Protocol error: Cannot navigate to invalid URL.
Fixed it with a guard:
job_url_direct=str(row.get('job_url_direct', '')) if pd.notna(row.get('job_url_direct')) else '',
Also added validation in the platform layer to reject "nan", "None", or empty strings.
Bug 2: Failure Counter Not Incrementing
When external ATS navigation failed, the engine always returned True without checking the result status. So failed_count stayed at 0 even with 4 failures. Made it hard to see what actually happened.
Fixed by checking the result status:
if result.status == ApplicationStatus.FAILED:
self.status.failed_count += 1
self._log_to_session(f" → FAILED (external ATS): {result.error}")
return result.status == ApplicationStatus.EXTERNAL_OPENED
Bug 3: Redundant Navigation Kills Browser
The worst one. detect_apply_method navigates to the LinkedIn job URL to check what type of apply button exists. Then apply_external tries to navigate again (since there's no external URL, it falls back to the job URL). Double navigation → ERR_ABORTED on job 1, then the browser context dies on job 2.
The real fix: override apply_external in LinkedInApplier:
- If job has a real external URL → delegate to base implementation
- If no external URL → try clicking LinkedIn's external Apply button to trigger the redirect
- If button click fails → capture evidence from the current LinkedIn page and mark
external_openedas a graceful fallback
After all three fixes, ran it again. 3 jobs, all successfully marked as external_opened, failure counter working, no browser crashes.
Afternoon: Identity and Fact-Checking
Switched to a completely different problem: making sure the site actually knows who it's talking about.
The site has an AI that answers questions. It should answer questions accurately about me—my background, my projects, my timeline. But early versions of the OpenClaw integration had hallucinations: wrong job titles, made-up certifications, scrambled timelines.
Built a ground truth identity system:
The System
data/identity-ground-truth.json — A structured file with verified facts about me:
- Real resume data: job titles, companies, dates, education, certifications
- Project information: names, dates, key technologies
- Personal facts: where I live, how long I've been building things, what technologies I actually know
- Confidence levels: some things I'm 100% sure about, some things are "probably right"
Everything not in this file gets flagged as [NEEDS CONFIRMATION] in the AI's responses.
The Verification Pipeline
When the site fact-checks content:
- Extract claims — regex patterns find assertions in articles (15 different patterns)
- Ground truth check — fast, instant, no LLM. Does the claim match verified facts?
- RAG search — query vault and site embeddings for supporting context
- LLM verification — Only for claims that ground truth couldn't resolve. Uses Groq inference.
- Probe creation — Claims that are contradicted or unverifiable become "probes" for human review
Then integrated this into the Probe Studio and Editor:
- Fact Check button on editor toolbar
- Scan selected files from Probe Studio
- Shows verdict summary: verified/contradicted/unverifiable/embellished
- Adds badges to probes showing what was verified
Evening: Responsive Admin Design
The admin sidebar has 18 core nav items + 5 group headers + footer items. Total height: ~1020px. On laptops with short viewports, items past the bottom were invisible. On mobile, the page was barely usable.
The mobile infrastructure was already there—hamburger button, backdrop, slide-in animation. Fully implemented in CosmicLayout. Nobody was using it properly though.
The Changes
AdminSidebar.astro:
- Changed
.admin-sidebarfromoverflow: hidden→overflow: visible - Made
.sidebar-navscrollable:flex: 1; overflow-y: auto; min-height: 0; - Added thin dark-theme scrollbar
Admin Dashboard:
- Header button row: added
flex-wrap: wrapon desktop - At 768px: buttons become icon-only (hide text labels), stack better on small screens
- Maintained spacing and readability
Probe Studio:
- Toolbar buttons:
flex-wrap: wrap+ gap on mobile - Buttons resize and wrap instead of overflowing
The Linter Problem
Every time I built, the linter reverted my CSS changes. It kept stripping uncommitted CSS modifications. Had to re-apply changes multiple times before committing. Eventually got them to stick, but it's a recurring friction point—something about the linter's behavior with uncommitted CSS is off.
The Day in Numbers
- 3 critical bugs found and fixed in applyr
- 15 claim extraction patterns for fact-checking
- 2 new UI pages (Probe Studio Fact Check, Editor fact verification)
- 1020px of sidebar content now scrollable on mobile
- 3 settings pages (admin nav, dashboard, general)
What's Interesting About Today
The morning was pure debugging—small, specific problems with big consequences. The afternoon built infrastructure (identity ground truth) that enables confidence in the system. The evening was UX iteration that makes the platform actually usable on phones.
Three different modes of work in one day. Debugging, architecture, and interface design. All ship at the same time.
Status: Applyr external ATS flow stable. Identity ground truth system live. Admin area responsive and mobile-friendly. All features committed and deployed.