Skip to content

Validation record

Checks were run on 2026-10-07 with macOS arm64 and Python 3.12.8. A local LOCATA snapshot was used read-only. Its local path is omitted; paths in commands are placeholders. Local results below are distinct from remote GitHub Actions execution.

Initial implementation: synthetic tests and development checks

Check Result
uv run pytest -q, without LOCATA_ROOT 62 passed, 12 optional integration tests skipped
uv run ruff check . Passed
uv run ruff format --check . Passed, 17 Python files
uv run ty check Passed for source and examples
uv build Wheel and sdist generated
Wheel and sdist inspection py.typed included; no real data, PDFs, ZIPs, virtual environment, or caches
README Python example Passed with only the corpus path replaced by a temporary fixture

Mandatory fixtures are small synthetic DOUBLE WAV and TXT files in temporary directories. No real data was copied into the repository. Specifications and tests preceded implementation: four import collection errors were confirmed before the package existed. Duplicate annotation times found in real data also received a documented regression test that failed before the implementation fix.

Synthetic tests cover numeric index order, multiple arrays and source IDs, optional absence, corrupt mandatory files, dtype, and agreement with original waveforms. They exercise independent clocks, the 4 ms offset, date rollover, duplicate pose times, validity flags, rotations, and angle boundaries.

Window tests cover hops, short recordings, tails, annotation boundaries, empty source intervals, partial WAV frame counts, sparse TXT index reuse, and cache limits. Loader tests cover padding, masks, Subset, samplers, shuffle, spawn with two workers, pickling, and no writes beneath the dataset root. VAD verification uses synthetic data and does not validate actual final-release VAD files.

Real-data integration

The integration run passed all 12 tests. With a placeholder for the actual root, the command was LOCATA_ROOT=/path/to/LOCATA uv run pytest -m integration -v. Header indexing found 72 dev and 154 eval array WAVs. The checked headers had 15 dicit, 4 dummy, 32 eigenmike, and 12 benchmark2 channels, at 48 kHz. The integration run checked the index and the following representative recordings, not every waveform payload.

Recording Checked source IDs and configuration
dev/task1/recording1/benchmark2 loudspeaker1, static single source
dev/task2/recording1/dicit loudspeaker3, loudspeaker4, multiple sources
dev/task3/recording2/dummy hendrik, moving source and duplicate pose times
dev/task5/recording1/eigenmike christine, moving array
dev/task6/recording3/benchmark2 christine, hendrik, moving array and multiple sources
eval/task1/recording1/eigenmike No source ground truth, source audio, or VAD
eval/task4/recording3/dummy No source files
eval/task6/recording3/benchmark2 Moving array, no source files

For each representative recording, partial waveforms matched an independent SoundFile read. Channel counts, clocks, microphone positions, and available source audio and poses were checked. The static reference recording was also read in full: 155072 samples, 389 pose rows, audio beginning at 15:40:25.068, and pose and required times beginning at 15:40:25.064. Relative times were 0 and -0.004 seconds, without a fixed correction. Full-waveform slices exactly matched window reads. Its DataLoader passed with zero workers and explicit spawn with two.

The WAV-less eval/task4/recording4/dicit and eval/task6/recording5/dicit directories were excluded and surfaced through warnings and missing_audio. Input sizes and modification times matched before and after index construction and representative reads.

The real-data spawn test transferring large tensors stalled inside the sandbox; it was interrupted and the same read-only check passed outside the sandbox. Synthetic spawn checks also passed inside the sandbox.

Executable examples

examples/read_locata.py ran against the real root with zero workers and spawn with two workers. Both returned [4, 32, 48000] batches at 48 kHz. Shuffled recordings included tasks 3, 4, 5, and 6 and multiple sources.

The initial checks used Torch 2.14.1, NumPy 2.5.3, SoundFile 0.14.0, pytest 9.1.1, Ruff 0.16.10, and ty 0.0.85.

English documentation and Zensical migration

The documentation migration was checked separately on 2026-10-07. README and all documentation sources are English, including public API docstrings. The existing English AGENTS.md was preserved. Zensical 0.0.68, mkdocstrings-python 2.0.9, and mkdocstrings 1.0.6 were installed through the optional docs dependency group; runtime dependency versions remained unchanged.

Check Result
uv run pytest -q, without LOCATA_ROOT 71 passed, 12 optional integration tests skipped
README and getting-started examples Both executed unchanged except for the synthetic fixture root
Link-checker regression tests Passed for page/asset references, fragments, missing targets, directory URLs, and escaping paths
uv run ruff check . and uv run ruff format --check . Passed
uv run ty check Passed for source, examples, and the documentation checker
uv run --group docs zensical build --clean --strict Passed without warnings; 10 documentation pages
uv run python scripts/check_docs_links.py site All local page, HTML-fragment, and asset references resolved
Skill-provided direct-file link checker Passed for all 10 documentation pages
uv run --group docs zensical serve Started the local preview at http://localhost:8000
Safari local-file preview Sidebar navigation opened the API reference; the overview's content link opened the tutorial; API content and tutorial code rendered
Safari local-file search Query inclination returned the API and angle-convention sections
uv build and archive inspection Wheel and sdist built; py.typed present; generated site/, .cache/, and virtual-environment files excluded
Source language audit No Japanese characters found in Markdown, Python, TOML, or workflow sources

