- Python 99.6%
- Shell 0.3%
| ci | ||
| docs | ||
| fixture_pipeline | ||
| m1_pipeline | ||
| overrides | ||
| profiles | ||
| schemas | ||
| sources | ||
| tests | ||
| tools | ||
| .dockerignore | ||
| .gitignore | ||
| .python-version | ||
| AGENTS.md | ||
| fixture | ||
| LICENSE | ||
| LICENSE-CC-BY-4.0 | ||
| LICENSE-CC0-1.0 | ||
| m1 | ||
| NOTICE.txt | ||
| pyproject.toml | ||
| README.md | ||
| uv.lock | ||
Hanzi Draw Audio
Audio files for the Hanzi Draw app.
M0 contract fixture
This repository contains the offline fixture pipeline and language-neutral
contracts defined in docs/phases/M0-CONTRACTS.md. It does not contain a
production corpus, production pack, native application integration, or a
pronunciation-quality claim.
Provisioning (separate, network-enabled)
Use Python 3.14.9 and install the exact locked dependencies before entering the offline build/test environment:
python3.14 -m venv venv
venv/bin/python -m pip install uv==0.9.7
UV_PROJECT_ENVIRONMENT=venv venv/bin/uv sync --frozen
The OCI builder base and platform digests are pinned in
tools/toolchain.lock.json and tools/Containerfile. Dependency installation,
image building, and lock refreshes are provisioning operations, not artifact
stages.
Offline stages
Dependencies and FFmpeg/FFprobe with libopus must already be present. Set the recorded epoch, then run the stages independently:
export SOURCE_DATE_EPOCH=1767225600
./fixture build --offline --locked
./fixture validate
./fixture report
./fixture release --offline --locked
Build writes the unvalidated build/candidate/pack/, candidate.tar, demand
catalog, and fixture-only coverage/QA reports. Validate writes only the external
build/candidate/validation-result.json; it never repairs the candidate.
Report writes deterministic JSON and Markdown summaries and cannot grant
validation or release approval. Release additionally requires a clean pinned
checkout and a passing applicable validation, reconstructs in an empty ignored
directory, and requires byte-identical outputs before writing
dist/0.0.0-fixture.1/fixture.tar and fixture.tar.sha256.
Run the complete test matrix through the single network-isolated CI entry point:
./ci/offline-test
The entry point uses an unprivileged user+network namespace (unshare -Urn),
requires no sudo, performs no dependency sync/resolution, and supplies the
locked epoch. All fixture commands and their subprocesses inherit the isolated
namespace.
Fixture evidence and remaining M0 gates
The tracked WAV files are deterministic, explicitly labeled non-speech technical stand-ins, not human speech or TTS. They allow the byte-level pipeline to be tested without importing a corpus. Before claiming the complete M0 exit gates, replace them with at most eight original human-spoken CC BY 4.0 recordings with documented permission, refresh the reviewed locks/pins, and complete the external application review and immutable fixture publication. The technical pipeline does not fabricate those recording, review, or publication gates.
M1 Yue Tan evaluation tooling
The repository also implements the locked-input inventory, matching, and
potential-coverage pipeline specified in docs/phases/M1-YUE-TAN.md. The
implementation is exercised with synthetic dictionary, frequency, archive, and
FLAC fixtures. It does not include the Yue Tan corpus, selected production
native-application inputs, a production coverage result, or a GO decision.
An offline rebuild requires exactly four canonical reviewed inputs under the
lock directory: dictionary.lock.json, frequency.lock.json,
source.lock.json, and reviews.json. Their schemas are in
schemas/internal-v1/m1-*.schema.json. The cache must contain exactly the
lock-named dictionary, frequency, source archive, notice, and original FLAC
files; missing, extra, changed, symlinked, or ambiguous inputs fail closed.
./m1 rebuild --offline --locked \
--locks sources/m1 --cache cache/m1 --output build/m1
The output directory contains the demand catalog and occurrence sidecar,
extraction and frequency-provenance reports, source inventory, match catalog,
exact potential-coverage JSON, deterministic Markdown report, and an
artifact-hash manifest. Rebuilds perform no network access or audio
transformation. Only explicit, occurrence-specific reviewed matches can enter
match_accepted; this remains distinct from M2 release_accepted.
Acquisition is a separate operation and requires an approved canonical review
naming the exact archive, retrieval policy, authenticity evidence, and redirect
chain. It is never triggered by rebuild:
./m1 fetch --review sources/acquisition/cmn-caen-tan.review.json \
--destination cache/m1/cmn-caen-tan.tar.xz \
--record build/acquisition/cmn-caen-tan.record.json
m1_pipeline.acquisition.extract_archive provides bounded, traversal-safe
tar.xz inspection/extraction for the subsequent reviewed source-lock
preparation step. A maintainer-supplied GO/NO-GO/DEFERRED record can be checked
against the exact artifact manifest and all four lock hashes without issuing or
modifying a decision:
./m1 validate-decision --offline --locked \
--decision path/to/decision.json \
--manifest build/m1/artifact-manifest.json --locks sources/m1
The documented entry gates still apply: complete M0, select and review the native application and frequency inputs, complete the exact Yue Tan source review, and obtain explicit maintainer approval before the first fetch. Real M1 completion additionally requires the locked-corpus evaluation and immutable maintainer GO/NO-GO record; a GO record must preapprove every M2 budget. The fixture tests do not fabricate those gates.
Licensing
Pipeline code is GPL-3.0-or-later. The handmade dictionary and expected metadata
are CC0-1.0. Fixture audio is separately licensed CC BY 4.0 with its own notices.
See NOTICE.txt, tests/fixtures/source/NOTICE.txt, and the three license files.
These rights do not cross-apply between code, data, and recordings.