팀 칸반 보드
박소연 · 에이전트
김민아 · 앱·프론트
진수택 · 인프라·총괄
이우정 · 백엔드
할 일 (6)
면접 일정 실연동
면접 일정 테이블(scheduled_at·round) 없어 대기
JWT 로그인 연동 (secure storage)
팀 Android 기기 전원 APK 설치 확인
W2 완료 기준의 나머지 절반 — 내 기기만 확인됨
opus-5 실측 · 운영 STT 테스트
수직 슬라이스 관통 확인 (게이트 조건)
프론트 공개 지원 폼 /apply/:token 대기 — 09/03까지 없으면 백엔드 단독 관통으로 대체
무인증 대조 스크립트화 → J8 전달
지금까지 나온 결함이 전부 이 대조에서 나왔다
진행 중 (5)
Flutter 앱 M1 (조회·단계 변경·평가)
Qwen3-8B QLoRA 학습 파이프라인 · 시연 배포 스크립트 — AWS G4dn 학습 겸용
AWS g4dn.xlarge(T4 16GB) 에서 학습 진행 중 · 예상 21:20 완료
로컬 노트북 GPU 부족으로 AWS 클라우드 GPU 로 학습을 옮긴 파이프라인 일괄.
학습 데이터 222건(실측 21 + 합성 192 + 인터뷰 chain 시드 9) 로 아르 도구 호출·요약·서류 대조·꼬리질문·점수까지 5개 chain 을 한 모델에 학습.
QLoRA(가중치 4-bit 압축 + 작은 어댑터만 학습) 방식으로 T4 16GB VRAM 에 8B 모델을 얹었다.
같은 인스턴스에 학습→GGUF 변환→Ollama 배포까지 원스톱 · 예상 총 비용 ~$10(예산 $400 의 3%).
결과물은 50MB 어댑터 하나 · 시연 서버(g4dn) 에서 `AGENT_CHAT_BACKEND=ollama` 한 줄로 Anthropic Claude 대체.
면접 일정 조율 에이전트 — 면접관 가용 시간 파악→후보 제안→선택→확정
search_users 도구 추가로 이름→ID 변환 가능, 라이브 테스트 통과
목업 테스트 → 프론트 전달
재배포 반영 확인 — 코어 API + GET 13개 무인증 대조 재실행
운영 이미지가 08/27~28 시점. 재배포 자체는 인프라 소관
완료 (107)
실시간 면접 WebSocket — 말이 끝나면 다음 질문
ADR-0029 · 답변 단위가 아닌 실시간 스트리밍 경로
영상·오디오를 실시간으로 흘려보내며 답이 끝나는 지점에서 다음 질문으로 넘어가는 경로.
진위 판별 서비스 배포 — Dockerfile + 운영 compose + /ai/*
CPU 모델·GPU 불필요
표정·음성 진위 판별 서비스(ADR-0029)를 컨테이너로 만들어 운영 compose 에 붙임.
리버스 프록시 /ai/* 로 접근, CPU 모델이라 GPU 서버 불필요 — 같은 EC2 에서 돌린다.
표정·음성 진위 판별 도입 결정 — ADR-0029
이전 결정(표정 분석 제외)을 개정, 진위 판별을 재도입하는 결정 문서.
자소서 주장 → 면접 꼬리 질문 생성
자기소개서에 나온 주장을 근거로 면접에서 물어볼 후속 질문을 생성.
면접 영상 진위 판별 서비스 초안
진위 판별 서비스의 초기 형태를 저장소에 추가.
지원자 칸반 보드 UI (드래그 단계 이동)
지원자 카드를 드래그해 단계(지원 접수→서류 검토→면접→최종)를 이동하는 메인 보드 UI — D2·D3.
프론트 뼈대 (React 라우팅·레이아웃)
React(Vite·TS) 라우팅·레이아웃 뼈대 구축(1주차 React 전환 작업).
API 연동 — 로그인·공고·대시보드·지원자·평가
백엔드 실제 API 5개 영역(로그인·공고·대시보드·지원자·평가) 연동(큐7).
공고의 지원자 화면 + 상세 패널·일괄 단계 변경
공고별 지원자 목록 화면과 상세 패널, 지원자 일괄 단계 변경 — D1·D4·D9.
지원자 상세 패널 UI 개선 + 더보기 페이지 + 모바일 UI
지원자 상세 패널(D4·D5)의 정보 배치와 시각 정돈, 더보기 페이지 신설, 모바일 UI 개선(progress dots 정렬 등).
모바일 웹 셸(D11) · 첨부 파일 블록(C7) · F4 업로드 진행률 · 로그아웃 진입점 3종
768px 이하에서 하단 탭바(공고·지원자·홈·캘린더·더보기)로 감싼 모바일 웹 셸.
지원자 상세 패널에 첨부 파일 블록(C7 프론트 몫), F4 업로드 진행률 바, 로그아웃 진입점 3곳(우측 상단·설정 계정 탭·박스 정리).
모바일 툴바 sticky·overflow·단계 필 균등 폭 등 부수 fix 다수.
오른쪽 패널 통합 · 캘린더 딥링크·다중 선택 · 아르 3D 캐릭터
05-design 토큰 일괄 정리
상세·아르·캘린더·평가 네 자리로 나뉘던 오른쪽 패널을 한 자리(단일 개방·폭 360·모션 통일)로 합침.
캘린더 시간대 다중 선택, 대시보드 축소판→그날 패널→지원자 상세 딥링크.
아르 아이콘을 3D 캐릭터 렌더 PNG 로 통일, 색·그림자·radius·간격을 05-design 토큰으로.
프론트 실연동 착수 — API 클라이언트·대시보드·지원자·평가·설정 + 칸반 뷰
큐 7·8 프론트 몫
API 클라이언트·인증 배선과 공고 목록 실연동, 대시보드·지원자·평가·설정 5개 영역 실연동, 지원자 상세 연결과 패널 겹침 수정.
칸반 뷰(드래그로 단계 변경, 토스트 안내) 추가.
빈 화면 구현 · 앱 셸 개선 · 아르 UX
기능 진입 전 빈 상태 화면을 채우고, 앱 셸(상단 바·사이드바)의 여백·순서 정돈, 아르 채팅 진입 UX 다듬음.
React 로그인·공고 목록·대시보드 면접 일정 · 면접 일정 화면
React 로그인·공고 목록 화면, 대시보드에 면접 일정·전형 현황, 면접 일정 화면 추가와 대시보드 진입점 연결.
목업 검토 후 마감 뱃지 스타일 누락 수정.
목업 화면 3종 — 대시보드·공고·지원자 등록 + 이동/닫기 fix
정적 목업 → 이후 React 실연동
대시보드 정적 목업, 공고·지원자 등록 화면, 목업 화면 간 이동 연결과 닫기 표시·헤더 정렬 수정.
캐릭터 "아르다" 반영.
제출물 무결성 배지 — 상세 패널 첨부 아래
이력서·자소서 위변조 여부를 배지로 표시
매일 게시되는 앵커(ADR-0028) 기준으로 제출물이 게시 이후 바뀌지 않았는지 배지로 표시.
대시보드·평가현황·셸 재구성 — 시안 반영
백엔드 변경 없음
대시보드와 평가 현황 화면을 새 시안으로 재구성.
부수적으로 평가 현황이 빈 상태에서 좁고 길쭉하게 서던 문제와, 단계 램프 세 칸이 다 회색으로 보이던 것, 평가 현황 열이 계단처럼 어긋나던 것을 함께 수정.
다크 딥네트워크 테마 — 프론트엔드 디자인 전면 교체
전체 화면 톤을 다크 딥네트워크로 통일.
설정에 로그아웃 진입점 — 데스크톱
데스크톱 웹에 로그아웃 버튼이 아예 없던 것을 설정 화면에 붙임.
공고 삭제 — 수정 화면 하단 + 확인 시트
공고 삭제 흐름을 앱 수정 화면 하단에 두고, 되돌릴 수 없는 동작이라 확인 시트로 한 번 더 물음.
백엔드 분담 큐 (B2 → D1 → D6)
08/25 완료 — B2 #32 · D1 #48 · D6 #72
전환기 백엔드 분담분 — B2(#32)·D1(#48)·D6(#72) 3건 구현·머지(08/25).
앱 스택 Flutter 재확정 (ADR-0010)
iOS 를 시연 범위에서 빼면서 Expo 기각 근거가 사라졌다 — #110 · #113
iOS를 시연 범위에서 제외하면서 Expo 채택 근거가 사라짐 — Flutter·Dart로 재확정(#110·#113), ADR-0010 갱신.
Flutter 프로젝트·디자인 토큰·내비게이션 뼈대
05-design 토큰 Dart 이식 · IBM Plex Sans KR 번들 — #114
05-design 토큰을 Dart로 이식, IBM Plex Sans KR 폰트 번들, 내비게이션 뼈대 구성(#114).
지원자 리스트 화면 (목데이터)
상단 바·공고명·단계 탭·카드 리스트 — #137
상단 바·공고명·단계 탭·지원자 카드 리스트 — 목데이터 기반 화면 완성(#137).
지원자 상세·로그인 화면 (목데이터)
지원 정보·단계 변경 버튼·로그인 — #138 외
지원 정보·단계 변경 버튼이 있는 상세 화면과 로그인 화면 — 목데이터 기반(#138 외).
모바일 시안 요청 — 목업에 없던 5건
프론트 담당자에게 요청 → 같은 날 시안 도착. 보류가 풀렸다
단계 변경 UI·이력 타임라인·평가 목록·퍼널 바 배치·모바일 공고 리스트 —
목업에 없어 05-design §12 대로 멈추고 요청한 5건. 시안이 도착해 전부 반영했다.
앱 이름 Arda · 런처 아이콘
PR #142
홈 화면 이름이 flutter create 값(arda)으로 남아 있어 Arda 로 고쳤다.
런처 아이콘을 Flutter 기본 로고에서 교체하고 Android 8+ 적응형 아이콘까지 생성.
원본 하나만 바꾸면 전 해상도가 다시 만들어지게 flutter_launcher_icons 로 배치했다.
시안 반영 ① 치수·단계 칩·상세 카드형
PR #143
화면 여백 12→16dp, 탭 44→48dp, 지원자 카드 72→88dp.
단계 표시를 글자에서 알약 칩으로, 상세 닫기를 X 에서 뒤로가기로,
지원 정보를 2단 그리드에서 카드형으로 바꿨다.
시안 반영 ② 퍼널 바 · 탭 인원수
PR #144
막대는 비율만, 숫자는 탭이 맡는 분담(폰 너비에 라벨이 안 들어간다).
막대는 읽기 전용 — 8dp 는 48dp 터치 타깃을 못 채운다.
Row 기본 정렬 때문에 막대 높이가 0 이 되던 버그를 찾아 고치고, 크기를 재는
테스트를 붙였다 — 눈으로는 "가늘어서 안 보임"과 "높이 0"이 구분되지 않는다.
시안 반영 ③ 공고 리스트 — 앱 첫 화면
PR #145
앱 계층이 공고 → 그 공고의 지원자 → 상세가 됐다. 지원자에서 시작하면
지금 어느 공고를 보는 중인지가 화면에 없다(05-design §0.5).
상단 바도 로고형에서 제목형으로 바뀌었다.
시안 반영 ④ 단계 변경 시트 · 단계 이력 · 평가 목록
PR #146
단계 변경은 메일이 나가는 되돌릴 수 없는 동작이라 확인 시트를 뒀다.
backend/app/stages.py 전이 규칙을 앱으로 옮겨 갈 수 있는 단계만 보여주고,
메일 경고는 NOTIFY_STAGES 에만, 불합격은 사유 없이 못 넘어가게 했다.
단계 이력·평가는 상세 안 섹션이 아니라 별도 화면으로 뺐다.
테스트 36 → 42개.
큐 8 완료 — 앱 서버 실연동 전 영역
공고 CRUD·평가 쓰기·메모·이름/비밀번호 변경·메일 발송·이력서 열기·캘린더·메일 이력·설정 3탭·대시보드·평가 큐·통합 검색·아르 서버 연동까지.
큐 8 4단계가 하루에 마무리됨.
큐 7 JWT 로그인 · 큐 8 착수 · 단계 변경 저장 · 웹→앱 이관
앱에 처음으로 네트워크가 생긴다
JWT 로그인(큐 7)으로 앱이 서버를 부르기 시작.
큐 8 첫걸음 — 공고 목록·공고별 지원자·지원자 상세를 서버에서 받아옴, 단계 변경이 실제로 저장(W4 완료 기준).
웹에 있고 앱에 없던 화면(공고 등록·첨부·검색·비밀번호 변경) 이관.
앱 UI 초안 반영 — 하단 탭바·5개 탭·홈·설정·로그인·지원자 현황
앱 UI 초안(하단 탭바 + 5개 탭)을 반영, 홈 첫 화면·설정·아르 배포판·지원자 현황 리스트.
로그인을 첫 화면으로, 지원자 상세에 아르 요약·메일·단계 이력 + 목데이터 6명.
실기기 점검에서 드러난 캘린더 필터·공고 카드 숫자 수정.
Flutter 프로젝트·디자인 토큰·내비게이션 뼈대 (ADR-0010)
앱 스택 Flutter 확정
앱 스택을 Flutter 로 확정(ADR-0010), 프로젝트·디자인 토큰·내비게이션 뼈대 착수(큐 5).
채용 공고 CRUD · 지원자 목록·상세·단계 이력 · 담당자 지원자 직접 등록
앱 오너 확정 전 백엔드 분담분
B1·B2·B3 채용 공고 CRUD API, D1·D4·D5 지원자 목록·상세·단계 이력 API, D6 담당자 지원자 직접 등록 API.
서류 자동 판정 가중치 개정 · 요건 강조·우대 축소·문화 하한 규칙
fit-check 24명 실측 분석 · 3가지 정확성 이슈 해결
fit-check 지원자 24명 실측에서 판정이 아슬한 세 케이스(요건 우수인데 문화로 탈락 · 1점 차이 탈락 · 필수 통과인데 우대 부족으로 탈락)를 발견해 알고리즘을 다듬었다.
가중치 · 요건 50→60(강조) · 우대 20→10(있으면 좋음) · 문화 30 유지.
새 규칙 · 요건 점수가 70 이상이면 문화 점수 하한 50(요건 우수 지원자를 문화 한 문구로 떨어뜨리지 않기).
팀장 결정으로 hold 상태는 도입하지 않고 자동 판정 그대로 유지 · 자동 CD 로 배포 완료 · alembic 0020 로 기존 회사 프로파일 두 키 갱신.
답변별 서류 대조 스위치 활성화 — AGENT_FINDINGS_BACKEND 반영
우정팀 #175 UI 가 바로 뜨게 서버 스위치 켬
우정팀이 만든 답변별 서류 대조 UI(#175)가 스위치 부재로 화면에 안 뜨던 것을 서버 .env 에 한 줄 추가해 켰다.
함정 · docker compose restart 는 env_file 을 다시 읽지 않아 반영이 안 된다 — up -d --force-recreate 로 컨테이너를 다시 만들어야 반영. 우정팀 지적으로 즉시 재작업 · 실측으로 확인 완료.
세션당 비용 ~$0.05(Haiku 4.5, 답변 10개 + 끝날 때 1회) · 시연 규모 무리 없음.
fit-check 24명 판정 정확성 분석 · 시연 시나리오 재조정 근거
인수인계 오류 정정 · 실제 자동 불합격 8명 · 근거 수치화
인수인계에 있던 자동 불합격 3명(한지우·박도윤·정민호)이 실제로는 자동 합격이었고, 진짜 불합격은 8명이었다.
8명 각각의 점수 세 갈래(요건·우대·문화)를 근거로 수치화하고, 판정 알고리즘의 세 가지 정확성 이슈를 짚었다.
리포트를 근거로 알고리즘 개선안(PR #182) 을 도출 · 시연 시나리오도 남기훈(요건 우수·문화 감점) · 강현우(1점 차이) 케이스로 재구성 준비.
우정팀 협업 — 답변 저장 버그 원인 규명·세션 로그 3답변
우정팀이 아침 인계 문서로 요청한 8개 질문에 실측 근거로 답변 · findings 스위치 반영 지적에 즉시 대응(force-recreate 로 해결) · 세션 59 로그 요청에 ai_score 정상(42점) 확인.
우정팀이 진짜 이슈로 짚은 뒤늦은 답변 저장 실패(CONFLICT 409) 는 로그로 원인 짚어 전달 · 우정팀 #178 로 즉시 수정.
팀 간 실측·근거 기반 협업 · 하루 안에 세 번 왕복하며 문제 좁혀 나감.
AWS 통합 결제 조직(ETECH) 편입 — 비용 이관
계정 활동 비용이 조직 지급인 계정으로 청구
ETECH SYSTEM 조직의 통합 결제(Consolidated Billing) 에 편입 · 이후 활동 비용은 조직 지급인 계정으로 청구된다.
사용량 조회는 조직 정책에 따라 제한될 수 있어 내부는 수동 계산으로 사용량을 추적.
학습·시연 총 예상 사용 시간 15시간 이내로 관리 · 학습 완료 즉시 인스턴스 stop 원칙.
인터뷰방 답변 저장 버그 원인 분석 3갈래 · 픽스 방향 · 인계 문서
우정팀에 원인 3갈래·픽스 4개 정리 전달
시연 리허설 중 실측된 답변 저장 실패(Q9 시도 후 Q1 로 되돌아감) 를 원인 3갈래로 정리 · 픽스 4개 방향 제시.
갈래 A(꼬리질문 in-memory 캐시 미반영) · 갈래 B(빈 STT → 저장 스킵) · 갈래 C(WebSocket drain timeout · 오디오 소실).
우정팀이 이후 실제로 #174(answered_at 기준)로 원인 규명·수정 · 팀 간 인계 문서가 실제로 문제를 좁혀 준 사례.
fit-check 지원자 24명 재접수 · 시연 데이터 준비
새 STAR 4문항 콘텐츠 23명 + 홍지민(배지 시연용 구 콘텐츠 유지)
시연용 지원자 24명 일괄 재접수 · 새 STAR 4문항 자기소개서로 23명 새로 · 홍지민(id=52) 만 구 콘텐츠 유지(이력서 파일 새 sha256 vs 앵커 옛 sha256 조합으로 "내용이 바뀜" 배지 시연).
공고 배치 · FE 12명 · BE 12명. 자동 불합격 시연 대상·문화 갈등 서사·정보 부족 서사·영어 이력서 케이스 골고루 포함.
EBS 확장 · 서버 스토리지 29→50GB
빌드 캐시·컨테이너 이미지 여유
운영 서버 디스크 여유가 떨어져 추가 배포에 지장이 생기지 않도록 EBS 볼륨 확장 · 온라인 확장으로 무중단.
확장 후 파일시스템 growfs 로 반영 · 여유 27GB 확보.
ADR-0028 §1.7 · 무결성 원장 트리거 감사 · 우회의 흔적 3갈래
임시 트리거 해제 재발 방지·감사 로그
이력서 무결성 앵커(document_anchors) 트리거를 시연 데이터 정리 목적으로 임시 해제한 이력을 근거로, 트리거 상태 변경을 반드시 흔적 남게 하는 세 갈래(감사 트리거·이벤트 로그·문서화 규칙) 를 결정 문서에 추가.
원장은 "잠긴 상태" 가 기본 · 우회는 마지막 수단 · 재발 시 자동으로 감지.
n8n 컨테이너 도입 — 알림·메일 자동화 계층 (ADR-0030 1단계)
compose 서비스·Caddy 리버스 프록시·백업·경보까지 인프라 몫 일괄
메일·알림 파이프라인을 워커 코드에서 워크플로 도구(n8n, 오픈소스 자동화 엔진)로 분리하는 결정(ADR-0030)의 1단계 인프라 반영.
트리거는 우리 API 가 쏘는 웹훅(HTTP 신호), 발송은 노드 하나(SES ↔ SMTP)만 바꾸면 공급자가 바뀐다.
운영 EC2 self-host, 편집 화면은 팀 공유 Basic Auth(간단 로그인) 뒤로. 워크플로 JSON 은 저장소가 진실 — 화면에서 고쳤으면 내보내서 커밋.
백업(볼륨 tar → S3)·지표(n8n 헬스 엔드포인트)·경보(20분 실패 시 이메일)·상태 화면까지 인프라 몫으로 일괄 반영. 백엔드 몫(내부 API 2개·발송 경로 스위치)은 별도.
발표 전 안정화 묶음 — 외부 헬스체크·메모리 경보·인스턴스 자동 복구
밖·안 이중 감시 + 하드웨어 자체가 죽어도 자동 복구
GitHub Actions 가 15분마다 공개 주소를 밖에서 찌른다 — 실패 시 이슈를 열고 복구되면 자동으로 닫는다(밖 시선).
서버 안 지표에 메모리 사용률(진위 판별 서비스가 분석 1건에 574MiB)을 추가해 90% 이상이면 경보.
EC2 시스템 상태 검사 실패 시 AWS 가 인스턴스를 자동으로 살리도록 알람 등록(같은 IP·디스크 유지).
배포 스크립트를 저장소로 회수 — 그동안 서버에만 있던 것을 검토·재현 가능하게.
서버 지표·경보 세팅 — CloudWatch + SNS 메일
관측 에이전트 미설치·무료 구간 안
서버가 10분마다 상태 숫자(디스크 사용률·백업 파일 나이·API 헬스)를 CloudWatch(AWS 관측 서비스)로 밀어 넣고,
규칙(디스크 85% 이상·백업 30시간 이상·헬스 20분 연속 실패)에 걸리면 SNS(알림 서비스) 를 통해 이메일이 온다.
경보 정의는 CloudFormation 템플릿 파일 하나 — 콘솔 30번 클릭 대신 파일 업로드 한 번.
비용은 상시 무료 구간 안(사용자 지정 지표 10개·알람 10개·API 100만 건/월).
서버 상태 한 화면 스크립트 — status.sh
디스크·컨테이너·자동 배포 최근 결과·백업·헬스 응답을 한 번에 보여주는 읽기 전용 스크립트.
주 1회 사람이 눈으로 훑기 위한 계기판 — 자동 경보와 별개, 상태를 사람이 확인하는 용도.
운영 DB 매일 S3 백업 — 압축·검증·수명주기 30일
지원자 개인정보와 무결성 원장이 인스턴스 사고로 사라지지 않게
매일 04:00 KST 서버가 DB 를 통째로 뜨서 압축·검증(gzip -t) 후 전용 S3 버킷에 올린다.
쓰기 권한 IAM 은 최소 권한(PutObject 만) — 이 키로 데이터를 되뽑을 수 없다.
버킷 수명주기 30일 자동 만료로 스토리지 비용도 상한.
Ubuntu 24.04 에 apt 로 aws-cli 가 없어 snap 으로 설치(문서 반영).
컨테이너 로그 상한 — 서비스당 20MB × 3
디스크 고갈 예방
compose 에 로그 드라이버 옵션(max-size·max-file)을 걸어 컨테이너 로그가 무한히 커지지 않게.
29GB 디스크에서 로그 하나가 수 GB 로 부풀던 사고를 사전 차단.
운영 체인을 Amoy → Ethereum Sepolia 로
Amoy 무료 가스 공급이 전부 막혀 사용 불가로 판단
제출물 무결성 앵커(ADR-0028)를 매일 게시하려면 소액 가스(수수료)가 필요한데, Amoy(폴리곤 테스트넷) 무료 수도꼭지(faucet) 6곳이 다 막혀 있었다.
Sepolia(이더리움 테스트넷)로 전환 — Coinbase 개발자 포털에서 조건 없이 받을 수 있고, 커뮤니티 채굴형 대안(pk910)도 살아 있다.
chain.py 익스플로러 두 줄 교체와 문서 개정 단락. 실전송 1건으로 체인 반영 확인.
저장소에 남은 옛 API 주소 정리 — 정본 api.seuk.suvisdev.cloud
.env.production·모바일 api_config·스크립트에 남아 있던 옛 인프라 주소를 새 도메인으로 일괄 교체.
결정 문서 개정 원칙 확정 · 문서 전체 갱신
설계 문서는 잠금이 아니라 오너가 계속 개정하는 것
2026-09-07 운영 변경(서버 확장·백업·경보·체인 전환·예산)을 상세 문서 10개에 반영.
확정 결정 문서(ADR) 23개에 "오너가 개정 ADR 을 쓰면 바뀐다" 표준 한 줄, 지시서 36개 + 로드맵 5개 맨 위에 "작성 시점의 설계·계획" 한 줄.
확정 대기 게이트 폐지 — 도메인 오너가 자유롭게 개정하는 구조로 명문화.
설계 문서 톤을 "이렇게 한다·안 한다" 잠금에서 "현재 구현 + 확장 후보" 로.
테스트 하네스 안전 스위치 · pytest-timeout
회귀 하네스(반복 검증 세트)에 Anthropic 옵트인 가드를 붙여 실수로 유료 AI 를 부르는 상황 차단.
pytest 에 60초 타임아웃 도입 — 죽은 테스트가 무한히 걸리던 것 해소.
S3 이력서 업로드 실패 수정 — 리전 엔드포인트 서명
새 버킷 업로드가 403 이던 것 — 서명 대상 엔드포인트가 리전 URL 이어야 하는 것을 놓쳤다. 수정 후 즉시 정상.
인프라 이전 반영 — 새 계정 주소·CORS·배포 자동화
저장소가 새 인프라를 안다
AWS 계정 이전에 따라 도메인·S3 버킷·브라우저 접근 규칙(CORS)을 정본으로 갱신.
배포 자동화(systemd 2분 폴링) 문서화, 팀 전체가 코드를 push 하면 자동으로 반영되는 흐름 확정.
지원자 일정 페이지를 아르 대화형으로 재작업
일정 선택을 대화 속 카드로 + 지원자 채팅 UI + AI 요약 표시 버그 수정
메일 링크(/schedule/:token) 페이지를 카드+정적 안내에서 아르와의 대화형으로 재작업.
PC는 아르 캐릭터+일정 카드/채팅 2단, 모바일은 상단 고정 일정 카드(접기·펴기)+채팅.
아르 얼굴은 3D 뷰어 스냅숏(PNG 12KB)으로 대체해 WebGL 부담 제거.
부수로 지원자 상세 패널이 요약 JSON 원문을 그대로 노출하던 버그 수정 — 핵심 요약+강점+확인 필요 목록으로 파싱 렌더링.
PR #157 머지.
이력서·자소서 파일 텍스트를 AI 요약 입력에 포함
extractor.py 신설 — pdf·docx·hwpx 추출, 실패 시 None 폴백
요약이 지원폼 필드만 읽어 이력서를 충실히 낸 지원자도 "제출물 부족"이 나던 문제 해소.
app/agent/extractor.py 신설 — S3에서 파일 수신 후 텍스트 추출(pdf/docx/hwpx, 구형 hwp 스킵), 어떤 실패도 None 폴백으로 요약 자체는 죽지 않음.
로컬 처리라 LLM 비용 없음, 프롬프트 주입 8천 자 상한.
실호출 검증: 가짜 이력서 docx로 강점·확인 필요가 파일에서만 나온 내용임을 확인. PR #158 머지.
지원자 채팅 FAQ 응답 API
공고 기반 stateless 응답 + 프롬프트 차단 규칙 v3
POST /api/v1/public/schedule/{token}/faq — 로그인 없이 토큰 인증, stateless 1문1답. 담당자용 아르와 완전 별개 경로.
답변 범위·차단은 키워드 블랙리스트 대신 프롬프트가 맥락 판단(연봉 문의 차단, 프롬프트 주입 무시 실호출 확인).
v2에서 지원자 본인 상태(현재 단계·확정 일정) 반영, v3에서 "답을 알면 확신 있게" 명시.
실호출 5개 시나리오 전부 정상. PR #159 머지.
search_users 읽기 도구 + 권한 분리
내부 사용자 검색 도구 + 프롬프트 user_role 주입
면접관을 이름으로 찾을 수 없던 문제 해결. search_users 읽기 도구 추가(이름/이메일 ILIKE + role 필터).
프롬프트에 user_role 주입하여 멤버가 어드민 전용 도구(assign_interviewer) 요청 시 사전 차단.
라이브 테스트: 어드민→확인 카드 정상, 멤버→"어드민 권한이 필요해요" 차단 확인.
PR #153 squash merge.
API TestClient 엣지 케이스 41개
4개 엔드포인트 HTTP 레벨 테스트 + 경계값·보안 패턴
에이전트 4개 엔드포인트(summarize·chat·confirm·stt)를 HTTP 레벨에서 검증.
기본 동작 20개 + 엣지 21개 — 경계값, SQL injection, XSS, 권한 없는 접근, 빈 입력.
PR #141로 squash merge.
E2E 엣지 케이스 8개 시나리오 실호출 검증
검색 0건, 모호한 요청, 잘못된 단계명, 삭제 요청, 공고 조회, 멀티턴 ID 추적, 특수문자
검색 0건("검색 결과 없음"+대안 제시) · 모호한 요청(도구 호출 없이 명확화 질문) · 잘못된 단계명(동명이인 확인 후 선택 유도) · 범위 밖 삭제 요청(미지원 안내) · 공고 목록 조회 · 멀티턴 3단계 ID 추적 · 특수문자(O'Brien) 검색.
8종 전부 PASS, 비용 실측 $0.083.
프롬프트 튜닝 — ID 혼동 수정
agent.v1.md에 ID 참조 규칙 2줄 추가
E2E에서 대화가 길어지면 application_id를 엉뚱한 값(id=1)으로 참조하는 문제 발견.
agent.v1.md에 규칙 2줄 추가 — ① 직전 도구 결과에서 확인된 ID만 사용, ② "이 지원자" 지시어는 최근 조회 지원자 기준.
수정 후 정확한 ID(id=52) 참조 확인.
한글 수사 오탐 방지 + 텍스트 채팅 재연결
entity_resolver 오탐 수정 + ADR-0015
entity_resolver가 한글 수사("첫 번째")를 오탐하던 문제 수정 후, 텍스트 채팅 경로에도 resolve_entities 재연결(A안).
결정 근거는 ADR-0015로 기록, PR #130 squash merge.
E2E 데모 4단계 시나리오 (검색→조회→상태 변경→이메일 초안)
4단계 전부 실호출 성공, 비용 실측 $0.045
로컬 서버 실호출: ① "김도현 찾아줘"→동명이인 2명 안내 ② 상세 조회 ③ "서류심사로 옮겨줘"→후퇴 불가 안내+대안 ④ 이메일 초안→pending_action 반환(사람 확인 대기).
4단계 전부 정상, 비용 실측 합계 $0.045(Haiku).
테스트 커버리지 보강 — 전체 185개
prompts 12 + summarizer 10 + api_agent 41 등
신규: test_prompts 12(로더 resolve/render/variables) · test_summarizer 10 · api_agent TestClient 41.
전체 구성: entity_resolver 35, write_tools 19, stages 15, stt 15, cost 13 등 — 185개 전부 통과.
STT 비용 로깅 통일 (채팅·요약·STT)
STT(Whisper)에 비용 로깅이 빠져 있던 것 발견 — _estimate_stt_cost($0.006/분×오디오 길이) 구현, transcribe() 반환에 audio_duration_sec·cost_usd 추가.
채팅·요약·STT 3기능의 AI 원가 관측 체계 통일, ADR-0011에 실측 기록.
파이프 안정화 — 스킬 exact 최상위 · FAQ 하네스 15 · regenerate 사유 분리
스킬 배열(기술 스택 문자열)의 정확 일치를 시맨틱 랭킹 최상위로 올려 "Kubernetes" 같은 고유명사 오답을 원천 차단.
지원자 채팅 FAQ 실측 하네스 15 시나리오 신설, regenerate_summary 응답 코드를 백엔드 불가(503)와 처리 실패(422)로 분리, pytest 실행 시 .env 스위치를 선점하도록 conftest 정리.
인적성 설문(사전 성향) 도입 — 발송·응답·AI 관찰 요약 (ADR-0027)
AI 는 관찰 요약만, 성격 판정 금지
담당자가 사전 성향 설문을 보내면 지원자가 공개 링크로 응답, 결과 통계 + 아르의 관찰 요약이 지원자 상세에 붙는 흐름 전 구간.
결정 문서: AI 는 관찰만, 성격 판정·합격 여부 판단에 안 쓴다.
로컬 sLLM 안정화 — 도구 폭주 가드 + 의도 라우터 LLM 분류 + 회귀 하네스
작은 모델이 도구를 무한 호출하는 것을 사전 차단하는 가드, 실행 로그의 도구 세부 정보는 UI 에서 감추기.
의도 라우터를 LLM 분류 + 코드 실행 방식으로 바꿔 변형 30/30 통과. 확인 응답("응 변경해줘")도 규칙 라우터로 뽑아 저장된 인자로 바로 실행.
채팅 품질 개선 · 이력서 텍스트 요약 입력 · 요약·임베딩 독립 실행
확인 카드에 이름 표시·일정 제안 카드·서식 가이드·첫 인사 통일.
이력서·자기소개서 파일 텍스트를 AI 요약 입력에 포함(pdf·docx·hwpx 추출, 프롬프트 8천 자 상한).
요약과 임베딩을 독립적으로 재실행할 수 있게 라벨 중복 제거·스키마 상한 정리.
RAG 시맨틱 검색 + 프롬프트 체이닝 (ADR-0021·0022)
임베딩 + pgvector
지원자 통합 검색에 임베딩(문장을 숫자 벡터로 만들어 의미로 찾기) 기반 시맨틱 검색을 붙였다.
프롬프트 체이닝(작업을 여러 단계 프롬프트로 나눠 정확도를 높이는 방법)으로 요약→평가→추천을 단계별 파이프라인화.
면접 일정 도구 4개 — ADR-0016 에이전트 연동
아르가 면접 일정을 스스로 다룰 수 있도록 조회·제안·확정·취소 도구 4개 추가.
결정 문서 ADR-0016(면접관 배정 정책 v1) 을 코드에 연결.
에이전트 v2 — 요약 스키마·엔티티 해석·프롬프트 v2·TOOLS.md v1.1
요약 출력 스키마와 프롬프트 v2 마커, 엔티티 해석 레이어(음성 전사에서 이름·시간 등을 걸러내는 단계), 단위 테스트 정식 배치.
도구 명세서(TOOLS.md)를 초안에서 v1.1 로 — 코드와 문서 불일치 6건 수정.
에이전트 뼈대 착수 — 도구 스펙·프롬프트·PoC·M2~M4 요약·읽기·쓰기
결정 문서 ADR-0009·0011
도구 명세와 이력서 텍스트 추출 개념 증명(한글 PDF), 프롬프트 뼈대와 요약 출력 규약, M2~M4 요약·읽기·쓰기 도구.
결정 문서 ADR-0009(에이전트 UI 위치 시안 3안)·ADR-0011(모델·비용 제안) 함께 확정.
평가·면접관 배정 API + ADR-0012·0013 확정
평가 작성·목록·평균 API(E1·E2), 면접관 배정 API(E3).
결정 문서 ADR-0012(서류심사 AI 분류 기준)·ADR-0013(면접관 배정 정책 v1) 확정.
면접 답변 카메라 녹화 + 진위 분석 호출
ADR-0029 후속 — 프론트 녹화와 분석 서비스를 연결
면접 답변 시 카메라 녹화를 받아 진위 판별 서비스로 넘기는 경로를 붙였다.
SES MessageId 를 email_logs 행에 남긴다
보냈다는데 안 왔다를 확인할 자리
메일 전송 결과(공급자 발급 식별자)를 로그 행에 저장 — 이후 반송 조사 시 근거로.
면접 답변 음성 → 전사(STT) — audio_duration_sec 채움
면접 설계 §5-4 · 발화 속도 진행 보조까지
지원자 음성 답변을 텍스트로 옮기는 경로(STT)와, 말이 유난히 느리면 질문을 바꿔 보자고 하는 진행 보조 규칙까지.
지원 현황 조회 — 이메일 링크로 지원자 포털
신-1 지원자 포털
로그인 없이 이메일로 받은 링크(토큰)로 자기 지원 현황을 확인하는 경로. 담당자 화면과 분리된 지원자 전용.
면접 진행 보조 — 짧은 답이면 되묻기, 두 번 짧으면 쉬어가기 권유
답변 길이가 유난히 짧으면 되묻고, 두 번 연속이면 잠시 쉬는 것을 권한다.
앵커 게시 자동화 안정화 — 토큰 재발급·실패 시 이슈·체인 사전 검증
이틀 동안 아무도 모르던 실패를 눈에 보이게
앵커 크론이 12시간 만료 토큰으로 죽던 문제 해결(매 실행마다 새로 로그인), 실패 시 GitHub 이슈로 알림.
이름표(CHAIN_NETWORK)와 실제 RPC 체인 식별자가 어긋나면 전송 전에 멈춰 잘못된 체인 오염 차단.
배포 이미지가 스스로 스키마 이행 — 호스트 마운트 불필요
DB 스키마 이행(alembic)을 컨테이너 이미지 자체가 실행하게 해서, 서버 호스트에 코드 마운트가 필요 없게.
로컬 pytest 함정 2개 수정 — .env 미로드·시드 이름 충돌
새 개발자가 clone 후 바로 실행 가능
로컬 pytest 가 .env 의 DATABASE_URL 을 못 읽어 옛 DB 로 붙던 것과, 시드 이름이 겹쳐 실패하던 것을 코드에서 봉인.
폴리곤 서명을 Actions 로 · OpenTimestamps 병행 (ADR-0028)
서버에 개인키 없음
앵커 게시 개인키를 서버에서 빼서 GitHub Actions 로 이관, 시간 증명(OpenTimestamps) 병행.
결정 문서 개정에 관리 권한 2인·팀장 리뷰 게이트 삭제 반영.
JWT 인증 · 역할 3종 (A1~A3)
단계 전환 로직 (후퇴 불가 정책)
지원자 검색·필터 — 더미 10만 건 튜닝
지원서 제출 API (공개 폼)
S3 presigned 업로드·다운로드 + 파일 검증
메일 큐 — SES 발송 + SQS 워커·재시도
접수 확인 메일
담당자 메모 API
정렬 + 커서 페이지네이션
마감일 자동 마감 + 공개 링크
불합격 사유 + 일괄 단계 변경
구조화 로깅 + 에러 코드 표준화
AI 면접 백엔드 3단계 — 테이블·세션 링크·질문 설정·답변 제출·종료 (ADR-0026)
결정 문서 ADR-0026(AI 면접은 한다 — 음성으로 긴장도·거짓말은 판별하지 않는다) 확정과 함께 백엔드 3단계 착수.
면접 관련 테이블 3종 + 스키마 이행 · 세션 생성과 지원자 공개 링크 · 질문 설정·답변 제출·종료.
main 상태 자동 표시 CI — pytest + 프론트 빌드
손으로 물어보지 않아도 됨
main 이 깨졌는지 자동으로 보이도록 CI(자동 실행 워크플로) 구성 — 백엔드 pytest + 프론트 빌드.
첫 실행 실측 51초.
alembic 도입 · dev 의존 · 08/31 셋업 안내 정정
스키마 변경을 손 SQL 에서 자동화로
alembic(스키마 이행 도구)을 도입해 손 SQL 시대 종료.
의존을 개발 그룹으로 선언(이전엔 버전이 어디에도 안 박혀 있었다), 08/31 셋업 안내 문서의 순서·전환 절차 정정.
AI 요약 잘림·아르 요약 앰버 블록 정리·큐 20 D8·D9 완료 확인
AI 요약이 매번 잘려 "제출물 부족" 으로 저장되던 것 수정, 프론트 요약 표시를 아르의 정보 블록으로.
큐 20(D8·D9)에 빠져 있던 완료 표시를 코드 대조 결과로 정리.
공개 지원 폼(C1) + files[] 연결(C2·F1) + 면접관 가용 시간 화면
로그인 없이 지원자가 접속하는 공개 지원 폼과, 접수 시 업로드 파일을 지원 행에 files[] 로 연결.
면접관이 자기 가용 시간을 등록하는 설정 화면(ADR-0016).
무인증 GET 대조 스크립트 + APP_ENV 잠금
지금까지 결함이 전부 이 대조에서 나왔다
02-api.md 계약과 실제 배포본을 무인증 GET 으로 대조하는 스크립트 신설.
APP_ENV 오타·미설정을 production 으로 잠가 개발용 설정이 운영에 새는 것을 물리적으로 차단.
마감일 자동 마감 + 공개 지원 링크 + 불합격 사유 + 일괄 단계 변경
마감일 지나면 공고 자동 마감(B4·B6), 지원자 일괄 단계 변경과 불합격 시 사유 필수 저장(D8·D9).
Dockerfile 안정화 · 기동 로그에 APP_ENV 표시
Dockerfile 에 scripts/ COPY 추가, .dockerignore 중첩 경로 처리, 기동 로그에 APP_ENV 모드 표시.
📖 사용 규칙 보기 (카드 편집 방법 · 충돌 방지)
카드는 _data/kanban/<자기 GitHub 아이디>.yml에서만 편집한다 — 한 사람이 파일 하나를 소유하므로 5명이 동시에 작업해도 git 충돌이 나지 않는다.
- 자기 파일만 수정한다. 본인 소유 파일 외에는 손대지 않는다. 남의 카드에 할 말이 있으면 팀 채널로.
- 카드 형식은 파일 안 기존 항목을 복사해서 쓴다.
status는todo | doing | done세 값만. ```yaml- title: “카드 제목” feature: “D3” # 기능 번호 또는 주차 (선택) status: todo # todo | doing | done done: 2026-09-02 # 완료일 — done으로 바꿀 때 함께 기입 (개발 로그 자동 집계용) due: 2026-09-04 # 마감 (선택) note: “” # 한 줄 메모 (선택 — 제목·메모·상세에 ¦ 문자는 금지) detail: | # 상세 요약 (선택) — 개발 로그에서 클릭해 들어가는 상세 페이지에 표시 무엇을 어떻게 바꿨는지 2~4줄 ```
- push 전
git pull --rebase. 서로 다른 파일이라 rebase가 항상 깨끗하게 통과한다. 충돌이 났다면 파일 소유자 버전 우선,push --force금지. - 포스트(
_posts/)도 같은 원칙: 파일명을YYYY-MM-DD-<아이디>-<주제>.markdown으로 만들어 한 파일을 한 사람만 만지게 한다. done으로 바꿀 때done: 날짜를 함께 기입한다 — 개발 로그 완료 타임라인이 이 날짜로 자동 집계된다. 카드 정리(삭제)는 주간 다이제스트(금요일) 이후 각자 판단 — 단, 삭제하면 개발 로그에서도 사라지므로 기록을 남기려면 유지를 권장.- 팀 채널에 공유된
Arda-칸반-클로드-지시서.md를 Claude에게 읽히면 위 전부를 말로 대신 시킬 수 있다.