Skip to content

feat(zetesis): Cardigann filter tail — diacritics, validate, validfilename, url encode/decode, aliases (#513)#629

Merged
forkwright merged 1 commit into
mainfrom
feat/cardigann-filter-tail
Jul 16, 2026
Merged

feat(zetesis): Cardigann filter tail — diacritics, validate, validfilename, url encode/decode, aliases (#513)#629
forkwright merged 1 commit into
mainfrom
feat/cardigann-filter-tail

Conversation

@forkwright

Copy link
Copy Markdown
Owner

Part of #513 (filter coverage; andmatch/fuzzytime/htmldecode follow — #513 stays open).

Six Cardigann field filters that were previously rejected at load — so any definition using one failed to load at all. Semantics verified against Jackett's applyFilters and .NET's WebUtility/StringUtil, not guessed:

  • diacritics — NFD-decompose, drop \p{Mn}, NFC-recompose. A mark strip, not transliteration: precomposed letters (Đ) and non-Latin scripts pass through untouched. Only "replace" is a valid arg (rejected at load otherwise, matching upstream's throw).
  • validate — lowercase + split both sides on upstream's delimiter set; keep the allowlist tokens present in the value, in allowlist order, deduped (LINQ Intersect semantics).
  • validfilename — replaces what .NET forbids on Linux (where real deployments run): / and NUL → _; empty → _. Not the stricter Windows set the name implies.
  • urldecode / urlencode — .NET WebUtility semantics: safe set A-Za-z0-9-_.!*(), space as +, uppercase hex, byte-wise; decode is lenient on a malformed %.
  • timeparse / reltime — upstream aliases of dateparse / timeago.

By definition-count across the upstream corpus these cover diacritics (14), validate (14), validfilename (8), urldecode (3), urlencode (1), timeparse (1).

A 3-lens adversarial-review workflow caught a real HIGH bug, fixed here: unicode_normalization::char::is_combining_mark is the whole Mark category (Mn+Mc+Me), but upstream strips only NonSpacingMark. The superset deleted spacing combining marks — Devanagari/Bengali/Tamil vowel signs — silently changing meaning (काम "work" → कम). Now uses \p{Mn} (exact category, via the existing regex dep) with a regression test on an Mc-bearing script.

Also fixed: a pre-existing test that used diacritics as its "unsupported filter" example (now supported → switched to fuzzytime).

No new workspace dependency (unicode-normalization already existed). Full kanon gate --full green.

…ename, url encode/decode, aliases (#513)

Six more Cardigann field filters, each previously rejected at load (so any
definition using one failed to load at all). Verified against Jackett's
applyFilters + .NET's WebUtility/StringUtil semantics:

- diacritics: NFD-decompose, drop combining marks, NFC-recompose — a
  mark strip, NOT transliteration, so precomposed letters (Đ) and non-Latin
  scripts pass through unchanged. Only "replace" is a valid arg (rejected
  at load otherwise, matching upstream's throw).
- validate: lowercase + split both sides on upstream's delimiter set, keep
  the whitelist tokens present in the value, in WHITELIST order, deduped.
- validfilename: replaces the characters .NET forbids on Linux (the platform
  real deployments run) — / and NUL — with _; an empty result collapses to _.
- urldecode / urlencode: .NET WebUtility semantics — safe set A-Za-z0-9-_.!*(),
  space as +, uppercase hex, byte-wise; decode is lenient on a malformed %.
- timeparse / reltime: upstream aliases of dateparse / timeago.

By definition-count across the upstream corpus these cover diacritics (14),
validate (14), validfilename (8), urldecode (3), urlencode (1), timeparse (1).
Still rejected at load and tracked in #513: the row-level andmatch (65 defs —
needs query/release state, a separate dispatch), fuzzytime (22), htmldecode (6),
and the zero-usage tail.

Part of #513.

Gate-Passed: kanon 0.1.6 +stages:fmt,check,clippy,nextest,lint sha:6b58d5c61e8b0fccdc516d2344cc6a31c0173278
@forkwright
forkwright force-pushed the feat/cardigann-filter-tail branch from 1453397 to 0adc2d6 Compare July 16, 2026 15:19
@forkwright
forkwright merged commit 032a72a into main Jul 16, 2026
12 checks passed
@forkwright
forkwright deleted the feat/cardigann-filter-tail branch July 16, 2026 15:23
forkwright pushed a commit that referenced this pull request Jul 23, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.2.0](v0.1.14...v0.2.0)
(2026-07-23)


### Features

* **horismos,kathodos,archon:** media-type coverage for
audiobook/comic/podcast/tv
([#612](#612))
([#625](#625))
([23f1ae7](23f1ae7))
* **zetesis:** andmatch row filter for Cardigann definitions
([#631](#631))
([dc41e23](dc41e23))
* **zetesis:** Cardigann filter tail — diacritics, validate,
validfilename, url encode/decode, aliases
([#513](#513))
([#629](#629))
([032a72a](032a72a))
* **zetesis:** Cardigann JSON search responses (flat arrays)
([#624](#624))
([28966a6](28966a6))
* **zetesis:** Cardigann nested JSON rows (rows.attribute/multiple +
parent switch)
([#513](#513))
([#627](#627))
([3e0143f](3e0143f))
* **zetesis:** Cardigann POST search paths
([#621](#621))
([aa7e286](aa7e286))


### Bug Fixes

* **deps:** bump serde_with 3.20.0 -> 3.21.0 (GHSA-7gcf-g7xr-8hxj)
([#630](#630))
([970508c](970508c))
* **deps:** repair ulid 3.0 and rubato 4.0 fallout on main
([#660](#660))
([96027e2](96027e2))
* **epignosis:** preserve book provider identity
([#654](#654))
([#659](#659))
([b9b48c2](b9b48c2))
* **periskopio:** restore standalone compilation
([#620](#620))
([#657](#657))
([e46a013](e46a013))
* **zetesis:** redact all credential query params in logged URLs, not
just apikey ([#623](#623))
([#626](#626))
([6ec6154](6ec6154))


### Documentation

* **manifest:** add docs/MANIFEST.toml
([#647](#647))
([16b700b](16b700b))
* **planning:** pointer-only vision (kanon-canonical)
([#648](#648))
([8784a34](8784a34))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant