Bug Fixes, Identity Systems, and Responsive Design
Morning: Applyr External ATS Validation
Ran a live validation pass against the job automation system. Selected 5 jobs from a CSV, let the workflow run, and used the results to tighten the external ATS path before treating it as stable.
Case 1: Missing External 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.
Case 2: Result Accounting
The engine needed stricter result accounting for external ATS navigation. Without checking the returned status, the failure counter could under-report what happened during a run.
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
Case 3: Redundant Navigation
The LinkedIn flow needed a cleaner handoff between apply-method detection and external application handling. detect_apply_method already navigates to the job URL to inspect the button. When apply_external navigated again without a real external URL, browser state could become unstable.
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 changes, ran it again. 3 jobs were successfully marked as external_opened, result accounting worked, and the browser session stayed stable.
Afternoon: Public Content Fact-Checking
Switched to a completely different problem: making sure public-facing content and AI responses stay grounded in verified source material.
The site has an AI layer that answers questions about projects, architecture, and the surrounding work. That needs a ground-truth path, not just a model prompt.
Built a source-grounded verification system:
The System
data/identity-ground-truth.json — A structured file with verified public facts:
- Project information: names, dates, key technologies
- Professional timeline facts appropriate for public use
- Confidence levels for claims that need review before publication
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, and slide-in animation in CosmicLayout. The admin area needed to consistently adopt that existing pattern.
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
Tooling Follow-Up
The CSS pass also exposed a tooling friction point: the formatting/lint workflow was touching uncommitted style changes during iteration. That needs a cleaner local workflow so visual fixes are not mixed with unrelated generated edits.
The Day in Numbers
- 3 external ATS edge cases 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 focused validation: small, specific workflow gaps that needed clear guards before broader use. The afternoon built infrastructure (identity ground truth) that enables confidence in the system. The evening was UX iteration that makes the platform easier to use 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.