RESTRICTED · INTERNAL · IMDA / MDDI

SG Digital Pulse — Architecture Explorer

Continuous public-sentiment sensing · grounded, de-identified, traceable · ~S$700/month · click any component for detail
TL;DR Explain — plain-English mode for a non-technical read
System architecture Issue tracker Situation report Research report Agents & models
External dependencies sit outside the trust boundary. The AI badge marks an autonomous agent step — the multi-agent core. Click any component for detail.
In plain terms: the tool listens to public conversation, has AI read and sort it, groups it into issues, and publishes safe summaries — all on an automatic schedule. Turn this off for the short version.
Apify
managed capture · 4 lanes
A managed scraping service — we don’t run our own crawlers. Four “lanes” run on a schedule (official government pages, news media, public social posts, forums), and every run is capped by a monthly budget so cost can’t run away.
Anthropic Claude
Opus · Sonnet · Haiku · external LLM
Every read-and-write task uses Anthropic’s Claude, but not always the same size model: cheap-and-fast Haiku for high-volume tagging, mid Sonnet for gates, Opus for report writing and critique. Prompt caching and batching keep the whole bill near S$700/month.
Web + forum search
research lane · external
When the tool’s own stored data can’t answer a research question, the research engine goes out to the open web and deep-reads forums to fill the gap — so a report isn’t limited to what we already captured.
Users
staff · the 7 · curators
Nobody reaches the tool without logging in through a Zero-Trust gate. Three tiers: all staff can read the public view, the seven leaders see the internal reports, and curators get the review tools.
Zero-Trust perimeter · Cloudflare Access
Sources
Official (gov.sg)
Media · Public · Social
data.gov.sg4 capture lanes
Four kinds of material feed in — official (gov.sg, Parliament), mainstream and alternative news, public social posts and comments, and open data from data.gov.sg. About 36,700 mentions captured so far.
1 · IngestAI
capture-kickingest-datasetthread-scaningest-url
scheduled bulk = rules only · manual readers = + AI
What the scrapers return is messy. The scheduled bulk ingest tidies every item into one common “mention”, filters for relevance with a keyword list, strips personal data and removes duplicates — all by fixed rules, no AI — and the AI reading comes next, in Enrich. The two manual tools are different: when an officer pastes a single thread or article URL, the tool uses Haiku on the spot to judge how relevant it is and its sentiment before staging it.
Quality gate: Deterministic gates decide what passes — keyword relevance, PII redaction, dedup, a date floor. Manual URL/thread reads add a Haiku relevance score and a human confirm before staging.
2 · EnrichAI
screen-sgfacetthemelineattribute-voices
de-identified first
This is where the AI reads. A sequence of small model calls tags each mention — is it relevant, which domain, which theme, which talking-point, and who it’s aimed at with what stance. Personal data is stripped before any of this runs.
[Gap] Uneven. The attribution/sentiment agent is eval-gated on a 149-row blind gold set, but facet, theme and Line tagging have no formal accuracy gate — they lean on self-heal sweeps and human review after the fact. Enhance: small gold sets + a confidence gate for these too.
3 · DetectAI
detect-storiessame-event-judgeassemblemerge
→ issues
Individual posts aren’t useful alone. The AI decides which mentions are about the same real-world event and groups them into a single “issue” (404 so far), so leaders track a story, not a stream of posts.
[Gap] No pre-hand-off check on clustering; bad merges are caught later by an over-merge sentinel and saga-split sweep (9 splits so far). Enhance: a second-judge or confidence gate before an issue is formed.
4 · EnginesAI
ir-runsagagd-* research
multi-agent loops
Three different report writers. Two summarise issues and situations; the third is a full research agent that plans, gathers evidence, drafts, critiques its own draft, and fills gaps before returning — the way an analyst would. 186 reports produced.
Quality gate: The strongest gates in the system: the research engine runs a coverage gate that can return “insufficient evidence” and a guardian faithfulness check, then a remediate loop, before returning. Issue and situation reports carry check-flags and a curator lock.
Presentation
imda-pulse all-staff
imda-ir the 7
imda-review curatorsanon key + Access
Three separate websites, each showing only what its audience should see: a personal-data-free public view for all staff, the full internal view for the seven, and a review console for curators.
Quality gate: Nothing publishes without an automated pre-publish PII scan and a curator lock; the public view is additionally quote-capped and PII-free.

