-
Notifications
You must be signed in to change notification settings - Fork 13
Troubleshooting FAQ
The server couldn't resolve the career-ops root. Resolution order: CAREER_OPS_ROOT env → .. → cwd(); the first candidate containing cv.md or portals.yml wins. Fixes:
- Make sure the UI lives at
career-ops/web-ui/(the nested layout), or - Set
CAREER_OPS_ROOT=/path/to/career-opsbeforenpm start. - Check
#/health— it names exactly which checks fail.
Parent-relay endpoints (/api/followup, /api/stats/patterns, /api/stats/lifetime, /api/stats/salary-gap) are fail-soft: without the parent scripts they return {available:false, reason:'script-not-found'} with HTTP 200 and the UI shows an honest "not available" note — that's by design, not an error. An empty tracker likewise surfaces as {available:true, empty:true} ("nothing yet"), not as a script error (fixed in v1.117.2).
Nothing breaks: every ⚡ live endpoint (/api/evaluate, /api/deep, /api/mode/:slug, drafts, generators) falls back to {mode:'manual', prompt} — a ready-to-paste prompt for your AI CLI. Set any one provider key in #/config (or npx career-ops-ui init) to go live. GET /api/status/providers shows what the router would pick.
GET /api/stream/pdf spawns the parent's generate-pdf.mjs, which needs Playwright in the parent's node_modules (plus its headless browser shell: npx playwright install). The Health page has a setup hint for this. career-ops-ui doctor verifies it.
Another instance (or another app) holds 127.0.0.1:4317. Stop it or set PORT=<other> when starting. Tests never assume 4317 — they bind port 0.
-
Check
portals.yml: ATS sources walktracked_companies:— no companies, no results. RU sources read therussian_portals:block (sources,queries,area,per_page,only_remote). -
Title filter: the parent's
title_filter.positivekeywords must match your target roles — overly narrow filters silently drop everything. -
Quarantine & dedup: results already seen are deduped against
data/scan-history.tsv; suspicious postings are quarantine-filtered. Run withdryRun=1and watch the SSE log lines to see what got filtered and why. - hh.ru from outside Russia: hh.ru is scraped from its HTML search (the JSON API 403s programmatic clients) and may geo-block; see help §7.
-
Workday: some tenants fall back — check
workdayFallbackinGET /api/scan-results.
Hard-reload — scripts are served as-is from public/ with no build hashes.
The traps that each cost a release:
-
[hidden]is a no-op against an authordisplay:rule. Author CSS beats the UA[hidden]{display:none}. If a component class setsdisplay: flex/grid, add an explicit.selector[hidden]{display:none}override — or toggle a class instead. -
npm test 2>&1 | grep …masks the exit code. grep returns 0 on match even when the suite failed — two releases shipped failing tests this way. Run the suite first, capture$?, grep separately. Same forgit commit … | tailhiding hook failures. -
cleanLlmMarkdownis NOT an XSS sanitizer. The XSS boundary isUI.md()(client) andstripDangerousMarkdown()(CV ingress). Mixing the declutter step into either is a category error. -
Pre-commit AI review is advisory;
ci.ymlis the hard gate. Green pre-commit + red CI is possible. Watch the CI run. -
PATHSresolves once per process. Tests bootstrapping their ownCAREER_OPS_ROOTmust dynamic-import()every paths.mjs carrier insidebefore()— a top-level static import pins the real parent and leaks writes into the user's live files. -
UI.toast()parses its own(METHOD /path · HTTP NNN)postfix — don't pre-strip it at the call site; the notifications drawer is the only place that re-surfaces toasts (useUI.toast, not ad-hocconsole.log). -
Grep treats emoji-heavy JS as binary — an empty grep over locale dicts may be a false negative; use
grep -aorrg. - CodeQL rate-limiting/FS-write findings on new shell-out routes are known categorical false positives — dismiss with the documented rationale (the custom middleware isn't credited), and still add real hardening where it belongs.
Is this the official career-ops UI? No — it's an unofficial companion, not affiliated with or endorsed by career-ops/santifer. It tracks the parent with parity releases.
Does it send my data anywhere? Only where you point it: provider API calls when you enable ⚡ live features, and public job-board APIs during scans. No telemetry, no cloud accounts, no auto-submit. Logos and model catalogues are proxied server-side so the browser only ever talks to 'self'.
Can it apply to jobs for me? No. It drafts, evaluates, fills, and tracks — the final Submit is always yours (parent's ethical-use rule).
Can I expose it on my LAN? It's designed for loopback. If you bind HOST=0.0.0.0, rate limiting activates and health output is redacted, but there is no authentication layer — treat public exposure as at-your-own-risk. See Security.
Where do I report bugs? The in-app bug reporter (notifications drawer) builds a privacy-floored, pre-filled GitHub issue — or file one directly at https://github.com/Fighter90/career-ops-ui/issues.
career-ops-ui v1.209.0 · Repository · Releases · Issues
Guides
Reference
Development
Languages (Home)