From ea65f10736c4fbfad9111d19db86cce0ade8536c Mon Sep 17 00:00:00 2001 From: uipreliga Date: Tue, 28 Jul 2026 12:58:56 -0700 Subject: [PATCH 1/6] chore(pages): replace the gh-pages docs mirror with a link stub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MkDocs build published to gh-pages was a second live copy of docs/, duplicating coder-eval.com/docs. Both copies self-canonicalized, which splits search signals and lets the wrong host rank for our own docs — and the mirror had drifted, still serving BYOD/ and CODEX_AGENT_GUIDE/ after those pages were renamed upstream, with a sitemap.xml advertising all 14 stale URLs for indexing. Replace it with a single static page linking to coder-eval.com/docs, the project site, and the repo. Pages serves 404.html for unknown paths, so the same stub catches every old deep URL without a file per route. It carries `noindex, follow` rather than a canonical pointing at /docs: the stub's content differs from the target, and Google discourages combining noindex with rel=canonical and ignores canonicals across substantially different pages. Net effect: the duplicate cluster drops to zero indexed pages. The mkdocs gh-deploy step is removed, not commented out — left one uncomment away, a future run would silently restore the duplicate. mkdocs itself stays: mkdocs.yml remains the docs IA source of truth (CE028 generates the index surfaces from its nav:, the website derives its sidebar from it) and `mkdocs build` still verifies anchors locally. Only the publishing of a second site is gone. gh-pages is force-replaced with a fresh single-commit history so none of the old output — sitemap included — survives. Verified: workflow YAML parses, the assemble step dry-run produces index.html/404.html/.nojekyll/llms.txt, all three links return 200, the page renders in light and dark, and `make lint` passes (166). Co-Authored-By: Claude --- .github/pages-stub/index.html | 122 ++++++++++++++++++++++++++++++++++ .github/workflows/docs.yml | 86 +++++++++++++++--------- 2 files changed, 176 insertions(+), 32 deletions(-) create mode 100644 .github/pages-stub/index.html diff --git a/.github/pages-stub/index.html b/.github/pages-stub/index.html new file mode 100644 index 00000000..43b3f17d --- /dev/null +++ b/.github/pages-stub/index.html @@ -0,0 +1,122 @@ + + + + + + Coder Eval documentation has moved + + + + + + + +
+

Coder Eval documentation has moved

+

The documentation is now published at coder-eval.com.

