에토스AI 문서v0.107.144

에토스AI · 개발 이력 (Changelog)

버전 규약: Semantic Versioning — MAJOR.MINOR.PATCH. 각 릴리스는 git 태그(v0.x.x)로 표시하고, 요약을 Slack #veorai-dev + veor admin(products/veor-ai/)에 반영한다. 형식: Keep a Changelog.

[0.107.144] — 2026-10-03

코드 모드 비용 실험(설명서·캐시) 결론 반영. 근거·오작동 목록: docs/CODE-COST-KNOWN-ISSUES.md.

Changed

  • 프롬프트 순서 = 반복성 순서. 턴 사이에 안 바뀌는 덩이부터 앞에, 공유 범위가 넓은 덩이부터 앞에 둔다 (기본 지침 → 에이전트·프로젝트 → CORE → 대화 요약 → 이번 턴 설명서 → 이력 → 턴 문맥).
    • 회사 정보·시각화 지침·일반 대화 제작 요청 안내처럼 의도에 따라 붙었다 빠지는 작은 덩이는 시스템 대신 턴 문맥으로. 시스템 앞에 있으면 붙었다 빠질 때마다 시스템·이력 캐시가 통째로 깨졌다(운영 라우트 실측: 문서 요청 턴 첫 호출 캐시 읽기 0 → 옮긴 뒤 2,985토큰, 그 호출 33.7원 → 20.5원).
    • 대화 요약은 맨 앞 근처에서 CORE 뒤로(압축 때만 바뀌는 대화 단위 덩이).
  • 답변 메시지 메타에 캐시 진단(cacheProbe — 도구 정의·앞 덩이·시스템의 짧은 해시, 이력 길이, 실린 설명서, 회사 정보·시각화 여부). 내용은 남기지 않는다. 덩이별 턴 사이 변경률과 대화 길이 분포를 운영 숫자로 재서 순서·설명서 자리를 다시 정하는 근거.
  • /api/health 에 cacheExtras(아래 스위치 3개의 켜짐 여부).

Added — 스위치 3개(기본 꺼짐, 하나씩 켜며 관찰 — 할일 체크 ①②③)

  • ETHOS_CACHE_TAIL=1 도구 루프에서 매 라운드 마지막 도구 결과에 캐시 경계 — 한 턴 안 재전송분을 캐시로(같은 대화 기준 약 −19%). 앤트로픽 계열만.
  • ETHOS_CACHE_SPLIT=1 시스템을 …CORE+요약 + 이번 턴 설명서 두 덩이로(①과 합쳐 약 −20~21%). 앤트로픽 계열만.
  • ETHOS_MANUAL_REFETCH_SHORT=1 이미 실린 설명서를 또 꺼내면 본문 대신 한 줄. ("이미 실렸으니 꺼내지 마라" 안내 문장은 필요한 설명서까지 막아 쓰지 않는다 — 실험 10/12 → 6/12.)
  • 경계는 최대 4개(앤트로픽 한도). 경계를 실은 요청이 400 이면 그 턴은 확장 없이 다시 보내고 chat.cache-extras 로 기록한다.
  • set-env 워크플로 선택지에 위 3개.

Tests

  • tests/cache-extras.test.ts — 가짜 게이트웨이가 받은 요청 본문으로 경계 개수(≤4)·누적 없음·앤트로픽 외 미적용·접두사 어긋나면 한 덩이·400 재전송, 짧은 답 계약, 그리고 시스템에 붙는 덩이의 이름표와 순서(이름표 없는 새 덩이·순서 위반이면 실패).

[0.107.143] — 2026-10-01

Changed

  • 다언어 코드 실행의 상시 비용 +121 → +28 토큰 (기능은 그대로). 매 턴 붙는 코드 힌트·run_python 정의·CORE 에서 JS/TS/bash·Node 버전·웹 도구 목록 문장을 빼고, 다른 언어는 도구의 language 선택지 하나로만 알린다. 세부는 설명서 project·webdev 가 단일 출처(의도가 보이면 서버 프리로드, 아니면 code_manual).
  • 설치 시도·없는 모듈로 실패한 실행에만 결과에 hint("설치 불가 · 미리 설치된 도구는 webdev 설명서")를 붙인다 — 평소 0토큰.

Tests

  • 상시 조각에 도구 이름·버전 세부가 들어오면 실패, CORE 예산 3,300자·설명서 목록 한 줄 120자 — 새 기능은 설명서로.

[0.107.142] — 2026-10-01

Fixed

  • One-time 1개월(29,000원) 결제 성공 화면·기록의 상품명이 "에토스AI Plus 1개월"로 찍히던 것 → "에토스AI One-time 1개월". Plus 는 월 구독(빌링)이라 29,000원 단건은 One-time 1개월에서만 나온다.

[0.107.141] — 2026-10-01

토스 PG 심사 대응 마무리.

Added

  • Lite 월 구독(토스 자동결제) — Plus 와 같은 카드 등록창. 구독 상품표(SUB_PLANS: plus·lite)가 청구 금액·주문명의 단일 출처이고, 카드 등록창은 상품을 성공 주소 경로(/pricing/billing/success/lite)에 싣는다 — 쿼리에 실으면 토스가 붙이는 customerKey·authKey 와 섞일 수 있다(토스 문서는 기존 쿼리 처리를 정하지 않는다). 모르는 상품은 기본값 없이 거절. 요금표에 값이 붙은 카드는 전부 토스로 살 수 있다.
  • 구독 해지 취소(다시 잇기) — 해지 후 이미 낸 기간이 남아 있으면 추가 결제 없이 자동결제를 다시 켠다(POST /api/billing/subscription).
  • 결제 결과 상세 — 단건·구독 성공 화면에 상품·금액·결제 수단·승인번호·주문번호·다음 결제일. 단건 상품명은 결제창 값이 아니라 서버가 금액으로 정한 라벨. 로그인 결제는 감사 로그 billing.payment(새로고침 중복 없음), 비로그인 결제는 주문번호를 support 로 보내라는 안내. 로그인 상태의 단건 결제는 토스에 고객 이메일·이름을 싣는다.
  • 하단 사업자 정보에 호스팅 제공자(AWS). 할일 체크에 토스 심사용 테스트 계정 · 운영 테스트 결제 1건 · 정산주기 확인.

Changed

  • 이용약관 개정(2026-10-01) — 개인 이용자·유료 요금제 정의, 제7조 결제 방식(월 구독 자동결제·선불 이용권·결제 실패 재청구·요금 인상 30일 전 고지와 동의·영수증), 제9조 해지 방법. 환불 규칙은 그대로.
  • 개인정보처리방침 개정(2026-10-01) — 휴대폰 번호·선택 동의·학교 이메일·결제 기록(5년)·자동결제 정보 항목, 토스페이먼츠·문자 발송 위탁, 보호책임자 전화.
  • 요금제 화면 — 로그인 상태면 헤더 "로그인" 대신 "내 대화로", "현재 이용 중" 배지는 한 장에만(구독이 있으면 구독 상품), 구독 버튼 아래 정기결제 고지(첫 결제 시점·금액·주기·해지).
  • 갱신 크론은 구독 당시 금액을 넘겨 정책가와 대조한다 — 요금을 바꾼 뒤엔 청구하지 않고 멈춘다(실패 횟수도 올리지 않음).

Fixed

  • 해지 후 남은 기간에 재구독하면 그 자리에서 또 결제되던 것 — 같은 기간을 두 번 내게 됐다. 같은 상품은 청구 없이 잇고, 다른 상품은 막는다(요금제 변경은 문의로).
  • 구독 카드 표기 "신한 끝 4123" — 토스가 가려 준 번호(43301234***123)에서 숫자만 뽑아 실제와 다른 끝자리를 만들었다. 가린 번호 그대로 보이고, 카드사는 폐지 예정 필드(cardCompany) 대신 card.issuerCode 를 토스 카드사 코드표로 읽는다.
  • 구독 성공 화면 새로고침이 "구독을 시작하지 못했어요"로 보이던 것(authKey 재사용 거절) → 방금 시작한 구독이면 현재 상태.
  • 해지 후 이용 기간이 끝난 구독의 빌링키를 크론이 지운다(개인정보처리방침의 보관 기간과 같은 동작).
  • 결제 실패 화면 문구("결제가 취소하셨거나" → "결제를 취소하셨거나").

Tests

  • tests/billing-plans.test.ts — 청구 금액이 요금표에서만 오는지, 크론의 금액 대조·실패 비가산, 재구독 무청구, TOSS_API_BASE(로컬 모의 서버 전용) 허용 범위. 실제 흐름은 로컬 모의 토스 서버로 18가지 경우를 한 바퀴 확인.

[0.107.131] — 2026-09-30

0.107.68 ~ 0.107.130 (2026-09-15 ~ 09-30) 을 영역별로 묶었다. 이 기간 변경 이력이 비어 있어 한 번에 보충한다.

Added

  • 코드 실행 다언어화 — run_python 에 language(python · javascript · typescript · bash). 샌드박스에 Node.js 24 LTS 와 웹 개발 도구(TypeScript 7 · esbuild · React 19 · Tailwind 4 · jsdom · Prettier · ESLint · npm/npx)를 버전 고정으로 설치. 복잡한 웹앱은 설명서 webdev: React 소스 → tsc 검사 → esbuild 번들 → 한 html → jsdom 클릭 검증.
  • 코드 지침 설명서 트리 — 상시 5,298 → 1,448 토큰. 주제별 설명서 14종(pptx·hwpx·docx·xlsx·web·webdev·접수함·슬롯· 방문자AI·에토스키·알림·서버대체·이식·project)을 의도 프리로드 + code_manual 도구로 필요할 때만.
  • 월 구독(토스 빌링키) — 카드 등록 → 1회차 청구 → 매월 크론 갱신(실패 6시간 재시도, 3회 past_due) → 해지. 자동결제용 키(TOSS_BILLING_*)가 있을 때만 열리고, 없으면 Plus 는 1개월 이용권으로 판다.
  • 채팅에서 이미지 생성 도구 · 파일 요청(엑셀·PPT·문서) 서버 보장 2패스 · 에토스 API 키(OpenAI 호환 /api/v1).
  • 덱 레이아웃 12종 추가(테마 3종·강조색·agenda·team·gallery·checklist·big_fact·표지 배경 이미지) + 덱 품질 게이트.
  • 산출물 "드라이브 저장" 버튼 · 그룹채팅 파일 전송 · 내 말풍선 구분 · 명세의 입력 구성·추론 토큰 분해.
  • 워크플로우 엔진 v2(병렬·팬인·실패 격리·에이전트 노드·도구 루프·검증 루프) · 워크스페이스 대표 기본 모델.
  • 수퍼: 워크스페이스 영구 삭제(이름 타이핑 확인 · 본인 공간 차단).

Changed

  • 요금제·결제(토스 심사 대응) — 충전형 결제 전면 제거, 개월권 상한 12 → 3개월, 요금제 화면 정돈(결제 방식 태그 · 현재 플랜 표시 · 로그인 상태 존중), 월 구독 해지 문구를 약관과 같게.
  • 사업자 정보 하단을 요청 시점에 그린다 — 정적 페이지가 빌드 시점 값으로 굳어 페이지마다 주소·번호가 달랐다. 대표번호는 법인 정본(아톡 070) 고정.
  • 스몰토크 턴은 지식검색·기억 회상 생략 · 마크업 기준 2.0배로 문서 통일.