Supabase Postgres · ~80 tables · RLS on all · pgvector · Vault · pg_net · pg_cron

One Postgres database (~80 tables) holds everything. Every table has row-level security switched on and denies access by default; 79 of them are reachable only by the system itself, never by the public key.
Mentions & stories
36.7k mentions
Attribution
14.5k voices
Reports & sources
186 reports
Taxonomy / Lines
domains + Lines
Evals & QA
gold sets · qa
Ledgers & logs
spend · self-heal
Orchestration
pg_cron · 07:00 / 09:00 / 13:30 / 15:00 SGT · pg_net triggers · continuous processors
The whole pipeline runs itself on a timetable — two capture windows and two processing runs each weekday — so the dashboard is fresh by mid-morning and mid-afternoon without anyone pressing a button.
Quality gate: An invariant monitor watches for pipeline breaks and alerts; continuous processors re-run stalled work as a backstop.
Observability
invariant monitor → Telegram · agent_spend ledger · self_heal_log (133) · Google Analytics page-usage
A watchdog continuously checks the pipeline is healthy and alerts (via Telegram) if something breaks; a separate ledger records the cost of every single AI call, so spend is always visible; and Google Analytics tracks usage of the published sites.
Quality gate: This is the gate for everything else — health invariants and a per-call spend ledger make failures and cost visible.
Security & governance
RLS deny-by-default · Vault · security scan + incident log · PII + public/internal split
Access is locked down (row-level security, secrets in a vault, tiered logins), a scheduled scan looks for new exposure, and there are two governed outputs — an internal IMDA-named view and a stripped public view. Nothing sensitive is published raw.
Quality gate: A scheduled scan detects new exposure (e.g. a table with RLS off) and auto-fixes or flags it. Enhance: some write RPCs are still anon-executable behind the edge gate — moving to authenticated sessions is a Next item.
Versioning
DB 300+ migrations · edge-fns → daily GitHub backup + dated tags · Pages history · byte-verified deploys
Three layers are each version-controlled: the database by 300+ migrations, the 62 edge functions by an automated daily backup that mirrors them to a private GitHub repo with dated snapshot tags, and the websites by Cloudflare deploy history — so any layer can be rolled back. The edge-function backup runs itself (a scheduled GitHub Action), keeps an off-site copy, and logs every run.
Quality gate: Every deploy is byte-verified (SHA match), the database has 300+ migrations, and the edge functions now have an automated off-site daily backup with dated snapshots and a per-run log. Enhance: still no one-click managed rollback (restore = git checkout a tag + redeploy), and the DB schema is not yet mirrored to git.

Agent-architecture checklist — how the three engines measure up

Graded against the “own your intelligence” agent framework — harness · model · context · evals. All three engines run on the same platform, so the fundamentals are shared; the differences are in loop depth, model routing and evaluation. Turn on Explain for why each concept is measured.