+ +
+ + diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fb49ef7d..071cee59 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,26 +1,29 @@ -name: Docs +name: Pages stub -# Build the MkDocs Material site and publish it to the `gh-pages` branch via -# `mkdocs gh-deploy` — the same mechanism UiPath/uipath-python uses. This workflow -# only pushes a branch (needs `contents: write`); it never calls the Pages API, so -# it succeeds even before Pages is switched on. +# Publishes `.github/pages-stub/` to the `gh-pages` branch, which GitHub Pages +# serves at https://uipath.github.io/coder_eval/. # -# One-time setup (org owner): the UiPath org blocks Pages *creation*, so enable -# Pages for this repo once — Settings → Pages → Build and deployment → -# Source: "Deploy from a branch" → branch `gh-pages` / `/ (root)`. That's the same -# (legacy, branch-based) configuration uipath-python already runs on. +# This workflow used to run `mkdocs gh-deploy`, publishing a full second copy of +# docs/ here. That was a duplicate of coder-eval.com/docs: both copies declared +# themselves canonical, which splits search signals and lets the wrong host rank — +# and the mirror drifted, serving pages (BYOD, CODEX_AGENT_GUIDE) that had been +# renamed upstream. The docs are now published only at coder-eval.com/docs, synced +# from docs/ by the website's scripts/sync-docs.mjs. +# +# The mkdocs deploy is REMOVED rather than commented out: leaving it one +# uncomment away meant a future run would silently restore the duplicate. mkdocs +# itself is still used — `mkdocs.yml` remains the docs IA source of truth (CE028 +# generates the index surfaces from its `nav:`, and the website derives its +# sidebar from it), and `mkdocs build` is still the way to verify anchors locally. +# What's gone is only the *publishing* of a second site. +# +# The gh-pages branch is force-replaced with the stub on each run, so the stale +# MkDocs output — including its sitemap.xml, which was still advertising the old +# URLs for indexing — is cleared rather than left alongside. +# +# Manual-only by design: the stub changes about once a year. Run it from the +# Actions tab when the stub itself changes. on: - # Auto-publish on push is DISABLED: GitHub Pages is not yet enabled for this - # repo on uipath.github.io (org owner must switch it on once — Settings → Pages - # → Deploy from a branch → gh-pages / root). The published docs currently serve - # from coder-eval.com/docs (synced separately by the website), so the gh-pages - # deploy is not needed yet. Re-enable by uncommenting the `push:` trigger below. - # push: - # branches: [main] - # paths: - # - "docs/**" - # - "mkdocs.yml" - # - ".github/workflows/docs.yml" workflow_dispatch: permissions: @@ -35,19 +38,38 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: "3.13" - - name: Install social-card system libraries + + - name: Assemble the published tree run: | - sudo apt-get update - sudo apt-get install -y --no-install-recommends \ - libcairo2 libfreetype6 libjpeg-turbo8 libpng16-16 pngquant - - name: Install MkDocs Material - run: pip install "mkdocs-material[imaging]>=9.5,<10" - - name: Configure git identity for gh-pages commits + set -euo pipefail + out="$(mktemp -d)" + cp .github/pages-stub/index.html "$out/index.html" + # Pages serves 404.html for any unknown path, so the same stub catches + # every old deep URL (/USER_GUIDE/, /tutorials/01-.../, …) without + # needing a file per route. + cp .github/pages-stub/index.html "$out/404.html" + # Without .nojekyll, Pages runs the tree through Jekyll, which strips + # files and directories whose names begin with an underscore. + touch "$out/.nojekyll" + # The old MkDocs llms.txt lived here and is referenced from the site's + # /llms.txt history; a .txt cannot meta-refresh, so point it in prose. + printf '# Coder Eval\n\nThe documentation moved to https://coder-eval.com/docs\n\nllms.txt: https://coder-eval.com/llms.txt\nFull docs in one file: https://coder-eval.com/llms-full.txt\n' \ + > "$out/llms.txt" + echo "OUT_DIR=$out" >> "$GITHUB_ENV" + + - name: Force-replace gh-pages with the stub + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | + set -euo pipefail + cd "$OUT_DIR" + git init -q -b gh-pages git config user.name "coder-eval" git config user.email "coder-eval@uipath.com" - - name: Build strictly and publish to gh-pages - run: mkdocs gh-deploy --force --strict + git add -A + git commit -qm "Publish Pages stub redirecting to coder-eval.com/docs" + # A fresh single-commit history, force-pushed: gh-pages is a build + # artifact, so there is no history worth preserving, and this guarantees + # none of the old MkDocs output survives. + git push --force \ + "https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" gh-pages From b26b5b66cfde710a560c1db7c050c9fa47c298c4 Mon Sep 17 00:00:00 2001 From: uipreliga Date: Tue, 28 Jul 2026 13:04:14 -0700 Subject: [PATCH 2/6] chore(pages): add the brand logo and a repo status bar to the stub MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dresses up the redirect stub so it reads as ours rather than as a bare fallback: the Coder Eval wordmark above the heading, and a brand-orange bar linking to the repo with its star and fork counts. The wordmark is inlined from the website's src/assets/logo-light.svg rather than linked. The light and dark variants differ only in four navy fills (the three icon bars and the "Coder" text group — "Eval" and the arc are always brand orange), so those four become `currentColor` and one 3.5 KB copy serves both colour schemes. Substitution was scripted, not hand-typed, and asserts it recoloured exactly four fills and left the orange intact. Keeps the page free of external stylesheets, fonts, and images. Palette switched from approximations to the real brand values taken from those assets: #FA4616 orange, #10233A navy, #F5F7FA off-white. Star/fork counts ship as a committed snapshot so the bar is never blank, then refresh from api.github.com on load. Unauthenticated is 60 req/hour/IP, ample for a page nobody should land on, and any failure silently leaves the snapshot. GitHub's own octicon paths are inlined for the mark, star, and fork glyphs. Verified in-browser: renders in both colour schemes (dark @media rule deleted at runtime to confirm the light path), and the refresh was proven to work by poisoning the counts to 999 and watching the fetch restore 107/2. Co-Authored-By: Claude --- .github/pages-stub/index.html | 139 +++++++++++++++++++++++++++++----- 1 file changed, 121 insertions(+), 18 deletions(-) diff --git a/.github/pages-stub/index.html b/.github/pages-stub/index.html index 43b3f17d..4e941348 100644 --- a/.github/pages-stub/index.html +++ b/.github/pages-stub/index.html @@ -20,24 +20,33 @@ noindex with rel=canonical and ignores canonicals across substantially different pages. noindex keeps the stub out of the index while its links are still followed. + + Self-contained by design: the logo is inlined from the website's + src/assets/logo-light.svg with its navy fills swapped to `currentColor` + (the "Eval" wordmark and the icon arc stay brand orange), so one copy + serves both colour schemes. No external stylesheets, fonts, or images. -->
+ +