The new tutorial and link-checker tests were run before their files were added, confirming the expected missing-file failures. The documentation-only change did not rerun the real-data integration suite; those 12 passed checks are the earlier implementation results recorded above. Documentation checks are included in CI, but remote CI and site publication had not been performed at that stage.

Release planning and placeholder roots

The release plan and documentation path changes were checked on 2026-10-07. README and tutorial examples use /path/to/LOCATA. Their execution tests first failed because the old fixture substitution no longer matched, then passed after the substitution was updated to the placeholder. The production reader API was not changed.

Check Result
uv run pytest -m 'not integration' -q 71 passed, 12 integration tests deselected
uv run ruff check . and uv run ruff format --check . Passed
uv run ty check Passed
uv build --no-sources Wheel and sdist built
uv run --group docs zensical build --clean --strict Passed; 11 documentation pages
uv run python scripts/check_docs_links.py site All local page, fragment, and asset references resolved
Documentation language and path audit English sources; no user-specific dataset paths

Official archive sizes and checksums were read from Zenodo metadata. Bounded HTTP range requests inspected only ZIP64 end records and central directories, including declared expanded sizes and VAD filenames. No complete archive or audio/VAD payload was fetched. Dataset contents were not modified, and real-data integration was not rerun. These checks do not validate the planned downloader or release workflow.

Published-package usage instructions

At this documentation stage, the README and getting-started guide described pip/uv installation after publication, use from an application, shared roots, and the planned download API/CLI. Reader examples were distinguished from pending release features.

The README/tutorial execution and link-checker tests passed: 10 tests. Strict Zensical build, generated-site link checks, and uv build --no-sources passed. Documentation remained English with placeholder dataset paths. PyPI installation commands were not executed; environment lookup and downloader examples still required implementation. The library code and dependencies were unchanged.

Path configuration, downloader, and release preparation

The release implementation was checked on 2026-10-07. Documentation and new tests preceded implementation: configuration/CLI imports and the download API initially failed collection, and the release validator initially failed because its file did not exist. Cache-space, portable-path, and eval-only CLI regressions also failed before their fixes.

Check Result
Synthetic tests, Python 3.12.8, current dependencies 146 passed; 12 integration tests deselected
Synthetic tests, Python 3.10.16, minimum direct dependencies 146 passed; 12 integration tests deselected; installed wheel, not editable source
Existing-data integration, Python 3.12.8 All 12 tests passed again, including zero/spawn workers
Reader path configuration Explicit/env/managed priority, empty/invalid settings, no implicit writes/network, expansion, pickle, and spawn passed
Downloader and installation Local HTTP and forced ZIP64 fixtures passed for resume, retries, response sizes/ranges, hashes, concurrent locking, inventories, byte preservation, space limits, unsafe paths, CRC errors, and both prepared-state crash boundaries
CLI Existing-root path, missing-data error, download argument selection, and an eval-only managed installation passed
Release validator Stable/RC routing, manual no-publish behavior, exact tag/version matching, licenses, dependencies, typing markers, excluded assets, and artifact hashes passed
Ruff lint/format and ty Ruff passed for all Python files, including tests; ty passed for source, examples, and scripts; 40 formatted files
uv lock --check Passed
uv build --no-sources --clear Wheel and sdist built with Apache-2.0 license and py.typed; no corpus or generated site assets
twine check --strict Both artifacts passed, including README rendering
Isolated base wheel, download-extra wheel, and sdist consumers Passed outside the checkout on Python 3.13; each checked waveform/clock agreement, CLI, padding, and spawn with two workers
Strict Zensical and generated link checks Passed; 12 pages and 1,407 local page/fragment/asset references
GitHub workflow syntax, actionlint 1.7.12 Passed

Current dependencies were Torch 2.14.1, NumPy 2.5.3, SoundFile 0.14.0, platformdirs 4.12.3, and filelock 4.0.12. Minimum direct versions were Torch 2.4.0, NumPy 1.26.0, SoundFile 0.12.0, platformdirs 4.3.8, and filelock 3.20.0. Uv 0.11.20 is pinned in the workflows. The minimum-dependency run and real-data spawn run required execution outside the sandbox because its shared-memory restriction rejected Torch/OpenMP; the same checks passed there.

No official LOCATA archive was downloaded for these checks. All download traffic went to a temporary local HTTP server with synthetic bytes. Existing corpus files stayed read-only. Real final-release VAD/audio/annotation payloads are unverified; passing synthetic transport/VAD tests does not validate them.

The public target repository taishi-n/torchlocata and local origin were created. pypi and testpypi environments require taishi-n approval and version tags; github-pages is tag-restricted. The owner confirmed PyPI/TestPyPI pending publisher registration; the OIDC upload will verify that configuration. Push, remote CI, TestPyPI rehearsal, PyPI publication, and Pages deployment were pending at the end of local preparation.