Fixed

  • 코드 샌드박스: 분리 모드로 떠난 자식 프로세스가 시간 초과 뒤에도 살아남던 것(실행별 표식으로 정리 + init), 백그라운드 프로세스가 출력 파이프를 물면 결과를 통째로 잃던 것(본 프로세스 종료 기준으로 수집).
  • 긴 대화가 "32천 토큰" 입력 상한에 통째로 막히던 것 · 과금이 0 으로 새던 7개 경로 · 같은 파일이 카드 두 장으로 뜨던 것 · 그룹채팅이 모델 허용 목록 워크스페이스에서 죽던 것 · 새로고침 후 생성 이미지가 사라지던 것.

Security

  • 산출물 파일 접근을 워크스페이스 전체 → 소유자·접근 가능한 그룹방·공유 대화로 좁힘(다운로드·미리보기·HTML·서식 공통).
  • 민감 모델 조회 10곳을 조회 시점 select 화이트리스트로(비밀번호 해시·접속 암호문이 행에 실리지 않게).
  • /api/health/db 수퍼 전용(비상 토큰 폴백) · /api/models 로그인 필요.

[0.107.67] — 2026-09-15

Docs

  • docs/TOKEN-COST-LEVERS.md — 토큰 원가가 어디서 새고 무엇으로 막히는지 한 장으로. 기준 숫자(Opus 5 턴당 약 90원), 이미 걸려 있는 캡 10종(컴팩션 7.5k · 첨부 6만 자 · RAG k=4 · 루프 3회 · 루프 원가 600원 정지선 …), 아직 안 막힌 것 5종, 레버별 성격. 결론: 누적 대화는 이미 잡혀 있고 남은 위험은 첨부·루프·저장 셋인데 저장만 되돌릴 수 없다.
  • 확인된 것: 요금표는 저장용량 1/5/10GB 를 광고하는데 강제하는 코드를 찾지 못했다. RDS 는 스토리지 축소가 불가능하다.

Added

  • 할일 체크에 markup-doc-mismatch — 마크업이 문서 1.3배 / 코드 2.0배로 어긋나 있다. 어느 쪽이 맞는지는 대표 판단이라 화면에 남긴다.

[0.107.63] — 2026-09-15

Fixed

  • 수퍼가 고객사 공간에서 못 나가던 것. 나가기를 누르면 "점검으로 들어간 자리가 아니라 여기서 뺄 수 없습니다" 가 떴다 — viaSuper 표시가 어제(0.107.59) 생긴 것이라 그 전에 진입해 눌러앉은 자리는 전부 표시가 없기 때문이다. 정작 빼야 할 자리만 막혔다. 표시가 없어도 나갈 수 있게 풀고, 진짜 위험만 막는다(남은 사람이 있는데 마지막 관리자가 빠지면 거절 — 그 회사가 자기 공간의 관리자를 잃는다).
  • 고객사 구성원 목록에서 운영진을 운영진 메일(SUPER_ADMIN_EMAILS)로도 거른다. viaSuper 표시가 없는 옛 자리가 바로 지금 보이던 그 자리다.

Added

  • 가입 알림 테스트(수퍼 → 인프라 → 가입 알림). 진짜 가입과 같은 경로로 한 통 보내고 슬랙·메일 결과를 각각 화면에 적는다 — "보냄 / SLACK_WEBHOOK_URL 미설정 / 웹훅이 거절 (HTTP 404) / Resend 가 거절" 처럼. 그전에는 알림이 안 와도 코드가 안 불린 건지 환경변수가 없는 건지 서버 로그를 뒤져야 알았다. 받는 쪽에는 🧪 테스트로 표시된다.

[0.107.60] — 2026-09-15

Added

  • 수퍼에서 워크스페이스 대화를 CSV 로 받는다(워크스페이스 상세 → 대화 내려받기). 그전에는 그 공간에 진입해서 관리자 자격으로 받아야 했고, 진입은 구성원 자리를 만든다 — 들어가지 않고 받는 편이 흔적이 적다. 1:1·그룹 대화를 함께 내보내고, 구성원 한 명만 고를 수도 있다. 대화의 workspaceId 로 거른다 — 사용자 기준으로 모으면 다중 소속자의 타 회사 대화가 딸려 온다.
  • 열람 사유를 반드시 받는다. 사유가 없으면 버튼이 잠긴다 — "누가 언제"만 남고 "왜"가 없으면 나중에 아무도 판단할 수 없다.
  • 운영 기록(수퍼 → 🗂 운영 기록) — 대화 내려받기·워크스페이스 진입/나가기를 한 줄로 본다. 기록은 super.* 로 남기고 고객사 감사 화면에서는 뺀다(대표 지시). 수퍼끼리만 본다.

[0.107.59] — 2026-09-15

Fixed

  • 수퍼 관리자가 고객사 공간에 영구 소속되던 것(대표 지적 — "내가 박지석 공간에 소속돼 버렸는데"). 진입이 멤버십을 만들고 지우지 않아, 한 번 들어가면 그 회사 구성원 목록에 계속 남았다. 진입으로 만든 자리는 WorkspaceMember.viaSuper 로 표시하고(진짜 소속과 구분), 나가기로 지운다 — 수퍼 워크스페이스 상세의 "나가기" 또는 계정 메뉴의 공간 옆 "나가기". 나가면 원래 공간(가장 오래된 진짜 소속)으로 되돌아간다.
  • 점검 중인 운영진이 고객사 관리자 화면의 구성원 목록에 보이던 것. viaSuper 자리는 그 목록에서 뺀다 — 진짜 소속이면 그대로 보인다.
  • 진입·나가기 기록을 고객사 감사 로그가 아니라 우리 쪽에 남긴다(대표 지시). 고객 화면에 우리 직원 이름이 그 회사 사용자처럼 보이지 않게 한다.

[0.107.57] — 2026-09-14

Fixed

  • 남의 워크스페이스에 들어가도 내 프로젝트·예약이 따라다니던 것(대표 지적). 목록을 userId 로만 걸러서, 여러 공간에 소속된 사람(운영진·컨설턴트·수퍼 진입)이 고객사 공간에 들어가면 사이드바에 자기 프로젝트가 그대로 떴다. 만들 때 workspaceId 가 이미 박히므로 조회·수정·삭제·채팅 주입 전부에 그 경계를 같이 건다. 예약(Schedule)도 같은 구멍이었다. 자기 데이터가 보이는 것이라 남의 정보가 샌 것은 아니지만, "공간이 갈려 있다"는 약속이 깨진다.

Added

  • 가입하면 우리에게 알림이 온다 — 슬랙(SLACK_WEBHOOK_URL) + 수퍼 관리자 메일 (SUPER_ADMIN_EMAILS). 개인·기업 가입과 기존 공간 합류 신청까지. 그전에는 코드에 알림이 아예 없어서, 수퍼 화면을 열어 워크스페이스 수를 세기 전에는 가입을 알 수 없었다. 알림은 가입을 막지도, 응답을 늦추지도 않는다(실패는 삼킨다).

[0.107.55] — 2026-09-14

Added

  • 문서 보기에서 값을 고쳐 다시 채운다 — "값 고치기". 문서를 직접 편집하지 않는다: 제출용 서식은 표 구조·칸 좌표가 곧 유효성이라, 화면에서 글자를 바꿔 hwpx 에 되쓰면 접수처에서 반려될 수 있다. 고치는 것은 값이고, 채우는 일은 원본 서식 위에서 서버 워커가 다시 한다(POST /api/forms/refill, 모델을 거치지 않는다).
  • 그러려면 "어느 서식을 어떤 값으로" 를 기억해야 한다 — GeneratedFile.formId·formValues (마이그레이션 20260914160000_generated_file_form). 값 전체를 저장한다: 채우기는 언제나 빈 원본에서 시작하므로 고친 칸만 보내면 나머지가 빈칸으로 돌아간다. 비워 둔 칸도 목록에 넣어(빈 값) 편집기에서 채울 수 있게 했다.

[0.107.54] — 2026-09-14

Added

  • 채운 한글 서식을 화면에서 문서 모양 그대로 본다 — 파일 카드의 "문서 보기". 오른쪽에서 펼쳐지고 폰에서는 화면을 덮는다. 서식은 대부분이 표(건축허가 신청서는 칸 123개)라 텍스트 미리보기로는 어느 칸에 무엇이 들어갔는지를 못 봐서, 확인하려면 결국 내려받아 한글을 열어야 했다. lib/hwpxHtml.ts 가 OWPML 섹션에서 문단·표(병합 포함)를 HTML 로 옮기고, /api/files/[id]/html 이 워크스페이스 안에서만 내준다. 글꼴·색은 재현하지 않는다 — 제출본은 어차피 원본 hwpx 이고 이 화면은 확인용이다.
  • 할일 mcp-deploy-secrets — MCP 저장소 배포가 시크릿 미등록으로 10초 만에 '건너뜀' 초록이 된다. 성공처럼 보이는데 서버는 옛 코드다. 서식 파일 창구(/forms/file)도 이 때문에 아직 없다.

[0.107.53] — 2026-09-14

Added

  • 채운 서식을 화면에서 바로 내려받는다. form_fill 은 서버 경로만 돌려줬고 사용자는 파일을 받을 길이 없었다. 이제 앱이 서식 MCP 의 새 창구(GET /forms/file)로 모델을 거치지 않고 바이트를 받아 코드 실행 산출물과 같은 그릇(GeneratedFile)에 담고, 같은 파일 카드로 보여준다. 도구 결과에 base64 를 실으면 파일 하나가 모델 입력 수십만 토큰이 되어 그 돈을 고객이 낸다.

Fixed

  • 8자리 서식 id 가 전화번호로 마스킹돼 채우기가 통째로 실패하던 것(실사고). 가려진 id 가 ⟦PHONE1⟧ 인 채로 서식 서버에 실려 "라벨 카드가 없다"로 죽었다 — 라벨 데이터가 없어서가 아니었다. 작업 폴더 파일명이 쓰던 통과 목록(literalKeep)에 서식 id·산출물 경로를 같이 넣어 마스킹 겹을 자리표시자로 지나가게 했다. 공개 식별자라 가려서 얻는 보호가 없다.

[0.107.50] — 2026-09-14

Fixed

  • 배포가 빌드를 다 해 놓고 마지막 한 줄에서 죽던 것 — Conflict. The container name /<해시>_veorai-app-1 is already in use. compose 는 컨테이너를 교체할 때 기존 것을 잠깐 개명하는데, 그 교체가 끊기면 개명된 잔재가 남고 다음 배포가 같은 임시 이름을 쓰려다 실패한다. container prune 은 멈춘 것만 지워서 이건 못 치운다. 교체 직전에 접두사가 붙은 잔재만 골라 지운다(실제 이름은 언제나 veorai-<서비스>-1 이라 안전). 이것 때문에 서식 도구(fbf4074)가 운영에 안 올라가 있었다 — run #652 실패.

Note

  • 버전 0.107.49 가 서로 다른 두 커밋에 붙어 있었다(서식 뒤처리 · 폴더 연결 팝업). 배포 확인이 헷갈리므로 이 릴리스를 0.107.50 으로 올린다.

[0.107.49] — 2026-09-14