ConceptIssue trackerSituation reportResearch report
LLM in a loop + tool usethe core agent pattern
The base agent pattern — a model that calls a tool, sees the result and decides the next move. Measured because a real loop can pursue a goal over many steps, not just answer once.
Partial
staged LLM calls, not a loop
Partial
parallel synthesis, no tools
Met
critic + gather + remediate loop; web/forum/apify tools
Explicit cognitive architecturecontrolled, not free-roaming
A fixed, inspectable sequence of steps instead of a model roaming free. Measured because regulated, high-stakes work needs predictability — you can point to each stage and say what it does.
Met
fixed comment→issue stages
Met
skeleton→combine→synthesise→verify
Met
scope→critic→gather→analyse→guardian→report
Model-per-task routingright model for each step
Using a cheaper or a stronger model per step, not one model for everything. Measured because it controls cost and quality, and proves you own the model layer rather than a single black box.
Met
Haiku for high-volume tagging
Partial
mostly Sonnet for the report
Met
Haiku · Sonnet · Opus by stage
Owned, grounded contextno fabrication; traces to source
Every figure and quote must trace back to stored evidence; the model can’t invent. Measured because it’s the line between an intelligence tool and a plausible-sounding guess.
Met
every figure traces to a mention
Met
measured-first; unsourced dropped
Met
no-invent proposer; guardian faithfulness
Private eval / benchmarka gold set defines “good”
A private, labelled test set that defines what “correct” means and catches regressions. Measured because your eval is what defines quality inside the organisation — without one you’re guessing whether a change helped.
Met
attribute-voices gold · κ0.89
Gap
no gold set for the report’s output
Met
gd-eval gold goals · precision/recall
Quality gates before outputchecks before hand-off
Each step’s output is checked before it hands off. Measured because it’s how a multi-agent system stops one bad step from poisoning the whole result.
Met
PII scan · curator · prepublish
Met
calibration · no-advice · spine-gap
Met
ground-check · coverage · guardian
Human-in-the-loopa person can gate or approve
A person can review, correct or block before anything is relied on. Measured because in government nothing should surface unreviewed.
Met
review-before-commit + lock
Met
human selects issues + locks
Met
scope confirm · uncertainty-stop
Observabilitytrajectory / step logs
Being able to see what went into the model and what each step did. Measured because agents usually fail on bad context, not a bad model — and you can only fix what you can see.
Partial
self-heal + spend logs
Partial
ir_jobs.step_log + verify_flags
Partial
step_log + critic_log; no replay UI
Cost governancespend caps + ledger
Every model call is costed and hard caps stop runaway spend. Measured because unbounded agents can burn budget fast; this is the proof of financial control.
Met
capture cap + spend ledger
Met
daily cap + kill switch
Met
daily · per-issue · velocity caps
Feedback flywheellearns from corrections
Operator corrections feed back to improve the system over time — the loop that compounds value. Measured because it’s what turns a static tool into one that keeps getting better.
Met
off-topic corrections train it (364 ex.)
Partial
AMEC learns from operator decisions
Met
applies learned rules (gd_lessons) at plan time
Met fully presentPartial present, maturingGap not yet

Reading it: the fundamentals — a controlled cognitive architecture, grounded context, quality gates, human-in-the-loop and cost governance — are met across all three. The Research engine is the fullest agent: a true tool-loop, Haiku · Sonnet · Opus routing, and an eval’d scope gate. The two open gaps are system-wide, not per-engine — a task-wide benchmark suite beyond the two gold sets, and trajectory-replay observability feeding an automated improvement loop.

