{
 "generated": "2026-09-12T20:59:55+09:00",
 "site": "https://hkjang.github.io/aidev",
 "description": "Claude Code 자율 개선 에이전트가 hkjang 의 프로젝트를 개선·테스트·머지·릴리즈한 일일 보고. 오늘 45회차·릴리즈 8건, 누적 667회차·릴리즈 280건, 주의 필요 14건.",
 "today": {
  "date": "2026-09-12",
  "total": 45,
  "projects": 20,
  "released": 8,
  "merged": 1,
  "nochange": 0,
  "failed": 6,
  "cost_usd": 286.03,
  "minutes": 671,
  "sessions": 68
 },
 "totals": {
  "runs": 667,
  "released": 280,
  "days": 11,
  "cost_usd": 1911.16,
  "minutes": 4889,
  "tokens_in": 1960456705,
  "tokens_out": 15447679
 },
 "alerts": [
  {
   "date": "2026-09-12",
   "time": "00:20",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/4"
  },
  {
   "date": "2026-09-12",
   "time": "01:21",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/5"
  },
  {
   "date": "2026-09-12",
   "time": "02:10",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/6"
  },
  {
   "date": "2026-09-12",
   "time": "03:01",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/7"
  },
  {
   "date": "2026-09-12",
   "time": "03:48",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/8"
  },
  {
   "date": "2026-09-12",
   "time": "04:32",
   "project": "Momento",
   "why": "보호 파일 변경 — 자동 머지 안 함, 사람 검토 필요",
   "result": "guarded files, PR open https://github.com/hkjang/Momento/pull/9"
  },
  {
   "date": "2026-09-12",
   "time": "11:20",
   "project": "Kkiit",
   "why": "보호 파일 변경 — 자동 머지 안 함, 사람 검토 필요",
   "result": "guarded files, PR open https://github.com/hkjang/Kkiit/pull/2"
  },
  {
   "date": "2026-09-12",
   "time": "12:04",
   "project": "ReSSO",
   "why": "보호 파일 변경 — 자동 머지 안 함, 사람 검토 필요",
   "result": "guarded files, PR open https://github.com/hkjang/ReSSO/pull/19"
  },
  {
   "date": "2026-09-12",
   "time": "12:37",
   "project": "SecCheck",
   "why": "보호 파일 변경 — 자동 머지 안 함, 사람 검토 필요",
   "result": "guarded files, PR open https://github.com/hkjang/SecCheck/pull/2"
  },
  {
   "date": "2026-09-12",
   "time": "13:09",
   "project": "Vendra",
   "why": "보호 파일 변경 — 자동 머지 안 함, 사람 검토 필요",
   "result": "guarded files, PR open https://github.com/hkjang/Vendra/pull/120"
  },
  {
   "date": "2026-09-12",
   "time": "19:44",
   "project": "moina",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/moina/pull/19"
  },
  {
   "date": "2026-09-11",
   "time": "19:35",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/1"
  },
  {
   "date": "2026-09-11",
   "time": "22:09",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/2"
  },
  {
   "date": "2026-09-11",
   "time": "23:45",
   "project": "Momento",
   "why": "CI 실패로 PR 미머지",
   "result": "CI failed, PR open https://github.com/hkjang/Momento/pull/3"
  }
 ],
 "fix_queue": [],
 "health": {
  "checked": "2026-09-12T20:45:05+09:00",
  "last_run": "2026-09-12T20:18:36+09:00",
  "seconds_since_last": 1585,
  "runner_pid": "2235010",
  "runner_age_seconds": 1644,
  "scheduler_status": "실행 중",
  "scheduler_next_run": "2026-09-12 오후 8:50:00",
  "disk_percent": 71,
  "ok": true,
  "problems": [],
  "actions": []
 },
 "lessons": [
  {
   "ts": "2026-09-06T19:02:09+09:00",
   "date": "2026-09-06",
   "project": "relio",
   "kind": "release-workflow-failed",
   "pr": "v1.11.18",
   "detail": "릴리즈 워크플로가 2회 실패(Verify upgrade from previous release). 릴리즈 관련 검증은 머지 전에 로컬에서 재현할 것."
  },
  {
   "ts": "2026-09-06T19:19:09+09:00",
   "date": "2026-09-06",
   "project": "relio",
   "kind": "demoted",
   "pr": "",
   "detail": "자율화 단계 release → low-risk: 롤백 PR "
  },
  {
   "ts": "2026-09-06T19:19:09+09:00",
   "date": "2026-09-06",
   "project": "relio",
   "kind": "rolled-back",
   "pr": "",
   "detail": "머지 60601bd 이 릴리즈를 반복해서 깨뜨려 되돌림 PR 을 열었다. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-07T10:09:21+09:00",
   "date": "2026-09-07",
   "project": "Clustara",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/clustara/pull/11",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-07T10:45:10+09:00",
   "date": "2026-09-07",
   "project": "git-ctx",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/git-ctx/pull/21",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-07T10:45:12+09:00",
   "date": "2026-09-07",
   "project": "jikim",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/jikim/pull/16",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-07T10:45:15+09:00",
   "date": "2026-09-07",
   "project": "muni",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/muni/pull/9",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-07T10:45:18+09:00",
   "date": "2026-09-07",
   "project": "releasedock",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/releasedock/pull/9",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-08T00:10:08+09:00",
   "date": "2026-09-08",
   "project": "aiportal-front",
   "kind": "demoted",
   "pr": "",
   "detail": "자율화 단계 release → low-risk: 회귀(reverted) 2026-09-08T00:00:35+09:00"
  },
  {
   "ts": "2026-09-08T20:53:54+09:00",
   "date": "2026-09-08",
   "project": "AgentHub",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/AgentHub/pull/13",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-08T20:53:59+09:00",
   "date": "2026-09-08",
   "project": "ReSSO",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/ReSSO/pull/10",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-08T21:08:32+09:00",
   "date": "2026-09-08",
   "project": "appstore",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/appstore/pull/7",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-08T21:08:35+09:00",
   "date": "2026-09-08",
   "project": "git-ctx",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/git-ctx/pull/22",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-09T05:00:02+09:00",
   "date": "2026-09-09",
   "project": "AgentHub",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/AgentHub/pull/16",
   "detail": "정책 규칙의 행위자(actor)를 agent.OwnerID 로 잡았다 — 이 플랫폼의 정책 지점은 모두 작업 소유자(task.OwnerID)를 쓴다. 자격증명 조회(SCMTokenFor)만 agent.OwnerID 가 맞으므로 두 값을 분리할 것. 또한 ContentGuard 를 손으로 만들어 주입하는 테스트는 배선 결함을 못 본다 — 프로덕션 배선을 통과하는 테스트로 증명할 것. 소스 문자열 검사는 증거가 아니다."
  },
  {
   "ts": "2026-09-09T07:00:08+09:00",
   "date": "2026-09-09",
   "project": "aiportal-py",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/aiportal-py/pull/13",
   "detail": "백그라운드 task 종료 판정을 task 상태('cancelled')로 잡으면 CancelledError 를 삼키고 정상 반환하는 루프에서 cancelled()==False·exception()==None 이라 'stopped' 로 보여 정상 종료마다 오탐 ERROR 가 난다. shutdown 여부는 _shutting_down 플래그로 판정할 것. 또한 cancel() 이 곧 cancelled()==True 라고 가정하는 FakeTask 대역은 이 결함을 구조적으로 못 보므로 진짜 asyncio.Task 로 검증할 것. /health 같은 폴링 경로에서는 상태 전이 시점에만 로깅할 것."
  },
  {
   "ts": "2026-09-09T08:57:47+09:00",
   "date": "2026-09-09",
   "project": "moyro",
   "kind": "verify-false-positive",
   "detail": "webapp/tsconfig.json 에 \"types\" 가 없어 node_modules/@types/* 가 전부 스코프에 들어온다. @types/node 가 끼면 window.setInterval 이 Node 의 Timeout 반환으로 해석돼 useDraft.test.tsx:196 이 TS2345 로 깨진다. main 은 깨끗하다(clean npm ci 후 typecheck exit 0). webapp 을 건드리지 않은 Go 전용 회차도 이 오류로 폐기되므로, 이 오류가 보이면 자기 변경 탓으로 여기지 말 것."
  },
  {
   "ts": "2026-09-09T10:53:45+09:00",
   "date": "2026-09-09",
   "project": "ptium",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/ptium/pull/12",
   "detail": "docs 의 amountOf/allNumeric(분류기)과 deck 의 bareNumber(렌더러)는 서로 다른 숫자 파서다. 분류기만 넓히면 시트가 ::table 대신 ::columns 로 넘어가면서 렌더러가 같은 값을 다르게 읽어 차트가 망가진다(고정 공백 '1\\u00a0200' → 분류기 1200, 렌더러 1). 파서 한쪽만 고치지 말고 두 경로가 같은 값을 같은 숫자로 읽는지 end-to-end 로 검증할 것. 또한 pptx/blocks.go 는 math.Abs 로 높이를 잡으므로 음수 파싱을 추가해도 렌더링은 안 바뀐다 — 커밋 메시지에 실제로 일어나지 않는 사용자 가시 효과를 쓰지 말 것."
  },
  {
   "ts": "2026-09-09T11:27:46+09:00",
   "date": "2026-09-09",
   "project": "ptium",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/ptium/pull/13",
   "detail": "figures.Of 가 공백에서 숫자를 끊는 동작은 라인 차트 계열('- 전환 전 | 120, 118, 121, 119')이 의존하는 계약이다. 구분자 처리를 넓히면 값이 붙어 1.20118121119e+11 이 되고 inspect.go 의 감사 출력까지 새어 나간다. docs/deck/compile 세 곳의 숫자 파서를 통합하려 하지 말 것 — 각자 다른 계약을 지키고 있다. 분류기 쪽을 좁히는 방향으로만 고칠 것."
  },
  {
   "ts": "2026-09-09T13:24:44+09:00",
   "date": "2026-09-09",
   "project": "AgentHub",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/AgentHub/pull/18",
   "detail": "DLP 스캔 범위를 넓힐 때 두 가지를 같이 볼 것. (1) SendDecision 은 record 를 값으로 받으므로 호출자의 record.<field> 는 스크럽 이전 문자열이다 — 그 값을 recordContentScan 의 details 로 넘기면 audit_events.details 에 원문이 저장되고 AuditTrailEach 가 다시 내보낸다. 감사에는 식별자(AgentID)만 넘길 것. (2) store/provenance.go 가 Category = Agent 로 복사하므로 두 필드를 각각 스캔하면 같은 값이 두 번 보고된다. 클래스별로 병합하거나 사본으로 취급할 것 — 다만 Category 를 스캔 목록에서 빼면 원문이 스크럽되지 않고 나간다."
  },
  {
   "ts": "2026-09-10T10:20:17+09:00",
   "date": "2026-09-10",
   "project": "Vendra",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/Vendra/pull/114",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-10T10:20:25+09:00",
   "date": "2026-09-10",
   "project": "appstore",
   "kind": "rejected-by-human",
   "pr": "https://github.com/hkjang/appstore/pull/11",
   "detail": "사람이 PR 을 반려함. 같은 접근은 피할 것."
  },
  {
   "ts": "2026-09-10T12:50:05+09:00",
   "date": "2026-09-10",
   "project": "igame",
   "kind": "release-workflow-failed",
   "pr": "v0.7.9",
   "detail": "릴리즈 워크플로가 2회 실패(Audit locked Node dependencies). 릴리즈 관련 검증은 머지 전에 로컬에서 재현할 것."
  },
  {
   "ts": "2026-09-10T21:56:44+09:00",
   "date": "2026-09-10",
   "project": "AgentHub",
   "kind": "review-rejected",
   "pr": "https://github.com/hkjang/AgentHub/pull/22",
   "detail": "가이드 문서의 API 메서드를 소스에서 확인하지 않아 GET/POST 가 어긋났고, 옛 통합 가이드를 그대로 둬 정본이 둘이 됐으며, 캡처 스크립트가 전역 설정을 백업 없이 덮어썼다."
  }
 ],
 "caps": {
  "MAX_DAILY_COST": 300,
  "MAX_DAILY_ROUNDS": 100,
  "MAX_DAILY_RELEASES": 60,
  "DORMANT_AFTER": 3,
  "DORMANT_DAYS": 7
 },
 "inbox": [
  {
   "kind": "PR",
   "project": "moyro",
   "title": "auto-improve: feat: let administrators attach a visitor-tracking snippet without loosening the CSP",
   "url": "https://github.com/hkjang/moyro/pull/13",
   "sha": "2df5459",
   "summary": "25파일 +2116/−18 · review held, PR open https://github.com/hkjang/moyro/pull/13",
   "why": "review: rejected — 리뷰 거절: server/internal/tracking/tracking.go:325-337 SnippetOrigins는 strings.ToLo",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-195532-moyro-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "moina",
   "title": "auto-improve: feat: 관리자가 화면에서 방문 추적 스니펫을 붙일 수 있게 합니다",
   "url": "https://github.com/hkjang/moina/pull/19",
   "sha": "f49eb38",
   "summary": "17파일 +2095/−4 · CI failed, PR open https://github.com/hkjang/moina/pull/19",
   "why": "review: approved — 리뷰 승인 (risk=medium); ci: failed — 성공이 아닌 검사: Image and browser smoke=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-191548-moina-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "cutover",
   "title": "auto-improve: feat: 관리자가 화면에서 붙이는 방문 추적 스크립트 체계와 nonce 기반 CSP",
   "url": "https://github.com/hkjang/cutover/pull/2",
   "sha": "68c443b",
   "summary": "19파일 +2130/−6 · CI no-ci, PR open https://github.com/hkjang/cutover/pull/2",
   "why": "review: approved — 리뷰 승인 (risk=medium); ci: no-ci — 이 커밋에 검사가 없음 (정책 allow_merge_without_ci 가 없으면 차단)",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-145952-cutover-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "ai-admin",
   "title": "auto-improve: feat: 관리자가 화면에서 붙이는 방문 추적 스니펫과 nonce 기반 CSP",
   "url": "https://github.com/hkjang/ai-admin/pull/21",
   "sha": "67715bb",
   "summary": "16파일 +1699/−41 · review held, PR open https://github.com/hkjang/ai-admin/pull/21",
   "why": "review: rejected — 리뷰 거절: internal/tracking/tracking.go:270-282 SnippetOrigins는 strings.ToLower(sni",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-132956-ai-admin-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Vendra",
   "title": "auto-improve: feat: let an administrator attach a visit-tracking script from the screen, under the policy that stays locked",
   "url": "https://github.com/hkjang/Vendra/pull/120",
   "sha": "b6d1883",
   "summary": "18파일 +2121/−13 · guarded files, PR open https://github.com/hkjang/Vendra/pull/120",
   "why": "guard: held — internal/db/migrations/017_tracking.sql ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-125004-Vendra-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "SecCheck",
   "title": "auto-improve: Let an administrator attach a visitor tracking snippet without loosening the page policy",
   "url": "https://github.com/hkjang/SecCheck/pull/2",
   "sha": "523cd0f",
   "summary": "19파일 +1348/−15 · guarded files, PR open https://github.com/hkjang/SecCheck/pull/2",
   "why": "guard: held — internal/store/migrations/034_visitor_tracking.sql ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-121955-SecCheck-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "ReSSO",
   "title": "auto-improve: feat: let a service administrator attach a visitor tracking snippet under the strict content security policy",
   "url": "https://github.com/hkjang/ReSSO/pull/19",
   "sha": "1d9b41d",
   "summary": "20파일 +1995/−7 · guarded files, PR open https://github.com/hkjang/ReSSO/pull/19",
   "why": "guard: held — internal/store/migrations/016_platform_settings.sql ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-114001-ReSSO-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Kkiit",
   "title": "auto-improve: feat: 관리자가 화면에서 방문 추적 스크립트를 붙일 수 있게 하다",
   "url": "https://github.com/hkjang/Kkiit/pull/2",
   "sha": "e9a699f",
   "summary": "28파일 +1619/−23 · guarded files, PR open https://github.com/hkjang/Kkiit/pull/2",
   "why": "guard: held — internal/database/migrations/040_visitor_tracking.sql ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-110003-Kkiit-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: test: seed the fixture in one batch instead of two thousand round trips",
   "url": "https://github.com/hkjang/Momento/pull/11",
   "sha": "9d3e06c",
   "summary": "1파일 +32/−3 · fix-round: CI no-ci, PR open https://github.com/hkjang/Momento/pull/11",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: no-ci — 이 커밋에 검사가 없음 (정책 allow_merge_without_ci 가 없으면 차단)",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-094228-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "AgentHub",
   "title": "auto-improve: feat: 관리자가 화면에서 방문 추적 스크립트를 붙일 수 있게 하다",
   "url": "https://github.com/hkjang/AgentHub/pull/24",
   "sha": "81a70db",
   "summary": "16파일 +1591/−12 · review held, PR open https://github.com/hkjang/AgentHub/pull/24",
   "why": "review: rejected — 리뷰 거절: web/src/pages/AdminSettings.tsx:138 화면은 provider 가 비어 있을 때 'momento' 를 선택",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-072116-AgentHub-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(auth): refuse a password bcrypt cannot hash instead of storing an empty one",
   "url": "https://github.com/hkjang/Momento/pull/9",
   "sha": "f48c9cc",
   "summary": "4파일 +186/−10 · guarded files, PR open https://github.com/hkjang/Momento/pull/9",
   "why": "guard: held — internal/auth/auth.go internal/auth/auth_test.go ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-042117-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(export): a cell the visitor wrote is text, not a formula, in the spreadsheet that opens it",
   "url": "https://github.com/hkjang/Momento/pull/8",
   "sha": "5c4a196",
   "summary": "5파일 +246/−27 · CI failed, PR open https://github.com/hkjang/Momento/pull/8",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-033116-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(lineage): a ratio's sources are the events and metrics inside its sides, not only what it names at the top",
   "url": "https://github.com/hkjang/Momento/pull/7",
   "sha": "c190e28",
   "summary": "2파일 +116/−21 · CI failed, PR open https://github.com/hkjang/Momento/pull/7",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-024117-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(catalog): a metric uses the event its definition names, not one its text resembles",
   "url": "https://github.com/hkjang/Momento/pull/6",
   "sha": "82642cd",
   "summary": "2파일 +77/−2 · CI failed, PR open https://github.com/hkjang/Momento/pull/6",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-015118-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: docs(compose): say that a loaded release image is started with --no-build",
   "url": "https://github.com/hkjang/Momento/pull/5",
   "sha": "c17db1b",
   "summary": "5파일 +200/−2 · CI failed, PR open https://github.com/hkjang/Momento/pull/5",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-010120-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(console): a requeued aggregate job says it is waiting to retry, not merely pending",
   "url": "https://github.com/hkjang/Momento/pull/4",
   "sha": "292285f",
   "summary": "3파일 +70/−13 · CI failed, PR open https://github.com/hkjang/Momento/pull/4",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-12-001117-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-12"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(maintenance): a rebuild that lost a deadlock to the event worker is tried again, not failed",
   "url": "https://github.com/hkjang/Momento/pull/3",
   "sha": "67add93",
   "summary": "2파일 +300/−4 · CI failed, PR open https://github.com/hkjang/Momento/pull/3",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-11-233044-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-11"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: fix(console): ask for the period the site's policy allows, not a fixed one",
   "url": "https://github.com/hkjang/Momento/pull/2",
   "sha": "bc6cb92",
   "summary": "8파일 +63/−14 · CI failed, PR open https://github.com/hkjang/Momento/pull/2",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-11-220044-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-11"
  },
  {
   "kind": "PR",
   "project": "visitflow",
   "title": "auto-improve: docs(guides): rewrite the user and admin guides around real screen captures",
   "url": "https://github.com/hkjang/visitflow/pull/11",
   "sha": "b184d2a",
   "summary": "37파일 +721/−107 · CI failed, PR open https://github.com/hkjang/visitflow/pull/11",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-11-211043-visitflow-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-11"
  },
  {
   "kind": "PR",
   "project": "cutover",
   "title": "auto-improve: docs: 사용자·관리자 가이드를 실제 화면 캡처가 들어간 표준 형식으로 재작성하고 PDF 추가",
   "url": "https://github.com/hkjang/cutover/pull/1",
   "sha": "18cfb20",
   "summary": "24파일 +677/−192 · CI no-ci, PR open https://github.com/hkjang/cutover/pull/1",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: no-ci — 이 커밋에 검사가 없음 (정책 allow_merge_without_ci 가 없으면 차단)",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-11-201042-cutover-improve",
   "labels": "aidev-approved",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-11"
  },
  {
   "kind": "PR",
   "project": "Momento",
   "title": "auto-improve: docs: 사용자·관리자 가이드를 실제 화면 캡처가 실린 완성본으로 다시 쓴다",
   "url": "https://github.com/hkjang/Momento/pull/1",
   "sha": "e73d357",
   "summary": "64파일 +2321/−692 · CI failed, PR open https://github.com/hkjang/Momento/pull/1",
   "why": "review: approved — 리뷰 승인 (risk=low); ci: failed — 성공이 아닌 검사: test=failure",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-11-190116-Momento-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-11"
  },
  {
   "kind": "PR",
   "project": "kanpic",
   "title": "auto-improve: fix: 사용자 명단도 무엇으로 적혔는지 밝히면 밝힌 대로 읽는다",
   "url": "https://github.com/hkjang/kanpic/pull/16",
   "sha": "fd9c422",
   "summary": "5파일 +117/−1 · review held, PR open https://github.com/hkjang/kanpic/pull/16",
   "why": "review: missing — 리뷰 결과 없음/손상: missing — 보류",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-204118-kanpic-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "moina",
   "title": "auto-improve: fix: EXIF로 돌려 찍은 사진의 표시 크기를 알려 줍니다",
   "url": "https://github.com/hkjang/moina/pull/17",
   "sha": "89176b8",
   "summary": "3파일 +183/−7 · review held, PR open https://github.com/hkjang/moina/pull/17",
   "why": "review: rejected — 리뷰 거절: backend/internal/httpapi/social.go:836 APP1 segment 전체가 sniff 버퍼 안에 들어와야만",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-204123-moina-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "git-ctx",
   "title": "auto-improve: fix(contentsecurity): mask the value a block scalar states below its key",
   "url": "https://github.com/hkjang/git-ctx/pull/28",
   "sha": "9b9ea38",
   "summary": "3파일 +157/−4 · guarded files, PR open https://github.com/hkjang/git-ctx/pull/28",
   "why": "guard: held — internal/contentsecurity/credential_shapes_test.go ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-192120-git-ctx-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "Vendra",
   "title": "auto-improve: fix: hold a role's permissions to the ones a door actually asks for",
   "url": "https://github.com/hkjang/Vendra/pull/118",
   "sha": "8a9c4a2",
   "summary": "8파일 +849/−10 · guarded files, PR open https://github.com/hkjang/Vendra/pull/118",
   "why": "guard: held — internal/db/migrations/017_role_permissions.sql ",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-182116-Vendra-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "umm",
   "title": "auto-improve: Cut an export where the export cuts it",
   "url": "https://github.com/hkjang/umm/pull/149",
   "sha": "a370713",
   "summary": "2파일 +198/−33 · review held, PR open https://github.com/hkjang/umm/pull/149",
   "why": "review: rejected — 리뷰 거절: web/src/lib/markdown-import.ts:299-306 (with :250 and :254) Once a banner",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-160114-umm-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "relio",
   "title": "auto-improve: perf(intelligence): read the deal health facts once for the whole set",
   "url": "https://github.com/hkjang/relio/pull/17",
   "sha": "6e90880",
   "summary": "3파일 +341/−42 · needs approval (risk=medium, files=3), PR open https://github.com/hkjang/relio/pull/17",
   "why": "autonomy: held — low-risk 단계 — 위험도 medium, 파일 3: 사람 승인 필요; review: approved — 리뷰 승인 (risk=medium)",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-153118-relio-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "ptium",
   "title": "auto-improve: Leave a sheet that spaces its thousands the table it was",
   "url": "https://github.com/hkjang/ptium/pull/17",
   "sha": "6b22609",
   "summary": "2파일 +109/−18 · review held, PR open https://github.com/hkjang/ptium/pull/17",
   "why": "review: rejected — 리뷰 거절: server/internal/docs/tables.go:336-339 (amountSigns) — adding the Europea",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-153108-ptium-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "git-ctx",
   "title": "auto-improve: fix(manifest): read the python lock files a project actually has",
   "url": "https://github.com/hkjang/git-ctx/pull/27",
   "sha": "470ee9f",
   "summary": "3파일 +165/−4 · review held, PR open https://github.com/hkjang/git-ctx/pull/27",
   "why": "review: rejected — 리뷰 거절: internal/manifest/lockfile.go:256-270 parsePipfileLock appends every entr",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-121115-git-ctx-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "aiportal-front-admin",
   "title": "auto-improve: fix(admin-v2): 세션이 만료되면 라우트 이동을 기다리지 않고 복구한다",
   "url": "https://github.com/hkjang/aiportal-front-admin/pull/15",
   "sha": "c1a4d7b",
   "summary": "8파일 +339/−12 · guarded files, PR open https://github.com/hkjang/aiportal-front-admin/pull/15",
   "why": "guard: held — upgrade/admin-v2/src/auth/guard.test.ts upgrade/admin-v2/src/auth/guard.ts upgra",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-111305-aiportal-front-admin-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "PR",
   "project": "Vendra",
   "title": "auto-improve: fix: price a bid in the currency the tender was put out in, and say which one every amount is in",
   "url": "https://github.com/hkjang/Vendra/pull/117",
   "sha": "2e1abb1",
   "summary": "12파일 +687/−25 · review held, PR open https://github.com/hkjang/Vendra/pull/117",
   "why": "review: rejected — 리뷰 거절: internal/httpapi/sourcing.go:311 `in.Currency = tenderCurrency` overwrite",
   "evidence": "https://github.com/hkjang/aidev/tree/main/state/runs/2026-09-10-094115-Vendra-improve",
   "labels": "",
   "action": "승인: PR 라벨 aidev-approved / 반려: aidev-rejected — 다음 회차에 러너가 승인 당시 커밋에만 CI 확인 후 머지·닫기",
   "date": "2026-09-10"
  },
  {
   "kind": "배포 복구",
   "project": "relio",
   "title": "⏪ 배포 복구 필요: relio (60601bd)",
   "url": "https://github.com/hkjang/aidev/issues/3",
   "sha": "",
   "summary": "이전 정상 릴리즈로 운영 복귀 여부 결정",
   "why": "롤백 PR 과 별개로 운영 환경 복구가 필요할 수 있음",
   "evidence": "https://github.com/hkjang/aidev/issues/3",
   "labels": "",
   "action": "이슈 안내대로 복구 후 이슈 닫기",
   "date": "2026-09-06"
  }
 ],
 "stops": [
  {
   "scope": "aiportal-java",
   "note": "2026-09-08T19:18:43+09:00 by hkjang: JDK 21(javac) 미설치로 gradle 검증 불가 — sudo apt install -y openjdk-21-jdk-headless 후 해제"
  }
 ],
 "campaigns": [
  {
   "id": "example-authz-tests",
   "goal": "권한 검사(인가) 경로에 회귀 테스트를 보강한다 — 각 엔드포인트의 거부 경로가 실제로 실행되는 테스트가 있어야 한다.",
   "projects": [],
   "budget_usd": 0,
   "until": "2026-01-01",
   "done": true
  },
  {
   "id": "guides-2026-09",
   "goal": "이 저장소의 사용자 가이드와 관리자 가이드를 화면 캡처가 들어간 완성본으로 만든다.\n\n표준은 aidev 저장소의 GUIDE-STANDARD.md 에 있다. 먼저 읽고 그대로 따른다:\n  /mnt/c/Users/USER/projects/aidev/GUIDE-STANDARD.md\n\n산출물은 docs/USER_GUIDE.md, docs/USER_GUIDE.pdf, docs/ADMIN_GUIDE.md, docs/ADMIN_GUIDE.pdf 네 개다.\n이미 있는 가이드가 있으면 새로 쓰지 말고 표준에 맞게 보강한다. 대부분의 저장소는 문서는 있으나\n화면 캡처가 한 장도 없다 — 이번 회차의 핵심은 실제로 앱을 띄워 화면을 찍어 싣는 것이다.\n\n화면 캡처는 실제로 띄운 화면만 쓴다. 목업·자리표시자·다른 제품 화면은 금지한다. 저장소에 이미\n캡처 도구가 있으면 그것을 쓰고, 없으면 릴리즈와 같은 방법(docker load 후 compose) 또는 개발\n서버로 띄워 headless Chrome 으로 1440x900 에서 찍는다. 화면에 실명·실제 주소·실제 비밀값이\n남지 않게 가짜 데이터를 채운 상태로 찍는다.\n\nPDF 는 저장소마다 변환기를 만들지 말고 공용 도구를 쓴다:\n  node /mnt/c/Users/USER/projects/aidev/tools/guide/md2pdf.mjs <입력.md> <출력.pdf> \\\n    --title \"사용자 가이드\" --subtitle \"<한 줄 부제>\" --project \"<프로젝트>\" --version \"<최신 태그>\"\n(처음 한 번은 그 디렉터리에서 npm install --no-audit --no-fund 가 필요하다.)\n\n한 회차에 두 문서를 다 끝내기 벅차면 사용자 가이드를 먼저 완성한다 — 반쯤 쓴 문서 두 개보다\n완성된 문서 하나가 낫다. 문서에 없는 기능이나 없는 설정을 지어내지 않는다. 환경 변수 표는\n코드에서 읽어 만든다.",
   "projects": [
    "AgentHub",
    "Invenqor",
    "Kkiit",
    "Momento",
    "ReSSO",
    "SecCheck",
    "Vendra",
    "ai-admin",
    "appstore",
    "cutover",
    "dataworks",
    "igame",
    "jikim",
    "jupiq",
    "kanpic",
    "moina",
    "moyro",
    "muni",
    "ptium",
    "relio",
    "seaton",
    "umm",
    "vibe-coders",
    "visitflow",
    "weekly"
   ],
   "budget_usd": 700,
   "until": "2026-10-15",
   "done": true,
   "improve_budget_usd": 16
  },
  {
   "id": "tracking-2026-09",
   "goal": "관리자가 화면에서 방문 추적 스크립트를 붙일 수 있는 체계를 이 저장소에 만든다.\n\n표준과 참조 구현은 aidev 저장소의 TRACKING-STANDARD.md 에 있다. 먼저 읽고 그대로 따른다:\n  /mnt/c/Users/USER/projects/aidev/TRACKING-STANDARD.md\n\n참조 구현은 kanpic 이다. 코드를 베끼지 말고, 이 저장소의 언어와 구조에 맞게 같은 능력을 만든다:\n  /mnt/c/Users/USER/projects/kanpic/internal/analytics/analytics.go   (설정·스니펫·정책 출처)\n  /mnt/c/Users/USER/projects/kanpic/internal/analytics/violations.go  (차단된 출처 기록)\n  /mnt/c/Users/USER/projects/kanpic/internal/httpapi/server.go 의 policyFor  (nonce 와 정책 조립)\n\n어려운 쪽은 <script> 삽입이 아니라 CSP 다. 이 앱들은 script-src 'self' 로 잠겨 있어 스니펫을\n그냥 붙이면 조용히 차단되고 관리자는 이유를 알 수 없다. 요청마다 nonce 를 붙이고, 스니펫에서\n출처를 읽어 정책에 더하고, 차단된 것을 기록해 보여 주는 것까지가 이 일이다.\n'unsafe-inline' 으로 정책을 푸는 것은 금지한다 — 한 번 풀면 추적을 끈 뒤에도 느슨한 채 남는다.\n\nprovider 는 momento 를 첫 자리에 둔다. Momento 는 사내 자체 호스팅 수집기라 데이터가 밖으로\n나가지 않는 유일한 선택지다. 같은 오리진 프록시(/momento/* 를 넘기고 data-endpoint 지정)를\n지원하면 외부 출처가 정책에 등장하지 않으니, 가능하면 그 경로를 기본으로 삼는다.\n\n기본값은 꺼짐이다. 새로 설치한 곳에서는 아무것도 달라지지 않아야 한다.\n\n이 저장소가 사람이 보는 화면을 제공하지 않으면(순수 API·CLI·MCP 서버) 억지로 넣지 말고,\n원장에 그 사실을 적고 변경 없이 끝낸다.\n\n관리자 가이드(docs/ADMIN_GUIDE.md)에 설정 방법과 CSP 설명을 더한다. PDF 가 있으면 다시 굽는다.",
   "projects": [
    "AgentHub",
    "Invenqor",
    "Kkiit",
    "ReSSO",
    "SecCheck",
    "Vendra",
    "ai-admin",
    "appstore",
    "cutover",
    "dataworks",
    "igame",
    "jikim",
    "jupiq",
    "moina",
    "moyro",
    "muni",
    "ptium",
    "relio",
    "seaton",
    "umm",
    "vibe-coders",
    "visitflow",
    "weekly"
   ],
   "budget_usd": 300,
   "improve_budget_usd": 14,
   "until": "2026-10-31",
   "done": false
  },
  {
   "id": "handoff-2026-09",
   "goal": "이 서비스가 다른 사내 서비스와 문서를 주고받을 수 있게 만든다.\n\n표준은 aidev 저장소의 HANDOFF-STANDARD.md 에 있다. 먼저 읽고 그대로 따른다.\n엔드포인트 이름·요청 모양·응답 코드를 임의로 바꾸지 마라 — 여섯 서비스가 서로 맞물려야\n하므로, 한 곳이라도 다르게 만들면 아무것도 이어지지 않는다:\n  /mnt/c/Users/USER/projects/aidev/HANDOFF-STANDARD.md\n\n지금은 생각이 umm 의 캔버스에서 muni 의 문서가 되고 ptium 의 슬라이드가 되어 weekly 의\n보고로 들어가는 동안, 단계마다 사람이 파일을 내려받아 다시 올린다. 형식은 이미 맞는다 —\numm 은 마크다운을 내보내고 ptium 은 마크다운을 읽는다. 없는 것은 넘기는 손이다.\n\n서비스끼리 서로의 자격 증명을 들고 있지 않는다. 한 번만 쓸 수 있는 5분짜리 표(claim)를\n발급하고, 표를 들고 온 쪽이 원본에서 직접 받아 간다.\n\n가장 조심할 곳은 받는 쪽의 source 다. 밖에서 들어온 주소를 그대로 받아 오면 이 서비스가\n사내 아무 주소나 대신 긁어 오는 도구가 된다. 관리자가 설정한 허용 목록에 있는 오리진만\n받고, 없으면 아무것도 요청하지 않고 거절한다. 리다이렉트를 따라가지 않고, 크기와 시간에\n상한을 둔다. 이 부분을 빠뜨린 구현은 받지 않는다.\n\n표준의 형식 표에서 이 저장소가 맡은 칸만 만든다. 받을 수 없는 형식으로 보내는 단추는\n만들지 않는다. 허용 목록의 기본값은 비어 있고, 그때는 보내기 단추가 보이지 않는다 —\n새로 설치한 곳에서는 아무것도 달라지지 않아야 한다.\n\n한 회차에 보내는 쪽과 받는 쪽을 다 만들기 벅차면 표준의 형식 표에서 이 저장소가 맡은\n쪽부터 하나를 온전히 끝낸다. 반쯤 된 양쪽보다 완성된 한쪽이 낫다.\n\n관리자 가이드(docs/ADMIN_GUIDE.md)에 허용 목록 설정 방법을 더한다.",
   "projects": [
    "umm",
    "muni",
    "kanpic",
    "ptium",
    "weekly"
   ],
   "budget_usd": 180,
   "improve_budget_usd": 16,
   "until": "2026-11-15",
   "done": false
  },
  {
   "id": "mail-2026-09",
   "goal": "사내 SMTP 릴레이로 이벤트 알림을 보내는 체계를 이 저장소에 만든다.\n\n표준과 참조 구현은 aidev 저장소의 MAIL-STANDARD.md 에 있다. 먼저 읽고 그대로 따른다:\n  /mnt/c/Users/USER/projects/aidev/MAIL-STANDARD.md\n\n참조 구현은 kanpic 이다. 코드를 베끼지 말고 이 저장소의 언어와 구조에 맞게 같은 능력을 만든다:\n  /mnt/c/Users/USER/projects/kanpic/internal/mail/         (릴레이 연결·설정·발송 기록)\n  /mnt/c/Users/USER/projects/kanpic/internal/httpapi/mail.go (기록 조회·시험 발송)\n\n지켜야 할 다섯 가지는 표준에 있고, 그중 넷은 빠뜨리기 쉬우니 다시 적는다.\n- 메일은 배경에서 보낸다. 릴레이가 죽어 있어도 그 요청은 정상으로 끝나야 한다.\n- 시도마다 기록한다. 실패만 남기면 '안 왔다'는 문의에 답할 수 없다. 다만 본문은 담지 않는다.\n- 사용자 명부를 새로 만들지 않는다. 계정 id 를 메일 주소로 바꾸는 조회만 빌려 쓴다.\n- SMTP 비밀번호는 설정 API 가 돌려주지 않는다. 화면에는 '설정됨'만 보이고 로그에도 남기지 않는다.\n\n설정 키 이름은 표준의 표 그대로 쓴다(mail.enabled, mail.smtp_host, ...). 앱마다 이름이 다르면\n운영자가 스무 번 다르게 배운다. 사내 릴레이는 포트 25·인증 없음·TLS 없음이 흔하므로 그것이\n기본값이고, 인증과 암호화는 선택 사항이다.\n\n보낼 이벤트는 kanpic 의 목록을 옮기지 말고 이 앱에서 사람이 실제로 기다리는 일을 3~6개 고른다.\n기준은 하나다 — 이 메일이 오지 않으면 누군가 손해를 보거나 화면을 계속 새로고침한다. 승인 요청,\n만료 임박, 내 차례가 됨, 실패로 멈춤 같은 것들이다. 단순한 '무언가 바뀜'은 메일감이 아니다.\n무엇을 골랐고 왜 골랐는지 원장에 적는다.\n\n시끄러우면 사람들은 규칙을 만들어 통째로 버리고, 그러면 정말 필요한 알림도 함께 버려진다.\n자기가 한 일로 자기에게 보내지 않고, 한 작업이 여러 알림을 만들면 묶어서 한 통으로 보낸다.\n\n기본값은 꺼짐이다. 새로 설치한 곳에서는 아무것도 달라지지 않아야 한다.\n관리 화면에 설정과 시험 발송 단추를 두고, 관리자 가이드에 설정 표를 더한다.",
   "projects": [
    "AgentHub",
    "Invenqor",
    "Kkiit",
    "ReSSO",
    "SecCheck",
    "Vendra",
    "ai-admin",
    "appstore",
    "cutover",
    "dataworks",
    "igame",
    "jikim",
    "jupiq",
    "moina",
    "moyro",
    "muni",
    "ptium",
    "relio",
    "seaton",
    "umm",
    "vibe-coders",
    "visitflow",
    "weekly"
   ],
   "budget_usd": 300,
   "improve_budget_usd": 14,
   "until": "2026-11-30",
   "done": false
  },
  {
   "id": "silent-sso-2026-09",
   "goal": "Keycloak(또는 ReSSO)에 이미 로그인한 사람이 이 서비스를 열면 로그인 화면 없이 바로 본 화면으로\n들어가게 만든다. OIDC 의 prompt=none 을 쓰는 silent authentication 이다.\n\n표준은 aidev 저장소의 SILENT-SSO-STANDARD.md 에 있다. 먼저 읽고 그대로 따른다:\n  /mnt/c/Users/USER/projects/aidev/SILENT-SSO-STANDARD.md\n\n참조 구현은 releasedock 이다. 코드를 베끼지 말고 이 저장소의 언어와 구조에 맞게 같은 능력을 만든다:\n  /mnt/c/Users/USER/projects/releasedock/backend/internal/server/oidc.go  (prompt=none 시작, 콜백의 login_required 처리)\n  /mnt/c/Users/USER/projects/releasedock/web/src/auth/silentSso.ts        (언제 시도할지 정하는 규칙)\n\n이 일의 전부는 무한 루프를 막는 것이다. prompt=none 은 화면을 그리지 않고, 세션이 없으면\nerror=login_required 로 돌아온다 — 그것은 실패가 아니라 평범한 대답이다. 그런데 그때 다시\n시도하면 브라우저가 제공자와 앱 사이를 끝없이 오가고 사용자는 화면이 깜빡이는 것만 본다.\n막는 장치를 세 겹으로 둔다: (1) sessionStorage 에 '한 탭 세션에 한 번' 표시, (2) 스스로\n로그아웃했으면 억제, (3) 콜백이 거절을 받으면 /login?sso=none 으로 보내 주소에도 표시를 남김.\n그리고 저장소를 읽지 못하면 '이미 시도했다'로 친다 — 사생활 보호 모드에서 예외가 나는데\n그것을 '아직 안 했다'로 읽으면 바로 루프가 된다. 막히는 쪽으로 실패한다.\n\n숨은 iframe 이 아니라 최상위 이동을 쓴다. 서드파티 쿠키가 막힌 브라우저에서도 동작하고\n제공자가 프레임을 허용하는지 신경 쓰지 않아도 된다.\n\nOIDC 설정에 auto_login 을 두고 기본값은 꺼짐이다. 서버는 그 설정이 꺼져 있으면 prompt=none\n요청이 와도 조용히 평범한 로그인으로 바꾼다 — 누구든 주소에 붙여 흐름을 바꿀 수 있으면 안 된다.\n\n콜백·오류·로그인 경로와 API·MCP·헬스 경로에서는 시도하지 않는다. 브라우저 이동에만 해당한다.\n깊은 링크로 들어온 사람은 조용히 로그인한 뒤 그 자리로 돌아가야 한다 — return_to 는 '/' 로\n시작하고 '//' 로 시작하지 않는 값만 받는다.\n\n이 저장소에 OIDC 가 없으면 새로 만들지 말고, 원장에 그 사실을 적고 변경 없이 끝낸다.\n관리자 가이드(docs/ADMIN_GUIDE.md)에 auto_login 설정과 동작을 더한다.",
   "projects": [
    "AgentHub",
    "Invenqor",
    "Kkiit",
    "ReSSO",
    "SecCheck",
    "Vendra",
    "ai-admin",
    "appstore",
    "cutover",
    "dataworks",
    "igame",
    "jikim",
    "jupiq",
    "moina",
    "moyro",
    "muni",
    "ptium",
    "relio",
    "seaton",
    "umm",
    "vibe-coders",
    "visitflow",
    "weekly"
   ],
   "budget_usd": 300,
   "improve_budget_usd": 14,
   "until": "2026-12-15",
   "done": false
  }
 ],
 "projects_autonomy": {
  "Clustara": "release",
  "AgentHub": "release",
  "Vendra": "release",
  "ai-admin": "release",
  "aiportal-front-admin": "release",
  "aiportal-java": "release",
  "aiportal-py": "release",
  "appstore": "release",
  "dataworks": "release",
  "git-ctx": "release",
  "igame": "release",
  "kanpic": "release",
  "moina": "release",
  "moyro": "release",
  "muni": "release",
  "pii-masker": "release",
  "ptium": "release",
  "releasedock": "release",
  "relio": "low-risk",
  "umm": "release",
  "ReSSO": "release",
  "visitflow": "release",
  "weekly": "release",
  "Invenqor": "release",
  "vibe-coders": "release",
  "Quantoss": "release",
  "aiportal-front": "release",
  "jupiq": "release",
  "jikim": "release",
  "Kkiit": "release",
  "Momento": "release",
  "SecCheck": "release",
  "cutover": "release",
  "seaton": "release"
 },
 "quality": [
  {
   "metric": "검증된 개선 완료율",
   "value": "96%",
   "detail": "관찰 24h 지난 머지 377건 중 회귀 없음 363건"
  },
  {
   "metric": "완전한 릴리즈 비율",
   "value": "93%",
   "detail": "릴리즈 시도 284건 중 자산 검증까지 264건"
  },
  {
   "metric": "사람의 재작업률",
   "value": "0%",
   "detail": "되돌림·롤백 0건 / 관찰 머지 377건"
  },
  {
   "metric": "변경 후 회귀율",
   "value": "0%",
   "detail": "회귀 0건 / 관찰 머지 377건"
  },
  {
   "metric": "유효 개선당 비용",
   "value": "$11.65",
   "detail": "비용 확인된 유효 개선 164건, 미확인 세션 4"
  },
  {
   "metric": "예외 처리 소요 시간(중앙값)",
   "value": "9.2시간",
   "detail": "해결된 경고 40건"
  },
  {
   "metric": "실행 오류",
   "value": "49",
   "detail": "최근 14일"
  }
 ],
 "outcomes_today": {
  "error": 9,
  "verify-failed": 15,
  "review-pending": 12,
  "release-ready": 8,
  "merged": 1,
  "releasing": 0,
  "no-change": 0
 },
 "days": [
  {
   "date": "2026-09-12",
   "total": 45,
   "released": 8,
   "merged": 1,
   "nochange": 0,
   "failed": 6,
   "cost_usd": 286.03
  },
  {
   "date": "2026-09-11",
   "total": 57,
   "released": 5,
   "merged": 1,
   "nochange": 1,
   "failed": 4,
   "cost_usd": 364.29
  },
  {
   "date": "2026-09-10",
   "total": 62,
   "released": 33,
   "merged": 7,
   "nochange": 0,
   "failed": 1,
   "cost_usd": 356.91
  },
  {
   "date": "2026-09-09",
   "total": 79,
   "released": 37,
   "merged": 11,
   "nochange": 1,
   "failed": 2,
   "cost_usd": 300.23
  },
  {
   "date": "2026-09-08",
   "total": 53,
   "released": 29,
   "merged": 8,
   "nochange": 0,
   "failed": 0,
   "cost_usd": 227.63
  },
  {
   "date": "2026-09-07",
   "total": 65,
   "released": 11,
   "merged": 13,
   "nochange": 0,
   "failed": 0,
   "cost_usd": 135.58
  },
  {
   "date": "2026-09-06",
   "total": 47,
   "released": 12,
   "merged": 3,
   "nochange": 1,
   "failed": 0,
   "cost_usd": 190.48
  },
  {
   "date": "2026-09-05",
   "total": 36,
   "released": 21,
   "merged": 6,
   "nochange": 1,
   "failed": 0,
   "cost_usd": 50.01
  },
  {
   "date": "2026-09-04",
   "total": 77,
   "released": 33,
   "merged": 9,
   "nochange": 1,
   "failed": 0,
   "cost_usd": 0.0
  },
  {
   "date": "2026-09-03",
   "total": 96,
   "released": 63,
   "merged": 25,
   "nochange": 8,
   "failed": 0,
   "cost_usd": 0.0
  },
  {
   "date": "2026-09-02",
   "total": 50,
   "released": 28,
   "merged": 16,
   "nochange": 3,
   "failed": 0,
   "cost_usd": 0.0
  }
 ],
 "weeks": [
  {
   "key": "2026-W37",
   "url": "https://hkjang.github.io/aidev/weekly/2026-W37/",
   "days": 6,
   "total": 361,
   "released": 123,
   "merged": 41,
   "nochange": 2,
   "failed": 13,
   "cost": 1670.67,
   "minutes": 4238
  },
  {
   "key": "2026-W36",
   "url": "https://hkjang.github.io/aidev/weekly/2026-W36/",
   "days": 5,
   "total": 306,
   "released": 157,
   "merged": 59,
   "nochange": 14,
   "failed": 0,
   "cost": 240.48,
   "minutes": 651
  }
 ],
 "months": [
  {
   "key": "2026-09",
   "url": "https://hkjang.github.io/aidev/monthly/2026-09/",
   "days": 11,
   "total": 667,
   "released": 280,
   "merged": 100,
   "nochange": 16,
   "failed": 13,
   "cost": 1911.16,
   "minutes": 4889
  }
 ],
 "projects": [
  {
   "name": "AgentHub",
   "repo": "https://github.com/hkjang/AgentHub",
   "page": "https://hkjang.github.io/aidev/projects/AgentHub/",
   "runs": 37,
   "released": 18,
   "last_ts": "2026-09-12T07:43:49+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/AgentHub/pull/24",
   "cost": 143.94,
   "minutes": 306,
   "grade": "D",
   "grade_why": "14일: 릴리즈 18, 실패 0, 경고 5, 회귀 4",
   "lessons": 4,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.244.0",
    "tag": "v0.244.0",
    "assets_count": 8,
    "prev_tag": "v0.243.0",
    "prev_assets_count": 8
   }
  },
  {
   "name": "ai-admin",
   "repo": "https://github.com/hkjang/ai-admin",
   "page": "https://hkjang.github.io/aidev/projects/ai-admin/",
   "runs": 22,
   "released": 12,
   "last_ts": "2026-09-12T13:52:20+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/ai-admin/pull/21",
   "cost": 85.78,
   "minutes": 173,
   "grade": "D",
   "grade_why": "14일: 릴리즈 12, 실패 0, 경고 7, 회귀 0",
   "lessons": 0,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "1.2.19",
    "tag": "v1.2.19",
    "assets_count": 2,
    "prev_tag": "v1.2.18",
    "prev_assets_count": 2
   }
  },
  {
   "name": "aiportal-front",
   "repo": "https://github.com/hkjang/aiportal-front",
   "page": "https://hkjang.github.io/aidev/projects/aiportal-front/",
   "runs": 19,
   "released": 0,
   "last_ts": "2026-09-10T19:15:08+09:00",
   "last_status": "merged",
   "last_result": "merged https://github.com/hkjang/aiportal-front/pull/14, release skipped",
   "cost": 37.95,
   "minutes": 107,
   "grade": "C",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 1",
   "lessons": 1,
   "ideas_pending": 13,
   "ideas_total": 14,
   "release": {
    "status": "skipped",
    "version": "",
    "tag": ""
   }
  },
  {
   "name": "aiportal-front-admin",
   "repo": "https://github.com/hkjang/aiportal-front-admin",
   "page": "https://hkjang.github.io/aidev/projects/aiportal-front-admin/",
   "runs": 18,
   "released": 0,
   "last_ts": "2026-09-10T19:12:59+09:00",
   "last_status": "merged",
   "last_result": "merged https://github.com/hkjang/aiportal-front-admin/pull/16, release skipped",
   "cost": 34.81,
   "minutes": 85,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 7,
   "ideas_total": 8,
   "release": {
    "status": "skipped",
    "version": "",
    "tag": ""
   }
  },
  {
   "name": "aiportal-java",
   "repo": "https://github.com/hkjang/aiportal-java",
   "page": "https://hkjang.github.io/aidev/projects/aiportal-java/",
   "runs": 16,
   "released": 0,
   "last_ts": "2026-09-08T19:17:57+09:00",
   "last_status": "other",
   "last_result": "verify failed: 실패한 검증: ./gradlew --quiet test (exit 1)",
   "cost": 19.39,
   "minutes": 61,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 11,
   "ideas_total": 12,
   "release": {
    "status": "skipped",
    "version": "",
    "tag": ""
   }
  },
  {
   "name": "aiportal-py",
   "repo": "https://github.com/hkjang/aiportal-py",
   "page": "https://hkjang.github.io/aidev/projects/aiportal-py/",
   "runs": 23,
   "released": 0,
   "last_ts": "2026-09-10T19:13:25+09:00",
   "last_status": "merged",
   "last_result": "merged https://github.com/hkjang/aiportal-py/pull/17, release skipped",
   "cost": 41.02,
   "minutes": 107,
   "grade": "C",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 1",
   "lessons": 1,
   "ideas_pending": 12,
   "ideas_total": 13,
   "release": {
    "status": "skipped",
    "version": "",
    "tag": ""
   }
  },
  {
   "name": "appstore",
   "repo": "https://github.com/hkjang/appstore",
   "page": "https://hkjang.github.io/aidev/projects/appstore/",
   "runs": 18,
   "released": 12,
   "last_ts": "2026-09-12T14:43:38+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/appstore/pull/15, released v2.6.0",
   "cost": 89.5,
   "minutes": 187,
   "grade": "D",
   "grade_why": "14일: 릴리즈 12, 실패 0, 경고 0, 회귀 2",
   "lessons": 2,
   "ideas_pending": 9,
   "ideas_total": 10,
   "release": {
    "status": "released",
    "version": "2.6.0",
    "tag": "v2.6.0",
    "assets_count": 1,
    "prev_tag": "v2.5.8",
    "prev_assets_count": 1
   }
  },
  {
   "name": "Clustara",
   "repo": "https://github.com/hkjang/clustara",
   "page": "https://hkjang.github.io/aidev/projects/Clustara/",
   "runs": 30,
   "released": 19,
   "last_ts": "2026-09-10T17:50:09+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/clustara/pull/20, released v0.9.281",
   "cost": 75.95,
   "minutes": 235,
   "grade": "C",
   "grade_why": "14일: 릴리즈 19, 실패 0, 경고 2, 회귀 1",
   "lessons": 1,
   "ideas_pending": 13,
   "ideas_total": 14,
   "release": {
    "status": "released",
    "version": "0.9.281",
    "tag": "v0.9.281",
    "assets_count": 3,
    "prev_tag": "v0.9.280",
    "prev_assets_count": 3
   }
  },
  {
   "name": "cutover",
   "repo": "https://github.com/hkjang/cutover",
   "page": "https://hkjang.github.io/aidev/projects/cutover/",
   "runs": 2,
   "released": 0,
   "last_ts": "2026-09-12T15:28:27+09:00",
   "last_status": "other",
   "last_result": "CI no-ci, PR open https://github.com/hkjang/cutover/pull/2",
   "cost": 15.51,
   "minutes": 42,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 7,
   "ideas_total": 8,
   "release": {}
  },
  {
   "name": "dataworks",
   "repo": "https://github.com/hkjang/dataworks",
   "page": "https://hkjang.github.io/aidev/projects/dataworks/",
   "runs": 29,
   "released": 16,
   "last_ts": "2026-09-12T16:09:47+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/dataworks/pull/18, released v0.9.53",
   "cost": 79.53,
   "minutes": 192,
   "grade": "B",
   "grade_why": "14일: 릴리즈 16, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 7,
   "ideas_total": 8,
   "release": {
    "status": "released",
    "version": "0.9.53",
    "tag": "v0.9.53",
    "assets_count": 1,
    "prev_tag": "v0.9.52",
    "prev_assets_count": 1
   }
  },
  {
   "name": "git-ctx",
   "repo": "https://github.com/hkjang/git-ctx",
   "page": "https://hkjang.github.io/aidev/projects/git-ctx/",
   "runs": 19,
   "released": 9,
   "last_ts": "2026-09-10T19:34:33+09:00",
   "last_status": "other",
   "last_result": "guarded files, PR open https://github.com/hkjang/git-ctx/pull/28",
   "cost": 38.53,
   "minutes": 155,
   "grade": "D",
   "grade_why": "14일: 릴리즈 9, 실패 0, 경고 6, 회귀 2",
   "lessons": 2,
   "ideas_pending": 11,
   "ideas_total": 12,
   "release": {
    "status": "released",
    "version": "0.77.11",
    "tag": "v0.77.11",
    "assets_count": 2,
    "prev_tag": "v0.77.10",
    "prev_assets_count": 2
   }
  },
  {
   "name": "igame",
   "repo": "https://github.com/hkjang/igame",
   "page": "https://hkjang.github.io/aidev/projects/igame/",
   "runs": 24,
   "released": 11,
   "last_ts": "2026-09-12T17:20:48+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/igame/pull/16, released v0.7.13",
   "cost": 76.18,
   "minutes": 156,
   "grade": "D",
   "grade_why": "14일: 릴리즈 11, 실패 0, 경고 7, 회귀 1",
   "lessons": 1,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.7.13",
    "tag": "v0.7.13",
    "assets_count": 1,
    "prev_tag": "v0.7.12",
    "prev_assets_count": 1
   }
  },
  {
   "name": "Invenqor",
   "repo": "https://github.com/hkjang/invenqor",
   "page": "https://hkjang.github.io/aidev/projects/Invenqor/",
   "runs": 30,
   "released": 15,
   "last_ts": "2026-09-12T08:28:02+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/invenqor/pull/18, released v0.2.33",
   "cost": 94.3,
   "minutes": 330,
   "grade": "D",
   "grade_why": "14일: 릴리즈 15, 실패 1, 경고 4, 회귀 0",
   "lessons": 0,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.2.33",
    "tag": "v0.2.33",
    "assets_count": 25,
    "prev_tag": "v0.2.32",
    "prev_assets_count": 25
   }
  },
  {
   "name": "jikim",
   "repo": "https://github.com/hkjang/jikim",
   "page": "https://hkjang.github.io/aidev/projects/jikim/",
   "runs": 12,
   "released": 8,
   "last_ts": "2026-09-12T18:14:28+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/jikim/pull/26, released v0.2.11",
   "cost": 71.91,
   "minutes": 150,
   "grade": "C",
   "grade_why": "14일: 릴리즈 8, 실패 0, 경고 2, 회귀 1",
   "lessons": 1,
   "ideas_pending": 13,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.2.11",
    "tag": "v0.2.11",
    "assets_count": 2,
    "prev_tag": "v0.2.10",
    "prev_assets_count": 2
   }
  },
  {
   "name": "jupiq",
   "repo": "https://github.com/hkjang/jupiq",
   "page": "https://hkjang.github.io/aidev/projects/jupiq/",
   "runs": 16,
   "released": 9,
   "last_ts": "2026-09-12T18:58:17+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/jupiq/pull/13, released v1.6.0",
   "cost": 58.38,
   "minutes": 129,
   "grade": "B",
   "grade_why": "14일: 릴리즈 9, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 10,
   "ideas_total": 11,
   "release": {
    "status": "released",
    "version": "1.6.0",
    "tag": "v1.6.0",
    "assets_count": 1,
    "prev_tag": "v1.5.0",
    "prev_assets_count": 1
   }
  },
  {
   "name": "kanpic",
   "repo": "https://github.com/hkjang/kanpic",
   "page": "https://hkjang.github.io/aidev/projects/kanpic/",
   "runs": 18,
   "released": 15,
   "last_ts": "2026-09-11T05:42:10+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/kanpic/pull/17, released v0.243.0",
   "cost": 43.18,
   "minutes": 97,
   "grade": "B",
   "grade_why": "14일: 릴리즈 15, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 9,
   "ideas_total": 10,
   "release": {
    "status": "released",
    "version": "0.243.0",
    "tag": "v0.243.0",
    "assets_count": 2,
    "prev_tag": "v0.242.0",
    "prev_assets_count": 2
   }
  },
  {
   "name": "Kkiit",
   "repo": "https://github.com/hkjang/Kkiit",
   "page": "https://hkjang.github.io/aidev/projects/Kkiit/",
   "runs": 2,
   "released": 0,
   "last_ts": "2026-09-12T11:20:45+09:00",
   "last_status": "other",
   "last_result": "guarded files, PR open https://github.com/hkjang/Kkiit/pull/2",
   "cost": 23.32,
   "minutes": 49,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 7,
   "ideas_total": 9,
   "release": {
    "status": "released",
    "version": "0.2.0",
    "tag": "v0.2.0",
    "assets_count": 1,
    "prev_tag": "v0.1.1",
    "prev_assets_count": 1
   }
  },
  {
   "name": "moina",
   "repo": "https://github.com/hkjang/moina",
   "page": "https://hkjang.github.io/aidev/projects/moina/",
   "runs": 21,
   "released": 9,
   "last_ts": "2026-09-12T19:44:53+09:00",
   "last_status": "failed",
   "last_result": "CI failed, PR open https://github.com/hkjang/moina/pull/19",
   "cost": 58.4,
   "minutes": 131,
   "grade": "D",
   "grade_why": "14일: 릴리즈 9, 실패 3, 경고 5, 회귀 0",
   "lessons": 0,
   "ideas_pending": 12,
   "ideas_total": 13,
   "release": {
    "status": "released",
    "version": "0.1.27",
    "tag": "v0.1.27",
    "assets_count": 1,
    "prev_tag": "v0.1.26",
    "prev_assets_count": 1
   }
  },
  {
   "name": "Momento",
   "repo": "https://github.com/hkjang/Momento",
   "page": "https://hkjang.github.io/aidev/projects/Momento/",
   "runs": 10,
   "released": 0,
   "last_ts": "2026-09-12T10:03:47+09:00",
   "last_status": "other",
   "last_result": "fix-round: CI no-ci, PR open https://github.com/hkjang/Momento/pull/11",
   "cost": 37.16,
   "minutes": 157,
   "grade": "D",
   "grade_why": "14일: 릴리즈 0, 실패 8, 경고 9, 회귀 0",
   "lessons": 0,
   "ideas_pending": 16,
   "ideas_total": 18,
   "release": {}
  },
  {
   "name": "moyro",
   "repo": "https://github.com/hkjang/moyro",
   "page": "https://hkjang.github.io/aidev/projects/moyro/",
   "runs": 20,
   "released": 8,
   "last_ts": "2026-09-12T20:18:36+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/moyro/pull/13",
   "cost": 68.27,
   "minutes": 198,
   "grade": "C",
   "grade_why": "14일: 릴리즈 8, 실패 0, 경고 3, 회귀 1",
   "lessons": 1,
   "ideas_pending": 13,
   "ideas_total": 14,
   "release": {
    "status": "released",
    "version": "0.2.28",
    "tag": "v0.2.28",
    "assets_count": 1,
    "prev_tag": "v0.2.27",
    "prev_assets_count": 1
   }
  },
  {
   "name": "muni",
   "repo": "https://github.com/hkjang/muni",
   "page": "https://hkjang.github.io/aidev/projects/muni/",
   "runs": 14,
   "released": 11,
   "last_ts": "2026-09-12T20:59:52+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/muni/pull/13, released v0.38.0",
   "cost": 65.19,
   "minutes": 143,
   "grade": "C",
   "grade_why": "14일: 릴리즈 11, 실패 0, 경고 1, 회귀 1",
   "lessons": 1,
   "ideas_pending": 11,
   "ideas_total": 12,
   "release": {
    "status": "released",
    "version": "0.38.0",
    "tag": "v0.38.0",
    "assets_count": 1,
    "prev_tag": "v0.37.0",
    "prev_assets_count": 1
   }
  },
  {
   "name": "pii-masker",
   "repo": "https://github.com/hkjang/pii-masker",
   "page": "https://hkjang.github.io/aidev/projects/pii-masker/",
   "runs": 25,
   "released": 16,
   "last_ts": "2026-09-10T14:39:31+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/pii-masker/pull/17, released v1.0.20",
   "cost": 29.27,
   "minutes": 82,
   "grade": "A",
   "grade_why": "14일: 릴리즈 16, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 7,
   "ideas_total": 8,
   "release": {
    "status": "released",
    "version": "1.0.20",
    "tag": "v1.0.20",
    "assets_count": 1,
    "prev_tag": "v1.0.19",
    "prev_assets_count": 1
   }
  },
  {
   "name": "ptium",
   "repo": "https://github.com/hkjang/ptium",
   "page": "https://hkjang.github.io/aidev/projects/ptium/",
   "runs": 27,
   "released": 11,
   "last_ts": "2026-09-11T12:36:15+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/ptium/pull/19",
   "cost": 54.9,
   "minutes": 146,
   "grade": "D",
   "grade_why": "14일: 릴리즈 11, 실패 0, 경고 2, 회귀 2",
   "lessons": 2,
   "ideas_pending": 12,
   "ideas_total": 13,
   "release": {
    "status": "released",
    "version": "1.69.34",
    "tag": "v1.69.34",
    "assets_count": 7,
    "prev_tag": "v1.69.33",
    "prev_assets_count": 7
   }
  },
  {
   "name": "Quantoss",
   "repo": "https://github.com/hkjang/Quantoss",
   "page": "https://hkjang.github.io/aidev/projects/Quantoss/",
   "runs": 15,
   "released": 0,
   "last_ts": "2026-09-07T11:43:00+09:00",
   "last_status": "other",
   "last_result": "approved https://github.com/hkjang/Quantoss/pull/13, rebase conflict",
   "cost": 16.11,
   "minutes": 58,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 11,
   "ideas_total": 12,
   "release": {
    "status": "skipped",
    "version": "",
    "tag": ""
   }
  },
  {
   "name": "releasedock",
   "repo": "https://github.com/hkjang/releasedock",
   "page": "https://hkjang.github.io/aidev/projects/releasedock/",
   "runs": 17,
   "released": 14,
   "last_ts": "2026-09-10T15:54:36+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/releasedock/pull/16, released v0.5.15",
   "cost": 38.25,
   "minutes": 102,
   "grade": "C",
   "grade_why": "14일: 릴리즈 14, 실패 0, 경고 2, 회귀 1",
   "lessons": 1,
   "ideas_pending": 6,
   "ideas_total": 8,
   "release": {
    "status": "released",
    "version": "0.5.15",
    "tag": "v0.5.15",
    "assets_count": 2,
    "prev_tag": "v0.5.14",
    "prev_assets_count": 2
   }
  },
  {
   "name": "relio",
   "repo": "https://github.com/hkjang/relio",
   "page": "https://hkjang.github.io/aidev/projects/relio/",
   "runs": 28,
   "released": 12,
   "last_ts": "2026-09-12T08:51:33+09:00",
   "last_status": "merged",
   "last_result": "merged https://github.com/hkjang/relio/pull/18 (approved)",
   "cost": 52.85,
   "minutes": 125,
   "grade": "D",
   "grade_why": "14일: 릴리즈 12, 실패 0, 경고 5, 회귀 3",
   "lessons": 3,
   "ideas_pending": 14,
   "ideas_total": 17,
   "release": {
    "status": "released",
    "version": "1.11.19",
    "tag": "v1.11.19",
    "assets_count": 1,
    "prev_tag": "v1.11.14",
    "prev_assets_count": 1
   }
  },
  {
   "name": "ReSSO",
   "repo": "https://github.com/hkjang/ReSSO",
   "page": "https://hkjang.github.io/aidev/projects/ReSSO/",
   "runs": 21,
   "released": 13,
   "last_ts": "2026-09-12T12:04:29+09:00",
   "last_status": "other",
   "last_result": "guarded files, PR open https://github.com/hkjang/ReSSO/pull/19",
   "cost": 105.15,
   "minutes": 269,
   "grade": "D",
   "grade_why": "14일: 릴리즈 13, 실패 0, 경고 4, 회귀 1",
   "lessons": 1,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.9.78",
    "tag": "v0.9.78",
    "assets_count": 2,
    "prev_tag": "v0.9.77",
    "prev_assets_count": 2
   }
  },
  {
   "name": "seaton",
   "repo": "https://github.com/hkjang/seaton",
   "page": "https://hkjang.github.io/aidev/projects/seaton/",
   "runs": 1,
   "released": 0,
   "last_ts": "2026-09-11T21:02:40+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/seaton/pull/25",
   "cost": 13.58,
   "minutes": 28,
   "grade": "B",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 5,
   "ideas_total": 6,
   "release": {
    "status": "released",
    "version": "1.4.1",
    "tag": "v1.4.1",
    "assets_count": 1,
    "prev_tag": "v1.4.0",
    "prev_assets_count": 1
   }
  },
  {
   "name": "SecCheck",
   "repo": "https://github.com/hkjang/SecCheck",
   "page": "https://hkjang.github.io/aidev/projects/SecCheck/",
   "runs": 14,
   "released": 0,
   "last_ts": "2026-09-12T12:37:31+09:00",
   "last_status": "other",
   "last_result": "guarded files, PR open https://github.com/hkjang/SecCheck/pull/2",
   "cost": 69.38,
   "minutes": 142,
   "grade": "C",
   "grade_why": "14일: 릴리즈 0, 실패 0, 경고 2, 회귀 0",
   "lessons": 0,
   "ideas_pending": 9,
   "ideas_total": 10,
   "release": {}
  },
  {
   "name": "umm",
   "repo": "https://github.com/hkjang/umm",
   "page": "https://hkjang.github.io/aidev/projects/umm/",
   "runs": 16,
   "released": 10,
   "last_ts": "2026-09-11T08:58:29+09:00",
   "last_status": "other",
   "last_result": "review held, PR open https://github.com/hkjang/umm/pull/151",
   "cost": 42.54,
   "minutes": 132,
   "grade": "A",
   "grade_why": "14일: 릴리즈 10, 실패 0, 경고 0, 회귀 0",
   "lessons": 0,
   "ideas_pending": 15,
   "ideas_total": 17,
   "release": {
    "status": "released",
    "version": "0.71.7",
    "tag": "v0.71.7",
    "assets_count": 3,
    "prev_tag": "v0.71.5",
    "prev_assets_count": 3
   }
  },
  {
   "name": "Vendra",
   "repo": "https://github.com/hkjang/Vendra",
   "page": "https://hkjang.github.io/aidev/projects/Vendra/",
   "runs": 21,
   "released": 13,
   "last_ts": "2026-09-12T13:09:03+09:00",
   "last_status": "other",
   "last_result": "guarded files, PR open https://github.com/hkjang/Vendra/pull/120",
   "cost": 123.44,
   "minutes": 231,
   "grade": "C",
   "grade_why": "14일: 릴리즈 13, 실패 0, 경고 3, 회귀 1",
   "lessons": 1,
   "ideas_pending": 14,
   "ideas_total": 15,
   "release": {
    "status": "released",
    "version": "0.7.50",
    "tag": "v0.7.50",
    "assets_count": 1,
    "prev_tag": "v0.7.49",
    "prev_assets_count": 1
   }
  },
  {
   "name": "vibe-coders",
   "repo": "https://github.com/hkjang/vibe-coders",
   "page": "https://hkjang.github.io/aidev/projects/vibe-coders/",
   "runs": 44,
   "released": 3,
   "last_ts": "2026-09-12T07:12:43+09:00",
   "last_status": "other",
   "last_result": "fix-round: review held, PR open https://github.com/hkjang/vibe-coders/pull/15",
   "cost": 12.86,
   "minutes": 36,
   "grade": "B",
   "grade_why": "14일: 릴리즈 3, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 5,
   "ideas_total": 6,
   "release": {
    "status": "released",
    "version": "0.85.1",
    "tag": "v0.85.1"
   }
  },
  {
   "name": "visitflow",
   "repo": "https://github.com/hkjang/visitflow",
   "page": "https://hkjang.github.io/aidev/projects/visitflow/",
   "runs": 14,
   "released": 6,
   "last_ts": "2026-09-12T10:47:26+09:00",
   "last_status": "released",
   "last_result": "fix-round: merged https://github.com/hkjang/visitflow/pull/12, released v2.7.4",
   "cost": 26.58,
   "minutes": 110,
   "grade": "D",
   "grade_why": "14일: 릴리즈 6, 실패 1, 경고 4, 회귀 0",
   "lessons": 0,
   "ideas_pending": 8,
   "ideas_total": 10,
   "release": {
    "status": "released",
    "version": "2.7.4",
    "tag": "v2.7.4",
    "assets_count": 1,
    "prev_tag": "v2.7.3",
    "prev_assets_count": 1
   }
  },
  {
   "name": "weekly",
   "repo": "https://github.com/hkjang/weekly",
   "page": "https://hkjang.github.io/aidev/projects/weekly/",
   "runs": 17,
   "released": 10,
   "last_ts": "2026-09-11T10:23:34+09:00",
   "last_status": "released",
   "last_result": "merged https://github.com/hkjang/weekly/pull/13, released v0.296.0",
   "cost": 68.05,
   "minutes": 239,
   "grade": "B",
   "grade_why": "14일: 릴리즈 10, 실패 0, 경고 1, 회귀 0",
   "lessons": 0,
   "ideas_pending": 13,
   "ideas_total": 14,
   "release": {
    "status": "released",
    "version": "0.296.0",
    "tag": "v0.296.0",
    "assets_count": 1,
    "prev_tag": "v0.295.0",
    "prev_assets_count": 1
   }
  }
 ]
}