🔴Astro 의 <!-- --> 주석은 배포본 HTML 에 그대로 실려 나간다 — Phase 1 에 넣은 내부 전략 주석 2개(하나는 src/data/noindex.js 를 지목)가 44개 페이지 전부에 실려 있었다(26.9.8 배포 후 발견). 렌더에서 빼려면 {/* ... */} 를 쓴다. 심사 중인 사이트의 공개 소스에 우리 판단 근거를 실을 이유가 없다. 점검 = 배포 전 grep -r "<!--" dist --include=index.html.
에이전트가 보고한 단어수는 믿지 마라 — 4개 에이전트가 각각 다른 방법(frontmatter 포함 여부·FAQ 포함 여부·SVG 라벨 누락)으로 세서 실제보다 크게 나왔다. 정본은 배포된 HTML 을 <script>·<style>·<svg> 제거 후 단어 세기. 같은 잣대로 재야 정본(sulfuric 2,639)과 비교가 된다.
콘텐츠 에이전트를 여럿 병렬로 돌릴 땐 npm run build 를 금지시킨다 — 같은 디렉터리에서 동시 빌드하면 dist 가 꼬인다. 문법 확인은 「파일 재읽기 + 태그 균형 카운트」로 시키고 빌드는 부모가 마지막에 한 번.
🔑워크드 예제 검산은 「계산기 JS 를 복제해 기존 예제로 복제본부터 검증」이 정석 — tank-volume 에이전트가 이 순서로 해서 신뢰할 수 있었고, roll 에이전트는 이 방식으로 기존 페이지의 오류(화장지 226.3→226.2 ft) 까지 잡았다. 새 숫자만 계산하면 복제가 맞는지 알 수 없다.
noindex 는 「메타 하나」가 아니라 4곳 동시 작업이다 — ①<meta robots noindex,follow> ②sitemap 에서 제거(남기면 GSC 가 「제출된 URL에 noindex 태그」 오류로 찍는다) ③내부링크 제거(nav·허브 otherHubs·인덱스 목록·Related) ④AdSense 스크립트 미주입. 코덱스 근거 = AdSense 는 별도 봇으로 사이트 전체를 심사하므로 색인에서 빼는 것만으론 저가치 점수에서 안 빠진다. 검증은 빌드 산출물에서 「색인 페이지→noindex 슬러그 인바운드 = 0」 으로 센다(소스 grep 은 홈처럼 다른 형태로 링크하는 곳을 놓친다).
⛔robots.txtDisallow 로 걷어내지 마라 — 크롤을 막으면 구글이 noindex 태그를 못 읽어 이미 색인된 페이지가 「robots.txt 차단됨」 상태로 색인에 남는다. meta 가 정답.
파일을 지워도 사이트에서 안 사라진다 — C:\dev\tools\pinterest-pins\deploy_site.py 는 업로드만 하고 S3 에서 삭제하지 않는다. 소스에서 페이지를 지워도 옛 index.html 이 계속 200 으로 서빙된다. 걷어내기는 noindex 로 하고, 진짜 삭제가 필요하면 별도 s3 rm 을 짜야 한다.
🔴승인 후 site\src\components\AdSlot.astro 의 ADS_ENABLED 를 true 로 되돌려야 한다 — 심사 중 빈 광고자리를 안 보여주려고 false 로 껐다. 잊으면 승인돼도 광고가 영영 안 켜진다.
🔴콘솔의 Ads.txt 「찾을 수 없음」 은 결격이 아니다 — 콘솔 캐시 지연이다(7/25·8/18·9/8 세 번 반복 확인). 판정은 언제나 라이브 curl 로: curl -s https://<도메인>/ads.txt 가 200 + google.com, pub-…, DIRECT, f08c47fec0942fa0 이면 정상. 콘솔 표시로 결격을 진단해 헛수고하지 말 것.
AdSense 「준비 중」은 승인 신호가 아니다 — calcucalcu.com 은 8/18 제출 후 21일간 「준비 중」이다가 9/8 에 거절됐다. 「준비 중」은 그냥 검토 큐에 있다는 뜻이고, 그 사이 사이트를 동결해 둔 21일은 콘텐츠가 정체된 시간으로 계산된다.
신규 URL 색인 여부는 SC URL Inspection API(REST)로 직접 본다 — POST https://searchconsole.googleapis.com/v1/urlInspection/index:inspect, body {inspectionUrl, siteUrl:"sc-domain:<도메인>", languageCode:"ko"}, 토큰 = C:\dev\tools\site-analytics\key.json 의 SA + scope webmasters.readonly(SA 로 되는 경로다 — 403 나는 건 sitemaps 쪽뿐). ⚠두 번 돌리면 결과가 조금 흔들린다(라이브 크롤 조회) → 「색인/미색인」 비율로만 읽는다. ⚠스크립트 파일명을 inspect.py 로 지으면 stdlib inspect 를 가려 asyncio 임포트가 깨진다(실측) — 다른 이름으로.
🔑「가치가 별로 없는 콘텐츠」에 페이지 수로 대응하면 역효과 — roll 을 34→44 URL 로 증설(26.9.3)한 5일 뒤 실측: 신규 10 URL 색인 0/10 · 평균순위 47.8→54.0 악화 · GA 사용자 반토막. 이 판정은 사이트 평균 품질로 매겨지므로 얇은 페이지를 더 붓는 것은 평균을 내린다. 정공법은 덜어내기(노출 붙는 클러스터만 남기고 얇은 도구는 noindex).
🆕 신규 (2026-09-03)
🔴리포를 복사해 만든 자매 사이트는 robots.txt·astro.config 의 도메인이 원본으로 남는다 — calcucalcu.com/robots.txt 의 Sitemap: 줄이 rollcalculator.com 을 가리킨 채 배포돼 있었다(26.9.3 실측). 크로스도메인 사이트맵은 구글이 무시하므로 자기 사이트맵을 robots 로 알린 적이 없는 상태가 된다. 새 사이트 포크 시 grep -rn "<원본도메인>" site/public site/src 를 배포 전 1회.
/sitemap.xml 은 존재하지 않는다 — Astro sitemap 통합의 정본은 /sitemap-index.xml(+sitemap-0.xml). CF 라우터가 없는 경로를 404.html 로 보내면서 200 + HTML(soft 404) 을 반환하니, 사이트맵 점검은 sitemap.xml 이 아니라 sitemap-index.xml 로 확인할 것.
🔴코디 Bash 에서 chrome.exe 를 직접 띄우면 Session 0 에 뜬다 = 페페 화면에 안 보인다(26.9.3 실측). 창은 살아 있고 CDP 도 붙지만 IsWindowVisible=0, ShowWindow 로도 안 나온다. 판정 = GetSystemMetrics(0/1) 이 1024×768 이면 그 창은 Session 0 이다(페페 화면 해상도가 아니다). 정답 = 「대화형만」(/IT) 예약작업으로 띄운다. ⚠전용 상비 작업은 두지 않는다 — cody_hailuo_cdp 는 트리거 없는 수동 런처라 26.9.3 페페 지시로 폐기했다. 필요할 때 일회성으로 만들고 바로 지운다: schtasks /Create /TN Cody\CDP-Once /TR "wscript.exe \"C:\dev\tools\cdp-profiles\launch_delix0731_hidden.vbs\"" /SC ONCE /ST 00:00 /SD 2030/01/01 /IT /F → /Run → /Delete /F(MSYS 경로변환 차단 필수). 띄우기 전 기존 Session 0 크롬은 프로필 락 때문에 먼저 죽여야 한다(같은 --user-data-dir 프로세스 전량 kill). 확인 = Session 0 의 EnumWindows 에 그 pid 창이 안 보이면 Session 1 에 뜬 것.
AdSense 콘솔 실측은 9334 구글 세션이 살아 있을 때만 된다 — 세션은 조용히 만료된다(26.9.3 = 로그아웃 상태). 판정 = myaccount.google.com 열어 로그인 화면이면 만료. 재로그인은 페페 몫(2FA·봇감지 → 코디 자동로그인은 위험항목). 쿠키 파일이 존재하는 것은 세션 생존의 증거가 아니다.
SC 사이트맵 제출 상태는 서비스계정으로 못 본다 — site-analytics SA 는 searchanalytics 만 되고 webmasters/v3/sites/*/sitemaps 는 403(소유자 권한 필요). 색인·사이트맵 확인이 필요하면 콘솔 로그인 경로로 간다.
Bash 도구에서 Windows CLI 호출 시 MSYS 경로변환 함정 2종 — ①schtasks /Create 같은 슬래시 옵션이 C:/Program Files/Git/Create로 치환된다 ②test-function 이벤트의 /about 같은 URI 인자도 치환된다. 둘 다 export MSYS_NO_PATHCONV=1 MSYS2_ARG_CONV_EXCL='*'로 해결. schtasks /SD는 yyyy/mm/dd(mm/dd/yyyy는 "잘못된 날짜" 오류).
정적 사이트 URL은 슬래시 유무 중 하나만 200이어야 한다 — 확장자 없는 경로를 +'/index.html' 리라이트하면 /about·/about/ 둘 다 200이 되어 서치콘솔이 "적절한 표준 태그가 포함된 대체 페이지"로 잡는다(색인 결격은 아니나 크롤예산 낭비). 301 리다이렉트로 통일하고, 리다이렉트 시 쿼리스트링 재조립을 잊지 말 것(utm 유실).
AdSense 저가치(Low value content) 판정 보완 4종 = ①정책 페이지 결손(Terms) ②운영자 익명 → 필명이라도 구체 경력+검토일+정정 정책 ③도구만 있고 읽을거리 0 → 도구와 다른 기사형 레이아웃 장문 가이드 ④수요 증거 = 시간(재신청은 보완 배포 후 3주 이상 숙성). 재신청 '검토 요청' 클릭은 자동화 금지(외부 제출·CDP 세션 만료 위험) — 예약작업은 사전점검+알림까지만.
Playwright/CDP 스크립트는 Python312 절대경로로 실행 — C:\Users\delix\AppData\Local\Programs\Python\Python312\python.exe + PYTHONUTF8=1. ※~~Bash의 python은 hermes venv(3.11)라 playwright 없음~~ = 2026-07-27 hermes 전면폐기로 무효. 이제 PATH python = Python312라 bare로도 되지만, 절대경로 유지(PATH 1순위가 또 바뀔 수 있음 — 이번 사고의 교훈).
Pinterest 웹 UI 자동화 3함정: ①입력필드는 fill('') 후 타이핑(잔존값에 이어붙어 도메인이 깨짐) ②브라우저확장 설치 권유 모달이 "게시" 클릭을 가로챔 → 닫기 선클릭 ③pin_count API 반영이 최대 1분 지연 → 즉시 성공판정하면 재시도로 중복 게시(스팸신호). 시도 즉시 큐에서 빼고 폴링으로 판정.
Trial 액세스에서도 DELETE /v5/pins/<id>는 통과(204) — 막히는 건 프로덕션 생성뿐. 잘못 올라간 핀 정리는 API로 가능.
Pinterest 도메인 클레임 코드는 계정당 1개 공통 — 도메인마다 다르지 않다. 같은 p:domain_verify 값을 양 사이트 head에 넣고 각각 클레임.