Issue Tracker — how one public comment becomes issue intelligence, end to end. Each AI badge is an autonomous judgement — the multi-agent core. Click any step.
In plain terms: follow one comment from the moment it’s collected to the moment it appears in a report. The purple steps are where the AI makes a judgement — that’s what makes this many small agents, not one chatbot.
1 · CaptureAI
Apify (auto) · thread-scan (manual)manual reader → + Haiku
One public comment is pulled in. In the automated lane that’s just Apify scraping (no AI); when a curator pastes a thread URL, the reader uses Haiku to split the page into separate comments and pre-tag them. Either way it’s saved as a raw mention that still links back to source.
Quality gate: Manual pulls are gated by review-before-commit (a human ticks what to keep); automated pulls are gated at the next steps by relevance + dedup.
2 · Dedup
canonical-URL
one comment→one storydeterministic
The same comment often appears twice. A content fingerprint (a hash) plus a canonical URL collapse duplicates, and a rule enforces that one comment can belong to only one issue, so nothing is double-counted. Any later un-linking is logged.
Quality gate: Enforced by the database — a content hash plus a one-comment-one-issue rule make double-counting structurally impossible.
3 · De-identifyguardrail+ AI planned
mask_profanity
PII redactionbefore storage · rules today
Before the comment is stored, fixed patterns strip emails, Singapore phone numbers and @handles (replaced with “[removed]”), and a database rule masks profanity. This is rules, not AI, on purpose — so redaction is predictable and can’t be talked out of.
[Gap] Redaction is best-effort fixed patterns, re-checked by a pre-publish scan before anything public. Enhance: nothing verifies the regex caught every identifier — a model-based PII second-pass or a held-out redaction test would raise the guarantee.
4 · Language + translateAI
Haiku · detect + translateen · zh · ms · ta → English
A Haiku call reads the comment, records its language (English, Chinese, Malay, Tamil or other) and returns an English translation — so a comment in any language is judged on the same footing as an English one.
[Gap] No accuracy gate — language and translation are taken as the model returns them. Enhance: sample-check translations against a small gold set, or gate on a confidence score, before they feed sentiment.
5 · RelevanceAI
screen-sg
comment-relevanceon-topic? else quarantine
The AI judges whether the comment is genuinely about our remit and about Singapore; if not, it’s set aside (quarantined, not deleted). In the automated lane a quick keyword rule drops the obvious misses first and the model makes the borderline calls.
Quality gate: Recoverable rather than preventive: quarantine is reversible, human corrections become training examples (364 so far), and a self-heal sweep un-links off-event comments. Enhance: add a pre-commit confidence gate.
6 · FacetAI
facet-mentionsdomains
The AI tags which of IMDA’s domains the comment touches (for example connectivity, media, online safety) so an issue can be sliced by area.
[Gap] No formal accuracy check today — relies on downstream human review. Enhance: a small labelled set + confidence threshold, gated like attribution.
7 · ThemeAI
theme-tagthemes
The AI labels the recurring themes in the comment, so patterns across hundreds of comments can be counted and named rather than read one by one.
Quality gate: A self-heal sweep flags suspect theme labels for human review (107 flagged). Enhance: this is after the fact — a confidence gate at tagging time would catch them before they’re used.
8 · LineAI
line-pickIMDA Lines
The AI maps the comment to IMDA’s internal “Lines” — our specific talking-points and positions — so we can see reaction against each one.
[Gap] No formal accuracy gate today. Enhance: a labelled Line set + confidence threshold.
9 · Attribute + tone + sarcasmAI
attribute-voices · Haikutarget · stance · sentiment · sarcasm · confidence
In one judgement the AI works out who the comment is aimed at (government / non-government / no-one), its stance (critical / supportive / neutral), a −1 to +1 sentiment, and whether it’s sarcastic — judged against our issue brief, so ironic “praise” is read as criticism, not support.
Quality gate: The model gate the others should copy: scored on a 149-row two-rater blind gold set (agreement 93.1%, κ0.89), each judgement carries a confidence, and no prompt change ships unless it beats the current one — two rewrites were rejected yesterday.
10 · LinkAI
same-event-judge→ one issue
Finally the comment is attached to the correct issue and told how it relates — directly about the event, indirectly, or off-event — so it counts once, in the right place.
[Gap] No pre-hand-off gate on the link decision; over-merges and off-event links are fixed after the fact by sentinels and self-heal (9 splits, 11 un-links). Enhance: a second-judge or confidence gate before linking.

Live tracking — keeping a hot issue current

Comment autosync human
curator-enabled · re-pulls new comments every ~4h for 24h, then auto-stops
For a fast-moving issue a curator switches on live tracking: the system re-pulls new comments and runs them through the same de-identify → relevance → attribute pipeline every four hours, for 24 hours, then stops automatically so it never chases a cold issue.
Quality gate: Bounded by design — a fixed ~4-hour cadence and a 24-hour auto-expiry (interval_h + expires_at), curator-enabled per issue, so tracking can’t run away or run forever.

Resilience & governance — the parts that keep it clean

Dedup
canonical-URL + one-comment-one-story
Two safeguards stop double-counting: a content fingerprint catches the identical comment captured twice, and a one-comment-one-issue rule stops the same voice inflating two different issues.
Review before commit 3,799
comment_drafts · human-checked
“Manually collected” means a curator pasted a public thread’s URL — a Reddit, Facebook, YouTube or forum discussion — and the tool scraped every comment on it. Those don’t go straight in: they’re parked in a staging list (3,799 so far, across 142 threads), each pre-scored for relevance and sentiment, and a person ticks which to keep before hitting Commit. Only then do they join the corpus.
Quality gate: This IS a gate — a human reviews every staged comment and only committed ones enter the corpus.
Off-topic → quarantine 522
flagged, retained, reversible
An off-topic comment is never deleted — it’s flagged with the reason, kept, hidden from the views, and fully reversible. 522 are quarantined right now, and the human corrections become training examples that sharpen the relevance classifier.
Quality gate: Reversible and self-improving — corrections train the relevance classifier and nothing is lost.
Self-heal 133
auto-fix or flag · reversible
Scheduled integrity sweeps that catch specific problems and either auto-fix them (reversibly, with a stored undo) or flag them for a human — 133 events so far. For example: a mis-assigned theme label flagged for review (107 of them), a newly-exposed table with security off switched back on automatically (5), off-event comments un-linked from the wrong issue (11), and two over-merged issues split apart (9).
Quality gate: This IS the cross-cutting quality net — scheduled sweeps catch and fix or flag integrity problems, reversibly.

Then surfaced

Aggregate into issue AI
summarize-stories · sentiment split · themes · verbatims
Once comments are linked to an issue, they’re rolled up into one summary — the split of positive vs negative, the main themes, representative quotes, and how much traction the issue is getting.
Quality gate: The rolled-up summary is not shown until the curator gate approves it.
Curator gate human
imda-review · nothing surfaces unreviewed
A human curator reviews and can lock each summary. Nothing reaches any audience, public or internal, until a person has approved it.
Quality gate: The human release gate — nothing reaches any audience unreviewed, and summaries can be locked.
Internal report
imda-ir · attribution · verbatims · the gap
The restricted internal report for the seven leaders: full attribution, verbatim quotes, and the gap between IMDA’s message and how the public actually received it.
Quality gate: Behind the curator lock and restricted to the seven; every figure traces to a stored source.
Public view
imda-pulse · PII-free · prepublish scan
The all-staff view: the same issues but stripped of personal data, with quotes capped, and passed through an automated pre-publish scan before anything appears.
Quality gate: Pre-publish PII scan + quote cap + curator lock before anything appears.
Situation Report — several related issues chained into one arc over time, analysed as a single combined body of public reaction. A chronicle, not a gap analysis. Click any step.
In plain terms: when one topic runs across several separate issues over weeks, this stitches them into one timeline and one combined read of how the public reacted across the whole arc — with no “did our message land” gap measurement.
1 · Select issueshuman
a person picks ≥2 related issuesthat form one arc
A person chooses two or more tracked issues that belong to the same running story, and asks for one combined report across them.
Quality gate: Human-chosen — a person decides which issues belong together before any compute runs.
2 · Measured skeletons
build_ir_sections · per issuesplit · media · key msgs — from the DB, not a model
For each issue the system pulls the already-measured figures straight from the database — the sentiment split, the media outlets, the key messages. No model is involved in this step.
Quality gate: Deterministic and reused — figures come straight from the database skeleton, so they match the single-issue report exactly.
3 · Combine corpus
union all mentions
combined split · official chaindeterministic
All the comments and articles from those issues are pooled into one body, the sentiment splits are added up, and the official statements are lined up in date order.
Quality gate: Structural — union, split-sum and date-ordering are code, so the combined numbers are reproducible.
4 · NarrativeAI
snapshot · summary
timeline · watch-outsSonnet · measured-first
A Sonnet model writes the story layer over that combined material — a headline verdict, a summary, a dated timeline of the arc, and forward-looking risks — told strictly not to change any measured figure.
Quality gate: Constrained generation — the model is handed the measured skeleton and told it may not change any figure; JSON is hardened with a repair retry.
5 · Sentiment (parallel)AI
valence · emotions
comment-function · understandingSonnet
A second Sonnet call, run at the same time, does the deeper sentiment read: emotions, why people posted, whether they understood the policy, and the misconceptions going around.
Quality gate: Same constraint, run in parallel — grounded in the pooled public comments only.
6 · Ground & verifyguardrail
every quote → a real comment
calibration · no-advice · completenessunsourced dropped
Before saving, every quote is checked back to a real stored comment (anything unsourced is thrown out), the summary’s tone is checked against the measured split, recommendation language is flagged, and an incomplete report is refused.
Quality gate: This IS the gate — unsourced quotes dropped and counted, tone calibration-checked against the measured split, advice language flagged, and a report missing its spine fails and is not saved.
7 · Freeze report
content-hash · sources table
spend loggedfinal, traceable
The finished report is frozen with a content fingerprint and a table linking every quote to its source, and its cost is logged.
Quality gate: Frozen with a content hash and a per-quote sources table, so every line is traceable after the fact.
8 · Reviewed & surfacedhuman
curator review + lock
imda-ir · the sevenpublic-safe view where cleared
Nothing goes out unread. A curator reviews the frozen report, locks it, then publishes it to its audience on the access-tiered sites — imda-ir for the seven, and the public-safe, PII-free view where cleared. Every figure stays traceable to a stored source.
Quality gate: Nothing surfaces unreviewed — a curator lock gates publication, and every figure traces to a stored source.

