Menu

#187 ci: derive IndexNow key from committed key file (stop silent skips)

closed
nobody
None
2026-06-13
2026-06-13
Anonymous
No

Originally created by: TheoV823

Fix: IndexNow has been silently skipping on every deploy

Diagnosis

scripts/deploy_site.py notifies IndexNow on deploy via submit_indexnow(), which reads the key from INDEXNOW_KEY. But:

  • The deploy workflow (deploy-site.yml) env: block only passes CPANEL_API_TOKEN / CF_API_TOKEN / CF_ZONE_IDnot INDEXNOW_KEY.
  • There is no INDEXNOW_KEY repo secret (confirmed via gh secret list).

So os.environ.get('INDEXNOW_KEY') is always empty and the function takes its [SKIP] branch. No page has ever been submitted to IndexNow. The submission code, the key file (mnemehq.com/43985a40383f4417added3ddee8c8821.txt, verified live HTTP 200), and the sitemap are all otherwise correct.

Fix

The IndexNow key is public by design — it's literally served at the keyLocation URL. So when INDEXNOW_KEY is unset, derive it from the committed key file site/<32 hex>.txt. A repo secret / env var still takes precedence if one is ever added.

  • No secret required; works on the next deploy.
  • Cannot silently skip again (it logs a clear [SKIP] only if neither the env var nor a key file is found).

Verified

  • python -m py_compile scripts/deploy_site.py → OK
  • Key discovery returns exactly ['43985a40383f4417added3ddee8c8821'], correctly ignoring robots.txt / llms.txt.

After this merges, the next deploy (including the wave-3 insights from [#186]) will actually ping IndexNow with the changed URLs.

🤖 Generated with Claude Code

Related

Tickets: #186

Discussion

  • Anonymous

    Anonymous - 2026-06-13

    Originally posted by: github-actions[bot]

    mneme self-governance check

    Mode: warn - verdicts are visible but do not block merge. Rollout plan: .mneme/README.md.

    Summary: 0 pass, 0 warn, 1 fail, 0 unknown

    verdict file
    ❌ FAIL scripts/deploy_site.py

    Details

    scripts/deploy_site.py — FAIL FAIL [deploy_001] anti_pattern "python scripts/deploy_site.py" -- trigger: python deploy_site.py must always be run from the main repo root (C:/dev/mneme), never from a worktree directory FAIL [encoding_001] anti_pattern "Set-Content without -Encoding" -- trigger: content All automation that reads or writes text files must specify the encoding explicitly. UTF-8 for all site, doc, config, and source files in this repo. FAIL [encoding_001] anti_pattern "open() without encoding= in Python" -- trigger: open All automation that reads or writes text files must specify the encoding explicitly. UTF-8 for all site, doc, config, and source files in this repo. FAIL [encoding_001] anti_pattern "writeFileSync without encoding in Node.js" -- trigger: encoding All automation that reads or writes text files must specify the encoding explicitly. UTF-8 for all site, doc, config, and source files in this repo. FAIL [encoding_001] anti_pattern "implicit encoding in any automation file write" -- trigger: encoding All automation that reads or writes text files must specify the encoding explicitly. UTF-8 for all site, doc, config, and source files in this repo. FAIL [site_perf_001] anti_pattern "inline <script> running animation or DOM-mutation logic at parse time" -- trigger: script Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. FAIL [site_perf_001] anti_pattern "container divs with no height before JS populates them" -- trigger: before Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. FAIL [site_perf_001] anti_pattern "synchronous Google Fonts CSS link in <head>" -- trigger: css Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. FAIL [site_perf_001] anti_pattern "backdrop-filter on nav/menus applied unconditionally on mobile (GPU cost)" -- trigger: filter Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. FAIL [site_perf_001] anti_pattern "scripts before <link rel=preconnect> hints" -- trigger: scripts Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. WARN [site_perf_001] constraint "No blocking scripts in <head> before preconnect hints" -- trigger: scripts Site pages with inline JavaScript must defer animations and pre-size dynamic containers to prevent CLS and TBT regressions on mobile. WARN ADR_CHANGED [ADR-001] ADR-001 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-001-positioning-and-messaging.md WARN ADR_CHANGED [ADR-002] ADR-002 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-002-repo-boundary-internal-tooling.md WARN ADR_CHANGED [ADR-003] ADR-003 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-003-site-publishing-guidelines.md WARN ADR_CHANGED [ADR-004] ADR-004 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-004-brand-name-mneme-hq.md WARN ADR_CHANGED [ADR-005] ADR-005 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-005-brand-vs-package-namespace-enforcement.md WARN ADR_CHANGED [ADR-006] ADR-006 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-006-insights-article-seo-requirements.md WARN ADR_CHANGED [ADR-007] ADR-007 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-007-og-image-generation.md WARN ADR_CHANGED [ADR-008] ADR-008 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-008-persona-buyer-page-content-standards.md WARN ADR_CHANGED [ADR-009] ADR-009 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-009-explicit-text-encoding-in-automation.md WARN ADR_CHANGED [ADR-010] ADR-010 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-010-automation-artifact-governance.md WARN ADR_CHANGED [ADR-011] ADR-011 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-011-knowledge-graph-content-architecture.md WARN ADR_CHANGED [ADR-012] ADR-012 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-012-conceptual-authority-discipline.md WARN ADR_CHANGED [ADR-013] ADR-013 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-013-external-platform-presence-standards.md WARN ADR_CHANGED [ADR-014] ADR-014 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-014-harness-complementary-positioning-vocabulary.md WARN ADR_CHANGED [ADR-015] ADR-015 source file changed since import (hash mismatch). Re-run `mneme adr import` to refresh the imported decision. source: ../docs/adr/ADR-015-report-anchored-insight-titles.md Result: FAIL </details> <sub>Generated by `.github/workflows/mneme-check.yml` · query = PR title + file path · scope = repo-governance paths.</sub> <!-- Sticky Pull Request Commentmneme-check --> </script>
     
  • Anonymous

    Anonymous - 2026-06-13

    Ticket changed by: TheoV823

    • status: open --> closed
     

Log in to post a comment.

Auth0 Logo