Commit graph

507 commits

Author SHA1 Message Date
71e8eeb090 merge: feat/77-ai-wizard into freeze/rc-1
AI profile wizard full implementation: backend interview endpoints, BYOK
tier flag, chat UI, store actions (skip/keepChatting), settings CTA,
quality review fixes.

Closes: #77
2026-06-14 12:16:49 -07:00
6db1fe1546 merge: fix/ci-ruff-lint into freeze/rc-1
CI lint fixes, CVE security mitigations, sync status UI (#120),
bugbot Forgejo token fallback (#118), npm audit, mnemo compose stub.
2026-06-14 12:16:40 -07:00
b13abb1118 feat(settings): sync status UI (#120) + bugbot Forgejo token fallback (#118)
Issue #120 — sync status panel in DataView:
- Add SyncStore (web/src/stores/settings/sync.ts) to track last-sync
  timestamp, in-progress state, and error message for profile/preferences
- Extend DataView with a sync status section: last synced time, refresh
  button, error display, and per-section progress indicators

Issue #118 — bugbot Forgejo token fallback:
- scripts/feedback_api.py: try FORGEJO_BOT_TOKEN first, then fall back to
  FORGEJO_TOKEN so ops can provision a dedicated cf-bugbot account without
  breaking existing single-token installs

Add FORGEJO_BOT_TOKEN and LLM_RATE_* env var documentation to .env.example

Closes: #120
Closes: #118
2026-06-14 12:16:16 -07:00
3cdd14c345 fix(security): CVE mitigations — path traversal, SSRF, dep upgrades, npm audit
Path traversal (cloud middleware):
- Add _VALID_USER_ID_RE UUID regex; reject non-UUID user_id before
  constructing db path from CLOUD_DATA_ROOT / user_id / ...
- Non-UUID values log a warning and fall through to unauthenticated path

SSRF (test_email IMAP endpoint):
- Add _is_ssrf_host() using ipaddress + socket.gethostbyname()
- Checks resolved IP against RFC-1918, loopback, and link-local ranges
- Fails closed on DNS resolution errors (returns True = blocked)

Dependency security pins in environment.yml (transitive CVEs):
- starlette>=1.0.1 (PYSEC-2026-161), python-multipart>=0.0.27 (CVE-2026-40347),
  aiohttp>=3.14.0, tornado>=6.5.5, cryptography>=46.0.7, langsmith>=0.8.0,
  gitpython>=3.1.50, lxml>=6.1.0, idna>=3.15, markdownify>=0.14.1
- Direct dep upgrades: requests>=2.33.0, pypdf>=6.12.0, python-dotenv>=1.2.2,
  PyJWT>=2.13.0, curl_cffi>=0.15.0

npm audit (web/package-lock.json):
- Resolved 7 of 9 CVEs; 2 remaining esbuild CVEs require vite 8 upgrade
  (tracked as issue #123 — breaking change, deferred)
2026-06-14 12:16:00 -07:00
ad27467026 chore(infra): add mnemo service stub to compose.yml
Pre-existing local development addition — mnemo vector memory service
placeholder for future integration work.
2026-06-14 12:15:16 -07:00
eebfc84a80 fix(wizard): quality review fixes — store encapsulation + skip action + settings CTA
- Add keepChatting() action to aiInterview store; replace direct store.complete = false
  mutation in WizardAIView template with store.keepChatting()
- Add skip() action wrapping SKIP_SIGNAL constant; replace magic string store.send('skip')
  with store.skip()
- Fix skip button disabled condition to include || store.complete (was always enabled
  when wizard was complete, allowing spurious skip after finalize)
- Add _persist() call after user bubble append in send() so localStorage draft is
  written before the async fetch — prevents stale draft on browser refresh during
  slow LLM call
- Fix @click="store.startOver" → @click="store.startOver()" (missing parentheses)
- Add 2 tests: skip() sends SKIP_SIGNAL, keepChatting() clears complete without reset
- Remove 'ultra' from Tier type in appConfig.ts (violates no-ultra-tier policy)
- Add MyProfileView wizard callout banner with tier-aware unlock/upgrade CTAs
- Add clarifying comment on wizard route guard in router/index.ts

Closes: #77
2026-06-14 12:13:58 -07:00
cecf85de02 feat(wizard): AI interview store, WizardAIView chat UI, byokUnlocked in appConfig 2026-06-13 20:10:38 -07:00
e9943908c6 fix(wizard): 503 on LLM error, sanitize history content, typed HistoryMessage model 2026-06-13 20:04:14 -07:00
6d1edff1b9 fix(wizard): inject profile_so_far context into AI interview LLM prompt 2026-06-13 19:59:58 -07:00
6327a4cdd9 feat(wizard): backend AI interview endpoints + BYOK tier flag 2026-06-13 19:57:00 -07:00
3048d8e2f4 docs: add LLM development disclosure to README
All checks were successful
CI / Backend (Python) (push) Successful in 1m35s
CI / Frontend (Vue) (push) Successful in 23s
Humans own design, architecture, code review, testing, and
verification. LLMs are part of our development workflow.
Links to circuitforge.tech/positions for our full position.
2026-05-28 08:20:16 -07:00
02d79e6727 fix(ci): install ruff before lint step
All checks were successful
CI / Backend (Python) (push) Successful in 1m33s
CI / Frontend (Vue) (push) Successful in 19s
CI / Backend (Python) (pull_request) Successful in 1m21s
CI / Frontend (Vue) (pull_request) Successful in 19s
ruff is not in requirements.txt (dev-only tool) so the CI runner
couldn't find it. Install explicitly in the workflow.
2026-05-21 12:03:46 -07:00
e4c5744d87 fix(ci): restore TaskSpec re-export in task_scheduler.py
Some checks failed
CI / Backend (Python) (push) Failing after 31s
CI / Frontend (Vue) (push) Successful in 22s
CI / Backend (Python) (pull_request) Failing after 23s
CI / Frontend (Vue) (pull_request) Successful in 20s
ruff --fix removed the TaskSpec import as unused within the module,
but it is part of the public API — tests import it from scripts.task_scheduler
rather than reaching into circuitforge_core directly.
Add # noqa: F401 to protect intentional re-exports from future auto-fix.
2026-05-21 11:51:40 -07:00
46bae7db1c fix(ci): rename GITHUB_MIRROR_TOKEN secret to GH_MIRROR_TOKEN
Some checks failed
CI / Backend (Python) (push) Failing after 26s
CI / Frontend (Vue) (push) Successful in 22s
CI / Backend (Python) (pull_request) Failing after 22s
CI / Frontend (Vue) (pull_request) Successful in 20s
Forgejo reserves the GITHUB_* prefix for secret names — creating a secret
called GITHUB_MIRROR_TOKEN returns 'invalid secret name'.
Also rename the GITHUB_TOKEN step env var to GH_MIRROR_PAT to avoid
collision with the built-in Forgejo Actions context variable.
2026-05-21 11:41:11 -07:00
e87c707dd9 chore(lint): ruff auto-fix unused imports in tests/
Some checks failed
CI / Backend (Python) (push) Failing after 30s
CI / Frontend (Vue) (push) Successful in 22s
CI / Backend (Python) (pull_request) Failing after 27s
CI / Frontend (Vue) (pull_request) Successful in 20s
Removes unused imports flagged by ruff F401 across 47 test files.
Auto-fix only — imports verified unused by static analysis.
2026-05-20 23:07:52 -07:00
7dcdf551fc chore(lint): ruff auto-fix unused imports in scripts/ and scrapers/
Removes unused imports flagged by ruff F401 across 12 scripts.
All removals are safe — ruff only auto-fixes imports that are verifiably unused.
2026-05-20 23:07:26 -07:00
544a6aeeb3 fix(ci): add ruff config, clean lint in dev-api.py + scripts
- Add pyproject.toml with ruff per-file-ignores:
  - Exclude deprecated app/ Streamlit dir entirely
  - Suppress E702 in dev-api.py (intentional compact Pydantic models)
  - Suppress E402 in finetune_local.py (conditional ML imports after CUDA check)
  - Suppress F841/E741/E702 in tests/ (mock-patch capture pattern)
- Remove unused db_path_obj assignment in dev-api.py:760
- Add # noqa: E402 to documented mid-file imports in dev-api.py
- Rename ambiguous l variable to line/lbl in finetune_local.py + label_tool.py
2026-05-20 23:06:49 -07:00
2051880d73 fix: dark mode CSS token gaps, interview score display, undefined CSS vars
Some checks failed
CI / Backend (Python) (push) Failing after 39s
CI / Frontend (Vue) (push) Successful in 21s
Mirror / mirror (push) Failing after 10s
InterviewCard: remove erroneous *100 multiplier from scoreClass and
scoreLabel — match_score is stored as 0-100 in the DB, not 0-1. This
was producing scores like '1490%' for jobs with a 14.9 raw score.

peregrine.css: define --color-hover token for light (rgba(0,0,0,0.06))
and dark (rgba(255,255,255,0.07)). Was undefined, leaving hover states
on InterviewCard, InterviewsView, ReferencesView, ContactsView silent.

InterviewCard + InterviewsView: replace var(--color-primary-muted,#e8f0ff)
with var(--app-primary-light). The hardcoded #e8f0ff fallback is a bright
light-blue that renders on dark backgrounds when the variable is undefined.

WizardTrainingStep: --font-sans → --font-body (correct token name).

ResumeSyncConfirmModal, ResumeLibraryCard, ResumeOptimizerPanel,
resume-review sub-pages: --font-sm → --text-sm across all occurrences.
--font-sm was never defined; most had a 0.875rem fallback (which matches
--text-sm) but the correct token should be referenced directly.
2026-05-18 13:37:08 -07:00
7d1b1319be docs: fix repo URLs and clarify BYOK tier unlocking in feature matrix
Replace git.circuitforge.io/circuitforge/peregrine with the correct
Forgejo URL (git.opensourcesolarpunk.com/Circuit-Forge/peregrine) in
Quick Start, License, and Contributing clone instructions.

Update feature matrix in docs/index.md to show BYOK‡ for AI features
(cover letter, company research, interview prep, survey assistant) with
a footnote explaining the free-with-own-backend model. Previously the
table showed these as Paid-only, which would mislead self-hosters.
2026-05-18 12:05:03 -07:00
b44a7975bc fix(ci): restore green CI — libsqlcipher-dev, prep/survey test drift
Some checks failed
CI / Backend (Python) (push) Failing after 2m25s
CI / Frontend (Vue) (push) Successful in 24s
Mirror / mirror (push) Failing after 8s
Release / release (push) Failing after 4s
Backend: add apt-get install libsqlcipher-dev before pip install so
pysqlcipher3 builds in the runner image.

Frontend: prep.test.ts was missing a qa mock (fetchFor now calls 5
endpoints in parallel; tests only mocked 4 — 5th returned undefined,
threw in catch, research.value never set). survey.test.ts: analyze()
was refactored from sync-result to async-task+poll; update test to
mock POST then poll completion.

Also remove Classic UI (Streamlit) button from AppNav — Streamlit is
deprecated and the button caused an unrecoverable redirect loop.
2026-05-17 21:50:35 -07:00
0d6ddd35cf feat(config): GPU_SERVER_URL + cf-orch task-routed backends
- Rename user-facing env var CF_ORCH_URL → GPU_SERVER_URL with full
  backward-compat alias (closes #116). Priority chain: GPU_SERVER_URL
  → CF_ORCH_URL → orch.circuitforge.tech when CF_LICENSE_KEY present.
  Write-back to os.environ[CF_ORCH_URL] keeps all downstream callers
  unchanged.
- Add four task-routed llm.yaml backends (cf_cover_letter, cf_ats_rewrite,
  cf_job_research, cf_interview_prep) using cf_orch.product + cf_orch.task.
  Coordinator resolves model/node from assignments.yaml (closes #115).
- Update compose.yml, compose.cloud.yml, compose.test-cfcore.yml,
  .env.example to use GPU_SERVER_URL as primary documented var.
2026-05-17 20:16:40 -07:00
5c4992dbeb docs: bump version badge to match latest Forgejo release
Some checks failed
CI / Backend (Python) (push) Failing after 1m24s
CI / Frontend (Vue) (push) Failing after 21s
Mirror / mirror (push) Failing after 7s
2026-05-17 11:19:13 -07:00
fc3bd8859e docs: document Gotcha #14 (body over html), retake screenshots for light theme
Some checks failed
CI / Backend (Python) (push) Failing after 1m11s
CI / Frontend (Vue) (push) Failing after 20s
Mirror / mirror (push) Failing after 8s
2026-05-08 15:49:47 -07:00
73132222a2 fix: dark/explicit themes now show correct page background
Some checks failed
CI / Backend (Python) (push) Failing after 1m14s
CI / Frontend (Vue) (push) Failing after 19s
Mirror / mirror (push) Failing after 7s
Release / release (push) Failing after 4s
index.html set 'html, body { background: #eaeff8 }' hardcoded.
body paints on top of html — even with html correctly going dark
via CSS variable resolution, the hardcoded body background covered it.

Fix:
- Remove body background from inline style (body is now transparent)
- Add blocking script to read cf-theme/cf-hacker-mode from localStorage
  and set data-theme on <html> before first paint (FOUT prevention)
- Add html[data-theme='dark'|'solarized-dark'|'hacker'] rules so the
  correct background fires immediately on initial load for all themes
2026-05-08 15:44:33 -07:00
293f0aba53 chore(release): v0.9.4
Some checks failed
CI / Backend (Python) (push) Failing after 2m10s
CI / Frontend (Vue) (push) Failing after 57s
Mirror / mirror (push) Failing after 8s
Release / release (push) Failing after 3s
Messaging overhaul: expandable email timeline with lazy body loading,
sticky compose bar replacing always-visible action buttons, layout height
fixed to 100dvh. Accessibility fixes for contrast failures on orange/amber
backgrounds. Theme-aware replacements for hardcoded colors in Interviews,
References, and JobReview. Indeed alert parser, Oracle HCM scraper,
manage.sh compose engine detection.
2026-05-08 13:32:10 -07:00
5d185650d9 docs(screenshots): retake all four views after CSS theme fix — consistent light theme throughout
Some checks failed
CI / Backend (Python) (push) Failing after 1m11s
CI / Frontend (Vue) (push) Failing after 22s
Mirror / mirror (push) Failing after 7s
2026-05-06 09:58:33 -07:00
6ae9fa62fe docs(readme): landing page rewrite — centered logo, feature table, BYOK explanation, Forgejo-primary note, split license table
Some checks failed
CI / Backend (Python) (push) Failing after 1m11s
CI / Frontend (Vue) (push) Failing after 19s
Mirror / mirror (push) Failing after 7s
2026-05-06 08:51:28 -07:00
5d8018ef40 fix(theme): scope dark media override to auto mode only
Some checks failed
CI / Backend (Python) (push) Failing after 1m32s
CI / Frontend (Vue) (push) Failing after 25s
Mirror / mirror (push) Failing after 7s
Release / release (push) Failing after 6s
peregrine.css used :root:not([data-theme="hacker"]) in the
prefers-color-scheme:dark block, causing --app-primary-light and
--app-accent-light to resolve to dark navy/brown in every explicit
light theme (light, solarized-light, colorblind) on dark-OS machines.

Changed to :root:not([data-theme]) to match theme.css's pattern,
so the media query only fires in auto mode. Explicit [data-theme="dark"]
block handles the dark-theme-on-light-OS case unchanged.

Also fixed incorrect fallback values in HintChip.vue (#0d1829 → #eaeff8)
and App.vue global toast (#2a3650/#eaeff8 → light-mode values).

Closes: dark elements in light themes on dark-OS machines
2026-05-05 14:22:59 -07:00
312631a5d9 fix(resume-optimizer): strip double bullets and markdown formatting in rewrites
Three root causes fixed:
- _section_text_for_prompt: strip existing bullet chars from bullet text before
  adding the prompt's own marker (prevents • • text entering the LLM prompt)
- _reparse_experience_bullets: use + quantifier to strip all leading bullet chars,
  not just the first (handles • • text from LLM output)
- _apply_section_rewrite (summary): run _clean_summary_markup to remove
  markdown * bullets from career_summary before storing in struct

Also adds 'no markdown formatting' to the LLM rewrite prompt CRITICAL RULES.
2026-05-05 14:11:52 -07:00
f4a524ba0b feat(resume-optimizer): make proposed text editable in review modal and preview
Some checks failed
CI / Backend (Python) (push) Failing after 1m45s
CI / Frontend (Vue) (push) Failing after 22s
Mirror / mirror (push) Failing after 11s
Summary and experience bullet fields in the review modal are now
editable textareas. Edited values flow through decisions to
apply_review_decisions(), which uses edited_text/edited_bullets when
the section is accepted. Clearing unwanted LLM-added bullets (empty
lines filtered server-side) addresses the extra-bullets issue.

The preview textarea in the apply workspace is also now editable;
approveResume() passes preview_text_override so manual edits survive
the approve step without re-rendering from struct.
2026-05-05 13:35:01 -07:00
77e49db4e9 Merge pull request 'feat: cover letter training export (Phase 1)' (#111) from feat/cover-letter-training-export into main
Some checks failed
CI / Backend (Python) (push) Failing after 1m17s
CI / Frontend (Vue) (push) Failing after 19s
Mirror / mirror (push) Failing after 7s
Release / release (push) Failing after 3s
2026-05-04 08:55:15 -07:00
424a946ca0 chore(release): v0.9.2 changelog entry
Some checks failed
CI / Backend (Python) (pull_request) Failing after 1m0s
CI / Frontend (Vue) (pull_request) Failing after 21s
2026-05-03 07:27:13 -07:00
f42a515629 fix: wizard step numbering and loadDbPairs race on mount
Some checks failed
CI / Backend (Python) (pull_request) Failing after 1m51s
CI / Frontend (Vue) (pull_request) Failing after 21s
Insert Training at step 4 in WIZARD_STEPS (7→8), STEP_LABELS, and
STEP_ROUTES. Bump Identity→5, Inference→6, Search→7, Integrations→8 in
their respective saveStep calls. Cap resumeAt at 8. Await loadStatus()
before loadDbPairs() in FineTuneView onMounted so optedIn is set before
the early-exit guard runs.
2026-05-03 01:34:06 -07:00
0e40750450 feat: add WizardTrainingStep opt-in consent step to onboarding
Inserts a new optional Training Export step between Resume and Identity
in the setup wizard. Users can opt in to saving cover letters for
fine-tuning dataset export. Consent copy distinguishes local vs. cloud
storage. WIZARD_STEPS bumped to 7; router, and adjacent step
back/next navigation updated accordingly.
2026-05-03 01:11:06 -07:00
6bfb2bf3f7 feat: add Training Export and From Applied Jobs sections to FineTuneView (a11y-correct) 2026-05-03 01:04:43 -07:00
8e6cc02295 feat: add training export state and actions to fineTune store 2026-05-03 00:14:22 -07:00
25473aef77 feat: add training export API endpoints to dev_api.py
- PATCH /api/settings/fine-tune/opt-in — toggle training_export_opt_in in user.yaml
- GET /api/settings/fine-tune/db-pairs — list DB jobs with exclusion flags (403 without opt-in)
- PATCH /api/settings/fine-tune/db-pairs/{id}/exclude|include — per-job exclusion toggle
- GET /api/settings/fine-tune/export — NDJSON streaming download of all training pairs (DB + file)
- POST/GET /api/settings/fine-tune/cloud-request|cloud-status — Phase 2 stubs (501)
- finetune_status now includes opted_in field
- 6 new API tests; all 17 tests pass
2026-05-02 23:40:44 -07:00
3b52844382 feat: add training_export_opt_in field to UserProfile 2026-05-02 23:32:34 -07:00
148aaf00cb feat: add training export DB migration and db.py helpers
Add excluded_from_training column to jobs table (migration 009 + _MIGRATIONS
entry for existing DBs). Add get_db_pairs(), get_training_pairs(), and
set_training_exclusion() helpers for the cover letter training export pipeline.
Add test_training_export.py with 8 tests covering all helpers (all passing).
2026-05-02 23:21:34 -07:00
b03add8663 feat(resume-matcher): tier-aware writing model routing via cf-orch
Premium/ultra users with a custom_writing_model in their session are
routed to that model as the first cf-orch candidate; all other tiers
use the shared Qwen2.5-3B-Instruct base. complete_json() is unchanged
since fine-tuned writing models aren't trained for structured output.

Adds _request_tier and _request_writing_model ContextVars. Resolution
order: USER_WRITING_MODELS env var (Monday path) then Heimdall meta
(future path via peregrine#110).
2026-04-26 09:18:55 -07:00
5e63faba0c refactor: import detect_byok from cf-core in resume_matcher, remove local copy
Some checks failed
CI / Backend (Python) (push) Failing after 2m26s
CI / Frontend (Vue) (push) Failing after 22s
Mirror / mirror (push) Failing after 7s
Force-adds file from gitignored resume_matcher/ subtree — only CF-specific
patch files are force-added; upstream resume_matcher files remain excluded.
2026-04-25 16:46:25 -07:00
673fb84c23 chore: remove deprecated Streamlit app service from cloud compose (closes #104)
Some checks failed
CI / Backend (Python) (push) Failing after 1m14s
CI / Frontend (Vue) (push) Failing after 21s
Mirror / mirror (push) Failing after 6s
Vue+FastAPI (api+web services) is the only frontend. The peregrine-cloud
Streamlit container was still running alongside the new stack and is now
removed. Port 8505 freed.
2026-04-24 20:11:14 -07:00
1d9ee9cff0 feat(resume-matcher): wire cloud session + user_id routing to cf-orch
Some checks failed
CI / Backend (Python) (push) Failing after 1m11s
CI / Frontend (Vue) (push) Failing after 21s
Mirror / mirror (push) Failing after 9s
- app/cloud_session.py: CloudSessionFactory(product="peregrine") from
  cf-core v0.16.0; get_session / require_tier FastAPI dependencies;
  session_middleware_dep sets request-scoped user_id ContextVar
- app/llm.py: _request_user_id ContextVar + set/get helpers;
  _allocate_orch_async includes user_id in payload when present so
  premium users get their custom model path from cf-orch UserModelRegistry
- app/main.py: session_middleware_dep wired as global FastAPI dependency;
  runs on every request, zero function-signature changes needed

Force-added to bypass resume_matcher/ gitignore (CF-specific patch files).
2026-04-24 17:31:43 -07:00
8fda94356f Merge pull request 'feat: reranker pass in job ranking and ATS optimizer' (#109) from feature/reranker-integration into main
Some checks failed
CI / Backend (Python) (push) Failing after 1m13s
CI / Frontend (Vue) (push) Failing after 23s
Mirror / mirror (push) Failing after 7s
Release / release (push) Failing after 3s
2026-04-23 09:44:06 -07:00
2772b808d3 feat: reranker pass in job ranking and ATS optimizer (cf-core v0.15.0)
Some checks failed
CI / Backend (Python) (push) Failing after 1m10s
CI / Frontend (Vue) (push) Failing after 19s
CI / Backend (Python) (pull_request) Failing after 1m11s
CI / Frontend (Vue) (pull_request) Failing after 18s
- Add _try_rerank() to job_ranker.py: after stack_score sort, rerank
  top-50 candidates by (resume_text, description) cross-encoder relevance
- Add resume_text param to rank_jobs(); graceful no-op when empty
- Add reranker gap-reordering pass in rewrite_for_ats(): gaps sorted by
  (jd_text, term) relevance before section grouping and LLM rewrite
- Both integrations fall back silently on ImportError or inference failure
- 13 new tests; CF_RERANKER_MOCK=1 for zero-weight test runs
- Closes #108
2026-04-21 12:41:40 -07:00
ef8b857bf9 chore: remove Streamlit app service from compose.yml (#104)
Some checks failed
CI / Backend (Python) (push) Failing after 2m39s
CI / Frontend (Vue) (push) Failing after 20s
Mirror / mirror (push) Failing after 8s
Vue+FastAPI is now the only frontend. Streamlit is deprecated.
Container was stopped and removed.
2026-04-21 11:14:55 -07:00
4388a2d476 feat: add CF_APP_NAME=peregrine to dev compose for cf-orch pipeline attribution
Some checks failed
CI / Backend (Python) (push) Failing after 7m27s
CI / Frontend (Vue) (push) Failing after 20s
Mirror / mirror (push) Failing after 7s
2026-04-21 10:58:52 -07:00
f10c974fbb chore: release v0.9.0 — messaging tab, demo experience, references, resume sync
Some checks failed
CI / Backend (Python) (push) Failing after 1m35s
CI / Frontend (Vue) (push) Failing after 28s
Mirror / mirror (push) Failing after 15s
Release / release (push) Failing after 5s
2026-04-21 10:17:01 -07:00
5f92c52270 Merge pull request 'feat: public demo experience (Vue SPA with demo mode)' (#103) from feature/demo-experience into main
Some checks are pending
CI / Backend (Python) (push) Waiting to run
CI / Frontend (Vue) (push) Waiting to run
Mirror / mirror (push) Waiting to run
2026-04-21 10:15:02 -07:00
53c1b33b40 feat(demo): add UX designer resume, ATS optimizer snapshots, and company research briefs
Some checks failed
CI / Backend (Python) (push) Failing after 1m21s
CI / Frontend (Vue) (push) Failing after 18s
CI / Backend (Python) (pull_request) Failing after 1m10s
CI / Frontend (Vue) (pull_request) Failing after 22s
- Seed resumes table with a full UX designer base resume (Alex Rivera persona)
- Add ATS gap reports and optimized resumes for Spotify (job 1), Duolingo (job 2), NPR (job 3)
  - Each gap report highlights role-specific keyword opportunities (audio UX, gamification, public media)
  - Optimized resumes tailor the base resume framing to each company's emphasis
- Seed company_research for Asana (phone_screen), Notion (interviewing), Figma (hired)
  - Includes company_brief, ceo_brief, talking_points, tech_brief, funding_brief,
    competitors_brief, accessibility_brief for each
- Update demo/config/user.yaml career_summary to match UX designer persona
  - Fixes mismatch between "software engineer" summary and UX/design job seeds
  - Adds music and education mission preference notes
2026-04-21 10:14:37 -07:00