Skip to content

🚧 Prototype: unified Astro + Starlight docs site (Python + Rust)#367

Draft
Roger-luo wants to merge 19 commits into
mainfrom
astro-docs
Draft

🚧 Prototype: unified Astro + Starlight docs site (Python + Rust)#367
Roger-luo wants to merge 19 commits into
mainfrom
astro-docs

Conversation

@Roger-luo

Copy link
Copy Markdown
Collaborator

Draft / RFC — not for merge yet. Opening this early so everyone can see the direction and try it locally. Feedback very welcome.

What this is

A prototype of a new documentation website (website/, built with Astro 5 + Starlight) that unifies our Python and Rust API reference under one theme, one search box, and one version switcher — designed to grow with the ongoing Rust refactor (bloqade-lanes, bloqade-circuit, tsim, ppvm, … eventually one monorepo).

It lives alongside the current MkDocs site. Nothing about the existing site changes — the old workflows, mkdocs.yml, and docs/ are untouched and still deploy to production. This branch only adds files.

Why

  • Serve Python + Rust docs today and absorb crates gradually, without waiting 6–12 months for the refactor to finish.
  • Keep our proven "pin each package to the tag matching the installed version" aggregation, but generalize it so any repo (or a future in-monorepo crate) is just one manifest entry.
  • Get versioning under control (downstream deps don't map 1:1 to the bloqade version).

🔍 See it locally

Requirements: Node ≥ 20 and pnpm. (The full API reference additionally needs uv and a Rust nightly toolchain.)

Quick preview — landing, guides, blog, and the design system (no Python/Rust needed)

# from the repo root
pnpm --dir website install
pnpm --dir website dev
# open the printed URL (e.g. http://localhost:4321)

This renders the landing page, all migrated guides, the blog, and the full theme/design — enough to review look-and-feel and navigation.

Full site including the versioned Python + Rust API reference

The per-version API pages are generated from pinned sources (and are gitignored, not committed), so generate them first, then serve:

# from the repo root
uv sync                       # installs bloqade + sub-packages so version pins resolve
pnpm --dir website install

# generate the API docs for the `dev` version — pick ONE:
#  (A) if you have sibling checkouts next to this repo (../bloqade-circuit, ../bloqade-analog, ../bloqade-lanes):
python website/scripts/build_versions.py --versions dev --prefer-local
#  (B) otherwise, clone the pinned tags from GitHub:
python website/scripts/build_versions.py --versions dev --clone-dir website/sources

# then serve (or build):
pnpm --dir website dev        # or: pnpm --dir website build

Notes:

  • Rust API needs a nightly toolchain: rustup toolchain install nightly (used for cargo rustdoc --output-format json).
  • Tutorials render statically by default; set EXECUTE_NOTEBOOKS=1 before building to execute them.
  • A production build is pnpm --dir website build → output in website/dist/ (this is what CI publishes).

Live preview (once CI passes)

The newly-added workflows deploy this branch to an isolated gh-pages subpath so it can't touch the live site:

  • branch → https://bloqade.quera.com/next/
  • each PR → https://bloqade.quera.com/astro-preview/pr-<N>/

These workflows are brand new and may need a fixup pass on their first run — if the live preview isn't up yet, use the local steps above.

How it's built (architecture)

  • Unified renderer. Two language-native emitters output MDX + frontmatter consumed by a shared component library (ApiModule/ApiClass/ApiFn/Signature/Params/…); Astro owns all presentation. Python via griffe (same lib mkdocstrings uses), Rust via rustdoc JSON.
  • Aggregation. website/docs.sources.toml lists each API source as a repo pinned by tag (pin-from:<pkg>uv pip show) or a local monorepo path=. Adding ppvm = one entry; flipping a source to an in-repo path later changes nothing else.
  • Cross-references. <ApiXref> resolves against a merged inventory; the build emits a Sphinx-compatible objects.inv (so downstream Sphinx projects can intersphinx to us). Optional strict mode (XREF_STRICT=1) fails the build on broken refs.
  • Versioning. Single distribution axis = the bloqade meta-version, plus an auto-generated compatibility matrix (bloqade X → circuit/analog/lanes/tsim). Only /api is versioned; landing/guides/blog are evergreen. /api-scoped version switcher.
  • Search. Unified Pagefind index across guides, blog, landing, and API symbols.
  • One design system. A single token layer feeds both the custom landing/blog and every Starlight --sl-* variable; header, footer, and widgets (cards, callouts, tabs, code blocks) are shared/consistent — no default Starlight look.
  • CI. .github/workflows/website-*.yml build in GitHub Actions and publish via website/scripts/publish.sh (a thin seam; swapping to Vercel --prebuilt later is one line).

Current build: 744 pages, all cross-refs resolved, objects.inv emitted.

Not done yet (intentionally)

  • Cutover (redirects from old URLs, switching production from MkDocs, /api/latest/<symbol> deep-link aliasing) — a separate step once we're happy.
  • Full tutorial/example migration — one tutorial (ghz) is migrated as a proof; the rest is the gradual "move things over" work.
  • API signature panels use a slightly different radius than the shared card language (mkdocstrings parity) — easy to align if we want.

Feedback wanted

  • Overall direction (Astro + Starlight, unified emitters).
  • The versioning model (distribution axis + compatibility matrix).
  • Anything that feels off in the design once you run it locally.

🤖 Generated with Claude Code

Adds a new documentation website under website/ (Astro 5 + Starlight) that unifies Python + Rust API reference under one theme, search, and version switcher, alongside the existing MkDocs site (untouched, still live).

Highlights:
- Language-native emitters -> MDX via a shared component contract: griffe (Python) and rustdoc-JSON (Rust). Astro owns all presentation.
- docs.sources.toml manifest + resolver: aggregate scattered repos by pinned tag (uv pip show), or a local monorepo path. Adding a source (e.g. ppvm) is one entry.
- Cross-references resolve via a merged inventory; emits a Sphinx-compatible objects.inv. Broken-xref check (XREF_STRICT=1).
- Versioning: single distribution axis (bloqade meta-version) + auto-generated compatibility matrix; only /api is versioned, shell/guides/blog are evergreen.
- Unified Pagefind search across guides, blog, landing and API symbols.
- One design system: a single token layer feeds the custom landing/blog AND all Starlight --sl-* vars; shared header/footer + widget styling (no default Starlight look).
- Additive CI (.github/workflows/website-*.yml) deploys to isolated gh-pages subpaths (/next/, astro-preview/pr-N/); publish.sh abstracts the host (one-line Vercel swap).
- Representative content migrated (getting-started, digital + analog narrative, blog); full tutorial/example migration is the gradual follow-up.

Generated per-version API content, versions.json and the merged inventory are gitignored and regenerated by scripts/build_versions.py.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor
PR Preview Action v1.8.1

QR code for preview link

🚀 View preview at
https://QuEraComputing.github.io/bloqade/pr-preview/pr-367/

Built to branch gh-pages at 2026-07-17 04:14 UTC.
Preview will be ready when the GitHub Pages deployment is complete.

Roger-luo and others added 18 commits July 11, 2026 14:34
Signature radius 0.5rem->10px (matches the site's code/install chips) and gray-5 borders -> --sl-color-hairline (matches cards, tables, asides), so the generated Python/Rust API pages share the single design-token widget system with no leftover default-Starlight shapes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… notebook cache

Task runner: replace justfiles with a root mise.toml (pins node/pnpm[npm-backend]/uv; namespaced tasks — bare build/test = the bloqade package, docs:* = the Astro site, mkdocs:* = legacy). Update CONTRIBUTING + website/README.

Content: complete the legacy MkDocs -> Astro migration (definitive 45/45 mapping). All getting-started/digital/analog prose, all 3 blog posts, and all 12 tutorials (via the notebook pipeline; interop executed, tsim/gemini static pending backend). reference/index superseded by the generated api/index.

Cross-references: strict-xref build passes (0 unresolved, objects.inv). Fix emitter link bugs (Python dangling .md docstring links; Rust versionless ApiXref URLs -> version-aware) and repoint legacy relative/mkdocstrings links in migrated prose.

Harness: scripts/check_links.mjs — a post-build crawler validating every internal link, fragment anchor, redirect stub and /api/latest fallback; wired as 12:25:20 [bloqade-xref] xref inventory: 5621 symbol(s), versions [0.35, dev]
12:25:20 [WARN] [router] The route "/404" is defined in both "src/pages/404.astro" and "node_modules/.pnpm/@astrojs+starlight@0.37.0_astro@5.18.2_@types+node@24.13.3_rollup@4.62.2_typescript@5.9.3_/node_modules/@astrojs/starlight/routes/static/404.astro". A static route cannot be defined more than once.
12:25:20 [WARN] [router] A collision will result in an hard error in following versions of Astro.
12:25:20 [vite] Re-optimizing dependencies because vite config has changed
12:25:20 [content] Syncing content
12:25:21 [content] Synced content
12:25:21 [types] Generated 342ms
12:25:21 [build] output: "static"
12:25:21 [build] mode: "static"
12:25:21 [build] directory: /Users/roger/Code/python/bloqade/website/dist/
12:25:21 [build] Collecting build info...
12:25:21 [build] ✓ Completed in 579ms.
12:25:21 [build] Building static entrypoints...
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/dev/python/bloqade/analog/ir/scalar.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/0.35/python/bloqade/analog/ir/scalar.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/dev/python/bloqade/analog/ir/control/field.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/dev/python/bloqade/analog/ir/control/waveform.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/0.35/python/bloqade/analog/ir/control/field.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/0.35/python/bloqade/analog/ir/control/waveform.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/dev/python/bloqade/analog/ir/control/waveform.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "bnf" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/api/0.35/python/bloqade/analog/ir/control/waveform.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:25 [WARN] [astro-expressive-code] Error while highlighting code block using language "qasm" in document "/Users/roger/Code/python/bloqade/website/src/content/docs/guides/digital/compilation.mdx". The language could not be found. Using "txt" instead. Ensure that all required languages are either part of the bundle or custom languages provided in the "langs" config option.
12:25:29 [vite] ✓ built in 8.65s
12:25:29 [build] ✓ Completed in 8.66s.

 building client (vite)
12:25:29 [vite] transforming...
12:25:32 [vite] ✓ 2105 modules transformed.
12:25:32 [vite] rendering chunks...
12:25:32 [vite] computing gzip size...
12:25:32 [vite] dist/_astro/ec.0vx5m.js                                                               2.52 kB
12:25:32 [vite] dist/_astro/ec.v4551.css                                                             18.22 kB │ gzip:   3.96 kB
12:25:32 [vite] dist/_astro/channel.5wtNvd3W.js                                                       0.12 kB │ gzip:   0.13 kB
12:25:32 [vite] dist/_astro/init.Gi6I4Gst.js                                                          0.15 kB │ gzip:   0.13 kB
12:25:32 [vite] dist/_astro/chunk-2Q5K7J3B.DDqsui9T.js                                                0.20 kB │ gzip:   0.16 kB
12:25:32 [vite] dist/_astro/chunk-JWPE2WC7.DUObDP5j.js                                                0.23 kB │ gzip:   0.17 kB
12:25:32 [vite] dist/_astro/chunk-XXDRQBXY.DTR4DM11.js                                                0.24 kB │ gzip:   0.21 kB
12:25:32 [vite] dist/_astro/chunk-5VM5RSS4.D_lMW1qV.js                                                0.37 kB │ gzip:   0.27 kB
12:25:32 [vite] dist/_astro/stateDiagram-v2-6OUMAXLB.BDWtKtBh.js                                      0.44 kB │ gzip:   0.31 kB
12:25:32 [vite] dist/_astro/classDiagram-OUVF2IWQ.DbFMjC3u.js                                         0.48 kB │ gzip:   0.32 kB
12:25:32 [vite] dist/_astro/classDiagram-v2-EOCWNBFH.DbFMjC3u.js                                      0.48 kB │ gzip:   0.32 kB
12:25:32 [vite] dist/_astro/chunk-VR4S4FIN.BK3R1NuH.js                                                0.51 kB │ gzip:   0.36 kB
12:25:32 [vite] dist/_astro/swimlanesDiagram-G3AALYLV.EHJBt7f5.js                                     0.56 kB │ gzip:   0.37 kB
12:25:32 [vite] dist/_astro/infoDiagram-FWYZ7A6U.DKU3bugU.js                                          0.60 kB │ gzip:   0.41 kB
12:25:32 [vite] dist/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.C181hMzK.js    0.67 kB │ gzip:   0.40 kB
12:25:32 [vite] dist/_astro/sizeCapture-X5ZJPWSS.BGeCohRL.js                                          0.95 kB │ gzip:   0.54 kB
12:25:32 [vite] dist/_astro/preload-helper.BlTxHScW.js                                                1.11 kB │ gzip:   0.65 kB
12:25:32 [vite] dist/_astro/ordinal.BYWQX77i.js                                                       1.19 kB │ gzip:   0.57 kB
12:25:32 [vite] dist/_astro/railroadDiagram-RFXS5EU6.zGSd6GrA.js                                      1.62 kB │ gzip:   0.76 kB
12:25:32 [vite] dist/_astro/TableOfContents.astro_astro_type_script_index_0_lang.CKWWgpjV.js          1.67 kB │ gzip:   0.86 kB
12:25:32 [vite] dist/_astro/Search.astro_astro_type_script_index_0_lang.CLg7mG-P.js                   1.80 kB │ gzip:   0.93 kB
12:25:32 [vite] dist/_astro/abnfDiagram-VRR7QNED.CecFFecm.js                                          1.82 kB │ gzip:   0.90 kB
12:25:32 [vite] dist/_astro/chunk-32BRIVSS.Caa9Cywj.js                                                1.88 kB │ gzip:   0.83 kB
12:25:32 [vite] dist/_astro/MermaidHead.astro_astro_type_script_index_0_lang.DXik5SDI.js              1.96 kB │ gzip:   0.95 kB
12:25:32 [vite] dist/_astro/pegDiagram-2B236MQR.C-gordCP.js                                           1.97 kB │ gzip:   0.93 kB
12:25:32 [vite] dist/_astro/ebnfDiagram-CCIWWBDH.CoZzdRTl.js                                          2.01 kB │ gzip:   0.89 kB
12:25:32 [vite] dist/_astro/page.B1D-nYk3.js                                                          2.24 kB │ gzip:   1.01 kB
12:25:32 [vite] dist/_astro/arc.BZPNHrXO.js                                                           3.44 kB │ gzip:   1.48 kB
12:25:32 [vite] dist/_astro/diagram-NH7WQ7WH.ZEmw3djj.js                                              4.22 kB │ gzip:   1.84 kB
12:25:32 [vite] dist/_astro/defaultLocale.DX6XiGOO.js                                                 4.69 kB │ gzip:   2.18 kB
12:25:32 [vite] dist/_astro/map.DdKrh-jQ.js                                                           5.07 kB │ gzip:   2.07 kB
12:25:32 [vite] dist/_astro/linear.BnLAsUV7.js                                                        5.66 kB │ gzip:   2.31 kB
12:25:32 [vite] dist/_astro/diagram-WEI45ONY.r0L1GLc-.js                                              5.94 kB │ gzip:   2.55 kB
12:25:32 [vite] dist/_astro/pieDiagram-ENE6RG2P.DLQY_7zh.js                                           6.32 kB │ gzip:   2.64 kB
12:25:32 [vite] dist/_astro/chunk-RYQCIY6F.ep7f9nTI.js                                                7.08 kB │ gzip:   2.72 kB
12:25:32 [vite] dist/_astro/diagram-OA4YK3LP.D_SiWKBq.js                                              8.34 kB │ gzip:   3.72 kB
12:25:32 [vite] dist/_astro/dagre-VKFMJZFB.BaKxBJKl.js                                                8.61 kB │ gzip:   3.32 kB
12:25:32 [vite] dist/_astro/cynefinDiagram-TSTJHNR4.DcyCpRw0.js                                      10.11 kB │ gzip:   3.64 kB
12:25:32 [vite] dist/_astro/stateDiagram-2N3HPSRC.Bg4klyfs.js                                        10.43 kB │ gzip:   3.66 kB
12:25:32 [vite] dist/_astro/diagram-FQU43EPY.CWkkV61N.js                                             10.75 kB │ gzip:   4.14 kB
12:25:32 [vite] dist/_astro/chunk-MOJQB5TN.wxQDCp32.js                                               15.73 kB │ gzip:   4.40 kB
12:25:32 [vite] dist/_astro/diagram-G47NLZAW.B7REC4n8.js                                             15.96 kB │ gzip:   5.70 kB
12:25:32 [vite] dist/_astro/ishikawaDiagram-FXEZZL3T.DtPtlT6o.js                                     17.48 kB │ gzip:   6.66 kB
12:25:32 [vite] dist/_astro/kanban-definition-HUTT4EX6.D3jMiE7H.js                                   20.30 kB │ gzip:   7.21 kB
12:25:32 [vite] dist/_astro/mindmap-definition-LN4V7U3C.yxvt4P77.js                                  23.18 kB │ gzip:   7.82 kB
12:25:32 [vite] dist/_astro/sankeyDiagram-HTMAVEWB.B6jHN-kk.js                                       23.22 kB │ gzip:   8.56 kB
12:25:32 [vite] dist/_astro/journeyDiagram-5HDEW3XC.a-QlzWbi.js                                      23.58 kB │ gzip:   8.36 kB
12:25:32 [vite] dist/_astro/graph.DOmOIIwC.js                                                        23.92 kB │ gzip:   8.32 kB
12:25:32 [vite] dist/_astro/wardleyDiagram-EHGQE667.CVku8pLO.js                                      25.51 kB │ gzip:   6.80 kB
12:25:32 [vite] dist/_astro/erDiagram-Q63AITRT.DEeK8-sm.js                                           27.11 kB │ gzip:   9.42 kB
12:25:32 [vite] dist/_astro/gitGraphDiagram-IHSO6WYX.3CPoD9lH.js                                     29.43 kB │ gzip:   8.71 kB
12:25:32 [vite] dist/_astro/timeline-definition-FHXFAJF6.CoU4D2BQ.js                                 30.84 kB │ gzip:  10.16 kB
12:25:32 [vite] dist/_astro/layout.D29r7aS-.js                                                       31.00 kB │ gzip:  11.19 kB
12:25:32 [vite] dist/_astro/requirementDiagram-TGXJPOKE.C9IoQdc8.js                                  31.01 kB │ gzip:   9.74 kB
12:25:32 [vite] dist/_astro/quadrantDiagram-ABIIQ3AL.CFKeeJ5W.js                                     34.02 kB │ gzip:   9.97 kB
12:25:32 [vite] dist/_astro/chunk-EX3LRPZG.h04zUZDu.js                                               38.13 kB │ gzip:  12.51 kB
12:25:32 [vite] dist/_astro/xychartDiagram-FW5EYKEG.DIpyEEhB.js                                      41.91 kB │ gzip:  11.96 kB
12:25:32 [vite] dist/_astro/vennDiagram-L72KCM5P.CrTHzgbo.js                                         41.97 kB │ gzip:  15.71 kB
12:25:32 [vite] dist/_astro/chunk-V7JOEXUC.CK3HrZqZ.js                                               49.18 kB │ gzip:  15.74 kB
12:25:32 [vite] dist/_astro/flowDiagram-23GEKE2U.BVIi0mbU.js                                         60.71 kB │ gzip:  19.50 kB
12:25:32 [vite] dist/_astro/ganttDiagram-NO4QXBWP.vp5eEt4p.js                                        69.70 kB │ gzip:  23.56 kB
12:25:32 [vite] dist/_astro/c4Diagram-LMCZKHZV.Dnkvl_VM.js                                           69.95 kB │ gzip:  19.63 kB
12:25:32 [vite] dist/_astro/blockDiagram-677ZJIJ3.Ij9t4-pf.js                                        73.77 kB │ gzip:  21.26 kB
12:25:32 [vite] dist/_astro/cose-bilkent-JH36ORCC.3yMy3Y9P.js                                        81.71 kB │ gzip:  22.48 kB
12:25:32 [vite] dist/_astro/ui-core.D7EsID-j.js                                                      94.16 kB │ gzip:  27.33 kB
12:25:32 [vite] dist/_astro/sequenceDiagram-DBY2YBRQ.uVikkfpc.js                                    116.97 kB │ gzip:  31.12 kB
12:25:32 [vite] dist/_astro/swimlanes-5IMT3BWC.rcZt7f_L.js                                          118.81 kB │ gzip:  43.64 kB
12:25:32 [vite] dist/_astro/architectureDiagram-ZJ3FMSHR.BJ2EJGjV.js                                151.37 kB │ gzip:  43.01 kB
12:25:32 [vite] dist/_astro/katex.HP8lGamR.js                                                       261.31 kB │ gzip:  77.57 kB
12:25:32 [vite] dist/_astro/cytoscape.esm.OyMbaexL.js                                               443.69 kB │ gzip: 142.36 kB
12:25:32 [vite] dist/_astro/mermaid.core.DOYMDAxU.js                                                621.80 kB │ gzip: 149.08 kB
12:25:32 [vite] dist/_astro/cynefin-VYW2F7L2.Cwb8MA-s.js                                            688.00 kB │ gzip: 152.07 kB
12:25:32 [WARN] [vite]
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
12:25:32 [vite] ✓ built in 2.85s

 generating static routes
12:25:33 ▶ @astrojs/starlight/routes/static/404.astro
12:25:33   └─ /404.html (+10ms)
12:25:33 ▶ @astrojs/starlight/routes/static/index.astro
12:25:33   ├─ /api/index.html (+28ms)
12:25:33   ├─ /api/compatibility/index.html (+4ms)
12:25:33   ├─ /guides/example/index.html (+5ms)
12:25:33   ├─ /reference/index.html (+2ms)
12:25:33   ├─ /api/0.35/rust/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/index.html (+2ms)
12:25:33   ├─ /api/dev/rust/index.html (+2ms)
12:25:33   ├─ /api/dev/python/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/index.html (+2ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/astar/index.html (+29ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/expander/index.html (+8ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/config/index.html (+5ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/frontier/index.html (+4ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/heuristic/index.html (+4ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/heuristic_expander/index.html (+2ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/lane_index/index.html (+4ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/index.html (+2ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/solve/index.html (+3ms)
12:25:33   ├─ /api/0.35/rust/bloqade_lanes_search/graph/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/post_processing/index.html (+8ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/device/index.html (+12ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/constants/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/factory/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/atom_arrangement/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/index.html (+2ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/astar/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/migrate/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/serialize/index.html (+4ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/config/index.html (+4ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/heuristic/index.html (+3ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/expander/index.html (+2ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/frontier/index.html (+4ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/graph/index.html (+4ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/heuristic_expander/index.html (+2ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/device/index.html (+6ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/solve/index.html (+3ms)
12:25:33   ├─ /api/dev/rust/bloqade_lanes_search/lane_index/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/types/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/task/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/cudaq_integration/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/compile/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/logical_mvp/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/metrics/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/noise_model/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/prelude/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/steane_defaults/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/transform/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/types/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/utils/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/upstream/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/group/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/compiler/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/args/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/assign/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/coupling/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/drive/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/field/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/parallelize/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/route/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/pragmas/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/sequence_builder/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/spatial/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/start/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/typing/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/waveform/index.html (+10ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/sparse_operator/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/analog_circuit/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/scalar/index.html (+9ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/base/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/braket/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/load_config/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/mock/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/quera/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/bloqade/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/base/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/batch/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/braket/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/braket_simulator/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/exclusive/index.html (+8ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/task/quera/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/atom_arrangement/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/constants/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/factory/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/serialize/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/migrate/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/lineprog/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/lowering/index.html (+10ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/parallelize/index.html (+8ms)
12:25:33   ├─ /api/dev/python/bloqade/gemini/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/gemini/device/index.html (+10ms)
12:25:33   ├─ /api/dev/python/bloqade/gemini/post_processing/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/native/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/base/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/native/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/device/index.html (+7ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/reg/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/target/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/cudaq_integration/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/pyqrack/task/index.html (+6ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/compile/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/noise_model/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/prelude/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/logical_mvp/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/metrics/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/steane_defaults/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/transform/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/types/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/utils/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/lanes/upstream/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/glob/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/noise/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/parallel/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/groups/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/qasm2/types/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/qbraid/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/qbraid/lowering/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/qbraid/schema/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/qbraid/simulation_result/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/qbraid/target/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/qubit/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/qubit/stmts/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/squin/groups/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/rewrite/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/squin/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/visual/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/analysis/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/stim/groups/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/stim/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/arch/builder/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/arch/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/arch/topology/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/arch/zone/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/arch/word_factory/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/bytecode/arch/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/bytecode/exceptions/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/bytecode/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/dialects/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/dialects/move/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/dialects/place/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/arch/index.html (+9ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/encoding/index.html (+9ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/move_metric/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/numpy_compat/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/path/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/layout/word/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/logical_layout/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/logical_placement/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/move_synthesis/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/physical_layout/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/physical_placement/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/physical_movement/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/heuristics/simple_layout/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/circuit2place/index.html (+8ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/place2move/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/squin2stim/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/state/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/rewrite/transversal/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/search/configuration/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/search/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/search/tree/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/search/scoring/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/search/search_params/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/validation/address/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/validation/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/visualize/app/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/visualize/artist/index.html (+13ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/visualize/debug/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/lanes/visualize/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/logical_validation/analysis/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/logical_validation/impls/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/logical_validation/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/measurement_validation/analysis/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/measurement_validation/impls/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/analysis/measurement_validation/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/dialects/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/impls/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/impls/measure_id/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/rewrite/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/rewrite/initialize/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/rewrite/qubit_count/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/stdlib/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/gemini/logical/stdlib/post_processing/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/compiler/passes/emulator/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/compiler/passes/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/backend/bloqade/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/backend/braket/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/backend/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/backend/quera/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/parse/builder/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/parse/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/parse/stream/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/builder/parse/trait/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/ir/atom_type/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/ir/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/ir/emulator/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/ir/space/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/emulate/ir/state_vector/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/control/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/control/field/index.html (+5ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/control/pulse/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/control/sequence/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/control/waveform/index.html (+12ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/location/bravais/index.html (+12ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/location/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/location/location/index.html (+8ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/braket/index.html (+4ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/params/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/bloqade/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/base/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/index.html (+1ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/ir/routine/quera/index.html (+6ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/braket/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/capabilities/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/index.html (+7ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/parallel/index.html (+3ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/task_results/index.html (+2ms)
12:25:33   ├─ /api/0.35/python/bloqade/analog/submission/ir/task_specification/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/address/analysis/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/address/impls/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/address/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/address/lattice/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/fidelity/analysis/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/fidelity/impls/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/fidelity/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/args/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/coupling/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/drive/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/assign/index.html (+7ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/field/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/parallelize/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/route/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/pragmas/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/sequence_builder/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/spatial/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/start/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/typing/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/builder/waveform/index.html (+10ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/measure_id/analysis/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/measure_id/impls/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/measure_id/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analysis/measure_id/lattice/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/compiler/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/emulate/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/ir/analog_circuit/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/ir/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/emulate/sparse_operator/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/ir/scalar/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/base/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/braket/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/load_config/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/mock/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/submission/quera/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/base/index.html (+6ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/bloqade/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/batch/index.html (+5ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/braket/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/braket_simulator/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/exclusive/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/analog/task/quera/index.html (+3ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/emit/base/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/emit/gate/index.html (+4ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/emit/index.html (+1ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/emit/qubit/index.html (+2ms)
12:25:33   ├─ /api/dev/python/bloqade/cirq_utils/emit/noise/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/cirq_utils/noise/conflict_graph/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/cirq_utils/noise/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/cirq_utils/noise/transform/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/dialects/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/cirq_utils/noise/model/index.html (+8ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/rewrite/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/rewrite/initialize/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/native/dialects/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/native/stdlib/broadcast/index.html (+8ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/group/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/native/stdlib/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/native/upstream/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/native/stdlib/simple/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/native/upstream/squin2native/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/noise/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/noise/native/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/qasm2/core/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/qasm2/parallel/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/qasm2/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/qasm2/glob/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/qasm2/uop/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/qubit/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/builder/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/topology/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/dialects/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/word_factory/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/zone/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/dialects/place/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/logical_layout/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/dialects/move/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/logical_placement/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/move_synthesis/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/physical_layout/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/physical_placement/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/physical_movement/index.html (+8ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/heuristics/simple_layout/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/arch/index.html (+9ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/move_metric/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/encoding/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/numpy_compat/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/path/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/layout/word/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/bytecode/arch/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/bytecode/exceptions/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/bytecode/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/circuit2place/index.html (+8ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/squin2stim/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/state/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/place2move/index.html (+8ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/transversal/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/configuration/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/scoring/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/search_params/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/tree/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/visualize/app/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/validation/address/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/visualize/artist/index.html (+13ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/validation/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/visualize/debug/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/visualize/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/glob/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/emit/base/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/parallel/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/indexing/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/inline/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/emit/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/emit/gate/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/emit/main/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/emit/target/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/ast/index.html (+11ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/build/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/lowering/index.html (+11ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/parser/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/print/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/parse/visitor/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/glob/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/desugar/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/insert_qubits/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/native_gates/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/parallel_to_glob/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/parallel_to_uop/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/register/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/rewrite/uop_to_parallel/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/fold/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/lift_qubits/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/glob/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/noise/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/parallel/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/py2qasm/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/qasm2py/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/passes/unroll_if/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qubit/analysis/address_impl/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/qubit/analysis/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qubit/stdlib/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qubit/stdlib/broadcast/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/qubit/stdlib/simple/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/rules/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/rules/split_ifs/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/passes/callgraph/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/passes/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/analysis/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/passes/aggressive_unroll/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/rewrite/passes/canonicalize_ilist/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/gate/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/analysis/schedule/index.html (+9ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/gate/stmts/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/passes/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/passes/qasm2_gate_func_to_squin/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/passes/qasm2_to_squin/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/stdlib/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/rewrite/U3_to_clifford/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/rewrite/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/rewrite/remove_dangling_qubits/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/noise/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/rewrite/non_clifford_to_U3/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/visual/animation/animate/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/rewrite/wrap_analysis/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/squin/noise/stmts/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/visual/animation/gate_event/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/visual/animation/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/visual/animation/base/index.html (+9ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/atom/analysis/index.html (+4ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/atom/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/atom/impl/index.html (+5ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/atom/atom_state_data/index.html (+4ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/atom/lattice/index.html (+6ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/placement/analysis/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/placement/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/placement/strategy/index.html (+4ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/placement/lattice/index.html (+6ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/layout/analysis/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/analysis/layout/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/dialects/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/emit/impls/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/emit/stim_str/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/emit/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/parse/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/parse/lowering/index.html (+13ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/passes/flatten/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/passes/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/passes/simplify_ifs/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/passes/squin_to_stim/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/upstream/from_squin/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/upstream/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/arch/gemini/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/get_record_util/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/ifs_to_stim/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/py_constant_to_stim/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/qubit_to_stim/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/set_detector_to_stim/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/set_observable_to_stim/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/squin_measure/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/squin_noise/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/stim/rewrite/util/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/rewrite/move2squin/base/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/rewrite/move2squin/gates/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/rewrite/move2squin/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/base/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/rewrite/move2squin/noise/index.html (+24ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/aod_grouping/index.html (+7ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/exhaustive/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/greedy/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/heuristic/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/generators/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/gemini/logical/dialects/operations/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/astar/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/gemini/logical/dialects/operations/stmts/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/bfs/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/driver/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/entropy_guided/index.html (+4ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/goal/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/greedy/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/interface/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/lanes/search/traversal/step_info/index.html (+6ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/assignment_scan/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/check_slices/index.html (+6ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/is_constant/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/is_hyperfine/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/scan_channels/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/common/scan_variables/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/hardware/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/hardware/lattice/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/python/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/hardware/channels/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/hardware/piecewise_linear/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/hardware/piecewise_constant/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/analysis/python/waveform/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/add_padding/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/assign_to_literal/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/assign_variables/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/canonicalize/index.html (+7ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/flatten/index.html (+3ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/common/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/passes/hardware/components/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/passes/hardware/define/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/passes/hardware/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/passes/hardware/units/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/python/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/compiler/rewrite/python/waveform/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/ir/control/traits/append/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/ir/control/traits/canonicalize/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/ir/control/traits/hash/index.html (+1ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/ir/control/traits/slice/index.html (+2ms)
12:25:34   ├─ /api/0.35/python/bloqade/analog/ir/control/traits/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/backend/bloqade/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/backend/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/backend/braket/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/backend/quera/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/parse/builder/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/parse/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/parse/stream/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/compiler/passes/emulator/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/builder/parse/trait/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/compiler/passes/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/emulate/ir/atom_type/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/emulate/ir/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/emulate/ir/emulator/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/compiler/analysis/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/compiler/rewrite/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/emulate/ir/space/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/emulate/ir/state_vector/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/control/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/control/field/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/control/sequence/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/control/pulse/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/location/bravais/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/control/waveform/index.html (+10ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/location/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/location/location/index.html (+10ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/bloqade/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/base/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/braket/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/params/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/capabilities/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/ir/routine/quera/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/braket/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/parallel/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/task_specification/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/analog/submission/ir/task_results/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/dialects/logical/groups/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/dialects/logical/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/dialects/logical/stmts/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/dialects/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/impls/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/rewrite/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/impls/measure_id/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/rewrite/qubit_count/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/rewrite/initialize/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/stdlib/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/logical/stdlib/post_processing/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/logical_validation/analysis/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/logical_validation/impls/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/logical_validation/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/measurement_validation/analysis/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/measurement_validation/impls/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/gemini/analysis/measurement_validation/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/native/dialects/gate/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/native/dialects/gate/stmts/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/atom/analysis/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/atom/atom_state_data/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/atom/impl/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/atom/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/layout/analysis/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/atom/lattice/index.html (+6ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/layout/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/placement/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/placement/analysis/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/placement/lattice/index.html (+5ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/analysis/placement/strategy/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/gate/gate/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/gate/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/noise/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/pyqrack/squin/noise/native/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/move2squin/gates/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/move2squin/base/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/move2squin/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/arch/gemini/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/rewrite/move2squin/noise/index.html (+24ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/aod_grouping/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/base/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/exhaustive/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/greedy/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/heuristic/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/generators/index.html (+1ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/core/index.html (+4ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/core/address/index.html (+12ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/traversal/astar/index.html (+3ms)
12:25:34   ├─ /api/dev/python/bloqade/qasm2/dialects/core/stmts/index.html (+7ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/traversal/bfs/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/traversal/driver/index.html (+2ms)
12:25:34   ├─ /api/dev/python/bloqade/lanes/search/traversal/entropy_guided/i…
…it tests

Fix /404 route collision: move the on-brand 404 + /api/latest deep-link fallback into Starlight's content-driven 404 (src/content/docs/404.mdx -> NotFound.astro); remove src/pages/404.astro.

Zero-warning build: register bnf/qasm Expressive-Code grammars (committed TextMate JSON, no dep); fix KaTeX (μ -> \mu + strict-ignore config for benign codes); set PAGEFIND_ROOT_SELECTOR=body so redirect stubs don't warn; draft:true on 404.mdx to drop it from the [...slug] catch-all; raise Vite chunk-size limit. Only remaining line is a documented third-party DEP0190 from Starlight's Pagefind spawn.

Test harness (mise run docs:test): a build-warning gate (scripts/check_build.mjs, narrow allowlist) + a Playwright per-page runtime crawl (scripts/crawl_runtime.mjs) over all ~996 built pages capturing console errors, page exceptions, unhandled rejections and failed requests. Wired into CI with cached Playwright browsers. Separate from docs:check (links/xref).

Widget + lib unit tests (mise run docs:unit): vitest + Astro Container API, 69 tests over the API components (ApiFn/ApiClass/ApiModule/Signature/Params/Returns/Raises/Source/ApiXref), widgets (VersionSwitcher, NotFound, SiteHeader/SiteFooter), and lib (xref resolveXref, versions, nav). Hermetic w.r.t. the generated inventory (mocked). Wired into CI.

Gates all green: docs:check (links/xref), docs:test (build warnings + runtime), docs:unit (units).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… + Rust) with a verification harness

Docstring/doc-comment cross-references now render as real <ApiXref> links (marked origin="docstring"), resolving against the merged inventory.

Python (emitters/python/xref.py, via griffe): supports cross-refs in ALL docstring formats — reStructuredText/Sphinx object roles (:class:/:func:/:meth:/:obj:/:attr:/:exc:/:mod:/:data:/:const: incl. :py:* and ~short/explicit-title forms + .. seealso::), Google (roles and/or Markdown in Google prose), NumPy/SciPy (roles + the See Also section object list), and Markdown/mkdocstrings autorefs ([label][target], [target][], backtick-target, bare identifiers). Detection runs on parsed prose so it's parser-independent.

Rust (emitters/rust/emit_rust.py): consumes rustdoc JSON per-item  map to turn resolved intra-doc links into <ApiXref>.

Safe by construction: an <ApiXref> is emitted only when the target resolves to a symbol the emitter documents (present in its inventory) — otherwise the reference degrades to inline code/text — so no docstring xref can ever be unresolved under XREF_STRICT. ApiXref gains an optional origin prop (data-xref-origin) for verification.

Harness: scripts/check_xrefs.mjs (wired into docs:check + CI) asserts docstring-origin xrefs are present per-language (floors) and none are unresolved — catching silent regressions where an emitter stops producing them. Full build: 112 docstring xrefs (python 48, rust 64), 0 unresolved. Emitter unit tests cover every convention (python 95, rust 87); docs:unit 72; docs:check + docs:test green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nt, /api-only)

The version selector now renders in the top bar on /api/** pages instead of only in the sidebar (where it was easy to miss, and never seen until you were deep inside a versioned page). Reuses the existing VersionSwitcher (which self-hides off /api/**), restyled compact for the header; removed the duplicate sidebar mount. Verified: the version select renders on /api/<version>/** pages and is absent on the landing, guides, and the /api overview.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
build_versions.py injects Starlight pagefind:false into every non-latest api/<V>/ page after generation, so site-wide search returns only the LATEST API (plus evergreen guides/blog/reference); older/dev API stays browsable via the header version selector but out of search. Pagefind indexed pages drop ~992 -> ~523 (469 dev API pages excluded); no duplicate cross-version hits.

scripts/check_search_scope.mjs (wired into docs:check) reads the real version labels from versions.json and asserts non-latest api/<V> pages are excluded from search while the latest is indexed (evergreen api/index + api/compatibility are not versions and stay searchable).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Append check_search_scope.mjs to the 'Check internal links + API xrefs' step in website-deploy.yml + website-preview.yml (mirrors mise run docs:check, reuses the same dist-check build). check_search_scope now resolves versions.json relative to the passed dist dir, so it works both from website/ (mise, dist) and the repo root (CI, website/dist-check).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add amplify.yml (repo-root buildspec) reproducing the generate->build half
of website-deploy.yml: uv sync + Rust nightly + notebook execution, then
`pnpm --dir website build`, artifacts at website/dist. Served at the domain
root so SITE_BASE is "/" (no gh-pages subpath juggling).

Delete website-preview.yml: PR previews now come from Amplify, and pushing
each PR's built site into gh-pages was bloating the repo history.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Amplify's pnpm install died with ERR_PNPM_IGNORED_BUILDS (exit 1): recent pnpm
blocks dependency build scripts by default and treats an unapproved one as a
hard failure in CI. esbuild and sharp both need their build scripts and are
required by `astro build`.

The existing `onlyBuiltDependencies: [esbuild, sharp]` allowlist is read by pnpm
but not applied from a settings-only pnpm-workspace.yaml in pnpm 11.x, so the CI
install kept failing. Switch to `dangerouslyAllowAllBuilds: true`, which does
take effect; esbuild + sharp are the only packages with build scripts in the
lockfile, so the scope is unchanged. Also drop the malformed `allowBuilds:` stub.

Verified: clean `CI=true pnpm install --frozen-lockfile` exits 0, runs both
build scripts, and esbuild transformSync + sharp native load both succeed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The build phase died in resolve_sources.py with `ModuleNotFoundError: No module
named 'tomllib'`. tomllib is stdlib only in Python 3.11+, but the repo declares
requires-python ">=3.10" with no version pin, so uv on Amplify's Amazon Linux
created the venv with a <=3.10 interpreter. (Locally and on GH Actions uv happens
to pick 3.13.)

Set UV_PYTHON=3.13 so uv fetches/uses 3.13 for both the root env and the
notebook emitter project (both declare >=3.10 and resolve to 3.13 locally),
giving resolve_sources.py + gen_compat_matrix.py their tomllib.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…env pins

node/pnpm/uv were pinned three times (mise.toml, amplify.yml, the website GH
workflows) and the rustdoc nightly date twice. Make mise.toml the single source
of truth for the website build path:

* amplify.yml installs mise + `mise install` (drops NODE_VERSION/PNPM_VERSION/
  UV_VERSION/RUST_TOOLCHAIN); `eval "$(mise env -s bash)"` puts the tools on PATH
  and exports the shared constants.
* website-deploy.yml / website-release.yml swap setup-uv/pnpm-action/setup-node/
  dtolnay-rust-toolchain for jdx/mise-action@v2.
* New mise.toml [env] RUSTDOC_NIGHTLY is the ONE place the nightly date lives.
  build_versions.py --rust-toolchain now defaults to $RUSTDOC_NIGHTLY, so no
  caller repeats it. It is a plain shared constant, NOT a rust-toolchain.toml:
  nightly is only ever invoked via `cargo +$RUSTDOC_NIGHTLY rustdoc` for docstring
  extraction, so the main crates keep building with the default stable toolchain.

Python stays pinned as UV_PYTHON=3.13 in amplify.yml (not mise [env]) on purpose:
ci.yml runs a real 3.10/3.11/3.12 matrix a global UV_PYTHON would clobber. The
uv-only workflows (ci/release/doc*) are intentionally left on setup-uv — pointing
them at mise.toml would needlessly install node+pnpm and doesn't fit ci's matrix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nore lib/ rule

The astro build failed on a clean clone (Amplify) with "Could not resolve
../lib/nav from src/components/SiteFooter.astro". Root cause: the Python-template
`.gitignore` rule `lib/` matches directories named lib at ANY depth, so it
silently excluded website/src/lib/ (nav.ts, versions.ts, xref.ts) — real source
imported by SiteFooter, SiteHeader, VersionSwitcher, NotFound, and ApiXref — plus
their tests in website/tests/unit/lib/. These files existed only locally and were
never in any clone, so the site could never build off a fresh checkout.

Re-include both dirs with negation rules and commit the 6 files. Verified with
git check-ignore (no longer ignored) and a full scan for other swallowed source
(only generated content / caches remain ignored).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Version-manage the AWS CLI alongside node/pnpm/uv via the aqua backend so it can
read Amplify build logs / manage the Hosting app. It rides along in `mise install`
(a small cached download in CI/Amplify); can move to a personal mise.local.toml
to keep it out of CI if desired.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adding aws-cli to the shared mise.toml broke the Amplify build: `mise install`
resolves the aqua aws-cli package via the GitHub API, which is 403 rate-limited
on Amplify's shared build IPs (unauthenticated), failing before the site builds.
aws-cli is a local operational tool, not a build dep, so it belongs in a personal
gitignored mise.local.toml that never reaches CI/Amplify.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Amplify rejects the whole cache tarball if it exceeds 5GB ("Unable to write
cache: File size must be less than 5GB"), which was happening — ~/.rustup (~8GB)
and ~/.cache/uv (~12GB) alone blew the budget, so NOTHING was cached and every
build ran fully cold (uv sync ~3m + all 12 notebooks ~4m, every time).

Cache only small, high-value paths (~2.85GB total): the content-addressed
notebook cache (~4MB — so a PR changing one notebook now re-runs only that one),
the two uv venvs (~1.2GB each — skips uv sync), node_modules + .astro. Drop the
multi-GB/low-payoff rustup/cargo/uv-download/mise caches (reinstall is ~10-20s).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The previous trim still exceeded Amplify's 5GB cache limit — the uv venvs are far
larger on Amplify's Linux than the ~1.2GB local du showed (different wheels + uv
copies instead of hardlinks), so the whole cache kept getting rejected and every
build stayed cold. Cache only the notebook cache (~4MB), node_modules, and .astro
— guaranteed under 5GB so the cache finally persists and per-notebook caching
works. Add a [cache-size] du probe to the build to log real Amplify sizes so we
can revisit adding a venv if there's headroom.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…GHTLY)

Four independent CI failures on the astro-docs PR, all from the new
website/ tree:

- ruff: drop 4 unused imports; rename ambiguous `l` -> line/lang (E741)
  in website/scripts/build_versions.py.
- black: format the 21 new website/ python files.
- build (3.10/3.11/3.12): ci.yml ran bare `uv run pytest`, which swept
  website/emitters/*/tests whose standalone packages aren't installed by
  `uv sync` -> ModuleNotFoundError. Scope to `pytest test` (matches
  `mise run test`); emitter suites run under the website tooling.
- Build + publish /next/: jdx/mise-action doesn't propagate mise.toml
  [env] into $GITHUB_ENV, so $RUSTDOC_NIGHTLY was empty and
  `rustup toolchain install ""` crashed (and build_versions.py silently
  fell back to generic `nightly`). Re-export it explicitly after
  mise-action in website-deploy.yml + website-release.yml (mirrors
  amplify.yml); mise.toml stays the single source of truth. Fix the now
  inaccurate comments.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to 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.

1 participant