Version remains 9.0.0, without a development suffix. All changes are local and uncommitted.
Nothing was staged, committed, pushed, tagged, published, or posted to an issue/PR.
Result: the full local tox matrix and release checks pass. The previous compatibility blocker
was reproduced and addressed by restoring the historical pipeline as the permanent default and
requiring explicit algorithm='modern' adoption. This is scoped compatibility evidence, not a
universal regression-free or deployment-safety guarantee.
| Interpreter | text-unidecode | isolated Unidecode | AnyASCII + base dependency |
|---|---|---|---|
| CPython 3.10 | 104 passed | 103 passed, 1 skipped | 104 passed |
| CPython 3.11 | 104 passed | 103 passed, 1 skipped | 104 passed |
| CPython 3.12 | 104 passed | 103 passed, 1 skipped | 104 passed |
| CPython 3.13 | 104 passed | 103 passed, 1 skipped | 104 passed |
| CPython 3.14 | 104 passed | 103 passed, 1 skipped | 104 passed |
| PyPy 3.11 | 104 passed | 103 passed, 1 skipped | 104 passed |
All 18 cells ran on macOS. The six skips deliberately omit the fallback-package test in environments where text-unidecode has been removed to isolate Unidecode. AnyASCII cells separately assert explicit AnyASCII goldens while auto still selects the base text-unidecode dependency. Dependency versions: text-unidecode 1.3, Unidecode 1.4.0, AnyASCII 0.3.3.
- A frozen implementation from baseline
7b6d5d96c1995e6dccb39a19a13ba78d7d0a3ee4is retained intools/legacy_reference.py. It is a test oracle, not shipped runtime code. Its historical formatting is intentionally excluded from style modernization. - Every matrix cell compares 2,688 input/option combinations against the baseline, for both default calls and explicit legacy calls. Additional fresh-iterator checks cover replacement replay and case-sensitive stopword consumption. Public smart_truncate checks cover 256 combinations, including matching empty-separator exceptions and negative-limit behavior.
- The entire legacy
test.pyis byte-for-byte unchanged from baseline7b6d5d96c1995e6dccb39a19a13ba78d7d0a3ee4, verified withgit diff --exit-code -- test.pyandgit diff --exit-code 7b6d5d9 -- test.py. All additional regression tests live independently intest_release.py; no baseline assertions are edited. - Independent CLI tests assert exact historical default namespace and forwarded-parameter shapes, plus explicit forwarding of every algorithm, backend, replacement-stage choice and regex patterns (including an empty pattern). Omitted new options defer to API defaults; regex is forwarded only when supplied.
- Explicit modern tests cover early entity decoding, per-reference invalid numeric handling, generator snapshots, empty/wide separator budgets, and delimiters overlapping literal word characters.
xylophone xwith separatorxand a large positive limit retainsxylophonexxin both algorithms.- Keyword-only/default signature checks and invalid algorithm checks run in source and installed API tests.
- CLI tests cover default, explicit legacy, explicit modern, rejected unknown algorithms, regex forwarding, and both module and console invocation for installed artifacts.
- Coverage gate: 99% aggregate, 734 statements, 1 missed statement, 118 branches, 2 partial branches. The existing 97% gate was unchanged. Coverage includes legacy test.py; it is not a library-only metric.
- Strict mypy: no issues in 5 source files.
- pycodestyle and flake8: passed; flake8 is now in the default tox environment list.
- Packaging: isolated PEP 517 wheel/sdist builds,
twine check --strict, archive contents, metadata,pip check, version agreement, installed API goldens and CLI behavior outside the checkout all passed. - Both artifacts were checked for MIT License-Expression, Python >=3.10, backend extras, entry point, typed marker, and license. Source archive includes regression tools/fixture and migration docs; research JSON and bytecode/cache files are excluded.
- Unicode-only runtime checks pass after uninstalling the transliteration dependency in temporary artifact environments. This does not imply a dependency-free installation extra exists.
git diff --check: passed.
The initial full run passed all runtime cells, typing, coverage and artifacts, but found an E402 import-order error in the test wrapper. That error was corrected; the complete matrix and all other tox environments were rerun successfully. No failing check remains from that run.
The untouched-baseline follow-up added two independent CLI test methods and reran the complete tox suite.
The first follow-up run could not discover the existing Python 3.12 interpreter; adding
/Users/val/.pyenv/versions/3.12.11/bin to PATH fixed discovery without changing repository configuration.
The complete rerun passed all 18 runtime cells and every quality/packaging environment (24 environments
including coverage setup/report). The table above records this latest run: 1,866 passes and six deliberate
skips across the runtime matrix.
Logs are retained locally at /tmp/slugify-untouched-tests-tox.log (initial follow-up) and
/tmp/slugify-untouched-tests-tox-final.log (successful complete rerun). Earlier algorithm opt-in logs remain
at /tmp/slugify-optin-tox.log and /tmp/slugify-optin-tox-final.log. The established runner was
/Users/val/.dojo/workspace/scratch/667f1ab2-86f5-49ee-a130-01c846192281/slugify-test-runner/bin/tox.
Artifacts were validated in temporary directories; these checks do not retain a publishable final artifact set. Rebuild with
python tools/check_dist.py --outdir /path/to/new-empty-directory when maintainers authorize final retention.
Windows/Linux execution, optional dependency lower-bound testing, real downstream stored-slug comparisons, and full regression execution against installed artifacts remain unverified. Artifact tests are focused API/CLI checks; matrix suites run from the checkout. Backend upgrades and custom replacement/regex policies can still change outputs. CLI regex forwarding is intentionally fixed even under legacy mode.
New tests, tools, and docs remain untracked and must be included in an eventual reviewed commit. Final maintainer review, downstream migration decisions, public replies, publication and tags remain separate actions requiring approval. README correctly describes an unpublished local checkout; update publication-facing wording only when an actual publication occurs.
Earlier pre-opt-in runs passed 99 tests per full backend cell but failed compatibility comparison for entities, wide/empty separators, iterators and delimiter-overlapping word content. Those test passes did not establish legacy compatibility. The results above supersede those earlier runtime and compatibility claims. See migration.md for the exact legacy/modern boundary and remaining application precautions.