How Newswatch works, end to end
Newswatch is an application built on the K9-AIF framework. It runs unattended: every hour it collects from primary sources, screens and classifies what it finds, analyses each item with a model, verifies every claim against the source, and publishes only what passes.
New to K9-AIF? ▶ Watch the 3-minute introduction
How an item gets here
- Collect30 primary sources, every hour: vendor release feeds (GitHub, PyPI), docs changelogs, official blogs, OWASP and NIST. Conditional GET, robots.txt respected.
- Screenk9x Shield and Granite Guardian read every collected text. Suspicious text is labelled and analysed, never obeyed.
- Keep what mattersDuplicates, marketing, customer stories, events and fix-only releases are dropped before any analysis.
- Analyse and verifyAn Analyst scores the item on the rubric; a Verifier re-reads the source and names any unsupported claim; one revision.
- Publish or holdVerified items go on Today's page at once. Anything not fully confirmed is held back and never shown.
Layers
Router → orchestrators → squads → agents, the K9-AIF execution model. Each layer knows only the one below it: orchestrators load squads by file and id and never name an agent (K9-DEC-002); the squad layer is built once at start-up (SquadLoader.from_agents); every model call goes through the framework's llm_invoke.
What keeps it trustworthy without a review step
Fetched safely
Only configured https sources. Every redirect hop is checked against private and loopback addresses, responses are size-capped, and robots.txt is honoured (PublicWebAdapter, a K9-AIF BaseApiAdapter).Untrusted text, contained
Collected text travels by reference, never in agent payloads. The model that reads it has no tools and must answer one JSON object, which is checked against the rubric before use.Rules in code
Claim status can never exceed what the source proves. Headline ≤ 14 words, brief ≤ 60. Every number and version must appear in the source. At most 4 OWASP tags, each tied to the item.Verified or not published
The Verifier re-reads the source; the Analyst gets one revision. Anything still unconfirmed is held back. The opening line of each issue and the scorecard are computed from facts, not written by a model.The rubric
SHIPPED a versioned release with a changelog entry · DOCUMENTED official documentation · ANNOUNCED blog or keynote only.
ASI01 Agent Goal Hijack · ASI02 Tool Misuse and Exploitation · ASI03 Identity and Privilege Abuse · ASI04 Agentic Supply Chain Vulnerabilities · ASI05 Unexpected Code Execution (RCE) · ASI06 Memory & Context Poisoning · ASI07 Insecure Inter-Agent Communication · ASI08 Cascading Failures · ASI09 Human-Agent Trust Exploitation · ASI10 Rogue Agents
Tool / action control (allowlisting, permissions, sandboxing) · Human-in-the-loop support · Identity and zero trust (agent identity, auth, least privilege) · Observability and audit (tracing, logging, evals) · Data protection (PII, residency, retention) · Inter-agent communication security
Data, audit and schedule
- SQLAlchemy Core on PostgreSQL (schema
k9newswatch) or SQLite: items, sources' state (ETag, last check), runs, issues, digests. audit_eventsis append-only (a database trigger refuses updates and deletes) and hash-chained. Every collect, screen, classification, analysis, publication and admin change is recorded, with the model and prompt version.- Hourly: collect, then analyse what is new. Midnight US Eastern: the day's issue freezes into a page, PDF (WeasyPrint), email-ready HTML and items.json. Fridays: the weekly digest and scorecard.
- Model: a local model on Ollama through K9-AIF's model router; screening by Granite Guardian. Nothing leaves your infrastructure except the fetches to the public sources.
Sources
Block diagram
In each box, Newswatch's own classes (solution building blocks, SBB) sit above the K9-AIF framework contracts they extend (architecture building blocks, ABB). Sources sit outside the container; the infrastructure below it.
K9-AIF (ABB)