umm
요약. umm: 자율 개선 회차 16회, 릴리즈 10건. 최근 릴리즈 v0.71.7 (자산 3개). 건강 A
- 16회차
- 1프로젝트
- 10배포 준비 완료
- 0릴리즈 진행 중
- 1병합 완료
- 2검토 대기
- 3검증 실패
- 0변경 없음
- 0실행 오류
- $42.54비용
- 2시간 12분에이전트 시간
현황
- 저장소
- https://github.com/hkjang/umm
- 마지막 회차
- 2026-09-11 08:58 KST — • 기타 review held, PR open PR #151
- 최근 릴리즈
- v0.71.7 — released · 자산 3개 (이전 v0.71.5: 3개) 전체 릴리즈 →
회차 이력
| 일시 | 프로젝트 | 결과 |
|---|---|---|
| 2026-09-11 08:58 | umm | 검토 대기 review held, PR open PR #151 |
| 2026-09-10 16:13 | umm | 검토 대기 review held, PR open PR #149 |
| 2026-09-09 13:07 | umm | 배포 준비 완료 merged PR #147, released v0.71.5 |
| 2026-09-09 03:38 | umm | 배포 준비 완료 merged PR #146, released v0.71.4 |
| 2026-09-08 22:49 | umm | 배포 준비 완료 merged PR #145, released v0.71.3 |
| 2026-09-07 04:22 | umm | 검증 실패 verify failed: secrets in diff |
| 2026-09-06 19:57 | umm | 검증 실패 verify failed: secrets in diff |
| 2026-09-06 19:44 | umm | 검증 실패 verify failed: secrets in diff |
| 2026-09-05 08:43 | umm | 배포 준비 완료 merged PR #144, released v0.71.2 |
| 2026-09-04 17:04 | umm | 배포 준비 완료 merged PR #143, released v0.71.1 |
| 2026-09-04 01:10 | umm | 배포 준비 완료 merged PR #138, released v0.67.2 |
| 2026-09-03 17:31 | umm | 배포 준비 완료 merged PR #137, released v0.67.1 |
| 2026-09-03 10:31 | umm | 배포 준비 완료 merged PR #135, released v0.66.3 |
| 2026-09-03 05:00 | umm | 배포 준비 완료 merged PR #133, released v0.66.1 |
| 2026-09-02 22:44 | umm | 배포 준비 완료 merged PR #132, released v0.66.0 |
| 2026-09-02 16:30 | umm | 병합 완료 merged PR #131, release released |
비용·사용량
| 시각 | 프로젝트 | 단계 | 시간 | 턴 | 비용 | 토큰 입력/출력 | 종료 |
|---|---|---|---|---|---|---|---|
| 17:44 | umm | 릴리즈 | 5분 | 28 | $1.66 | 1.5M / 13K | success |
| 08:58 | umm | review | 2분 | 22 | $1.25 | 1.1M / 8K | success |
| 08:55 | umm | 개선 | 16분 | 68 | $7.28 | 8.2M / 54K | success |
| 16:12 | umm | review | 4분 | 23 | $1.39 | 1.1M / 15K | success |
| 16:08 | umm | 개선 | 8분 | 50 | $3.17 | 3.3M / 26K | success |
| 01:23 | umm | 릴리즈 | 3분 | 24 | $1.01 | 793K / 9K | success |
| 01:10 | umm | review | 3분 | 19 | $1.01 | 676K / 12K | success |
| 01:07 | umm | 개선 | 6분 | 36 | $1.98 | 1.7M / 20K | success |
| 12:53 | umm | 릴리즈 | 2분 | 23 | $0.88 | 670K / 8K | success |
| 12:41 | umm | review | 3분 | 24 | $1.02 | 677K / 12K | success |
| 12:38 | umm | 개선 | 7분 | 50 | $2.85 | 2.7M / 25K | success |
| 03:23 | umm | 릴리즈 | 3분 | 25 | $0.93 | 734K / 9K | success |
| 03:10 | umm | review | 3분 | 12 | $0.85 | 461K / 10K | success |
| 03:07 | umm | 개선 | 7분 | 56 | $3.12 | 3.3M / 27K | success |
| 22:35 | umm | 릴리즈 | 4분 | 24 | $1.16 | 875K / 12K | success |
| 22:21 | umm | review | 3분 | 18 | $0.86 | 430K / 11K | success |
| 22:18 | umm | 개선 | 8분 | 42 | $2.33 | 2.1M / 27K | success |
| 04:22 | umm | 개선 | 12분 | 58 | $4.12 | 4.3M / 40K | success |
| 19:57 | umm | 개선 | 7분 | 54 | $2.40 | 2.2M / 24K | success |
| 19:44 | umm | 개선 | 25분 | 68 | $3.28 | 3.6M / 27K | success |
아이디어 백로그 — 대기 15 / 전체 17
| 아이디어 | 가치/위험/크기 | 상태 | 메모 | 갱신 |
|---|---|---|---|---|
| 머지되지 않은 회차의 나머지 두 고침이 main에 없음 — 공간 전환 시 rewind가 따라감, 공백 한 칸 발표 제목 | 3/1/M | 대기 | 재확인 안 함(이번 회차는 캠페인 우선). CanvasPage.tsx params.spaceId effect에 setRewind(undefined) 없음 / presentation/service.go의 req.Title == "" 판정. 별개 세션으로 나눠 옮기는 편이 안전. | 2026-09-11 |
| 401/403이 오프라인 큐 전체를 세움 | 3/3/M | 대기 | 403은 한 변경에 대한 거부일 수 있음. 항목 단위로 좁히되 조용히 버려지는 변경이 생기지 않게. | 2026-09-11 |
| 내보내기 본문에 `## `로 시작하는 줄이 있으면 거기서 생각이 잘림 | 3/3/M | 대기 | 이스케이프 없이는 생각 경계와 구별 불가. 양쪽 형식 변경 + 옛 백업 호환. `- id:` 꼬리 항목과 묶을 것. | 2026-09-11 |
| 업로드 라벨에 든 경로가 safeFilename에서 구분자만 지워져 이름이 뭉개짐 | 2/1/S | 대기 | store/attachments.go:150이 '/'와 '\\'를 지우기만 함. 마지막 경로 조각만 취해야 함. v0.71.4부터 그 라벨이 내려받기 이름이라 눈에 띔. | 2026-09-11 |
| exportOutline의 내려받기 이름이 언제나 umm-outline.md라 공간을 구분할 수 없음 | 2/1/S | 대기 | export_handlers.go:101이 리터럴 헤더. attachmentDisposition 헬퍼는 있으나 공간 이름 조회를 한 번 더 해야 함. | 2026-09-11 |
| usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 | 2/1/S | 대기 | presentation/sections.go:116 경계 검사와 같은 자리에 제목 중복 판정 한 줄. | 2026-09-11 |
| README 배지·소개와 docs/README.md 허브의 버전이 실제와 어긋남 | 2/1/S | 대기 | docs/README.md 허브의 '문서 기준' 줄은 이번 회차에 v0.71.6으로 고침. README 배지(v0.22.0)·소개(v0.44.0)는 아직 그대로 — check-version.sh가 보지 않는 자리. | 2026-09-11 |
| 캡처 스크립트의 승인 요청 시드가 400으로 거절되어 검토·승인 화면이 빈 상태로 찍힘 | 2/1/S | 대기 | POST /api/v1/approvals가 '검토 요청 형식이 올바르지 않습니다.'로 거절. createApproval이 받는 body 형식(resourceType/action 값)을 맞추고, 검토 프로세스에서 해당 작업이 켜져 있어야 할 수도 있음. 맞추면 approvals.png에 항목이 실림. | 2026-09-11 |
| docs/features.md·umm_features_guide.pdf·umm_complete_manual.pdf가 v0.6.0 캡처를 여전히 담음 | 2/1/S | 대기 | 새 가이드와 화면이 어긋남. features.md에 '대체되었습니다' 표시 + 새 가이드 링크, 또는 generate_pdf.js로 재생성(현재 완본은 USER_GUIDE/ADMIN_GUIDE를 포함하도록 바꿔 둠). | 2026-09-11 |
| Dream 후보가 있는 검토함 화면을 캡처하려면 OpenAI 호환 가짜 게이트웨이가 필요 | 2/1/M | 대기 | 테스트 코드에 있는 httptest 기반 가짜 Gateway를 독립 실행형으로 빼거나 작은 Node 서버로 두고, capture_all.js가 AI Gateway를 설정→Dream 수동 실행(POST /admin/dreams/run)→복원하는 순서로. 설정 복원 규칙(GUIDE-STANDARD) 준수 필요. | 2026-09-11 |
| 재시도 초안이 메타데이터 없는 생각에 `## Connections` 제목을 그대로 씀 | 2/2/S | 대기 | formatImportedThoughts. 닿는 조건이 좁음(직접 친 제목 + 내보내기 덧붙임 + 일부 실패). | 2026-09-11 |
| 본문 마지막 줄이 `- id: `x`` 이면 그 생각의 id로 읽힘 | 2/2/M | 대기 | 본문과 메타데이터의 경계 표시가 없음. 위 항목과 한 형식 변경으로. | 2026-09-11 |
| 분량 캡(fit)과 sectionDeck이 len(story.Slides)로 세어 덱에 쓰이지 않는 장까지 침 | 2/2/M | 대기 | coverTitle()/heading() 정리가 main에 없으므로 '머지되지 않은 회차' 항목 뒤에 재평가. | 2026-09-11 |
| PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 | 2/2/M | 대기 | 15장을 골랐는데 부 제목 3장이 자리를 가져가는 것이 화면에 드러나지 않음. | 2026-09-11 |
| 가이드가 참조하는 캡처 파일 존재 검사를 CI에 | 1/1/S | 대기 | USER_GUIDE.md·ADMIN_GUIDE.md의 screenshots/*.png 참조가 모두 존재하는지 검사하는 스크립트 한 줄을 make test-web 또는 check-version.sh 옆에. | 2026-09-11 |
| 사용자·관리자 가이드를 실제 화면 캡처가 든 완성본으로 (캠페인 guides-2026-09) | 4/1/M | 완료 | docs/USER_GUIDE.md·ADMIN_GUIDE.md + PDF, docs/screenshots 27장을 v0.71.6 실물에서 새로 찍음. capture_all.js는 env 자격 증명·루프백 가드·모킹 제거. 옛 user-guide/admin-guide와 PDF 정리, README·허브·index.html 링크 이동. 커밋 d157dc8. | 2026-09-11 |
| Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있음 | 3/1/S | 완료 | 이번 회차의 USER_GUIDE.md 내보내기 표('붙인 그림은 실리지 않습니다')와 ADMIN_GUIDE.md 백업 절에 적음. 내보내기 메뉴 안의 한 줄(i18n ko/en)은 아직 없음 — 필요하면 별개 S 항목. | 2026-09-11 |
원장 (에이전트가 남긴 기록)
2026-09-02
- 선택: 분량 제한이 남긴 “아무것도 열지 않는 부 제목” (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: v0.63.0의 부 나누기와 v0.64.0의 분량 맞추기를 같이 켜면, 덱 완성 후 2차
fit이 부 제목(Sectioned)을 사람의 슬라이드와 같은 점수표로 채점해 제목만 남고 그 부의 슬라이드가 전부 잘리는 결함이 있었습니다(재현: 3부 12장 → 8장 요청 시 빈 제목 2개, 사람 슬라이드는 8칸 중 5칸). 부 제목을 채점 대상에서 빼고 “그 부에 슬라이드가 남아 있을 때만 제목이 존재”하도록choose/openParts를 도입했고, 잘려 나간 뒤의 부 개수를 화면 문구(Storyline.Sections)에 다시 반영했습니다. 검증: 새 시험 3개 추가 후 구현을 옛 동작으로 되돌리면 3개 전부 실패함을 확인,go vet ./...·go test ./...(113개 파일) · gofmt · tsc · oxlint/Prettier · i18n 948키 · vitest 137개 ·scripts/check-version.sh통과. v0.65.1로 릴리스 커밋(7009570). - 보류 아이디어:
docs/README.md문서 허브가 v0.8.1 기준에 멈춰 있어 최신 릴리스 목록·기준 버전이 실제(v0.65.x)와 어긋남 (가치 2 / 위험 1 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)PresentationModal이 부 개수는 말하지만 “몇 장이 부 제목인지”는 말하지 않음 — 분량 안에서 제목이 차지한 칸을 보여 주기 (가치 2 / 위험 2 / M)fit의openParts재계산이 채우기 루프마다 O(n) — 슬라이드 수가 큰 공간에서 O(n²), 지금은 무해하지만 상한 명시 필요 (가치 1 / 위험 1 / S)length.go파일 머리 주석이 부 제목을 다루지 않아, 이 파일이 무엇을 채점하고 무엇을 채점하지 않는지 한 곳에 적혀 있지 않음 (가치 2 / 위험 1 / S)
2026-09-02 (2)
- 선택: 다시 시도가 요청을 잃어버리고 다른 발표를 만듦 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: 덱 만들기 2단계 중 소스 적용이 실패하면 umm이 “그 덱에 다시 시도”를 제안하는데,
Service.Retry가Request{SpaceID, Title}만으로 재컴파일해 선택(Only)·분량 제한(MaxSlides)·스위치 4개가 전부 기본값으로 되돌아간 다른 발표를 같은 덱에 넣고 있었습니다(생각 6개·20장 요청 → 공간 전체·제한 없음, 화면은 성공이라고만 표시). 요청을presentation_links.requestjsonb에 저장하도록 마이그레이션 024와CreatePresentationLink(..., request)를 추가하고,FailedPresentationLink가 함께 읽어asRequest(link)로 되살리게 했습니다(옛 행은{}→ 예전 동작 유지). 검증:Retry에 단위 시험이 하나도 없어 3개를 새로 추가했고 옛 동작으로 되돌리면 첫 번째가 실패함을 확인, 실제 PostgreSQL 17(도커 컨테이너의 임시 DB)에서 store·httpapi·mcp 통합 시험 전부 통과 및 jsonb 왕복 확인,scripts/migrate-dry-run.sh(적용·재적용·롤백) 통과,go vet ./...·go test ./...· gofmt · tsc · oxlint · i18n · vitest 137개 ·check-version.sh통과. v0.66.0으로 릴리스 커밋(3e80d3d). - 보류 아이디어:
README.md상단 릴리스 소개가 v0.44.0에서 멈춰 실제(v0.66.0)와 22개 릴리스 어긋남 (가치 2 / 위험 1 / S)docs/README.md문서 허브가 여전히 v0.8.1 기준 (가치 2 / 위험 1 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 (가치 2 / 위험 1 / S)PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 (가치 2 / 위험 2 / M)WriteSource는 제목이 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어, 그런 슬라이드가 생기면 이후 모든 슬라이드의 출처 매핑이 한 칸씩 밀림(현재는 도달 불가로 보이나 두 곳의 규칙이 다름) (가치 3 / 위험 2 / S)
- 릴리즈: v0.66.0 (2026-09-02)
2026-09-03
- 선택: 연결되어 있는데 연결을 기다리는 오프라인 변경 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: 오프라인 큐를 다시 비우는 유일한 자동 신호가 브라우저
online이벤트인데, 연결과 무관하게 flush가 멈추는 두 경우 — 409idempotency-in-progress(다른 요청이 같은 변경을 쓰는 중)와navigator.onLine이 참인 채로 던진 요청 — 에는 그 이벤트가 오지 않아, 변경이1개 변경이 연결을 기다리는 중배너를 띄운 채 사람이지금 동기화를 누를 때까지 영원히 앉아 있었습니다(기존 시험 이름은 “retries an in-progress reservation”이었지만 재시도를 아무도 하지 않았음). 각각 2초·5초 타이머를 걸었고, 그 타이머가 넓히는 2차 결함 — 버전 충돌은 재전송해도 같은 409이고 매번umm:offline-conflict가 다시 발생해 CanvasPage가setMergeDraft로 사람이 타이핑하던 병합칸을 덮어씀 — 을 막기 위해 충돌을 이미 보여 준 변경은 재전송하지 않고 결정(discardOfflineMutation)까지 붙잡아 두게 했습니다. 검증: 새 vitest 3개 추가 후api.ts를 옛 동작으로 되돌리면 3개 전부 실패함을 확인,go vet ./...·go test ./...· tsc · oxlint/Prettier · i18n 948키 · vitest 140개 ·scripts/check-version.sh통과. v0.66.1로 릴리스 커밋(a1280ef). - 보류 아이디어:
OfflineStatus배너가 온라인인데도 “연결을 기다리는 중”이라고 말함 — 충돌 대기/재시도 대기와 진짜 오프라인을 구분해 문장을 나누기 (가치 3 / 위험 1 / S)README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.66.1)와 어긋남 (가치 2 / 위험 1 / S)WriteSource는 제목이 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어 출처 매핑이 밀림(현재는selectThoughts덕에 도달 불가이나 두 곳의 규칙이 다름) (가치 3 / 위험 2 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 (가치 2 / 위험 2 / M)
- 릴리즈: v0.66.1 (2026-09-03)
- 릴리즈: v0.66.1 (2026-09-03)
2026-09-03 (2)
- 선택: 아무도 듣지 못한 충돌 — 결정을 기다리다 영원히 갇히는 오프라인 변경 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: v0.66.1이 “충돌한 변경은 재전송하지 않고 사람의 결정을 기다린다”로 바꿨는데, 그 결정을 묻는 자리가
umm:offline-conflict한 번뿐이고 그것을 듣는 곳은 열어 둔 공간의 캔버스뿐이었습니다. flush는 배너에서 어느 화면·어느 공간에 대해서든 돌기 때문에, 캔버스가 닫혀 있거나 다른 공간을 보고 있거나 대화상자를 Esc로 닫으면 그 변경은 영원히 큐에 앉아1개 변경이 연결을 기다리는 중배너와 아무 일도 하지 않는지금 동기화버튼만 남았습니다.raisedConflicts를 Set→Map으로 바꿔 이벤트째 보관하고replayOfflineConflicts()(요청 없이 이벤트만 재발생)·offlineConflictCount()를 추가했으며, 공간을 열 때와 배너의 새겹침 확인버튼에서 다시 묻게 했습니다. 결정 중에는 두 번째 충돌이 병합칸을 덮지 않도록decidingRef로 막았고, 배너는 결정 대기와 연결 대기를 다른 문장으로 말하며 보낼 것이 있을 때만지금 동기화를 보여 줍니다. 검증: 새 vitest 4개(api 1 + OfflineStatus.test.tsx 3) 중 3개가 옛 동작으로 되돌리면 실패함을 확인,go vet ./...·go test ./...· tsc · oxlint/Prettier · i18n 950키 · vitest 144개 ·scripts/check-version.sh통과. v0.66.3으로 릴리스 커밋(c1e027f). - 보류 아이디어:
README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.66.3)와 어긋남 (가치 2 / 위험 1 / S)WriteSource는 제목이 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어 출처 매핑이 밀림(현재는 도달 불가이나 두 곳의 규칙이 다름) (가치 3 / 위험 2 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 (가치 2 / 위험 2 / M)- 401/403으로 막힌 flush는 큐 전체를 세우는데 배너는 그 이유를 말하지 않음 — 세션 만료를 연결 대기로 보여 줌 (가치 3 / 위험 2 / M)
- 릴리즈: v0.66.3 (2026-09-03)
- 릴리즈: v0.66.3 (2026-09-03)
2026-09-03 (3)
- 선택: 끝난 로그인을 느린 네트워크라고 부르던 배너 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: 탭을 열어 둔 채 세션이 만료되면 flush가 첫 401에서 큐 전체를 세우는데(뒤의 변경도 같은 쿠키를 같은 서버로 가져가니 옳은 판단), 아무 신호도 남기지 않아 배너는
N개 변경이 연결을 기다리는 중이라고 말하고지금 동기화는 눌러도 같은 401만 받는 상태가 영원히 이어졌습니다. 재시도 타이머도 걸리지 않아 사람이 다시 로그인해야 한다는 것을 알 길이 전혀 없었습니다.offlineBlockReason()(401→signed-out, 403→refused, flush마다 새로 정함)을 추가하고 각각 알림을 띄우며, 배너는 두 상태를 다른 문장으로 말하고다시 로그인(useAuth의 refresh로 세션 재확인 → 정말 끝났으면 로그인 화면, 로그인하면 배너가 다시 떠 큐가 자동 전송) /다시 시도버튼을 내놓고 막힌 큐에는지금 동기화를 감춥니다. 배너가umm:offline-sync도 듣게 해 재시도 타이머·다른 화면의 flush 판정도 보이게 했습니다. 검증: 새 시험 4개(api 2 + OfflineStatus 2) 추가 후 옛 동작으로 되돌리면 4개 전부 실패함을 확인,go vet ./...·go test ./...· tsc · oxlint/Prettier · i18n 975키 · vitest 156개 ·scripts/check-version.sh통과. v0.67.1로 릴리스 커밋(cbe2fab). - 보류 아이디어:
- 401/403이 큐 전체를 세우는데, 403은 한 변경에 대한 권한 거부일 수 있어 무관한 변경까지 붙잡음 — terminal 판정을 넓힐지 검토 (가치 3 / 위험 3 / M)
WriteSource는 제목이 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어 출처 매핑이 밀림(현재는 도달 불가이나 두 곳의 규칙이 다름) (가치 3 / 위험 2 / S)README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.67.1)와 어긋남 (가치 2 / 위험 1 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 (가치 2 / 위험 2 / M)
- 릴리즈: v0.67.1 (2026-09-03)
- 릴리즈: v0.67.1 (2026-09-03)
2026-09-04
- 선택: 덱에 남지 않은 제목까지 세던
NamedHeadings(가치 3 / 위험 1 / 작업량 S) - 결과: 성공
- 요약: umm은 “덱의 어디까지가 당신 것이 아닌지”를 두 숫자로만 말합니다 —
묶음 제목 N개를 AI가 지었습니다와AI가 N개 부로 나눴습니다. 부 나누기와 분량 제한을 같이 켜면 완성된 덱에 분량이 한 번 더 적용되는데, v0.65.1은 그 2차 자르기가 부 제목을 잘라 낸다는 것만 보고Sections를parts()로 다시 세게 했고 같은 자르기가 모델이 이름 붙인 슬라이드도 잘라 낸다는 것은 놓쳤습니다.NamedHeadings는 모델이 대답한 직후 한 번 정해진 뒤 아무도 다시 세지 않아, 묶음 16개·분량 15장·부 3개에서 덱에 12개만 남았는데도 화면은 15개라고 말했습니다(본문은 읽어 보면 자기 문장인지 알 수 있지만 제목이 자기 것인지는 세어 보는 방법밖에 없어, 이 숫자만은 틀리면 확인 창구가 없습니다).Storyline.named()를 추가해 2차fit뒤Sections와 함께 끝난 덱에서 다시 세게 했고(자르기가 스스로 깎지 않는 이유는 자기가 버린 슬라이드 중 어느 것이 모델의 손을 거쳤는지 모르기 때문), 두 필드 주석을 “제안된 수가 아니라 건네진 덱에 든 수”로 고쳤습니다. 검증: 새 시험 1개 추가 후story.named()호출을 지우면the deck says a model named 15 headings and holds 12로 실패함을 확인,go vet ./...·go test ./...· gofmt · tsc · oxlint/Prettier · i18n 975키 · vitest 156개 ·scripts/check-version.sh통과. v0.67.2로 릴리스 커밋(483420c). - 보류 아이디어:
WriteSource는 제목이 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어 출처 매핑이 밀림 — 두 곳이 같은 규칙(sourceTitle())을 쓰게 하기 (가치 3 / 위험 2 / S)- 401/403이 큐 전체를 세우는데, 403은 한 변경에 대한 권한 거부일 수 있어 무관한 변경까지 붙잡음 (가치 3 / 위험 3 / M)
README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.67.2)와 어긋남 (가치 2 / 위험 1 / S)usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)PresentationModal이 분량 안에서 부 제목이 차지한 칸 수를 말하지 않음 (가치 2 / 위험 2 / M)
- 릴리즈: v0.67.2 (2026-09-04)
- 릴리즈: v0.67.2 (2026-09-04)
2026-09-04 (2)
- 선택: 이름이 길다는 이유로 거절당한 사진 (가치 4 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: v0.71.0 첨부에서 파일 이름은 아무것도 결정하지 않는 “딱지”인데,
safeFilename이 그 딱지를cleaned[:120]바이트 자르기로 줄이고 있었습니다. ASCII는 늘 글자 경계에 떨어져 아무 일도 없지만 한글은 3바이트라 120번째 바이트가 글자 한복판이면 결과가 더 이상 UTF-8이 아니고, PostgreSQLtext가 INSERT를 통째로 거절해 규칙을 하나도 어기지 않은 사진이 500 “그림을 저장하지 못했습니다”로 사라졌습니다(실제 PostgreSQL에서invalid byte sequence for encoding "UTF8": 0xeb재현). 저장소에 이미 있던textutil.LimitUTF8Bytes(주석에 “PostgreSQL 경계를 넘는 문자열용”이라 적혀 있고 Ptium·웹훅·User-Agent가 이미 지남)를 쓰게 해 글자 경계에서 자르도록 고쳤고(상한 120바이트는 그대로라 ASCII 동작은 불변), 같은 함수에서 빈 업로드를 “너무 큽니다”(413, 5MB 안내)로 답하던 것을 종류 판별로 내려보내 “PNG·JPEG·GIF·WebP만”이라고 답하게 했습니다. 검증: 새 시험 3개(단위 1 + 통합 2) 추가 후 옛 동작으로 되돌리면 3개 전부 실패함을 확인, 실제 PostgreSQL(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 992키 · vitest 156개 ·scripts/check-version.sh통과. v0.71.1로 릴리스 커밋(1daf7dd). - 보류 아이디어:
WriteSource는 제목·리드가 모두 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세어 출처 매핑이 밀림 — 덧붙여SlideSources는 표지 판정에s.Title != "",WriteSource는TrimSpace(...) != ""를 써 공백뿐인 제목에서 한 칸 어긋남 (가치 3 / 위험 2 / S)- 401/403이 오프라인 큐 전체를 세우는데, 403은 한 변경에 대한 권한 거부일 수 있어 무관한 변경까지 붙잡음 (가치 3 / 위험 3 / M)
README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.71.1)와 어긋남 (가치 2 / 위험 1 / S)- 첨부는 내보내기(
Markdown백업)에 담기지 않는데, 그 사실이 릴리스 노트에만 있고 내보내기 화면에는 없음 — 복원한 사람이 그림이 사라진 것을 나중에 발견 (가치 3 / 위험 1 / S) usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음 — 같은 이름의 부가 두 번 열림 (가치 2 / 위험 1 / S)
- 릴리즈: v0.71.1 (2026-09-04)
- 릴리즈: v0.71.1 (2026-09-04)
2026-09-05
- 선택: 6월의 캔버스에 걸려 있던 8월의 사진 (가치 3 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: v0.70.0의 되감기는 생각과 연결만 스냅샷으로 바꿔치우고, 캔버스의 그림 목록은 언제나
GET /spaces/{id}/attachments(=지금의 목록)에서 와서 그 시점 이후에 붙인 사진이 과거의 캔버스에 그대로 걸려 있었습니다. 다른 무엇보다 그림에서 나쁜 결함인 이유는, 오늘의 문장은 읽으면 알아채지만 사진은 언제 붙었는지 들여다봐도 알 수 없기 때문입니다.SpaceAt이 그 시점까지의 첨부를attachments로 함께 돌려주게 하고rewindTo가 그것을 쓰게 했으며(지금으로는 오늘 목록을 다시 받음), 그때 있었지만 지금은 그릴 수 없는 그림 — 그 뒤 지워진 생각에 붙어 있던 것, 바이트는 지워지지 않은 생각에 대해서만 내어 줌 — 은 지워진 연결과 같은 방식으로removedAttachments로 세어 배너에서 말하게 했습니다(사람이 직접 뗀 그림은 행이 없어 셀 수 없음, 주석에 명시). 검증: 새 통합 시험 2개 추가 후 날짜 필터/카운트를 무력화하면 둘 다 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. v0.71.2로 릴리스 커밋(3c52127). - 보류 아이디어:
- Markdown 백업에 그림이 담기지 않는 사실이 v0.71.0 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 — 백업으로 되돌린 뒤에야 발견 (가치 3 / 위험 1 / S)
WriteSource는 제목·리드가 모두 빈 슬라이드를 건너뛰는데SlideSources는 그 자리를 세고, 표지 판정도TrimSpace유무로 갈려 출처 매핑이 한 칸 밀림(현재는 도달 불가이나 두 곳의 규칙이 다름) (가치 3 / 위험 2 / S)- 401/403이 오프라인 큐 전체를 세우는데, 403은 한 변경에 대한 권한 거부일 수 있어 무관한 변경까지 붙잡음 (가치 3 / 위험 3 / M)
- 되감은 채로 공간을 바꾸면
rewind상태가 남아 배너와 읽기 전용이 새 공간에 그대로 이어짐 (가치 2 / 위험 2 / S) README.md상단 릴리스 소개가 v0.44.0, 배지가 v0.22.0,docs/README.md문서 허브가 v0.8.1 — 셋 다 실제(v0.71.2)와 어긋남 (가치 2 / 위험 1 / S)
- 릴리즈: v0.71.2 (2026-09-05)
- 릴리즈: v0.71.2 (2026-09-05)
2026-09-06
- 선택: 남의 지난주가 따라 들어온 공간 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: 되감기(v0.70.0)는 캔버스를 잠그는데, 공간 전환기는 같은 화면을 그대로 둔 채 주소(
params.spaceId)만 바꾸므로rewind상태가 다음 공간까지 따라갔습니다 — 오늘 불러온 캔버스 위에 지난주 날짜 배너가 붙고, 그 공간과 무관한 이유로 읽기 전용이 되고, 이벤트 스트림이rewindRef.current가 있으면 변경을 무시하므로 같이 쓰는 사람의 작업이 영영 나타나지 않았습니다(주소창 입력·새로고침은 화면을 새로 만들어 증상이 없어, 앱 안에서 고르는 흔한 길에서만 났습니다). 이미 같은 effect가 열림 시야를 물려받지 않는 것과 같은 자리에서setRewind(undefined)를 하도록 고쳤습니다. 검증: 새 Playwright e2e 1개 추가 후 그 한 줄을 지우면Received: 1(배너가 남음)로 실패함을 확인했고, 실패한 4개 중 3개는 재실행 시 통과(헤드리스 크로뮴 SEGV), 남은 오프라인 큐 시험 1개는 손대지 않은 HEAD 빌드에서도 똑같이 실패하는 기존/환경 문제임을 확인했습니다. 실제 PostgreSQL 17(도커umm-test-pg)에 대한go test -p 1 ./...전체 통과 ·go vet· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. v0.71.3으로 릴리스 커밋. - 보류 아이디어: Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide 어디에도 없음 /
WriteSource와SlideSources가 빈 슬라이드·표지 판정 규칙이 달라 출처 매핑이 한 칸 밀릴 수 있음 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 /README.md배지·소개와docs/README.md허브의 버전이 실제(v0.71.3)와 어긋남 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않음
2026-09-06
- 선택: 공백 한 칸으로 지어진 제목 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: 발표 제목은 비워 두면 공간의 이름이 덱 이름과 표지가 되는데,
compile()이 “비어 있다”를req.Title == ""로만 셌습니다 — 공백 한 칸(?title=%20,{"title":" "})이 오면 제목으로 받아들여져 공간의 이름은 쓰이지 않고 덱은 Ptium에서 이름 없이 서고 표지도 나오지 않았습니다(Compile이 제목을 트림하므로 표지만 사라지고 아무도 고른 적 없는 결과가 남습니다).strings.TrimSpace뒤에 빈칸 여부를 보게 고쳤습니다. 함께, “어느 장이 덱에 실리는가”를WriteSource·WriteOutline·SlideSources가 각자 답하던 것을Storyline.coverTitle()·Slide.heading()둘로 모았습니다 — 앞의 둘은 제목을 트림해 보고 제목·리드가 모두 빈 장을 건너뛰는데SlideSources는 둘 다 하지 않고 자리를 세어, 슬라이드에서 자기 생각으로 돌아가는 유일한 길인 번호가 밀릴 수 있었습니다(쓰이지 않은 장에는 이제 번호를 주지 않고, 그 장의 생각은 가리킬 슬라이드가 없으므로 출처에서 뺍니다). 검증: 새 시험 3개 추가 후 옛 동작으로 되돌리면 셋 다 실패함을 확인(points at slide 3 of 2,points at slide 4 of 3,the talk is titled ""), 실제 PostgreSQL 17(도커umm-test-pg)에 대한go test -p 1 ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. v0.71.4로 릴리스 커밋(d0351b3, 같은 날 다른 브랜치가 v0.71.3을 이미 썼으므로 번호를 비켜 씀). - 보류 아이디어: Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 /
README.md배지·소개와docs/README.md허브의 버전이 실제(v0.71.4)와 어긋남 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림 / 분량 캡(fit)과sectionDeck이len(story.Slides)로 세어 쓰이지 않는 장까지 한 장으로 침
2026-09-07
- 선택: 자기 글씨 때문에 조각난 생각 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: Markdown 내보내기는 백업이고 v0.65.0부터 umm이 그 파일을 자기 파일로 읽는데, 절을 나누는 규칙이 일반 문서용 그대로였습니다 — 제목마다, 가로선마다 자름. 내보내기 안에서 그 표시는 대개 누군가 붙여 넣은 본문의 일부(
### 배경, 문단 사이---)라, 생각 하나가 여러 조각으로 쪼개지고 메타데이터 목록을 가진 것은 마지막 조각뿐이었습니다. 나머지는 id·좌표·색·갈래 없이 돌아왔고, 연결은 id로 적혀 있으므로 그 조각에 그어져 있던 선은 다시 그을 대상을 잃었습니다. 배너를 본 지점부터는 내보내기가 실제로 쓰는 두 표시(##, 배너를 이고 오는#)에서만 자르게 했고(위에 이미 타이핑한 글은 원래대로 읽으므로 “생각 적고 파일 붙이기” 순서와 파일 두 개 잇기는 그대로), 같은 성질의 두 번째 결함 — 메타데이터를 절 전체에서 찾아 첫 일치가 이기는 바람에 본문의- id: \ours-2024-11`이 그 생각의 id가 되던 것 — 을 절 꼬리에서만 읽도록 고쳤습니다. 내보내기 형식은 그대로라 이미 받아 둔 백업 파일에도 적용됩니다. 검증: 새 시험 4개 추가 후 절 나누기를 되돌리면 2개, 메타데이터 자리를 되돌리면 1개가 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg)에 대한go test -p 1 ./…전체 통과 ·go vet ./…· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 160개 ·scripts/check-version.sh통과. 곁들여 루트node_modules/가 .gitignore에 없어npm –prefix web test`가 남기는 vite 캐시가 커밋 후보로 올라오던 것도 고쳤습니다. v0.71.5로 릴리스 커밋(147bcf8, 다른 브랜치가 v0.71.3·v0.71.4를 이미 썼으므로 번호를 비켜 씀). - 보류 아이디어: 내보내기 본문에
##로 시작하는 줄이 있으면 여전히 거기서 잘림 — 남은 한 자리는 이스케이프 없이는 생각 경계와 구별 불가 / 내보내기가Content-Disposition파일 이름에 공간 이름을 그대로 넣어"가 헤더를 깨고 한글이 RFC 6266 없이 나감 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 /README.md배지·소개와docs/README.md허브의 버전이 실제와 어긋남
2026-09-08
- 선택: 이름 지은 사람이 남의 내려받기 이름을 정하던 헤더 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: Markdown 내보내기는 백업이고, 그 파일의 이름은 공간의 이름 — 즉 사람이 쓴 말 — 에서 나오는데
filename="umm-%s.md"한 줄에 그대로 들어갔습니다."는 인용부호를 먼저 닫아 나머지를 헤더 문법으로 만들고(mime.ParseMediaType이invalid media parameter로 거절 — 공유 공간이면 이름을 지은 사람이 남의 백업 파일 이름을 흔듭니다), 한글은 RFC 6266 없이 원시 바이트로 나가 클라이언트마다 다른 인코딩으로 짐작했습니다. 웹 캔버스는anchor.download로 스스로 이름을 붙이므로 이것만이 유일한 이름인 쪽 — 백업 스크립트·curl -OJ같은 API 클라이언트 — 에만 보이던 결함입니다.attachmentDisposition을 새로 두어filename*=UTF-8''로 진짜 이름을 퍼센트 인코딩해 싣고 따옴표 안filename은 ASCII 대체 이름으로 남겼으며(못 쓰는 글자의 연속은 대시 하나로 줄여 말이 있던 자리를 보이게), 지우는 글자는store.safeFilename과 같게(한 화면의 딱지가 디스크에 쓰이는 순간 경로가 되므로) 길이도 같은 120바이트를LimitUTF8Bytes로 글자 경계에서 끊게 했습니다. 검증: 새 시험 3개(단위 2 + 통합 1) 추가 후 옛 헤더 형식으로 되돌리면 통합 시험이the download name is not a readable header: mime: invalid media parameter로 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test -p 1 ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. 버전은 올리지 않았습니다(릴리스는 별도 세션). -
보류 아이디어: 내보내기 본문에
##로 시작하는 줄이 있으면 여전히 거기서 잘림 — 이스케이프 없이는 생각 경계와 구별 불가 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 /README.md배지·소개와docs/README.md허브의 버전이 실제와 어긋나고 check-version.sh가 그 자리를 보지 않음 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림 - 릴리즈: v0.71.3 (2026-09-08, run 2026-09-08-221101-umm-improve)
2026-09-09
- 선택: uuid라는 이름으로 저장되던 사진 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: 첨부는
/api/v1/attachments/{uuid}에서 오는데serveAttachment가Content-Disposition: inline한 마디만 보내, 캔버스에서는 잘 그려지다가 누가 그림을 저장하는 순간b03d7110-…라는 이름으로 디스크에 앉았습니다 — 어느 회의의 화이트보드인지 알 길이 없어지는 자리로, umm은 v0.71.1부터 라벨을 지켜 왔으면서 브라우저에는 한 번도 말하지 않았습니다. 이름은 disposition이 아니라 헤더의 매개변수라 보여 주는 방식은 그대로 두고 실을 수 있으므로inline을 유지한 채(캔버스가<img>로 그리므로 attachment로 바꾸면 그림 자리에 내려받기가 옵니다) 지난 회차의attachmentDisposition을inlineDisposition과 함께 쓰도록 나누고, ASCII 대체 이름만 호출자가 정하게 했습니다(umm-space↔umm-picture). 확장자는 라벨이 정할 몫이 아니어서 — 이 파일 전체가 업로드의 말을 믿지 않는다는 규칙 위에 서 있으므로 — 바이트로 판정한 형식의 끝을 붙이되(diagram.svg+ PNG 바이트 →diagram.svg.png) 이미 맞게 끝나는 라벨은 쓰인 대로 두고(사진.JPEG), 점이 든 이름은 확장자로 오해하지 않게 했습니다(2026.09.09 회의→.09 회의를 잘라 내지 않음). 검증: 새 시험 3개(단위 2 + 통합 1) 추가 후 옛"inline"한 줄로 되돌리면 통합 시험이filename = "", want the label with the format umm read ("inline")로 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test -p 1 ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. 버전은 올리지 않았습니다(릴리스는 별도 세션). -
보류 아이디어: 내보내기 본문에
##로 시작하는 줄이 있으면 여전히 거기서 잘림 — 이스케이프 없이는 생각 경계와 구별 불가 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 / 업로드 라벨에 든 경로가safeFilename에서 구분자만 지워져C:\a\b.png가Cab.png로 붙음 — 마지막 조각만 취해야 하고, 이제 그 라벨이 내려받기 이름이라 더 눈에 띔 / 본문 마지막 줄이- id: \x`` 이면 v0.71.5의 꼬리 규칙에서도 그 생각의 id로 읽힘 — 내보내기에 본문과 메타데이터의 경계가 없음 - 릴리즈: v0.71.4 (2026-09-09, run 2026-09-09-030104-umm-improve)
2026-09-09
- 선택: 이름 속 줄바꿈 하나에 통째로 날아가던 백업 (가치 3 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: Markdown 내보내기는 백업이고 umm이 자기 파일을 읽어 들이는데, 사람이 쓴 말을 “줄에서 끝나는” 자리에 그대로 씁니다 — 공간 이름은 배너 제목(
#), 생각 제목은##, 갈래는 목록 항목. 그런데 들어오는 쪽에서 줄바꿈을 막는 곳이 없어(공간 이름은 트림과 글자 수만, 제목은 온 대로 저장, 웹은<input>이라 우연히 한 줄일 뿐 — API·MCP는 무엇이든 씀)우리 팀\n회고같은 이름이면 배너 절의 본문이회고로 시작해 버리고, 가져오기는 “배너가 절의 본문 전부”일 때만 그 파일을 umm의 것으로 인정하므로 선언을 놓치고 전체를 남의 Markdown으로 읽었습니다 — id·좌표·색·갈래·연결이 모두 사라지고 제목 없는 생각은 전부 “Thought”가 됨(vitest로 실제 확인: 두 줄 이름이면isExport:false에sourceId전부 undefined, 한 줄이면 복원됨). 제목 속 줄바꿈은 생각 하나를 둘로 열고, 갈래 이름 속 줄바꿈은- line:키와Lines of thinking항목을 한 줄씩 읽는 가져오기에서 사라집니다. 연결 Reason이 이미 하던 처리(\n→공백)를oneLine하나로 모아 이 자리들에 적용했습니다 — 형식은 그대로라 이미 받아 둔 백업 파일도 그대로 읽힙니다. 검증: 새 시험 2개(단위 1 + 통합 1) 추가 후 helper를 무력화하면 통합 시험이 배너 제목·생각 제목·갈래 두 줄에서 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test -p 1 ./...전체 통과 ·go vet ./...· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 156개 ·scripts/check-version.sh통과. 버전은 올리지 않았습니다(릴리스는 별도 세션). -
보류 아이디어: 업로드 라벨에 든 경로가
safeFilename에서 구분자만 지워져C:\a\b.png가Cab.png로 붙음 — 마지막 조각만 취해야 하고 이제 그 라벨이 내려받기 이름이라 더 눈에 띔 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림 / 401·403이 오프라인 큐 전체를 세우는데 403은 한 변경에 대한 거부일 수 있음 /exportOutline의 내려받기 이름이 언제나umm-outline.md라 여러 공간의 개요를 받으면 어느 것이 어느 공간인지 알 수 없음 - 릴리즈: v0.71.5 (2026-09-09, run 2026-09-09-123112-umm-improve)
2026-09-10
- 선택: 내보내기가 쓰는 이름을 자기 생각에 붙인 사람 (가치 4 / 위험 1 / 작업량 S)
- 결과: 성공
- 요약: Markdown 내보내기는 백업이고 끝에
## Connections·## Lines of thinking두 절을 붙이는데, 가져오기가 그 둘을 제목만 보고 알아봤습니다. 그런데 “Connections”는 생각에 붙이기 아주 흔한 제목이고(가져오기 자신의 주석도 “an ordinary thing to title a thought”라고 적어 둠), umm의 파일 안에서는 제목만으로 사람의 생각과 내보내기의 목록을 구별할 수 없습니다. 목록으로 읽힌 그 절은 산문에서 연결을 하나도 뽑지 못한 채 통째로 버려져 생각이 복원에서 사라졌고,- id:도 등록되지 않으므로 그 생각으로 그어져 있던 연결은 답할 생각이 없는 id를 가리키게 되어 함께 사라졌습니다 — 사람이 가장 다시 쓸 법한 제목 하나가 가장 비싼 값을 치르던 자리입니다. 내보내기는 이미 그 차이를 적어 두고 있어서(생각 절은 언제나 id·type·source·color·canvas 메타데이터로 끝나고, 닫는 두 절은 결코 그렇지 않음 — 마지막 줄이 연결이거나 갈래) 절 꼬리로 판정하게 했습니다. v0.71.5가 메타데이터를 읽는 그 꼬리와 같은 자리라 형식은 그대로이고, 이미 받아 둔 백업 파일도 그대로 복원됩니다. 검증: 새 vitest 2개 추가 후 옛 판정(return exportSections.has(title))으로 되돌리면 둘 다 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test -p 1 ./...전체 통과 ·go vet ./...· tsc · oxlint/Prettier · i18n 994키 · vitest 158개 ·scripts/check-version.sh통과. 버전은 올리지 않았습니다(릴리스는 별도 세션). - 보류 아이디어: 재시도 초안(
formatImportedThoughts)은 메타데이터가 하나도 없는 생각에## Connections제목을 그대로 써서 같은 결함이 한 발짝 옆에 남음 — 붙여넣기 혼합 + 일부 실패에서만 닿음 / 업로드 라벨에 든 경로가safeFilename에서 구분자만 지워져C:\a\b.png가Cab.png로 붙음 — 마지막 조각만 취해야 함 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림 /exportOutline의 내려받기 이름이 언제나umm-outline.md라 여러 공간의 개요를 받으면 구분할 수 없음
2026-09-10
- 선택: 자기 글씨 때문에 조각난 생각 — main에 없던 자리 (가치 4 / 위험 2 / 작업량 M)
- 결과: 성공
- 요약: 보류 목록이 적어 둔 대로, 2026-09-07 회차가 고쳤던 “내보내기 인식형 절 나누기”가
main에 없었습니다(그 브랜치auto/2026-09-07-0410은 머지되지 않았고web/src/lib/markdown-import.ts는 여전히 일반 문서 규칙으로 자르고 있었음 — 확인:git log main..auto/2026-09-07-0410). 그래서 Markdown 백업을 되돌릴 때 본문에 붙여 넣은### 배경이나 문단 사이---이 있으면 생각 하나가 여러 조각으로 쪼개지고 메타데이터 목록은 마지막 조각만 가져 나머지는 id·좌표·색·갈래 없이 돌아왔고, 그 조각을 가리키던 연결은 답할 생각이 없는 id를 가리켜 함께 사라졌습니다. 배너를 본 지점부터는 내보내기가 실제로 쓰는 두 표시(##, 배너를 이고 오는#)에서만 자르게 하고(배너 위에 타이핑한 글은 원래대로 읽으므로 “생각 적고 파일 붙이기”와 파일 두 개 잇기는 그대로 — 둘째 파일은 가로선이 아니라 자기 배너로 찾음), 메타데이터를 절 전체 검색이 아니라 절 꼬리에서만 읽게 했습니다(본문의- id: \ours-2024-11`이 첫 일치로 이겨 그 생각의 id가 되던 두 번째 결함). v0.71.6이 넣은describesTheSpace(제목이 아니라 꼬리로 닫는 절을 판정)와 같은 꼬리 규칙 위에 얹었고, 내보내기 형식은 그대로라 이미 받아 둔 백업 파일도 그대로 복원됩니다. 검증: 새 vitest 4개 추가 후 절 나누기를 되돌리면 2개, 메타데이터 자리를 되돌리면 1개가 실패함을 확인, 실제 PostgreSQL 17(도커umm-test-pg, DSNpostgres://umm:umm@127.0.0.1:15433/umm)에 대한go test -p 1 ./…전체 통과 ·go vet ./…· gofmt · tsc · oxlint/Prettier · i18n 994키 · vitest 162개 ·scripts/check-version.sh` 통과. 버전은 올리지 않았습니다(릴리스는 별도 세션). - 보류 아이디어: 머지되지 않은 회차의 다른 두 고침도
main에 없음 — 되감은 채 공간을 바꾸면rewind가 따라가 협업자의 변경이 영영 안 보임(auto/2026-09-06-19xx), 그리고 발표 제목이 공백 한 칸이면 공간 이름도 표지도 잃음 +SlideSources한 칸 밀림(auto/2026-09-08-0151) / 업로드 라벨에 든 경로가safeFilename에서 구분자만 지워져C:\a\b.png가Cab.png로 붙음 — 마지막 조각만 취해야 함 / Markdown 백업에 그림이 담기지 않는 사실이 릴리스 노트에만 있고 내보내기 메뉴·user-guide·features.md 어디에도 없음 /exportOutline의 내려받기 이름이 언제나umm-outline.md라 여러 공간의 개요를 받으면 구분할 수 없음 /usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림
2026-09-11
- 선택: 사용자·관리자 가이드를 실제 화면 캡처가 든 완성본으로 (캠페인 guides-2026-09) (가치 4 / 위험 1 / 작업량 M)
- 결과: 성공
- 요약:
docs/user-guide.md·docs/admin-guide.md는 있었지만 화면은 2026-08-21 v0.6.0 캡처 23장뿐이었고 구조도 표준과 달랐습니다.GUIDE-STANDARD.md대로docs/USER_GUIDE.md(제품이 하는 일 → 처음 5분 → 화면별 사용법 → 자주 하는 작업 → 막혔을 때(실제 오류 문구) → 용어)와docs/ADMIN_GUIDE.md(구성 요소 → 릴리즈 자산으로 설치 →internal/config/config.go에서 읽은 환경 변수 전수 표 → 역할 → 운영(상태 점검 엔드포인트는server.go라우트 등록에서 메서드 확인) → 로그에 실제로 찍히는 문구로 장애 대응 → 보안, 기존 상세는 부록)로 다시 쓰고, v0.71.6 바이너리를 빌드해umm-test-pg의 임시 DBumm_guide위에 띄운 뒤 헤드리스 크로뮴 1440x900으로 27장을 새로 찍어 기존 폴더docs/screenshots/에 넣었습니다(가짜 데이터데모 회사 …, 옛 캡처 삭제).scripts/capture_all.js는 비밀번호가 글자로 박혀 있고 Dream 화면을page.route로 가짜 응답으로 찍던 것을 — 캡처 전용 환경 변수UMM_CAPTURE_BASE_URL/ADMIN/ADMIN_PASSWORD필수, 루프백 아니면UMM_CAPTURE_ALLOW_REMOTE=1없이는 중단, 모킹 없음, 관리자 화면은 열기만 하고 저장하지 않음 — 으로 고쳤습니다. PDF는 공용md2pdf.mjs로 만들어(USER_GUIDE.pdf19쪽·그림 14,ADMIN_GUIDE.pdf30쪽·그림 13) PyMuPDF로 표지·표·그림을 렌더해 확인했고, 옛umm_user_guide.pdf·umm_admin_guide.pdf(docs/·docs/pdf/)는 지우고 README·docs/README.md(문서 기준 v0.8.1 → v0.71.6)·docs/index.html·compose.yaml·generate_pdf.js의 링크를 새 문서로 옮겨 정본을 하나로 했습니다. AI Gateway가 없어 Dream 후보가 있는 화면은 못 찍었고 그 사실을 문서에 적었습니다. 검증: 참조한 27개 그림 모두 존재,scripts/check-version.sh통과,node --check두 스크립트 통과, 스크립트에 비밀값 없음, 앱 종료·임시 DB 삭제·dist/제거 후 커밋(d157dc8). Go/웹 코드는 건드리지 않았습니다. 버전은 올리지 않았습니다(릴리스는 별도 세션). -
보류 아이디어:
usableSections가 서로 다른 부에 같은 제목이 오는 제안을 막지 않아 같은 이름의 부가 두 번 열림 / 업로드 라벨에 든 경로가safeFilename에서 구분자만 지워져C:\a\b.png가Cab.png로 붙음 — 마지막 조각만 취해야 함 /exportOutline의 내려받기 이름이 언제나umm-outline.md라 여러 공간의 개요를 받으면 구분할 수 없음 / 캡처 스크립트의 승인 요청 시드가 400으로 거절되어 검토·승인 화면이 빈 상태로 찍힘 —createApproval이 받는 body 형식에 맞추면 항목이 있는 화면을 실을 수 있음 /docs/features.md·umm_features_guide.pdf·umm_complete_manual.pdf가 여전히 v0.6.0 캡처를 담고 있어 새 가이드와 어긋남 — 대체 표시 또는 재생성 - 릴리즈: v0.71.7 (2026-09-11, run 2026-09-11-173844-umm-approve)