Release candidate and remote CI

The signed preparation commit e5318cc was pushed to main. The initial remote CI run passed all Linux Python 3.10–3.14 jobs, the Linux minimum-dependency job, and the macOS Python 3.12 job. Each passed the mandatory suite and installed-consumer spawn check. The Windows suite passed 145 tests and failed the backslash ZIP-name fixture: Windows had normalized its name before it was written.

The fixture now preserves raw ZIP names. A new NUL-name regression also failed before a fix that rejects normalization or truncation of original member names. The corrected local suite passed 147 tests, with 12 integration tests deselected, on Python 3.12.8. The candidate was required to pass the full matrix before its tag was pushed. Publication and public consumer installation were pending then. Candidate lint, formatting (41 Python files), type checks, strict README rendering, wheel/sdist inspection, and v0.1.0rc1 routing passed locally. The strict Zensical build passed with 13 pages and 1,451 local references.

The candidate main CI run then passed all nine jobs. All eight test jobs passed 147 tests with 12 integration tests deselected, plus installed-consumer checks with two spawn workers. This includes Windows Python 3.12, macOS Python 3.12, Linux Python 3.10–3.14, and Linux Python 3.10 with the minimum direct dependencies. The validation job passed lint, formatting, ty, build/metadata checks, strict README rendering, three isolated artifact consumers, strict Zensical, and generated-site link checks. The signed v0.1.0rc1 tag points to the same candidate commit 7a5124f.

Pages is configured for GitHub Actions and HTTPS. Its canonical URL inherits the account's existing custom domain: https://taishi.org/torchlocata/.

TestPyPI rehearsal

The candidate release run passed the full matrix, quality checks, and isolated artifact consumers again. After taishi-n approved the testpypi environment, OIDC published 0.1.0rc1. Its wheel and sdist SHA-256 values matched the original validated CI artifact inventory:

Artifact SHA-256
locata_torch-0.1.0rc1-py3-none-any.whl 99754a7501a37bdee499ab5dd2b6fde6775e012d90769ac86275560732de41fb
locata_torch-0.1.0rc1.tar.gz 64fc949d1877b52692324935c06e572eb3776f1220f271bb73892687446b2b92

A new Python 3.12.8 environment outside the checkout received normal dependencies from PyPI, then the exact TestPyPI version with --no-deps. The import resolved to that environment's site-packages. Its synthetic installed-consumer check passed for waveform/clocks, padding, CLI, and two spawn workers. All 12 read-only integration tests passed against the existing LOCATA snapshot, and the documented example returned a [4, 32, 48000] batch at 48 kHz with two spawn workers.

No LOCATA archive was downloaded. This rehearsal preceded the stable v0.1.0 tag and the public-consumer checks below.

Stable PyPI release and public consumers

The signed commit 23cf99c and signed tag v0.1.0 identify the stable release. The stable main CI run and release run both passed the full platform/version matrix, minimum dependencies, quality and artifact checks, isolated consumers, and strict documentation checks. The release validated tag/version agreement and routed to pypi. After taishi-n approved that environment, OIDC published 0.1.0 and deployed Pages.

PyPI's exact-version JSON reported Apache-2.0, Python >=3.10, and the canonical documentation URL. Its two public distribution SHA-256 values matched the original validated release artifacts and their downloaded bytes:

Artifact SHA-256
locata_torch-0.1.0-py3-none-any.whl 611a166915b28ffab0a4dec93a2ae73c5ebb2dfc0ad2463b28ca3f382eaf2fb5
locata_torch-0.1.0.tar.gz 9a5440b772f0306ea7d9daa9daeeedbadea1f7023b9674655155340e0b3a9af9
Public-consumer check Result
Fresh Python 3.12.8 environment: python -m pip install "locata-torch==0.1.0" Installed package and normal runtime dependencies from PyPI
Published import and installed smoke Imported from the independent environment's site-packages; waveform/clocks, padding, CLI, and two spawn workers passed
Existing LOCATA snapshot with the pip-installed version All 12 read-only integration tests passed
Documented real-data example with zero and two workers Both returned [4, 32, 48000] batches at 48 kHz
Separate uv project: uv add "locata-torch[download]" Resolved public version 0.1.0; installed smoke and two spawn workers passed on Python 3.13.1
Hosted overview, getting-started guide, and API reference HTTP 200 at https://taishi.org/torchlocata/, getting-started.html, and api.html

All corpus verification used the existing snapshot; no LOCATA archive was downloaded. Synthetic downloader tests and archive-directory inspection remain separate from unverified real final-release payloads. Post-publication records are updated through the manual documentation workflow without changing or republishing the tagged Python artifacts.

Remaining verification scope

Final-release payloads and execution against MATLAB remain unverified. The full configured platform/version matrix passed remotely after the ZIP-name fix. Archive-directory inspection in the release plan does not replace payload validation.

Interpolation, resampling, dense ground truth, and official evaluation remain outside scope. The initial reader/documentation commit is c44f923. Public TestPyPI and PyPI installation, published artifact hashes, and hosted documentation have been verified as recorded above.