ptium
요약. ptium: 자율 개선 회차 27회, 릴리즈 11건. 최근 릴리즈 v1.69.34 (자산 7개). 건강 D
- 27회차
- 1프로젝트
- 11배포 준비 완료
- 0릴리즈 진행 중
- 2병합 완료
- 5검토 대기
- 2검증 실패
- 7변경 없음
- 0실행 오류
- $54.90비용
- 2시간 26분에이전트 시간
현황
- 저장소
- https://github.com/hkjang/ptium
- 마지막 회차
- 2026-09-11 12:36 KST — • 기타 review held, PR open PR #19
- 최근 릴리즈
- v1.69.34 — released · 자산 7개 (이전 v1.69.33: 7개) 전체 릴리즈 →
회차 이력
| 일시 | 프로젝트 | 결과 |
|---|---|---|
| 2026-09-11 12:36 | ptium | 검토 대기 review held, PR open PR #19 |
| 2026-09-11 08:02 | ptium | 검증 실패 verify failed: 실패한 검증: cd server && go test ./... (exit 1) |
| 2026-09-10 15:41 | ptium | 검토 대기 review held, PR open PR #17 |
| 2026-09-10 00:51 | ptium | 배포 준비 완료 merged PR #16, released v1.69.32 |
| 2026-09-09 12:08 | ptium | 배포 준비 완료 merged PR #15, released v1.69.30 |
| 2026-09-09 11:45 | ptium | 검토 대기 manual: review held, PR open PR #14 |
| 2026-09-09 11:26 | ptium | 검토 대기 manual: review held, PR open PR #13 |
| 2026-09-09 10:52 | ptium | 검토 대기 review held, PR open PR #12 |
| 2026-09-09 02:50 | ptium | 배포 준비 완료 merged PR #11, released v1.69.29 |
| 2026-09-08 22:09 | ptium | 배포 준비 완료 merged PR #10, released v1.69.28 |
| 2026-09-07 03:37 | ptium | 검증 실패 verify failed: secrets in diff |
| 2026-09-05 06:30 | ptium | 배포 준비 완료 merged PR #9, released v1.69.27 +7 assets |
| 2026-09-04 11:36 | ptium | 변경 없음 assets-only v1.69.19, assets for v1.69.19 +7 assets |
| 2026-09-04 11:33 | ptium | 변경 없음 assets-only v1.69.21, assets for v1.69.21 +7 assets |
| 2026-09-04 11:31 | ptium | 변경 없음 assets-only v1.69.22, assets for v1.69.22 +7 assets |
| 2026-09-04 11:28 | ptium | 변경 없음 assets-only v1.69.23, assets for v1.69.23 +7 assets |
| 2026-09-04 11:26 | ptium | 변경 없음 assets-only v1.69.24, assets for v1.69.24 +7 assets |
| 2026-09-04 10:44 | ptium | 변경 없음 assets-only, assets for v1.69.26 +7 assets |
| 2026-09-04 10:40 | ptium | 배포 준비 완료 merged PR #8, released v1.69.26 +7 assets |
| 2026-09-04 10:20 | ptium | 배포 준비 완료 merged PR #7, released v1.69.25 +7 assets |
| 2026-09-04 07:04 | ptium | 변경 없음 assets-only, assets missing |
| 2026-09-04 00:28 | ptium | 배포 준비 완료 merged PR #6, released v1.69.24 |
| 2026-09-03 16:46 | ptium | 배포 준비 완료 merged PR #5, released v1.69.23 |
| 2026-09-03 09:57 | ptium | 배포 준비 완료 merged PR #4, released v1.69.22 |
| 2026-09-03 04:28 | ptium | 배포 준비 완료 merged PR #3, released v1.69.21 |
| 2026-09-02 22:08 | ptium | 병합 완료 merged PR #2, release missing |
| 2026-09-02 15:50 | ptium | 병합 완료 merged PR #1, release released |
비용·사용량
| 시각 | 프로젝트 | 단계 | 시간 | 턴 | 비용 | 토큰 입력/출력 | 종료 |
|---|---|---|---|---|---|---|---|
| 08:46 | ptium | 릴리즈 | 3분 | 18 | $1.01 | 739K / 9K | success |
| 12:36 | ptium | review | 3분 | 29 | $1.95 | 1.8M / 11K | success |
| 12:33 | ptium | 개선 | 13분 | 75 | $6.46 | 8.3M / 34K | success |
| 08:02 | ptium | 개선 | 23분 | 100 | $9.46 | 11.2M / 65K | success |
| 15:41 | ptium | review | 4분 | 23 | $1.31 | 977K / 15K | success |
| 15:37 | ptium | 개선 | 7분 | 42 | $2.52 | 2.3M / 26K | success |
| 00:46 | ptium | 릴리즈 | 3분 | 24 | $1.09 | 819K / 9K | success |
| 00:40 | ptium | review | 2분 | 18 | $0.74 | 553K / 8K | success |
| 00:38 | ptium | 개선 | 7분 | 30 | $2.12 | 1.5M / 27K | success |
| 12:04 | ptium | 릴리즈 | 4분 | 31 | $1.30 | 1.2M / 10K | success |
| 11:58 | ptium | review | 2분 | 9 | $0.60 | 298K / 8K | success |
| 11:55 | ptium | 개선 | 4분 | 27 | $1.50 | 1.1M / 18K | success |
| 11:45 | ptium | review | 5분 | 27 | $1.65 | 1.2M / 22K | success |
| 11:39 | ptium | 개선 | 9분 | 51 | $3.27 | 3.1M / 34K | success |
| 11:26 | ptium | review | 6분 | 45 | $2.34 | 2.2M / 24K | success |
| 11:20 | ptium | 개선 | 9분 | 47 | $3.17 | 2.9M / 37K | success |
| 10:52 | ptium | review | 5분 | 25 | $1.44 | 1.0M / 20K | success |
| 10:47 | ptium | 개선 | 6분 | 36 | $2.20 | 1.8M / 25K | success |
| 02:45 | ptium | 릴리즈 | 3분 | 28 | $1.16 | 995K / 9K | success |
| 02:40 | ptium | review | 3분 | 12 | $0.71 | 318K / 11K | success |
| 02:38 | ptium | 개선 | 8분 | 44 | $2.64 | 2.2M / 30K | success |
| 22:04 | ptium | 릴리즈 | 5분 | 35 | $1.65 | 1.6M / 12K | success |
| 21:56 | ptium | review | 1분 | 7 | $0.44 | 201K / 5K | success |
| 21:54 | ptium | 개선 | 4분 | 24 | $1.26 | 947K / 13K | success |
| 03:37 | ptium | 개선 | 7분 | 43 | $2.90 | 2.8M / 26K | success |
아이디어 백로그 — 대기 12 / 전체 13
| 아이디어 | 가치/위험/크기 | 상태 | 메모 | 갱신 |
|---|---|---|---|---|
| seriesFromRows 가 표의 값을 쉼표로 다시 쪼개 '1,200' 을 1 과 200 두 점으로 읽는 문제 | 3/3/M | 대기 | deck/compile.go:1371 이 row[1:] 을 ',' 로 이어 붙였다가 다시 ',' 로 쪼갠다. 셀 경계를 지키면 3열 이상 금액 표도 꺾은선이 될 수 있으나 한 셀에 '1, 2, 3' 을 써 여러 점을 넣던 기존 문법을 깨뜨릴 위험. 쪼개기 지점만 다루고 숫자 파서는 건드리지 말 것. docs 의 ::columns 경로는 seriesFromRows 를 타지 않는다. 2026-09-11 재평가: 여전히 타당, 코드 변동 없음. | 2026-09-11 |
| 회계 서식이 붙은 음수를 막대가 크기로만 그려 부호가 사라지는 문제 | 3/3/M | 대기 | pptx/blocks.go 의 layoutColumns·layoutBars·share 가 math.Abs 로 높이를 잡는다. 기준선을 0 에 두려면 축 배치와 값 라벨 위치를 함께 손봐야 하고 골든 테스트가 여럿 흔들린다. docs 분류기는 이것이 고쳐지기 전까지 괄호 음수를 차트로 보내지 않기로 되어 있으므로(amountOf 주석) 렌더러가 먼저. 2026-09-11 재평가: 여전히 타당. | 2026-09-11 |
| 빈 행 때문에 출처의 행 번호가 실제 시트와 어긋나는 문제 | 3/3/M | 대기 | gridOf 가 행의 r 을 보지 않고 trimGrid 이 빈 행을 지운다. auto/2026-09-07-0330(ae451c5)이 같은 writeSheet/rangeOf 를 고쳐 두었으므로 그 머지 뒤에. 2026-09-11 현재 이 워크트리에 sheetranges_test.go 가 없어 아직 미머지. | 2026-09-11 |
| 엄격 스키마의 논리·오류 셀도 t="d" 처럼 따로 읽어야 하는지 확인 | 2/1/S | 대기 | gridOf 는 s/inlineStr/b/str/e/d 와 default 만 나눈다. 명세로 확인해 두면 같은 종류의 '글자 그대로 새어 나가는' 셀을 미리 막을 수 있다. 확인만으로 끝날 수도 있어 값은 낮다. | 2026-09-11 |
| 가이드 후속: 릴리즈 스크립트(scripts/release.sh)가 가이드 PDF 의 버전 스탬프를 함께 갱신하는지 확인 | 2/1/S | 대기 | USER_GUIDE.md·ADMIN_GUIDE.md 본문과 PDF 표지에 v1.69.32 가 적혀 있다. 릴리즈마다 손으로 다시 굽지 않으려면 release.sh 의 버전 다섯 군데 검사에 가이드는 넣지 말고, 대신 '릴리즈 태그와 가이드 버전이 다르면 경고' 정도가 적당하다. 릴리즈 절차 자체는 개선 세션 범위 밖. | 2026-09-11 |
| 가이드 후속: 캡처 스크립트가 만든 [가이드] 시드(덱·이미지·API 키·공유 링크·실패 덱)를 지우는 --clean 스위치 | 2/1/S | 대기 | 시드는 표식으로 재사용되지만 지우는 길이 없다. 버림 컨테이너에서는 필요 없고, 개발 배포에 대고 돌린 사람이 정리하려면 손으로 지워야 한다. 실패 덱을 지우면 큐·오류 화면이 다시 비므로 그때는 다시 만들어야 한다는 것을 문서에 적을 것. | 2026-09-11 |
| 숨긴 행·열을 그대로 표에 넣는 문제 | 2/2/M | 대기 | row hidden="1", cols 의 col hidden="1" 로 감춘 중간 계산 행·열이 슬라이드 표에 들어온다. 행을 지우면 출처 범위가 어긋나고 그 범위 계산은 미머지 브랜치가 고쳐 두었다. 열만 먼저 다루면 더 작게 끝날 수도 있다. | 2026-09-11 |
| 쉼표 없이 붙여 쓴 큰 금액이 소수점 서식과 뒤섞이는지 확인 (amountOf 후속) | 2/2/S | 대기 | 유럽식 서식 1.234,56 을 분류기·렌더러가 모두 123456 으로 읽어 두 읽기는 일치하지만 시트가 보여 주는 값이 아니다. 셀 서식(numFmt)을 봐야 하므로 cellformat 쪽 일. 먼저 xlsx 가 그런 값을 어떤 글자로 넘기는지 확인만 해도 값이 있다. | 2026-09-11 |
| 천 단위 구분과 통화 기호를 web/src 의 미리보기도 같은 규칙으로 읽는지 확인 | 2/2/M | 대기 | 서버는 분류기·렌더러 두 파서로 남기로 정해졌으므로 브라우저 미리보기가 자체 파서를 쓴다면 어느 계약을 따를지부터 정해야 한다. 이 워크트리에는 node_modules 가 없어 web 테스트를 돌릴 수 없으므로 npm install 이 되는 환경에서. | 2026-09-11 |
| writeSheet 이 첫 행을 무조건 머리글로 삼는 문제 | 2/3/M | 대기 | A1 에 제목 한 칸만 있는 시트는 머리글이 제목 한 칸이 되어 표가 어긋난다. 어디부터가 표인지 짐작해야 해서 위험. writeSheet 은 미머지 브랜치 auto/2026-09-07-0330 이 고친 함수이므로 머지 뒤에. | 2026-09-11 |
| 유럽식 Excel 이 저장하는 ; 구분 CSV 를 한 열로 읽는 문제 | 2/3/S | 대기 | readSeparated 가 확장자로만 구분자를 정한다. ',' 로 읽어 모든 행이 한 열이고 ';' 로 읽으면 두 열 이상이 고르게 나올 때만 바꾸면 꽤 안전. 한국어 로캘 Excel 은 ',' 를 쓰므로 값이 낮다. | 2026-09-11 |
| 가이드 후속: 편집기 캡처 5장(editor, editor-code, editor-history, editor-command, editor-quality)이 재실행에서 바이트 단위로 같은지 확인해 캡처 재현성 보장 | 1/1/S | 대기 | 2026-09-11 재실행에서 위 5장은 바뀌지 않았고 목록 화면들은 상대 시각('2분 전') 때문에 바뀌었다. 상대 시각을 고정 문구로 바꿀 방법은 없으므로 굳이 할 일은 아닐 수 있다 — 리뷰 부담을 줄이고 싶을 때만. | 2026-09-11 |
| 가이드 후속: 생성 큐·오류 인시던트 화면을 항목이 있는 상태로 찍어 ADMIN_GUIDE 에 싣기 | 3/2/S | 완료 | 2026-09-11 커밋 6ceaf1b. screenshots.py 의 seed_failure 가 ai.provider·ai.base_url 을 읽어 두고 배포 자신의 API(401+JSON)를 모델 주소로 두어 '설정이 틀린 모델' 실패를 만든 뒤 finally 로 복원(닿지 않는 주소는 내장 작성기로 넘어가 실패가 아님). seed_share 로 공유 링크도 하나. admin-queue·admin-errors·admin-errors-detail·admin-shares·editor-failed 5장을 두 가이드에 실었다. | 2026-09-11 |
교훈 (깨졌던 변경)
-
2026-09-09 review-rejected — figures.Of 가 공백에서 숫자를 끊는 동작은 라인 차트 계열('- 전환 전 120, 118, 121, 119')이 의존하는 계약이다. 구분자 처리를 넓히면 값이 붙어 1.20118121119e+11 이 되고 inspect.go 의 감사 출력까지 새어 나간다. docs/deck/compile 세 곳의 숫자 파서를 통합하려 하지 말 것 — 각자 다른 계약을 지키고 있다. 분류기 쪽을 좁히는 방향으로만 고칠 것. (링크) - 2026-09-09 review-rejected — docs 의 amountOf/allNumeric(분류기)과 deck 의 bareNumber(렌더러)는 서로 다른 숫자 파서다. 분류기만 넓히면 시트가 ::table 대신 ::columns 로 넘어가면서 렌더러가 같은 값을 다르게 읽어 차트가 망가진다(고정 공백 '1\u00a0200' → 분류기 1200, 렌더러 1). 파서 한쪽만 고치지 말고 두 경로가 같은 값을 같은 숫자로 읽는지 end-to-end 로 검증할 것. 또한 pptx/blocks.go 는 math.Abs 로 높이를 잡으므로 음수 파싱을 추가해도 렌더링은 안 바뀐다 — 커밋 메시지에 실제로 일어나지 않는 사용자 가시 효과를 쓰지 말 것. (링크)
원장 (에이전트가 남긴 기록)
2026-09-02
- 선택: 워드 문단이 링크·추적삽입·콘텐츠컨트롤 안에 가진 글자를 읽기 (가치 5 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약:
internal/docs/prose.go의 워드 리더가w:p바로 아래의w:r>w:t만 읽어서,w:hyperlink·w:ins·w:sdt안에 든 글자가 말없이 사라졌다(“자세한 내용은 여기를 참고하십시오” → “자세한 내용은 를 참고하십시오”, 문단 전체가 래퍼 안이면 슬라이드에서 통째로 증발). 문단의 innerxml 을 토큰 순회해 순서대로t를 모으는wordtext.go를 추가하고 문단·표 칸 양쪽에 적용했으며,w:delText/w:instrText/수식(m:t)은 종전대로 제외했다. 재현 스크래치 테스트로 버그를 먼저 확인한 뒤wordlinks_test.go(6가지 문단 + 표 1가지)를 추가하고make test(go test -race, go vet, npm typecheck, npm build) 전부 통과. VERSION 1.69.19 로 스탬프하고 릴리스 노트 작성, 커밋 a634fe0. - 보류 아이디어:
- xlsx 의
t="str"(수식 캐시 문자열)·t="b"(불리언) 셀이 숫자 취급되어 서식 변환을 타는 문제 (가치 3 / 위험 2 / M) - 유럽식 Excel 이 저장하는
;구분 CSV 를 한 열로 읽는 문제 — 구분자 추정 (가치 2 / 위험 3 / S) docs.columnLetter가 ZZ(index 701) 를 넘으면 깨짐 — 현재 maximumColumns=5 라 도달 불가 (가치 1 / 위험 1 / S)- 워드 문단 안의
w:br/w:tab이 사라져 앞뒤 단어가 붙는 문제 (가치 2 / 위험 2 / S)
- xlsx 의
- 릴리즈: v1.69.19 (2026-09-02, 태그 사후 푸시)
2026-09-02 (2회차)
- 선택: 워드 문단 안의 줄바꿈·탭·붙임표가 사라져 앞뒤 낱말이 붙는 문제 (가치 3 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/wordtext.go의textIn이w:t만 이어 붙여서, 요소로 적히는w:br/w:cr/w:tab/w:noBreakHyphen이 통째로 사라졌다(Shift+Enter 로 나눈 두 줄 → “첫째 줄둘째 줄”, 손으로 번호 붙인 제목 → “1.개요”, “비-대면” → “비대면”). 스크래치 테스트로 세 가지를 먼저 재현한 뒤, 줄바꿈·탭을 지연 기록 방식의 한 칸으로 바꾸고(앞뒤에 이미 칸이 있으면 두 칸이 되지 않고, 문단 끝 줄바꿈은 아무것도 붙이지 않음) 붙임표는 “-“ 로 읽게 했으며, 탭 위치 정의가 들어 있는w:pPr/w:rPr하위는 통째로 건너뛰고w:softHyphen은 종전대로 무시했다.wordbreaks_test.go(문단 8가지 + 표 1가지)를 추가하고make test(go test -race, go vet, npm typecheck, npm build) 전부 통과. VERSION 1.69.20 스탬프(openapi·kubernetes·offline-deployment 포함)와 릴리스 노트 작성, 커밋 ca38334. - 보류 아이디어:
- xlsx 의
t="b"(불리언)이 1/0 으로,t="str"/t="e"가 숫자 서식 변환을 타는 문제 — 2열 불리언 시트가 0/1 차트로 그려짐 (가치 3 / 위험 2 / M) - 유럽식 Excel 이 저장하는
;구분 CSV 를 한 열로 읽는 문제 — 구분자 추정 (가치 2 / 위험 3 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)docs.columnLetter가 ZZ(index 701) 를 넘으면 깨짐 — 현재 maximumColumns=5 라 도달 불가 (가치 1 / 위험 1 / S)
- xlsx 의
- 릴리즈: v1.69.20 (2026-09-02, 태그 사후 푸시)
2026-09-03
- 선택: 워드 본문이 콘텐츠 컨트롤(w:sdt) 안에 든 절을 통째로 잃는 문제 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약:
internal/docs/prose.go가w:body바로 아래의w:p/w:tbl만 훑어서, 서식 파일의 표지·자동 목차·양식처럼 콘텐츠 컨트롤로 감싼 덩어리가 문단이든 표든 한 줄도 읽히지 않았다. 스크래치 테스트로 “본문 전체가 w:sdt 하나인 문서 → 슬라이드 0장, 경고도 없음”을 먼저 재현한 뒤, 본문 블록을 훑을 때w:sdt/w:sdtContent/w:customXml을 innerxml 재파싱으로 여는blocksIn(12겹 제한)을 추가해 원래 자리에 그대로 이어 붙였다.w:sdtPr안의 이름·선택 항목은 문단이 아니므로 전과 같이 걸리지 않는다.wordsections_test.go(5가지 + 순서 1가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.21 스탬프(openapi·kubernetes·offline-deployment 포함)와 릴리스 노트 작성, 커밋 12ef96e. - 보류 아이디어:
- 표 안(
w:tc)의 문단이w:sdt로 감싸이면 그 칸이 비는 문제 — 이번 변경의 표 내부판 (가치 3 / 위험 2 / S) - CSV 에 이스케이프 안 된 따옴표가 하나만 있어도 파일 전체를 거부하는 문제 —
csv.Reader.LazyQuotes(가치 3 / 위험 2 / S) allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않아 2열 금액 시트가 차트 대신 표가 되는 문제 (가치 3 / 위험 2 / S)- xlsx 의
t="b"(불리언)이 TRUE/FALSE 가 아니라 1/0 으로 읽히는 문제 (가치 2 / 위험 1 / S)
- 표 안(
- 릴리즈: v1.69.21 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.21 (2026-09-03)
2026-09-03 (2회차)
- 선택: 따옴표 하나 때문에 CSV/TSV 파일 전체를 거부하는 문제 (가치 4 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/tables.go의readSeparated가 엄격 모드csv.Reader하나로만 읽어서, 인치 기호(15" 모니터)처럼 따옴표로 감싸지 않은 칸 안의 따옴표가 하나만 있어도ReadAll이 아무것도 돌려주지 않고 파일 전체가 거부되었다(게다가 한국어 문장 안에 영어 파서 메시지가 박힌 안내). 스크래치 테스트로 재현한 뒤separatedRows를 만들어 엄격하게 먼저 읽고 실패할 때만LazyQuotes로 다시 읽게 했고, 봐준 줄 번호를csv.ParseError.StartLine(따옴표를 연 줄) 기준으로 경고에 담았다. 정상 파일은 경고 없이 종전 그대로 읽힌다.csvquotes_test.go(6가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.22 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 ff61ab4. - 보류 아이디어:
- 표 안(
w:tc)의 문단이w:sdt로 감싸이면 그 칸이 비는 문제 — 1.69.21 변경의 표 내부판 (가치 3 / 위험 2 / S) allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않아 2열 금액 시트가 차트 대신 표가 되는 문제 (가치 3 / 위험 3 / M)writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)- xlsx 의
t="b"(불리언)이 TRUE/FALSE 가 아니라 1/0 으로 읽히는 문제 (가치 2 / 위험 1 / S)
- 표 안(
- 릴리즈: v1.69.22 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.22 (2026-09-03)
2026-09-03 (3회차)
- 선택: 워드 표의 행·칸이 콘텐츠 컨트롤 안에 있으면 사라지는 문제 (가치 4 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/prose.go의wordBlock이tr→tc→p를 고정 구조체 경로로만 읽어서, 서식 표의 반복 섹션 콘텐츠 컨트롤(w:sdt)이 감싼 행과 양식 칸 안의 문단이 통째로 사라졌다. 스크래치 테스트로 “머리글만 남아 표 자체가 드롭 → 슬라이드 0장에 오류” 와 “그 칸만 빈칸” 두 가지를 먼저 재현한 뒤, 1.69.21 의blocksIn을blocksInside(innerxml 재파싱 헬퍼)로 뽑아내고 표의 세 층 모두에 적용하는tableRows를 만들었다. 칸 안의 중첩 표는 전과 같이 바깥 표로 새지 않는다.wordtables_test.go(7가지 + 중첩 표 1가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.23 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 55d009c. - 보류 아이디어:
allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않아 2열 금액 시트가 차트 대신 표가 되는 문제 (가치 3 / 위험 3 / M)- xlsx 의
t="b"(불리언)이 TRUE/FALSE 가 아니라 1/0 으로 읽히는 문제 (가치 2 / 위험 1 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)- 유럽식 Excel 이 저장하는
;구분 CSV 를 한 열로 읽는 문제 — 구분자 추정 (가치 2 / 위험 3 / S)
- 릴리즈: v1.69.23 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.23 (2026-09-03)
2026-09-04
- 선택: 셀 주소(
r)를 적지 않은 엑셀 파일이 한 열로 뭉개지는 문제 (가치 4 / 위험 2 / 작업량 S) - 결과: 성공
- 요약:
internal/docs/workbook.go의columnOf가 읽을 열이 없는 주소에 0(=A열)을 돌려주어서, 셀의r속성을 생략하는 스트리밍 방식 내보내기 도구가 쓴 시트는 한 행의 모든 셀이 A열에 쌓이고 마지막 것만 남았다(2열 매출 시트 → 라벨이 사라진 한 열짜리 숫자 표, 경고도 없음).r은 OOXML 스키마에서 optional 이고 생략하면 “앞 셀 다음 칸”이 자리다. 스크래치 테스트로 재현한 뒤columnOf가 -1 을 돌려주게 하고gridOf가 행마다 다음 자리를 이어 세게 했으며, 주소가 섞여 있어도(예:C1뒤의 주소 없는 셀은 D열) 따라간다.sheetcells_test.go(시트 6가지 +columnOf8가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.24 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 3bed8ab. - 보류 아이디어:
- xlsx 의
t="b"(불리언)이 TRUE/FALSE 가 아니라 1/0 으로 읽히고, 게다가 날짜·백분율 서식 변환까지 타는 문제 — 재현 확인함 (가치 3 / 위험 1 / S) allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않는 문제 — 고치려면deck/compile.go의parseBareNumber도 같이 손봐야 함 (가치 3 / 위험 3 / M)- 맥 엑셀의 1904 날짜 체계(
workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 2 / 위험 2 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)
- xlsx 의
- 릴리즈: v1.69.24 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.24 (2026-09-04)
2026-09-04 (2회차)
- 선택: 참·거짓 셀(
t="b")이 0/1 로 읽히고 서식 변환까지 타는 문제 (가치 3 / 위험 1 / 작업량 S) - 결과: 성공
- 요약:
internal/docs/workbook.go의gridOf가t로 글자 두 가지(s,inlineStr)만 알아보고 나머지를 전부 숫자로 취급해서, TRUE 를 1 로 저장하는 참·거짓 셀이 0/1 로 읽혔고(2열 점검표가 표가 아니라 0/1 막대 차트로 그려짐), 서식이 붙어 있으면 숫자 서식 변환까지 타서 날짜 서식 TRUE →1899-12-31, 백분율 서식 FALSE →0%가 되었다. 수식이 돌려준 글자(t="str")와 오류(t="e")도 같은 길을 타서"45678"이2025-01-21로 읽혔다. 스크래치 테스트로 세 가지를 먼저 재현한 뒤t="b"는truthOf로 TRUE/FALSE 를 쓰고t="str"/t="e"는 적힌 그대로 두게 했으며(1/0 이 아닌 값은 짐작하지 않음), 서식 변환은 숫자 셀에만 걸리게 했다.sheetkinds_test.go(시트 7가지 +truthOf6가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.25 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 cf8c323. - 보류 아이디어:
allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않는 문제 —deck/compile.go의parseBareNumber도 같이 손봐야 함 (가치 3 / 위험 3 / M)- 맥 엑셀의 1904 날짜 체계(
workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 2 / 위험 2 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)- 유럽식 Excel 이 저장하는
;구분 CSV 를 한 열로 읽는 문제 — 구분자 추정 (가치 2 / 위험 3 / S)
- 릴리즈: v1.69.25 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.25 (2026-09-04)
2026-09-04 (3회차)
- 선택: 서식 코드의 대괄호 구역 때문에 빨간 음수 금액이 날짜로 읽히는 문제 (가치 5 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/cellformat.go의kindOfFormat이 서식 코드에서 따옴표 안만 걷어내고 대괄호 구역은 숫자의 모양으로 함께 읽어서,[Red]의d때문에#,##0;[Red]-#,##0(서식 대화상자가 음수를 빨갛게 할 때 쓰는, 어느 금액 시트에나 있는 서식)이 날짜로 분류되었다. 스크래치 테스트로 “1200 → 1903-04-14, 게다가 열이 숫자가 아니게 되어 차트 대신 날짜·음수 섞인 표”를 먼저 재현한 뒤,withoutQuoted를spokenPartsOf로 바꿔 색·조건·지역·통화 기호가 들어가는[...]를 따옴표 안 글자와 같이 건너뛰게 했다(닫히지 않은 대괄호는 글자 그대로).[$-409]mmm-yy는 여전히 날짜,[Red]0.0%는 여전히 백분율이다.cellcolors_test.go(서식 7가지 +spokenPartsOf8가지 + 통합 문서 1개)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.26 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 ab9d34d. - 보류 아이디어:
- 시간 서식(
h:mm,[h]:mm:ss)이 0.5 같은 분수로 읽히고, 날짜+시각 서식은 시각이 잘리는 문제 (가치 3 / 위험 2 / M) allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않는 문제 —deck/compile.go의parseBareNumber도 같이 손봐야 함 (가치 3 / 위험 3 / M)- 맥 엑셀의 1904 날짜 체계(
workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 2 / 위험 2 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)
- 시간 서식(
- 릴리즈: v1.69.26 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.26 (2026-09-04)
2026-09-05
- 선택: 시각 서식이 0.5625 같은 분수로 읽히고 날짜+시각은 시각이 잘리는 문제 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약:
internal/docs/cellformat.go의kindOfFormat이 서식 코드에서y·d(날짜)와%(백분율)만 찾고h·s(시각)는 찾지 않아서, 시각 셀이 저장된 분수 그대로 나왔다(회의 순서표 13:30 →0.5625, 게다가 숫자 열로 보여 표가 아니라 막대 차트). 날짜+시각 서식은 시각이 잘렸고(yyyy-mm-dd hh:mm→ 날짜만),[h]:mm:ss근무 합계 36시간은1.5였다. 스크래치 테스트로 세 가지를 먼저 재현한 뒤kinds를numberKind{what, seconds}구조체로 바꿔time/datetime/elapsed를 추가했고, 내장 서식표를builtInNumbers하나로 합쳐 18–21(시각)·22(날짜+시각)·45–47(경과)을 담았으며, 대괄호 안이 h·m·s 로만 된 단위를 알아보는elapsedUnit으로 경과 시간을 하루 넘겨 세게 했다.m은 월과 같은 글자라 단독으로는 시각으로 보지 않고, 음수·마지막 날 초과는 그대로 둔다.celltimes_test.go(서식 19가지 +kindOfFormat13가지 +elapsedUnit10가지 + 통합 문서 1개)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.27 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 2e0c8f1. - 보류 아이디어:
allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않는 문제 —deck/compile.go의parseBareNumber도 같이 손봐야 함 (가치 3 / 위험 3 / M)- 맥 엑셀의 1904 날짜 체계(
workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 2 / 위험 2 / S) writeSheet가 첫 행을 무조건 머리글로 삼아, A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (가치 2 / 위험 3 / M)- 유럽식 Excel 이 저장하는
;구분 CSV 를 한 열로 읽는 문제 — 구분자 추정 (가치 2 / 위험 3 / S)
- 릴리즈: v1.69.27 (태그·푸시는 외부 스크립트)
- 릴리즈: v1.69.27 (2026-09-05)
2026-09-07
- 선택: 이어지는 슬라이드가 모두 첫 아홉 줄을 출처로 적는 문제 (가치 4 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/tables.go의writeSheet가 이어지는 장마다rangeOf(sheet, columns, len(piece)+1)을 불러서, 슬라이드 한 장에 안 들어가는 시트가 나뉠 때 모든 장이실적!A1:B9라고 똑같이 말했다(스크래치 테스트로 24줄 시트 → 세 장이 전부 A1:B9 재현). 출처를 보고 시트를 연 사람은 그 숫자가 없는 여덟 줄로 가고, 틀렸다는 표시도 없다 — 출처가 있는 이유가 그것 하나인데. 각 조각이 시트에서 시작하는 행(머리글이 1행이므로 본문은 2행부터)을sheetPiece로 함께 들고 다니게 하고rangeOf를 줄 수 대신 첫 행·끝 행을 받게 바꿔, A1:B9 → A10:B17 → A18:B25 로 겹치지 않고 이어지게 했다. 한 장짜리 시트와 워드 표 경로는 그대로다.sheetranges_test.go(시트 6가지 + 범위 안 항목 확인 1가지 +rangeOf7가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. VERSION 1.69.28 스탬프(openapi·kubernetes·offline-deployment)와 릴리스 노트 작성, 커밋 ae451c5. - 보류 아이디어:
gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서, 시트 중간에 빈 줄이 있으면 출처 행 번호가 실제 시트와 어긋나는 문제 (가치 3 / 위험 3 / M)- 숨긴 시트(
sheet state="hidden")를 그대로 가져와 설정·코드표 같은 시트가 슬라이드가 되는 문제 (가치 3 / 위험 1 / S) allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않는 문제 —deck/compile.go의parseBareNumber도 같이 손봐야 함 (가치 3 / 위험 3 / M)- 맥 엑셀의 1904 날짜 체계(
workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 2 / 위험 2 / S)
- 릴리즈: v1.69.28 (태그·푸시는 외부 스크립트)
2026-09-08
- 선택: 숨긴 시트를 그대로 가져와 설정·코드표가 슬라이드가 되는 문제 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/workbook.go의workbookIndex가xl/workbook.xml의sheet state를 아예 읽지 않아서, 통합 문서가 숨겨 둔 시트(수식이 참조하는 코드표, 매크로가 읽는 설정, 지난 분기 작업본)가 전부 슬라이드가 되고 보고서인 양 출처까지 달렸다 — 스크래치 스텁으로 “분기 실적 다음에 코드표 슬라이드, 경고 없음”을 먼저 재현했다.state를 읽어hidden/veryHidden(대소문자·공백 무시) 시트를 건너뛰고 어떤 시트를 빼놓았는지 경고로 이름을 말하게 했으며, 전부 숨김이면 “읽을 표가 없습니다”(숫자가 보이는 파일을 든 사람을 되돌려 보내는 말) 대신 시트가 모두 숨겨져 있다고 이름과 함께 말한다.sheethidden_test.go(통합 문서 5가지 + 전부 숨김 1가지 +sheetHidden8가지)를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. 커밋 75376f7. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. -
보류 아이디어:
gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 빈 줄이 있는 시트의 출처 행 번호가 어긋나는 문제 (3/3/M) ·allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않아 금액 시트가 차트가 못 되는 문제 (3/3/M) · 맥 엑셀의 1904 날짜 체계(workbookPr date1904)를 무시해 날짜가 4년 이르게 읽히는 문제 (2/2/S) ·writeSheet가 첫 행을 무조건 머리글로 삼아 A1 에 제목 한 칸만 있는 시트가 어긋나는 문제 (2/3/M) · 유럽식 Excel 의;구분 CSV 를 한 열로 읽는 문제 (2/3/S) - 릴리즈: v1.69.28 (2026-09-08, run 2026-09-08-215101-ptium-improve)
2026-09-09
- 선택: 맥 엑셀의 1904 날짜 체계를 무시해 날짜가 4년 이르게 읽히는 문제 (가치 3 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/workbook.go가xl/workbook.xml의workbookPr date1904를 읽지 않아, 맥 엑셀이 쓴 통합 문서의 날짜가 전부 4년 하고 하루 이르게 나왔다(납기 2025-01-21 → 슬라이드에는 2021-01-20, 틀린 티도 안 나고 출처까지 달려서).counts1904로 그 스위치를 읽어cellFormats에 들고, 날짜 쓰기를dayShown하나로 모아 두 체계를 함께 다루게 했다. 덤으로 1900 체계의 없는 윤일 처리도 바로잡아, 그동안 하루 이르던 일련번호 1–59(1 → 1899-12-31)와 59와 똑같이 나오던 60(1900-02-29)이 시트가 보여 주는 날을 말한다. 날짜+시각도 같은 날 계산을 쓰므로 두 체계에서 맞고, 초 반올림이 24시로 넘어가지 않는다.sheetdays_test.go(1904 서식 9가지 + 1900 서식 6가지 +counts19047가지 + 통합 문서 2개)를 추가하고 옛 기대값을 담고 있던TestTheDayTheCountRunsFrom을 고쳤으며,make test(go test -race, go vet, tsc, vite build) 전부 통과. 커밋 e4dfa32. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. -
보류 아이디어:
gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 빈 줄이 있는 시트의 출처 행 번호가 어긋나는 문제 — 미머지 브랜치 auto/2026-09-07-0330(ae451c5)이 같은writeSheet/rangeOf를 고쳐 두었으므로 머지 뒤에 (3/3/M) ·allNumeric이 통화 기호·괄호 음수(“₩1,200”, “(1,200)”)를 숫자로 보지 않아 금액 시트가 차트가 못 되는 문제 (3/3/M) · ISO 날짜 셀(t="d")이 “2025-01-21T13:30:00” 그대로 나오는 문제 (2/1/S) · 시트가 30장 한도에 걸렸을 때 어떤 시트가 잘렸는지 이름을 말하지 않는 문제 (2/1/S) · 숨긴 행·열을 그대로 표에 넣는 문제 (2/2/M) ·writeSheet가 첫 행을 무조건 머리글로 삼는 문제 (2/3/M) · 유럽식 Excel 의;구분 CSV 를 한 열로 읽는 문제 (2/3/S) - 릴리즈: v1.69.29 (2026-09-09, run 2026-09-09-023103-ptium-improve)
2026-09-09
- 선택:
allNumeric이 통화 기호·괄호 음수를 숫자로 보지 않아 금액 시트가 차트가 못 되는 문제 (가치 3 / 위험 2 / 작업량 M) - 결과: 성공
- 요약:
internal/docs/tables.go의allNumeric이 쉼표·%·공백만 걷어내고strconv.ParseFloat을 걸어서, 통화 서식이 붙은 금액 열(“₩1,200”, “$1,200”, “1,200원”)과 회계 관례의 괄호 음수(“(340)”)가 전부 글자로 읽혔다. 그래서 시트가 차트가 되는 유일한 모양(라벨 한 열 + 숫자 한 열)에 금액 시트가 한 번도 걸리지 않았고, 지역별 매출이 그리라고 연 바로 그 숫자의 표로 나왔다.amountOf를 만들어 숫자를 바꾸지 않는 표시(통화 기호 ₩ ₩ $ € £ ¥ ¥ 와 낱말 “원”, 내보내기가 단위 앞에 넣는 고정 공백, 회계 괄호)만 벗기고 읽게 했으며, 낱말 단위는 그대로 두어 “1월”은 여전히 달이고 “3개”는 여전히 개수다(열에 문장이 한 줄이라도 있으면 여전히 표). 짝을 맞춰internal/deck/source.go의parseNumber도 괄호를 빼기 부호로 읽게 해서, 환불 행이 같은 액수가 팔린 달과 나란히 축 위로 그려지지 않고 축 아래로 간다.sheetamounts_test.go(CSV 6가지 +amountOf20가지)와TestParseNumberReadsBracketsAsAMinus를 추가하고make test(go test -race, go vet, tsc, vite build) 전부 통과. 커밋 cf1429b. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. - 보류 아이디어:
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 빈 줄이 있는 시트의 출처 행 번호가 어긋나는 문제 — 미머지 브랜치 auto/2026-09-07-0330(ae451c5)이 같은writeSheet/rangeOf를 고쳐 두었으므로 머지 뒤에 (3/3/M) · ISO 날짜 셀(t="d")이 “2025-01-21T13:30:00” 그대로 나오는 문제 (2/1/S) · 시트가 30장 한도에 걸렸을 때 어떤 시트가 잘렸는지 이름을 말하지 않고 “시트가 많아 앞 30개만” 이라며 슬라이드 수를 시트 수처럼 말하는 문제 (2/1/S) · 숨긴 행·열을 그대로 표에 넣는 문제 (2/2/M) ·writeSheet가 첫 행을 무조건 머리글로 삼는 문제 (2/3/M) · 유럽식 Excel 의;구분 CSV 를 한 열로 읽는 문제 (2/3/S)
2026-09-09
- 선택: 통화 서식 열을 차트로 읽되, 분류기와 렌더러의 숫자 파서를 하나로 합치기 (이슈 #8, 가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: PR #12 의 기능(통화 서식이 붙은 열 “₩1,200”·”1,200원”·”$1,200.50”·회계 괄호 “(340)” 을 표가 아니라 차트로 읽기)은 유지하고, 리뷰가 짚은 파서 불일치를 없앴다. 시트를 차트로 보낼지 정하는
docs.allNumeric과 막대 높이를 재는deck.parseNumber는 서로 다른 파서였고, main 에서도 ASCII 공백이 든 “1 200” 을 분류기는 1200 으로 렌더러는 1 로 읽었다(PR #12 는 고정 공백까지 그 경로로 밀어 넣어 회귀를 키웠다). 새internal/figures가 값을 한 번만 훑어 두 물음에 답한다 — 어떤 수를 담고 있나(Of, 렌더러용)와 그 수가 전부였나(Alone, 분류기용) — 이므로 통화 기호·천 단위 구분(쉼표·ASCII 공백·고정 공백 U+00A0·U+202F)·회계 괄호는 두 곳에서 함께 벗겨지거나 함께 남는다. 낱말 단위는 그대로여서 “1월”은 달, “3개”는 개수다. 검증:internal/figures/figures_test.go(Of 18가지 + Alone 22가지 + 두 읽기가 같은 수를 내는지 확인하는 불변식 테스트)와internal/docs/sheetamounts_test.go(CSV→슬라이드 6가지 + docs.Read → deck.ParseSource 로 실제 막대 값을 확인하는 end-to-end 5가지, 명세의 재현 CSV 가 서울=1200·부산=980 으로 나오는 것 포함).cd server && go test -race ./...와go vet ./...전부 통과.make test의 웹 단계(tsc/vite)는 이 워크트리에 node_modules 가 없어 실행하지 못했고, 변경은 Go 코드에만 있다. 커밋 9f32aea. 커밋 메시지에는 “음수가 축 아래로 그려진다” 같은 실제로 일어나지 않는 효과를 쓰지 않았다(pptx/blocks.go 는 math.Abs 로 높이를 잡는다). - 보류 아이디어:
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 빈 줄이 있는 시트의 출처 행 번호가 어긋나는 문제 (3/3/M) · ISO 날짜 셀(t="d")이 “2025-01-21T13:30:00” 그대로 나오는 문제 (2/1/S) · 시트가 30장 한도에 걸렸을 때 잘린 시트 이름을 말하지 않고 슬라이드 수를 시트 수처럼 말하는 문제 (2/1/S) · 숨긴 행·열을 그대로 표에 넣는 문제 (2/2/M) ·writeSheet가 첫 행을 무조건 머리글로 삼는 문제 (2/3/M) · 유럽식 Excel 의;구분 CSV 를 한 열로 읽는 문제 (2/3/S)
2026-09-09
- 선택: 통화 서식 열을 차트로 읽되, 분류기만 좁게 고쳐 라인 차트 회귀를 없애기 (이슈 #9, 가치 4 / 위험 1 / 작업량 M)
- 결과: 성공
- 요약: PR #12 의 기능(통화 서식이 붙은 열 “₩1,200”·”1,200원”·”$1,200.50”·회계 괄호 “(340)” 을 표가 아니라 차트로 읽기)만 main 위에 다시 얹고, PR #13 이 만든 파서 통합은 통째로 빼서
internal/figures를 만들지 않았다 —docs.amountOf(분류기)와deck.parseNumber(렌더러)는 서로 다른 계약을 지키는 별개의 읽기로 그대로 둔다. 명세대로 좁게:amountSigns에서 고정 공백(U+00A0)만 뺐다. 분류기가 “1 200”(고정 공백)을 숫자로 인정하지 않으니 그 시트는 main 과 같이 표로 남고, 렌더러가 1 로 읽어 막대가 뒤집히는 문제가 없어지며,figures.Of가 공백에서 숫자를 끊지 않아- 전환 전 | 120, 118, 121, 119가 1.20118121119e+11 이 되던 회귀는 아예 존재하지 않는다(그 코드가 없다). 평범한 공백은 main 그대로 두었고 주석에 더 오래된 별개의 불일치라고 적어 두었다. 검증:server/internal/deck/source_test.go에TestALineChartRowKeepsItsFiguresApart(문서화된 행이parseSourceItem→parseNumber로 120 을 내는지 + 구분자 4가지),server/internal/docs/sheetamounts_test.go에 CSV→슬라이드 7가지(고정 공백 열이 표로 남는 것 포함)·amountOf20가지·docs.Read → deck.ParseSource로 실제 막대 값을 확인하는 end-to-end 4가지를 넣었다.cd server && go vet ./...와go test -race ./...21개 패키지 전부 통과(make test의 웹 단계는 이 워크트리에 node_modules 가 없어 실행 못 했고, 변경은 Go 코드에만 있다). 커밋 1483b23. 커밋 메시지에는 “하나의 읽기로 통일” 류의 문구를 쓰지 않았고,pptx가 막대를 크기로만 그리므로 “(340)” 이 차트에 들어가면 340 이 팔린 달과 같은 방향·크기로 그려진다는 점을 명시했다. - 보류 아이디어: 분류기가 평범한 공백(“1 200”)은 여전히 숫자로 보아 렌더러가 1 로 읽는, 이번보다 오래된 같은 종류의 불일치 (3/2/S) ·
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 빈 줄이 있는 시트의 출처 행 번호가 어긋나는 문제 (3/3/M) · ISO 날짜 셀(t="d")이 “2025-01-21T13:30:00” 그대로 나오는 문제 (2/1/S) · 시트가 한도에 걸렸을 때 잘린 시트 이름을 말하지 않고 슬라이드 수를 시트 수처럼 말하는 문제 (2/1/S)
2026-09-09
- 선택: ISO 날짜 셀(t=”d”)이 저장된 글자 그대로 슬라이드에 나오는 문제 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: 엄격(strict) 스키마로 저장한 통합 문서(“Strict Open XML Spreadsheet” — 보존용·공공기관 제출용으로 요구되는 그 형식)는 날짜를 일련번호가 아니라
t="d"와 “2025-01-21T13:30:00” 이라는 글자로 쓴다.gridOf의default가지가 이를 숫자로 보려다ParseFloat에서 실패해, 셀에 어떤 날짜 서식이 붙어 있든 T 가 든 글자가 그대로 슬라이드에 나왔다(스크래치 테스트로 납기 열이 “2025-01-21T13:30:00” 로 나오는 것을 먼저 재현).internal/docs/cellformat.go에isoMoment(ISO 8601 다섯 가지 모양 — 오프셋·Z·소수점 초 포함)와cellFormats.moment를 넣어, 일련번호와 똑같이 셀 서식이 얼마만큼을 보여 줄지 정하게 했다(날짜 서식이면 날, 날짜+시각이면 시각까지, 시각 서식이면 시각만, 서식이 초를 적으면 초까지). 서식이 없거나(General) 백분율·경과 시간처럼 순간에 맞지 않는 서식이면 저장된 순간 자체를 쓴다(자정이 아니면 시각까지). 시간대는 읽되 변환하지 않아 13:30+09:00 이 04:30 으로 밀리지 않고, 순간이 아닌 값은 그대로 둔다.internal/docs/workbook.go의gridOf에case "d":한 가지를 더했다. 검증:sheetmoments_test.go(서식×값 19가지 + 순간의 표기 10가지 + 엄격 통합 문서 end-to-end 1개)를 추가하고go vet ./...와go test -race ./...21개 패키지 전부 통과.make test의 웹 단계(tsc/vite)는 이 워크트리에 node_modules 가 없어 실행하지 못했고, 변경은 Go 코드에만 있다. 커밋 481b189. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. -
보류 아이디어: 분류기가 평범한 공백(“1 200”)을 숫자로 보아 렌더러가 1 로 읽는 오래된 불일치 (3/2/S) ·
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 출처 행 번호가 어긋나는 문제 — 미머지 브랜치 auto/2026-09-07-0330 머지 뒤에 (3/3/M) · 시트가 한도에 걸렸을 때 잘린 시트 이름을 말하지 않고 슬라이드 수(maximumSlides)를 시트 수처럼 말하는 문제 (2/1/S) · 숨긴 행·열(hidden="1")을 그대로 표에 넣는 문제 (2/2/M) - 릴리즈: v1.69.30 (2026-09-09, run 2026-09-09-115108-ptium-improve)
2026-09-10
- 선택: 시트가 한도에 걸렸을 때 잘린 시트 이름을 말하지 않고 슬라이드 수를 시트 수처럼 말하는 문제 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약:
internal/docs/workbook.go의readWorkbook이 슬라이드 한도(maximumSlides30)에 걸리면 “시트가 많아 앞 30개만 가져왔습니다” 한 줄만 남기고break했다 — 빠진 시트 이름을 하나도 대지 않고, 30은 시트 수가 아니라 슬라이드 수라서 시트마다 3장씩 차는 통합 문서는 열두 시트 중 열 시트만 읽고도 “앞 30개(시트)를 가져왔다”고 말했다. 이제 한도를 넘긴 뒤에도 시트를 계속 훑어 빠진 이름을 모으고, 숨긴 시트 경고와 같은 말투로 “슬라이드가 많아 시트(…)는 가져오지 않았습니다. 나눠서 올리면 전부 가져옵니다”(docx 경로가 이미 하는 안내)라고 말한다. 이름은 다섯 개까지 대고 나머지는 “외 n개”로 세며(sheetsNamed), 그 목록 함수를 숨긴 시트 경고·오류와도 공유한다. 빈 시트는 애초에 슬라이드가 될 수 없었으므로trimGrid로 걸러 이름을 대지 않는다. 검증:sheetlimit_test.go(통합 문서 4가지 — 시트 34개·시트마다 3장씩 12개·이름이 넘치는 40개·한도 뒤의 빈 시트 + 한도에 딱 맞는 문서가 경고하지 않는지 1가지 +sheetsNamed6가지)를 추가하고go vet ./...와go test -race ./...22개 패키지 전부 통과.make test의 웹 단계(tsc/vite)는 이 워크트리에 node_modules 가 없어 실행하지 못했고, 변경은 Go 코드에만 있다. 커밋 bb8efaf. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. -
보류 아이디어: 분류기가 평범한 공백(“1 200”)을 숫자로 보아 렌더러가 1 로 읽는 오래된 불일치 — amountOf 브랜치(auto/2026-09-09-1131) 머지 뒤에 (3/2/S) ·
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) · 회계 음수를 막대가math.Abs로 그려 부호가 사라지는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 출처 행 번호가 어긋나는 문제 — 미머지 브랜치 auto/2026-09-07-0330 머지 뒤에 (3/3/M) · 숨긴 행·열(hidden="1")을 그대로 표에 넣는 문제 (2/2/M) - 릴리즈: v1.69.32 (2026-09-10, run 2026-09-10-003125-ptium-improve)
2026-09-10
- 선택: 분류기가 평범한 공백(“1 200”)을 숫자로 보아 렌더러가 1 로 읽는 문제 (가치 3 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약:
auto/2026-09-09-1131(amountOf)이 이제 main 에 머지되어 있어 보류해 두었던 이 항목을 집었다.internal/docs/tables.go의amountSigns가 평범한 공백을 지워서 분류기는 “1 200” 을 1200 으로 읽고, 같은 셀을deck.parseNumber는 공백에서 끊어 1 로 읽었다 — 스크래치 테스트로 서울=1 200, 부산=980 인 CSV 가::columns로 넘어가 서울 막대가 1 로 그려지는 것을 먼저 재현했다. 공백은 이제 replacer 에서 지우지 않고, 대신 기호를 벗긴 뒤TrimSpace를 걸어 단위 앞의 공백(“1,200 원”, “₩ 1,200”)만 떨어지게 했다 — 그 모양은 렌더러도 1200 으로 읽으므로 여전히 차트다. 덤으로bareFigure를 두어 Go 의ParseFloat만 읽고 렌더러는 못 읽는 표기(지수 “1.5E+15”, “Inf”, “NaN”, 16진수, “.5”)도 분류기에서 빼, 좁히는 방향으로만 움직였다.sheetamounts_test.go에 CSV→슬라이드 3가지(평범한 공백은 표로, 단위 앞 공백은 차트로, 지수는 표로)·amountOf15가지·end-to-end 1가지를 더했고 옛 코드에 대고 돌려 새 단언이 전부 실패하는 것을 확인했다.go vet ./...와go test -race ./...22개 패키지 전부 통과(make test의 웹 단계는 이 워크트리에 node_modules 가 없어 실행 못 했고, 변경은 Go 코드에만 있다). 커밋 6b22609. 버전·릴리스 노트는 이번 세션 범위가 아니라 손대지 않았다. - 보류 아이디어:
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) · 회계 음수를 막대가math.Abs로 그려 부호가 사라지는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 출처 행 번호가 어긋나는 문제 — 미머지 브랜치 auto/2026-09-07-0330 머지 뒤에 (3/3/M) · 숨긴 행·열(hidden="1")을 그대로 표에 넣는 문제 (2/2/M) ·writeSheet가 첫 행을 무조건 머리글로 삼는 문제 — 같은 미머지 브랜치가 고친 함수 (2/3/M)
2026-09-11
- 선택: 캠페인 guides-2026-09 — 사용자 가이드·관리자 가이드를 실제 화면 캡처가 들어간 완성본으로 (가치 5 / 위험 1 / 작업량 M)
- 결과: 성공
- 요약: 저장소에는
docs/user-guide.md(사용자 안내, 캡처 0장)와 영문 운영 문서(offline-deployment.md·security.md)만 있었고 표준이 정한 네 산출물은 하나도 없었다. 로컬에 있는 릴리즈 이미지ptium:1.69.32를 postgres:16-alpine 과 함께 버려도 되는 컨테이너로 띄우고(개발 인증,hong@example.com·홍길동, 데모 회사 브리프 4개·CSV 가져오기 1개·SVG 이미지 2개·API 키 2개를 API 로 채움), 새로 만든scripts/guide/screenshots.py(playwright, 1440×900, 대상·시크릿은PTIUM_GUIDE_URL/PTIUM_GUIDE_DEV_SECRET전용 변수에서만 읽고 없거나 로컬이 아니면 멈춤, 서비스 설정은 건드리지 않음, 시드에[가이드]표식을 붙여 재실행 시 중복 없음)로 29장을 찍었다 — 로그인·홈·프레젠테이션·새로 만들기 1/2단계·템플릿·내 이미지·편집기(본문 슬라이드)·코드 탭·버전 이력·명령·공유·품질·개인화·API 키·API 문서·사용 가이드, 관리자 개요·서비스 설정 5영역·사용자·사용 현황·오류·감사·디자인·정리할 것. 비어 있던 생성 큐·공유 링크 캡처는 표준대로 싣지 않고 스크립트에서도 뺐다(오류 화면은 정상 상태임을 alt 에 명시).docs/USER_GUIDE.md는 옛 user-guide.md 의 내용을 표준 6절(하는 일·처음 5분·화면별·자주 하는 작업·막혔을 때·용어)로 재구성하고 서버·웹 코드에서 확인한 실제 오류 문구 11개를 표로 실었다.docs/ADMIN_GUIDE.md는 구성 요소·설치(릴리즈 자산→docker load→compose/k8s→첫 관리자, 붙여 넣을 수 있는 명령)·환경 변수 전수 표(config.go 22개 + auth/config.go 의 OIDC·DEV 13개, 기본값은 코드에서)·관리자 콘솔 설정 키 30개(db/migrations.go defaultSettings)·역할·운영(상태 점검·로그·백업·업그레이드·되돌리기·정리)·장애 대응(main.go·auth·loginlimiter 의 실제 로그 문구 14건)·보안. API 메서드는 server.go 라우트 등록에서 확인(PATCH /admin/users/{id}, POST /admin/settings/changes/{id}/revert 등). PDF 는 공용 md2pdf.mjs 로 두 개 생성(21쪽·17쪽), PyMuPDF 로 표지·표·그림 쪽을 래스터해 깨지지 않은 것을 확인. 정본 정리:docs/user-guide.md는 “대체되었습니다” 스텁으로, README 링크는 새 문서로. Go/웹 코드 변경 없음이라make test는 돌리지 않았고 스크립트는py_compile. 캡처용 컨테이너·네트워크·시크릿 파일은 끝나고 지웠다. 커밋 fb37cf1. - 보류 아이디어:
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) · 회계 음수를 막대가math.Abs로 그려 부호가 사라지는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 출처 행 번호가 어긋나는 문제 — auto/2026-09-07-0330 머지 뒤에 (3/3/M) · 가이드 후속: 생성 큐·오류 화면을 항목이 있는 상태로 찍기 — 실패 생성을 재현할 시드(예: 모델 주소를 닿지 않는 곳으로 두고 생성)가 필요하나 서비스 설정을 바꾸고 되돌려야 하므로 표준의 복원 규칙을 지켜 별도로 (2/2/S) · 숨긴 행·열(hidden="1")을 그대로 표에 넣는 문제 (2/2/M)
2026-09-11
- 선택: 캠페인 guides-2026-09 후속 — 생성 큐·오류 인시던트·공유 링크·생성 실패 화면을 항목이 있는 상태로 찍어 두 가이드에 싣기 (가치 3 / 위험 2 / 작업량 S)
- 결과: 성공
- 요약: 이 워크트리는 main 에서 갈라져 있어 이전 회차의 가이드 커밋(fb37cf1·7cb0ef4, 브랜치 auto/2026-09-11-0741, 미머지)이 없었으므로
git reset --hard origin/auto/2026-09-11-0741로 같은 SHA 위에 얹어 그 PR 이 먼저 머지되면 이 PR 은 차분만 남게 했다. 그 위에서 표준의 “빈 화면을 찍지 않는다” 를 어기고 있던 세 화면을 채웠다:scripts/guide/screenshots.py에seed_failure(모델이 죽은 주소는 내장 작성기로 넘어가 실패가 아니므로, 배포 자신의 APIhttp://127.0.0.1:8080/api/v1를 모델 주소로 두어 401+JSON 을 받게 해 “설정이 틀린 모델” 로 실패시킴;ai.provider·ai.base_url두 값만 읽어 두고finally에서 복원 — withmodel.py 선례, 실제 복원됨을 API 로 확인)과seed_share(덱에 14일짜리 공유 링크 하나)를 더해, ptium:1.69.32 + postgres:16-alpine 버림 컨테이너에서 33장을 한 번에 다시 찍었다. 새 캡처 5장:admin-queue(실패 덱과 작성자에게 보이는 사유),admin-errors(401 인시던트 열림),admin-errors-detail(발생 버전·지문·운영 메모·상태 버튼),admin-shares(회수 가능한 링크 한 건),editor-failed(작성자 쪽 실패 화면). ADMIN_GUIDE 에 5.2 생성 큐 절(다시 큐에·중단,POST /admin/generations/{id}/requeue|cancel은 server.go 라우트와 핸들러에서 확인)·오류 인시던트 처리 흐름(APIstatus는open·acknowledged·resolved·ignored, 화면의 조사 중 = acknowledged 를 client.ts 매핑에서 확인)·공유 링크 회수 문단을 넣고, USER_GUIDE 의 실패 행은 실제 버튼 문구 생성 다시 시도로 고치고 캡처를 실었다. PDF 두 개는 공용 md2pdf.mjs 로 이전과 같은 부제로 다시 굽고(23쪽·19쪽) PyMuPDF 로 새 그림 쪽을 래스터해 확인.go test ./internal/docs -run Told(USER_GUIDE 를 읽는 검사) 통과, 스크립트py_compile. 컨테이너·네트워크·시크릿 파일은 끝나고 지웠다. 커밋 6ceaf1b. -
보류 아이디어:
seriesFromRows가 표의 값을 쉼표로 다시 쪼개 “1,200” 을 1 과 200 두 점으로 읽는 문제 (3/3/M) · 회계 음수를 막대가math.Abs로 그려 부호가 사라지는 문제 (3/3/M) ·gridOf가 행의r을 보지 않고trimGrid이 빈 행을 지워서 출처 행 번호가 어긋나는 문제 — auto/2026-09-07-0330 머지 뒤에 (3/3/M) · 가이드 후속: 릴리즈 스크립트가 태그와 가이드의 버전 스탬프가 다르면 경고하게 (2/1/S) · 숨긴 행·열(hidden="1")을 그대로 표에 넣는 문제 (2/2/M) - 릴리즈: v1.69.34 (2026-09-12, run 2026-09-12-084231-ptium-approve)