Guardrails on every report

Measured-first
the model may not change any figure computed from the database
The narrative sits on top of database-computed numbers; the model is not allowed to move them.
Grounding
every quote maps to a stored comment; unsourced is dropped and counted
Nothing quoted can be invented — each quote must point to a real captured comment.
Calibration & no-advice
summary tone checked vs the measured split; recommendation language flagged
The written “lean” is compared to the measured split, and any “should/recommend” wording is caught, so the tone can’t drift from the data.
Budget + kill-switch
daily spend cap + kill switch; an incomplete report fails and is not saved
A daily spend cap and a kill switch bound every run, and a report missing its spine is not saved at all.
Research Report — starts from a question, not an existing issue. A plan → critique → gather → verify agentic loop. This is the clearest multi-agent example. Click any step.
In plain terms: you ask a question; the system checks it’s in IMDA’s remit, drafts a plan and picks the relevant issues, a second agent attacks that plan for gaps, you confirm, then it gathers evidence from the open web and writes a checked report — and stops itself if the evidence is too thin.
1 · Sharpen goalAI
rough goal → sharp question
remit gate · 5 anglesHaiku
You type a rough question. A Haiku model rewrites it into one sharp “how is the public reacting to…” question, checks it sits inside IMDA’s remit using the live topic list, and offers five alternative angles. Out-of-remit questions are turned into the nearest in-remit reframe.
Quality gate: Remit-gated against the live taxonomy up front — out-of-remit goals are refused, not answered.
2 · Plan & scopeAI
gd-plan · reason-first · Opus
gd-scope · Scout · Sonnetdecompose → construct → auto-select corpus
Two planning agents set the research up before any evidence is gathered: a reason-first planner (Opus) breaks the question into sub-questions and says which need web vs tracked data, and the “Scout” (Sonnet) builds a search construct, ranks the whole corpus and auto-selects the most on-topic issues.
Quality gate: The Scout applies a relevance floor and sanitises its own search regex so one spurious keyword hit can’t pull an off-topic issue into scope; the planner declares up front which sub-questions will be thin on evidence.
3 · Contract + selectAI
restate goal as a contract
select ONLY real issuesHaiku · no invention
A Haiku proposer restates the goal as a written contract (objective, what’s in and out of scope, success criteria) and selects only issues from the shortlist — it is forbidden to invent an issue or a tag.
[Gap] The proposer can still over- or under-select — which is exactly why the next two steps exist. On its own it is not a gate.
4 · Ground-checkguardrail
every id in the pool
every cited tag realcode, before the critic
Before spending anything on the critic, code checks every selected issue actually exists in the shortlist and every tag it cited is really on that issue.
Quality gate: Hard code gate before any spend — invented ids or fake tags fail here, cheaply, before the critic runs.
5 · Adversarial criticAI
drift · boundary · omission scan
up to 3 refine loopsSonnet
A Sonnet critic then attacks the selection — looking for drift, out-of-scope picks, and, importantly, issues that were wrongly left out — and sends it back to be redone, up to three times.
Quality gate: The adversarial gate — it must return “pass” with zero grounding defects, and it scans for omissions too; up to three refine loops.
6 · Human scope confirmhuman
routes single / saga
confirm before spenduncertainty-stop
The scope routes to a single-issue or a chained report, and a person confirms it before any expensive work runs. If the critic couldn’t pass, it stops for a human instead of proceeding.
Quality gate: Human gate — a person confirms scope, and the loop refuses to auto-proceed when the critic didn’t pass (uncertainty-stop).
7 · Gather evidenceAI
gd-web · gd-forum · gd-apifyopen web + forums
Now it goes and finds evidence — searching the open web, deep-reading forums, and capturing pages — to answer the question beyond what was already stored.
Quality gate: Bounded by spend caps; whatever it finds still has to clear the coverage and faithfulness gates below.
8 · AnalyseAI
gd-analyseOpus
An Opus model analyses all the gathered evidence against the question.
Quality gate: Not final — the analysis feeds the coverage and guardian gates before anything is written.
9 · Coverage gateguardrail
enough evidence?
else “insufficient”gd-cvgate
A gate asks whether there is actually enough evidence to answer; if not, it returns “insufficient evidence” rather than a confident-sounding guess.
Quality gate: This IS a gate — returns “insufficient evidence” and stops rather than letting a thin answer through.
10 · GuardianAI
faithfulness gate
claims ↔ evidencegd-guardian · Opus
An Opus guardian checks the draft is faithful — every claim has to be backed by the evidence gathered, not by the model’s own knowledge.
Quality gate: The faithfulness gate — every claim must be backed by gathered evidence; failures go to remediation.
11 · RemediateAI
fix gaps · loop backgd-remediate
Where the guardian finds gaps, a remediation step goes back to fix them and the loop repeats.
Quality gate: Closes the loop — gaps the guardian found are fixed and re-checked before the report is written.
12 · Write reportAI
gd-reportOpus · grounded
Finally an Opus model writes the grounded report.
Quality gate: Only reached after coverage + guardian pass; the written report is grounded in the verified evidence.
13 · Reviewed & surfacedhuman
curator review + lock
imda-ir · the sevenpublic-safe view where cleared
Nothing goes out unread. A curator reviews the finished report, locks it, then publishes it to its audience on the access-tiered sites — imda-ir for the seven, and the public-safe, PII-free view where cleared. Every figure stays traceable to a stored source.
Quality gate: Nothing surfaces unreviewed — a curator lock gates publication, and every figure traces to a stored source.

