Skip to content

v1.31.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 21:09
f4e748e

1.31.0 (2026-11-12)

Features

  • agent-review: L1 battery scaffolding + QC standardization scaffold (#194 spec A/B/C/D) (be6dabe)
  • billing: configurable free-tier limits + billing create-free (bcc4a05)
  • billing: enforce free-tier limits at generation/schedule time (8e4ab44)
  • cli: add autoinfo mvp init/list for Concierge MVP pilots (fb03fd6)
  • cli: add autoinfo validation list --summary (23df167)
  • cli: add domain init --seed for flagship domains + extract_fields (5bde966)
  • cli: propagate extract_fields through init --demo (c32a7b2)
  • collect: requires_app_review G�:�IW� + �����:6��fail-closed (#450) (#453) (2c8a258)
  • coverage: diagnose sources per row and align the KB index with the tree (#640) (2d040ba)
  • domains: eP��f`��Ɛv�n$*1H� (#433) (0861872)
  • gov: 8-state status model + swallowed-failure visibility + known-red budget (#704) (d4544ca)
  • gov: ADR guard + decision consumer sync + SSOT convergence (PR-C, T09-T11) (#706) (c3c6d8c)
  • gov: capability boundary + degradation drills + human escalations (PR-D, T12/T15/T16) (#708) (60e340a)
  • governance: flip gov parity steps to blocking (T09) (#713) (9950a1b)
  • gov: repo hygiene + scripts registry + negative-control harness (PR-E, T13/T14/T17) (#710) (9298b07)
  • gov: single governance contract + derived facts + one entry point + doctor (#702) (adb3981)
  • kb,sources,quality: goals 1-3 � true-fresh dedup, two-state sources, attributable failures (#700) (1cbc18a)
  • matrix: llm_status + artifact provenance sidecar + report fallback marking (#771) (#783) (f1944a5)
  • mcp: add read-only MCP server mode (autoinfo serve --agent) (bc3eeb4)
  • mcp: surface regression flag in list_validation_scenarios (29d164e)
  • mvp: complete pilot delivery package (#740) (#761) (4fff040)
  • nightly: hard budget and fair-share batching for process stage (#596) (#635) (8c97182)
  • output: default Sources/References sections across product templates (327ca93)
  • output: honest "grouped by source" annotation + structured log on grouping degradation (#120) (8616253)
  • output: shared weekly story-set helper for digest/presentation/report (#119) (3a044c0)
  • quality: add deterministic G7 entity-fact consistency gate (#418) (b4e5218)
  • scripts: add real-product assertion scanner + closure rule (#356) (#376) (1853f18)
  • scripts: archive stale outputs by date cutoff with manifest rollback (AutoInfo#754) (#763) (eaaab2b)
  • scripts: packaging manifest flags configured domains with zero artifacts (#94) (7003c93)
  • scripts: packaging manifest flags configured domains with zero artifacts (#94) (e7a60b2)
  • scripts: quality_gate C6 � deterministic long-form grounding check (#192) (b351813)
  • scripts: version the R2 review battery as scripts/quality_gate.py (#188) (1513a02)
  • tts: add Azure Speech engine (#647) (#648) (e29b1d3)
  • validation: add 01-QA-GATES gate reports to delivery package (480acdb)
  • validation: add a machine acceptance reviewer that cannot self-certify (#434) (c333ceb)
  • validation: close agent-oriented gap register (2e1052d)
  • validation: verify 81 product-format cells with an evidence pack (#642) (324a9ec)

Bug Fixes

  • agent-callback: contain, track, and join the outbox drain worker (#378) (#382) (787fad6)
  • agent-infra: align agent-facing gate claims with actual wiring; wire derived checks into CI (#659) (41b42dd)
  • agent-review: embed product file contents + verdict schema in battery prompt (#197) (111778c)
  • agent-review: extract ModelResponse text before parsing battery verdicts (#196) (9188e77)
  • api: refuse non-loopback bind; confirmed bind never serves "*" CORS (#680) (#681) (671ac2a)
  • api: serialize portal delivery history dataclasses (b0e39dc)
  • battery: harden L1 verdict parsing without weakening fail-loud (#417) (e922b20)
  • build: reconcile the documented CLI group count against the code (#511) (a48527a)
  • callbacks: convert the journal mode only when not already WAL (#387) (#394) (e0f5d78)
  • ci,config,prompts,deps,governance: close issues 423-428 (#437) (a3db252)
  • ci: clear the two red self-check gates and lock the known-red budget by identity (9aec309)
  • cli+templates: wire --include-stale on tutorial/presentation, drop hollow product placeholders (#126 #129) (17354e3)
  • cli: collect h� 0 ���^���
    ������ ok�B14 (#698) (8dd0322)
  • cli: emit the canonical --json envelope on usage and internal errors (#242) (bacd5ce)
  • cli: guard output digest --persist against no-data empty shells (#525) (#527) (0ad9a01)
  • cli: remove duplicate mvp typer registration (2ffdb75)
  • collect+config: URL-path noise guard for TheStreet deals/shopping, drop over-broad brand exclusions (#137) (08f8bdf)
  • collect: cross-date URL dedup in raw cache � same URL on a later day no longer duplicates (#139) (5428b34)
  • collect: dry_run must not write the run ledger (#237) (03d5c3f)
  • collectors: preserve full article bodies and correct HN provenance (f01791c)
  • collectors: robots �e UA � �� ��X �e web/web_playwright/pdf Disallow �: skipped (#452) (#456) (6c73d3e)
  • collect: pre-request validation gates + auto-disable after consecutive failures (#669) (4faccd1)
  • collect: report post-dedup new counts and duplicates (#555) (#558) (1c5fc8a)
  • collect: skip list-shaped _runs.json in cross-date dedup scan (#160) (dd9566e)
  • config: replace ghost JUDGMENT_MODEL with real deployment model, add default_config hint (#127) (5015d9e)
  • config: single source of truth for domain default TTL (#366) (#373) (60473b8)
  • coverage: align the coverage generator with end-of-file-fixer (#240) (5197c61)
  • db: �� SQLite ޥ� eP busy_timeout��n�'Mn�� (#568) (abb0135)
  • db: �� WAL 6�0 ensure_initialized ��ޥ
    �� journal_mode=WAL�#571 (#574) (785591d)
  • dedup: anchor frontmatter delimiters to line start (#735) (#741) (f323562)
  • dedup: collect B�ߋ���� � �����
    �����
    �� (#109) (#110) (22ae1e2)
  • dedupe finding source citations, correct pubmed collected_at, default quality gates (#168 #169 #170) (0702e05)
  • delivery: wire MCP add_delivery_schedule into the free-tier frequency gate (#674) (#686) (ccf6bb3)
  • deps: restore the mcp<2 upper bound and stop dependabot widening it (#245) (522bfa8)
  • deps: restore the pytest<9 bound that dependabot widened (e5b28de)
  • docs: correct documentation drift found by the 2026-10-29 audit (#657) (96f7fef)
  • docs: gate drift-prone counts in living docs (#621) (#627) (eda086d)
  • docs: name the interpreter when the doc gate fails for environment reasons (#424) (#473) (8fa7652)
  • domains: coursera ��B description W� �
    ��c�hz (#458) (#459) (8fc3f3c)
  • domains: korean-learning b(&c���Ɛ �
    h�홫"� (#442) (#443) (ba1623d)
  • exclude placeholder single-source drafts + report full-domain fallback + cross-domain language filter (#184 #185 #186) (4c831bf)
  • exclude synthesized multi-source digests from products + no-fabrication prompt constraint (#178 #179) (10904c4)
  • G3 uses the configured LLM model and never silently neutral-passes (#171 #172) (2091677)
  • gates: keep the template provenance footer out of parsed sections (#403) (#404) (d17e63c)
  • gates: premium section aliases, Action Required omission, outbox loss observability (#395, #396, #397) (#398) (d3b7426)
  • grade-review defects � synthesis traceability, word-safe truncation, list serialization, unified USD, gate H1/H2/H3 (#200 #201 #202 #203 #204) (39e8be2)
  • grade-review defects � synthesis traceability, word-safe truncation, list serialization, unified USD, gate H1/H2/H3 (#200-#204) (6eda986)
  • grounding: record #449 as escalate-only and cut entity-candidate noise (#475) (d14171f)
  • guard: make .omo a fully ignored runtime tree (a4374f7)
  • high-score news no longer buried by G3 lexical archive / sticky archived / draft URL clash (#189) (5ba392d)
  • kb,process,delivery: #695 entry-id collisions � #722 ledger stall � #725 dirty-data resilience � #687 cron cadence gate (#731) (42c76a5)
  • kb: auto-generate draft summary when not passed so drafts never render empty-shell (#176) (2156f98)
  • kb: make 03-Wiki append-only guard separator-agnostic (#773) (#777) (dfd4abb)
  • kb: skip git versioning for gitignored knowledge paths (#607) (133ac1d)
  • kb: store index file paths relative to knowledge root (#695) (#762) (f7ad791)
  • keep LiteLLM logs off stdout, warn on CJK leaks, protect currency figures (#180 #181 #182) (ff30acb)
  • lint: clear the 247-error lint debt that blocked edits to 60 files (#512) (a6eb2e6)
  • llm: de-vendor judgment model + hardcoded fallbacks; fail-loud NOT_JUDGED (#195) (70d8ad6)
  • llm: implement same-gateway fallback key inheritance (#410) (9355d96)
  • llm: parse_json_response ��,��
    +W����+�!�!�
    �3 �� json.loads ��6� (#533) (#536) (60fe977)
  • llm: probe fallback chain and flag double-prefixed model ids (#605) (#606) (d001682)
  • llm: survive a closed LiteLLM log stream instead of failing every LLM call (da3c067)
  • matrix: stop reporting L3 for KB-derived fallback products (#646) (#651) (141dfe6)
  • mcp: classify expected failures into semantic error codes (#364) (#372) (3faa45f)
  • mcp: guard POSIX process-group APIs with Windows tree-kill equivalent (#772) (#781) (60f98d7)
  • mcp: tools/list �d�Y outputSchema�README ���#588, #584 (#594) (d2cb3bb)
  • mcp: ���6�0 ErrorCode �> + MOBI blocked-with-record {��#585, #586 (#590) (e64908e)
  • nightly-gap: ����t$� �� � entries ��
    ��� last_run (#554) (#556) (743b4bf)
  • nightly: add backlog-triggered process stage (#554) (#560) (8c6b2a1)
  • nightly: compute backlog as cached-vs-ledger set difference (#734) (#736) (b48e156)
  • nightly: DoD ` ����$n ��\F
    �G� (#528) (#531) (964b3aa)
  • nightly: locate the venv console script by path, not by slash (#744) (#746) (2cad879)
  • output,scripts: annotate & gate Chinese-numeral RMB amounts (#206) (f12e8ce)
  • output,scripts: synthesis source traceability, canonical RMB->USD rate, H1/H2/H3 grade assertions (#200 #203 #204) (d7c07b3)
  • output: add missing References section to column template (3a66e1f)
  • output: ai-commercial is a bilingual domain � 36kr Chinese news enters products (#190 #193) (bf30967)
  • output: block no-data products, drop premium filler, and gate the keyless scenario subset (#385) (86c8e12)
  • output: canonical trailing newline in digest markdown render (golden byte-identity) (d6bc802)
  • output: complete briefing divergence, tutorial summary, Entry-N strip, presentation; add surface-level quality gate (#146 #147 #148 #149 #150) (ab4b4e7)
  • output: config-driven semantic topic labels for keyword groups, no bare keyword headers (#120) (d2d06fc)
  • output: constrain tutorial gloss language + exercise format for language-learning domains (#162 #163) (fe1a630)
  • output: deterministic ����Sb� � source_type ��
    (:�
    (HACKERNEWS/RSS/API)9(���~ (#113) (#115) (1019126)
  • output: drop empty-bodied tutorial exercise shells, fall back to KB exercises (#163 #164) (4384af9)
  • output: exclude entries from sources absent from domain config at selection time, fail-open on unreadable config (#119) (c0d4a6f)
  • output: explicit re-exports to satisfy mypy strict [T11-lint] (88012d9)
  • output: extend #191 hedge discipline to all editorial-opening surfaces (#210) (1ff296b)
  • output: gate fabricated and self-contradicting product content (#447) (5ff98db)
  • output: ground magazine-digest feature_story prompt � no un-sourced assertions (#191) (d156608)
  • output: keep HTML structure and tidy citation residue (#644, #645) (#650) (420445d)
  • output: newline-separated Key Findings bullets in digest+report templates (trim_blocks-safe) (#202) (40563e6)
  • output: parse nested section headings and single-source the D1 parser (#400) (#401) (40daf39)
  • output: presentation G�9� � prompt ��� source_url }
    U + 2��`M URL ��8� (#101) (925c983)
  • output: preserve 'Cross-Domain' hyphen in display-name mapping (#155) (3c19d73)
  • output: prevent fabricated body-cited URLs in report/digest synthesis (#207) (070df8d)
  • output: rebuild tutorial completeness � no more shell tutorials (#92) (7f95d38)
  • output: rebuild tutorial completeness � no more shell tutorials (#92) (9e3d778)
  • output: render grouping-degradation marker on report product-template path (#120) (aee765a)
  • output: rephrase degradation marker as user-meaningful copy; align scenarios (#134) (18fe8ad)
  • output: report refs carry raw platform + derived source_label; stabilize tests/output + #325 scenarios (ae77b98)
  • output: report refs carry raw platform + derived source_label; stabilize tests/output + #325 scenarios (bd0da21)
  • output: report/column � entries cap [:200] + �� chaos guard � 9�� KB � 470 ah��ą� 0B (#106) (f67dd33)
  • output: scope topic-count target to degraded grouping path, keep retry/chaos/chunking (#120) (65bb344)
  • output: strip fabricated presentation source citations + forbid them in prompt (#93) (2ba721f)
  • output: strip fabricated presentation source citations + forbid them in prompt (#93) (93f6688)
  • output: strip fake-source placeholders, add product relevance floor, traceable section tables + truthful headings (#165 #166 #167) (dea06f7)
  • output: strip internal KB metadata table and raw platform ids from products (#91) (92518bd)
  • output: strip internal KB metadata table and raw platform ids from products (#91) (4c9a3b7)
  • output: strip LLM-echoed internal 'Entry N' refs from key_metrics source (#131) (1bc2ecb)
  • output: tutorial ��a� cap 0 10 � 9�� KB ߅� 0B (#103) (41518ee)
  • output: tutorial/presentation H1 mapping + digest-path tutorial header fill (#99) (112ad5a)
  • output: use display domain name in product H1 titles; differentiate premium/enterprise entry subsets (#144 #145) (dae1cfb)
  • output: word-safe presentation truncation + newline-separated Key Findings bullets (#201 #202) (0207c08)
  • portability: make product+tests Windows-safe for paths, filenames, newlines (#757) (#769) (c161612)
  • process: add --since-days / --newest-first so a budgeted run reaches new items (#596) (#655) (46eaef2)
  • process: fail the run when LLM extraction returns empty (#750) (#760) (b601475)
  • process: grade ai-process exit codes 0/1/2 (#725) (#749) (7562db1)
  • process: grade G0-blocked items into exit code 2 (#751) (#759) (9c07118)
  • process: migration seed always follows default cache walk; ledger writes retry and fail loud (#667) (568530c), closes #663
  • process: ��8�9: item id U��� item p��
    �R� (AutoInfo#596) (#637) (c28c0c3)
  • quality: D2 �����Pe� PROCESSED �i9:1%s� (#451) (#454) (c5418f8)
  • raise G3 relevance LLM max_tokens to 512 for reasoning models (#174) (6ff68bf)
  • regression: align 6 stale scenario assertions with current template/design + add stdout-purity guard (#124 #128 #302) (2cf68ac)
  • regression: hermetic dates for date-bombed scenarios (#123) (0d35049)
  • regression: update regression-357 step 3 to the #54 honest-fallback action wording (#143) (7aafc76)
  • release: reconcile the release tag instead of racing CI for it (#494) (#495) (7fb18a7)
  • resolve scenario CLI interpreter from the running process (#622) (#628) (18f6eb5)
  • RMB�USD textual-amount annotation + report URL whitelist (#206 #207) (4293ac3)
  • scenarios: cli-content asserts actual topic name IVF & Assisted Reproduction (9addbd5), closes #226
  • scenarios: drop bash-only set -o pipefail from CLI steps (runner uses /bin/sh) (3d05750)
  • scenarios: drop bash-only set -o pipefail from CLI steps (runner uses /bin/sh) (d2fe4e0), closes #219
  • scenarios: make regression-298 self-contained (language field + mock alert dispatch) (9646220), closes #225
  • scenarios: mock product judge in regression-298 for LLM-key hermeticity (#233) (f8cfdcd)
  • scenarios: output-agent-interaction mock entries need relevance_score above floor (6b5c418), closes #232
  • scenarios: output-agent-interaction mock entries relevance_score above floor (8ac6349)
  • scenarios: raise regression-16 mock e2 relevance above domain floor (6e175a2), closes #224
  • scenarios: refresh regression fixtures for language filter + stale-source guard (f2808d9)
  • scenarios: refresh regression fixtures for language filter + stale-source guard (198c1e0), closes #218
  • scenarios: refresh stale mock dates in regression-15 + domain-language-default (775ced2), closes #227
  • scenarios: render report through real _get_jinja_env (domain_display_name global) (049425d)
  • scenarios: render report through real _get_jinja_env (domain_display_name global) (1eb1b6a), closes #220
  • scripts: detect a stale doc inventory in --check (b83f0fb)
  • scripts: exclude gap-reports ops ledger from product scans (#753) (#755) (b8804d1)
  • template: magazine-digest �d {��ߡ4 � �feed�p/;��p/����3 (#117) (#118) (f643a79)
  • templates, mcp: drop premium filler and classify PromotionRejected as a validation error (#390) (0365f40)
  • templates+config: dedupe Source URLs, keep Key Findings on separate lines, omit empty column section, block shopping/non-repro exclusions (#130 #132 #133 #135 #136) (509fc7c)
  • templates+output: strip internal brand/slug/microsecond marks from product footers (#138) (55c4461)
  • templates: drop the last No ... fillers from column and report (#391) (6506256)
  • templates: render display domain name in 3 html Domain headers + magazine masthead; de-brand CSS comment (#142) (a1696f8)
  • templates: render display domain name in Domain header; strip AutoInfo from briefing title defaults (#141) (88600a1)
  • test: remove unused MagicMock import in entry filters boundary test [F2] (1dc0f77)
  • tests: resolve 14 test failures across 8 files (d087cba)
  • thread the production LLM model into the SERIAL G3 path (#173) (4400466)
  • types: pay down the mypy strict debt to zero across src/ (4ccea65)
  • validation: #-prefix concierge-wave regression_issue tags (#214) (b16a226)
  • validation: #-prefix concierge-wave regression_issue tags (#214) (5ddab8c)
  • validation: doc_inventory --check asserts on-disk scenario count vs README (#215) (c5ee767)
  • validation: make regression-445 hermetic and gate LLM seams in CLI scenarios (#623) (#626) (b27aa92)
  • validation: make the year assertion's title-run match any script (#444) (#477) (7dbe7ea)
  • validation: relocate on-disk scenario count assertion into run_check; sync doc-manager-skill 137->138 (#215) (b634588)
  • validation: remove year/RSS assertion false positives (#351, #325) (#375) (abbf8ac)
  • validation: �����e HTML ӄ�~}
    U� scheme:// �+ (#677) (#684) (923fbc2)

Documentation

  • acceptance: publish the 1.14.0 report and stop the closure doc lying (#422) (c39bbad)
  • add development briefs v1-v4; ignore generated demo-packages/. (f01791c)
  • adr: record multi-tenancy as out of scope (ADR-0012) (#676) (c13ced5)
  • agent-infra: agent ��t9 � �rQ�/��B/��':6�ع+P0-P5 (#724) (ce6ca30)
  • agents: add Product QC 3-layer model protocol to AGENTS.md (#194 spec E) (c6fe5f7)
  • align declared counts with code truth (governance remediation T01) (#699) (3367527)
  • callbacks: repoint outbox lock references from #67 to #387 (#388) (e95436c)
  • ci: retarget the tree-wide ruff count to the post-round value (70cdaee)
  • correct CLI group count, scenario split, and remove duplicated blocks (#507) (a40f197)
  • counts: align test-suite count with pytest collection (#505) (7ad2a69)
  • coverage: reconcile the E8 required_sources count with reality (#416) (daf2e95)
  • demo release standard + quality residual risk register (063be80)
  • demo release standard + quality residual risk register (0db81ee)
  • document 01-QA-GATES, free-tier, mvp, readonly MCP, and seed features after concierge wave (8b92210)
  • fix drifted counts/refs found by the 2026-10-18 drift audit (#541) (0ce7e6e)
  • gates: G0 n�'��
    �� ���^ G4�+ :h��h� CI �� (#569) (18d3e7a)
  • governance: add the cross-repo boundary gate to �0 (#745) (#748) (031ed35)
  • graph-engineering: ���J�=0���H(�cH)e� + Ͱ�� doc-inventory (ce89311)
  • handoff: count the handoff commit itself in the round total (51cfa25)
  • handoff: hand the round over with its traps and open items (98e4a0f)
  • handoff: make the round count drift-proof (4fe8164)
  • health: pin the report's counts to the post-commit state (6b378a8)
  • health: record the mypy paydown and the out-of-selection sweep (88071f6)
  • health: state where the runtime-artifact guard is enforced (97aa3ee)
  • known-limitations: {� #526��JSON ��(c���k�bK���� � (#535) (89234e6)
  • loop-log: correct the test baseline after refreshing the local env (17, not 23) (2c5a100)
  • loop-log: record the 2026-09-13 verification round + five new pitfalls (dc5ff6a)
  • mcp: �U tools/list ��K token �� outputSchema �Y�#562 (#577) (861f9b6)
  • output: record export/entries module split in project tree [T12] (9e90969)
  • output: regenerate doc inventory after pre-commit whitespace fixes [T12] (914a86e)
  • plans: promote agent-oriented gap register to docs/dev/plans (#236) (8ab1983)
  • re-verify project-analysis-2026-10-29 on 2026-10-30; correct 12 findings (#661) (335054e)
  • reconcile counts and the round records (ede8e3c)
  • record ADR-0012 amendment and add director goals brief (#693) (f202408)
  • refresh derived doc surfaces after inventory sweep (#689) (1e20992)
  • register the year-granularity laundering residual (#444) (#483) (c95d8f0)
  • required status checks are ten after the T09 flip (#716) (89f52c2)
  • residuals: inferential-wording hedge review procedure now in skill (da9bf89)
  • restore the CLI group count to the repo registered_groups definition (#508) (9b0f7af)
  • resync the documented test count to 5514 (eed68ff)
  • sync drift-prone counts and record the 2026-09-14 round (#236-#242) (b803aa4)
  • sync scenario count 137 -> 138 in README/AGENTS (#215) (ad2c676)
  • sync scenario count 137->138 across all documentation (4437200)
  • sync scenario count to 137, CLI groups to 31, test count, and README/AGENTS stale surfaces after concierge wave (d7dd743)
  • sync stale scenario/CLI/ErrorCode counts across specs and skills after concierge wave (fb95c28)
  • sync validation scenario count 129�130 across README, AGENTS, and skill docs (1fd60fb)
  • triage: make the known-red budget a single source of truth (#239) (8edb5d4)
  • update judgment-model resolution references to config-first (#195) (fb82982)
  • validation: add fix-retro
    ذU section to LOOP-LOG (49309da)
  • validation: add fix-retro
    ذU section to LOOP-LOG (0ba3935)
  • validation: apply corrections to business-validation report (gate term, external data, pricing) (86b1001)
  • validation: apply corrections to dev roadmap (gate term, template matrix, CLI verb, seed lists) (e4e5ffe)
  • validation: correct nonexistent demo-package and unarchived R5 claims (e31cc51)
  • validation: sync tool/scenario counts to 149/182 after phase-3 refactor (#620) (414035d)
  • {� #519 �Y����c�P�E((�~S� (#523) (3203559)

Refactoring

  • config: ؤ<6�0 autoinfo.defaults U�e��#587 (#591) (314796b)
  • core: MCP dispatch �h + output ��!W���#581/#582 phase 2 (#601) (684d440)
  • core: ����/(�/MCP/��!W�L�#580-#583 phase 1 (#597) (a75661d)
  • mcp: phase 3 wave 0 � context.py helper tier + seam retarget + guards (#581) (#609) (e08ffd0)
  • mcp: phase 3 waves 1-3 � move all 149 handlers into tools/ (#581) (#611) (6b3fc43)
  • nightly: NIGHTLY.md ;:9:�&+2�+CI --check����:��� (#570) (4acb7e2)
  • output: extract export family to output/export.py with re-export shim [T7] (748ae4f)
  • output: extract shared entry filters to output/entries.py with re-export shim [T10] (6dc7e31)
  • output: phase 3 wave 4 � split output hub into six leaves (#582) (#617) (e22d1ed)
  • prompts: centralise LLM prompts under data/prompts with a loader (#426) (#481) (9274478)

Tests

  • acceptance: close B-01 and B-03 with real scenario coverage (#420) (fe1f4e4)
  • add regression tests for #168 finding-source dedupe, #169 pubmed collected_at, #170 default quality gates (3f78651)
  • agent-review: make known-good/honest-hedge-positive fixtures genuinely clean positive anchors (#198) (e3594f5)
  • api: lock the portal delivery-history serialization fix (a0f498f)
  • cli: cover the billing/collect/process/serve/status/summaries additions (69addfa)
  • cli: help �,��� ANSI M� � main ��h� 26 aG� (#461) (3904c94)
  • cli: lock the enduser/audit/portal asdict regressions (7f5fc49)
  • collect: add cross-date URL dedup regression tests for #139 (343c6a8)
  • collectors: annotate hackernews tests for strict mypy (#367) (#371) (d3e4613)
  • core: cover the dedup and validate additions (532be7a)
  • cost: lock the stripe and budget-alert normalizers (9019cc3)
  • delivery: cover gate_report and translation_qa (3323d49)
  • delivery: �� TestDigestDeliveryGates � LLM/Q���9�L����#567 (#579) (3c03437)
  • fixtures: make freshness-sensitive KB entries date-relative (#506) (f7cc541)
  • freshness: freeze expiring fixture dates and guard against new ones (#509) (7d6a5b4)
  • gates: register perf-concurrency flake; pre-commit doc-drift check (#692) (99b36ca)
  • infra: fix 3 backlog test-suite issues (#211 #212 #213) (a6d81a3)
  • llm: fallback Mn(�9: hermetic�
    ��,:�rMn � e�墄� (#448) (#462) (fd71ebe)
  • llm: lock the closed-stream LiteLLM log fix (0c432c2)
  • llm: make judgment-gate tests hermetic without a project config (6e2cfe6)
  • mcp: accept non-issue regression tags in scenario regression_issue assertion (0539ef4)
  • mcp: isolate the journal-mode statement recorder per connection (#484) (#486) (1a4db3b)
  • mcp: � http e�(�9(��� loopback
    � ��lQ�V (#519) (#521) (95efabf)
  • output: add #165/#166 regression tests; harden #150 gate with R10/R11 rules (#165 #166 #167) (0a8bef7)
  • output: align 7 test suites to the display-name/timestamp/engine contracts (#153 #154 #156 #157 #158 #159) (75cbe59)
  • output: bound the Dolly flood count on the findings section (63c7f20)
  • output: derive digest fixtures from the current time instead of literal dates (12fa77c)
  • output: freeze the clock that decides entry staleness (#498) (#499) (82fd00e)
  • output: hermetic #120 entry-level column test � include_stale=True to defeat stale-guard date bomb (#121) (#122) (2443aef)
  • output: lock export family at module boundary with golden renders [T6] (6927143)
  • output: lock shared entry filters at module boundary with golden digest [T9] (1d94829)
  • output: lock tutorial entry cap at 10 with unit tests + regression scenario (#103) (f7e3155)
  • output: make digest window-fallback fixtures calendar-proof (#431) (0a685aa)
  • output: make tutorial fixtures time-relative (#241) (8f4130b)
  • output: regression scenarios for cross-product sourcing + grouping-degradation honesty (#119 #120) (1ff97d1)
  • output: update H1 title + reference-subset assertions to display-name contract (#144 #145) (e32e78e)
  • quality: fix stale expectations (count drift, dir layout) [T2] (118e485)
  • quality: hermetic seams for config-dependent tests + optional-dep skip tags [T4] (94ed120)
  • quality: restore mock seams (usage-site patches, pre-check stubs) [T3] (04772ab)
  • scenarios: align regression-16 with #166 relevance-floor (sub-floor entry excluded) (#218) (22d5f1c)
  • scripts: known-defects fixture acceptance for quality_gate (#194 spec C) (adce87f)
  • validation: add billing create-free regression scenario and regression-flag assertion (db4501d)
  • validation: tag regression-validation-list and de-hardcode tool count in readonly scenario (cacf39d)

Build System

  • deps-dev: update pytest requirement from <9,>=8.0 to >=8.0,<10 (#243) (3a7e496)
  • deps: update mcp requirement from <2.0,>=1.0 to >=1.0,<3.0 (#244) (7a405cc)
  • pre-commit: pin ruff to 0.16.8 and clear the self-match (787e0dc)

Miscellaneous Chores