Skip to content

v0.2.4.2 — Analyzer in Seconds, DM Cycle & Content Curation

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Oct 14:39
· 53 commits to main since this release

What's Changed

  • feat(errors): classify TypeNotFoundError as schema drift, not missing entity (#1549) by @axisrow in #1553
  • feat(web): QR login for account onboarding (#1551) by @axisrow in #1555
  • fix(auth): QR login review fixes missing from #1555 by @axisrow in #1559
  • chore(docs): standard AO review replaces dual Claude+Codex convention by @axisrow in #1560
  • feat(collector): parse MessageEntity spans and flatten RichText iv-pages (#1547) by @axisrow in #1554
  • feat(sanitize): anti-prompt-injection sanitizer for Telegram content entering LLM prompts (#1546) by @axisrow in #1558
  • feat(runtime): cross-process session lock and AuthKeyDuplicatedError retries (#1548) by @axisrow in #1556
  • feat(transcription): speech-to-text для голосовых — порт transcription.py из telegram-mcp by @axisrow in #1561
  • fix(filters): label-only метки переживают apply; keep-тег гардирует все авто-пути фильтрации by @axisrow in #1565
  • feat(collector): preserve masked-hyperlink URLs in entities_json (#1492) by @axisrow in #1564
  • fix(agent-tools): default-phone ACL pick skips inactive/broken accounts (#1485) by @axisrow in #1563
  • feat(scheduler): queue-status — live collection progress with measured ETA by @axisrow in #1562
  • feat(dm): reply drafts with atomic claim against double-send (#1429) by @axisrow in #1566
  • test(db): close every raw sqlite3 connection left open by test helpers (#1494) by @axisrow in #1567
  • chore(deps): update fastapi requirement from <0.143,>=0.136.3 to >=0.136.3,<0.144 by @dependabot[bot] in #1543
  • feat(filters): low_engagement — флаг мёртвого вовлечения (views <10% подписчиков, окно 100 постов) by @axisrow in #1550
  • test(quality): pin quality-scoring tests to offline default stub (#1445) by @axisrow in #1572
  • feat(messages): topic_title рядом с topic_id при выдаче (#1552) by @axisrow in #1575
  • fix(cli): no parallel Telegram pools — scheduler start / channel stats / collect --channel-id (#1569) by @axisrow in #1574
  • feat(filters): whitelist-режим «авторский контент» (#1490) + filter flag — sticky manual (#1499) by @axisrow in #1573
  • feat(ping): friendly pings for dormant DM contacts (#1415) by @axisrow in #1576
  • feat(scheduler): CLI status reads live runtime_snapshots; raw settings set reaches the worker by @axisrow in #1577
  • feat(scheduler): live RPC for trigger/cancel/clear-pending over telegram_commands (#1568) by @axisrow in #1578
  • packaging: wheel ships tg_agent package; tg-agent --version prints correct name (#1448, #1447) by @axisrow in #1582
  • feat(search): date window + json/csv output; structured weekly digest workflow by @axisrow in #1584
  • fix(cli): reject unknown permission boolean values by @axisrow in #1609
  • fix(cli): preserve Typer exit codes in production entrypoints by @axisrow in #1610
  • fix(account): load session encryption key for env-only onboarding by @axisrow in #1612
  • fix(cli): recognize console-script and configured daemon processes by @axisrow in #1611
  • fix(cli): apply new pipeline filters after message loading by @axisrow in #1613
  • fix(pipeline): preserve DAG publication relations on edit by @axisrow in #1614
  • feat(skills): channel discovery workflow by keywords by @axisrow in #1615
  • feat(filters): channel probe — pre-add quality card from a LIVE sample by @axisrow in #1622
  • fix(cli): recognize macOS framework Python binary in daemon detection by @axisrow in #1623
  • fix(analytics): pipeline-stats publish rate inflated 100x (5000% instead of 50%) by @axisrow in #1625
  • fix(cli): reject translate detect --batch-size <= 0 (infinite loop, #1618) by @axisrow in #1624
  • fix(cli): keep full message text in CSV output (#1617) by @axisrow in #1627
  • fix(pipeline): keep A/B settings through export/import (#1621) by @axisrow in #1628
  • fix(pipeline): persist A/B flags on pipeline add --node (#1620) by @axisrow in #1629
  • hotfix: remove duplicated A/B kwargs breaking import_json (main red at b731cf6) by @axisrow in #1634
  • fix(search,analytics): validate and normalize non-canonical date bounds (#1593) by @axisrow in #1633
  • fix(channel): clean not-found instead of FK traceback for tag set/get (#1600) by @axisrow in #1630
  • fix(search-query): validate regex patterns; report unavailable counts honestly (#1607) by @axisrow in #1631
  • fix(cli): messages read --format json/csv survives empty results and errors (#1598) by @axisrow in #1632
  • fix(calendar): --limit must not reorder the upcoming queue head (#1619) by @axisrow in #1626
  • fix(filters): use saved filter-criteria thresholds in ChannelAnalyzer (#1596) by @axisrow in #1636
  • feat(tasks): lease/TTL recovery for stranded interop claims (#1468) by @axisrow in #1638
  • feat(dm): incoming-DM journal readability + web/REST surfaces (#1579) by @axisrow in #1639
  • feat(dm): catch-up settings validation, dm status CLI, mark_processed wiring, queue log phone (#1581) by @axisrow in #1640
  • fix(settings): encrypt embeddings API key at rest; mask secrets in CLI output (#1597) by @axisrow in #1642
  • fix(cli): clean abort on EOF and Ctrl-C at confirmation prompts (#1590) by @axisrow in #1641
  • fix(pipeline): forward backend/mode/image flags on pipeline add --json-file (#1594) by @axisrow in #1643
  • fix(photo-loader): batch-create is atomic — no partial HELD batch on error (#1601) by @axisrow in #1644
  • fix(skills): align documented commands with the CLI tree; document dialogs delete (#1605) by @axisrow in #1635
  • feat(filters): high_volume flag — P95 of 24h message volume with absolute floor by @axisrow in #1645
  • fix(paths): anchor runtime data/log dirs to cwd, not the package dir (#1595) by @axisrow in #1637
  • feat(dm): agent tools for the DM cycle — journal, drafts, approve/reject, archive (#1580) by @axisrow in #1646
  • perf(test): speed up full pytest runs and fix isolation by @axisrow in #1647
  • fix(cli): search-query toggle/run report not-found instead of fake success (#1606) by @axisrow in #1648
  • feat(channels): approval queue core and gate (provenance stage 5.1) by @axisrow in #1654
  • test(env): detect stale editable installs with one clear failure (#1649) by @axisrow in #1650
  • feat(filters): analyzer and prefilters skip human channels — provenance stage 4 (#1312) by @axisrow in #1651
  • feat(shared): tg-shared package scaffold — storage Protocol, boundary (#1420) by @axisrow in #1653
  • test(cli): cover the full daemon-autorestart decision path; document local hook wiring by @axisrow in #1652
  • fix(cli): errors exit non-zero with stderr via shared cli_error helper by @axisrow in #1655
  • docs(skills): digest items must end with bare source links by @axisrow in #1656
  • docs(skills): digest item = title, body, ONE primary-source URL by @axisrow in #1657
  • fix(telegram): rotate accounts on TL schema-drift parse failures (#1471) by @axisrow in #1659
  • feat(analytics): usefulness content rating — deterministic prod report + LLM judge calibration axes by @axisrow in #1658
  • feat(filters): calibrate usefulness dictionaries/tiers against judge labels by @axisrow in #1663
  • feat(cli): batch search — several queries per call (#1668) by @axisrow in #1669
  • fix(analytics): day-window post counter compared ISO date to space-separated boundary (#1665) by @axisrow in #1672
  • fix(search): include length bounds in min/max-length filters by @axisrow in #1673
  • fix(search): normalize datetime date bounds to UTC (#1666) by @axisrow in #1674
  • feat(filters): P95 high_volume blocks collection + simultaneous copies are dupes by @axisrow in #1677
  • perf(filters): incremental text-stats cache — analyze without five 27GB scans (#1679) by @axisrow in #1680
  • ci: raise tests-shards wall budget to 10m on measured CI data by @axisrow in #1670
  • fix(cli): mask tg_api_hash in settings get output (#1664) by @axisrow in #1671
  • test(flood): assert flood-gate contracts behaviorally via the public API by @axisrow in #1678

Highlights

  • Channel filtering: fast analyzer, spam waves closed — An incremental text-stats cache makes a full filter analyze run in seconds instead of five 27GB table scans (#1679, #1680); the P95 high_volume flag now blocks collection and simultaneous cross-channel copies count as dupes (#1571, #1677); low_engagement flags dead channels (views <10% of subscribers) (#1550); the «авторский контент» whitelist mode and a sticky manual flag give humans the final word (#1490, #1499); channel probe shows a live quality card before adding a channel (#1622); the approval queue gates new channels (provenance 5.1, #1654); human-approved channels are invisible to the analyzer (#1312); and analytics usefulness rates «полезное vs вода» with an optional LLM-judge calibration axis (#1658, #1663).
  • Search and digests — Batch search runs several keywords in one call (#1668); date windows plus json/csv output anchor the structured weekly-digest workflow (#1584); date bounds are validated and normalized to UTC with length bounds included (#1593, #1666, #1673); forum messages carry topic_title next to topic_id (#1552); CSV keeps the full message text (#1617).
  • DM cycle and dormant-contact pings — The full incoming-DM flow lands: a readability journal (#1579), reply drafts with an atomic claim against double-send (#1429), catch-up settings with a live dm status (#1581), and agent tools for journal/drafts/approve/archive (#1580); friendly pings re-engage dormant 1:1 dialogs on a decaying schedule (#1415); and voice/video notes transcribe via groq/telegram/openai/local whisper (#1561).
  • Security and resilience — An anti-prompt-injection sanitizer guards LLM prompts from Telegram content (#1546); a cross-process session lock prevents AuthKeyDuplicatedError (#1548); accounts rotate on TL schema-drift parse failures instead of failing the pass (#1471); the embeddings API key is encrypted at rest and secrets are masked in CLI output, including tg_api_hash (#1597, #1664); stranded interop claims recover via lease/TTL (#1468); confirmation prompts survive EOF/Ctrl-C (#1590); and the errors-exit-non-zero contract is enforced repo-wide (#1655, #1610).
  • Ops, packaging and CI — Scheduler trigger/task-cancel/clear-pending become live RPC against the running worker (#1568), queue-status reports measured ETA (#1562); the tg-shared package scaffold lands with a storage Protocol boundary (#1420); the wheel ships the tg_agent package and tg-agent --version reports the right name (#1448); a detector fails fast on stale editable installs (#1649); CI test shards get a measured 10-minute budget (#1670); and the full pytest run gets faster with isolation fixed (#1647) — plus ~40 targeted fixes across CLI, pipelines, analytics and filters.

Full Changelog: v0.2.4.1...v0.2.4.2