체인지로그
GitHub릴리스별로 정리된 모든 주요 변경 사항입니다. 저장소에 실린 동일한 파일이며, 19개 언어 전체로 번역되어 있습니다.
[1.148.0] — 2026-08-12
더 깔끔한 스캔 필터 (Phase 4) — 필터 패널이 이제 정돈된 그리드 — #/scan 필터 패널이 폭이 제각각인 상자들의 들쭉날쭉한 flex-wrap에서 반응형 그리드로 바뀌었고, 적용 / 초기화 액션은 이제 오른쪽 정렬된 별도 행을 차지합니다. 필터도 동작도 그대로 — 읽기만 더 쉬워졌습니다. 디자인 다듬기(parent-sync 없음).
변경
#/scan필터 패널 → 반응형 그리드 —.scan-filters는 이제repeat(auto-fill, minmax(180px, 1fr))열과 균일한 간격을 가진display: grid라서, 라벨이 붙은 11개 필터가 어떤 폭에서도 들쭉날쭉 줄바꿈되지 않고 정돈된 열로 정렬됩니다.- 적용 / 초기화 액션이 전체 그리드를 가로질러 자체 행을 차지하며, 얇은 선으로 구분되고 오른쪽 정렬됩니다.
scan.js의 옛 숨김 라벨 트릭 + 내부 flex 래퍼를 제거했습니다.
참고
- CSS + 작은 DOM 정리뿐 — 모든 필터 id(
#scan-filter-*,#scan-apply)와SR.render()연결은 그대로여서 Playwright 흐름은 영향받지 않습니다. 새 i18n 키 없음. - 브라우저 검증 완료(콘솔 오류 0);
tests/scan-filters-grid.test.mjs로 보호. - 스위트: 2381개 테스트(+3:
tests/scan-filters-grid.test.mjs).
[1.147.0] — 2026-08-12
Hermes & Telegram — 앱 내 도움말 섹션 + cvstart.org 표면 (Phase 5b, 2부) — Hermes 문서 작업의 두 번째이자 마지막 부분입니다: 사용법이 이제 17개 언어 전체에서 앱 자체 도움말 가이드 안에 담기며, 앱 내 문서 어시스턴트가 이를 바탕으로 Hermes 질문에 답합니다. 여전히 문서 전용입니다 — Hermes LLM 제공자 경로는 계획됨 / 아직 미연동 상태로 유지됩니다(Phase 5).
추가
- 앱 내 도움말 §30 “Hermes & Telegram” × 17개 언어 — 새 가이드 섹션(Hermes란 무엇인가 + 두 가지 통합 형태; 클라우드 서버에서 실행; Hermes를 통한 Telegram + “노출하지 말아야 할 것” 규칙),
#/help에서 접근 가능.docs-assistant/DocsFab그라운딩이 자동으로 이를 가져옵니다(둘 다docs/help/<lang>.md를 읽음). - cvstart.org — Hermes 가이드 링크, GitHub 문서로 연결.
변경
- 도움말 번들 게이트 29 → 30 H2 / 105 → 108 H3로 상향(
canonical-docs-coverage,help-ui,help-ru-config-section); §30이 H3 3개를 추가.
참고
- 여전히 아무것도 Hermes를 호출하지 않습니다. 새 캐너리
tests/help-hermes-section.test.mjs가 모든 언어에 §30이 언어 독립 앵커(docs/integrations/HERMES.md,hermes-bridge,#/help,127.0.0.1, Telegram)와 함께 있는지 확인합니다. 제공자는 Phase 5 API 계약 스파이크에 여전히 막혀 있습니다. - 이로써 Phase 5b의 문서 + 스킬 산출물이 마무리됩니다; 제공자 통합(Phase 5)은 별개의 차단된 항목으로 남습니다.
- 스위트: 2378개 테스트(+2:
tests/help-hermes-section.test.mjs).
[1.146.0] — 2026-08-12
Hermes 에이전트 + Telegram — 통합 가이드 + 스킬(Phase 5b, 1부) — 클라우드 서버에서 career-ops-ui를 실행하고, 그 이벤트(완료된 스캔, 새 리포트, 긴급한 후속 조치)를 Nous Research의 Hermes 에이전트를 통해 Telegram으로 연결할 수 있습니다. 이번 릴리스는 설계 + 배포 문서와 hermes-bridge 스킬을 제공합니다. Hermes LLM 제공자 경로는 여전히 계획됨/아직 연결되지 않음 상태입니다(Phase 5 API 계약 스파이크에 막혀 있음). 의도적으로 코드보다 문서가 앞서 있습니다.
추가
docs/integrations/HERMES.md— 심층 가이드: 두 가지 통합 형태(OpenAI 호환 엔드포인트 vs. 에이전트 런타임), 클라우드 서버 배포(reverse proxy + HTTPS + systemd, 헤드리스 서버에서의 읽기 전용 parent 계약), Hermes를 통한 Telegram 연동, 그리고 위협 모델 “노출하지 말아야 할 것” 목록(CV / 연봉 / 리포트 본문 / 키를 채널에 노출하지 않음).- README의
## Hermes agent + Telegram예고 — 영어 README와 완전히 번역된 각 언어 README에 짧은 안내와 링크가 반영됨. - 가이드를 실행 가능하게 만드는
hermes-bridge스킬(.claude/skills/hermes-bridge/) — 전제 조건 + 범위 게이트 검사(Node ≥ 18, 키 존재 여부, SSRF에 안전한 경로를 통한 엔드포인트 접근성 확인), 비밀 정보를 디스크/로그에 절대 기록하지 않으며, Hermes 엔드포인트를 임의로 만들어내거나 제공자가 연결되었다고 주장하지 않음. docs/architecture/OVERVIEW.md의 통합 섹션이 가이드를 링크함.
참고
- 아직 Hermes를 호출하는 코드는 없습니다. 캐너리 테스트(
tests/hermes-docs.test.mjs)가 “계획됨/아직 연결되지 않음” 정직성 표시와llm-dispatch.mjs에 Hermes/Nous 분기가 없음을 확인합니다 — 따라서 나중에 제공자를 연결할 때는 같은 변경에서 문서 + 로드맵도 함께 업데이트해야 합니다. - v1.147.0으로 연기됨(Phase 5b, 2부): 앱 내 도움말의 “Hermes & Telegram” H2 × 17개 언어, 그리고 cvstart.org 마케팅 페이지.
- 스위트: 2376개 테스트(+4:
tests/hermes-docs.test.mjs).
[1.145.0] — 2026-08-12
통찰력 있는 통계(계속): 재구성 가능한 차트 — #/stats의 “목표 직무 추세” 탭에 차트 만들기 위젯이 생겼습니다: 지표 × 차원을 고르면 실시간으로 다시 그립니다. 사용자 UX 요청(부모 동기화 없음).
추가
- 지표 × 차원 재구성 차트 — 지표(채용 공고 / 중앙값 연봉 / 평균 연봉)와 차원(국가별 / 직무별)을 고르면 막대 차트가 즉시 다시 그려집니다. 연봉 지표는 통화 + 연/월 전환을 따르고, 채용 공고는 단순 개수입니다.
- 8개의 새 i18n 키 × 17개 로케일; 스냅샷 1200 → 1208.
참고
- 브라우저에서 확인(콘솔 오류 0). 스위트: 2372개 테스트(+2).
[1.144.0] — 2026-08-12
설정 및 필터(Phase 4, 1부): 추적 포털 활성화/비활성화 — 이제 #/portals에서 감시 대상 회사를 켜고 끌 수 있으며, 스캐너가 이를 반영합니다. 사용자 UX 요청(부모 동기화 없음).
추가
#/portals의 회사별 활성화/비활성화 버튼 — 한 번 클릭으로 포털을 끄면(EN 스캐너가 이미enabled: false회사를 건너뛰므로 비활성 포털은 이후 모든 스캔에서 빠집니다) 또는 다시 켤 수 있으며, 낙관적 토스트가 표시됩니다.POST /api/portals/toggle—portals.yml에서 회사의enabled플래그를 외과적으로(파싱 검증 포함) 바꾸는 명시적 사용자 쓰기(주석·순서·기타 필드 보존). 5개의 새 i18n 키 × 17개 로케일; 스냅샷 1195 → 1200.
참고
- 스캐너 변경은 없음 —
en-scanner.mjs가 이미enabled !== false로 필터링합니다. 스위트: 2370개 테스트(+3).
[1.143.0] — 2026-08-12
이해하기 쉽게(계속): 핵심 워크플로 화면의 ? 힌트 — 도움말 ?가 이제 아홉 개의 주요 작업 페이지를 모든 언어로 다룹니다. 사용자 제보 UX 개선(부모 동기화 없음).
추가
- 9개 화면 제목에
?도움말 힌트 추가 —#/scan,#/evaluate,#/cv-studio,#/tracker,#/config,#/deep,#/batch,#/auto,#/apply에 인라인?(HelpHint.title)가 붙어 현지화된 “무엇을/어떻게/무엇을 기대” 팝오버를 엽니다 — v1.139.0의 CSP 안전 컴포넌트와 동일합니다. - 9개의 새 i18n 키 × 17개 로케일(
help.hint.scan/…/apply); 스냅샷 1186 → 1195.
참고
- 브라우저에서 확인(콘솔 오류 0). 스위트: 2365개 테스트(+1).
[1.142.0] — 2026-08-12
정확성: “Unknown” 커리어 아키타입 제거 — #/orientation이 이제 가끔 “Unknown”으로 답하고 그것을 “밀어붙이라”고 권하는 대신, 항상 여덟 개의 명명된 커리어 벡터 중에서 순위를 매깁니다. 사용자 제보 수정(부모 동기화 없음).
수정됨
#/orientation— AI 프롬프트가 이제 집합 밖 아키타입을 금지합니다. 모델은 정확히 여덟 개의 명명된 벡터 중에서 상위 3개를 골라야 하며 “Unknown”/“N/A”/“데이터 부족”이라고 답하거나 새 라벨을 만들 수 없습니다. 이력서가 빈약하면 가장 가까운 셋을 낮은 신뢰도로 지목하고 부족한 근거를 밝힙니다.
참고
- 서버 프롬프트만 변경(
buildOrientationPrompt); i18n/스키마 변경 없음. 스위트: 2364개 테스트(+1).
[1.141.0] — 2026-08-12
통찰력 있는 통계(계속): 투자받은 회사 정보 보강 — #/funded가 더 시각적으로 바뀌었습니다: 회사 로고, 투자 금액 차트, 라운드 / 금액 / 발굴 점수 / 권장 조치가 담긴 카드. 사용자 제보 UX 개선(부모 동기화 없음).
변경됨
#/funded— 평면 표 → 카드 그리드. 최근 투자받은 각 회사가 이제 로고(회사명 기반, 실패 시 글자 아바타), 라운드 + 금액 칩, 부모 프로젝트의 발굴 점수와 권장 조치, 그리고 투자 뉴스 링크·날짜가 담긴 카드로 표시됩니다.- 투자 금액 시각화 — 공개된 금액 기준 상위 회사의 가로 막대 차트; “$120M”/“€1.5B” 같은 자유 텍스트 금액을 새
parseAmount로 크기로 변환합니다. 3개의 새 i18n 키 × 17개 로케일.
참고
- 여전히
GET /api/company-funded위의 읽기 전용입니다. 설명과 급여 범위는 투자 피드에 없습니다. 스위트: 2363개 테스트(+2).
[1.140.0] — 2026-08-12
통찰력 있는 통계: 더 풍부한 급여 수치 — #/stats의 “내 파이프라인” 급여 분석이 이제 (중앙값뿐 아니라) 평균, 연간 ⇄ 월간 전환, 국가별 최소 · 평균 · 중앙값 · 최대 표를 보여줍니다. Phase 3의 첫 조각. 사용자 제보 UX 개선(부모 동기화 없음).
추가
- 평균 급여 —
RoleStats.salaryStats가 이제minUsd/medianUsd/maxUsd와 함께avgUsd를 반환합니다. 중앙값은 이상치에 강하고 평균은 편향을 드러내므로, 둘이 함께 분포로 읽힙니다. - 급여 섹션의 연간 ⇄ 월간 전환과 국가별 최소 · 평균 · 중앙값 · 최대 표(통화·기간 선택기 연동). 8개의 새 i18n 키 × 17개 로케일.
참고
- 수치는 여전히 급여를 파싱할 수 있는 공고에서만 도출되며 USD로 정규화됩니다(참고용). 스위트: 2361개 테스트(+1).
[1.139.0] — 2026-08-12
이해하기 쉽게: ? 도움말 힌트 — 클릭하면 “무엇을 하는지 / 어떻게 작동하는지 / 무엇을 기대할지”를 사용자 언어로 설명하는 재사용 가능한 CSP 안전 ? 버튼. 사용자 제보 UX 개선(부모 동기화 없음).
추가
?도움말 힌트 팝오버(window.HelpHint) — 제목 옆의 둥근?를 누르면 테마를 따르고 RTL로 반전되는 가벼운 팝오버가 열려UI.md()로 현지화된 설명을 렌더링합니다. 접근성(role="tooltip",aria-expanded, Escape/바깥 클릭으로 닫기, 포커스 복원)과 CSP 안전성을 갖췄습니다.#/stats의 5개 탭과 8개 AI/분석 화면 제목(career-plan, 오리엔테이션, two-pager, 네트워킹, 모의 면접, 메모리, funded, 주간 요약)에?추가 — 14개의 새 i18n 키 × 17개 로케일.
참고
- 모든 화면에는 이미 한 줄 부제가 있었으며,
?는 필요할 때 더 깊은 설명을 더하고 빈 화면도 스스로 설명되게 합니다. 스위트: 2360개 테스트(+4).
[1.138.0] — 2026-08-12
인터페이스 언어로 생성 — 모든 AI 생성이 이제 UI에서 선택한 언어로 응답합니다. 아울러 리뷰에서 나온 테스트 강화 포함. 사용자 제보 UX 개선(부모 동기화 없음).
변경됨
- AI 생성이 이제 UI 언어를 따릅니다. 인터페이스가 러시아어·스페인어·일본어 등으로 설정되면 생성 결과가 항상 영어가 아니라 그 언어로 돌아옵니다. 출력 언어 지시가 모든 생성 엔드포인트 — 커리어 플랜, 오리엔테이션, 시장 리포트, 모의 면접, 네트워킹 플랜, 「문서에 묻기」, 메모리 노트 제안, two-pager 초안 — 에 전달됩니다. 코드와 식별자는 영어로 유지되며(예: two-pager YAML 키), 산문·제목·항목만 현지화됩니다.
수정됨
- CSS 색 역할 가드(
tests/css-role-tokens.test.mjs) — v1.137.0 다크모드 별칭 토큰이 역할을 뒤집지 않음을 검증하는 정적 카나리아: 텍스트 역할 토큰(--fg/--danger/--ok/…)은background로, 표면 역할 토큰(--card/--panel/--line/…)은 텍스트color로 절대 쓰이지 않음(모든 CSS 및 SPA 인라인 스타일). UI.md()XSS 로더 자가 점검 —api.js에서md()를 로드하는 테스트가 추출 직후md('<script>…')를 점검해 이스케이프가 없으면 오류를 던지므로, 향후 잘못된 슬라이스가 보안 스위트를 초록으로 만들지 않고 큰 소리로 실패합니다.#/career-plan스크롤 가드 — 생성 후scrollIntoView는 미리보기가 문서에 아직 연결돼 있을 때만 실행됩니다.
참고
docs/UX-ROADMAP.md갱신:?도움말 힌트 + 페이지 설명 + 빈 상태 작업은 이제 v1.139.0; Nous Research / Hermes 프로바이더(클라우드 서버 + 텔레그램 배포 가이드 및 Hermes 스킬 포함)는 Phase 5 / 5b로 추적됩니다.- 스위트: 2356개 테스트(+5).
[1.137.0] — 2026-08-11
가독성 및 렌더링 수정 — 다크 모드 대비, 차트 레이블, 그리고 커리어 플랜입니다. 사용자 제보 기반 UX 개선입니다(상위 동기화 없음).
수정
- 다크 모드에서 백색-바탕-백색 / 흑색-바탕-흑색 글자가 여러 화면에서 나타나는 문제 — 여러 뷰가 참조하던 CSS 커스텀 프로퍼티 15개(
--fg,--panel,--panel-2,--ok,--danger,--card, …)가 선언되어 있지 않아 하드코딩된 라이트/블랙 값으로 폴백되었습니다: 라이트 모드에서는 문제가 없었지만 다크 모드에서는 읽을 수 없었습니다(#/pipeline개요 칩,#/stats의 활성 탭,#/config의 “Active / Keys” + “✓ set”,#/two-pager의 섹션,#/mock-interview의 질문 버블, 오류 텍스트). 이제 실제 테마 인식 토큰에 별칭(alias)되어 테마를 자동으로 따라가며 — 자동화된 감사 도구로 검증된 전체 29개 뷰에서 WCAG-AA 대비 실패 0건을 달성했습니다;#/config의 활성 탭은 읽기 쉬운 색조(tint) 스타일로 변경되었습니다. 회귀 방지 가드(tests/dark-theme-tokens.test.mjs)가 이 별칭을 고정합니다. #/stats의 차트 레이블이 단어 중간에서 잘렸습니다(“Senior Backend Engineer” → “…Enginee”) — 이제 말줄임표로 표시되며, 전체 레이블은 마우스오버 시 툴팁으로 확인할 수 있습니다.#/career-plan이 생성된 플랜을 가공되지 않은 마크다운으로 표시했습니다 — 이제 서식이 적용된 읽기 쉬운 텍스트로 자동 렌더링됩니다(편집 가능한 마크다운은 텍스트 영역에 그대로 유지되며, Preview 토글로 전환할 수 있습니다).
비고
#/career-plan,#/two-pager,#/stats, 그리고 주간 인터뷰 다이제스트는 고장난 것이 아닙니다 — 플랜을 생성하거나 데이터가 있을 때까지 빈 상태(empty state)를 보여줍니다. 더 명확한 온페이지 안내와?도움말 힌트가 다음 단계로 계획되어 있습니다(docs/UX-ROADMAP.md).
[1.136.0] — 2026-08-11
상위 career-ops v1.26.x 패리티(v1.26.0 메인라인 이후) — 새로운 무인증 소스 1개와, web-ui 미러에 코드로 반영된 품질 및 견고성 포팅 물결입니다. 레지스트리는 이제 79개 소스 = 영문 74개 + 러시아어 5개입니다(ALL_ADAPTERS 74).
추가
eightfold(Eightfold AI, #2684) — 무인증https://<tenant>.eightfold.ai/api/apply/v2/jobsAPI를 통한 채용 게시판으로,*.eightfold.ai에 호스트가 고정됩니다(브랜드 처리된careers.<company>.comCNAME은 의도적으로 거부됩니다); 안전 상한과 함께 페이지네이션되며, 죽은 게시판은 예외를 던지고(dead-board-throw), URL 중복 제거를 수행합니다. 소스 + 어댑터 + CI 격리 스위트를 갖추었습니다;#/scan의 Source 필터와 랜딩에 표시됩니다.
수정
- 유니코드 인식 중복 제거 및 역할 키(#2569 / #2587 / #2667) — 새로운 공유
normalizeTextKey(NFKC, 모든 문자 체계의 문자/결합기호/숫자를 유지)가 ASCII 전용 키를 대체합니다:detect-reposts는 이제 폭/구두점 변형(“Acme, Inc.” ≡ “Acme Inc”)을 하나로 묶으면서도 서로 다른 비라틴 문자 고용주는 절대 합치지 않으며,role-matcher는 전각(full-width) 제목을 정규화하면서도 비라틴 문자 역할 토큰을 지우지 않고 유지합니다. fetchJsonWithRetry가 이제 거부된 리다이렉트를 재시도하지 않습니다(#2657) —redirect:'error'가드가 3xx를 만나는 것은 결정적(deterministic)이므로, 이제는 재시도 불가능한 것으로 처리되어 재시도 예산을 소모하는 대신 즉시 실패합니다.title_filter.positive의 AND 그룹(#2552) — positive 항목 내부의 공백으로 구분된+는 이제 순서와 무관하게 모든 용어가 제목에 나타나야 함을 요구합니다.oraclecloud가 번호가 붙은 테넌트 에펙스(apex)를 허용합니다oraclecloud1.com … oraclecloud99.com(#2683) — 범위가 제한된 패밀리이며(앞자리 0 없음, 숫자 2자리 이하), 와일드카드 에펙스는 절대 아닙니다.workable강화(#2675) — Cloudflare가 앞단에 있는 호스트에 대해 재시도, 브라우저와 유사한 헤더, 요청 직렬화를 적용했습니다.personio가 HTML 스크레이핑으로 대체됩니다 — XML 피드가 비활성화된 경우, 아무것도 반환하지 않는 대신입니다.states의 FALLBACK 별칭이 상위와 재동기화되었습니다(#2615).
비고
- 포팅되지 않음(web-ui에서 미러링하지 않거나 CLI 전용): reply-matcher(#2672), jd-similarity(#2661), jd-skill-gap(#2686), scan의 env-path(#2568) /
--flag=value(#2589) 파싱, 그리고 cover-letter / CV-template / doctor / ollama / generate-pdf 변경 사항. 웹의js-yaml/nanoidHIGH 권고는 web-ui v1.135.0에서 이미 패치되었습니다.
[1.135.0] — 2026-08-11
상위 career-ops v1.26.0 패리티 — 다섯 개의 새로운 무인증 스캔 소스와, web-ui가 이미 보유한 네 개 게시판에 대한 정확성 수정입니다. 레지스트리는 이제 78개 소스 = 영문 73개 + 러시아어 5개입니다(ALL_ADAPTERS 73).
추가
- 새로운 스캔 소스 5개(각각 소스 + 어댑터 + CI 격리 스위트를 갖추며,
#/scan의 Source 필터와 cvstart.org 랜딩에 표시됩니다):join(JOIN) —join.com/companies/<slug>에 내장된 Next.js__NEXT_DATA__에서 회사의 JOIN 게시판을 읽어옵니다(호스트 고정, 페이지 상한).getro(Getro) — 공개api.getro.comPOST API를 통한 VC “탤런트 네트워크” 포트폴리오 게시판으로, 최신순으로 페이지네이션됩니다; 각 채용 공고는 펀드가 아니라 포트폴리오 기업 소속으로 표시됩니다.consider(Consider) — 동일 출처 POST를 통한 getconsider.com VC 포트폴리오 게시판으로, 구성 기반 호스트가 구조적 SSRF 가드(공개 HTTPS 호스트만 허용)로 고정됩니다.joinup(JOINUP) — 스위스 게시판 joinup.ch로, SSR된 최신 페이지를 읽으며 스크레이퍼가 깨지면 안전하게 실패합니다(fail-closed).remotli(Remotli) — remotli.ch, 스위스 기업의 원격 채용 공고(CHF 급여)를 다루며, 교차 게시가 중복 제거되도록 고용주 자체의 ATS 지원 URL을 내보냅니다.
수정
- a16z Speedrun이 이제 일시적 문제로 게시판 전체를 중단하지 않습니다 — 페이지 가져오기가 이제 공유
fetchJsonWithRetry(일시적 429/5xx/타임아웃에 대해서만 제한된 재시도, 영구적 4xx는 재시도하지 않음)를 거치며, 페이지 예산이 50개 채용 공고 페이지에 맞게 재조정되었습니다. - arbeitsagentur가 v6 Jobsuche API(
/pc/v6/jobs)로 이전되었습니다 — 기존 v4 엔드포인트는 404를 반환하며, 응답 형태가 이름을 바꾸었고 이제 원격 필터링이 서버 측에서 좁혀집니다. - thehub이 v2
jobsandfeaturedAPI로 이전되었습니다; 행에는 게시일이 없으며 기간 필터에서 제외됩니다. - hackernews가 자유 텍스트 검색 대신
author_whoishiring계정 태그로 Algolia 조회를 필터링하여 매월 “Who is hiring?” 스레드를 안정적으로 찾습니다.
비고
- 포팅되지 않음(web-ui는 이미 안전하거나, 릴레이로 흡수되었거나, CLI 전용): 유니코드 역할 중복 제거 / 회사 매칭 키(web-ui의 재게시 그룹화는 이미 회사명을 단순 소문자로 키잉하므로 비라틴 문자 고용주가 서로 다른 채로 유지됩니다); 팔로업 거절 지연 신호 + company-funded 보완(읽기 전용으로 중계되며 페일소프트); scan의 환경변수로 재정의 가능한 경로와
--flag=value파싱(web-ui는 스캐너를 인프로세스로 실행함); User-Agent 통합 리팩터(web-ui는 이미 이를 중앙화함); 그리고 CLI 전용 항목들(신뢰할 수 없는 콘텐츠 목록, oferta/offer-prep, doctor, 커버레터/CV 템플릿 변경).
[1.134.1] — 2026-08-05
검증 강화 — 전체 프로젝트 감사에서 드러난 수정 사항입니다.
수정
successfactors가 이제 스캔 중간 실패 시에도 이미 수집한 채용 공고를 버리지 않습니다(v1.134.0의 죽은 게시판 예외 포팅에서 발생한 회귀) — 페이지네이션 루프에try/catch가 없어서, 1페이지가 성공한 뒤 2페이지 이상에서 실패하면 예외가 던져지면서 이미 수집한 결과가 모두 사라졌습니다. 게다가 그 실패가404(범위를 벗어난startrow)였다면,en-scanner가 살아 있는 테넌트를 며칠씩 죽은 것으로 격리해 버렸습니다. 이제phenom/radancy와 동일하게 동작합니다: 0페이지 실패는 여전히 예외를 던지지만(죽은 게시판), 이후 페이지의 실패는 부분 결과를 그대로 유지합니다.#/scan의 필터 칩이 이제 키보드로 조작 가능합니다(WCAG 2.1.1) — 패싯 칩(“지우기” 칩 포함)이 클릭 핸들러만 있는span이었고tabindex/role이 없어서, 키보드와 스크린리더 사용자는 이를 선택하거나 토글할 수 없었습니다. 이제role="button",tabindex="0",aria-pressed를 갖추었으며 Enter/Space로 활성화할 수 있습니다.- 하드코딩된 영어 문자열 3개가 이제 현지화되었습니다 —
#/scan의 신뢰 배지 툴팁,#/scan의 이전(relocation) 열 헤더,#/dashboard의 점수 열 헤더는 i18n 패리티 게이트가 감지할 수 없는 순수 리터럴(키가 아님)이었기 때문에, 영어가 아닌 모든 로케일에서 계속 영어로 남아 있었습니다. 이제scan.trustTip+scan.col.reloc(신규 키 2개)와 기존track.col.score의 재사용으로 대체되었으며, 소스 정적 가드가 이를 고정합니다.
[1.134.0] — 2026-08-05
상위 career-ops v1.25.0 패리티.
추가
- 새로운 스캔 소스: getManfred(
manfred) —www.getmanfred.com/api/v2/public/offers에서 제공되는, 급여가 공개된 스페인/EU 기술직 게시판 전체 피드입니다(무인증, 호스트 고정 + HTTPS 전용, 단일 요청으로 전체 카탈로그 수집). 소스 + 어댑터 + CI 격리 스위트(tests/sources-manfred.test.mjs)를 추가했습니다; 레지스트리는 이제 73개 소스 = 영문 68개 + 러시아어 5개입니다(ALL_ADAPTERS68).#/scanSource 필터와 cvstart.org 랜딩에 표시됩니다.
수정
- a16z Speedrun 피드가 조용히 50개로 잘리고 있었습니다(#2404) — 피드는 페이지당 50개로 상한이 있지만 소스는
PER_PAGE = 100을 요청하고 있었기 때문에, 1페이지 이후 페이지네이션이 멈췄습니다. 50으로 정정했습니다. - 죽은 게시판이 이제 “라이브지만 비어 있음”으로 읽히는 대신 예외를 던집니다(#2379) —
cryptocurrencyjobs,phenom,radancy,successfactors: 어떤 요청도 완료되지 않는 fetch 실패가 이제 예외를 던지므로(#/portals상태 확인과 스캔이 실제 실패를 기록합니다), 빈 목록으로 조용히 삼켜지지 않습니다; 최소 한 번 성공한 이후 스캔 도중 발생한 실패는 부분 결과를 그대로 유지합니다. - workable이 이제 공개 위젯 API를 사용합니다(#5ab8425) —
apply.workable.com/api/v1/widget/accounts/<slug>로 전환되어, 대형 계정의 전체 채용 목록을 한 번의 요청으로 반환하므로 대형 계정이 더 이상 잘리지 않습니다.
비고
- 포팅되지 않음(CLI 전용이거나 web-ui에서 미러링하지 않음): detect-reposts #2389 제목 버킷팅 성능 재작성; 유니코드 회사 키 수정(web-ui 자체 트래커 중복 제거는 이미 비라틴 문자에 안전함);
scan --since;cv-facts; CV 템플릿 / PDF 감사 패스;doctor; 모드 미신뢰 콘텐츠 지시문.
[1.133.1] — 2026-08-02
수정
#/funded(투자 유치 기업)가 이제 결과를 렌더링합니다 — 상위의company-funded.mjs가 전체 목록을 반환해도 테이블에 항상 “투자 유치 기업 없음”이 표시되던 두 가지 버그를 수정했습니다. (1) 뷰가 결과를res.candidates아래에서 읽고 있었지만, 상위는 실제로companies(각 항목은{ company, amount, round, funding: { sources: [{ source, url, observed_date }] } }형태) 아래에 결과를 내보냅니다 — 이제 클라이언트가 올바른 키를 읽고 실제 증거 구조에 맞춰 매핑합니다. (2) 결과 테이블이 셀을UI.el('tr', {}, …)에 가변 인자로 전달했지만,UI.el(tag, attrs, children)은children을 단일 노드 또는 배열로 받으므로 첫 번째 열(Company)만 렌더링되고 있었습니다 — 이제 셀은 배열로 전달됩니다. 실제 브라우저에서 검증: 4개 피드에 걸쳐 11개 기업이 Company / Funding signal / Source / Date 열과 정상 작동하는 증거 링크로 렌더링되며 콘솔 오류는 0건입니다. 결과가 없을 때도 이제 소스별 진단 정보가 함께 표시되어, 조용한 뉴스 날과 차단된 피드를 구분할 수 있습니다.tests/parity-routes-v1133.test.mjs의 회귀 가드: 가짜 상위 스크립트가 이제 실제companies출력 형태를 내보냅니다(원래 픽스처가 잘못된candidates형태를 그대로 반영하고 있었고, 이것이 버그가 그린 상태로 배포된 정확한 이유입니다). 또한funded.js가res.companies를 읽고(res.candidates는 절대 읽지 않음) 배열 children으로 테이블 행을 구성하는지 확인하는 소스-정적 카나리아를 추가했습니다(+1 → 2144).
[1.133.0] — 2026-08-01
추가
- 투자 유치 기업 발굴(
#/funded, 상위 패리티 #2117) — 상위 career-ops의company-funded.mjs를GET /api/company-funded로 중계하는 새로운 읽기 전용 뷰입니다: 공개적이고 호스트가 고정된 펀딩 피드(TechCrunch, PR Newswire, The Guardian, Hacker News)에서 발견한, 최근 투자를 유치한 기업들의 검토 우선 목록입니다. 이 릴레이는 스크립트를--json --dry-run으로 실행하고(stdout으로 JSON 출력, 파일 쓰기 없음), 사용자 입력을 결코--sources에 전달하지 않으며, 속도 제한이 적용되고, 사용자가 직접 실행해야 합니다(Discover 버튼 — 마운트 시 자동 실행 없음). 새 라우트 모듈server/lib/routes/funded.mjs+public/js/views/funded.js, Sourcing 아래. - 주간 인터뷰 다이제스트(
#/interview-digest, 상위 패리티 #2129/#2130) — 상위의 LLM을 사용하지 않는weekly-digest.mjs를GET /api/interview/weekly-digest로 중계하는 새로운 읽기 전용 뷰입니다: 이번 주 인터뷰한 회사와 라운드, 반복되는 역량, 최선 노력으로 파악한 공백을 기계적으로 집계합니다. 선택적?from=&to=범위는 둘 다 유효한YYYY-MM-DD일 때만 전달되며, 빈 범위도 유효한available:true다이제스트입니다.server/lib/routes/interview.mjs+public/js/views/interview-digest.js에 추가, Analytics 아래. - 두 릴레이 모두 상위 스크립트가 없을 때(CI, 독립 설치) 기존의 페일소프트
available:false계약을 따릅니다. 26개의 새 i18n 키 ×17개 로케일; CI 격리 스위트tests/parity-routes-v1133.test.mjs(+5 → 2143).
비고
- 상위 career-ops가 Next.js
web/앱의 Follow-up Tracker 페이지(#1422)와 백엔드 PDF 렌더링(#2182)을 갖춘 v1.24.0을 넘어 발전했습니다 — 포팅되지 않음: web-ui는 이미 자체 팔로업 릴레이와 PDF 러너를 갖추고 있으며, 근간이 되는followup-cadence.mjs하드닝은 셸아웃 릴레이를 통해 자동으로 반영됩니다.set-status.mjs/tracker-utils.mjs변경 사항은 CLI 내부용이며 미러링되지 않습니다.
[1.132.0] — 2026-07-31
변경
#/scan결과 렌더링 서브시스템을public/js/lib/scan-results.js로 추출(파일 크기 계약 부채 해소 —public/js/views/scan.js가 ~1254줄까지 늘어났습니다).renderResults,buildChipRow, 행/패싯 빌더, 옵션 페인터,FALLBACK_SOURCES레지스트리 미러를 포함한 서브시스템이 뷰가 제공하는 컨텍스트 객체를 클로저로 감싸는window.ScanResults.create(ctx)팩토리로 이동합니다. 동작 변화 없음 — 함수들은 그대로 옮겨졌고 클로저 변수만ctx.*로 재배선되었습니다.scan.js는 이제 ~906줄입니다(800줄 목표를 향한 두 번째 추출 단계가 예정되어 있습니다).- 새로운 인브라우저 회귀 게이트 —
tests/playwright-scan-filters.mjs가 고정된data/last-scan.json을 시드하고 모든#/scan필터를 구동하여 정확한 행 수를 검증하므로, 추출이 실제 브라우저 동작에 대해 검증됩니다. - README 배너 슬림화 — 버전별 “최신 릴리스” 서술이 길게 이어지던 배너를 한 줄 요약 + 전체 변경 로그(이 파일) 링크로 대체합니다.
[1.131.2] — 2026-07-31
변경
app.css를 세 개의 순서가 있는 스타일시트로 분할(파일 크기 계약 부채 해소 — 단일 파일이 ~1990줄까지 늘어나 800줄 하드 한도를 크게 초과했습니다). 이제app.css(~672줄 — 접근성, 디자인 토큰/테마, 사이드바, 메인, 버튼, 콘텐츠 셸),components.css(~595줄 — 카드, 그리드, 페이지네이터, 배지, 테이블, 폼, 로그/콘솔, 마크다운, 언어 전환기, 칩 필터, 연결 배너),overlays.css(~737줄 — 토스트, 알림 드로어, 모달, 기타/반응형,[dir="rtl"]미러, docs-fab, usage-hud)로 나뉘며, 각각 하드 한도 이내입니다.- 분할은 연속적이며 순서를 유지하므로, 캐스케이드는 분할 이전 파일과 바이트 단위로 완전히 동일합니다.
index.html은 세 파일을 순서대로<link>로 로드합니다. 동작·마크업·i18n 변경 없음. - CSS를 검사하는 테스트는 이제 공유 헬퍼
tests/helpers/css.mjs::loadAppCss()를 통해 연결된 결과를 읽습니다. 새tests/css-modularization.test.mjs가 분할을 고정합니다(파일 존재 확인 · 각 파일 ≤ 800줄 · index.html 링크 순서) → 스위트 2138. 브라우저에서 검증: 세 스타일시트 모두 파싱되고 규칙이 적용됩니다.
- 분할은 연속적이며 순서를 유지하므로, 캐스케이드는 분할 이전 파일과 바이트 단위로 완전히 동일합니다.
[1.131.1] — 2026-07-31
수정
- v1.130.0의 두 소스에 대한 어댑터 호스트 고정 일관성(코드 리뷰 후속 조치, 심층 방어; 유효한 입력에 대한 동작 변화 없음):
a16z-speedrun-talent어댑터가 이제buildEndpoint에서api:/a16z-speedrun-talent:오버라이드를 재검증하며(HTTPS + 정확한 호스트speedrun-talent-network.com), 검증에 실패하면 정규 피드로 폴백합니다 —cryptocurrencyjobs어댑터와의 패리티로, 호스트가 다른 값이 fetch 슬롯에 도달하는 일이 없습니다(이전에는 fetch 시점의assertSpeedrunUrl가드에만 의존했습니다). 정확 호스트 검사는 이제 가드와 어댑터가 공유하는 단일 exportSPEEDRUN_TALENT_HOST_RE로 통합되었습니다.cryptocurrencyjobs파서 —cleanUrl이 이제assertCryptocurrencyJobsUrl및 어댑터 오버라이드와 동일한 정확 일치 호스트 가드를 사용합니다(이전에는 서브도메인을 허용하는endsWith였습니다). 파서는 SSRF 가드보다 더 관대해질 수 없습니다:sub.cryptocurrencyjobs.co아이템 링크는 폐기됩니다.- +2 테스트 → 스위트 2135.
[1.131.0] — 2026-07-31
추가
#/trackerCRM 스테이지 탭 보드(상위 웹 앱의/pipeline뷰에서 이식). 트래커의 퍼널 칩 바 + 상태 드롭다운이 스테이지 탭 스트립으로 대체됩니다: All 탭과 정규 상태별 탭 하나씩 — Evaluated · Applied · Responded · Interview · Offer · Rejected · Discarded · SKIP · Hired — 각각 실시간 전체 이력 카운트를 표시하며, 카운트 0인 스테이지도 포함되어 전체 퍼널이 항상 보입니다(CRM 형태). 활성 탭이 필터를 구동하며, 다시 클릭하면 All로 초기화됩니다. 행은 점수 톤, 적법성, PDF·리포트 기능을 그대로 유지하고, 로고가 활성화된 경우 회사 셀에 브랜드 로고가 표시됩니다(기본값 꺼짐 → 추가 요청 없음).- 새 읽기 전용 라우트 **
GET /api/tracker/stages**가 정규 퍼널(순서대로 라벨) + 별칭 폴드 맵을 반환하며,server/lib/states.mjs(templates/states.yml, 내장 폴백 포함)에서 가져옵니다 — 클라이언트가 상태 화이트리스트를 하드코딩하지 않도록 합니다. 파라미터 없는 레거시GET /api/tracker응답은 변경되지 않습니다({ rows }만). - 새 순수·단위 테스트된 클라이언트 라이브러리 **
public/js/lib/tracker-stages.js**가 서버의 스테이지에 맞춰 행을 버킷화하며, 흩어진 마크다운 볼드와 지역화된 별칭(예:aplicado→Applied)을 허용합니다. 탭은 접근성을 갖춥니다(role tablist/tab, aria-selected, ≥44px 히트 영역, 각 탭의 접근 가능한 이름에 카운트 포함). 새 i18n 키 없음. 스위트 2133.
- 새 읽기 전용 라우트 **
[1.130.0] — 2026-07-31
추가
- 상위 career-ops v1.24.0에서 이식된 2개의 새 스캔 소스(인프로세스, 새 의존성 없음; 둘 다
#/scanSource 필터와 cvstart.org 랜딩에 표시됩니다):- a16z Speedrun(
a16z-speedrun-talent, #2231) — a16z Speedrun talent-network 보드 전체 JSON 피드.speedrun-talent-network.com에 호스트 고정, HTTPS 전용, 페이지 상한이 있는 0-인덱스 페이지네이션, 회사별q/설정 스레딩, fail-soft. - Cryptocurrency Jobs(
cryptocurrencyjobs) — Web3 채용 보드cryptocurrencyjobs.co, 공개 RSS 2.0 피드로 수집(무인증). 2-패스 XML 엔티티 디코드, 원격 전용 공고, 제목 끝의"… at <Company>"에서 고용주 파싱. - 레지스트리 총합은 이제 72개 소스 = 영문 67개 + 러시아어 5개입니다(
ALL_ADAPTERS= 영문 포털 어댑터 67개).
- a16z Speedrun(
수정
echojobs— 하이브리드 근무 형태가 원격과 구분되어 유지(상위 #2258 미러링). 대소문자 구분 없는hybrid마커가 이제"<City> · Hybrid"(도시가 없으면 단순Hybrid)와workplaceType: 'Hybrid'를 생성하며, 더 이상Remote로 뭉뚱그려지지 않습니다.radancy— 레거시 TalentBrew 마크업 + JSON 결과 프래그먼트 전송(상위 a3e6df9 미러링), 주입 가능한opts.fetchJson으로 게이트됩니다.
비고
- 미포팅 — CLI 전용 상위 기능. career-ops v1.24.0의 방대한 CLI/모드 표면은 web-ui에 들어오지 않습니다. web-ui는 모드 호스트가 아니라 뷰어 + 씬(thin) 라이트스루입니다: 컴플라이언스/관할권 테이블, 연락처 전화번호부 + vCard, 인터뷰 트랜스크립트 디브리프/콜 플랫폼 감지, 원장 set-status, 결과 기록, 투패스 트리아지, jd-similarity, 버전 관리되는 지원-CV 아티팩트 스키마, doctor의 Playwright-MCP 감지,
portals/fix-slugs.mjs가 여기 해당합니다. 상위의scan.mjs에 있는 스캔 오케스트레이션 변경 사항 — Interamt.de Playwright 스캐너, iCIMS 리버스-ATS 전체 스윕, 국가 자격 원격 필터, DNS 조회 페이싱, StepStonerltr중복 제거, 스캔 기록의 정규화된 회사 컬럼 — 도 적용되지 않습니다: web-ui는 EN/RU 스캐너를 인프로세스로 실행하며scan.mjs로 셸아웃하지 않습니다. - 이미 반영됨.
role-matcher악센트 폴딩 수정(#2209)은 v1.127.0에서 이미 이식되어, 여기서는 변경 사항이 없습니다.
[1.129.1] — 2026-07-29
수정
- v1.128/v1.129 웹 포트에 대한 AI 리뷰 후속 조치(모두 권고, 원천 수정):
job-facets.js레벨 우선순위(명시적 수식어가 관리 단어보다 우선 —Senior Engineering Manager→senior, 이전lead);states.mjs폴백이 더 이상 고정되지 않음(성공 읽기는 메모이즈, 폴백은 캐시 없이 반환 — 부팅 시 일시적으로 부재한 부모는 다음 호출에 재읽기) + 존재하지만 손상된 파일에console.warn;score-tone.js— 점수 없는 행은 중립(muted), 빨강 아님;domainFromName()은/api/logo전에 비-ASCII 슬러그 건너뜀; +tests/states.test.mjs격리 가드. +4 테스트 → 2073.
[1.129.0] — 2026-07-29
추가
#/scan레벨 패싯 + 게시일 컬럼 — v1.128.0의job-facets.js라이브러리가 이제 스캔 UI에 연결되었습니다(이전엔 로직만). 새 레벨 드롭다운이 각 공고 제목을 lead/staff/senior/mid/junior/intern으로 분류(JobFacets.seniorityFromTitle)하고 결과에 실제로 있는 항목으로 자동 채웁니다(Country 패싯처럼); 레벨 단어가 없는 제목은 항상 통과. 저장된 검색·초기화·적용에 유지됩니다. 결과 테이블에 레벨 배지 컬럼과 무토큰 게시일 컬럼(오늘/N일,JobFacets.daysSince)이 추가됩니다. i18n 키 12개 ×17, +3 테스트 → 2069.
[1.128.0] — 2026-07-29
추가
- 상위 프로젝트 자체 웹앱(
../web/, Next.js)에서 4개 솔루션 포팅 — 바닐라 JS/ESM로 재구현, 새 의존성 없음: (1)server/lib/states.mjs가templates/states.yml을 트래커 상태 어휘의 단일 소스로 실시간 읽음(CI 폴백) — 매 릴리스 수동 화이트리스트 재동기화 제거; POST는 별칭(스페인어/레거시)을 정규 라벨로 접고, GET 퍼널은 정규 상태로 버킷; (2) ATS 호스트 행의 회사 로고 —domainFromName()(~90 브랜드→도메인); (3)score-tone.js— 4단계 점수 톤(≥4.2/3.8/3.0 + 문자 폴백); (4)job-facets.js— seniority/source/days 파셋. +21 테스트.
비고
- 미포팅(개념만): 상위의 에이전트 액션 레이어(
actions/registry.ts+api/assistant/route.ts) —docs-fab가 코파일럿이 될 때의 청사진. 새 소스 없음(레지스트리 70), i18n/help 변경 없음.
[1.127.0] — 2026-07-29
추가
- 3개의 새 스캔 소스(career-ops v1.23.0 패리티) — 레지스트리가 이제 **70개 어댑터(65 EN + 5 RU)**를 제공합니다: Flowxtra(무인증 전역 애그리게이터), VDAB(플랑드르 공공고용서비스 키워드 API), iCIMS(
careers-<tenant>.icims.com포털,jibeapply와 별개). 또한 Cursor가 CLI 로스터에 복귀(parent #2115):cli-detect가 이제cursor를 감지(10개 도구)하고 help/README/config ×17에 로스터가 복원됩니다.
수정
- agenticjobs가 HTML 스크래핑에서 REST API로 전환(#2167); Greenhouse는
location.name이 근무 형태뿐일 때/offices에서 도시를 복구(#2104); role-matcher 패리티(#1933/#2164/#2009: MTS 접두사,product베이스라인, 악센트 폴딩, 서브-베이스라인 불일치).
비고
- 미포팅. v1.23.0 대부분은 web-ui가 쓰지 않는 CLI/대시보드 표면(batch-tailor, discover-ats, NL/PT 모드, PDF 테마, Go 대시보드, updater/doctor); 릴레이 스크립트는 변경 불필요. 상위 VERSION → 1.23.0.
[1.126.1] — 2026-07-25
수정
- v1.126.0 재동기화가 놓친 CLI 로스터 드리프트 두 곳 — (1)
#/config의 API keys 탭 인트로(config.providerModelNote, i18n ×17)가 7개 CLI만 나열 — 이제 Antigravity와 Grok Build가 OpenCode 뒤에 삽입됨; (2) 도움말 가이드(×17)의 두 번째 비교표 행과 CI 빌드 사이트 help가 여전히Inside Claude Code / Codex / Cursor / Gemini CLI(구식 Cursor 포함)였음 — 이제 전체 로스터. 둘 다 v1.126.0 스윕 패턴이 다루지 못한 슬래시/가운뎃점 구분자를 사용. i18n 스냅샷 재생성; 스위트는 1969 유지.
[1.126.0] — 2026-07-25
추가
- AI CLI 도구 탭이 career-ops의 8개 일급 CLI를 모두 감지 —
#/config로스터를 상위의docs/SUPPORTED_CLIS.md와 동기화:server/lib/routes/cli-detect.mjs에 Grok Build CLI(grok)와 Kimi CLI(kimi)가 추가되고, Antigravity는 이제 정규 바이너리agy를 먼저 탐색합니다. 읽기 전용 PATH 스캔은 이제 9개 도구를 보고하며, 여전히 찾은 바이너리를 실행하지 않습니다.
변경
- career-ops.org/docs와 문서 재동기화 — 모든 문서 표면을 상위의 라이브 페이지(31개 전부 읽음)와 대조했습니다. 정규 AI 어시스턴트 로스터(help ×17 + README ×17)는 이제 8개 일급 CLI — Claude Code, Codex, OpenCode, Antigravity CLI, Grok Build CLI, Qwen Code, Kimi, GitHub Copilot CLI — 와 Gemini CLI(레거시 래퍼)를 나열합니다. 도움말 번들은 29 H2 / 105 H3 구조를 유지합니다.
[1.125.4] — 2026-07-23
변경
- site 의존성 (dependabot #151–#153) —
site/의sharp0.34.5→0.35.3,svgo4.0.1→4.0.2,fast-uri(dev) 3.1.3→3.1.4; Astro 빌드 정상, SPA/서버 영향 없음.
비고
- 상위 프로젝트 패리티 스윕(career-ops
37d17ec..254764a, v1.22.0 이후) — 포팅할 것 없음:set-status의 잘못된 행 가드(#2108)는 CLI 전용(web-ui 트래커 행은 UI에서 명시적으로 선택되며 어떤 라우트도set-status.mjs를 호출하지 않음), 로컬라이즈 모드의 Risk Summary(#2109)는 web-ui가 읽지 않는modes/<lang>/파일(최상위modes/*.md만 읽음),update-system매니페스트 검증(#2111)은 업데이터 전용, 나머지는 상위 문서(터키어 README, SIGNATURES ×4, SCRIPTS.md, es 악센트). 상위 VERSION은 1.22.0 유지 —parentVersion변화 없음.
[1.125.3] — 2026-07-23
수정
- 덴마크어·힌디어 LLM 프롬프트가 영어로 응답하던 문제 (사용자 제보) —
server/lib/prompts.mjs의LOCALE_NAMES와 다섯 개의SCAFFOLD_STRINGS블록이da·hi로 확장되지 않아resolveLocale()이en으로 폴백했고, 딥 리서치(라이브·수동), 모드 실행, 평가, 인터뷰, 네트워킹, CV Studio 등 모든 AI 프롬프트에서# Output language지시문이 빠졌습니다. 이제 두 로케일 모두 정식 지원됩니다: 로케일 지시문 + 현지화된 스캐폴딩.tests/locale-scaffold.test.mjs의 회귀 게이트는 하드코딩된 12개 대신 정식 17개 로케일 목록을 순회하고, 새 구조 패리티 게이트는 영어로 폴백하는 스캐폴드 키를 실패시킵니다 — 앞으로prompts.mjs를 놓친 로케일은 출시될 수 없습니다 (+12 테스트, 스위트 총 1969개).
[1.125.2] — 2026-07-22
수정
- Gemini 딥 리서치: HTTP 502(
MALFORMED_FUNCTION_CALL) (#145, @Alien10140 기여) — 라이브/api/deep프롬프트가 모델에게 “Use WebFetch / WebSearch”와 파일 저장을 지시했지만, 헤드리스 API 제공자에는 도구 채널이 없어 Gemini가 텍스트 대신 함수 호출로 응답했고, 이것이 빈 HTTP 502로 나타났습니다.buildDeepPrompt와bundleProjectContext에headless플래그가 추가되어, 라이브 실행(Anthropic/Gemini/폴백 캐스케이드)은 인라인된 컨텍스트만으로 브리프를 작성하는 도구 없는 프롬프트를 받고, Claude Code용 복사-붙여넣기 프롬프트는 도구 지시를 유지합니다.tests/critical-fixes.test.mjs에 테스트 +1.
변경
- 지원 종료된
gemini-2.0-flash를 넘어 Gemini 기본 모델 상향 (#144, @Alien10140 기여) — 설정 드롭다운,gemini.mjs의 서버 폴백(힌트와 조용히 어긋나 있던 값), OpenRouter 폴백 체인,config.geminiModelHint×17, 도움말 가이드 ×17이 모두gemini-3.6-flash를 가리킵니다. 새 드리프트 게이트tests/gemini-default-model.test.mjs(+5 테스트)가 모든 표면을 같은 리터럴로 고정합니다 — 스위트는 이제 1957 테스트입니다.
[1.125.1] — 2026-07-21
수정
- SuccessFactors: 멀티 브랜드 RMK 테넌트가 브랜드 경로 유지 (상위 #2099, v1.22.0 이후) — 하나의 공유 RMK 인스턴스에서 여러 인수 브랜드를 운영하는 지주회사는 경로 세그먼트로 브랜드를 구분합니다(
careers.nemetschek.com/Bluebeam/vs…/Vectorworks/). 어댑터는 이전에 설정된 URL을 origin으로 축소해버려, 상위 브랜드의 채용 공고만 조용히 스캔하고 있었습니다. 이제 엔드포인트는 브랜드 접두사를 보존하고 끝에 붙은/search/또는/tile-search-results/세그먼트만 제거하므로, 어떤 경우에도 스캔이 중복되지 않습니다. 단일 도메인 테넌트는 바이트 단위로 변경되지 않습니다. 새로 export된resolveTenantBase헬퍼 +tests/sources-successfactors.test.mjs에 이식된 테스트 블록 1개.
[1.125.0] — 2026-07-21
추가
- cvstart.org: “채용 공고 소스” 랜딩 섹션 — 스크린샷과 비교 목록 사이에 새로운 섹션이 추가되어, 스캔 소스 67개 전체를 클릭 가능한 칩(영어권 게시판/ATS 62개 + 별도 소제목으로 묶인 러시아어 게시판 5개)으로 나열하며, 각 칩은 해당 소스의 공개 사이트로 연결됩니다. 이 목록은 빌드 시점에 실제 어댑터 레지스트리(
sync-assets.mjs→facts.sources)에서 동기화되므로 앱과 절대 어긋날 수 없습니다.Sources.astro의 큐레이션된 링크 맵은 새로운tests/site-sources.test.mjs로 검증됩니다. 헤더 내비게이션에는 Sources 앵커가 추가되었고, 사이트 i18n 키 4개 × 17개 언어가 새로 생겼습니다. 또한 랜딩 페이지 JSON-LD의inLanguage목록에서 그동안 빠져 있던hi도 함께 수정했습니다.
[1.124.0] — 2026-07-21
추가
- 스캔 소스 5개 (상위 v1.22.0 패리티, #1808/#1572/#2024/#2055) — Welcome to the Jungle(보드 전체 JSON API), Agentic Engineering Jobs(에이전틱/AI 엔지니어링 보드), Jobvite(무인증 테넌트별 ATS), Gem(테넌트별 ATS), Alibaba Group(채용 JSON API, Meituan/Tencent 패턴)입니다. 각각 호스트 고정되고 CI 격리된 소스 + 어댑터 쌍이며, 레지스트리는 이제 **어댑터 67개(EN 62개 + RU 5개)**를 제공합니다.
#/scanSource 드롭다운 폴백과 드리프트 게이트가 갱신되었고, 다섯 개의 새로운 테스트 스위트tests/sources-{wttj,agenticjobs,jobvite,gem,alibaba}.test.mjs가 추가되었습니다.
수정
- Arbeitsagentur:
homeofficetyp이VOLLSTAENDIG일 때만 전국 원격으로 판정 (상위 #1981) —homeoffice=nv_true쿼리는 하이브리드 직무도 함께 반환하므로, 이제 원격 판정 단계가 작은 배치 단위로 각 결과를 채용 상세 엔드포인트에 대조 확인하며 실패 시 안전하게 닫힙니다(조회 오류가 나면 채용의 실제 도시를 유지하여 위치 필터가 계속 적용되도록 합니다). - SmartRecruiters: 공개 채용 URL이
/postings/없이 생성되던 문제 수정 (상위 #2047) — 공개 사이트에서 해당 경로 세그먼트가 빠지는 테넌트의 경우, 링크가 404 대신 공개 채용 공고 페이지로 정상 연결됩니다.
비고
- 상위 v1.22.0은 웹 UI가 셸아웃하지 않거나 이미 커버하고 있는 CLI 측 변경 사항도 함께 배포했습니다: zh-CN CV 템플릿 + PDF 타이포그래피,
/expand모드, 프로바이더 프롬프트 캐시 조정(Gemini/OpenAI/Ollama), 스텝별 토큰 분석(웹 UI는 자체 사용량 미터를 보유), 트래커 writer-lock 직렬화(웹 UI는 v1.21부터withFileLock을 통해 쓰기를 라우팅), 스캔visa_filter+ 절대 게시일 CLI 플래그(웹 UI는 자체 “게시 기간” 나이 필터를 보유), seen-sources 중복 제거 시딩(웹 UI 스캐너는 자체 scan-history 중복 제거를 유지)입니다.
[1.123.0] — 2026-07-17
추가
- Oracle Recruiting Cloud 스캔 소스 (상위 v1.21.0 패리티, #1929) — Oracle Fusion/ORC 채용 사이트(JPMorgan Chase, Oracle, BNY Mellon, American Express, Honeywell 등)의 무인증
recruitingCEJobRequisitionsREST API입니다:*.fa[.<region>][.ocs].oraclecloud.com에 호스트 고정되며, 사이트 번호는 추적 중인 각 회사의careers_url에서 추출되고, 오프셋 페이지네이션에는 하드 페이지 상한이 적용되며, WAF를 우회하는 브라우저형 헤더를 사용합니다. 레지스트리는 이제 **어댑터 62개(영어 57개 + 러시아어 5개)**를 제공합니다.#/scanSource 드롭다운 폴백과 드리프트 게이트가 갱신되었고, 새로운 CI 격리 테스트 스위트tests/sources-oraclecloud.test.mjs가 추가되었습니다.
수정
- 리포스트 감지기: 기본 제목이 전문화 접미사가 붙은 유사 공고와 구분되도록 수정 (상위 #1922) — “Senior Analytics Engineer”가 더 이상 “Senior Analytics Engineer, People Analytics”와 하나로 묶이지 않습니다: 한 제목의 토큰이 다른 제목 토큰의 진부분집합이고 추가된 토큰이 (기본 단어가 아닌) 실제 전문화 표현일 경우, 두 공고는 별개로 게시 가능한 채용 건으로 취급됩니다. 리포스트 표기(“(Repost)”, “relisted”)는 이제 의미 없는 메타 노이즈로 불용어 처리됩니다.
tests/detect-reposts.test.mjs에 검증 2건이 추가되었습니다.
비고
- 상위 v1.21.0은 웹 UI가 셸아웃하지 않거나 이미 커버하고 있는 CLI 측 변경 사항도 함께 배포했습니다: 반복 지원 회사 재지원 경고(웹 UI는 v1.84.0부터 재지원 쿨다운을 보유), 커버레터
--format/--report플래그, 인터뷰 red-flag/패널 인텔/노쇼 이메일 프롬프트 모드, 스캔 신뢰 신호 및 포털 상태 영속화(웹 UI는trust-validator와 함께 자체 인프로세스 스캐너와 Portals health 페이지를 운영), 그리고 통계/급여 격차 확장(읽기 전용·페일소프트 방식으로 중계).
[1.122.0] — 2026-07-16
추가
- 힌디어(हिन्दी) — 17번째 언어 — 전체 UI 사전(약 1,110개 키), 인앱 도움말 가이드 전체(29개 H2 / 105개 H3 패리티),
README.hi.md, 새CHANGELOG.hi.md(de/it/tr 선례를 따라 v1.122.0부터 시작), cvstart.org 랜딩 + 방법론/라이선스/체인지로그/도움말 페이지, 언어 전환기(🇮🇳), 브라우저 언어 자동 감지, 그리고 현지화된 대시보드 스크린샷까지 모두 추가되었습니다. 이제 모든 ×16 패리티 게이트가 ×17로 실행됩니다: i18n 사전 패리티 + 스냅샷, 도움말 H2/H3 게이트, CHANGELOG 패리티, 사이트check-i18n, 그리고 Playwright 로케일 스윕까지.
[1.121.0] — 2026-07-16
추가
- cvstart.org: 방법론, 라이선스, 체인지로그 페이지 — 랜딩이 기존 Compare 블록 옆에 16개 언어 전체로 세 개의 새 섹션을 추가했습니다: /methodology/(6차원 0.0–5.0 채점 루브릭, 4.0 지원 임계값, 그리고 절대 하지 않는 규칙들 — career-ops.org/methodology를 현지화하여 요약), /license/(NOTICE.md 포인터가 포함된 정식 MIT 전문), /changelog/(이 파일을 저장소의 번역된 16개 CHANGELOG로부터 로케일별로 렌더링). 새 헤더 Methodology 항목과 푸터 리소스 링크가 추가되었고,
sync-assets.mjs가 이제 빌드 시점에 CHANGELOG ×16과 LICENSE를 사이트로 동기화하므로 페이지가 저장소와 어긋날 일이 없습니다. - 문서 전반의 방법론 링크 — README(16개 전체), 인앱 도움말 가이드 §1 정식 레퍼런스 목록(16개 전체), 위키가 이제 기존 career-ops.org/docs 가이드와 나란히 career-ops.org/methodology를 링크합니다(FAQ와 용어집도 포함).
변경
- README 릴리스 배너와 배지를 새로 고쳤습니다(테스트 1850개, 릴리스 v1.121.0) — 배너가 여전히 v1.119.5를 알리고 있었습니다.
[1.120.0] — 2026-07-16
추가
- CareerOps 선언문 (부모 v1.20.0 패리티) — 상위 프로젝트가 CareerOps 선언문(
MANIFESTO.md· career-ops.org/manifesto)을 출시하고, 이제 자신의 README·업데이터·Go 대시보드에서 이를 안내합니다. 웹 UI도 이를 뒤따릅니다: 사이드바 푸터의 새 링크가 선언문 페이지를 열고(16개 로케일 전체에 새 i18n 키footer.manifesto추가), 인앱 도움말 가이드는 16개 언어 전체에서 §29 «CareerOps 선언문»이 추가되었으며, README는 선언문이 무엇이고 어떻게 서명하는지 설명하고, cvstart.org 랜딩 푸터도 이를 링크합니다.
비고
- 부모 v1.20.0은
upskill타깃 모드의 기존 스킬 억제 문제도 수정했고,scan --json의 표준 출력이 계속 파싱 가능하도록 dotenv를 조용히 처리했으며, 역할 제목이 항목과 분리되지 않도록 HTML CV 템플릿을 수정했습니다 — 모두 웹 UI가 셸을 통해 호출하지 않는 CLI 측 동작이므로, 웹 UI 코드 변경은 필요하지 않았습니다.
[1.119.5] — 2026-07-13
수정
- 랜딩의 언어 버튼이 더 이상 줄바꿈되지 않습니다 — v1.119.2의 국기 추가로 헤더 전환기 레이블(예: «🇷🇺 Русский»)이 좁은 데스크톱 폭에서 최대 세 줄로 깨질 수 있었습니다. 전환기 레이블과 드롭다운의 모든 옵션에
whitespace-nowrap을 적용해 국기 + 언어명이 항상 한 줄에 유지됩니다. 푸터의 언어 목록은 고정 2열 그리드에서 한 줄 항목이 감싸며 배치되는 행으로 바뀌어 «🇧🇷 Português (Brasil)»도 더 이상 이름 중간에서 갈라지지 않습니다.
[1.119.4] — 2026-07-13
변경
- LICENSE에 작성자 명시 — 저작권 줄이 이제 Sergei Emelianov (Fighter90) https://sergey-cv.com and career-ops-ui contributors입니다(MIT 정식 본문은 그대로). 새 NOTICE.md가 라이선스를 상세히 설명합니다: 저작권 보유자, MIT 허가가 정확히 무엇을 포함하는지(코드, 문서, 번역, 랜딩, 위키), 무엇을 포함하지 않는지(런타임의 사용자 데이터, 부모 프로젝트, 채용 보드 콘텐츠, 상표), 서드파티 구성 요소 표(express/js-yaml — MIT; Astro/Tailwind — MIT; Figtree·JetBrains Mono 글꼴 — SIL OFL 1.1; sharp — Apache-2.0), 선택적 저작자 표시 문구.
[1.119.3] — 2026-07-13
추가
- SECURITY.md — CONTRIBUTING이 가리키던 보안 정책이 이제 실제로 존재합니다: 지원 버전, 비공개 신고 절차(저장소에 GitHub private vulnerability reporting 활성화 — Security 탭 → «Report a vulnerability»), localhost 바인딩 단일 사용자 앱의 위협 모델(범위 내: 적대적 공고를 통한 XSS / SSRF / 경로 순회 / 시크릿 유출 / CSP 약화; 범위 외: 자신의 localhost에 대한 DoS 및 부모 프로젝트 문제), 리뷰어를 위한 하드닝 기준선.
[1.119.2] — 2026-07-13
추가
- CONTRIBUTING.md — 랜딩과 README가 줄곧 링크해 온 기여자 가이드가 이제 실제로 존재합니다: 설치, 프로젝트 맵, 엄격한 보안/노빌드 규칙, 테스트 계층, 스캔 소스 추가를 위한 «두 레지스트리» 워크스루, ×16 i18n 계약, 커밋/PR 규약, 릴리스 프로세스.
- 랜딩의 언어 국기 — cvstart.org의 언어 전환기, 푸터의 언어 그리드, «당신의 언어로 읽기» 배너가 이제 각 로케일의 국기를 엔도님 옆에 표시합니다(앱의 언어
<select>와 같은 지역 지시자 세트; 국기 글리프가 없는 곳에서는 지역 문자로 대체). - 랜딩 푸터 수정 — 저장소에서 기능이 비활성화되어 죽어 있던 Discussions 링크가 이제 프로젝트 위키를 가리키며, 푸터에 작성자 크레딧이 추가되었습니다: Sergei Emelianov(sergey-cv.com · LinkedIn).
[1.119.1] — 2026-07-13
수정
#/scan소스 필터가 레지스트리를 따라잡았습니다 — Source 드롭다운 뒤의 정적FALLBACK_SOURCES목록(GET /api/scan/sources에 접근할 수 없을 때만 사용)이 v1.87.0 이후 조용히 뒤처져 있었습니다: 오프라인 폴백에 20개 프로바이더(Amazon, Avature, SAP SuccessFactors, Get on Board, Dassault Systèmes, beesite, HigherEdJobs, JibeApply (iCIMS), softgarden, Cornerstone, Phenom, Radancy, Deutsche Bahn, EchoJobs, TKMS, Heckler & Koch, Rheinmetall, LaraJobs, 그리고 새 Meituan / Tencent)가 빠져 있었습니다. 전체 61개와 동기화했고, 클라이언트 목록이 서버 레지스트리와 어긋나면 CI를 실패시키는 드리프트 테스트(값과 레이블 모두)로 보호됩니다. +1 테스트(1845).
[1.119.0] — 2026-07-13
부모 career-ops v1.19.0 패리티 + cvstart.org 랜딩 새 단장.
추가
- 2개의 새 스캔 프로바이더 — Meituan(
zhaopin.meituan.com)과 Tencent(careers.tencent.com): 중국 테크 보드의 인증 불필요 공개 JSON API. 호스트로 자동 감지되거나 명시적provider:로 선택되며, 키워드별 서버 사이드 검색·페이지네이션·URL 중복 제거를 지원 — 이제 61개 어댑터(영문 56 + 러시아어 5). +20개 테스트(1844). - 랜딩의 기여자 블록 — cvstart.org가 코드를 기여한 모든 사람의 아바타를 표시합니다(빌드 시 GitHub
/contributorsAPI, 봇 필터링). 16개 언어 모두 현지화되었고 전체 기여자 그래프 링크가 포함됩니다. - 랜딩의 실시간 GitHub 스타 카운터 — 헤더 배지가 이제 방문할 때마다 클라이언트에서 GitHub API로 갱신됩니다(빌드 시 스냅샷은 폴백). 주간 예약 Pages 재빌드가 스냅샷과 기여자 목록을 신선하게 유지하며, CI의 API 호출은 토큰 인증을 사용합니다.
수정
- Workday CXS 요청에 브라우저형 헤더 적용(부모 #1813) — Cloudflare 뒤의 테넌트(실사례: geico)는 일반적인 UA/
accept-language/origin/referer가 없는 요청에 500을 반환합니다. 페처가 이제 CXS URL 자체에서 origin과 사이트 슬러그를 도출합니다. Glints 요청에도 같은 브라우저 UA + origin/referer가 추가되었으며, 둘 다http-json.mjs의 공유 상수BROWSER_LIKE_USER_AGENT에서 가져옵니다.
[1.118.4] — 2026-07-10
수정
- 러시아 IP에서 hh.ru 스캔이 0건을 반환하던 문제(지역 서브도메인 링크) — 러시아 가정용 IP에서 hh.ru는 검색을 지역 서브도메인(
sochi.hh.ru,spb.hh.ru등)으로 302 리디렉션하고 채용 링크를 해당 서브도메인으로 반환합니다. 파서는 제목 링크를 고정 호스트https://hh.ru/vacancy/에서 찾았고 지역 링크와는 하나도 일치하지 않아, 완전히 작동하는 스캔이 조용히 0건을 기록했습니다. 이제 임의의*.hh.ru호스트를 허용하고(adsrv.hh.ru/click?…광고는 계속 제외 —/vacancy/<id>경로가 없음), 각 결과 URL을https://hh.ru/vacancy/<id>로 정규화합니다. 실시간 검증: 이전에 0건이던sochi.hh.ru페이지에서 17개의 실제 채용이 파싱됩니다. +1 테스트(1824).
[1.118.3] — 2026-07-10
수정
- hh.ru가 오류 없이 0건을 반환하던 문제(VPN 확인 중간 페이지) — hh.ru는 이제 VPN/프록시로 판단한 네트워크(데이터센터 IP)를
/vpncheeck중간 페이지(“VPN мешает работе сайта”)로 302 리디렉션하며, 이 페이지는 채용 카드가 하나도 없는 HTTP 200으로 응답하므로 스캔이 아무 오류 없이 0건을 보고했습니다. 스캐너는 이제 응답의 최종 URL로 리디렉션을 감지하고, 남은 실행 동안 hh.ru를 비활성화하며, 정직한 힌트를 출력합니다: 트래픽이 실제로 가정용 IP로 나가야 합니다 — 브라우저 토글을 꺼도 시스템 전역 VPN/프록시는 계속 켜져 있을 수 있습니다. +1 테스트(1823).
[1.118.2] — 2026-07-10
유지보수
- 랜딩 후속 작업(#118) —
site/README.md를 Astro 7(#116의 보안 업그레이드)에 맞게 정리하고, 미사용 import를 제거했으며, 랜딩 빌드 스크립트용 실행 가능한 가드 4개 추가: i18n 패리티 게이트가 깨진 사전에서 실제로 실패함을 증명하고sync-assets는site/밖에 절대 쓰지 않습니다 — 스위트 1822. CodeQL 경고 2건 해결(1건 소스 수정, 1건 의도된 빌드 동작으로 기각).
[1.118.1] — 2026-07-10
수정
- 러시아 밖에서의 hh.ru 스캔 — hh.ru가 이제 공개 검색 페이지에서 러시아 외 IP에 HTTP 451(지역 법적 차단)을 반환합니다. 스캐너는 451을 403과 동일하게 처리합니다: 첫 차단 후 남은 실행 동안 hh.ru를 비활성화하고 러시아 IP/VPN 출구를 안내하는 정직한 로그를 남겨, 남은 쿼리와 다른 RU 소스를 낭비하지 않습니다. 도움말 §7을 16개 언어로 갱신. 테스트 +1 (1818).
[1.118.0] — 2026-07-09
부모 career-ops v1.18.0 패리티 팩.
추가
- 9개의 새 스캔 프로바이더 — Cornerstone OnDemand (
csod), Phenom (phenom), Radancy (radancy), Deutsche Bahn (deutschebahn), EchoJobs (echojobs), TKMS (tkms), Heckler & Koch (hecklerkoch), Rheinmetall (rheinmetall), LaraJobs (larajobs) — 이제 어댑터 54개. Lever 어댑터는 EU 테넌시 보드(jobs.eu.lever.co)도 감지합니다. - 트래커
Hired상태 (부모states.yml패리티): 수락한 오퍼는 고유한 정식 상태, 축하 배지,#/tracker의 취업 성공 배너를 갖습니다. 퍼널과 전환 차트는 모든 단계를 통과한 것으로 계산합니다. #/stats의 누적 통계 탭 — 부모의stats.mjs(누적 트래커 집계, 누적 퍼널 비율, 스캐너 합계, 포털 커버리지)와salary-gap.mjs의 보상 관찰(희망 vs 공고 제시 vs 실제, 지원 건별)을 읽기 전용으로 중계합니다. 새 라우트GET /api/stats/lifetime및GET /api/stats/salary-gap— 제로 토큰 셸아웃, 부모 프로젝트가 없으면{available:false}로 안전하게 동작합니다.- 16개 로케일 전체에 28개의 새 i18n 키; 도움말 가이드 §14/§26을 모든 언어로 갱신.
테스트
- 유닛 테스트 +38개(프로바이더 패리티 스위트 3개 + 릴레이/상태 라우트) — 총 1817개.
[1.117.2] — 2026-07-06
패리티 셸-아웃의 빈 트래커 수정. 트래커에 아직 지원이 없으면 부모 스크립트가 코드 1과 구조화된 {error} JSON으로 종료합니다. 팔로업 보드와 거절 패턴 탭이 이를 “script-error”로 표시했습니다. 이제 두 라우트 모두 이를 건강한 빈 상태(available:true, empty:true)로 전달해 UI가 정직한 “아직 없음” 메시지를 보여줍니다. 실제 부모로 라이브 검증됨.
신규: 없음.
[1.117.1] — 2026-07-06
v1.117.0 하드닝 (CodeQL 분류). 세 개의 셸-아웃 엔드포인트(GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns)에 공유 per-IP 리미터를 적용했습니다(요청마다 자식 프로세스 생성; 루프백에서는 no-op). CV에 추가의 URL 텍스트 추출은 태그를 고정점까지 제거한 뒤 남은 </>를 모두 삭제합니다 — LLM 프롬프트 텍스트에 대한 증명 가능한 완전 정화. 유효 입력의 동작 변화 없음.
신규: 없음.
[1.117.0] — 2026-07-06
부모 패리티 팩 — 부모 career-ops의 여섯 가지 기능을 UI로. (1) #/followup의 팔로업 케이던스 보드: followup-cadence.mjs의 지원별 긴급도(🔴/🟠/🟡/🔵) + 팔로업 날짜 시드 버튼(followup-seed.mjs --backfill). (2) 거절 패턴: 통계의 네 번째 탭이 analyze-patterns.mjs(읽기 전용)를 실행 — 결과 분포, 추천, ATS 벤더별 진전율. (3) CV에 추가: CV Studio 카드가 URL 또는 붙여넣은 텍스트를 그 출처에만 근거한 ATS 불릿으로 변환(제안만, 쓰기 없음; URL 페치는 SSRF 보호). (4) 새 스캔 프로바이더 4개 — beesite, HigherEdJobs(RSS), JibeApply(iCIMS), softgarden — 레지스트리는 이제 50개 어댑터(45 EN + 5 RU), 모두 Scan 드롭다운에 표시. (5) Apply 체크리스트에 탈락 요건 사전 스캔 단계. (6) reconcile 러너(/api/run/reconcile). 셸-아웃 라우트는 부모 스크립트가 없으면 정직하게 “사용 불가”를 표시.
- 새 라우트 모듈
server/lib/routes/followup.mjs(31번째) + 새 라우트 + 소스/어댑터 8파일. 테스트: 6 + 7 추가; 스위트 1737 → 1750. 새 i18n 키 41개 ×16. 도움말 §13/§17/§24/§26 ×16 확장.
신규: GET /api/followup, POST /api/followup/seed, GET /api/stats/patterns, POST /api/cv-studio/add-entry, POST /api/run/reconcile.
[1.116.0] — 2026-07-06
사용량 미터 재작업 + 첫 엔드투엔드 위젯 테스트. AI 사용량 미터(v1.114.0)를 제대로 고정했습니다: 이제 왼쪽 사이드바 하단에 고정되고(사이드바 전체 너비, 동일한 표면) 자신의 높이만큼 사이드바 하단에 여백을 두어 메뉴가 절대 가려지지 않습니다 — 내비게이션과 버전 푸터는 항상 그 위로 스크롤됩니다. 실시간으로 갱신되며(15초 간격 + 탭 포커스 + 라우트 변경), 각 창 행은 항상 100%인 “비율” 대신 실제 <토큰> · <예상 비용>(막대는 30일 창 기준)을 표시합니다. 또한 CV 임포터의 지속적인 typeof 방벽이 반복되는 CodeQL 타입 혼동 오탐을 근본에서 닫고, 새 Playwright 엔드투엔드 테스트가 두 상주 위젯을 실제 브라우저에서 검증합니다.
public/js/lib/usage-hud.js+app.css,server/lib/cv-import.mjs. 테스트:tests/playwright-widgets.mjs(2 E2E) +tests/usage-hud.test.mjs(10). 도움말 §6 ×16 확장.
신규: 없음.
[1.115.0] — 2026-07-06
디자인 다듬기(보수적, 코럴 브랜드 유지). 공유 디자인 시스템에 대한 가벼운 정제 패스 — 구조 변경 없음, 팔레트 변경 없음. 대시보드 지표 카드가 이제 호버 시 살짝 떠오르며 코럴 테두리를 띱니다(빠른 작업 타일과 동일). 콘텐츠 카드도 약간 떠오릅니다. primary / dark / danger 버튼은 정지 그림자와 부드러운 호버 리프트로 입체감을 얻습니다. 큰 숫자는 tabular-nums로 정렬됩니다. 상호작용 컨트롤은 2px 키보드 링 뒤에 부드러운 코럴 포커스 헤일로를 받습니다. 모든 모션은 prefers-reduced-motion을 존중하며, 헤일로는 컨트롤로 한정됩니다 — 전역 *:focus-visible은 아닙니다.
- CSS 전용(
public/css/app.css); 마크업·i18n·라우트·CSP 변경 없음. 테스트:tests/design-polish-v1115.test.mjs(5). Playwright로 라이브 검증.
신규: 없음.
[1.114.0] — 2026-07-06
사이드바의 AI 사용량 및 비용 미터(왼쪽 아래). 컴팩트한 사용량 섹션이 이제 모든 페이지의 사이드바 하단에 표시됩니다(사이드바가 없으면 왼쪽 아래 고정 카드, RTL에서는 오른쪽 아래). 24시간 / 7일 / 30일 창별 LLM 토큰 사용량을 <토큰> · <비율%>로(전체 기간 대비 비율) 녹색 미터 바와 함께 보여주고, 24시간 예상 비용 푸터를 더합니다. 데이터는 data/llm-usage.jsonl의 읽기 전용 GET /api/usage 집계(로컬 전용)로 #/usage 페이지와 동일한 소스입니다. 비용은 추정치이며 수동 모드 실행은 무료이고 집계되지 않습니다. 접을 수 있음 — 헤더로 토글하며 상태가 유지됩니다.
- 새 클라이언트 위젯
public/js/lib/usage-hud.js를index.html에서 로드, 버전 푸터 위 사이드바에 마운트(고정 코너 폴백). CSP 안전; 테마 대응 + RTL 미러. 새 서버 라우트 없음. 테스트:tests/usage-hud.test.mjs(8). 새 i18n 키 3개 ×16.
신규: 없음.
[1.113.0] — 2026-07-06
모든 페이지에 떠 있는 “도움말에 질문하기” 어시스턴트. 그라데이션 로봇 채팅 버튼이 이제 모든 페이지의 오른쪽 아래 모서리(RTL에서는 왼쪽 아래)에 떠 있습니다. 클릭하면 당신의 언어로 된 인앱 도움말 가이드에서만 근거를 두고 사용법 질문에 답하는 소형 채팅이 열립니다 — #/docs-assistant 페이지와 동일한 엔드포인트(POST /api/docs-assistant/ask)이므로 CV·프로필·트래커를 읽지 않습니다. LLM 키가 있으면 실시간, 없으면 바로 실행 가능한 프롬프트. 헤더에는 로봇 아바타 + 온라인 상태; 시작 칩으로 자주 묻는 질문을 채우고; Esc 또는 바깥 클릭으로 닫히며; #/docs-assistant 페이지에서는 숨겨집니다.
- 새 클라이언트 위젯
public/js/lib/docs-fab.js를index.html에서 전역 마운트; CSP 안전;app.css에 테마 대응 + RTL 미러 스타일. 새 서버 라우트 없음. 테스트:tests/docs-fab.test.mjs(8). 새 i18n 키 6개 ×16. 도움말 §1 현 위치 확장.
신규: 없음.
[1.112.0] — 2026-07-06
문서 및 QA 통합. 사용자 표시 코드 변경 없음. SDD 규약 문서(docs/sdd/CONVENTIONS.md)를 현재 30개 라우트 모듈(이전 24개)과 현재 테스트 기준선으로 갱신했고, 전체 프로젝트 확정 QA 프롬프트(qa/QA-REGRESSION-PROMPT.md)를 통합했습니다 — 릴리스 절차 최신화(v1.111, parentVersion 1.17.0, 릴리스 트리거 배포), §14 추가 표 수정(Scan 제외를 v1.109.0으로 재라벨) 및 v1.111 CodeQL 정리 추가 — 그래서 모든 기능에 대한 단일 회귀 프롬프트로 단독 성립합니다. 초과 업로드 분기에 대한 커버리지 테스트 1개 추가.
신규: 없음.
[1.111.0] — 2026-07-06
보안 — CodeQL 백로그 정리. 남은 정적 분석 지적을 무시(dismiss)하는 대신 근본 원인에서 닫는 심층 방어 강화 3건. stripDangerousMarkdown는 이제 잘린 위험 태그 여는 부분(<script/<iframe/… 로 끝나는 페이로드)의 <를 이스케이프하여, 출력에 살아 있는 위험 태그가 존재할 수 없음을 보장합니다. CV 가져오기는 업로드된 버퍼 크기를 명시적 Number() 강제 변환으로 읽습니다 — 타입 혼동 방벽. 모드 역할 줄은 저장된 함수 대신 String.replace로 보간되는 템플릿 문자열이 되어 동적 디스패치 호출을 완전히 제거했습니다. 사용자 표시 동작 변화 없음.
server/lib/security.mjs,server/lib/cv-import.mjs,server/lib/prompts.mjs. 테스트:tests/security-hardening-v1111.test.mjs(7) + v1108 가드 테스트 갱신. i18n/도움말/라우트 변경 없음.
신규: 없음.
[1.110.0] — 2026-07-06
문서 및 QA 갱신(모든 언어). 코드 변경 없음. 전체 프로젝트 QA 프롬프트가 v1.109.0으로 갱신되며 v1.98→v1.109을 다루는 새 §14가 추가되고, UX 감사 및 디자인 내보내기 프롬프트가 현재 화면 목록을 반영합니다. v1.100–v1.109에서 추가된 모든 도움말 단락이 이제 16개 언어 전부로 번역되었습니다.
신규: 없음.
[1.109.0] — 2026-07-06
Scan 제외 필터 + 파이프라인 개요(웹 레이아웃 패리티). #/scan에서 검색 상자가 이제 쉼표를 OR로 취급하고(“찾을 역할”), 새 제외 필드는 회사/역할/위치에 쉼표로 구분된 단어(예: senior, staff)가 포함된 행을 숨깁니다. 둘 다 저장된 검색에 기억됩니다. #/pipeline에는 컴팩트 개요 스트립이 파이프라인을 한눈에 보여줍니다 — 받은함 N, 추적 N, 트래커의 Applied / Responded / Interview / Offer 수, 각 칩은 #/tracker로 연결됩니다.
- 클라이언트 전용(새 라우트/쓰기 없음).
public/js/views/scan.js+public/js/views/pipeline.js. 테스트:tests/scan-pipeline-ui-v1109.test.mjs(2). 새 i18n 키 4개 ×16. 도움말 §7 + §8 현 위치 확장.
신규: 없음.
[1.108.0] — 2026-07-06
보안 강화(CodeQL 분류 2차). 경미한 문제 세 건 추가 수정: 모드 프롬프트 빌더가 로케일 역할 줄을 **자체 키 + typeof === function**으로 해석해 조작된 로케일이 프로토타입 메서드로 디스패치하지 못하게 하고(unvalidated-dynamic-method-call); PDF 파일명 슬러그를 정규식 이전에 200자로 제한해 전부-하이픈 입력이 백트래킹하지 못하게 하며(다항 ReDoS); 문서 가져오기가 배열 filename(반복 헤더)을 문자열로 강제 변환합니다(type-confusion). 유효 입력에 대한 동작 변화 없음.
server/lib/prompts.mjs,server/lib/routes/runners.mjs,server/lib/cv-import.mjs+tests/security-hardening-v1108.test.mjs(3). v1.106–v1.108에 걸쳐 정적 분석 백로그가 167에서 ~14로 줄었고, 실제 보안 관련 문제는 모두 수정, 나머지(가드/새니타이즈된 오탐 + 노트 수준 린트)는 근거와 함께 기각.
신규: 없음.
[1.107.0] — 2026-07-06
새니타이저 강화(저장 시 XSS 심층 방어). stripDangerousMarkdown — 저장된 이력서/공고 마크다운의 위험한 HTML을 무력화해 렌더 시 이스케이프하는 클라이언트를 우회하는 소비자도 안전하게 함 — 이 이제 태그 제거를 고정점까지(변화가 없을 때까지 반복) 실행해 제거가 페이로드를 재구성하는 경우(예: <scr<script></script>ipt>)를 잡아내고, 뒤에 쓰레기가 붙은 script/style 등의 종료 태그(</script foo>)와 닫히지 않은 실행 오프너(<script …>)를 제거합니다. 유효한 마크다운의 동작은 변하지 않고 — 더 많이 제거할 뿐입니다.
server/lib/security.mjs: 고정점 루프(8회 제한) +[^>]*>종료 태그 패턴 + 미닫힘 오프너 제거.tests/cv-xss-bypasses.test.mjs에 회귀 케이스 +3. 권위 있는 XSS 경계는 여전히 출력 이스케이프(UI.md)이며, 이는 저장 보증을 강화하고 해당 CodeQL 발견을 해소합니다.
신규: 없음.
[1.106.0] — 2026-07-06
보안 강화(CodeQL 분류). 정적 분석 백로그를 훑어 실제(경미하지만) 문제 세 건을 수정했습니다: 라우트 렌더 오류 경로가 이제 오류 메시지를 DOM에 도달하기 전에 이스케이프하며(서버 오류가 사용자 입력을 반영할 수 있으므로 신뢰할 수 없는 것으로 취급 — XSS 경계), 프로필/설정의 속성 쓰기가 __proto__ / constructor / prototype 키를 거부합니다(만약을 위한 프로토타입 오염 방지 — 키는 고정 필드 스펙에서 오며 원시 요청 입력이 아님). 나머지 경고의 대부분은 스캐너의 정당한 data/* 읽기/쓰기와 이미 자체 제한기를 가진 라우트에 대한 오탐이며 근거와 함께 기각했습니다.
public/js/router.js는innerHTML이전에UI.escapeHtml로err.message를 이스케이프;server/lib/routes/content.mjs와server/lib/routes/config.mjs는 프로토타입 키를 방어합니다. 유효 입력에 대한 동작 변화 없음. 테스트:tests/security-hardening-v1106.test.mjs(3). 새 i18n 키 없음.
신규: 없음.
[1.105.0] — 2026-07-06
AI 사용량 및 비용 페이지. 새 AI 사용량 페이지(사이드바, 상태 옆)가 실시간 AI 생성 — 평가·리포트·채팅 — 에 쓴 토큰을 최근 24시간·7일·30일·전체 기간에 걸쳐 제공자별로 보여주며 예상 USD 비용을 함께 표시합니다. 모든 실시간 호출은 작은 {provider, in, out} 레코드를 data/llm-usage.jsonl에 추가합니다(어디로도 전송되지 않음). 키 없는 실행(수동 모드)은 비용이 없고 기록되지 않습니다.
- 새 라우트 모듈(30번째)
server/lib/routes/usage.mjs—GET /api/usage(읽기 전용 집계) +server/lib/llm-usage.mjs(recordUsage가 Anthropic/OpenAI/Gemini 사용량 형태를 정규화해 best-effort로 추가;readUsage/aggregate가 24h/7d/30d/전체 창 × 제공자로 집계) +server/lib/llm-pricing.mjs(편집 가능한 제공자별$/1M토큰 가격표 — 토큰은 정확하고 달러는 대략적 정가로 요금제에 맞게 수정 가능; 청구 안 됨). 기록은 디스패치 지점(runActiveProvider+routes/llm.mjs)에 연결됩니다. - 새 뷰
public/js/views/usage.js(#/usage, 기간 탭). 테스트:tests/usage-routes.test.mjs. 새 i18n 키 17개 ×16(usage.*+nav.usage). 도움말 §6 현 위치 확장.
신규: server/lib/routes/usage.mjs; server/lib/llm-usage.mjs; server/lib/llm-pricing.mjs; public/js/views/usage.js.
[1.104.0] — 2026-07-06
스캔 표의 회사 로고(개인정보 보호형). 앱 설정의 새 모양 토글 — 스캔 표에 회사 로고 표시(기본 꺼짐) — 이 #/scan에서 회사 이름 옆에 로고를 그립니다. 로고는 회사 자체 도메인에서 가져온 파비콘이며 서버에서 프록시됩니다(GET /api/logo). 따라서 어떤 제3자 로고 서비스도 당신이 어떤 고용주를 보는지 알지 못합니다. 공용 채용 보드(Greenhouse, Lever, Ashby 등)의 공고는 보드 아이콘 대신 색상 글자 배지를 표시하고, 로드에 실패한 로고도 같은 배지로 대체됩니다.
- 새 라우트 모듈(29번째)
server/lib/routes/logos.mjs—GET /api/logo?domain=. 도메인을 검증하고(스킴/경로/루프백 없음) SSRF 안전safeGet(새binary모드가 원시 바이트 + content-type 반환; DNS 고정·리다이렉트 검증·크기 제한 불변)로/favicon.ico를 가져오며, HTML 오류 페이지를 이미지로 제공하지 않도록 이미지 매직 스니핑을 하고, 적중 및 실패를 메모리 LRU에 캐시하며, 디스크에 아무것도 쓰지 않습니다. - 새 클라이언트 라이브러리
public/js/lib/company-logo.js(window.CompanyLogo): localStorage 플래그로 기본 꺼짐; 공용 ATS 호스트는 건너뛰고 결정적 글자 아바타 사용; CSP 안전img.onerror대체. 테스트:tests/logo-routes.test.mjs. 새 i18n 키 5개 ×16(appear.*). 도움말 §2 현 위치 확장.
신규: server/lib/routes/logos.mjs; public/js/lib/company-logo.js.
[1.103.0] — 2026-07-06
설정: “AI CLI 도구” — 무엇이 설치되어 있는지. career-ops는 Claude Code 기반이지만 개방형 스킬 표준의 모든 에이전트 CLI와 작동합니다. 앱 설정(#/config)의 새 AI CLI 도구 탭은 Claude Code, Codex, Gemini CLI, OpenCode, GitHub Copilot CLI, Qwen, Antigravity 중 서버를 실행하는 머신에 무엇이 설치되어 있고 경로가 어디인지 보여줍니다. 이는 읽기 전용 PATH 스캔입니다: 각 바이너리 존재 여부만 확인하고 절대 실행하지 않으며(--version 없음, 실행 없음), 아무것도 쓰지 않고 사용자 데이터를 건드리지 않습니다.
- 새 라우트 모듈(28번째)
server/lib/routes/cli-detect.mjs—GET /api/cli-detect. 감지는 고정된 7개 허용목록에서process.env.PATH를 통해 바이너리 경로를 확인합니다(Windows.cmd/.exe/.bat심; POSIX 실행 비트). PATH의 악성 파일은 이 라우트로 절대 실행될 수 없습니다. public/js/views/config.js의 새 “AI CLI 도구” 탭(지연 로드,#/config?tab=cli로 딥링크). 테스트:tests/cli-detect-routes.test.mjs. 새 i18n 키 8개 ×16(cli.*+config.tabCli). 도움말 §2 현 위치 확장.
신규: server/lib/routes/cli-detect.mjs.
[1.102.0] — 2026-07-05
“문서에 질문” — 앱 내 도움말 가이드에 근거한 채팅. 새 문서에 질문 💬 페이지(사이드바, 도움말 아래): “채용 포털은 어떻게 스캔하나요?” 같은 질문을 입력하면 당신의 언어로 된 앱 도움말 가이드에서만 답을 얻습니다 — 사용한 섹션을 보여주고 당신의 이력서·프로필·구직 활동은 절대 읽지 않습니다. 당신이 아니라 앱 사용법에 관한 것입니다. LLM 키가 있으면 실시간 답변, 없으면 관련 도움말 섹션이 이미 채워진 실행 가능한 프롬프트를 제공합니다.
- 새 라우트 모듈(27번째)
server/lib/routes/docs-assistant.mjs—POST /api/docs-assistant/ask. 의존성 없는 검색: 당신 언어의 도움말 문서를##섹션으로 나누고 질문과의 키워드 겹침으로 점수화 — 상위 섹션을 인라인하고 모델은 그로부터 답하거나 가이드가 다루지 않는다고 말합니다(기능/라우트 지어내기 없음). 공유 제공자 캐스케이드, 수동 대체, 속도 제한, 쓰기 없음, 사용자 데이터 읽지 않음. - 새 뷰
public/js/views/docs-assistant.js. 테스트:tests/docs-assistant-routes.test.mjs. 새 i18n 키 14개 ×16 (docs.*+nav.docsAssistant). 도움말 §1 현 위치 확장.
신규: server/lib/routes/docs-assistant.mjs; public/js/views/docs-assistant.js.
[1.101.0] — 2026-07-05
CV Studio: 특정 채용공고에 맞춰 이력서를 조정하고 커버레터를 작성 — 리크루터 체크리스트로 게이트. #/cv-studio에 새 채용공고에 맞춤 조정 카드: 채용공고(선택적으로 목표 직무/헤드라인)를 붙여넣으면 CV Studio가 그 공고에 맞춘 이력서와 어울리는 커버레터를 만들고, 넘겨주기 전에 둘 다 체크리스트 게이트에 통과시킵니다 — error는 차단(결과를 보기 전에 수정됨), warn은 권고. 이 메커니즘은 커리어 코칭 실무를 일반 규칙으로 증류한 것입니다 — 리크루터는 몇 초 안에 읽으므로 관련 경력은 위로, 헤드라인은 공고의 역할과 일치, 성과에는 구체적 수치, 커버레터는 “요구사항 ↔ 당신의 부합 사실” 하나의 브릿지를 담은 짧은 티저. 오직 당신의 이력서·프로필·투페이저에만 근거하며 절대 지어내지 않습니다 — 회사·역할·이력을 하드코딩하지 않습니다.
- 새 엔드포인트
POST /api/cv-studio/tailor(기존 cv-studio 모듈 확장 — 27번째 모듈 아님):buildTailorPrompt+ 일반TAILOR_INSTRUCTIONS게이트,bundleProjectContext기반, 공유 제공자 캐스케이드, 키 없으면 수동 프롬프트, 속도 제한, 쓰기 없음. 결과는 공유report-export.js바로 Markdown / PDF / DOCX 내보내기. - 테스트:
tests/cv-studio-routes.test.mjs에 +3. 새 i18n 키 10개 ×16(cvs.tailor*). 일반 참조docs/prompts/resume-cover.md. 도움말 §24 현 위치 확장.
신규: docs/prompts/resume-cover.md.
[1.100.0] — 2026-07-05
투페이저: 이력서 기반 AI 자동 채우기 + 미리보기 + PDF/DOCX/Markdown 내보내기. 투페이저(#/two-pager)는 다음 역할에서 진짜로 원하는 것을 담지만, 지금까지는 각 필드를 손으로 작성하거나 프롬프트를 다른 도구에 복사해야 했습니다. 이제 ✨ AI 채우기 도우미가 설정된 제공자로 실시간 실행됩니다 — 오직 이력서 + 프로필만 읽어(bundleProjectContext, 무엇도 지어내지 않음) 모든 필드(나는 누구 / 좋아하는 것 / 필수 조건 / 싫어하는 것 / 절대 불가 / 타협 불가 / 목표 환경)를 작성하고 폼을 채워 검토·수정·저장하도록 합니다. API 키가 없으면 예전처럼 프롬프트 복사 모달로 대체됩니다. 새 👁 미리보기 및 내보내기 버튼은 투페이저를 서식 있는 문서로 렌더링하고 .md 다운로드 / PDF로 저장 / DOCX로 저장 / 복사 바를 제공합니다.
- 의존성 없는
.docx내보내기. 새server/lib/docx.mjs가 최소하지만 유효한 Office Open XML.docx(네 개의 OOXML 파트를 DEFLATE ZIP으로, 항목별 CRC-32)를 생성합니다 — 새 런타임 의존성 없음(deps는express+js-yaml유지). 새 라우트POST /api/export/docx(server/lib/routes/export.mjs, 26번째 라우트 모듈; 무상태, 200 KB 제한, 쓰기·LLM·URL fetch 없음). 공유public/js/lib/report-export.js에 연결되어 시장 리포트, 커리어 플랜, 커리어 오리엔테이션 리포트에도 DOCX 내보내기가 추가됩니다. - 실시간 자동 채우기는 공유 제공자 캐스케이드(
runActiveProvider/providerAvailable)를 사용하며, 반환된 YAML은 파싱되어 제한된 투페이저 형태(parseYamlFields+normalizeTwoPager)로 강제 변환됩니다 — 알 수 없는 키 제거, 배열/문자열 제한. 수동 모드 유지. - 테스트:
tests/export-routes.test.mjs. 새 i18n 키 4개 ×16 (export.saveDocx,twoPager.preview,twoPager.aiFilling,twoPager.aiFilled).
신규: server/lib/docx.mjs; server/lib/routes/export.mjs.
[1.99.0] — 2026-07-05
포털 상태 페이지 (#/portals). 스캐너는 portals.yml의 회사 집합을 지켜봅니다. ATS 슬러그가 조용히 깨지면 그 고용주는 이후 모든 스캔에서 소리 없이 사라집니다. 새 Portals 페이지는 감시 중인 모든 회사를 나열하고, Check portal health를 누르면 DNS 고정 safeGet(SSRF 안전)로 각 careers_url을 탐침해 죽은 것(404 = 조용히 제외)을 표시합니다 — 읽기 전용. 또한 리뷰에 따라 v1.98.0 버그 리포터를 강화했습니다: 오류 링 버퍼가 이제 네트워크 fetch 실패를 포착하고, 스크러버가 라벨 없는 공급자 키를 가립니다.
신규: server/lib/routes/portals.mjs; public/js/views/portals.js.
[1.98.0] — 2026-07-05
인앱 버그 리포터 (상위 프로젝트 web-v0.2.0 웹과의 패리티). 알림 서랍의 🐞 Report a bug 버튼이 개인정보 하한선을 지키는 진단 스냅샷을 수집합니다 — 버전, 현재 화면, 브라우저, /api/health 점검 요약, 그리고 새 클라이언트 측 링 버퍼에서 가져온 최근 20개 오류 — 여기에 결정적 중복 제거 지문(co-web-<base36>)을 더하고, 정확한 Markdown을 검토하게 한 뒤 미리 채워진 GitHub 이슈를 엽니다. 자동으로 제출되는 것은 없으며, CV·프로필·답변·채용 URL·키를 절대 담지 않습니다. 새 라이브러리 logbuf.js + bug-report.js; 11개 i18n 키 ×16; tests/bug-report.test.mjs.
신규: public/js/lib/logbuf.js; public/js/lib/bug-report.js.
[1.97.1] — 2026-07-05
리뷰 기반 강화 및 문서 패리티(v1.97.0 후속). AI 리뷰 로그를 훑어보니 실제 수정 사항이 드러났습니다:
fit-score.js(스캔◎적합도 배지).salaryFloor()는 더 이상 연 단위 미만의 급여를 엉뚱한 연봉 하한으로 승격하지 않습니다 — “at least 500 EUR/day”, “$80/hr”, “6000 monthly” 는 이제 500k/80k 딜브레이커 대신null을 반환합니다. 국가 매칭이 이제 완전 단어 단위(\b…\b)여서 “Germany” 가 더 이상 형용사 “German”(또는 “Nigerian” 안의 “Nigeria”)에 매칭되어 잘못된 필수-조건-타지역 위반을 발생시키지 않습니다.tests/fit-score.test.mjs에 테스트 +3.- 문서 패리티. 이제 모든 현지화 README 가 16개 로케일 을 일관되게 표기합니다 — Help 행 개수/목록(×13)과 현지화 섹션 본문 + “모든 N개 파일에 키 추가” 노트(×8)가 여전히 v1.85 이전 개수(8/9)에 머물러 있었습니다. 인앱 도움말 §17 의 어댑터 개수는 16개 번들 전체에서 어댑터 46개 — 영어 41개 + 러시아어 5개 로 수정되었습니다.
적합도 배지 휴리스틱 외에 동작 변경 없음; 새 라우트, 키, i18n 추가 없음.
[1.97.0] — 2026-07-05
Dassault Systèmes 스캐너 소스 + 3방면 품질 정비.
- 새 스캔 소스 — Dassault Systèmes (상위 career-ops 패리티, #1498).
server/lib/sources/dassault.mjs+server/lib/portals/adapters/dassault.mjs는 상위 프로젝트의 제로 토큰 Exalead “카드 검색” 프로바이더(3ds.com/careers/jobs뒤의 공개 피드)를 그대로 옮깁니다. 단일 글로벌 엔드포인트이므로 프로바이더로 선택(provider: dassault)하거나3ds.com호스트에서 자동 감지되며,redirect:'error'와 함께www.3ds.com으로 SSRF 호스트 고정됩니다. XML 은 DOM 없이(<Hit>별<Meta>맵) 파싱되고, 도시/국가는 현지화된 카테고리 문자열에서 추출되며, 공고는 그 공개 URL 이*.3ds.com에 있을 때만 유지됩니다. 이제 레지스트리는 어댑터 46개(EN 41 + RU 5)를 제공합니다;ALL_ADAPTERS개수, 정렬된 id 및/api/scan/sourcesEN 집합 어서션이 40 → 41 로 상향되었습니다. 스위트tests/sources-dassault.test.mjs(10개 케이스). - 상위 프로젝트 견고성 수정 이식. Avature 파서는 이제 두 가지 라이브 테넌트 마크업 변형(위치 인덱스 접미사가 붙은
article--result+ 클래스 없는 JobDetail 제목 앵커, #1541)을 허용합니다; Get on Board 는0/음수published_at을 방어합니다(더 이상 잘못된 1970 날짜 없음); SuccessFactors 는 마지막 페이지를 상한 처리하여MAX_JOBS를 초과할 수 없게 합니다(#1528). - 서버 감사 수정.
safe-fetch는 더 이상 상한 초과 응답에서 멈추지 않습니다 — 크기 상한 경로가 이제 파괴된 스트림이 결코 발생시키지 않는'end'이벤트를 기다리는 대신 프로미스를 직접 해결합니다(대용량 페이지/api/pipeline/preview+ 자동 파이프라인 페치 수정). SSEstream.*활동 로깅이 다시 도달 가능합니다(/api/stream/검사가 포괄적인 “GET 건너뛰기” 가드 위로 이동됨). - SPA 감사 수정.
#/stats탭 스위처가 비동기 렌더 경쟁을 방어합니다 — 느린 탭의 결과가 사용자가 이미 전환한 더 새로운 탭을 더 이상 덮어쓸 수 없습니다. mock interview 와 네트워킹 삭제 확인 대화상자는 이제 적절한 제목 + 본문을 전달합니다(더 이상 본문이 빈 대화상자 없음). - 번역 수정. 번역되지 않은 사전 값 수정 — 우크라이나어
config.modes*(Adaptive Framing / Exit Narrative / Location Policy), 러시아어eval.jdLbl(“Job Description”), 이탈리아어dash.quick.contactoSub(“referral” → “segnalazione”) — 그리고 ru/uk/ja/ko/zh-CN/zh-TW CHANGELOG 에서 영어 16개 로케일 상용구를 현지화했습니다.
신규: server/lib/sources/dassault.mjs; server/lib/portals/adapters/dassault.mjs.
[1.96.0] — 2026-07-04
커리어 방향성 (Epic 27). 새로운 #/orientation 페이지는 “어떤 방향이 실제로 나에게 맞을까?“라는 질문에 답합니다 — 직업 적성 검사에서 얻을 법한 통찰이지만, 설문지가 아니라 당신 자신의 CV와 프로필에서 추론합니다. 프로필 생성을 클릭하면 모델은 당신의 가장 잘 맞는 커리어 벡터(여덟 가지 원형 — 기능주의자, 관리자, 소통가, 전문가, 분석가, 혁신가, 매니저, 기업가 — 중 어느 것이 맞는지, 근거와 함께), 커리어 유형 성향, 추천 직무, CV에 연결된 직업적 강점, 업무 스타일 경향, 그리고 개발 권장 사항을 반환합니다. 이는 당신의 CV가 어떻게 읽히는지에 대한 AI의 성찰이며 — 심리 검사가 아닙니다: 성취를 지어내지 않으며 수치 점수를 마치 측정된 것처럼 보고하지 않습니다. Markdown이나 PDF로 내보내세요; 디스크에는 아무것도 기록되지 않습니다.
- 새 라우트
server/lib/routes/orientation.mjs(24번째 라우트 모듈) —POST /api/orientation/generate는 공유 프로바이더 캐스케이드를 통해 CV+프로필+투페이저+메모리로부터 프로필 프롬프트를 구성하며, 복사·붙여넣기 수동 대체와 파일 쓰기 없음을 제공합니다. - Growth 내비게이션 그룹 아래에서 Markdown/PDF/복사를 위해
report-export.js를 재사용합니다. - 테스트:
tests/orientation-routes.test.mjs(성찰 프레이밍 / 조작된 점수 없음, CV/프로필 시드 수동 모드). 새 i18n 키 7개 ×16 로케일, 도움말 §28 ×16.
신규: #/orientation; server/lib/routes/orientation.mjs.
[1.95.0] — 2026-07-04
커리어 플랜 (Epic 26). 새로운 #/career-plan 페이지는 당신의 CV와 프로필을 구체적이고 개인화된 성장 계획으로 바꿉니다. 기간(6/12/24개월)과 선택적 포커스를 고르면, 모델은 — 당신의 CV, 프로필, two-pager, 메모를 읽고 — 출발점 스냅샷, 강점/성장 SWOT, SMART / OKR / WOOP로 된 목표, 대안 경로, 하드/소프트 스킬 계획, 월별 로드맵, 진행 추적 방법, 함정, 그리고 지원 방안을 작성합니다. 당신의 자료가 실제로 보여주는 것에서부터 앞을 계획하며, 당신의 이력에 관한 사실을 결코 지어내지 않습니다. 인라인으로 편집하고, 사용자 레이어(config/career-plan.md)에 저장하며, Markdown이나 PDF로 내보낼 수 있습니다.
- 새로운 라우트
server/lib/routes/career-plan.mjs(23번째 라우트 모듈) —GET/PUT /api/career-plan(config/career-plan.md에 쓰기) +POST /api/career-plan/generate(공유 제공자 캐스케이드, 수동 대체, 날조 없음).PATHS.careerPlan. - 공유 헬퍼
report-export.js(v1.94.0)를 Markdown/PDF/복사에 재사용하고, 새로운 성장 내비게이션 그룹을 추가. - 테스트:
tests/career-plan-routes.test.mjs(경계, GET/PUT 왕복, 기간을 반영한 CV/프로필로 시드된 프롬프트). 16개 로케일 전체에 20개의 새 i18n 키, 도움말 §27 16개 전체.
신규: #/career-plan; server/lib/routes/career-plan.mjs; PATHS.careerPlan.
[1.94.0] — 2026-07-04
통계, 재구성 (Epic 25). #/stats 페이지는 이제 실제 그래프와 훨씬 더 많은 데이터를 갖춘 세 개의 탭으로 된 통계 섹션입니다. 새로운 시장 리포트 탭은 당신이 선택한 지역과 통화로 당신의 타깃 직무에 대한 급여 및 노동 시장 분석을 모델에게 요청합니다 — 경영진 요약, P10/P25/P75/P90 백분위가 딸린 등급별 급여, 상위 고용주, 수요가 많은 스킬 테이블, 복리후생 빈도, 사무실/하이브리드/원격 비율, 12–24개월 추세, 그리고 협상 가이드. 모든 수치는 스크레이핑한 데이터가 아니라 모델 지식에 기반한 방향성 추정치로 표기됩니다. 새로운 내 파이프라인 탭은 당신 자신의 트래커를 차트로 보여줍니다: 점수 분포, 상태 퍼널, 상위 회사와 직무, 시간에 따른 지원, 그리고 전환율. 원래의 타깃 직무 뷰(국가별 공고/급여 + 저장된 스냅샷 추세)는 세 번째 탭으로 이동하며, 이제 통화 선택기와 직무별 공고 개요를 갖춥니다.
- 어떤 리포트든 내보내기 — 공유 헬퍼
report-export.js를 통해 Markdown이나 PDF로 내보내거나 복사합니다(Markdown blob 다운로드; PDF는 기존 인라인 PDF 러너를 통해). - 새로운 라우트
server/lib/routes/market.mjs(22번째 라우트 모듈) —POST /api/stats/market은 당신의 CV/프로필(그래서 당신의 타깃 직무를 알고 있음), 지역, 통화로부터 시장 분석 프롬프트를 구성하고, 공유 제공자 캐스케이드를 통해 실행하며, 키가 없으면 복사-붙여넣기용 프롬프트로 대체합니다. 디스크 쓰기 없음. - 테스트:
tests/market-routes.test.mjs(지역/통화 경계, 정직성 표기 프롬프트, CV/프로필로 시드된 수동 모드). 16개 로케일 전체에 36개의 새 i18n 키, 도움말 §26 16개 전체.
신규: 탭으로 재구성된 #/stats; server/lib/routes/market.mjs; public/js/lib/report-export.js.
[1.93.0] — 2026-07-04
메모리 레이어 (Epic 24). 새로운 #/memory 페이지는 어시스턴트가 모든 작업에서 염두에 두는 짧고 편집 가능한 “나에 대해 이걸 기억해 줘” 메모를 담습니다:
- 하나의 메모, 어디에서나 —
bundleProjectContext에 인라인으로 삽입되므로, 이 메모는 모든 제공자에 걸친 모든 AI 요청(평가, mock interview, 네트워킹, CV Studio)에 자동으로 도달합니다. 한 번만 작성하면 모든 것을 이끕니다. - 사실이 아니라 조향 — 당신의 선호와 일하는 방식(어조, 형식, deal-breakers, 주기)을 담을 뿐, 당신의 경력에 대한 새로운 사실 주장은 절대 담지 않습니다 — 그런 것들은 여전히 당신의 CV, 프로필, two-pager에만 존재합니다. 사용자 계층의
config/memory.md에 저장되며, 업데이트로 덮어써지지 않습니다. - 당신의 데이터에서 제안 —
POST /api/memory/suggest는 당신 자신의 지원 트래커에서 행동 패턴을 캐내어 검토하고 편집할 불릿을 초안으로 작성합니다. 트래커를 읽을 뿐, 사실을 지어내지 않으며 라이브 호출도 하지 않습니다.
신규: server/lib/routes/memory.mjs(21번째 라우트 모듈 — GET/PUT /api/memory + POST /api/memory/suggest), public/js/views/memory.js, PATHS.memory, 그리고 bundleProjectContext에 추가된 config/memory.md 블록. 16개 로케일 전체에 11개의 새 i18n 키. 테스트: tests/memory-routes.test.mjs.
career-ops-ui v1.267.1 · page 5/9 · mirror of the project changelog for cvstart.org