# Historical issue and pull-request review for release 9 ## Scope and evidence Reviewed on 2026-09-08 against local commit `7b6d5d96c1995e6dccb39a19a13ba78d7d0a3ee4` of [un33k/python-slugify](https://github.com/un33k/python-slugify). **All 166 consecutive items #1–#166 are covered: 78 issues and 88 pull requests.** GitHub reports **64 merged PRs and 24 closed-unmerged PRs**, with no open PRs in this range; #166 is the only open issue. Closed does not mean fixed, and merged does not mean still present or released. Read every available item body and its repository-wide issue comments, inline review comments, and PR review summaries. Coverage: **427 issue/PR discussion comments, 16 inline comments, and 13 review records across all 88 PR endpoints**. Bodies and discussions, not titles alone, drive the decisions below. Fetched file diffs for all 24 closed-unmerged PRs; inspected the substantive candidate patches in depth (#3, #43, #47, #48, #76, #125, #132, #134, #155, #163). No implementation changes, full test suite, builds, installs, publishing, or remote mutations were performed. The small current-code reproductions below were explicitly requested independent validation of historical concerns, not a full regression certification. The adjacent [historical-evidence.json](historical-evidence.json) preserves the scoped public API evidence (including review records and unmerged file diffs), with authentication-shaped URLs redacted. Raw paginated responses are in session scratch `historical-166/`. All GitHub requests used public read-only `gh api` endpoints with pagination: `issues?state=all&per_page=100`, `pulls?state=all&per_page=100`, `issues/comments`, `pulls/comments`, and each PR's `reviews`; file diffs used `pulls/{number}/files`. Number filtering was applied locally because issues and PRs share a numbering space. Deleted comments, external screenshots, external linked discussions, and unavailable historical branch content cannot be reconstructed from this API snapshot. No claim is made that every external linked artifact was reviewed. **Disposition counts:** Addressed 35; Merged/addressed 59; Superseded 24; Defer 22; Revive 24; Decline 2. “Revive” includes follow-up to a merged item when its goal is incomplete or regressed, and can mean tests/docs rather than accepting original code. “Superseded” explicitly identifies a successor or changed premise. “Defer” means a legitimate but unproven/out-of-core/product-policy request; not a claim that its use case is invalid. ## Release recommendations, in priority order ### T1 — Separator semantics and actual output length (high priority) Sources: [#47](https://github.com/un33k/python-slugify/pull/47), [#91](https://github.com/un33k/python-slugify/issues/91), [#107](https://github.com/un33k/python-slugify/issues/107). **Revive Klaas Hoekema's (@KlaasH) intent and regression cases.** Current `slugify/slugify.py:171–195` substitutes an internal dash, truncates, then globally exchanges dashes for the requested separator. Independent reproduction: - `slugify('hyphen-having text FTW!', separator='_', regex_pattern=r'[^-a-z0-9]')` → `hyphen_having_text_ftw`, not the requested literal-hyphen-preserving output. - `slugify('a b c', separator='---', max_length=5)` → `a---b---c` (9 characters). The documented output length is exceeded. Decide whether release 9 changes this contract or exposes an explicit compatibility mode. Count the final separator width when budgeting length; preserve input characters allowed by the caller independently of generated delimiters. Test multi-character and empty separators, regex metacharacters and backslashes, literal dashes/underscores, exact word fits, stopwords, and both save_order modes. **Do not cherry-pick #47 unchanged:** its dynamic character class interpolates an unescaped separator, `re.sub` replacement strings have escape semantics, the repeat regex quantifies only the last component for multi-character separators, and `strip(separator)` removes a character set rather than whole tokens. A token-based implementation avoids these traps without collision-prone sentinels. ### T2 — Explicit replacement stages, iterables, and input contract (high priority) Sources: [#94](https://github.com/un33k/python-slugify/issues/94), [#119](https://github.com/un33k/python-slugify/issues/119), [#144](https://github.com/un33k/python-slugify/issues/144); related #65–#67, #102, #123. **Credit Jacobo de Vera (@jdevera) for the explicit pre/post proposal and @andriyor for original replacements.** Current `slugify/slugify.py:108–115,185–188` traverses replacements twice, before and after filtering. `slugify('a', replacements=[('a','aa')])` returns `aaaa`, not `aa`. Rules targeting '-' rewrite generated separators; a one-shot iterable cannot be replayed, so the accepted Iterable annotation exposes a real semantic distinction from lists. Post replacements also can reintroduce punctuation after filtering. Specify one-pass pre- and post-replacement contracts, with an explicit compatibility path for existing two-pass behavior. Choose whether final output validation occurs after postprocessing. Test list/generator equivalence if promised, ordered cascading rules, empty replacements, stopwords, separators, and output length. Current text annotation is str, but bytes decoding is reachable; integer failure does not prove the bytes branch dead. Decide to document strict str-only input or preserve deliberate UTF-8 bytes support, and enforce it before replacement calls. Do not infer consent to break bytes users from #144's mistaken unreachable-code claim. ### T3 — Unicode, quotes, and entity decoding order (high priority) Sources: [#17](https://github.com/un33k/python-slugify/issues/17), [#30](https://github.com/un33k/python-slugify/issues/30), [#79](https://github.com/un33k/python-slugify/issues/79), [#142](https://github.com/un33k/python-slugify/issues/142), [#153](https://github.com/un33k/python-slugify/issues/153). Current `slugify/slugify.py:117–160` preprocesses only ASCII quotes, transliterates before decoding entities, then normalizes without retransliterating. Measured on the local interpreter/backend: | Input/options | Current output | Meaning | |---|---|---| | `Baby’s shoes` | `babys-shoes` | Curly input apostrophe becomes generated quote and is removed. | | `Baby's shoes` | `baby-s-shoes` | ASCII input apostrophe is a separator. | | `你` | empty string | Non-Latin entity decoded after transliteration is filtered away. | | `你` | `ni` | Direct Unicode is transliterated. | | `𝐚́́𝕒́` | `aa` | #143 already fixed direct stylized letters. | | `ㅋ`, allow_unicode=True | `ᄏ` | NFKC changes U+314B to U+110F; retention is not exact preservation. | Retain separate named/decimal/hex flags (#79 was resolved by disabling all three). Add literal-versus-encoded non-Latin and quote equivalence tests, invalid numeric references mixed with valid ones, and backend-specific golden outputs before reorganizing stages. Broad exception handling around an entire numeric substitution (lines 136–147) is worth replacing with explicit per-reference policy, but this is a new behavior decision, not an already-verified fix. Preserve #17's distinction between input punctuation and backend-generated phonetic quotes. For #153, document normalization and consider an opt-in policy; do not silently change NFKC defaults or claim pre-replacements always preserve the original jamo. ### T4 — Backend stability and factual licensing/install documentation (high priority docs; backend redesign gated) Sources: [#7](https://github.com/un33k/python-slugify/issues/7), #49–#53, #59, #68–#73, [#126](https://github.com/un33k/python-slugify/pull/126), [#128](https://github.com/un33k/python-slugify/issues/128), [#140](https://github.com/un33k/python-slugify/issues/140), [#163](https://github.com/un33k/python-slugify/pull/163), [#166](https://github.com/un33k/python-slugify/issues/166). **Revive Nathan Drezner's (@ndrezn) clarity and compatibility-test contributions, not the unconditional AnyASCII switch.** Source facts: `setup.py:14–15` always requires text-unidecode and adds Unidecode with the extra. `slugify/slugify.py:8–11` prefers Unidecode whenever installed, including an unrelated dependency installing it. Extras do not subtract base requirements. The discussion ultimately acknowledges text-unidecode's Artistic-or-GPL choice; its mere installation is not the same claim as choosing GPL terms. README already has an Artistic note (#130), but “alternative” and “GPL & Perl Artistic” wording is easy to misread. State actual installed packages, runtime selection, each offered license choice, and link to upstream license texts without categorical “no legal risk” promises. Historical comments are not legal authority, and this research did not independently audit all dependency licensing files. #163's examples show Chinese word-boundary differences and Greek beta differences; its patch changes actual test expectations from ying-shi-ma to yingshima and kompiuter to kompyuter. Preserve a multilingual differential corpus and consider explicit backend selection/visibility only with an output-stability plan. Users persisting URLs, keys, and filenames need migration guidance and must not have defaults changed merely because a major version permits it. Backend-free allow_unicode would need lazy imports plus an installation-contract decision; adding an extra alone cannot remove the mandatory base requirement. The discussion's assertion about AnyASCII requiring precompiled binaries was **not independently verified** and should not be repeated as a proven rejection rationale. ### T5 — Installed artifacts, CLI parity, and complete packaging modernization (release gate) Sources: [#43](https://github.com/un33k/python-slugify/pull/43), [#74](https://github.com/un33k/python-slugify/pull/74), [#92](https://github.com/un33k/python-slugify/pull/92), #96, #114, [#141](https://github.com/un33k/python-slugify/issues/141), [#159](https://github.com/un33k/python-slugify/pull/159), #160/#164. **Credit Patrick Sodré (@sodre), @jayvdb, Jacobo de Vera (@jdevera), and Kurt McKee (@kurtmckee).** - Build clean sdist and universal pure-Python wheel, install them outside the checkout, and smoke-test both console script and module execution. #43 supplied this exact installed-command testing idea years before the command disappeared in #114. Do not add native manylinux machinery for a pure-Python package. - Fix CLI parity: `slugify/__main__.py:35–36` parses regex_pattern but `:68–82` omits it from the forwarded dict. Independent parse/forward reproduction confirms the missing key. Add a real command output test with underscores/custom pattern; existing parameter mocks can codify the omission. - Explicitly include test.py in sdist, preserve LICENSE and py.typed, exclude caches. #74 was merged, but current `MANIFEST.in:1–3` only lists license/README/changelog and #141 reported missing tests. Modern setuptools might auto-include tests; **archive contents must be measured before claiming this still fails**. No build was run in this read-only review. - Complete #159's warning: `setup.py:29–46` still shells out to deprecated universal-wheel build, upload, and tag commands without checking results. Replace release procedure with modern build/validation and separately authorized publishing; do not run the existing publish shortcut in this research. - Synchronize `README.md:19–25` support matrix with `setup.py:11` and #160/#164's >=3.10 baseline. Strict mypy and dual-backend tox already exist; preserve them rather than count them as missing work. ### T6 — A short quickstart plus a precise cookbook (high-value low-risk revival) Sources: [#48](https://github.com/un33k/python-slugify/pull/48), [#81](https://github.com/un33k/python-slugify/issues/81), #85/#86, [#120](https://github.com/un33k/python-slugify/issues/120), [#156](https://github.com/un33k/python-slugify/issues/156). **Credit Klaas Hoekema, Jacobo de Vera, and Arian (@Arian-Ott; public profile name is only “Arian”).** README still uses self.assertEqual outside a runnable unittest context. Provide a minimal standalone Python and CLI example, retain complete option definitions, and move advanced interactions into tested recipes. Include install-name/import-name distinction, all three entity flags, empty outputs, normalized Unicode retention, limits of URL/filename/XML safety, explicit locale substitutions, and accurate special.py exports. Request the Debian manpage and its license/attribution before importing; none is present here and no manpage PR <=166 supplies its content. Do not invent its text or claim it was already contributed. ### T7 — Uniqueness is useful but must be explicitly scoped (defer core API) Source: [#76](https://github.com/un33k/python-slugify/pull/76), **Steve Loria (@sloria)**. Document-local heading IDs and form-local IDs are valid even in multi-instance applications; the historical global-uniqueness objection does not negate them. Still, the submitted stateful class appends suffixes past max_length, infers separator only from kwargs, and provides no persistent/concurrent uniqueness. Offer a tested caller-owned recipe or separate optional utility only if requested, with collision domain, suffix budget, empty-base and preexisting-suffix behavior stated. Never describe it as database uniqueness. ### T8 — Development workflow and fuzzing (selective follow-up) Sources: [#127](https://github.com/un33k/python-slugify/issues/127), [#131](https://github.com/un33k/python-slugify/pull/131), [#132](https://github.com/un33k/python-slugify/pull/132), [#165](https://github.com/un33k/python-slugify/pull/165). **Credit Rik (@rikfie), Christian Clauss (@cclauss), and Kurt McKee.** #160 already enables strict mypy, both backends, and PR testing. Consolidate duplicate workflow definitions only after documenting which branch receives contributions; #132/#152 explain why historical branch targeting caused friction. The old #132 diff is not a complete duplicate-run suppression solution. #131 was merged and reverted (#136) because setup-python cache discovery failed; modern Ruff migration is optional, not a correctness gate. The current badge image targets main.yml while its clickable link targets ci.yml (README:214–215). Start bounded fuzz/property tests for numeric references, length, idempotence under documented options, Unicode normalization, and iterable/replacement interactions. Rik's OSS-Fuzz offer includes a 90-day disclosure-response expectation; external enrollment and publishing a maintainer address require a willing owner and are **not authorized by this read-only research**. Keep cleanup of #155 separate from behavior changes; smaller coherent helpers are better than splitting every conditional just to lower a complexity score. ## Every historical item PR state is the API merged_at field, not inference from a closing comment. Linked titles and public account handles are retained for attribution. Theme references above contain deeper recommendations and acceptance criteria. | # | Item / author | API status | Disposition | Rationale / follow-up | |---|---|---|---|---| | 1 | [Separator argument added.](https://github.com/un33k/python-slugify/pull/1) · @fedale | PR closed, unmerged | Addressed | Separator shipped manually in 0.0.4 per maintainer, although PR was not merged; current separator parameter exists. Do not restore patch. | | 2 | [Support python 3](https://github.com/un33k/python-slugify/pull/2) · @arthurdarcet | PR merged 2013-05-21 | Merged/addressed | Python 3 port merged; obsolete conversion machinery is superseded by Python >=3.10 support. | | 3 | [word_boundary problem](https://github.com/un33k/python-slugify/pull/3) · @voronind | PR closed, unmerged | Superseded | Submitted truncation patch explicitly broke a single-word case and lacked tests; later #8 fixed length accounting. Preserve exact-fit/single-word regressions rather than this patch. | | 4 | [fix file reading in python 3](https://github.com/un33k/python-slugify/pull/4) · @pudo | PR merged 2014-01-05 | Merged/addressed | Python 3 file-reading fix merged; current packaging uses UTF-8 open calls. | | 5 | [Console entry point](https://github.com/un33k/python-slugify/pull/5) · @ekamil | PR merged 2014-08-17 | Merged/addressed | Console entry point merged; currently setup.py:83. Later removal/restoration tracked in #114. | | 6 | [Python 3 support?](https://github.com/un33k/python-slugify/issues/6) · @jleclanche | Issue closed | Addressed | Reporter resolved installation by reinstalling; traceback suggests a different slugify distribution. Include package-identity troubleshooting, not another Python 3 port. | | 7 | [python-slugify depends on a GPL library](https://github.com/un33k/python-slugify/issues/7) · @sekrause | Issue closed | Superseded | Original mandatory Unidecode concern evolved through #52/#70/#73/#130. Current default is text-unidecode; consolidate factual license/install documentation (theme T4), not historic legal assurances. | | 8 | [Fix bug (len of output string)](https://github.com/un33k/python-slugify/pull/8) · @dioexul | PR merged 2015-02-22 | Merged/addressed | Exact-fit truncation fix merged; current next_len equality branch includes final word. Multi-character output length remains separate #47 work. | | 9 | [Add parameter 'save_order'.](https://github.com/un33k/python-slugify/pull/9) · @dioexul | PR merged 2015-02-26 | Merged/addressed | save_order implemented; discussion demonstrates one-two rather than one-two-four. Keep regression examples and #157 clarification. | | 10 | [Emoticons fail](https://github.com/un33k/python-slugify/issues/10) · @powtac | Issue closed | Defer | Emoji naming has no agreed output contract; mixed text is cleaned and emoji-only can be empty. Document replacement/custom-regex options; do not promise automatic Unicode-name transliteration. | | 11 | [PyPi packages include __pycache__ directory](https://github.com/un33k/python-slugify/issues/11) · @AcidWeb | Issue closed | Addressed | Maintainer reports pycache removal in 1.0.2; recurrence #38 makes archive-content checks worthwhile (T5). | | 12 | [python-slugify==1.0.1 disappeared from PyPi](https://github.com/un33k/python-slugify/issues/12) · @kurevin | Issue closed | Addressed | Deletion of 1.0.1 was acknowledged as irreversible; no code fix. Release policy should retain published files and distinguish yanking from deletion. | | 13 | [Add Python versions to setup.py classifiers.](https://github.com/un33k/python-slugify/pull/13) · @kengruven | PR merged 2015-05-05 | Merged/addressed | Python-version classifiers added; historical values superseded by modern support matrix. | | 14 | [Support a stop-word list when slugifying](https://github.com/un33k/python-slugify/issues/14) · @euangoddard | Issue closed | Addressed | Stopwords feature delivered by #15 and still implemented. | | 15 | [Add support for stopwords](https://github.com/un33k/python-slugify/pull/15) · @euangoddard | PR merged 2015-05-06 | Merged/addressed | Stopword implementation merged; retain alternate separator and case-sensitive tests from #22/#54. | | 16 | [unichr is not defined in python 3](https://github.com/un33k/python-slugify/pull/16) · @arthurdarcet | PR merged 2015-07-03 | Merged/addressed | Python 3 chr/unichr entity crash fixed; current implementation uses chr. | | 17 | [\' shoud be replaced by separator](https://github.com/un33k/python-slugify/issues/17) · @sfermigier | Issue closed | Addressed | French apostrophe versus generated Cyrillic apostrophe conflict handled by #23; preserve pre/post distinction. Curly/entity quotes remain T3. | | 18 | [quotes are replaced by -, bump to 1.1.4](https://github.com/un33k/python-slugify/pull/18) · @nMustaki | PR closed, unmerged | Superseded | Author replaced this with #20; naive replacement broke Cyrillic phonetic apostrophes. Final solution #23, not this patch. | | 19 | [Add test cases containing numbers](https://github.com/un33k/python-slugify/pull/19) · @edunham | PR merged 2015-09-21 | Merged/addressed | Numeric test cases merged; preserve number punctuation examples. | | 20 | [Comma separator parameter](https://github.com/un33k/python-slugify/pull/20) · @nMustaki | PR closed, unmerged | Superseded | comma_replacement proposal actually targeted apostrophes; #23 resolved original French use case without this parameter. | | 21 | [Only call .lower() once](https://github.com/un33k/python-slugify/pull/21) · @kengruven | PR merged 2015-10-07 | Merged/addressed | Single lowercase pass merged; current lower() call occurs once after normalization. | | 22 | [Stopword replacement bug (different separators)](https://github.com/un33k/python-slugify/pull/22) · @lucaswo | PR merged 2015-12-12 | Merged/addressed | Stopwords split on internal dash, not final separator; implementation remains consistent with historical contract. | | 23 | [Fixed issue #17](https://github.com/un33k/python-slugify/pull/23) · @fabiocaccamo | PR merged 2016-01-16 | Merged/addressed | Two-stage apostrophe fix merged and released as 1.2.0; do not regress Cyrillic handling. | | 24 | [Support only sanitizing URL without stripping unicode?](https://github.com/un33k/python-slugify/issues/24) · @jeffwidman | Issue closed | Addressed | Unicode-preserving mode later delivered in #111 despite initial rejection. | | 25 | [enabling cli usage](https://github.com/un33k/python-slugify/pull/25) · @theeluwin | PR closed, unmerged | Superseded | Console command already existed; current __main__.py also supports python -m slugify. No additional script entry point needed. | | 26 | [Create MANIFEST.in](https://github.com/un33k/python-slugify/pull/26) · @proinsias | PR merged 2016-08-25 | Merged/addressed | License manifest inclusion merged for downstream packaging; current MANIFEST includes LICENSE. | | 27 | [Create new release?](https://github.com/un33k/python-slugify/issues/27) · @proinsias | Issue closed | Addressed | Requested packaging release confirmed by maintainer; no outstanding implementation. | | 28 | [Add a raw meta.yaml for conda packaging.](https://github.com/un33k/python-slugify/pull/28) · @feth | PR closed, unmerged | Defer | Conda recipe was declined; keep distribution-specific recipes downstream unless packaging maintainers request ownership. Do not revive an old raw recipe. | | 29 | [Slugify thinks apostrophes are significant](https://github.com/un33k/python-slugify/issues/29) · @BonkaBonka | Issue closed | Addressed | English apostrophe preference can use explicit replacements; global apostrophe removal would regress #17. Explain options alongside curly-quote differences (T3). | | 30 | [\u2019 should be replaced by a separator](https://github.com/un33k/python-slugify/issues/30) · @ghost | Issue closed | Revive | ASCII and right-curly apostrophes still differ in default ASCII mode; source QUOTE_PATTERN only matches ASCII. Specify consistent input quote handling without altering generated transliteration quotes (T3). | | 31 | [Option to preserve case](https://github.com/un33k/python-slugify/issues/31) · @cjauvin | Issue closed | Addressed | Case preservation delivered later by #54 via lowercase=False. | | 32 | [Convert Markdown to reStructuredText](https://github.com/un33k/python-slugify/issues/32) · @egorsmkv | Issue closed | Superseded | RST request addressed by #34; current PyPI supports Markdown and setup declares text/markdown. Do not revert to RST. | | 33 | [Add Python 3.6 to Travis](https://github.com/un33k/python-slugify/issues/33) · @egorsmkv | Issue closed | Addressed | Historical Python 3.6 CI request confirmed done; version now EOL and outside support. | | 34 | [Pull Request for Issue #32](https://github.com/un33k/python-slugify/pull/34) · @egorsmkv | PR merged 2017-03-31 | Merged/addressed | RST conversion merged historically; superseded by modern Markdown support. | | 35 | [Getting Unicode error on Ubuntu Platform, Same code is working on windows](https://github.com/un33k/python-slugify/issues/35) · @baid86 | Issue closed | Defer | Old Python 2 traceback points to site-packages/slugify.py rather than this package directory; no confirmed current defect. Package-identity guidance is useful. | | 36 | [Added possibility to include custom regex as allowed characters](https://github.com/un33k/python-slugify/pull/36) · @vrbaskiz | PR merged 2017-03-31 | Merged/addressed | Custom disallowed-character regex supported; terminology subsequently fixed in #109. | | 37 | [Added possibility to include custom regex as allowed characters](https://github.com/un33k/python-slugify/pull/37) · @vrbaskiz | PR closed, unmerged | Superseded | Duplicate/follow-up to #36; maintainer confirms published regex support although merge field is null. | | 38 | [Error installing version 1.2.2 with buildout](https://github.com/un33k/python-slugify/issues/38) · @ericdupo | Issue closed | Addressed | Reporter confirmed 1.2.4 solved pycache/marshal archive failure; #39 fix. Retain clean archive verification (T5). | | 39 | [Closes #38: use find_packages() rather than home-grown get_packages and get_package_data](https://github.com/un33k/python-slugify/pull/39) · @reece | PR merged 2017-04-10 | Merged/addressed | Packaging discovery fix merged for #38. Current explicit package list avoids old recursive cache inclusion. | | 40 | [Update CHANGELOG.md - didn't you mean `1.2.4`?](https://github.com/un33k/python-slugify/pull/40) · @loisaidasam | PR merged 2017-05-08 | Merged/addressed | Changelog version typo corrected; no unresolved feature. | | 41 | [I can't start slugify from the command-line](https://github.com/un33k/python-slugify/issues/41) · @sodre | Issue closed | Defer | Reporter could not reproduce CLI failure outside conda-build and closed it; current command exists. Installed-artifact smoke testing remains useful via #43. | | 42 | [Create MANIFEST.in](https://github.com/un33k/python-slugify/pull/42) · @proinsias | PR merged 2017-05-08 | Merged/addressed | Restored manifest/LICENSE after packaging changes; preserve license in distributions. | | 43 | [[WIP] Replicate #41 in Travis build](https://github.com/un33k/python-slugify/pull/43) · @sodre | PR closed, unmerged | Revive | Closed by author as conda-only, but non-editable installation plus actual slugify --help smoke test is valuable. Modernize as clean wheel/sdist tests, not Travis patch (T5; Patrick Sodré). | | 44 | [Slugifying Chinese characters with multiple readings](https://github.com/un33k/python-slugify/issues/44) · @imrek | Issue closed | Defer | Context-sensitive Chinese readings require language-aware conversion beyond fixed transliteration tables; document external preprocessing, no global table correction. | | 45 | [Slugifying Danish, Norwegian, German](https://github.com/un33k/python-slugify/issues/45) · @imrek | Issue closed | Addressed | Locale-specific choices are available through replacements and GERMAN/PRE_TRANSLATIONS; not automatic language detection. Improve recipes with #120. | | 46 | [Use text-unidecode instead of Unidecode to avoid GPL](https://github.com/un33k/python-slugify/pull/46) · @smblackburn | PR closed, unmerged | Superseded | text-unidecode default eventually delivered by #73. No need to replay this dependency swap. | | 47 | [Use the actual separator in code](https://github.com/un33k/python-slugify/pull/47) · @KlaasH | PR closed, unmerged | Revive | High-value closed-unmerged proposal: literal hyphens cannot survive custom separator, and max_length ignores separator expansion. Reproduced both; redesign rather than apply unsafe old regex construction (T1; Klaas Hoekema). | | 48 | [Shorten usage to one code and one shell example](https://github.com/un33k/python-slugify/pull/48) · @KlaasH | PR closed, unmerged | Revive | README remains a long unittest-style example block. Restore proposal's concise Python/CLI quickstart while keeping an option reference and focused cookbook (T6; Klaas Hoekema). | | 49 | [Possible license conflict with Unidecode?](https://github.com/un33k/python-slugify/issues/49) · @NiklasMM | Issue closed | Superseded | Duplicate mandatory-Unidecode licensing concern; current alternatives/docs covered by #73/#130, factual clarification still T4. | | 50 | [License incompatibility due to unidecode being GPLv3](https://github.com/un33k/python-slugify/issues/50) · @bolkedebruin | Issue closed | Superseded | Airflow licensing discussion led to #52; do not use comments as a binding legal conclusion. Current installation differs from original report. | | 51 | [GPL actually?](https://github.com/un33k/python-slugify/issues/51) · @haizaar | Issue closed | Superseded | Reporter acknowledged duplicate; consolidate dependency facts under T4 instead of another license debate. | | 52 | [Conditional dependency on unidecode/text-unidecode](https://github.com/un33k/python-slugify/issues/52) · @bolkedebruin | Issue closed | Superseded | Conditional dependency implemented in #53 but failed for built artifacts; #73 replaced environment-dependent packaging. Do not restore env switches. | | 53 | [Use unidecode as an API and allow alternatives](https://github.com/un33k/python-slugify/pull/53) · @bolkedebruin | PR merged 2018-03-25 | Merged/addressed | Alternative API/dependency hook merged, then superseded because build-time detection was unreliable (#59/#70). | | 54 | [Support for case sensitivity](https://github.com/un33k/python-slugify/pull/54) · @s-m-e | PR merged 2018-04-26 | Merged/addressed | lowercase=False and case-sensitive stopword behavior implemented. | | 55 | [a bug](https://github.com/un33k/python-slugify/issues/55) · @ghost | Issue closed | Defer | Latin/CJK boundary segmentation is not provided by fixed transliteration. Document preprocessing; do not infer language boundaries silently. | | 56 | [Python 3.7 support?](https://github.com/un33k/python-slugify/issues/56) · @glennmatthews | Issue closed | Addressed | Python 3.7 CI delivered in #75/#77; obsolete for current >=3.10 floor. | | 57 | [Adding Python 3.7 support](https://github.com/un33k/python-slugify/pull/57) · @s-m-e | PR closed, unmerged | Superseded | Complex transitional Travis 3.7 matrix was declined; #75/#77 delivered support. No revival on retired CI. | | 58 | [setuptools error](https://github.com/un33k/python-slugify/issues/58) · @fabiocaccamo | Issue closed | Defer | Missing pkg_resources in Python 2 environment was not reproduced by maintainer; modern build backend supersedes old installation path. | | 59 | [Strange install behavior - pip always installs unidecode](https://github.com/un33k/python-slugify/issues/59) · @tedmiston | Issue closed | Superseded | Discussion correctly identifies cached/build-time dependency metadata; later #73 solved default dependency selection. Retain clean wheel tests rather than &&/semicolon workaround. | | 60 | [Release new version of this package?](https://github.com/un33k/python-slugify/issues/60) · @s-m-e | Issue closed | Addressed | Requested release containing lowercase=False was published as 1.2.6. | | 61 | [add .vscode to .gitingore](https://github.com/un33k/python-slugify/pull/61) · @vaibhavmule | PR closed, unmerged | Defer | Editor ignore change is contributor-local housekeeping, not release functionality; use personal excludes rather than revive failed historical PR. | | 62 | [Fix DeprecationWarnings in newer Pythons (3.6+)](https://github.com/un33k/python-slugify/issues/62) · @mcarans | Issue closed | Addressed | Raw regex literals now prevent invalid escape warnings; maintainer links #63. | | 63 | [Proper fallback to text-unidecode, favoring Unidecode, drop support for py 2.6, 3.3.](https://github.com/un33k/python-slugify/pull/63) · @un33k | PR merged 2018-12-25 | Merged/addressed | 2.0 fallback/cleanup merged; installation detection later superseded by #73. Current runtime preference is #126. | | 64 | [Rename word_boundaries: more consistent naming](https://github.com/un33k/python-slugify/pull/64) · @theotheo | PR merged 2018-12-30 | Merged/addressed | word_boundary naming aligned; current public utility and slugify agree. | | 65 | [Add custom_replacements to option](https://github.com/un33k/python-slugify/pull/65) · @andriyor | PR closed, unmerged | Superseded | Rebased/renamed into merged #66/#67; replacements already exist. | | 66 | [Add support user-specific replacements](https://github.com/un33k/python-slugify/pull/66) · @andriyor | PR merged 2019-01-03 | Merged/addressed | User replacement feature merged; ambiguous two-pass semantics remain separate T2 work. | | 67 | [Add replacements option](https://github.com/un33k/python-slugify/pull/67) · @un33k | PR merged 2019-01-03 | Merged/addressed | Release integration for replacements; retain credit to @andriyor. Stage contract remains T2. | | 68 | [Use the setuptools "Extras" feature to choose between Unidecode and Text-Unidecode](https://github.com/un33k/python-slugify/issues/68) · @roniemartinez | Issue closed, locked | Addressed | Extras request delivered through #71–#73; extras are additive and do not remove required text-unidecode. Explain this explicitly (T4). | | 69 | [submitting non-unicode to normalize chars in py2](https://github.com/un33k/python-slugify/issues/69) · @grandrew | Issue closed | Defer | Python 2 normalization report mirrors #35 and likely conflicting module; unsupported environment, no confirmed present bug. | | 70 | [Setup.py dependency checker does not work for pip](https://github.com/un33k/python-slugify/issues/70) · @bolkedebruin | Issue closed | Addressed | Isolated-build dependency detection problem addressed by fixed text-unidecode base requirement in 3.0/#73. | | 71 | [Upgrade Unidecode, add text-unidecode as extra option](https://github.com/un33k/python-slugify/pull/71) · @un33k | PR merged 2019-02-25 | Merged/addressed | Intermediate extras implementation merged; exact dependency ordering superseded by #73/#126. | | 72 | [Optional Extra Requirements](https://github.com/un33k/python-slugify/pull/72) · @un33k | PR merged 2019-02-26 | Merged/addressed | Extras integration merged; preserve simple default install and explain additive optional packages. | | 73 | [Promote text-unidecode to primary decoding api](https://github.com/un33k/python-slugify/pull/73) · @un33k | PR merged 2019-03-03 | Merged/addressed | text-unidecode became required default; runtime Unidecode preference subsequently corrected in #126. | | 74 | [MANIFEST.in: Add test.py to sdist](https://github.com/un33k/python-slugify/pull/74) · @jayvdb | PR merged 2019-03-25 | Revive | Merged test.py-in-sdist change is no longer expressed in current MANIFEST. #141 reports actual missing archive tests. Restore explicit test inclusion and inspect built archives (T5; @jayvdb). | | 75 | [Test against Python 3.7](https://github.com/un33k/python-slugify/pull/75) · @sloria | PR merged 2019-03-31 | Merged/addressed | Python 3.7 Travis support delivered; superseded by contemporary tox matrix. | | 76 | [Add UniqueSlugify for generating unique slugs](https://github.com/un33k/python-slugify/pull/76) · @sloria | PR closed, unmerged | Defer | Document/form-local uniqueness is a legitimate use case, contrary to broad dismissal, but old helper exceeds max_length with suffixes and mishandles positional separator. Offer optional recipe, not implicit global state (T7; Steve Loria). | | 77 | [Add Python 3.7 Support](https://github.com/un33k/python-slugify/pull/77) · @un33k | PR merged 2019-03-31 | Merged/addressed | 3.7/PyPy support integration; historical interpreters superseded by #160/#164. | | 78 | [support utf-8](https://github.com/un33k/python-slugify/issues/78) · @mosi-kha | Issue closed | Addressed | Unicode retention delivered by #111; language-specific transliteration accuracy still belongs to backend/preprocessing. | | 79 | [HTML entity decoding cannot be disabled](https://github.com/un33k/python-slugify/issues/79) · @MartinFalatic | Issue closed | Addressed | Reporter found correct three independent flags: entities, decimal, hexadecimal. Preserve explicit disabling examples; encoded non-Latin pipeline discrepancy is T3. | | 80 | [Documentation missing](https://github.com/un33k/python-slugify/issues/80) · @shakeyourbunny | Issue closed | Addressed | Option reference exists in README; quickstart and stage interactions still deserve T6 improvements. | | 81 | [Name conflict with other slugify package](https://github.com/un33k/python-slugify/issues/81) · @EmileSonneveld | Issue closed, locked | Revive | Repeated namespace collision warrants prominent pip-install versus import-name troubleshooting, not a breaking namespace rename; corroborated by #151 (T6). | | 82 | [text-unidecode is bumped up to 1.3 and pipenv install breaks.](https://github.com/un33k/python-slugify/issues/82) · @rollue | Issue closed | Addressed | text-unidecode 1.2 pin conflict fixed in #83; current >=1.3 lower bound avoids old exact pin. | | 83 | [BF(dependencies)\| Bump `text_unidecode` version](https://github.com/un33k/python-slugify/pull/83) · @koolfunky | PR merged 2019-09-19 | Merged/addressed | Dependency bump resolved #82 and shipped 3.0.4. | | 84 | [bumped dependency text-unidecode to v1.3](https://github.com/un33k/python-slugify/pull/84) · @VKen | PR closed, unmerged | Superseded | Duplicate dependency bump; author directed to merged #83 and confirmed response. | | 85 | [German Umlaut support](https://github.com/un33k/python-slugify/issues/85) · @TobitRE | Issue closed | Addressed | German substitutions available via replacements and GERMAN; corrected community example should inform cookbook. Case preservation works with lowercase=False. | | 86 | [What are the few gotchas like when migrating from other packages, etc.](https://github.com/un33k/python-slugify/issues/86) · @un33k | Issue closed | Addressed | Maintainer moved migration gotchas to wiki; bring critical install/entity/backend facts into versioned documentation, not only external wiki (T6). | | 87 | [Drop support for EOL Python 2.6 and 3.2-2.4](https://github.com/un33k/python-slugify/pull/87) · @hugovk | PR merged 2019-10-14 | Merged/addressed | EOL cleanup, python_requires and CI modernization merged; current support floor is newer. | | 88 | [Drop support for old python - cleanup - up version ](https://github.com/un33k/python-slugify/pull/88) · @un33k | PR merged 2019-10-20 | Merged/addressed | 4.0 release integration; historical support values superseded. | | 89 | [README: Use SVG badge for consistency](https://github.com/un33k/python-slugify/pull/89) · @hugovk | PR merged 2019-11-09 | Merged/addressed | SVG/HTTPS badge improvement merged; badge destination mismatch persists under #165 follow-up. | | 90 | [Can I be sure that slug is urlsafe?](https://github.com/un33k/python-slugify/issues/90) · @mvolfik | Issue closed | Addressed | Default ASCII/dash output is suitable as URL component text, not a guarantee for arbitrary custom regex/separator/Unicode. Add clear scoped guarantee and empty-output note. | | 91 | [Issue with separator](https://github.com/un33k/python-slugify/issues/91) · @ghost | Issue closed, locked | Revive | Same literal-hyphen versus separator conflict as #47/#107; preserve historic behavior as migration baseline and decide version-9 semantics (T1). | | 92 | [Create command line tool that can set all parameters](https://github.com/un33k/python-slugify/pull/92) · @jdevera | PR merged 2020-04-09 | Revive | Full CLI merged but regex_pattern is parsed and never forwarded. Current source disproves all-options parity; add real CLI-to-API regression rather than parameter mocks alone (T5; @jdevera original contribution). | | 93 | [ERROR: Failed building wheel for python-slugify](https://github.com/un33k/python-slugify/issues/93) · @akani-mashaba | Issue closed | Defer | bdist_wheel unavailable is an old build-environment/tooling failure, not slug algorithm bug. Modern isolated build and published pure-Python wheels are the remedy (T5). | | 94 | [We cannot replace '-' before replacing ' ' by '-'](https://github.com/un33k/python-slugify/issues/94) · @ghost | Issue closed | Revive | Replacing '-' affects newly generated separators on the second pass, exactly as current code shows. Introduce documented stage semantics rather than sentinel workaround (T2). | | 95 | [[fyi] stubs for python-slugify were submitted to typeshed](https://github.com/un33k/python-slugify/issues/95) · @hauntsaninja | Issue closed | Addressed | Typeshed notice followed by inline annotations and py.typed in #135/#137; strict mypy in #160. No second stub distribution needed. | | 96 | [publish pre-build wheels (manylinux)](https://github.com/un33k/python-slugify/issues/96) · @ssbarnea | Issue closed | Revive | Publish/check universal pure-Python wheels; manylinux native builds are unnecessary. Historical report not proof of current PyPI inventory; release artifact verification still needed (T5). | | 97 | [Can I keep consecutive "-" symbol?](https://github.com/un33k/python-slugify/issues/97) · @laggardkernel | Issue closed | Defer | Reporter withdrew request because its own application rejected consecutive dashes. Keep default collapse; explicit output customization belongs to T1/T2, not a blanket default change. | | 98 | [Add a tox file to automatically run the tests and add Python 3.9](https://github.com/un33k/python-slugify/pull/98) · @jon-betts | PR merged 2021-04-30 | Merged/addressed | Initial tox matrix merged, later removed and restored in #160; modern matrix now exists. | | 99 | [Update tox.ini](https://github.com/un33k/python-slugify/pull/99) · @DmytroLitvinov | PR merged 2021-05-05 | Merged/addressed | Removed stale Python 3.5 tox env; current matrix has no such env. | | 100 | [Simplify python_requires](https://github.com/un33k/python-slugify/pull/100) · @DmytroLitvinov | PR merged 2021-05-05 | Merged/addressed | Simplified Python requirement then regressed in v6/#115; current >=3.10 correct for current source. | | 101 | [Looking for 1-2 contributors to de-risk the project as it is now used by 21k+ projects](https://github.com/un33k/python-slugify/issues/101) · @un33k | Issue closed | Defer | Maintainer access/continuity remains an operational decision; comments show collaborators volunteered, but public research cannot verify permissions or current availability. | | 102 | [Add better typing for slugify.slugify](https://github.com/un33k/python-slugify/pull/102) · @fahhem | PR merged 2021-05-12 | Merged/addressed | Replacement annotation improved to nested iterable. Current contract still permits one-shot iterators, relevant to T2, not grounds to replay historical patch. | | 103 | [tag 5.0.2](https://github.com/un33k/python-slugify/issues/103) · @alucryd | Issue closed | Addressed | Maintainer confirmed missing 5.0.2 tag created; preserve tag/artifact consistency in release checklist. | | 104 | [Clarify `regex_pattern` docs.](https://github.com/un33k/python-slugify/pull/104) · @yyyyyyyan | PR closed, unmerged | Superseded | Contributor correctly explained negative regex semantics despite initial rejection; #109 later fixed names/docs. Credit historical diagnosis, no pending wording fix of the same kind. | | 105 | [Empty slug for emojis](https://github.com/un33k/python-slugify/issues/105) · @ShubhamKhandare | Issue closed, locked | Defer | Emoji-only empty output expected under default filter/backend; document fallback and explicit emoji handling rather than promise automatic names. | | 106 | [App crashes if album have some special characters](https://github.com/un33k/python-slugify/issues/106) · @Devaniti | Issue closed | Decline | Author explicitly reported wrong repository; no python-slugify defect or action. | | 107 | [Question/Bug: how do I preserve dashes and not replace them with separator?](https://github.com/un33k/python-slugify/issues/107) · @adamcunnington-mlg | Issue closed, locked | Revive | Repeated real inability to preserve allowed literal dashes under '_' separator; placeholder workaround is collision-prone. Consolidate with #47/#91 (T1). | | 108 | [GitHub Action Work](https://github.com/un33k/python-slugify/issues/108) · @un33k | Issue closed | Addressed | GitHub Actions now implemented; current main workflow runs pull requests and master pushes. | | 109 | [Fix misleading pattern name and documentation](https://github.com/un33k/python-slugify/pull/109) · @mrezzamoradi | PR merged 2022-02-16 | Merged/addressed | Actually merged after initial closure discussion; current DISALLOWED naming and docs match re.sub. Do not classify as rejected solely from comments. | | 110 | [Syntax error in slugify/slugify.py ](https://github.com/un33k/python-slugify/issues/110) · @janderson-atb-potsdam | Issue closed | Superseded | Temporary typing rollback supported accidental Python 2 users; current >=3.10 metadata and typed source supersede it. Do not remove annotations again. | | 111 | [allow unicode](https://github.com/un33k/python-slugify/pull/111) · @mrezzamoradi | PR merged 2022-02-22 | Merged/addressed | allow_unicode implemented with NFKC and Unicode filter, not exact Unicode preservation; #153 identifies remaining normalization nuance. | | 112 | [Slugify 6.1.0 breaks under Python 3.4.2 - ImportError: No module named 'typing'](https://github.com/un33k/python-slugify/issues/112) · @samlehman | Issue closed | Superseded | Python 3.4 typing import failure addressed temporarily by #113; outside support now. Preserve correct package metadata and migration pins. | | 113 | [remove type hinting](https://github.com/un33k/python-slugify/pull/113) · @mrezzamoradi | PR merged 2022-02-26 | Merged/addressed | Temporary type-hint removal merged, then superseded by modern typed-only support. No rollback recommended. | | 114 | [Missing slugify cmd line command: removed 'entry_points' from setup.py](https://github.com/un33k/python-slugify/issues/114) · @reixd | Issue closed | Addressed | CLI entry point restored in 6.1.2 and present today; prevent recurrence by installed-wheel CLI smoke tests (T5). | | 115 | [Installing python-slugify on Python 2.7 does not install a compatible version of slugify](https://github.com/un33k/python-slugify/issues/115) · @ndelon | Issue closed | Addressed | Current metadata no longer admits Python 2; historical releases cannot be repaired by editing current setup. Document last compatible releases; any yanking is separate explicit release governance. | | 116 | [Update __init__.py to have __version__ variables.](https://github.com/un33k/python-slugify/pull/116) · @eNV25 | PR merged 2022-09-27 | Merged/addressed | Public version import added; no outstanding change requested. | | 117 | [Proposal: Discontinue Python 2 support](https://github.com/un33k/python-slugify/issues/117) · @jdevera | Issue closed | Addressed | Python 2 support dropped in 7.0; current floor is >=3.10. | | 118 | [Question: Why is save_order False by default?](https://github.com/un33k/python-slugify/issues/118) · @jdevera | Issue closed | Defer | Changing save_order default changes truncated URLs. #157 explains behavior; keep default unless explicit version-9 migration decision and corpus justify change. | | 119 | [Question: Why are custom replacements ran twice?](https://github.com/un33k/python-slugify/issues/119) · @jdevera | Issue closed | Revive | Two-pass replacements remain undocumented and non-idempotent. Separate pre/post contracts and iterator semantics, protect legacy migration behavior (T2; Jacobo de Vera). | | 120 | [Document the use of what's in special.py](https://github.com/un33k/python-slugify/issues/120) · @jdevera | Issue closed | Revive | README does not explain exported special.py tables or mixed-language risks. Add tested GERMAN/CYRILLIC/GREEK/PRE_TRANSLATIONS examples (T6; Jacobo de Vera). | | 121 | [Add support for Python 3.11](https://github.com/un33k/python-slugify/pull/121) · @hugovk | PR merged 2022-11-18 | Merged/addressed | Python 3.11 support and EOL 3.6 removal merged; current matrix includes 3.11. | | 122 | [Is it possible to translate characters to romanised Japanese rather than Chinese?](https://github.com/un33k/python-slugify/issues/122) · @lewisd1996 | Issue closed | Defer | Japanese Kanji cannot be distinguished from Chinese without locale/context-aware backend; use external romanizer, avoid global special.py changes for ambiguous characters. | | 123 | [How to replace the ampersand symbol "&" for two hyphens "--"?](https://github.com/un33k/python-slugify/issues/123) · @rafaelmarino | Issue closed | Defer | Meaningful double-hyphen output is domain-specific; default intentionally collapses runs. A documented postprocessing stage in T2 is safer than recommending allegedly unique sentinels. | | 124 | [Missing unittests](https://github.com/un33k/python-slugify/issues/124) · @buhtz | Issue closed | Addressed | Unit tests existed in test.py; current pyproject declares testpaths. src-layout is optional packaging design, not evidence of missing tests. | | 125 | [added option to replace ambiguous characters](https://github.com/un33k/python-slugify/pull/125) · @xnetcat | PR closed, unmerged | Superseded | Author withdrew after discovering Unidecode support; #143 now normalizes stylized letters before conversion. Do not vendor 1,500-line confusables table as a slug security feature. | | 126 | [`unidecode` vs `text_unidecode` import resolution order](https://github.com/un33k/python-slugify/pull/126) · @enkidulan | PR merged 2023-01-27 | Merged/addressed | Unidecode now preferred when installed; text-unidecode stays required. Document environment-sensitive outputs and backend tests (T4). | | 127 | [Fuzzing Python Slugify on OSS-Fuzz](https://github.com/un33k/python-slugify/issues/127) · @rikfie | Issue closed | Revive | Fuzz harness offer valuable for interacting string options and numeric entities. Start local property/fuzz tests; OSS-Fuzz enrollment requires owner and disclosure-response commitment (T8; Rik @rikfie). | | 128 | [Enable installation without GPL dependencies](https://github.com/un33k/python-slugify/issues/128) · @C-nit | Issue closed, locked | Defer | allow_unicode still imports a transliteration backend at module import. Dependency-free Unicode mode needs packaging/API policy; investigate laziness/optional backend only if a concrete product requirement, not a legal assertion (T4). | | 129 | [Notes on GPL dependencies](https://github.com/un33k/python-slugify/pull/129) · @C-nit | PR closed, unmerged | Superseded | Same licensing text rebased into merged #130; no lost contribution. | | 130 | [Add note on licensing](https://github.com/un33k/python-slugify/pull/130) · @C-nit | PR merged 2023-02-24 | Merged/addressed | Artistic-license choice documented; later #166 shows explanatory language remains confusing. Revive clarity, not this exact patch. | | 131 | [Replace flake8 and pycodestyle with ruff](https://github.com/un33k/python-slugify/pull/131) · @cclauss | PR merged 2023-10-09 | Defer | Merged then explicitly reverted by #136 because CI cache setup failed, not proof Ruff is unsuitable. Optional modern lint migration, not a functional release blocker (T8; Christian Clauss). | | 132 | [Fix CI to run on master without duplicate push and pull_request runs](https://github.com/un33k/python-slugify/pull/132) · @cclauss | PR closed, unmerged | Revive | PR execution now covered by #160, but three branch-specific workflows remain. Consolidate safely after owner confirms branch policy; old diff does not itself prevent every duplicate run (T8; Christian Clauss). | | 133 | [Option to convert a string to a "safe" filename and modify the original name as less as possible ](https://github.com/un33k/python-slugify/issues/133) · @sisrfeng | Issue closed | Defer | No filename failure example supplied; slugification is not portable filename validation. Document empty/reserved-name/length responsibilities rather than broad safe-filename flag. | | 134 | [Enables mypy --strict and adds corresponding types](https://github.com/un33k/python-slugify/pull/134) · @jmelahman | PR closed, unmerged | Superseded | Strict typing proposal substantially delivered by #135/#137/#160. Do not replay runtime-error or argv changes; preserve Jamison Lahman's prior contribution context. | | 135 | [Add typing and expose ``py.typed``](https://github.com/un33k/python-slugify/pull/135) · @DanielNoord | PR merged 2023-10-09 | Merged/addressed | Inline annotations and py.typed merged, including empty-list return clarification; strict CI later added #160. | | 136 | [Revert "Replace flake8 and pycodestyle with ruff"](https://github.com/un33k/python-slugify/pull/136) · @un33k | PR merged 2023-10-09 | Merged/addressed | Explicit revert of #131; Ruff not currently active. Cache failure rationale is historical evidence, not a permanent design prohibition. | | 137 | [Add typing and expose py.typed](https://github.com/un33k/python-slugify/pull/137) · @un33k | PR merged 2023-10-09 | Merged/addressed | Typing release integration; current marker packaged via setup.py:61. | | 138 | [Formally support python 3.12](https://github.com/un33k/python-slugify/issues/138) · @foarsitter | Issue closed | Addressed | Python 3.12 support delivered in #139. | | 139 | [Add Python 3.12 to test matrix and add classifier to the setup](https://github.com/un33k/python-slugify/pull/139) · @foarsitter | PR merged 2023-10-25 | Merged/addressed | 3.12 classifier and test matrix merged; retained in current source. | | 140 | [pip install python-slugify[unidecode] also installs text-unidecode](https://github.com/un33k/python-slugify/issues/140) · @Schulzjo | Issue closed | Revive | Extra installs both distributions and runtime prefers Unidecode; README alternative wording still invites opposite interpretation. Clarify additive extras and reproducibility (T4). | | 141 | [PyPi tarball is missing files](https://github.com/un33k/python-slugify/issues/141) · @nieder | Issue closed | Revive | Historical PyPI sdist missed test.py despite #74. MANIFEST still omits it; verify modern setuptools defaults in an actual build and make inclusion explicit (T5). | | 142 | [Unicode confusables characters are removed](https://github.com/un33k/python-slugify/issues/142) · @chuckyblack | Issue closed | Addressed | Normalization-before-decoder fix in #143; current stylized-letter reproduction returns aa. | | 143 | [Ci - Normalize accented text twice.](https://github.com/un33k/python-slugify/pull/143) · @un33k | PR merged 2024-01-25 | Merged/addressed | Double normalization merged. It fixes direct stylized letters, but does not transliterate non-Latin characters introduced by entity decoding (T3). | | 144 | [TypeError: decoding to str: need a bytes-like object, int found](https://github.com/un33k/python-slugify/issues/144) · @codyc1515 | Issue closed | Revive | Clarify str-only API versus legacy UTF-8 bytes decoding. int TypeError is expected for str-only contract, but bytes path is reachable; do not delete based on false unreachable-code assumption (T2). | | 145 | [Remove compatibility with unsupported Python versions](https://github.com/un33k/python-slugify/pull/145) · @Viicos | PR closed, unmerged | Superseded | Retargeted into merged #146/#147; compatibility cleanup already incorporated. | | 146 | [Remove compatibility with unsupported Python versions](https://github.com/un33k/python-slugify/pull/146) · @Viicos | PR merged 2024-01-31 | Merged/addressed | Old-version compatibility and regex typing corrections merged; retain reachable runtime bytes decision separately from #144. | | 147 | [Drop compatibility for unsupported Python Version](https://github.com/un33k/python-slugify/pull/147) · @un33k | PR merged 2024-01-31 | Merged/addressed | 8.0.3 release integration for #146. | | 148 | [Fix uppercase pre-translations](https://github.com/un33k/python-slugify/pull/148) · @mib1185 | PR merged 2024-02-08 | Merged/addressed | Uppercase-table premature return fixed; current return is after loop. Preserve multi-character uppercase and empty-list tests. | | 149 | [Uppercase handling of special chars](https://github.com/un33k/python-slugify/pull/149) · @un33k | PR merged 2024-02-08 | Merged/addressed | Uppercase special-character fix release integration. | | 150 | [Argument to make flugified strings valid XML id attributes.](https://github.com/un33k/python-slugify/issues/150) · @jenstroeger | Issue closed | Decline | XML NCName policy is domain-specific and differs from general slug contract. Recommend external validation/prefixing with post-prefix length check. | | 151 | [Unicode does not work](https://github.com/un33k/python-slugify/issues/151) · @pomponchik | Issue closed | Addressed | Traceback points to conflicting slugify module; maintainer shows correct package works. Add durable troubleshooting with #81, not another Unicode engine fix. | | 152 | [Fix wiki URLs in README.md](https://github.com/un33k/python-slugify/pull/152) · @sagesharp | PR merged 2025-11-20 | Merged/addressed | Wiki links fixed after long wait; branch confusion in discussion reinforces contribution-workflow docs, not another identical URL patch. | | 153 | [The problem of converting all Korean consonants to Korean initials in the slugfiy process when they are alone.](https://github.com/un33k/python-slugify/issues/153) · @LMouSoo | Issue closed | Revive | NFKC changes standalone Korean compatibility jamo even with allow_unicode. Reproduced U+314B -> U+110F. Clarify normalized retention and consider opt-in NFC/exact preservation policy (T3). | | 154 | [Add Python 3.13 to test matrix and add classifier to the setup](https://github.com/un33k/python-slugify/pull/154) · @edgarrmondragon | PR merged 2025-09-26 | Merged/addressed | 3.13/PyPy matrix update merged; current #160 matrix supersedes old PyPy version. | | 155 | [rewrote slugify func with radon](https://github.com/un33k/python-slugify/pull/155) · @IvanChumakov | PR closed, unmerged | Defer | Do not revive Radon-driven helper explosion wholesale: removes docstring and changes normalization/quote pipeline. Consider only cohesive entity helper under T3 with behavioral tests; credit @IvanChumakov if reused. | | 156 | [Adding Debian manpage to python-slugify](https://github.com/un33k/python-slugify/issues/156) · @Arian-Ott | Issue closed | Revive | Debian maintainer offered CLI manpage; none present in current tree. Request/update source and license, keep argparse options synchronized (T6; Arian @Arian-Ott). | | 157 | [Explain `save_order` more clearly](https://github.com/un33k/python-slugify/pull/157) · @marksteward | PR merged 2025-09-26 | Merged/addressed | save_order explanation improved and present in function/README. Default-policy question #118 remains consciously deferred. | | 158 | [[WIP] Rewriting in Rust PyO3 python lib - Student / Learning project](https://github.com/un33k/python-slugify/issues/158) · @gmaOCR | Issue closed | Defer | Student Rust port is an external learning project, not evidence of a measured bottleneck. No native rewrite in version 9 without profiling/portability case. | | 159 | [Fix build process](https://github.com/un33k/python-slugify/pull/159) · @kurtmckee | PR merged 2026-01-07 | Revive | Build fixes merged, but body explicitly warns against executable setup publishing and recommends declarative metadata. Current setup.py publish still uses deprecated universal wheel path and uploads/tags unchecked; complete modernization (T5; Kurt McKee). | | 160 | [Reintroduce tox and thoroughly test the project](https://github.com/un33k/python-slugify/pull/160) · @kurtmckee | PR merged 2026-01-06 | Merged/addressed | tox, dual backends, strict mypy and modern CI are now present; no need to rebuild them from scratch. Installed-artifact coverage still T5. | | 161 | [Remove references to `easy_install`, which is deprecated](https://github.com/un33k/python-slugify/pull/161) · @kurtmckee | PR merged 2025-11-12 | Merged/addressed | easy_install documentation removed; maintain pip/build guidance. | | 162 | [Replace Text_unidecode-1.3 dependency or change license](https://github.com/un33k/python-slugify/issues/162) · @ndrezn | Issue closed, locked | Superseded | GPL-only premise corrected by author in #166: text-unidecode offers Artistic choice. No automatic project relicensing; use factual dependency/license documentation (T4). | | 163 | [Default to anyascii decoder](https://github.com/un33k/python-slugify/pull/163) · @ndrezn | PR closed, unmerged | Revive | Revive multilingual differential test corpus and backend visibility idea, not automatic AnyASCII default. Actual patch changes Chinese word boundaries and Cyrillic output; explicit backend choice only after compatibility decision (T4; Nathan Drezner). | | 164 | [Fix CI by dropping EOL Python versions](https://github.com/un33k/python-slugify/pull/164) · @kurtmckee | PR merged 2026-01-06 | Merged/addressed | Python >=3.10 and 3.14 CI fixed. README support matrix still claims >=3.7 for all newer releases; synchronize before version 9 (T5). | | 165 | [Fix the README badge to refer to the `main.yml` workflow results](https://github.com/un33k/python-slugify/pull/165) · @kurtmckee | PR merged 2026-01-07 | Revive | Badge image fixed, but link still targets ci.yml. Body's workflow-consolidation/release-follow-through suggestion remains useful; avoid stale health signals (T8; Kurt McKee). | | 166 | [Slugify licensing update and PRs](https://github.com/un33k/python-slugify/issues/166) · @un33k | Issue open, locked | Revive | Open locked discussion contains concrete proposed dependency wording and reported customer confusion. Clarify installed package versus chosen license, not legal guarantees; no GitHub changes performed (T4; Nathan Drezner). | ## Remaining uncertainty and release handoff - This is a snapshot of all publicly available <=166 item bodies/discussions, not a review of later-numbered backlog. Current local commit was inspected because it is the implementation baseline supplied for the commission. - “Merged/addressed” describes merge/source/history evidence, **not certification of PyPI publication**. Current registry inventory, install-time behavior across all supported interpreters, and built archive contents were not independently checked. - Reproductions used the available local Python environment, not a clean two-backend matrix. Backend output can differ; release acceptance needs pinned backend/version fixtures. No tests/builds were represented as passing based on historical bot comments. - All 24 closed-unmerged PRs received explicit disposition: #1, #3, #18, #20, #25, #28, #37, #43, #46, #47, #48, #57, #61, #65, #76, #84, #104, #125, #129, #132, #134, #145, #155, #163. Highest-value revivals are #47, #43, #48, selective #132, and the tests/docs part of #163. #76 remains an optional recipe, not a core requirement; #134's typing goal is already present. - No automated conclusion about author legal names is made. Public GitHub profile display names were fetched for key revived contributors; account handles remain authoritative attribution identifiers. @IvanChumakov has no public display name in the API snapshot. - Recommended immediate implementation order: fix CLI forwarding and artifact checks; document dependency/support facts; establish golden tests for T1–T3; make explicit release-9 compatibility decisions; then update cookbook/manpage and workflow organization. Treat new backend/default changes as separate approval gates.