Read the Docs build information Build id: 4202923 Project: icb-scanpy Version: 4170 Commit: 170516e6eb5f727423512c83052116c9401c2ad6 Date: 2026-07-13T07:58:52.271725Z State: finished Success: False [rtd-command-info] start-time: 2026-07-13T07:58:53.025816Z, end-time: 2026-07-13T07:58:53.916540Z, duration: 0, exit-code: 0 git clone --depth 1 https://github.com/scverse/scanpy.git . Cloning into '.'... [rtd-command-info] start-time: 2026-07-13T07:58:53.993329Z, end-time: 2026-07-13T07:58:54.546587Z, duration: 0, exit-code: 0 git fetch origin --force --prune --prune-tags --depth 50 pull/4170/head:external-4170 From https://github.com/scverse/scanpy * [new ref] refs/pull/4170/head -> external-4170 [rtd-command-info] start-time: 2026-07-13T07:58:55.254797Z, end-time: 2026-07-13T07:58:55.396420Z, duration: 0, exit-code: 0 git checkout --force 170516e6eb5f727423512c83052116c9401c2ad6 Note: switching to '170516e6eb5f727423512c83052116c9401c2ad6'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at 170516e Merge branch 'main' into networkit_gve [rtd-command-info] start-time: 2026-07-13T07:58:55.477825Z, end-time: 2026-07-13T07:58:55.515984Z, duration: 0, exit-code: 0 cat .readthedocs.yml # https://docs.readthedocs.io/en/stable/config-file/v2.html version: 2 submodules: include: all build: os: ubuntu-24.04 tools: python: '3.13' jobs: post_checkout: # unshallow so version can be derived from tag - git fetch --unshallow || true create_environment: - asdf plugin add uv - asdf install uv latest - asdf global uv latest pre_build: # run towncrier to preview the next version’s release notes - ( find docs/release-notes -regex '[^.]+[.][^.]+.md' | grep -q . ) && uvx hatch run towncrier build --keep || true build: html: - uvx hatch run docs:build -T - mv docs/_build $READTHEDOCS_OUTPUT [rtd-command-info] start-time: 2026-07-13T07:58:55.742901Z, end-time: 2026-07-13T07:58:55.806021Z, duration: 0, exit-code: 0 git submodule sync [rtd-command-info] start-time: 2026-07-13T07:58:56.070691Z, end-time: 2026-07-13T07:59:14.344648Z, duration: 18, exit-code: 0 git submodule update --init --force -- Submodule 'notebooks' (https://github.com/scverse/scanpy-tutorials/) registered for path 'notebooks' Cloning into '/home/docs/checkouts/readthedocs.org/user_builds/icb-scanpy/checkouts/4170/notebooks'... Submodule path 'notebooks': checked out 'ac0e94be9f36977400177dc940cbd8eac1d2297c' [rtd-command-info] start-time: 2026-07-13T07:59:14.426189Z, end-time: 2026-07-13T07:59:18.353055Z, duration: 3, exit-code: 0 git fetch --unshallow || true From https://github.com/scverse/scanpy * [new tag] 0.0 -> 0.0 * [new tag] 0.1 -> 0.1 * [new tag] 0.2 -> 0.2 * [new tag] 0.2.1 -> 0.2.1 * [new tag] 0.2.3 -> 0.2.3 * [new tag] 0.2.3.5 -> 0.2.3.5 * [new tag] 0.2.4 -> 0.2.4 * [new tag] 0.2.5 -> 0.2.5 * [new tag] 0.2.6 -> 0.2.6 * [new tag] 0.2.7 -> 0.2.7 * [new tag] 0.2.8 -> 0.2.8 * [new tag] 0.2.9 -> 0.2.9 * [new tag] 0.2.9.1 -> 0.2.9.1 * [new tag] 0.3 -> 0.3 * [new tag] 0.3.1 -> 0.3.1 * [new tag] 0.3.2 -> 0.3.2 * [new tag] 0.4 -> 0.4 * [new tag] 0.4.1 -> 0.4.1 * [new tag] 0.4.2 -> 0.4.2 * [new tag] 0.4.2.post1 -> 0.4.2.post1 * [new tag] 0.4.2.post2 -> 0.4.2.post2 * [new tag] 0.4.3 -> 0.4.3 * [new tag] 0.4.4 -> 0.4.4 * [new tag] 1.0 -> 1.0 * [new tag] 1.0.1 -> 1.0.1 * [new tag] 1.0.2 -> 1.0.2 * [new tag] 1.0.3 -> 1.0.3 * [new tag] 1.0.4 -> 1.0.4 * [new tag] 1.1 -> 1.1 * [new tag] 1.10.0.dev0 -> 1.10.0.dev0 * [new tag] 1.10.0rc1 -> 1.10.0rc1 * [new tag] 1.11.0 -> 1.11.0 * [new tag] 1.11.0rc1 -> 1.11.0rc1 * [new tag] 1.11.0rc2 -> 1.11.0rc2 * [new tag] 1.12.0 -> 1.12.0 * [new tag] 1.12.0rc1 -> 1.12.0rc1 * [new tag] 1.1a1 -> 1.1a1 * [new tag] 1.1a2 -> 1.1a2 * [new tag] 1.2.0 -> 1.2.0 * [new tag] 1.2.1 -> 1.2.1 * [new tag] 1.2.2 -> 1.2.2 * [new tag] 1.3 -> 1.3 * [new tag] 1.3.1 -> 1.3.1 * [new tag] 1.3.2 -> 1.3.2 * [new tag] 1.3.3 -> 1.3.3 * [new tag] 1.3.4 -> 1.3.4 * [new tag] 1.3.5 -> 1.3.5 * [new tag] 1.3.6 -> 1.3.6 * [new tag] 1.3.7 -> 1.3.7 * [new tag] 1.3.8 -> 1.3.8 * [new tag] 1.4 -> 1.4 * [new tag] 1.4.1 -> 1.4.1 * [new tag] 1.4.2 -> 1.4.2 * [new tag] 1.4.3 -> 1.4.3 * [new tag] 1.4.4 -> 1.4.4 * [new tag] 1.4.5 -> 1.4.5 * [new tag] 1.4.5.1 -> 1.4.5.1 * [new tag] 1.4.5.post1 -> 1.4.5.post1 * [new tag] 1.4.5.post2 -> 1.4.5.post2 * [new tag] 1.4.5.post3 -> 1.4.5.post3 * [new tag] 1.4.6 -> 1.4.6 * [new tag] 1.5.0 -> 1.5.0 * [new tag] 1.5.0a1 -> 1.5.0a1 * [new tag] 1.5.1 -> 1.5.1 * [new tag] 1.6.0 -> 1.6.0 * [new tag] 1.7.0rc1 -> 1.7.0rc1 * [new tag] 1.8.0 -> 1.8.0 * [new tag] 1.8.0.dev0 -> 1.8.0.dev0 * [new tag] 1.9.0 -> 1.9.0 * [new tag] 1.9.0.dev0 -> 1.9.0.dev0 Fetching submodule notebooks From https://github.com/scverse/scanpy-tutorials * branch 26e16f83387caef76abdd42afda3c7c13f7139f1 -> FETCH_HEAD [rtd-command-info] start-time: 2026-07-13T07:59:22.845844Z, end-time: 2026-07-13T07:59:22.901618Z, duration: 0, exit-code: 0 asdf global python 3.13.14 [rtd-command-info] start-time: 2026-07-13T07:59:23.289881Z, end-time: 2026-07-13T07:59:24.454241Z, duration: 1, exit-code: 0 asdf plugin add uv updating plugin repository...From https://github.com/asdf-vm/asdf-plugins 8e311ee..c0369a1 master -> origin/master * [new branch] dependabot/github_actions/actions/checkout-6 -> origin/dependabot/github_actions/actions/checkout-6 * [new branch] dependabot/github_actions/amannn/action-semantic-pull-request-6.1.1 -> origin/dependabot/github_actions/amannn/action-semantic-pull-request-6.1.1 * [new branch] dependabot/github_actions/asdf-vm/actions-4 -> origin/dependabot/github_actions/asdf-vm/actions-4 HEAD is now at c0369a1 feat: add yasm plugin (#1087) [rtd-command-info] start-time: 2026-07-13T07:59:24.532365Z, end-time: 2026-07-13T07:59:25.723506Z, duration: 1, exit-code: 0 asdf install uv latest redirect url: https://github.com/astral-sh/uv/releases/tag/0.11.28 * Downloading uv release 0.11.28... uv 0.11.28 installation was successful! [rtd-command-info] start-time: 2026-07-13T07:59:25.806979Z, end-time: 2026-07-13T07:59:25.914544Z, duration: 0, exit-code: 0 asdf global uv latest redirect url: https://github.com/astral-sh/uv/releases/tag/0.11.28 [rtd-command-info] start-time: 2026-07-13T07:59:26.052915Z, end-time: 2026-07-13T07:59:27.573797Z, duration: 1, exit-code: 0 ( find docs/release-notes -regex '[^.]+[.][^.]+.md' | grep -q . ) && uvx hatch run towncrier build --keep || true Downloading cryptography (4.5MiB) Downloading pygments (1.2MiB) Downloading virtualenv (5.3MiB) Downloading uv (25.9MiB) Downloaded uv Downloaded virtualenv Downloaded cryptography Downloaded pygments Installed 43 packages in 24ms ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/__init__.py:243 in main │ │ │ │ 240 │ │ 241 def main(): # no cov │ │ 242 │ try: │ │ ❱ 243 │ │ hatch(prog_name="hatch", windows_expand_args=False) │ │ 244 │ except Exception: # noqa: BLE001 │ │ 245 │ │ import sys │ │ 246 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1569 in __call__ │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1490 in main │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1970 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1353 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:907 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/decorators.py:34 in new_func │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/run/__init__.py:157 in run │ │ │ │ 154 │ elif not env_name: │ │ 155 │ │ env_name = "system" │ │ 156 │ │ │ ❱ 157 │ ctx.invoke( │ │ 158 │ │ run_command, │ │ 159 │ │ args=[command, *final_args], │ │ 160 │ │ env_names=[env_name], │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:907 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/decorators.py:46 in new_func │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/env/run.py:92 in run │ │ │ │ 89 │ except ValueError as e: │ │ 90 │ │ app.abort(f"Duplicate excluded variable: {e}") │ │ 91 │ │ │ ❱ 92 │ app.ensure_environment_plugin_dependencies() │ │ 93 │ │ │ 94 │ project = app.project │ │ 95 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/application.py:155 in ensure_environment_plugin_dependencies │ │ │ │ 152 │ │ │ 153 │ def ensure_environment_plugin_dependencies(self) -> None: │ │ 154 │ │ self.ensure_plugin_dependencies( │ │ ❱ 155 │ │ │ self.project.config.env_requires_complex, wait_message="Sy │ │ 156 │ │ ) │ │ 157 │ │ │ 158 │ def ensure_plugin_dependencies(self, dependencies: list[Dependency │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:60 in config │ │ │ │ 57 │ │ if self._config is None: │ │ 58 │ │ │ from hatch.project.config import ProjectConfig │ │ 59 │ │ │ │ │ ❱ 60 │ │ │ self._config = ProjectConfig(self.location, self.metadata. │ │ 61 │ │ │ │ 62 │ │ return self._config │ │ 63 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:406 in metadata │ │ │ │ 403 │ │ if self._metadata is None: │ │ 404 │ │ │ from hatchling.metadata.core import ProjectMetadata │ │ 405 │ │ │ │ │ ❱ 406 │ │ │ self._metadata = ProjectMetadata(self.location, self.plugi │ │ 407 │ │ │ │ 408 │ │ return self._metadata │ │ 409 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:419 in raw_config │ │ │ │ 416 │ │ │ else: │ │ 417 │ │ │ │ from hatch.utils.toml import load_toml_file │ │ 418 │ │ │ │ │ │ ❱ 419 │ │ │ │ raw_config = load_toml_file(str(self._project_file_pat │ │ 420 │ │ │ │ # Assume environment management only │ │ 421 │ │ │ │ if "project" not in raw_config: │ │ 422 │ │ │ │ │ raw_config["project"] = {"name": self.location.nam │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/utils/toml.py:18 in load_toml_file │ │ │ │ 15 │ │ 16 def load_toml_file(path: str) -> dict[str, Any]: │ │ 17 │ with open(path, encoding="utf-8") as f: │ │ ❱ 18 │ │ return tomllib.loads(f.read()) │ │ 19 │ │ │ │ /home/docs/.asdf/installs/python/3.13.14/lib/python3.13/tomllib/_parser.py:1 │ │ 10 in loads │ │ │ │ 107 │ │ │ pos += 1 │ │ 108 │ │ │ continue │ │ 109 │ │ if char in KEY_INITIAL_CHARS: │ │ ❱ 110 │ │ │ pos = key_value_rule(src, pos, out, header, parse_float) │ │ 111 │ │ │ pos = skip_chars(src, pos, TOML_WS) │ │ 112 │ │ elif char == "[": │ │ 113 │ │ │ try: │ │ │ │ /home/docs/.asdf/installs/python/3.13.14/lib/python3.13/tomllib/_parser.py:3 │ │ 57 in key_value_rule │ │ │ │ 354 │ except KeyError: │ │ 355 │ │ raise suffixed_err(src, pos, "Cannot overwrite a value") from │ │ 356 │ if key_stem in nest: │ │ ❱ 357 │ │ raise suffixed_err(src, pos, "Cannot overwrite a value") │ │ 358 │ # Mark inline table and array namespaces recursively immutable │ │ 359 │ if isinstance(value, (dict, list)): │ │ 360 │ │ out.flags.set(header + key, Flags.FROZEN, recursive=True) │ ╰──────────────────────────────────────────────────────────────────────────────╯ TOMLDecodeError: Cannot overwrite a value (at line 337, column 44) [rtd-command-info] start-time: 2026-07-13T07:59:27.660473Z, end-time: 2026-07-13T07:59:28.237827Z, duration: 0, exit-code: 1 uvx hatch run docs:build -T ╭───────────────────── Traceback (most recent call last) ──────────────────────╮ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/__init__.py:243 in main │ │ │ │ 240 │ │ 241 def main(): # no cov │ │ 242 │ try: │ │ ❱ 243 │ │ hatch(prog_name="hatch", windows_expand_args=False) │ │ 244 │ except Exception: # noqa: BLE001 │ │ 245 │ │ import sys │ │ 246 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1569 in __call__ │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1490 in main │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1970 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:1353 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:907 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/decorators.py:34 in new_func │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/run/__init__.py:157 in run │ │ │ │ 154 │ elif not env_name: │ │ 155 │ │ env_name = "system" │ │ 156 │ │ │ ❱ 157 │ ctx.invoke( │ │ 158 │ │ run_command, │ │ 159 │ │ args=[command, *final_args], │ │ 160 │ │ env_names=[env_name], │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/core.py:907 in invoke │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/click/decorators.py:46 in new_func │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/env/run.py:92 in run │ │ │ │ 89 │ except ValueError as e: │ │ 90 │ │ app.abort(f"Duplicate excluded variable: {e}") │ │ 91 │ │ │ ❱ 92 │ app.ensure_environment_plugin_dependencies() │ │ 93 │ │ │ 94 │ project = app.project │ │ 95 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/cli/application.py:155 in ensure_environment_plugin_dependencies │ │ │ │ 152 │ │ │ 153 │ def ensure_environment_plugin_dependencies(self) -> None: │ │ 154 │ │ self.ensure_plugin_dependencies( │ │ ❱ 155 │ │ │ self.project.config.env_requires_complex, wait_message="Sy │ │ 156 │ │ ) │ │ 157 │ │ │ 158 │ def ensure_plugin_dependencies(self, dependencies: list[Dependency │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:60 in config │ │ │ │ 57 │ │ if self._config is None: │ │ 58 │ │ │ from hatch.project.config import ProjectConfig │ │ 59 │ │ │ │ │ ❱ 60 │ │ │ self._config = ProjectConfig(self.location, self.metadata. │ │ 61 │ │ │ │ 62 │ │ return self._config │ │ 63 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:406 in metadata │ │ │ │ 403 │ │ if self._metadata is None: │ │ 404 │ │ │ from hatchling.metadata.core import ProjectMetadata │ │ 405 │ │ │ │ │ ❱ 406 │ │ │ self._metadata = ProjectMetadata(self.location, self.plugi │ │ 407 │ │ │ │ 408 │ │ return self._metadata │ │ 409 │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/project/core.py:419 in raw_config │ │ │ │ 416 │ │ │ else: │ │ 417 │ │ │ │ from hatch.utils.toml import load_toml_file │ │ 418 │ │ │ │ │ │ ❱ 419 │ │ │ │ raw_config = load_toml_file(str(self._project_file_pat │ │ 420 │ │ │ │ # Assume environment management only │ │ 421 │ │ │ │ if "project" not in raw_config: │ │ 422 │ │ │ │ │ raw_config["project"] = {"name": self.location.nam │ │ │ │ /home/docs/.cache/uv/archive-v0/X1XEmYKlLkvTvMU1/lib/python3.13/site-package │ │ s/hatch/utils/toml.py:18 in load_toml_file │ │ │ │ 15 │ │ 16 def load_toml_file(path: str) -> dict[str, Any]: │ │ 17 │ with open(path, encoding="utf-8") as f: │ │ ❱ 18 │ │ return tomllib.loads(f.read()) │ │ 19 │ │ │ │ /home/docs/.asdf/installs/python/3.13.14/lib/python3.13/tomllib/_parser.py:1 │ │ 10 in loads │ │ │ │ 107 │ │ │ pos += 1 │ │ 108 │ │ │ continue │ │ 109 │ │ if char in KEY_INITIAL_CHARS: │ │ ❱ 110 │ │ │ pos = key_value_rule(src, pos, out, header, parse_float) │ │ 111 │ │ │ pos = skip_chars(src, pos, TOML_WS) │ │ 112 │ │ elif char == "[": │ │ 113 │ │ │ try: │ │ │ │ /home/docs/.asdf/installs/python/3.13.14/lib/python3.13/tomllib/_parser.py:3 │ │ 57 in key_value_rule │ │ │ │ 354 │ except KeyError: │ │ 355 │ │ raise suffixed_err(src, pos, "Cannot overwrite a value") from │ │ 356 │ if key_stem in nest: │ │ ❱ 357 │ │ raise suffixed_err(src, pos, "Cannot overwrite a value") │ │ 358 │ # Mark inline table and array namespaces recursively immutable │ │ 359 │ if isinstance(value, (dict, list)): │ │ 360 │ │ out.flags.set(header + key, Flags.FROZEN, recursive=True) │ ╰──────────────────────────────────────────────────────────────────────────────╯ TOMLDecodeError: Cannot overwrite a value (at line 337, column 44)