<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba">333Method</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.direnv"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .direnv</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.github"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .github</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.streamlit"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .streamlit</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.vision-comparison-tmp"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .vision-comparison-tmp</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=__quarantined_tests__"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> __quarantined_tests__</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=config"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> config</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=dashboard-v2"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> dashboard-v2</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=dashboard"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> dashboard</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=data"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> data</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=db"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> db</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=docs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=prompts"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> prompts</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=public"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> public</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=scripts"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fadd-agent-error-handling.js"><i class="fa-solid fa-file" style="color:#888;"></i> add-agent-error-handling.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fadd-doc-frontmatter.js"><i class="fa-solid fa-file" style="color:#888;"></i> add-doc-frontmatter.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fai-review.sh"><i class="fa-solid fa-file" style="color:#888;"></i> ai-review.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fanalyze-claude-md.js"><i class="fa-solid fa-file" style="color:#888;"></i> analyze-claude-md.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fanalyze-coverage.js"><i class="fa-solid fa-file" style="color:#888;"></i> analyze-coverage.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fanalyze-keyword-coverage.js"><i class="fa-solid fa-file" style="color:#888;"></i> analyze-keyword-coverage.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fanalyze-screenshot-similarity.js"><i class="fa-solid fa-file" style="color:#888;"></i> analyze-screenshot-similarity.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fapply-filters-to-regions.js"><i class="fa-solid fa-file" style="color:#888;"></i> apply-filters-to-regions.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fautofix-branch.js"><i class="fa-solid fa-file" style="color:#888;"></i> autofix-branch.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-ad-signals.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-ad-signals.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-contacts.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-contacts.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-dataforseo-ads.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-dataforseo-ads.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-keywords.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-keywords.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-language-code.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-language-code.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-real-search-volumes.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-real-search-volumes.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-regex-contacts.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-regex-contacts.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-screenshots.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-screenshots.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbackfill-zenrows-count.js"><i class="fa-solid fa-file" style="color:#888;"></i> backfill-zenrows-count.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbenchmark-captcha-providers.js"><i class="fa-solid fa-file" style="color:#888;"></i> benchmark-captcha-providers.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbenchmark-contact-extraction.js"><i class="fa-solid fa-file" style="color:#888;"></i> benchmark-contact-extraction.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fbenchmark-polish-llms.js"><i class="fa-solid fa-file" style="color:#888;"></i> benchmark-polish-llms.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcalibrate-scorer.js"><i class="fa-solid fa-file" style="color:#888;"></i> calibrate-scorer.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcheck-required-files.sh"><i class="fa-solid fa-file" style="color:#888;"></i> check-required-files.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcheck-rotation-schedule.js"><i class="fa-solid fa-file" style="color:#888;"></i> check-rotation-schedule.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fchromium-nice"><i class="fa-solid fa-file" style="color:#888;"></i> chromium-nice</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fclaude-batch.js"><i class="fa-solid fa-file" style="color:#888;"></i> claude-batch.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fclaude-orchestrator.sh"><i class="fa-solid fa-file" style="color:#888;"></i> claude-orchestrator.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fclaude-store-wrapper.js"><i class="fa-solid fa-file" style="color:#888;"></i> claude-store-wrapper.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fclaude-store.js"><i class="fa-solid fa-file" style="color:#888;"></i> claude-store.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcleanup-bad-phone-contacts.js"><i class="fa-solid fa-file" style="color:#888;"></i> cleanup-bad-phone-contacts.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcleanup-ignored-screenshots.js"><i class="fa-solid fa-file" style="color:#888;"></i> cleanup-ignored-screenshots.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcleanup-region-junk-onetime.js"><i class="fa-solid fa-file" style="color:#888;"></i> cleanup-region-junk-onetime.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcleanup-score-key-pages.js"><i class="fa-solid fa-file" style="color:#888;"></i> cleanup-score-key-pages.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcleanup-stale-jobs.js"><i class="fa-solid fa-file" style="color:#888;"></i> cleanup-stale-jobs.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fclear-keyword-search-volumes.js"><i class="fa-solid fa-file" style="color:#888;"></i> clear-keyword-search-volumes.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcollect-system-metrics.js"><i class="fa-solid fa-file" style="color:#888;"></i> collect-system-metrics.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcompact-contacts-json.js"><i class="fa-solid fa-file" style="color:#888;"></i> compact-contacts-json.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcompare-keywords.js"><i class="fa-solid fa-file" style="color:#888;"></i> compare-keywords.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcompare-one-site.js"><i class="fa-solid fa-file" style="color:#888;"></i> compare-one-site.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcomprehensive-keyword-cleanup.js"><i class="fa-solid fa-file" style="color:#888;"></i> comprehensive-keyword-cleanup.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcreate-locale-templates.js"><i class="fa-solid fa-file" style="color:#888;"></i> create-locale-templates.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcredential-rotation-playbook.md"><i class="fa-solid fa-file" style="color:#888;"></i> credential-rotation-playbook.md</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcredentials-metadata.json"><i class="fa-solid fa-file" style="color:#888;"></i> credentials-metadata.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fcutover-to-pg.sh"><i class="fa-solid fa-file" style="color:#888;"></i> cutover-to-pg.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdb-migrate.js"><i class="fa-solid fa-file" style="color:#888;"></i> db-migrate.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdedupe-domains.js"><i class="fa-solid fa-file" style="color:#888;"></i> dedupe-domains.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdedupe-locale-aware.js"><i class="fa-solid fa-file" style="color:#888;"></i> dedupe-locale-aware.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdedupe-outreaches.js"><i class="fa-solid fa-file" style="color:#888;"></i> dedupe-outreaches.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdedupe-uncropped-screenshots.js"><i class="fa-solid fa-file" style="color:#888;"></i> dedupe-uncropped-screenshots.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdeduplicate-regions.js"><i class="fa-solid fa-file" style="color:#888;"></i> deduplicate-regions.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdeep-code-analysis.js"><i class="fa-solid fa-file" style="color:#888;"></i> deep-code-analysis.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdelete-all-uncropped.js"><i class="fa-solid fa-file" style="color:#888;"></i> delete-all-uncropped.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdemo-file-operations.js"><i class="fa-solid fa-file" style="color:#888;"></i> demo-file-operations.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdemo-immediate-invocation.js"><i class="fa-solid fa-file" style="color:#888;"></i> demo-immediate-invocation.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fdoc-code-check.js"><i class="fa-solid fa-file" style="color:#888;"></i> doc-code-check.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fenrich-meta-ads.js"><i class="fa-solid fa-file" style="color:#888;"></i> enrich-meta-ads.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fensure-dashboard-running.sh"><i class="fa-solid fa-file" style="color:#888;"></i> ensure-dashboard-running.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fexpand-low-keyword-countries.js"><i class="fa-solid fa-file" style="color:#888;"></i> expand-low-keyword-countries.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fexport-business-plan.js"><i class="fa-solid fa-file" style="color:#888;"></i> export-business-plan.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fextract-score-contacts-json.js"><i class="fa-solid fa-file" style="color:#888;"></i> extract-score-contacts-json.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ffilter-long-keywords.js"><i class="fa-solid fa-file" style="color:#888;"></i> filter-long-keywords.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ffix-bad-proposals.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> fix-bad-proposals.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ffix-contacts-phones.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> fix-contacts-phones.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ffix-misrouted-tasks.js"><i class="fa-solid fa-file" style="color:#888;"></i> fix-misrouted-tasks.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-all-keywords.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-all-keywords.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-daily-report.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-daily-report.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-hindi-search-volumes.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-hindi-search-volumes.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-sample-report.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-sample-report.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-templates.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-templates.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fgenerate-tests.js"><i class="fa-solid fa-file" style="color:#888;"></i> generate-tests.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fget-structured-status.js"><i class="fa-solid fa-file" style="color:#888;"></i> get-structured-status.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Finit-code-review-queue.sh"><i class="fa-solid fa-file" style="color:#888;"></i> init-code-review-queue.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Finit-db.js"><i class="fa-solid fa-file" style="color:#888;"></i> init-db.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Finit-ops-db.js"><i class="fa-solid fa-file" style="color:#888;"></i> init-ops-db.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fjira-config.json"><i class="fa-solid fa-file" style="color:#888;"></i> jira-config.json</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fllm-regions-cleanup.js"><i class="fa-solid fa-file" style="color:#888;"></i> llm-regions-cleanup.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fload-secrets-to-env.js"><i class="fa-solid fa-file" style="color:#888;"></i> load-secrets-to-env.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Flog-error-autofix.js"><i class="fa-solid fa-file" style="color:#888;"></i> log-error-autofix.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmanage-profiles.js"><i class="fa-solid fa-file" style="color:#888;"></i> manage-profiles.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmigrate-cron-tasks.js"><i class="fa-solid fa-file" style="color:#888;"></i> migrate-cron-tasks.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmigrate-html-to-filesystem.js"><i class="fa-solid fa-file" style="color:#888;"></i> migrate-html-to-filesystem.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmigrate-screenshots-to-files.js"><i class="fa-solid fa-file" style="color:#888;"></i> migrate-screenshots-to-files.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmigrate-sqlite-to-pg.js"><i class="fa-solid fa-file" style="color:#888;"></i> migrate-sqlite-to-pg.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmonitor-node-processes.sh"><i class="fa-solid fa-file" style="color:#888;"></i> monitor-node-processes.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fmonitoring-checks.sh"><i class="fa-solid fa-file" style="color:#888;"></i> monitoring-checks.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fnotify-cron.js"><i class="fa-solid fa-file" style="color:#888;"></i> notify-cron.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fnpm-logger.js"><i class="fa-solid fa-file" style="color:#888;"></i> npm-logger.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Foptimize-claude-md.js"><i class="fa-solid fa-file" style="color:#888;"></i> optimize-claude-md.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fovernight-coverage-monitor.js"><i class="fa-solid fa-file" style="color:#888;"></i> overnight-coverage-monitor.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fovernight-enrich.sh"><i class="fa-solid fa-file" style="color:#888;"></i> overnight-enrich.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fpark-reword-backlog.js"><i class="fa-solid fa-file" style="color:#888;"></i> park-reword-backlog.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fpaypal-mcp.sh"><i class="fa-solid fa-file" style="color:#888;"></i> paypal-mcp.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fpg-health-check.sh"><i class="fa-solid fa-file" style="color:#888;"></i> pg-health-check.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fpipeline-progress-report.js"><i class="fa-solid fa-file" style="color:#888;"></i> pipeline-progress-report.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fpost-restore-migrate.py"><i class="fa-solid fa-file" style="color:#888;"></i> post-restore-migrate.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fprocess-keyword.js"><i class="fa-solid fa-file" style="color:#888;"></i> process-keyword.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fquality-check.js"><i class="fa-solid fa-file" style="color:#888;"></i> quality-check.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frate-limits.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> rate-limits.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frecommend-threshold.js"><i class="fa-solid fa-file" style="color:#888;"></i> recommend-threshold.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Freconcile-sent-history.py"><i class="fa-solid fa-file" style="color:#888;"></i> reconcile-sent-history.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Freexport-sheet.js"><i class="fa-solid fa-file" style="color:#888;"></i> reexport-sheet.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frefresh-backlog.js"><i class="fa-solid fa-file" style="color:#888;"></i> refresh-backlog.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frepair-translated-templates.js"><i class="fa-solid fa-file" style="color:#888;"></i> repair-translated-templates.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Freset-agent-circuit-breakers.js"><i class="fa-solid fa-file" style="color:#888;"></i> reset-agent-circuit-breakers.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Freset-failing-sites.js"><i class="fa-solid fa-file" style="color:#888;"></i> reset-failing-sites.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Freset-transient-failures.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> reset-transient-failures.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frestore-json-from-backup.js"><i class="fa-solid fa-file" style="color:#888;"></i> restore-json-from-backup.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fretranslate-broken.js"><i class="fa-solid fa-file" style="color:#888;"></i> retranslate-broken.js</a></li><li><a class="nav-link py-0 active" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-affected-tests.sh"><i class="fa-solid fa-file" style="color:#888;"></i> run-affected-tests.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-agent-session.sh"><i class="fa-solid fa-file" style="color:#888;"></i> run-agent-session.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-cron-job.js"><i class="fa-solid fa-file" style="color:#888;"></i> run-cron-job.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-e2e-outreach-only.js"><i class="fa-solid fa-file" style="color:#888;"></i> run-e2e-outreach-only.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-enrich-batch.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> run-enrich-batch.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-full-pipeline.js"><i class="fa-solid fa-file" style="color:#888;"></i> run-full-pipeline.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Frun-with-logging.sh"><i class="fa-solid fa-file" style="color:#888;"></i> run-with-logging.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsage-auto-fix.js"><i class="fa-solid fa-file" style="color:#888;"></i> sage-auto-fix.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsave-test-results.js"><i class="fa-solid fa-file" style="color:#888;"></i> save-test-results.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsecurity-cron.js"><i class="fa-solid fa-file" style="color:#888;"></i> security-cron.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsecurity-scan.js"><i class="fa-solid fa-file" style="color:#888;"></i> security-scan.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsend-test-email.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> send-test-email.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fspintax-grammar-check.js"><i class="fa-solid fa-file" style="color:#888;"></i> spintax-grammar-check.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fstrip-sms-optout.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> strip-sms-optout.mjs</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fsync-keyword-counters.js"><i class="fa-solid fa-file" style="color:#888;"></i> sync-keyword-counters.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-circuit-breaker-manual.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-circuit-breaker-manual.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-deduplication.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-deduplication.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-file-ops-coverage.sh"><i class="fa-solid fa-file" style="color:#888;"></i> test-file-ops-coverage.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-model-selection.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-model-selection.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-resend-webhook-sig.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-resend-webhook-sig.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-sharp-autocrop.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-sharp-autocrop.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-social-extraction.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-social-extraction.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-spintax.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-spintax.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-with-clean-env.sh"><i class="fa-solid fa-file" style="color:#888;"></i> test-with-clean-env.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftest-yelp-nopecha.js"><i class="fa-solid fa-file" style="color:#888;"></i> test-yelp-nopecha.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Ftop-node-processes.sh"><i class="fa-solid fa-file" style="color:#888;"></i> top-node-processes.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Funified-autofix.js"><i class="fa-solid fa-file" style="color:#888;"></i> unified-autofix.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fupdate-cultural-pricing.js"><i class="fa-solid fa-file" style="color:#888;"></i> update-cultural-pricing.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fupdate-dependencies.js"><i class="fa-solid fa-file" style="color:#888;"></i> update-dependencies.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fupdate-doc-links.sh"><i class="fa-solid fa-file" style="color:#888;"></i> update-doc-links.sh</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fupdate-stale-docs.js"><i class="fa-solid fa-file" style="color:#888;"></i> update-stale-docs.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fvalidate-contacts.js"><i class="fa-solid fa-file" style="color:#888;"></i> validate-contacts.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fvalidate-email-queue.js"><i class="fa-solid fa-file" style="color:#888;"></i> validate-email-queue.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fvalidate-test-runner.js"><i class="fa-solid fa-file" style="color:#888;"></i> validate-test-runner.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fverify-slo-tracker.js"><i class="fa-solid fa-file" style="color:#888;"></i> verify-slo-tracker.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fvision-scoring-comparison.js"><i class="fa-solid fa-file" style="color:#888;"></i> vision-scoring-comparison.js</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=scripts%2Fweekly-maintenance.sh"><i class="fa-solid fa-file" style="color:#888;"></i> weekly-maintenance.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=src"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> src</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=tests"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tests</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=workers"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> workers</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.c8rc.json"><i class="fa-solid fa-file" style="color:#888;"></i> .c8rc.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.env.agents.example"><i class="fa-solid fa-file" style="color:#888;"></i> .env.agents.example</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.env.example"><i class="fa-solid fa-file" style="color:#888;"></i> .env.example</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.env.secrets.example"><i class="fa-solid fa-file" style="color:#888;"></i> .env.secrets.example</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.envrc"><i class="fa-solid fa-file" style="color:#888;"></i> .envrc</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.eslintignore"><i class="fa-solid fa-file" style="color:#888;"></i> .eslintignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=.nvmrc"><i class="fa-solid fa-file" style="color:#888;"></i> .nvmrc</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=AGENT_ACTIVATION_READY.md"><i class="fa-solid fa-file" style="color:#888;"></i> AGENT_ACTIVATION_READY.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=CHANGELOG.md"><i class="fa-solid fa-file" style="color:#888;"></i> CHANGELOG.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=CIRCUIT_BREAKER_RESET_SUMMARY.md"><i class="fa-solid fa-file" style="color:#888;"></i> CIRCUIT_BREAKER_RESET_SUMMARY.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=CLAUDE.md"><i class="fa-solid fa-file" style="color:#888;"></i> CLAUDE.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=SKIP_STAGES_IMPLEMENTATION.md"><i class="fa-solid fa-file" style="color:#888;"></i> SKIP_STAGES_IMPLEMENTATION.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=TODO-promptfoo.md"><i class="fa-solid fa-file" style="color:#888;"></i> TODO-promptfoo.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=TODO.md"><i class="fa-solid fa-file" style="color:#888;"></i> TODO.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=debug-outreach.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> debug-outreach.mjs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=debug-outreach2.mjs"><i class="fa-solid fa-file" style="color:#888;"></i> debug-outreach2.mjs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=eslint.config.js"><i class="fa-solid fa-file" style="color:#888;"></i> eslint.config.js</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=package-lock.json"><i class="fa-solid fa-file" style="color:#888;"></i> package-lock.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=package.json"><i class="fa-solid fa-file" style="color:#888;"></i> package.json</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=screenshots"><i class="fa-solid fa-file" style="color:#888;"></i> screenshots</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=setup.sh"><i class="fa-solid fa-file" style="color:#888;"></i> setup.sh</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&file=shell.nix"><i class="fa-solid fa-file" style="color:#888;"></i> shell.nix</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=.">/</a> <a href="/cgi-bin/repo?id=z35SRFa8pWxWxGAnc569Lmagrhgba&source=scripts">scripts</a> / run-affected-tests.sh</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> run-affected-tests.sh</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;"> 1</span>  #!/bin/bash
<span style="color:#666; user-select:none;"> 2</span>  # run-affected-tests.sh — Run only tests affected by changed source files.
<span style="color:#666; user-select:none;"> 3</span>  #
<span style="color:#666; user-select:none;"> 4</span>  # Usage:
<span style="color:#666; user-select:none;"> 5</span>  #   ./scripts/run-affected-tests.sh                   # Tests for uncommitted changes
<span style="color:#666; user-select:none;"> 6</span>  #   ./scripts/run-affected-tests.sh HEAD~3             # Tests for last 3 commits
<span style="color:#666; user-select:none;"> 7</span>  #   ./scripts/run-affected-tests.sh src/utils/foo.js   # Tests for a specific file
<span style="color:#666; user-select:none;"> 8</span>  #
<span style="color:#666; user-select:none;"> 9</span>  # Mapping: src/X/Y.js → tests/X/Y*.test.js (glob catches .test.js, .integration.test.js, etc.)
<span style="color:#666; user-select:none;">10</span>  # Skips c8 coverage (coverage only matters on full suite).
<span style="color:#666; user-select:none;">11</span>  # Exit 0 if no matching tests found (not every file has tests).
<span style="color:#666; user-select:none;">12</span>  
<span style="color:#666; user-select:none;">13</span>  set -euo pipefail
<span style="color:#666; user-select:none;">14</span>  cd &quot;$(dirname &quot;$0&quot;)/..&quot;
<span style="color:#666; user-select:none;">15</span>  
<span style="color:#666; user-select:none;">16</span>  # Determine which source files changed
<span style="color:#666; user-select:none;">17</span>  if [ $# -eq 0 ]; then
<span style="color:#666; user-select:none;">18</span>    # Uncommitted changes (staged + unstaged)
<span style="color:#666; user-select:none;">19</span>    changed=$(git diff --name-only HEAD 2&gt;/dev/null || git diff --name-only)
<span style="color:#666; user-select:none;">20</span>  elif [ -f &quot;$1&quot; ]; then
<span style="color:#666; user-select:none;">21</span>    # Explicit file path(s)
<span style="color:#666; user-select:none;">22</span>    changed=&quot;$*&quot;
<span style="color:#666; user-select:none;">23</span>  else
<span style="color:#666; user-select:none;">24</span>    # Git ref (e.g., HEAD~3, main..HEAD)
<span style="color:#666; user-select:none;">25</span>    changed=$(git diff --name-only &quot;$1&quot;)
<span style="color:#666; user-select:none;">26</span>  fi
<span style="color:#666; user-select:none;">27</span>  
<span style="color:#666; user-select:none;">28</span>  # Filter to src/ JS files only, skip agents/ (being replaced)
<span style="color:#666; user-select:none;">29</span>  src_files=$(echo &quot;$changed&quot; | grep &#x27;^src/&#x27; | grep &#x27;\.js$&#x27; | grep -v &#x27;^src/agents/&#x27; || true)
<span style="color:#666; user-select:none;">30</span>  
<span style="color:#666; user-select:none;">31</span>  if [ -z &quot;$src_files&quot; ]; then
<span style="color:#666; user-select:none;">32</span>    echo &quot;No src/ JS files changed (excluding src/agents/). Nothing to test.&quot;
<span style="color:#666; user-select:none;">33</span>    exit 0
<span style="color:#666; user-select:none;">34</span>  fi
<span style="color:#666; user-select:none;">35</span>  
<span style="color:#666; user-select:none;">36</span>  # Map source files to test files
<span style="color:#666; user-select:none;">37</span>  test_files=&quot;&quot;
<span style="color:#666; user-select:none;">38</span>  while IFS= read -r src_file; do
<span style="color:#666; user-select:none;">39</span>    # src/utils/rate-limiter.js → tests/utils/rate-limiter
<span style="color:#666; user-select:none;">40</span>    base=&quot;${src_file#src/}&quot;        # utils/rate-limiter.js
<span style="color:#666; user-select:none;">41</span>    base=&quot;${base%.js}&quot;             # utils/rate-limiter
<span style="color:#666; user-select:none;">42</span>    # Glob for all test variants
<span style="color:#666; user-select:none;">43</span>    matches=$(find tests/ -path &quot;tests/${base}*.test.js&quot; 2&gt;/dev/null || true)
<span style="color:#666; user-select:none;">44</span>    if [ -n &quot;$matches&quot; ]; then
<span style="color:#666; user-select:none;">45</span>      test_files=&quot;$test_files $matches&quot;
<span style="color:#666; user-select:none;">46</span>    fi
<span style="color:#666; user-select:none;">47</span>  done &lt;&lt;&lt; &quot;$src_files&quot;
<span style="color:#666; user-select:none;">48</span>  
<span style="color:#666; user-select:none;">49</span>  # Deduplicate and trim
<span style="color:#666; user-select:none;">50</span>  test_files=$(echo &quot;$test_files&quot; | tr &#x27; &#x27; &#x27;\n&#x27; | sort -u | grep -v &#x27;^$&#x27; || true)
<span style="color:#666; user-select:none;">51</span>  
<span style="color:#666; user-select:none;">52</span>  if [ -z &quot;$test_files&quot; ]; then
<span style="color:#666; user-select:none;">53</span>    echo &quot;Changed src files:&quot;
<span style="color:#666; user-select:none;">54</span>    echo &quot;$src_files&quot; | sed &#x27;s/^/  /&#x27;
<span style="color:#666; user-select:none;">55</span>    echo &quot;No matching test files found. Skipping.&quot;
<span style="color:#666; user-select:none;">56</span>    exit 0
<span style="color:#666; user-select:none;">57</span>  fi
<span style="color:#666; user-select:none;">58</span>  
<span style="color:#666; user-select:none;">59</span>  count=$(echo &quot;$test_files&quot; | wc -l)
<span style="color:#666; user-select:none;">60</span>  echo &quot;Running $count affected test file(s):&quot;
<span style="color:#666; user-select:none;">61</span>  echo &quot;$test_files&quot; | sed &#x27;s/^/  /&#x27;
<span style="color:#666; user-select:none;">62</span>  echo &quot;&quot;
<span style="color:#666; user-select:none;">63</span>  
<span style="color:#666; user-select:none;">64</span>  # Run without c8 coverage (coverage only matters on full suite)
<span style="color:#666; user-select:none;">65</span>  # shellcheck disable=SC2086
<span style="color:#666; user-select:none;">66</span>  NODE_ENV=test LOGS_DIR=/tmp/test-logs DATABASE_PATH=/tmp/test-sites.db \
<span style="color:#666; user-select:none;">67</span>    node --experimental-test-module-mocks --test $test_files
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

