자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인 - #59

Merged
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd
Sep 1, 2026
Merged

자체 호스팅 이미지가 커밋되지 않아 발행 글이 404되던 원인#59
Kevinlee7250 merged 1 commit into
latestfrom
claude/session-0119g48zqt4k-lwfzrd

Conversation

@Kevinlee7250

Copy link
Copy Markdown
Owner

증상

발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데 그 파일이 저장소에 없습니다(HTTP 404). 독자 화면에서 그림이 깨집니다. image_auditbroken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면 다음 실행에서 또 생깁니다.

원인

글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지 않았습니다.

auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤
Blogger에 발행 (되돌릴 수 없음)
→ 커밋 단계: 소스 파일과 post_drafts 뿐
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐

러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 영구 404입니다. 두 워크플로 모두 내내 초록이었습니다.

막는 방법

두 워크플로가 docs/images/image_mirror.json을 함께 커밋합니다.

재발 방지 검사(test_self_hosted_images_are_committed.py)도 붙였습니다 — 자체 호스팅 경로에 닿는 스크립트를 돌리는 워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고 호출·import 이름으로 계산합니다. 손으로 적으면 새 호출부가 생겼을 때 검사가 조용히 비켜 갑니다.

판정 범위를 좁히는 데 두 번 실패했습니다

  • import 전이 폐포 → 워크플로 31개가 걸려 무의미했습니다. config 하나만 같이 써도 이어집니다.
  • 모듈 단위 한 단계 확장 → 이미지를 전혀 안 받는 shorts_generator·author_profile_check·adsense_audit까지 걸렸습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지 않는다는 것을 코드에서 확인하고 제외했습니다.
  • 지금은 이름 기준으로 85개 중 18개 모듈만 잡습니다.

검사 자체도 한 번 헛돌았습니다

처음에는 워크플로 파일에 경로 문자열이 있는지만 봤습니다. 그런데 제가 넣은 설명 주석에 docs/images가 들어 있어서, git add 줄을 지워도 통과했습니다. 주석을 걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.

확인

  • 새 테스트 70건 (워크플로별 파라미터화)
  • git add -f docs/images/를 양쪽에서 지워 각각 실패 → 복원 후 통과
  • YAML 파싱 유효성 확인
  • 전체 1351 passed, 2 skipped

함께 고친 것

NOT_YET_GENERATED에서 adsense_revenue.json 제거 — 파일이 생성돼 목록이 낡았습니다. 이 커밋 전부터 실패하던 검사이고(origin/latest에서 확인), 검사가 맞는 말을 하고 있어 함께 고쳤습니다.

참고로 그 파일 내용은 available: false이고 사유가 refresh_token에 adsense.readonly 권한이 없습니다입니다. AdSense가 미승인 상태라 급하지는 않지만, 승인 후에는 토큰 재발급이 필요합니다(로컬에서만 가능).

🤖 Generated with Claude Code

https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69


Generated by Claude Code

증상
────
발행된 글 5편 이상이 kevinlee7250.github.io/cli/images/<해시>를 가리키는데
그 파일이 저장소에 없었습니다(HTTP 404). 독자 화면에서 그림이 깨집니다.
image_audit이 broken으로 잡아 썸네일로 강등시키지만, 원인을 막지 않으면
다음 실행에서 또 생깁니다.
원인
────
글을 다시 생성해 발행하는 워크플로 두 개가 이미지 파일을 커밋하지
않았습니다.
auto-repair.yml python main.py --retry
→ retry_failed_posts → generate_post
→ _collect_post_images → fetch_images_for_queries
→ _self_host: docs/images에 파일을 쓰고
본문 src를 우리 도메인으로 바꾼 뒤 Blogger에 발행
→ 커밋 단계에는 소스와 post_drafts만 있음
fix-posts.yml fix_existing_posts.py도 generate_post를 부르는데
커밋 대상은 리포트 3개뿐
러너가 사라지면 파일도 사라집니다. 글은 이미 나갔으니 되돌릴 수 없습니다.
두 워크플로 모두 내내 초록이었습니다.
막는 방법
─────────
두 워크플로가 docs/images/와 image_mirror.json을 함께 커밋합니다.
재발 방지 검사도 붙였습니다. 자체 호스팅 경로에 닿는 스크립트를 돌리는
워크플로는 반드시 그 둘을 커밋해야 합니다. 대상 모듈은 손으로 적지 않고
호출·import 이름으로 계산합니다 — 손으로 적으면 새 호출부가 생겼을 때
조용히 비켜 갑니다.
판정 범위를 좁히는 데 두 번 실패했습니다. import 전이 폐포는 워크플로
31개를 걸어 무의미했고(config 하나만 같이 써도 이어짐), 모듈 단위 한 단계
확장은 이미지를 전혀 안 받는 shorts_generator·author_profile_check까지
걸었습니다. generate_title_thumbnail은 imgbb·data URI를 써서 파일을 남기지
않는다는 것도 코드에서 확인했습니다. 지금은 이름 기준으로 18개 모듈만
잡습니다.
검사 자체도 한 번 헛돌았습니다. 처음에는 파일에 경로 문자열이 있는지만
봐서, 제가 넣은 설명 주석 때문에 git add 줄을 지워도 통과했습니다. 주석을
걷어내고 다시 확인하니 두 워크플로 모두 실패합니다.
함께: NOT_YET_GENERATED에 남아 있던 adsense_revenue.json 제거 — 파일이
생성돼 이 목록이 낡았습니다(이 커밋 전부터 실패하던 검사).
1351 passed, 2 skipped.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RgLYqM9puPW1aqHTccbX69
@Kevinlee7250
Kevinlee7250 marked this pull request as ready for review September 1, 2026 14:39
@Kevinlee7250
Kevinlee7250 merged commit 5818de7 into latestSep 1, 2026
2 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Kevinlee7250@claude