Skip to content

v0.2.4.1 — Stability: Cancel Propagation, Spam-Farm Filters & Audit Hardening

Choose a tag to compare

@github-actions github-actions released this 15 Oct 05:36
· 139 commits to main since this release

What's Changed

  • feat(cli): restart/worker are the managed daemon — no web panel by @axisrow in #1465
  • feat(queue): collection progress line — tasks left after each finished task by @axisrow in #1466
  • fix(queue): skip channel on unknown Telegram TL type with one warning by @axisrow in #1470
  • feat(interop): make task creation and reports retry-safe by @axisrow in #1469
  • feat(queue): end-of-run retry pass for failed channel collections by @axisrow in #1472
  • fix(scheduler): CLI mutations notify the live worker via scheduler.reconcile by @axisrow in #1474
  • feat(cli): auto-restart daemon when checked-out src/ is newer than the build by @axisrow in #1476
  • fix(dm): make DmListener._on_event async — telethon awaits handler returns by @axisrow in #1478
  • feat(cli): channel candidates — list search-discovered channels awaiting activation by @axisrow in #1479
  • refactor(cli): channel candidates cleanup after #1479 review by @axisrow in #1481
  • fix(filter): catch CamelCase+digits spam usernames by @axisrow in #1483
  • fix(cli): default account is the DB primary, not the sorted-first connected (#1480) by @axisrow in #1484
  • refactor(cli): drop dead None-branch in dialogs _resolve_phone by @axisrow in #1487
  • refactor(cli): drop dead None-check in _resolve_phone (follow-up to #1484) by @axisrow in #1488
  • fix(cli): show @username/title in search results, not bare numeric id by @axisrow in #1489
  • feat(filters): auto_feed flag for template-generated link feeds by @axisrow in #1491
  • chore(deps): update textual requirement from >=8.2.7 to >=8.2.8 by @dependabot[bot] in #1459
  • chore(deps): update apscheduler requirement from >=3.11.2 to >=3.11.3 by @dependabot[bot] in #1460
  • chore(deps-dev): update hypothesis requirement from >=6.100.0 to >=6.168.1 by @dependabot[bot] in #1461
  • fix(tests): seal HTTP interception for openai 3.x (httpx2), adopt openai>=3.19.2 by @axisrow in #1495
  • feat(filters): whitelist suspects report — filter suspects (#1490) by @axisrow in #1493
  • fix(telegram): hourly volume budget for live username resolves by @axisrow in #1498
  • feat(filters): non_cyrillic label-only + keep-tag escrow by @axisrow in #1497
  • fix(queue): DB-side cancel stops a running collect (supervisor arms cancel_events) by @axisrow in #1500
  • fix(queue): cancel sweep tail window — validation coverage, dispatch revival by @axisrow in #1503
  • fix(dm_catchup): one broken dialog no longer kills the account pass by @axisrow in #1504
  • fix(tests): close leaked cli_init_patch databases at teardown (safety net) by @axisrow in #1505
  • ci(tests): shard parallel suite x2 — tests job wall −52% by @axisrow in #1506
  • fix(ci): --cov-fail-under=0 on producers — 87 ratchet moves to coverage-combine by @axisrow in #1507
  • fix(ci): include-hidden-files on coverage uploads — dotfiles excluded by default by @axisrow in #1508
  • ci: drop coverage measurement, 5-minute budget on test jobs by @axisrow in #1509
  • chore(deps): update fastapi requirement from <0.139,>=0.136.3 to >=0.136.3,<0.143 by @dependabot[bot] in #1496
  • fix(tooling): mutmut sandbox copies conftest+scripts; document flat-src incompatibility by @axisrow in #1501
  • fix(tooling): correct mutmut stats-run numbers — full suite is ~10.7k (follow-up to #1501) by @axisrow in #1512
  • fix(filters): catch the short spam-farm wave — 8-9 char CAPS names with an internal digit by @axisrow in #1511
  • tests: remove 55 vacuous/duplicate tests proven by control mutations by @axisrow in #1513
  • test(messages): pin batch-insert behaviors that survived mutation testing by @axisrow in #1514
  • test(accounts): pin migrate_sessions behaviors that survived mutation testing by @axisrow in #1515
  • test(dispatcher): cover the EXPORT dispatch wiring (last uncovered dispatcher branch) by @axisrow in #1520
  • test(content-generation): pin survivor behaviors from mutation slice #4 by @axisrow in #1522
  • test(pipeline): pin update-injection and template-override behaviors from mutation slice #4 by @axisrow in #1523
  • test(error-recovery): pin image-guard branches and retry bounds from mutation slice #4 by @axisrow in #1524
  • test(templates): pin built-in catalog invariants from mutation slice #4 by @axisrow in #1525
  • test(dialogs): pin delete_dialogs failure outcomes and sweep cache-mode defaults from mutation slice #5 by @axisrow in #1526
  • test(collector): pin pre-collection filter boundaries and collect_all gates from mutation slice #5 by @axisrow in #1527
  • test(collector,pool): pin stream cleanup and lease-acquire contracts from mutation slice #5 by @axisrow in #1528
  • test(auth,identity): pin auth-flow contracts and sender-identity extraction from mutation slice #6 by @axisrow in #1529
  • test(reactions,backends): pin reaction-user extraction and gate reservation from mutation slice #6 by @axisrow in #1530
  • test(trend): pin trending pagination, rank order and SQL filter contracts from mutation slice #7 by @axisrow in #1531
  • test(dispatcher): pin run-iteration handler update contracts from mutation slice #7 by @axisrow in #1532
  • test(actions): pin download media failure codes and path-escape guard from mutation slice #7 by @axisrow in #1533
  • fix(filters): bound user-supplied regex matching with a per-search timeout by @axisrow in #1534
  • fix(audit): address the 8 backend regressions found by the red-test audit by @axisrow in #1544

Highlights

  • Collection cancel and retry made real — A DB-side cancel now stops a running collect — the supervisor arms cancel_events instead of only flipping a status row (#1500); the cancel sweep covers the validation-phase tail window so revived tasks can't slip through (#1503); failed channel collections get an end-of-run retry pass (#1472); and task creation and reports are retry-safe for external agents (#1469).
  • Spam-farm filter wave — The short CAPS-username spam wave (8-9 chars with an internal digit) and CamelCase+digits patterns are caught (#1511, #1483); template-generated link feeds get an auto_feed flag (#1491); a whitelist-suspects report shows what the filter would drop (#1493); non_cyrillic becomes label-only with keep-tag escrow instead of hard skipping (#1497); and channel candidates lists search-discovered channels awaiting activation (#1479).
  • Audit fixes: 8 backend regressions closed — The red-test audit regressions are fixed with UNIQUE+OR IGNORE guards and RENAME-trigger reparsing (#1535-#1542, #1544), and user-supplied regex matching is bounded with a per-search timeout against ReDoS (#1534).
  • Telegram layer resilience — Channels with unknown Telegram TL types are skipped with one warning instead of failing the pass (#1470); live username resolves run under an hourly volume budget (#1498); the DM listener handler is properly awaited by telethon (#1478); a catch-up pass survives one broken dialog (#1504); CLI scheduler mutations notify the live worker via scheduler.reconcile (#1474); the default account is the DB primary, not the sorted-first connected (#1484); and search results show @username/title instead of bare numeric ids (#1489).
  • Ops and CI — restart/worker are the managed daemon with no web panel (#1465); the daemon auto-restarts when checked-out src/ is newer than the build (#1476); collection logs a progress line after each finished task (#1466); CI test jobs are sharded under a 5-minute budget with coverage measurement dropped (#1506-#1509); and a mutmut mutation-testing stand is documented for the flat src/ layout (#1501, #1512).

Full Changelog: v0.2.4...v0.2.4.1