Coder Eval documentation has moved

The documentation is now published at coder-eval.com.

+ + + + + UiPath/coder_eval + + + 107 + stars + + + + 2 + forks + +
+ + From f322acf2de1e467f3835bc675ef3bcf9d7a5e9de Mon Sep 17 00:00:00 2001 From: uipreliga Date: Tue, 28 Jul 2026 13:09:14 -0700 Subject: [PATCH 3/6] chore(pages): show a spinner while the repo counts are fetched MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Requested as a loading state for the star/fork counts. Built inverted from the obvious reading, because a spinner in the markup would be worst for the no-JS case it was meant to serve: with scripting off nothing would ever resolve it, so it would claim "fetching…" forever and read as broken. So the snapshot stays in the HTML and the spinner is installed BY the script — it therefore only appears where JS is also able to finish the job. No-JS visitors and crawlers get 107/2, which is stale at worst, never a lie. Every exit resolves the spinner: live values on success; the snapshot back on network error, non-2xx, a payload missing either count, or the 4s deadline. The count cell reserves 3 digits of width so the swaps don't shift the bar. The deadline restores the UI itself rather than only calling abort(). Relying on the abort was a real hole — a fetch that ignores the signal would spin forever, exactly the failure being avoided — and a stubbed hanging request reproduced it before this was fixed. A `settled` flag makes the race single-shot so a response landing after the deadline cannot overwrite the restored snapshot. Verified in-browser against a stubbed network, running this exact script: spinner renders mid-flight; hang restores after 4s; reject, HTTP 500, partial payload, and a 6s-late response all settle on 107/2 with no cell left spinning (the late 99999/88888 payload was correctly discarded). Markup contains zero spinner elements, so the no-JS path is the static snapshot. Co-Authored-By: Claude --- .github/pages-stub/index.html | 115 ++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 19 deletions(-) diff --git a/.github/pages-stub/index.html b/.github/pages-stub/index.html index 4e941348..d9bd3367 100644 --- a/.github/pages-stub/index.html +++ b/.github/pages-stub/index.html @@ -144,6 +144,36 @@ gap: 0.3rem; font-variant-numeric: tabular-nums; } + /* Reserve the width of a 3-digit count so swapping snapshot -> spinner -> + live value doesn't shift the bar's layout. */ + .count { + display: inline-flex; + align-items: center; + justify-content: flex-end; + min-width: 2.25ch; + } + /* Installed by JS only (see the script) — a spinner that can never be + resolved would be a lie, so no-JS keeps the static snapshot instead. */ + .spinner { + display: inline-block; + width: 0.8em; + height: 0.8em; + border: 2px solid currentColor; + border-right-color: transparent; + border-radius: 50%; + opacity: 0.75; + animation: spin 0.6s linear infinite; + } + @keyframes spin { + to { + transform: rotate(360deg); + } + } + @media (prefers-reduced-motion: reduce) { + .spinner { + animation-duration: 2.4s; + } + } /* Visually hidden, still announced — the counts are bare numbers otherwise. */ .sr-only { position: absolute; @@ -187,7 +217,7 @@

Coder Eval documentation has moved

d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z" /> - 107 + 107 stars @@ -196,30 +226,77 @@

Coder Eval documentation has moved

d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-.878a2.25 2.25 0 111.5 0v.878a2.25 2.25 0 01-2.25 2.25h-1.5v2.128a2.251 2.251 0 11-1.5 0V8.5h-1.5A2.25 2.25 0 013.5 6.25v-.878a2.25 2.25 0 111.5 0zM5 3.25a.75.75 0 10-1.5 0 .75.75 0 001.5 0zm6.75.75a.75.75 0 100-1.5.75.75 0 000 1.5zm-3 8.75a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - 2 + 2 forks
From 91240af3749609cf176c4a94a29299a717cf6247 Mon Sep 17 00:00:00 2001 From: uipreliga Date: Tue, 28 Jul 2026 13:16:05 -0700 Subject: [PATCH 4/6] chore(pages): drop the hardcoded counts, keep the spinner on failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplifies the repo bar's star/fork counts on two instructions: no committed values, and a failed fetch should keep spinning rather than fall back. The spinner is now the initial state in the markup and the only fallback, so the previous scaffolding — a snapshot Map, restore-on-failure, the 4s AbortController deadline, and the `settled` race guard — all had nothing left to do and is gone. Net 70 lines deleted for 20 added; the script is 10 lines. Anything that isn't a live number stays a spinner: offline, non-2xx, a payload missing a field, or scripting disabled. Resolution is per cell, so a partial payload fills what it has and leaves the rest spinning, rather than needing an all-or-nothing rule. Tradeoff, accepted deliberately: with JavaScript off the spinner never resolves. That is the cost of never publishing a count that is wrong within days, on a stub page nobody should be landing on. Verified in-browser: live load fills 107/2; network reject, a request that never settles, and a payload missing forks_count all leave the spinner in place; markup contains no numeric literals for the counts. Co-Authored-By: Claude --- .github/pages-stub/index.html | 90 ++++++++--------------------------- 1 file changed, 20 insertions(+), 70 deletions(-) diff --git a/.github/pages-stub/index.html b/.github/pages-stub/index.html index d9bd3367..22a8c4be 100644 --- a/.github/pages-stub/index.html +++ b/.github/pages-stub/index.html @@ -144,16 +144,15 @@ gap: 0.3rem; font-variant-numeric: tabular-nums; } - /* Reserve the width of a 3-digit count so swapping snapshot -> spinner -> - live value doesn't shift the bar's layout. */ + /* Reserve a few digits of width so replacing the spinner with the fetched + number doesn't shift the rest of the bar. */ .count { display: inline-flex; align-items: center; justify-content: flex-end; min-width: 2.25ch; } - /* Installed by JS only (see the script) — a spinner that can never be - resolved would be a lie, so no-JS keeps the static snapshot instead. */ + /* The counts' initial state; the script swaps each one for a real number. */ .spinner { display: inline-block; width: 0.8em; @@ -217,7 +216,7 @@

Coder Eval documentation has moved

d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z" /> - 107 + stars @@ -226,77 +225,28 @@

Coder Eval documentation has moved

d="M5 5.372v.878c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-.878a2.25 2.25 0 111.5 0v.878a2.25 2.25 0 01-2.25 2.25h-1.5v2.128a2.251 2.251 0 11-1.5 0V8.5h-1.5A2.25 2.25 0 013.5 6.25v-.878a2.25 2.25 0 111.5 0zM5 3.25a.75.75 0 10-1.5 0 .75.75 0 001.5 0zm6.75.75a.75.75 0 100-1.5.75.75 0 000 1.5zm-3 8.75a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - 2 + forks
From d6dc257869f82a902577ea1fdb0732fd6fbe5a14 Mon Sep 17 00:00:00 2001 From: uipreliga Date: Tue, 28 Jul 2026 13:23:16 -0700 Subject: [PATCH 5/6] chore(pages): say what Coder Eval is on the stub page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The page named the product and said the docs had moved, but never described what it is. Anyone arriving from a stale link had to click through to find out. Leads with the product now: `Coder Eval` as the h1, then a one-sentence description (open-source framework, evaluates and benchmarks AI coding agents and Claude Code skills, sandboxed real-agent runs against declarative YAML tasks, scores the files and commands produced), with the moved notice demoted to a secondary line. Wording mirrors coder-eval.com and the package metadata so the product is described identically everywhere. Adds a matching and meta description. Note these do NOT help ranking — the page is `noindex` — they are for link previews and shared URLs; the comment above them says so, so nobody later mistakes them for SEO copy that is doing work it isn't. The wordmark is now aria-hidden. It renders the same text as the new h1, so a screen reader was announcing "Coder Eval" twice; the h1 is the accessible name and the logo is decorative. Co-Authored-By: Claude <noreply@anthropic.com> --- .github/pages-stub/index.html | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/.github/pages-stub/index.html b/.github/pages-stub/index.html index 22a8c4be..bc9d6587 100644 --- a/.github/pages-stub/index.html +++ b/.github/pages-stub/index.html @@ -3,7 +3,17 @@ <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> - <title>Coder Eval documentation has moved + Coder Eval — evaluate AI coding agents and Claude Code skills + + +

Coder Eval

An open-source framework for evaluating and benchmarking AI coding agents and their Claude Code skills: it runs a real agent — Claude Code, Codex, or Gemini — in a sandbox against declarative YAML tasks, then scores the files and commands the agent actually produced.

-

The documentation has moved to coder-eval.com.

+

+ The documentation has moved to + coder-eval.com/docs. +

+