Added

  • 에토스 서식 — 앱 내장 도구(form_find·form_fill·form_check, lib/formTools.ts). 법령 별지 서식 26,530건의 실물을 찾아 채운다. 커넥터가 아니라 기본 서빙이고, 실행만 서식 MCP (mcp.ethos.ai.kr)로 넘긴다 — 라이브러리가 599MB 이고 hwpx 워커가 그쪽에 있다. (앞선 커밋 fbf4074 가 본체. 이 릴리스는 그 뒤에 빠져 있던 세 가지를 채운다.)
  • /api/health 에 forms — 서식 도구가 노출되는가(= FORMS_MCP_TOKEN 설정 여부). 토큰이 없으면 도구가 아예 안 붙어 모델이 "그런 기능이 없다"고 답하는데, 화면만 봐서는 미설정인지 장애인지 구분이 안 됐다. 값은 싣지 않고 있고/없고만 싣는다.
  • 할일 2건: forms-mcp-token(EC2 .env 에 토큰 — 이게 없으면 기능이 없는 것과 같다) · forms-mcp-filter-token(서식 서버의 개인정보 필터 — 웍스 건 여부에 따라 값을 넣거나 끈다. 지금은 서식 외 도구가 그 필터에 전부 막혀 있다).

Note

  • 본체 커밋이 버전을 안 올려서 배포 여부를 /api/health 로 확인할 수 없었다. 이 릴리스가 0.107.49 로 올리면서 같이 확인된다 — 버전을 올리는 이유가 이것이다.

[0.107.43] — 2026-09-13

Fixed

  • 에토스 모델로 답했는데 말풍선 아이콘이 남의 회사 로고로 뜨던 것(대표 지적). 모델 id 에 회사 접두(회사/모델)가 없으면 inferProvider 가 못 알아내는데, 화면의 폴백이 특정 외부 회사로 하드코딩돼 있었다. 폴백을 GATEWAY_PROVIDER_ID(우리 마크)로 바꾸고, ethos-* 로 시작하는 id 는 inferProvider 가 직접 우리 회사로 판정하게 했다.
  • 같은 하드코딩이 그룹채팅에도 있었다 — UsageLog.provider 가 우리 모델 사용분을 남의 회사 이름으로 기록해 수퍼의 회사별 원가 분석이 어긋났다. 호출 경로는 게이트웨이 하나라 동작은 그대로고 기록만 바로잡힌다.

[0.107.42] — 2026-09-13

Changed

  • 요금 정책 v0.3 대외 적용 — Plus 19,800 → 29,000원/월(대표 확정). 검토안으로만 있던 버전을 PERSONAL_PLANS·TIER_MATRIX·PLUS_MONTHLY_KRW 로 옮기고 v0.2 는 retired 로 내렸다. 고급 모델 제공량도 같이 올라간다 — 월 한도 18,000 → 26,364원(공급가 = 29,000 ÷ 1.1, quotaKrwFromLabel). Lite 9,900 · Edu 는 그대로. 랜딩·요금표·결제 금액은 전부 상수 하나에서 읽으므로 같이 따라간다.
  • 화면 표기는 "월 29,000원어치"(VAT 포함) 로 쓴다. 검토안은 이 자리에 공급가(26,364)를 적었는데 그러면 Lite 의 "9,900원어치" 와 기준이 달라 같은 표에서 2.93배가 2.66배로 보인다. Plus 카드의 "제공량 2배" 문구도 3배로 고쳤다.
  • One-time 을 충전(금액권)으로 바꾸는 안은 v0.4 검토안으로 분리했다. 토스 라이브 키가 있어야 파는 구조라, 지금 바꾸면 스마트스토어에서 살 수 있는 것이 1개월권 하나만 남는다.

할일(사람)

  • toss-plus-29000 — 토스 콘솔 상품 금액을 29,000 으로 재등록. 승인 검증이 이 값을 본다.
  • smartstore-price-29000 — 스마트스토어 상품 3건 29,000 / 87,000 / 174,000 으로 변경. 바꾸기 전까지 /pricing 은 새 금액을 보여주는데 스토어는 옛 금액으로 판다.

[0.107.19] — 2026-09-11

Added

  • QA 회귀 루프 첫 판(qa/) — 시나리오 = YAML 데이터, 실행기 qa/run.mjs(의존성 yaml 하나, 브라우저 단계만 playwright 선택). 스테이징(localhost:3001)에 돌려 qa/reports/ 에 통과율·실패 사유·분류 열(제품 버그/시나리오 오류)을 남긴다. 첫 묶음 21개(헬스·공개 페이지·인증·대화·에이전트·검증 루프 설정) 전부 모델 호출 없음. npm run qa:smoke · npm run qa:regress. 로그인은 한 번만 하고 공유한다(로그인 1분 10회 제한).
  • qa/personas/ 페르소나 형식 고정(실행기는 다음 단계). 런북 docs/QA-MAC-MINI.md §2·§3 에 QA 계정 부트스트랩· https 오타·게이트웨이 키 안내를 보탰다.

[0.107.0] — 2026-09-10

0.105.0 · 0.106.0 은 같은 작업의 중간 단계라 이 항목에 함께 적는다.