Why this is trustworthy

Remit gate
out-of-remit questions refused up front, with in-remit reframes offered
A question outside IMDA’s remit is refused at the start, with in-remit reframes offered instead of a forced answer.
Quality gate: Refuses out-of-remit work at the front door.
No fabrication
the proposer may only pick real tracked issues; claims trace to captured evidence
The planner can only choose real tracked issues, and every claim in the report traces to evidence that was actually gathered.
Quality gate: Real-issues-only selection plus evidence-bound claims.
Uncertainty-stop
if the critic can’t pass or evidence is thin, it halts for a human rather than guessing
When the critic can’t pass or the evidence is too thin, the loop halts for a person — it does not guess to finish.
Quality gate: Halts for a human rather than guessing.
Budget + human confirm
daily cap + kill switch; a human confirms scope before the expensive gather runs
A daily spend cap and a kill switch bound the run, and a human confirms the scope before the costly evidence-gathering starts.
Quality gate: Spend-capped with a human scope confirm before costly work.
Every LLM function in the system, grouped by which engine it serves. Model-per-task routing — the right model for each job.
Agent = a model that calls tools in a loop, deciding each next step from what it sees, until it judges the task done and returns a result. By that test the system has two true agents — the Research engine and the autonomous Discovery loop (tagged AGENT below). The Issue tracker and Situation report are fixed pipelines (cognitive architectures), not agents. Everything else is a component those are built from: single-purpose LLM steps, gates and writers, plus deterministic tools — with the heavy writing and critique on the strongest model (Opus) and high-volume tagging on the cheap, fast one (Haiku).
Agent / functionTypeWhat it doesModelStatus
Eval-gated. The attribution/sentiment agent (attribute-voices) is scored on a 149-row two-rater blind gold set (agreement 93.1%, κ=0.89). Yesterday two prompt rewrites were built, measured, and rejected for scoring worse — then rolled back. No prompt change ships unless it beats the current one.

Models follow the documented per-task routing; the eval-gated, Sonnet and Haiku assignments were verified in the function source. “—” = a deterministic tool with no model of its own.