v2.2.258: /meet 화자 팀/역할 정규화 + 헤더 전조각 주입 + 검증 5종

STT 화자번호(참석자 N) 박멸→회사 표준 팀/역할 귀속, 회의 헤더 전 청크 주입, 전역 헤드라인 추출, 결정 게이트·담화 상태 태깅, 슬림 6섹션 포맷, 타임스탬프 근거, parseActionItems 헤더명 기반 재작성, 검증 패스 5종. 전체 698 통과.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 18:10:32 +09:00
parent 5d02a8a56f
commit 6dc5f17dec
8 changed files with 333 additions and 164 deletions
+21 -3
View File
@@ -111,8 +111,26 @@ describe('보조 유틸', () => {
});
});
describe('parseActionItems — 액션 표 파싱 (산출물 컬럼 + 하위호환)', () => {
test('신 형식 6컬럼: 담당|작업|상세|산출물|기한|상태', () => {
describe('parseActionItems — 액션 표 파싱 (헤더명 기반 매핑 + 하위호환)', () => {
test('신 형식 5컬럼(v2.2.258): 담당|액션|기한|상태|출처 — 컬럼 순서가 달라도 안전', () => {
const report = [
'## 액션 아이템',
'| 담당 | 액션 | 기한 | 상태 | 출처 |',
'| --- | --- | --- | --- | --- |',
'| 넥서스개발팀 | 모자 헤어스타일 단정 버전 3종 시안 제작 | 6/18 | 확정 | [07:14] |',
'| — | 모델 교체 소요기간 산정 | — | 진행미정 | [53:55] |',
'',
'## 오픈 이슈',
].join('\n');
const rows = parseActionItems(report);
expect(rows).toHaveLength(2);
// 출처가 기한/상태 뒤에 와도 이름으로 매핑 → 어긋나지 않는다
expect(rows[0]).toEqual({ owner: '넥서스개발팀', work: '모자 헤어스타일 단정 버전 3종 시안 제작', detail: '', deliverable: '', due: '6/18', status: '확정', source: '[07:14]' });
// '—' 는 미정 신호 → 빈 문자열로 정규화
expect(rows[1]).toMatchObject({ owner: '', work: '모델 교체 소요기간 산정', due: '', status: '진행미정', source: '[53:55]' });
});
test('구 형식 6컬럼: 담당|작업|상세|산출물|기한|상태', () => {
const report = [
'## 4. 액션 아이템',
'| 담당 | 작업 내용 | 작업 상세 | 산출물 | 기한 | 상태 |',
@@ -123,7 +141,7 @@ describe('parseActionItems — 액션 표 파싱 (산출물 컬럼 + 하위호
].join('\n');
const rows = parseActionItems(report);
expect(rows).toHaveLength(1);
expect(rows[0]).toEqual({ owner: '송병준', work: '테스트 샘플 3종 선정', detail: '후보 비교', deliverable: '테스트 URL 목록', due: '6/18', status: '확정' });
expect(rows[0]).toEqual({ owner: '송병준', work: '테스트 샘플 3종 선정', detail: '후보 비교', deliverable: '테스트 URL 목록', due: '6/18', status: '확정', source: '' });
});
test('구 형식 5컬럼(산출물 없음)도 그대로 파싱 — deliverable 빈값', () => {