Changed

  • 공개면 어투를 해요체로 통일 완료(/veor-writing 정본). 홈만 해요체이고 나머지가 합쇼체라 /(해요체) → /pricing·/signup(합쇼체)로 한 걸음 옮길 때마다 화자가 바뀌었다. /signup 은 한 화면 안에서도 갈렸다(합쇼 21 · 해요 18).
    • /signup · /login · /forgot · /reset
    • /pricing 3종 + lib/pricingPlans 의 VAT_NOTE·USAGE_NOTE
    • components/SalesLanding.tsx(= /enterprise·/gov·/sales) 합쇼체 49건 · lib/landingSegments.ts 히어로·목업 · components/ContactButton.tsx 문의 모달
    • app/docs/** 18쪽 (117건)
  • 문어체로 남긴 것: /docs/terms·/docs/privacy(약관·개인정보처리방침), REFUND_POLICY.rows(해지·환불 규칙), 검사 항목의 "~했는가". 법률 문장과 판정 기준에 어투를 입히면 기준이 흐려진다.
  • 줄표 정리 — 요금 비교표 제목·메타 설명·환불 목록 구분자를 괄호와 가운뎃점으로 풀었다.

[0.104.0] — 2026-09-10

Changed

  • 가격 섹션의 비교 축을 값에서 산출물로 옮겼다. 옛 제목 "ChatGPT Plus 의 1/3 가격" 은 두 가지가 틀렸다. ① 산술이 안 맞았다 — 30,000 의 1/3 은 Lite 9,900 인데 화면이 강조하는 건 Plus 19,800(2/3)이다. ② 가격을 앞세우면 우리가 못 이기는 축에서 싸우게 되고, 공급사가 값을 내리는 날 논거가 사라진다. → 제목은 따로 구독하면 서로 검증이 안 돼요, 비교는 따로 구독한 합계(ChatGPT Plus 29,000 + Gemini 29,000 + Claude Pro 30,000 = 88,000원 · 결제 3번, 2026-09-10 대표 확인)와 우리 1건. 우리 금액은 PLUS_MONTHLY_KRW 에서 읽는다 — 요금이 바뀌는 날 카드가 저절로 따라오게.
  • docs/COMPETITOR-MATRIX.md 현행화 — 우리 Plus 가 29,900 으로 적혀 있었다(실제 19,800). Lite 행과 「따로 구독하면」 표를 추가하고, 비교 축을 옮긴 근거를 적었다.

Added

  • 요금 검토안 v0.3(PRICING_VERSIONS, status: "draft") — 수퍼에서만 보인다. 대외 가격은 그대로. Plus 29,000(제공량 26,364원어치, 마진율 50% 유지) · 유료는 Lite·Plus 둘 · One-time 은 유료 이용 중 추가 충전(11,000 · 33,000 · 55,000 · 110,000원)으로 성격 변경. 네 금액이 1.1 의 배수라 공급가가 10,000 · 30,000 · 50,000 · 100,000 으로 떨어진다. 7,500원 진입 요금제를 넣지 않기로 한 이유도 같이 적었다(마진은 되지만 Edu·Lite 와 자리가 겹친다). 확정 시 한 릴리스로 묶어야 하는 것과 토스 라이브 선행 조건은 blockers 에.
  • applyOverrides 가 audience 도 덮는다 — One-time 은 가격뿐 아니라 대상 자체가 바뀌어서, 가격만 덮으면 검토 화면이 여전히 "선불 충전 (1~12개월)" 을 달고 실제 안과 다른 말을 한다.

[0.103.0] — 2026-09-10

Fixed

  • 가입·재설정 화면에 사업자 정보가 없었다. /signup 은 계약이 성립하는 화면인데 전자상거래법 표시가 빠져 있었다. app/globals.css:2606 의 .auth-shell 은 처음부터 "로그인·가입·재설정 셸 + 하단 사업자 푸터" 를 전제하고 .auth-shell > .bizfoot 규칙까지 두었는데, 푸터를 주입하는 layout.tsx 가 /login 에만 있었다. signup·forgot·reset 에 같은 레이아웃을 만들고 페이지 안의 .auth-shell 7개를 걷어냈다 (page.tsx 가 "use client" 라 env 를 못 읽으므로 서버 레이아웃이 셸을 맡는다. 중첩되면 min-height:100dvh 가 겹쳐 푸터가 첫 화면 밖으로 밀린다).
  • 약관·개인정보처리방침 본문에 사업자 표기가 없었고, 서로 오갈 링크도 없었다. app/docs/layout.tsx 에 BizFooter 를 한 번 붙여 문서 20쪽을 같이 해결하고, lib/docs-nav.ts 에 「약관 · 정책」 묶음을 추가했다. 그 전에는 두 문서로 들어오는 길이 푸터 링크와 가입 동의 체크박스뿐이었다. (문체는 문어체 그대로 — 법률 문서를 해요체로 바꾸면 사고다)
  • 수퍼 요금 정책이 배율을 거짓으로 표시했다. 0.95.0 에서 PRICE_MARKUP_DEFAULT 를 1.3 → 2.0 으로 올리며 PRICING_VERSIONS v0.2 의 markup 을 안 고쳤고, SuperPricing.tsx:161 이 그 필드를 그대로 그려 "배율 1.3배" 라고 나왔다. 마진 판단을 하는 화면이라 숫자가 틀리면 판단이 통째로 틀어진다. 값을 정정하고, 다음에 또 어긋나지 않도록 lib/pricing.ts 에 "바꾸면 버전 기록도 같이" 를 적어 뒀다.
  • 공공 랜딩 푸터의 「기업」 링크가 / 로 갔다. 루트는 2026-09-09 부터 개인·팀 랜딩이라 기업 소개가 아닌 곳으로 보내고 있었다(상단 네비는 /enterprise 로 정상이었다).
  • 기업·공공 랜딩 하단의 링크 중복 정리 — ld-foot 에서 문서·가격을 뺐다. 바로 아래 BizFooter 가 같은 링크를 이미 낸다. 두 곳에 두면 반드시 한쪽만 고쳐진다.

[0.102.0] — 2026-09-10

Changed

  • 히어로를 다시 썼다. 옛 제목 "AI 가 만들고, 다른 AI 가 검사합니다 / 통과할 때까지 고쳐서, 파일로." 는 우리 구조를 설명하는 문장이라 읽는 사람의 "그래서 나한테 뭐가 좋은데" 가 안 풀렸다. "통과" 도 무엇을 통과하는지 모르는 자리에 먼저 나왔다. → 시킨 일을 끝까지 해서 / 열리는 파일로 드려요. 본문은 낭비(다시 시킬수록 시간·요금이 는다)를 먼저 말하고 검증 루프를 그 답으로 놓는다. 눈썹은 무엇을 하는 도구인지로(한글·워드·엑셀·PPT 양식 채우기).
  • 공개 페이지 어투를 해요체로 통일(/veor-writing 정본). 제목·본문·FAQ·OG 설명까지 한 벌.
  • 고객이 모르는 말을 걷어냈다. 계열(재벌 계열사로 읽힌다) → 다른 회사 AI · 판정(법원 말투) → 확인 · 미통과 → 통과하지 못한 · 비용 정지선 → 비용 상한. 제품이 실제로 내는 문자열도 같이 고쳤다(lib/verify.ts 검증 결과 줄, app/api/chat 수정 회차 안내, 에이전트 설정 도움말). 랜딩 목업은 제품 출력을 그대로 보여주는 자리라, 화면만 고치면 목업이 거짓이 된다. 모델에게 주는 지시문(retryFeedback·검수자 시스템 프롬프트)은 동작에 영향이 가므로 그대로 뒀다.
  • lib/agentTemplates.ts 설명 26개도 해요체로. 랜딩과 앱이 같은 문장을 쓰므로 한 곳에서 바꾼다. 검사 항목(checks)의 "~했는가" 는 그대로 — 문장이 아니라 예·아니오 판정 기준이다.

[0.101.0] — 2026-09-10

Added

  • 홈에 "검사 항목은 직접 적습니다" 섹션(#checks) — 모델이 좋아지면 틀리는 횟수는 줄지만 "이 기관 양식은 표를 바꾸면 반려된다" 같은 기준은 그 조직만 안다. 성능으로 대체되지 않는 유일한 부분이라 카드 하나로 묻어 둘 자리가 아니다. 되는 예와 함께 안 되는 예("적절히 요약됐는가")를 같은 무게로 보여준다 — 제품이 실제로 막는 것이라(lib/verifyRules.ts VAGUE_CHECK_RE) 지어낸 말이 아니다. "적지 않은 항목은 검사하지 않습니다" 를 명시 — 못 하는 것을 먼저 말하는 편이 신뢰를 만든다.
  • 홈에 "왜 검사가 필요한가" 섹션(#why) — 증상 3칸(그럴듯하게 틀린 숫자 · 글이라 다시 옮기는 것 · 어디를 다시 시킬지 모르는 것). 아래 4단계의 1·2·4 와 짝이다. 방문자가 겪는 것을 말하는 자리가 없어서 화면이 문제 없이 곧장 해법으로 들어가고 있었다.
  • FAQ 3문항 — 모델이 좋아지면 검사가 필요 없어지는지 / 자료를 학습에 쓰는지(약관 근거) / 기업·기관 차이.

Changed

  • 히어로 눈썹 문구에서 가격을 뺐다 — 개인 · 소규모 팀 — ChatGPT Plus 의 1/3 가격 → AI 가 써 준 문서를 매번 다시 검토하고 계신다면. 첫 줄이 가격이면 제품이 가격 축에 고정되고, 노출 통제·감사 로그를 사는 기관이 3만원짜리 비교표 옆에서 이 제품을 만난다. 금액은 가격 섹션이 맡는다.
  • 히어로 버튼 아래 마찰 제거 한 줄(카드 등록 없이 휴대폰 인증만으로 시작).
  • #org 를 갈래 선택 자리로 — 카드마다 "그래서 뭘 더 주나" 를 점으로. 링크만 있으면 셋이 같아 보인다.
  • #jobs 에 직무 칩 한 줄 — 카드는 파일 형식으로 갈라져 있는데(우리 관점) 찾아온 사람은 일 이름으로 찾는다(고객 관점). 같은 카드를 직무별로 한 벌 더 만들면 두 곳이 되어 한쪽만 고쳐지므로 칩으로만 잇는다.
  • #jobs 의 "나만의 AI" 카드를 #checks 로 옮기고 그 자리엔 넘어가는 카드만 남겼다(검사 항목은 한 곳).
  • 어투를 합니다체로 통일(추천 섹션·갈래 카드에 해요체가 섞여 있었다).

[0.95.6] — 2026-09-09

Changed

  • /pricing 카드 재배치 (대표 지시 "좁고 안 보인다") — 이름 → 대상 → 큰 가격(34px) → 바로 아래 버튼 → 제공량 → 기능 순. 1행 개인 4종(Free·Lite·Plus·Edu), 2행 가로형 2종(One-time 선불·기업/공공). 폭 1060 → 1240. 카드마다 반복되던 결제 안내를 표 아래 각주 한 곳으로. 카드 결제(심사용)는 스토어 버튼 아래 글자 버튼으로 — 같은 크기 버튼 두 개면 어디서 사야 하는지 헷갈린다.

[0.95.5] — 2026-09-09

Changed

  • /pricing 결제 창구 두 개 공존 — 0.95.4 가 카드 버튼을 숨겼는데, 그 버튼은 토스 PG 심사가 "결제창 연동" 을 확인하는 대상이라(문상혁 준비분) 숨기면 심사가 막힌다. 기본(PAYMENT_PRIMARY 비움)은 스마트스토어 버튼(실판매) + 카드로 결제하기(보조) 둘 다. 키가 test_ 면 버튼 아래에 "테스트 결제 · 실제 청구 없음 · 실제 구매는 스토어" 를 밝힌다. toss = 카드만, store = 스토어만.

[0.95.4] — 2026-09-09

Fixed

  • /pricing 이 토스 키만 있으면 '카드로 결제하기' 를 그리던 것 — EC2 에 키가 들어 있어 심사 전인데도 카드 결제창이 떴다(승인 단계에서 실패). PAYMENT_PRIMARY=toss 를 명시하기 전까지는 스마트스토어 버튼을 그린다. 심사 통과 후 전환 절차를 할일 체크(toss-go-live)에 추가. (0.95.5 에서 '둘 다' 로 정정)

[0.95.3] — 2026-09-09

Added

  • PAID_PLAN_POLICY — 유료 개통 시 한도·기능 자동 적용 (lib/pricingPlans.ts). 그 전에는 Workspace.monthlyCostLimitKrw 기본값이 null(무제한)이고 플랜별 매핑이 없어서, 유료 고객을 개통하며 한도를 깜빡하면 고급 모델이 무제한으로 열렸다. 요금제 표에 "월 19,800원어치" 라고 적어 두고 실제로는 아무것도 안 막히던 상태다.
    • 한도는 공급가(quotaKrwFromLabel = 표기 ÷ 1.1) — Lite 9,000 · Plus 18,000. UsageLog.priceKrw 가 부가세 제외 기준이라 표기 그대로 걸면 고객이 10% 를 더 쓴다
    • 수퍼 요금제 변경(PATCH /api/super/[id])이 이 값을 같이 넣는다. 허용 플랜에 lite·plus·edu 추가 — 그 전엔 목록에 없어 설정 자체가 불가능했다
    • Edu 는 현행 5,000 유지(표기와 같은 값). 기존 고객에게 불리한 변경이라 대표 판단으로 남김 — 할일 edu-quota-vat
  • 스마트스토어 Lite 1개월(9,900)·Edu 1개월(4,900) 자산 — 상세페이지·대표이미지. 요금제마다 제공 범위가 달라 상세를 공유하지 않는다(Lite 는 워크플로우·예약·커넥터가 없고 제공량·용량·웹검색 횟수·에이전트 개수가 다르다). 렌더러가 상세 4종·대표이미지 6종을 뽑는다
  • lib/smartstore.ts 에 LITE·EDU1M 키. 미등록 상품은 기본값이 없어 버튼을 아예 안 그린다 (smartstoreUrlOrNull) — 스토어 홈으로 보내면 어떤 상품을 사야 할지 모른다. 등록 후 상품번호를 넣으면 Lite 카드가 "가입하고 업그레이드" 대신 구매 버튼이 된다
  • 할일 2건 — 커머스 API 발급(주문 자동 적용), Edu 한도 공급가 정렬 결정

Changed

  • StoreFallback 안내를 실제 설정에 맞춤 — 이메일은 "배송 메모" 가 아니라 직접입력형 필수 옵션이다
  • docs/smartstore/LISTING.md — 상품 6종, 직접입력형을 필수로 거는 법과 그래도 새는 경우의 3중 방어, §8 커머스 API 자동 적용 설계와 사전 확인 3가지, 마진표 재계산

[0.95.2] — 2026-09-09

Added

  • /pricing 에 스마트스토어 구매 버튼 연결 — 대표가 등록한 상품 4건(Plus 1·3·6개월, Edu 학기권) URL 을 lib/smartstore.ts 코드 기본값으로 넣어 EC2 .env 없이 버튼이 살아 있다(env 가 있으면 우선). One-time 카드는 3개월·6개월 두 버튼, Edu 는 학기권 버튼 + ac.kr 안내. 안내문을 스마트스토어 기준으로. LISTING.md 표에 상품번호·덮어쓰기 env(SMARTSTORE_URL_PLUS6 추가), 할일 항목은 "등록 완료 → 테스트 주문" 으로.

[0.95.1] — 2026-09-09

Added

  • 할일 체크: GitHub Actions 무료 분량 소진 → EC2 셀프호스티드 러너 + 예산 상한 (배포 #578 npm 레지스트리 끊김 사례 포함)

[0.95.0] — 2026-09-09

Changed

  • 토큰 배율 1.3 → 2.0 (PRICE_MARKUP_DEFAULT, 대표 결정). docs/PRICING-V4.md §6-2 는 Team 19,800 의 단위 마진을 11,731원(59%)으로 잡고 사업 규모를 계산했는데, 1.3 배에서 "제공량 = 월정액" 구조의 완전 소진 마진은 23% 뿐이라 문서의 계획과 실제 요금표가 어긋나 있었다. 2.0 이면 제공량 표기(19,800원어치)를 유지한 채 마진이 50% 다.
    • Plus 스마트스토어 판매 16% → 43%, Edu 학기권 80원(0.3%) → 8,157원(33%)
    • §8 의 B 안 채택. 유일한 단점이던 라우터 충돌은 라우터 = 원재료(API 종량 도매) · 앱 = 완제품(구독 소매) 포지셔닝 분리로 해소 (대표 결정)
    • 과거 청구는 안 바뀐다 — UsageLog.markup 이 기록 시점 배율을 들고 있다. 가격(19,800)은 그대로라 토스 상품 재등록도 불필요
  • Lite 를 전 기능 개방 — 코드 실행·한글 생성·오피스 원본 수정·에토스 디자인·에토스 코드· 스킬을 Plus 와 동일하게 연다. 티어를 가르는 축은 제공량이고, 기능 게이트는 "사용자가 없어도 도는 것"(워크플로우·예약·커넥터)에만 남긴다 — 그것만 고객이 모르는 사이 한도를 소진시키기 때문이다. 에이전트·검증 루프는 원가 방어(LOOP_COST_CAP_KRW 600원 + quota)가 이미 이중이라 Lite 에도 연다
  • 문서 갱신 — PRICING-V4 §2-2 배율표·§8 결정 블록, smartstore/LISTING.md §6 마진표 재계산

[0.94.12] — 2026-09-09

Changed

  • 개인 랜딩(/) 을 검증 루프 축으로 다시 씀 — "몇 종" 이 아니라 "어떤 일이 어떻게 끝나는가". 첫 문장 "AI 가 만들고, 다른 AI 가 검사합니다 · 통과할 때까지 고쳐서, 파일로". 목업은 0.94.8 의 실제 타임라인(검증 1회차 미통과 → 수정 → 검증 2회차 통과). 4단계(만든다·검사한다·고친다·멈춘다), "되는 일" 은 검사 항목이 실제로 든 제공 AI 5종만 항목과 함께. 26종 숫자는 앞세우지 않는다. FAQ 에 "검사는 누가 하나요" · "검사하면 비싸지나요" 추가. 모바일 hero 줄바꿈 keep-all.

[0.94.11] — 2026-09-09

Fixed

  • 스마트스토어 배송 설정 정정 — 디지털/가전 카테고리는 "배송없음"을 못 쓴다(등록 화면 경고 확인). 카테고리는 유지하고 배송 "있음" + 직접전달 + 무료 + 출고지 법인주소로 설정한다 (직접전달은 송장 없이 발송처리된다). 카테고리 경로 디지털/가전>소프트웨어>유틸리티 확정, 그룹상품은 쓰지 않음(실물 변형용)

[0.94.10] — 2026-09-09

Added

  • LISTING.md §0 "출처와 검증 상태" — 네이버 판매자 도움말은 로그인·JS 라 도구로 읽을 수 없다. 정책·수수료·법령(무형상품 금지, 수수료율, 상품명 규칙, 고시 품목)은 근거 링크를 달고, 카테고리 경로·옵션가 범위·고시 항목명은 미확인으로 표시해 화면에서 확정하도록 했다. 옵션가 범위는 어느 해석이든 "상품을 나눈다" 결론이 같다는 점도 명시

[0.94.9] — 2026-09-09

Changed

  • 스마트스토어 LISTING.md 를 등록 화면 순서(16단계) 로 재구성 — 카테고리 검색으로 확정하는 법(교육·e쿠폰 계열 오선택이 판매중지 사유), 직접입력형 옵션으로 이메일 받기, 상품정보제공고시 7항목, 배송없음·KC 대상아님·미성년자 불가까지 화면 순서대로. "정기구독 아님(선불 단건)" 명시

[0.94.8] — 2026-09-09

Added

  • 검증 루프(루프 ①) — 에이전트마다 실행 모델과 '다른 계열'의 검증 모델을 두고, 초안 → 검사 항목(예/아니오) 판정 → 미통과 사유를 실행 모델에 되돌려 같은 도구로 다시 만들기 → 재판정. 통과하거나 회차(1~3)를 다 쓰면 멈추고, 끝까지 남은 항목은 사유와 함께 답변 아래에 남긴다.
    • 정지선: 회차 상한 · 턴 누적 원가 600원 · 사용자 중단. 과정 타임라인에 "검증 n회차 / 수정 n회차" 칩
    • 설정: 검증 모델(끔·자동·지정) · 검사 항목 · 미통과 시(루프/표시만) · 최대 수정 회차. "잘·적절·충분" 같은 형용사 항목은 경고
    • 제공 양식 에이전트 5종(hwpx·docx·xlsx·pptx·발표자료)은 유료 플랜에서 자동 검증 + 1회 수정. Free 는 검증 없음(원가 2배 방지)
    • VerifyLog 에 회차별 판정·비용 기록 — 통과율·에스컬레이션 통계의 바탕
    • docs/AGENT-LOOP.md ① 구현 현황 반영

[0.94.7] — 2026-09-09

Changed

  • 스마트스토어 상품 등록 자료를 현재 요금(19,800·24,900)으로 갱신 — 상세페이지가 아직 옛 가격(29,900)과 "AI 학습 데이터 제외"(미확정 문구)를 달고 있었다.
    • docs/smartstore/LISTING.md 신설 — 등록 폼 필드별 복붙값(카테고리·상품명·상품정보제공고시· 구매자 작성형 옵션·금지 문구), 상품 4종(Plus 1·3·6개월 + Edu 학기권)과 env 매핑, 소진율 100/70/50% 마진표
    • Edu 전용 상세페이지 신설 — Edu 는 코드 실행이 없어(EDU_POLICY) Plus 문구를 쓰면 제공하지 않는 기능을 광고하게 된다
    • 렌더러가 상세 2종·대표이미지 4종을 뽑고, 페이지가 짧아졌을 때 옛 분할본을 지운다
    • 할일 3건 추가·갱신: 등록 절차, 등록 전 결정 3가지(A/S 번호·개월수 할인·Lite), Edu 소진율 관측(완전 소진 시 마진 80원)

[0.59.4] — 2026-08-30

Fixed

  • 팝빌 할일 절차 정정 — 링크허브는 가입 즉시 키가 나오지 않는다. 파트너(연동) 신청 → 담당자 검토 후 메일로 LinkID·SecretKey 수령 → 그 키로 test.popbill.com 연동회원 가입 순서. 테스트·운영은 독립 시스템(데이터 이관 불가)이라 발신번호·포인트 재등록 여부를 전환 협의 때 확인

[0.57.5] — 2026-08-30

Changed

  • 팝빌 할일 문구 정정 — 테스트베드·운영이 같은 API 키를 쓰므로 승인 대기 없이 연동 가능, 운영 전환은 당일 가능·회사 대표 계정 필수, 실제 병목은 발신번호 심사(공동인증서는 문자와 무관)

[0.55.3] — 2026-08-30

Changed

  • 배포 타입체크를 정식 게이트로 승격 (러너 클린 통과 확인 후 needs 연결)

[0.55.2] — 2026-08-30

Changed

  • 배포 워크플로에 구 Deploy to EC2 의 장점 재이식 — reset --hard(EC2 드리프트 방어), docker image prune(디스크), concurrency 취소(겹침 방지)

[0.55.1] — 2026-08-30

Added

  • EC2 자동 배포 (GitHub Actions) — main 푸시 시 SSH 로 기존 수동 절차(git pull → compose build)를 실행하고 /api/health 버전 일치를 검증(빌드 실패 시 옛 컨테이너 함정 감지), 슬랙 통지. 시크릿(EC2_HOST/USER/SSH_KEY) 미등록이면 건너뜀 — 할일 체크에 등록 항목 추가

[0.54.3] — 2026-08-30

Added

  • 대표 할일 체크 시드 추가 — 스마트스토어 오픈 5단계(통신판매업 신고 확인 → 판매자 가입 → 상품 3건 등록 → 톡톡·알림·마케팅 링크 → 테스트 주문 검증), 요금제 V2 미결정 확정, Free 학습 동의 법무 검토 (lib/humanTodos.ts)

[0.54.2] — 2026-08-30

Added

  • 요금제 개편안 V2 (docs/PRICING-V2.md, 대외비) — 라우터(원화 크레딧 종량)·에토스AI(정액) 제품 분리, Free 학습 기여형 재설계(Muse contributor·DeepSeek 한정, 일 횟수 제한), 학습 활용 동의 체계(ConsentLog·가입 체크박스·첫 로그인 모달·서버 집행 게이트·철회·재동의), 동의 문구 v1 초안, 기존 "학습 제외" 문구 수정 목록, 구현 작업 목록

[0.52.2] — 2026-08-30

Added

  • 네이버 스마트스토어 판매 준비 — PG 연동 전 개인 결제 창구. 판매 가이드 docs/NAVER-SMARTSTORE.md(입점 서류·무형상품 정책 리스크·상품 설계·수수료· 수동 개통 플로우·환불 규정·바우처 시스템 후속 설계), 상세페이지 docs/smartstore/detail-page.html + 업로드용 PNG(860px 분할)·대표이미지 3종, 재생성 스크립트 scripts/render-smartstore.mjs

[0.9.53] — 2026-08-15

Changed

  • AX 무료 진단 페이지를 Veor 본사이트로 이관 — /consulting/ax 를 veor-inc.com/consulting/ax 로 302 리디렉션 (next.config.ts). 진단 경험(발굴 → 정밀 채점)은 Veor 저장소로 이식되어 그쪽이 정본. 기존 페이지·컴포넌트·/api/ax/* 는 이력 보존 차원에서 남겨두되 공개 진입은 막힘

[0.9.27] — 2026-08-13

Added

  • 한국형 게시판 (공지사항·FAQ) — 목록(순번·분류·제목·작성자·작성일·조회수), 새 글 N 배지(3일)·중요·📌 고정·첨부 클립, 페이지네이션(10페이지 블록 ‹ ›)·페이지 크기, 기간·분류·제목/내용 검색. 상세: 조회수 증가·첨부 다운로드·이전/다음 글. FAQ 게시판 동일 UI(탭). 관리자 작성에 구분(공지/FAQ)·분류·첨부(3개·5MB, DB 저장) 추가. 상단 배너는 banner 모드로 분리 유지

[0.9.19~21] — 2026-08-13

Fixed

  • 초대·비밀번호 재설정 메일 링크가 EC2 배포에서 localhost 로 나가던 문제 — APP_DOMAIN 폴백 (0.9.19)

Changed

  • 초대에서 임시 비밀번호 노출 제거 — 메일 성공 시 안내만, 실패 시 설정 링크 복사 버튼 (0.9.20)
  • 사용자 관리에 "초대됨 · 미접속" 배지 — User.lastLoginAt 신설(세션 발급 시 스탬프), 초대만 되고 아직 접속 안 한 구성원을 구분. 가입일에 마우스를 올리면 마지막 접속 표시 (0.9.21)
  • 미접속 구성원 초대 재발송 버튼 — 새 24시간 링크로 메일 재발송, 이전 링크 폐기, 메일 실패 시 링크 복사 폴백. 접속 이력 있는 계정은 차단(비밀번호 찾기 안내) (0.9.22)

[0.9.18] — 2026-08-13

Changed

  • 컴포저 클로드 스타일 재구성 — 입력 상자 안에 하단 도구 줄(첨부 · 지식베이스 · 웹검색 · 전송). 버튼이 입력창에 겹치는 절대배치를 폐기해 "버튼 위치가 안 맞아 보이는" 문제의 구조적 원인 제거. 여러 줄 입력 시 상자가 위로 자라고 도구 줄은 하단 고정, 지식베이스 메뉴는 상자 위로 열림

[0.9.17] — 2026-08-12

Added

  • 휴먼 인 더 루프 (변경 작업 승인) — 에이전트의 외부 MCP 도구 중 조회성 이름 (get/list/search 등)이 아닌 것과 관리형 API 의 GET 외 메서드는 실행 전 사용자 승인 필수. 모델이 실행하려던 내용(도구·인자)을 요약해 보여주고, 답변 하단 "승인하고 실행" 버튼을 눌러야 실제 실행된다(approveActions 턴 플래그). DB 쿼리(읽기전용)·지식베이스·웹검색 등 조회성 도구는 기존대로 자동. 관리형 API 의 관리자 allowWrite 게이트에 사용자 승인이 더해져 이중 게이트가 된다

[0.9.16] — 2026-08-12

Changed

  • 웹검색 기본 자동 — 토글 기본값 ON("웹검색 자동"). 모델이 최신 정보가 필요한 질문에서만 스스로 검색하므로 일반 대화엔 영향 없음. 끄면 localStorage 로 기억. (관리자 정책 off 면 숨김 유지)
  • 툴콜링 루프 스트리밍화 — runOpenAI 라운드를 스트리밍으로 전환(tool_calls 델타 조립, 실패 시 라운드 단위 논스트림 폴백). 웹검색 자동이 기본이 되어도 글자 단위 스트리밍이 유지되고, 에이전트(능력 부착) 대화도 스트리밍이 된다
  • 컴포저 버튼 정돈 — 첨부·전송 버튼 원형(34px)·정렬 통일

[0.9.15] — 2026-08-12

Fixed

  • 사이드바 푸터 고정 — 도구 메뉴를 펼치면 사용량·계정 카드가 화면 밖으로 밀리던 문제. 원인은 그리드 암시적 행이 콘텐츠만큼 자라 사이드바가 화면 높이를 무시한 것 (grid-template-rows: minmax(0,100dvh) + 목록·네비 내부 스크롤로 수축 허용)
  • 컴포저 높이 리셋 — 여러 줄 입력 후 전송하면 입력창이 이전 높이로 남아 첨부·전송 버튼 위치가 어긋나 보이던 문제 (input 변경 시 autoGrow 재계산)
  • 모델에 현재 날짜(KST) 주입 — "오늘/어제" 해석 불가로 웹검색 검색어가 무기준이 되고 옛 뉴스가 섞이던 문제. 시스템 프롬프트에 오늘 날짜 명시 + 웹검색 모드에선 검색어에 구체적 날짜를 포함하도록 지시 (검색 도우미(sonar) 프롬프트에도 동일)

[0.9.14] — 2026-08-12

Changed

  • 웹검색을 "도구"로 재설계 — 모델 교체 방식(0.9.13)을 폐기하고, 대화 모델(선택 그대로)이 web_search 도구를 호출하는 구조로. 검색 실행은 sonar 논스트림 서브콜(검색어만 전달 — 대화 내용은 검색 모델로 안 나감). 대화 맥락·후속 질문 유지, 검색 여러 번 가능. 게이트웨이 sonar 스트리밍 조기종료(출력 2토큰 절단)도 논스트림 전환으로 해소. 자동 선택 모델은 도구 지원이 불확실해 웹검색 대화에선 기본 모델로 대체
  • 웹검색 사용량 분리 집계 — web_search 서브콜을 UsageLog 별도 행(kind=web_search)으로 기록, 답변 메타에 🌐 웹검색 N 토큰 별도 표기. toolCore 가 게이트웨이 확정 KRW(cost)를 합산하게 되어 에이전트 도구 경로의 비용 누락도 함께 해소

[0.9.13] — 2026-08-12

Added

  • 웹검색 — 채팅 컴포저의 🌐 웹검색 토글. 켜면 검색 내장 모델(perplexity/sonar-pro, 비즈라우터 경유 — WEB_SEARCH_MODEL env 로 교체 가능)로 라우팅해 최신 웹 정보로 답하고, 출처를 링크 칩으로 표시. 관리자 접속·보존 정책에 "웹검색 허용" 스위치(끄면 토글 숨김+요청 차단, Workspace.allowWebSearch). 모델 화이트리스트와 독립 통제, verified_only 노출정책에선 자동 차단
  • 답변 과정 타임라인 — 지식베이스 검색·웹 검색·에이전트 도구 실행 단계를 답변 위에 실시간 칩으로 표시 (스트림 내 STEP_MARK 이벤트, 본문·대화저장과 분리)

Changed

  • 지식베이스 검색을 스트림 시작 후로 이동 — 검색 중에도 응답이 먼저 열려 과정이 보임
  • 사용량 위젯이 답변 완료 시 자동 갱신 (폴링 없이 veorai:usage 이벤트 — 답변 1회당 재조회 1회)

[0.9.0] — 2026-08-10

Added

  • 에이전트 빌더 — 지침·회사 지식(지식베이스)을 묶은 재사용 패키지. 템플릿 8종 (내부감사 도우미·회의록 정리·주간보고·계약서 검토·고객 답변·데이터 해설·온보딩·제안서) 갤러리에서 1분 생성, 워크스페이스 공유, 채팅에서 선택 시 지침+지식 자동 적용 (대화가 에이전트를 기억 — Conversation.agentId)
  • 그룹 채팅 + 팀 공유 메모리 — 전사/부서 방, 4초 폴링, AI 응답 토글(방 맥락+팀 메모리 참고), 메시지를 🧠 팀 메모리로 저장. 금칙어·PII 마스킹·월 한도·사용량 기록 동일 적용
  • 접속·보존 정책 (관리자) — ① 허용 IP 관리(단일·범위·CIDR, 로그인+API 차단, 수퍼 예외) ② 2단계 인증(OTP) 의무화(끄기/관리자만/전체 — 미설정자에게 상단 안내 바) ③ 로그인 만료 기간(분·시간·일·개월) ④ 파일 업로드 시 안내 팝업(관리자 문구, 세션당 1회) ⑤ 업로드 파일 형식 제한(확장자 체크, 클라이언트+서버 이중 검사) ⑥ 대화·첨부 보존 기간(매일 크론 자동 삭제) ⑦ 임직원 대화 CSV 다운로드(감사 로그 기록)
  • 공지사항 게시판 — 배너 단건 → 게시판 형태. 에토스AI 전체 게시(수퍼)와 회사 공지 (관리자 작성·상단 고정·게시 중지)를 한 목록에서 열람. 관리자 콘솔 "공지사항" 메뉴 신설
  • 사용자단·관리자단 크레딧 사용량 바 — 사이드바에 내 사용량/조직 전체(관리자) 월 비용
  • 전송 전 민감정보 감지 배지 — 입력창(붙여넣기 포함)에서 주민번호·카드번호 등 7종 실시간 감지, 정책(mask/off)에 따른 안내
  • 서브도메인 자동 예약 (부가서비스) — [입력].ethos.ai.kr 실시간 중복 확인 후 즉시 선점

Changed

  • 사이드바 전면 개편 — 상단 네비를 에이전트·데이터 커넥터 2개 + "도구 더보기" 접이식 (데이터에게 묻기·지식베이스·워크플로우·예약·공지사항·문서)으로 축소. 프로젝트·그룹 채팅 섹션을 최근 대화 위로(각 3개 + 더보기), RAG 메뉴명 "지식베이스"로
  • 사용자 초대·일괄 등록을 모달로 전환, 회사 정보 저장 토스트+자동 반영, 법인명(국세청 확인 시 잠금)/워크스페이스 이름 분리

[0.8.0] — 2026-08-09

Added

  • 업종 데모 팩 10종 체계 — 지자체·공공기관(집행)·공공연구기관·부품소재 제조·장비 제조· 제약바이오·수탁검사·건설·유통·IT서비스. 체험 발급 폼 업종 선택 확장(그룹핑), 각 팩에 시연용 인사이트 케이스 내장. 요구사항 발생 시 팩 단위로 디벨롭·재사용. 프로덕션 시드는 GitHub Actions "데모 ERP 시드(수동 실행)" 버튼으로 (Secrets 기반)
  • 공공·기관 랜딩 /gov — 세그먼트 상수 하나(lib/landingSegments.ts)로 기업/공공 분기. 기관 카피·예시 질문·공공 로고 순서·N2SF 보안 카드·CTA 순서 반전·전용 OG 이미지(og-gov.png)
  • 멀티 SSO (OAuth) — Google 외 Microsoft(Entra ID/MS365)·카카오·네이버·네이버웍스. env 클라이언트 키만 등록하면 로그인 화면에 해당 버튼 자동 활성 (lib/ssoProviders.ts 레지스트리)
  • 가입 두 갈래 분기 — "회사 등록(관리자)" / "초대 합류(구성원)" 선택 화면. 일반 사용자가 사업자번호 입력 앞에서 막히던 UX 해소
  • 사업자등록 상태 검증 — 국세청 상태조회 API 연동. 가입 화면에 계속/휴업/폐업/미등록 실시간 표시, 새 워크스페이스 개설 시 폐업·미등록 번호 차단 (장애 시 검증 스킵)
  • MCP 2단계 tool-search — 도구가 많은 외부 MCP 서버를 위한 임베딩 하이브리드 도구 선별
    • cheap-search 옵션(저가 모델로 도구 선별). 데이터 커넥터에 도구 검색 설정 UI (PR #3)
  • 문서 사이트 보안·배포 섹션 신설 — 보안 개요(신뢰경계)·개인정보 처리(한계 명시)· 데이터 처리 위탁 구조·접근 제어·감사 로그·N2SF 등급별 구성·배포 형태 3종·도입 절차

Changed

  • 랜딩 카피 전면 교체 — 결재자(비개발 관리자) 눈높이. 외래어 제거(커넥터→연결, 워크플로우→자동 처리, RAG→문서 근거 답변, DMZ→회사 안 연결장치), "데이터 유출 0" 등 검증 불가 절대 주장 삭제, 보안 카드 6장+위수탁 공개 카드, 검토 체크·도입 절차 섹션 신설
  • 메타·OG 브랜드 우선 표기 — 전 페이지 탭 타이틀 "에토스AI | 페이지명", 로그인 시 "에토스AI | 회사명". OG 타이틀 "에토스AI — 우리 회사(기관) 자료를 아는 AI", OG 이미지 Pretendard 재생성, 절대 URL을 ethos.ai.kr 로 고정
  • 모델 단가표 로그인 게이트 — 비로그인은 과금 방식+대표 4종 예시만, 전체 단가표는 로그인 후. noindex + robots.txt 색인 차단 (공개 단가 = 조달 상한선 리스크 회피)
  • 도입 문의 수신함 support@veor-inc.com 통일 (Resend 실발송 검증 완료), 연동 목록 정직 표기(연동 완료/개발 중/요청 시 — 실구현 기준), 성숙도 표현 정리(무통장→세금계산서 발행·계좌이체), 문서 GitHub 링크 제거(저장소 정보 노출 차단)

Fixed

  • /sales 리드 게이트 등록 후 덱이 안 열리던 문제 (배포 버전 스큐 — 하드 리로드로 교체)
  • 와이드 화면에서 다크 CTA 제목 왼쪽 쏠림 (margin 쇼트핸드가 auto 정렬을 덮던 문제)
  • 제품소개서 표 머리글이 스크롤 시 표 중간에 뜨던 문제 (overflow 박스 안 sticky)
  • OG 이미지가 한글 폴백 글꼴로 렌더링되던 문제 (Pretendard 설치 후 재생성)

[0.7.0] — 2026-08-07

Added — Edge Agent v0 (고객사 DMZ 콜홈 에이전트)

  • edge/ — docker compose 한 줄로 설치되는 콜홈 에이전트 (인바운드 0 · 아웃바운드 HTTPS 1). 사내 DB 를 READ ONLY 로 로컬 실행하고, 로컬 필터(PII 마스킹·엔티티 가명화) 통과본만 업링크. DB 접속정보·가명 매핑은 고객사 장비 밖으로 나가지 않음. 오프라인(망분리) 반입 절차 포함
  • EdgeJob 작업 큐 — 클라우드 enqueue → 에이전트 원자적 클레임 → 완료 업링크. 하트비트가 로컬 DB 스키마를 신고하면 [Edge] <라벨> 데이터소스 자동 등록 (kind=edge)
  • 데이터에게 묻기·MCP db_query 가 kind=edge 소스를 투명하게 콜홈 경유로 실행
  • QA: npm run qa:edge — 에이전트 기동→하트비트→콜홈 쿼리→가명화→쓰기 차단 E2E (CI 편입)

[0.6.0] — 2026-08-07

Added — MCP 클라이언트 (커스텀 MCP 서버 연결)

  • 커스텀 MCP 서버 등록 — 데이터 커넥터 화면에서 표준 MCP 서버 URL+인증을 등록하면 실검증(initialize+tools/list) 후 AI(데이터에게 묻기)가 그 서버의 도구를 호출. 카탈로그에 없는 시스템도 고객이 직접 확장 (워크스페이스당 10개 서버 · 서버당 24개 도구)
  • 신뢰 경계: 인증값 AES-256 봉인, 외부 도구 호출 전건 감사 로그, 도구 결과 내 지시문 무시 강제, 관리자 시험 호출 API
  • QA: 셀프 루프백 하네스 npm run qa:mcp-client (자사 MCP 서버를 클라이언트로 등록해 서버·클라이언트 동시 검증)
  • MCP 클라이언트 v2 — 도구별 ON/OFF(칩 토글) + 엄격(strict) 워크스페이스는 외부 MCP 차단
  • 체험 워크스페이스 업종 데모 자동 연결 — 발급 폼에서 공공행정·제조·수탁검사 선택 시 데모 ERP 가 데이터 소스로 자동 등록 (DEMO_DB_* env)
  • CI QA 파이프라인 — main push 마다 pgvector PG 컨테이너에서 마이그레이션→데모 시드→ 빌드→서버 기동→MCP 서버·클라이언트 하네스 실행 (.github/workflows/qa.yml, LLM 키 불필요)

[0.5.1] — 2026-08-03

Changed

  • 표기 한글화 — 국내 시장 전용 확정에 따라 제품 표기를 에토스AI로 통일 (로고 워드마크·화면·메일·문서·OG). 파생: 에토스 허브(MCP)·에토스 AI 게이트웨이·에토스 스마트 라우팅. 영문 Ethos.AI 는 도메인(ethos.ai.kr)·검색 키워드로만 유지
  • CI: EC2 배포·Slack 알림 워크플로우가 시크릿 미등록 시 실패 대신 skip
  • 업종별 데모 ERP 시드 — 공공행정·제조·수탁검사 3개 팩(npm run seed:demo) + MCP QA 하네스(npm run qa:mcp). 데이터에게 묻기가 게이트웨이 키 하나로 툴콜링하도록 통일
  • MCP Hub → 데이터 커넥터 명칭 변경 (소비자 언어) — 외부 MCP 서버명은 "에토스AI MCP"
  • 브랜드 컬러·심볼 전면 교체 — 심볼을 솔리드 방패로, 브랜드색을 베오르 블루에서 에메랄드(#0FA47A)/딥 포레스트(#0D2B23) 로 전환. 앱 강조색·다크 섹션·파비콘·OG 일괄 적용

[0.5.0] — 2026-08-03

Changed — 제품 브랜드 전환: Ethos.AI

  • 리브랜딩 — 제품명 VeorAI → Ethos.AI (신뢰·보안 강조, 도메인 ethos.ai.kr 예정). 화면·메일·문서·OG·파비콘·로고(E 모노그램) 전면 교체. 법인 표기(주식회사 베오르)와 운영 env(VEOR_*)·저장소명은 호환성 유지를 위해 그대로 둠

Added

  • 테넌트별 MCP 서버 (Ethos Hub) — 워크스페이스마다 표준 MCP 엔드포인트(POST /api/mcp, Streamable HTTP) 노출. Claude Desktop 등 외부 에이전트에서 API 토큰으로 연결, 지식베이스 검색·DB 조회·메신저 발송 등 연결 상태에 따라 도구 동적 노출
  • 토큰별 도구 제한 — API 토큰 발급 시 허용 MCP 도구를 선택(부서별 권한 분리)
  • 데이터 노출 수준 관리 (L0~L4) — 관리자가 외부 모델사 노출 수준을 트랙 UI로 선택. 세부 기능 17종(개인정보 마스킹·엔티티 가명화·문서 발췌 가명화·첨부 차단·검증 모델사 제한 등) 개별 ON/OFF, 레벨 탭 클릭 시 해당 단계만 표시, 엔티티 가명화는 응답 스트림에서 자동 복원
  • 도입 문의 모달 — 랜딩 어디서나 회사명/담당자/이메일/내용 접수 → 운영 메일 자동 전달

Changed

  • 관리자·수퍼 화면 설명 문구 전수 정리 — 긴 안내를 ⓘ 툴팁·접기로 축약
  • /sales 랜딩 전면 개편(스티키 네비·기능 블록·비교표), 홈(/)은 비로그인 시 게이트 없는 랜딩
  • 모델·요금 문서를 게이트웨이 라이브 단가(원화, 10% 마진, 10원 올림)로 자동 표시

[0.4.0] — 2026-07-25

Added — AI 게이트웨이 전환 · 원화 과금 · 관리자 전면 개편

  • 통합 AI 게이트웨이 서빙 — 모든 LLM 호출이 단일 게이트웨이를 경유. OpenAI·Anthropic·Google·xAI· Perplexity·Upstage·DeepSeek·Qwen·MoonshotAI·MiniMax·Z.ai 등 95+ 모델을 한 키로 서빙, 모델 목록 라이브 조회, 오류 한국어 매핑, 스마트 라우팅(옵션)
  • 원화 확정 과금 미터링 — 호출별 실제 과금액(KRW, 부가세 제외 공급가액)을 UsageLog.costKrw로 저장. 이용 통계·대시보드 전면 원화 표시(소수 3자리), 게이트웨이 도입 이전 기록은 통계에서 제외
  • 비용 한도 관리 — 워크스페이스 월 비용 한도 + 구성원별 월 이용 요금 한도(관리자 인라인 설정, 80/100% 진행바) — 한도 도달 시 채팅 429 차단
  • 사용자 관리 전면 개편 — 검색(이름·이메일·부서), 인라인 한도 편집, 이용 ON/OFF, 권한 변경, 행 수정(이름·부서), 일괄 등록(붙여넣기 → 임시 비밀번호 일괄 발급, 최대 200명), CSV 다운로드, 2FA 해제(기기 분실), 초대 메일(비밀번호 설정 링크 24h)
  • 모델·보안 정책 탭 — 허용 모델을 프로바이더 그룹(로고·전체선택)으로 통제 + 데이터 처리 정책 고지: 모델사 공개 문서로 확인된 학습 미사용 범위(근거 링크)와 미확인 표시를 구분 명시
  • 임시·체험 계정 — User.expiresAt 만료일 기반. 만료 시 로그인·SSO·채팅·API 전부 차단, 목록 임시 D-n/만료 배지, 초대 시 만료일 지정·해제(정규 전환). 수퍼 전용 체험 워크스페이스 발급(회사명+담당자+만료일 → 관리자 계정, 초대 메일 자동)
  • 수퍼 콘솔 사이드바 셸 — 왼쪽 워크스페이스 목록(검색·인원·체험 배지)으로 개별 조회, 전체 현황은 KPI + 활동 TOP 8 요약. 게이트웨이 사용량·잔액, 환경 구성 점검, 도입 문의 목록 표시
  • 청구서 자동 발행 문서 — /invoice/[id] 인쇄/PDF (공급가액·부가세 자동 분리, 공급자 env, 공급받는자 워크스페이스 자동), 관리자 결제 페이지에서 다운로드
  • 사업자번호 자동조회 — 가입 화면에서 10자리 입력 시 법인명·주소 자동 완성(금융위 공공데이터, 폴백 수동)
  • 세일즈 랜딩 v2 — 슬라이드형 → 섹션 스크롤형 SaaS 랜딩(스티키 네비·제품 목업·연동 실로고 스트립· 기능 교차 블록·비교표), 모바일 최적화. 홈(/)은 로그인 시 채팅 앱, 비로그인 시 게이트 없는 랜딩, /sales는 리드 게이트 유지
  • 도입 문의 시스템 — 랜딩 문의 모달 → DB 저장 + 영업 수신함(CONTACT_INBOX) 메일 전달(replyTo=문의자), 모바일 바텀시트
  • 브랜드 로고 실장착 — 사내 시스템 24종(이카운트·더존·팝빌·네이버웍스 등) 실로고, 모델사 12종 실로고(Claude·OpenAI·Gemini·Grok·DeepSeek·Qwen·Kimi 등)
  • OG·메타 전면 정리 — og:image(1200×630)·apple-icon·타이틀 템플릿·키워드·robots·테마컬러, NEXT_PUBLIC_APP_URL 기반 절대 URL

Changed

  • 모든 기간 집계(월·일 경계)를 KST(Asia/Seoul) 고정 산정으로 통일
  • Vercel 함수 리전 서울(icn1) 고정 — DB(서울 RDS) 왕복 지연 제거
  • 관리자·수퍼 화면 간격/카드 레이아웃 정리(섹션 20px 리듬)

Fixed

  • 로그인 라우트가 비활성(active=false) 계정을 차단하지 않던 문제 — 비활성·만료 검사를 로그인·SSO·가드·채팅 전 경로 공통화

[0.3.0] — 2026-07-19

Added — 2026-07-19 2차: 보안·자동화·과금 완성

  • 2단계 인증(TOTP) — RFC 6238 자체 구현, 인증앱 QR·수동 키, 로그인 2단계(5분 pending), 시크릿 AES-256 봉인
  • 개인정보 필터 — 주민번호(생년월일+체크섬)·카드(Luhn)·전화·이메일·여권·면허 7종을 LLM 전송 전 + 저장 전 마스킹. 워크스페이스 정책(off/mask), 답변에 🔒 마스킹 건수 표시
  • 채팅 파일 첨부 — 이미지 비전 입력(Claude·GPT·Gemini) + 문서(pdf·docx·hwp 등) 텍스트 추출 인라인, 썸네일·칩 표시
  • 워크플로우 서버 저장 + 스케줄 트리거 — 이름 저장·불러오기·공유, 요일·시각(KST) 정기 실행, 최근 실행 상태
  • MCP Hub 실연동 — Connection 모델(AES-256 봉인). Slack·잔디·두레이 웹훅 실발송 검증, Notion·카카오워크 토큰 검증, PostgreSQL 실접속 테스트, 그 외는 암호화 저장(승인 후 활성). 워크플로우 Slack 노드가 연결 자동 사용
  • 지식베이스 복수화 + 부서 권한 — 부서 전용 KB 는 해당 부서·관리자만 접근 (업로드·검색·삭제·채팅 결합 전부)
  • 프롬프트 금칙어 — 관리자 등록 단어 포함 시 전 경로 차단 + 사유 표시
  • 공지사항 — 수퍼 게시 → 전 테넌트 상단 배너 (일반/주의, 닫음 기억)
  • 결제(무통장 입금) — 요금제(trial/standard/enterprise), 청구서 자동 채번(VE-YYYYMM-####)·입금 확인, 관리자 결제 페이지(입금 계좌·내역). 카드 PG 미사용
  • 계열사 그룹 — 본사-종사업장 2단계 그룹, 그룹 통합 사용량 (수퍼 콘솔)
  • 비밀번호 정책 + 보안 헤더 — 8자+영문+숫자·흔한 비밀번호 차단, CSP·HSTS·X-Frame-Options 등
  • Gemini 툴콜링 — 데이터에게 묻기 3사(Claude·GPT·Gemini) 모두 실 도구 호출 지원

Added — 2026-07-19 대규모 기능 확장

  • 대화 이력 DB 저장 — 로그인 시 모든 대화 서버 저장·기기 간 동기화, localStorage 1회 자동 이관. 대화 삭제·이름 변경·검색, 스트리밍 중단(부분 답변 저장), 답변 복사, 답변별 모델·토큰·시간 표기
  • 프로젝트 — 대화 폴더 + 프로젝트 지침 자동 주입, 지식베이스 자동 결합 옵션
  • RAG 지식베이스 — 업로드(txt·md·csv·json·pdf·docx·xlsx)→청킹→임베딩(pgvector)→근거 인용 답변. 일반 채팅 "지식베이스 ON" 토글, HNSW 인덱스, OpenAI 임베딩 + 키 없을 때 로컬 폴백
  • 실데이터 연결 — 회사 PostgreSQL 등록(비밀번호 AES-256-GCM 암호화)→AI가 SQL 생성·읽기전용 실행 (READ ONLY 트랜잭션 + 단일 SELECT + 타임아웃·행수 제한). "데이터에게 묻기"에서 소스 선택
  • 예약 리포트 — 요일·시간(KST) 지정 정기 실행, 결과를 대화로 배달. Vercel Cron + 지금 실행
  • 모델 라이브 조회 — Anthropic /v1/models 실시간 조회로 Claude 전 세대 노출, 정적 폴백 14종
  • 조직 관리 확장 — 초대 이메일(비밀번호 설정 링크), 월 토큰 한도(전 경로 429 차단)+진행바, 관리자 모바일 사이드바
  • 수퍼 관리자 — 워크스페이스 행 클릭 → 상세 드릴다운(구성원별 사용량·14일 추이·모델별·문서·토큰)
  • 온프레미스 미터링 — POST /api/v1/metering 집계 카운터 수신(내용 미전송), 대시보드 합산
  • 보안 하드닝 — 로그인·가입·비밀번호찾기 레이트 리밋(Postgres 고정 윈도우)
  • function.md — 구현/목업/미구현 전수 정리 문서
  • 워크플로우 실행 엔진 — 캔버스 그래프를 서버가 실제 실행(AI·RAG검색·DB조회·이메일·웹훅), 노드별 결과 패널 + 실행 이력(WorkflowRun)
  • Google SSO(OIDC) — env 설정만으로 활성화, 신규는 비밀번호 없는 가입
  • 한글 문서 지원 — .hwp(CFB 레코드 파서)·.hwpx(OWPML) 텍스트 추출 → RAG 업로드
  • /sales 리드 게이팅 — 이름·직책·이메일 입력 후 열람(30일 쿠키), 수퍼 콘솔에서 열람자 조회
  • /brochure — 전체 기능 명세표(엑셀형, 39개 기능) · /manual, /manual/admin — PPT 스타일 사용자/관리자 매뉴얼 (각 8슬라이드)

Added

  • 관리자 대시보드 (/admin) — 실시간 사용량 조회
    • 챗·데이터Q&A 사용 시 UsageLog 기록(누가·모델·토큰·부서). Anthropic·OpenAI·Gemini 토큰 캡처
    • 관리자(ADMIN) 전용, 본인 워크스페이스 스코프: 총 메시지·토큰, 구성원별·모델별·부서별 집계, 최근 활동
    • 15초 자동 갱신 + 새로고침. 비로그인→로그인, 구성원→차단(403/리다이렉트) 3중 게이팅
  • 엔터프라이즈 인증 (Phase 1) — 실제 백엔드 첫 도입 (Docker/AWS 대상)
    • Prisma + PostgreSQL 데이터 모델: 워크스페이스(사업자번호)·부서·유저·대화·메시지
    • 회원가입/로그인/세션: 사업자번호 기준 워크스페이스, 최초 가입자=관리자·이후=구성원, 부서 upsert. bcrypt 해시 + jose 쿠키 세션(HttpOnly)
    • 가입 게이팅: AUTH_ENABLED=true 시 로그인해야 앱 진입(미들웨어). 없으면 기존 데모 모드 유지 → Vercel 데모 안 깨짐
    • Docker 구성: Dockerfile·docker-compose.yml(앱+Postgres), 시작 시 자동 마이그레이션
    • API: /api/auth/{signup,login,logout,me} (모두 서버 전용), /login·/signup 페이지
  • 프로바이더 연동 상태 표시: /api/health(키 존재 여부만 반환, 키값 비노출) + 모델 선택기에 프로바이더별 "연결됨/키 필요" 배지 — 실제 테스트 전 연동 확인
  • 데이터 Q&A 고도화 — 업종·차트·세일즈 데모
    • 업종별 데이터셋: 건설·제조·유통 3종, MCP Hub에서 전환(스탯·답변·차트 모두 반영)
    • 답변 차트: 미수금·매출(바), 재고 대비 안전재고(게이지) — 툴 결과에서 결정적 생성, ChartView
    • /sales 라이브 데모 임베드: 슬라이드에서 실제 질문→조회→근거·차트 답변을 바로 시연(SalesDemo)
  • 데이터에게 묻기 (핵심 기능): 연결된 사내 데이터에 자연어로 물으면 AI가 실제 조회해 근거와 함께 답
    • lib/dataQuery.ts 결정적 쿼리 엔진(매출·미수금·재고) + 데모 데이터셋(lib/demoData.ts)
    • /api/data-chat — Anthropic·OpenAI 툴 콜링 루프 + 키 없을 때 결정적 폴백(실쿼리), NDJSON 스트리밍
    • DataAsk.tsx — 연결 배너·실계산 스탯·툴 콜 근거 칩·마크다운 답변, 사이드바 최상단 배치
    • 예: "이번 분기 미수금 왜 늘었어?" → 미수금 조회 → "직전 분기 대비 66%↑, 60일초과 85%…" 실데이터 답

Changed

  • 포지셔닝 재정렬 — "자동화 위의 AI 현황·보고 레이어": 실행(RPA·MES) 경쟁이 아니라 그 위의 확인·현황·보고로 메시지 전환
    • /sales 카피 전면 리라이팅: 히어로 "자동화는 이미 돌아갑니다, 문제는 아무도 안 본다는 것" + 문제 재정의(취합·사각지대·파편화)
    • 4기둥을 읽기(연동)·확인(파이프라인)·이해(RAG)·보고(예약) 레이어로 재구성
    • 보안 슬라이드 "읽기만 합니다, 그래서 더 안전합니다"(읽기 전용 + DMZ)로 강화
    • MCP Hub 헤더도 "읽어옵니다(현황 수집)" 톤으로 정렬

Added

  • 제품 소개 페이지 /sales (PPT 슬라이드 느낌, 11슬라이드): 홍보·세일즈용 랜딩
    • 히어로 · 문제 · 솔루션 4기둥(워크플로우·MCP·RAG·예약) · 강점 슬라이드
    • 보안 슬라이드: DMZ 게이트웨이 3존 구조도 + 인바운드 개방0·자격증명 사내보관·망분리 대응·최소권한 4대 보증
    • 멀티 프로바이더(Claude/GPT/Gemini)·왜 VeorAI·도입 문의 CTA
    • scroll-snap 슬라이드, 브랜드 토큰 기반 반응형

Changed

  • MCP Hub 연동 정보 실검증: 30종 각 시스템의 공식 개발자문서를 조사해 실제 연동 방식으로 교체
    • DMZ 게이트웨이 아키텍처 명문화: 고객사 DMZ에 Connector(API 게이트웨이) → 내부 API 노출 → Hub는 아웃바운드로만 통신
    • 연동 가능 3등급 배지: 바로 연동(공개 API·DB) / 승인·구축 필요 / 직접연동 불가(망분리·API 없음)
    • 실제 공개 API 확인: 이카운트·SAP·팝빌·바로빌·네이버웍스·카카오워크·두레이·잔디·하이웍스·나라장터(공공데이터포털 OpenAPI)·Slack·Teams·Google·Notion
    • 직접연동 불가 정직 표기: 웹케시·홈택스·위택스(중계사 경유)·새올·온나라·e호조(행정내부망 망분리)
    • 각 시스템 실제 인증 방식·공식 개발자문서 링크 추가, closed 등급은 연결폼 대신 현실적 경로 안내
    • Docs 4종(/docs/mcp) DMZ 기준으로 전면 재작성

Added

  • RAG 지식베이스(파일 업로드 중심): 지식베이스 관리 + 드래그앤드롭 업로드
    • PDF·Word·한글(HWP)·Excel·CSV·텍스트·PPT·Markdown 등록, 미지원 형식 구분
    • 문서별 크기·추정 청크 수·임베딩 상태(임베딩 중→준비 완료) 표시, 문서 검색
    • 지식베이스 생성/삭제, localStorage 저장 (실제 청킹·임베딩은 사내 RAG 백엔드)
  • 워크플로우(N8N 스타일 노드 캔버스): 시각적 자동화 빌더
    • 노드 팔레트 5종(트리거·AI·연동MCP·로직·액션, 총 15개 노드)
    • 드래그로 노드 이동, 출력→입력 포트 드래그로 연결(베지어), 연결 클릭 삭제
    • 노드 선택 인스펙터(이름 편집·삭제), 캔버스 패닝, 실행 시뮬레이션(위상순 하이라이트)
    • 예시 워크플로우("매일 매출 요약→Slack") 기본 제공, localStorage 저장
  • MCP Hub 연동 카탈로그: 국내 기업 시스템 30종 연동 카드 (검색·카테고리 필터 + 연결 모달)
    • DB(PostgreSQL·MySQL·Oracle·MSSQL·Tibero·MongoDB) 바로 연결 폼
    • ERP(이카운트·더존·영림원·SAP·웹케시) · 세무(팝빌·바로빌·홈택스·위택스)
    • 그룹웨어(네이버웍스·카카오워크·두레이·잔디·하이웍스·다우오피스) · 협업(Slack·Teams·Workspace·Notion)
    • 공공(새올·온나라·e호조·나라장터·정부24)
    • Docs 연동 가이드 4종(/docs/mcp) — 개요·DB·시스템·공공설치형
  • 모바일 최적화: 사이드바 슬라이드 드로어(햄버거) + 백드롭, docs 접이식 네비, 헤더·입력·카드 반응형
  • 커스텀 모델 선택기(ModelPicker): 프로바이더별 그룹 + 실제 로고 + 체크. native select 제거
  • 프로바이더 로고(public/logos/*.svg): Anthropic·OpenAI·Google — 파일 교체로 공식 로고 반영 가능
  • 버튼 폴리시: docs 상단 앱열기(primary)/GitHub, 모바일은 햄버거 메뉴로 수납

이하 이전 기록

  • 문서 사이트 /docs (SaaS 스타일): 개요 · 시작하기 · 릴리스 노트 · 모델·프로바이더 · API 레퍼런스
    • 릴리스 노트는 CHANGELOG.md를 렌더(버전관리 단일 소스), 앱 사이드바에 "문서" 링크
  • 사이드바 재설계: 프로젝트/MCP Hub/RAG/워크플로우/예약 네비 + 하단 계정 카드
  • 커밋 단위 Slack 알림 (scripts/notify-commit.mjs) — 커밋→push→Slack 자동화

[0.2.0] — 2026-07-14

Added

  • 멀티 프로바이더 모델 연동: Anthropic(Claude), OpenAI(ChatGPT), Google(Gemini) 동시 지원
    • 모델 레지스트리 단일 소스: lib/models.ts (프로바이더·모델 ID·환경변수 매핑)
    • 헤더에 모델 선택 드롭다운 (프로바이더별 그룹). 선택은 localStorage 저장
    • /api/chat 프로바이더 라우팅: Anthropic/OpenAI는 공식 SDK, Gemini는 REST SSE 스트리밍
  • 개발 이력 문서(본 파일) + 버전관리 규약 도입

Notes

  • 프로바이더 키는 각각 ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY (.env.local)
  • 키 없는 프로바이더 모델을 고르면 안내 메시지 반환

[0.1.0] — 2026-07-14

Added

  • VeorAI 챗 앱 초기 구축 (Next.js 15 + React 19 + Tailwind v4 + TypeScript)
  • Veor 브랜드 적용 (veor/brand/02_guideline.md 기준)
    • 컬러 토큰(ink #0B1F3A / pulse #2E7BFF), Pretendard·Inter·JetBrains Mono, 8px 그리드, V 모노그램 로고
  • ChatGPT/Claude 스타일 메인 챗 UI
    • 다크 사이드바 + 대화목록, 스트리밍 응답, 마크다운 렌더, localStorage 대화 저장, 자동확장 입력창
  • Claude Fable 5 백엔드 (/api/chat, Anthropic SDK 스트리밍)
  • GitHub 연동: spacebar-corp/Ethos-AI (구 spacebar-corp/VeorAI)