Costa Rica PMESII-PT / ASCOPE OSINT Collection System - Design Sketch
Working designation: GUANACASTE WATCH (GW). Pre-model architecture sketch for discussion; not a cell, not a collection map. On design approval this formalizes as a d03 platform cell (hardware + software stack,
mbse new) plus a d01 system deliverable (the sellable monitoring service it powers), with seams declared in the manifest. Underscore-prefixed so verify’s COLL01 naming rule does not apply.Services this system delivers: OSINT-036 Continuous Country Risk Monitoring and OSINT-030 Periodic Geopolitical Briefing (both scoped to Costa Rica), the OSINT-053 daily intelligence brief, and T0 flash alerts under the OSINT-064 production-tier clocks. It is the collection backbone that SYS-008 v2 (protective-intelligence stream, roadmap sub-project #6) consumes. Client anchor: real-estate development program in Palmira, Carrillo canton, Guanacaste province (primary project: Parque Tempisque, plus code HC54+F2).
1. Purpose and scope
One sentence: a self-hosted array of Beelink mini computers that continuously scrapes Costa Rican news, legislation, government publications, social media, Telegram, and economic/environmental feeds, normalizes and enriches every item, tags it against the PMESII-PT x ASCOPE grid, scores it against client watch items (L x I), and emits decision-support products: flash alerts within one hour, a daily intelligence brief, and periodic risk summaries.
Problem-space boundary: the system automates collection, processing, and first-pass exploitation. Analysis and judgment remain human. Every automated product passes the OSINT-064 quality gates (QG1 source/grade check, QG2 analytic review) before client release; the system drafts, the analyst signs.
1.1 Areas of interest (AOI rings)
Every ingested item is geotagged to the tightest ring it resolves to. Ring weighting drives alert priority: the same event class scores higher the closer the ring.
+---------------------------------------------------------------+
| R5 REGIONAL: Nicaragua border dynamics, CAFTA region, |
| transnational crime corridors, US policy toward CR |
| +--------------------------------------------------------+ |
| | R4 NATIONAL: Costa Rica - legislation, executive, | |
| | BCCR/macro, national security posture, elections | |
| | +------------------------------------------------+ | |
| | | R3 PROVINCE: Guanacaste - water policy, | | |
| | | tourism economy, ZMT enforcement, | | |
| | | coastal narco activity, Liberia airport | | |
| | | +----------------------------------------+ | | |
| | | | R2 CANTON: Carrillo + neighbors | | | |
| | | | (Santa Cruz, Liberia, Filadelfia) | | | |
| | | | municipal acts, permits, crime | | | |
| | | | +--------------------------------+ | | | |
| | | | | R1 SITE: Palmira district / | | | | |
| | | | | Parque Tempisque project | | | | |
| | | | | (HC54+F2) - direct mentions, | | | | |
| | | | | adjacent land, ASADA, road | | | | |
| | | | +--------------------------------+ | | | |
| | | +----------------------------------------+ | | |
| | +------------------------------------------------+ | |
| +--------------------------------------------------------+ |
+---------------------------------------------------------------+
2. Hardware architecture
Design rule carried over from the loadout work (SYS-003/004/009/010, BIZ-013): a startup-now tier that runs the whole mission on minimum capital, and a growth tier behind named triggers. All nodes are Beelink mini PCs on a single bench/shelf at the TOC; nothing needs to be physically in Costa Rica. Collection reaches the country over the wire through managed egress.
2.1 Node roles
| Node | Name | Class (startup) | RAM / storage | Role |
|---|---|---|---|---|
| N1 | GW-COLLECT | Intel N100/N150 class (Beelink EQ-series) | 16 GB / 500 GB NVMe | Scraper array: all ingest containers, headless browsers, RSS pollers, Telegram client, change-detection watchers |
| N2 | GW-CORE | Ryzen 7/9 8-core class (Beelink SER-series) | 64 GB / 2 TB NVMe + 4 TB SATA SSD | Queue, PostgreSQL, vector DB, search index, NLP enrichment workers, brief generator, dashboard, Telegram bot |
| N3 | GW-INFER (growth) | Ryzen AI / GPU-capable class (Beelink GTi-series) | 64-128 GB | Local LLM inference: summarization, PMESII-PT classification, translation at volume; removes per-token API dependence |
| N4 | GW-COLLECT-2 (growth) | Same as N1 | 16 GB / 500 GB | Second scraper node: egress diversity, hot spare, expansion to a second country |
Growth triggers, named per the BIZ-013 convention: stand up N3 when monthly LLM API spend exceeds the amortized node cost for two consecutive months, or when a client contract prohibits third-party API processing. Stand up N4 when lane count exceeds N1 headroom (sustained CPU > 70 percent), or when a second country AOI is sold.
Startup tier is therefore two boxes. N100-class handles scraping easily (scraping is I/O-bound); the 8-core box carries everything stateful. No sourcing/pricing in this sketch by design; BOM pricing follows the SYS-cell pattern once the design is approved.
2.2 Physical and network topology
INTERNET
|
+-----------+-----------+
| |
[ISP primary] [Starlink Mini] <- SYS-003 asset,
| (failover WAN) already owned
| |
+---+-----------------------+---+
| GL.iNet router / firewall | <- SYS-004 family
| VLAN10 mgmt | VLAN20 scrape |
+---+---------------------+------+
| |
[gigabit switch] (Wi-Fi mgmt only)
| | |
+-----+ +---+---+ +------+
| N1 | | N2 | | N3/N4| <- growth slots
| GW- | | GW- | | (emp-|
| COL | | CORE | | ty) |
+--+--+ +---+---+ +------+
| |
| +--[USB/SATA: 4TB cold archive, weekly rotate]
|
+--[egress: WireGuard tunnels to proxy providers, per-lane]
|
+-----------+------------------+
| | |
[residential [datacenter [direct egress:
rotating proxy pool RSS + official
proxies: general web .go.cr sources,
X, Facebook, scraping] no proxy needed]
Telegram]
All nodes: Tailscale mesh
[UPS 600VA+: router, switch, N1, N2] for admin from anywhere;
no inbound ports open.
Connectivity decisions embedded in the diagram:
- Two WANs. Primary ISP plus the already-owned Starlink Mini (SYS-003) as failover so continuous-monitoring SLA (OSINT-036 section 5) survives an ISP outage.
- VLAN separation. Management traffic never shares a segment with scrape egress. Scraper containers on N1 can only reach the internet through the tunnel interfaces; a proxy failure fails closed, not open into direct egress that burns the TOC’s IP.
- Three egress classes. Official government sources (.go.cr, gazette, central bank) are public documents fetched politely and directly with an honest user agent and rate limits. General news scraping rides datacenter proxies. Platform collection (X, Facebook, Telegram) rides residential rotating proxies with one isolated identity per platform, never cross-contaminated.
- Zero inbound surface. Tailscale mesh for administration and the analyst dashboard; the firewall accepts no inbound connections.
2.3 Runtime layout per node
N1 GW-COLLECT (Docker Compose) N2 GW-CORE (Docker Compose)
+--------------------------------+ +--------------------------------+
| scheduler (Prefect worker) | | prefect-server (orchestrator) |
| rss-poller (~40 feeds) | | redis (queue + cache) |
| gazette-watch (La Gaceta) | ----> | postgres (system of record)|
| legis-watch (Asamblea) | queue | qdrant (vector store) |
| regulator-watch (SETENA etc) | over | meilisearch (full-text) |
| news-spiders (Scrapy) | redis | enrich-workers x4: |
| browser-pool (Playwright) | ----> | lang-detect | translate |
| telegram-client (Telethon) | | NER (es) | geoparser |
| x-collector (per lane) | | dedup | embedder |
| fb-page-collector | | classifier (PMESII/ASCOPE) |
| reddit-poller | | scorer (LxI vs watch) |
| econ-feeds (BCCR, INEC) | | brief-builder (0500 CST cron) |
| geo-env-feeds (IMN, OVSI- | | alert-bot (Telegram out) |
| CORI, CNE) | | dashboard (analyst UI) |
| health-exporter | | grafana/uptime (self-monitor) |
+--------------------------------+ +--------------------------------+
stateless: any container can be stateful: nightly pg_dump +
rebuilt from git + config repo restic to offsite + cold disk
3. System data flow
flowchart LR subgraph SRC["Costa Rica source landscape"] S1["Official / legal<br/>La Gaceta, Asamblea SIL,<br/>SCIJ, SETENA, MINAE,<br/>municipal acts"] S2["News media<br/>national + Guanacaste<br/>local outlets"] S3["Platforms<br/>X, Telegram,<br/>Facebook pages, Reddit"] S4["Econ / env feeds<br/>BCCR, INEC, IMN,<br/>OVSICORI, CNE"] end subgraph N1["N1 GW-COLLECT - ingest lanes"] L1["watchers + spiders<br/>(cadence per lane)"] L2["browser pool<br/>(JS-heavy targets)"] L3["platform clients<br/>(isolated identities)"] end Q[("Redis queue<br/>raw items")] subgraph N2["N2 GW-CORE - processing"] P1["normalize<br/>one item schema"] P2["dedup<br/>URL + MinHash"] P3["enrich<br/>lang, translate es-en,<br/>NER, geoparse to AOI ring"] P4["classify<br/>PMESII-PT variables +<br/>ASCOPE entity roles"] P5["score<br/>L x I vs watch items,<br/>tripwire evaluation"] end subgraph STORE["storage"] D1[("Postgres<br/>items + entities + events")] D2[("Qdrant<br/>embeddings")] D3[("Meilisearch<br/>full text")] D4[("evidence archive<br/>raw capture + hash")] end subgraph OUT["products (human gate QG1/QG2 before release)"] O1["T0 flash alert<br/>Telegram, <= 1h clock"] O2["daily intel brief<br/>0600 CST, OSINT-053 format"] O3["weekly geopolitical summary<br/>OSINT-030 cadence"] O4["continuous risk register<br/>OSINT-036 watch-item state"] O5["analyst dashboard<br/>search, timeline, map"] end S1 --> L1 S2 --> L1 S2 --> L2 S3 --> L3 S4 --> L1 L1 --> Q L2 --> Q L3 --> Q Q --> P1 --> P2 --> P3 --> P4 --> P5 P1 -.raw capture.-> D4 P5 --> D1 P3 --> D2 P3 --> D3 P5 -->|"tripwire fired<br/>LxI >= 16"| O1 D1 --> O2 D1 --> O3 D1 --> O4 D1 --> O5 D2 --> O5 D3 --> O5
Item lifecycle contract: every item that survives dedup carries, at minimum: source id (graded A-F x 1-6 per the Annex A register), fetch timestamp, raw-capture hash (evidence archive), language, English rendering, extracted entities with ASCOPE role, one or more PMESII-PT variables, AOI ring, L x I score against any watch item it touches, and routing disposition. That is the schema; everything downstream is a view over it.
4. Collection lanes (Costa Rica source map)
Cadences follow the OSINT-036 00b register: continuous, hourly, daily, weekly. Reliability grades are seeded here and maintained in the service’s Annex A source register.
| Lane | Representative sources | Method | Cadence | PMESII-PT |
|---|---|---|---|---|
| Official gazette | La Gaceta (Imprenta Nacional daily PDF) | PDF fetch + OCR + diff | Daily 0700 | P, E, I |
| Legislation | Asamblea Legislativa bill tracker (SIL), committee agendas, votes | Scrape + change detection | Daily | P |
| Jurisprudence / decrees | SCIJ (PGR consolidated law), executive decrees | Change detection | Daily | P |
| Environmental permits | SETENA viability resolutions (D1/D2 filings), MINAE resolutions | Scrape + keyword filter (Carrillo, Guanacaste, named projects) | Daily | P, PE |
| Water | AyA, SENARA, ASADA notices, drought declarations | Scrape + watch | Weekly + event | I, PE |
| Municipal | Municipalidad de Carrillo session acts, permits; Santa Cruz, Liberia as R2 neighbors | PDF/portal watch | Weekly | P, I |
| National news | La Nacion, CRHoy, Teletica, Repretel, Diario Extra, La Republica, Semanario Universidad | RSS + spiders | Continuous (15 min poll) | all |
| English / expat press | Tico Times, Q Costa Rica | RSS | Hourly | all |
| Guanacaste local | La Voz de Guanacaste, regional outlets, canton Facebook news pages | RSS + page scrape | Hourly | all, R2/R3 weighted |
| Security / crime | OIJ statistics and press, MSP releases, Poder Judicial | Scrape | Daily | M (see 5.1) |
| Economic | BCCR (FX, policy rate, EMBI), INEC releases, ICT tourism stats, Hacienda | API/CSV where offered, else scrape | Daily | E |
| Physical environment | IMN weather, OVSICORI + RSN (seismic/volcanic), CNE alerts and emergency declarations | Feed + scrape | Continuous | PE |
| X | Curated account lists: officials, ministries, deputies, journalists, OIJ/MSP, Guanacaste figures; keyword queries | Platform collector via isolated identity | Continuous (per-list poll) | P, S, I |
| Telegram | CR news channels, regional channels, monitored public groups | Telethon client, join-and-listen | Continuous (push) | S, I |
| Facebook public pages | Community pages for Carrillo / Coco / Filadelfia / Sardinal corridor, municipal pages | Page scrape, low cadence | 2-4x daily | S |
| Reddit / forums | r/costarica, expat forums | API poll | Daily | S |
| Sanctions / designations | OFAC SDN delta, EU/UK/UN lists (CR-linked entities) | List diff | Daily | E, P |
Platform reality check for Costa Rica: unlike Eastern Europe or MENA, Telegram is a thin lane here. Costa Rican civil society runs on WhatsApp and Facebook. Telegram gets built because it is cheap to run and matters regionally (Nicaragua coverage), but the social-signal weight sits in Facebook public pages, X, and local news comment ecosystems. WhatsApp groups are collected only where lawfully joinable public groups exist; no closed group penetration.
5. PMESII-PT x ASCOPE tagging model
Two independent axes on every item. PMESII-PT answers “what kind of operational-environment change is this”; ASCOPE answers “what concrete civil things does it touch.” The classifier assigns one or more PMESII-PT variables to the document, and the NER stage types each extracted entity into an ASCOPE role. The cross product is the collection grid the analyst queries.
A:Areas S:Structures C:Capabil. O:Organiz. P:People E:Events
+------------+------------+------------+------------+------------+------------+
P Political | electoral | assembly, | governance | parties, | president, | elections, |
| districts, | courts, | capacity, | ministries,| deputies, | sessions, |
| cantons | munis | permits | TSE | mayors | rulings |
+------------+------------+------------+------------+------------+------------+
M Military* | patrol | police | LE reach, | Fuerza | ministers, | operations,|
| zones, | posts, | coast | Publica, | OIJ leads | seizures, |
| corridors | ports | guard cap. | OIJ, SNG | | incidents |
+------------+------------+------------+------------+------------+------------+
E Economic | trade | banks, | fiscal | BCCR, | investors, | rate moves,|
| zones, | markets, | space, FX | Hacienda, | developers | strikes, |
| tourism | hotels | stability | chambers | | ratings |
+------------+------------+------------+------------+------------+------------+
S Social | communities| schools, | social | unions, | leaders, | protests, |
| Palmira, | churches, | cohesion, | ASADAs, | activists, | festivals, |
| Sardinal | clinics | employment | NGOs | figures | blockades |
+------------+------------+------------+------------+------------+------------+
I Info | media | telecom | press | outlets, | journalists| campaigns, |
| markets | infra | freedom, | SUTEL | influencers| disinfo |
| | | connectiv. | | | waves |
+------------+------------+------------+------------+------------+------------+
I Infra | grids, | roads | water/ | AyA, ICE, | operators | outages, |
| corridors | (Ruta 21), | power | SENARA, | | closures, |
| | Liberia | capacity | MOPT | | projects |
| | airport | | | | |
+------------+------------+------------+------------+------------+------------+
PE Physical | watersheds,| dams, | aquifer | IMN, CNE, | - | storms, |
Environ. | dry | wells | yield, | OVSICORI, | | quakes, |
| corridor | | drought | SINAC | | droughts |
+------------+------------+------------+------------+------------+------------+
T Time | - | - | - | - | - | electoral |
| | | | | | calendar, |
| | | | | | seasons, |
| | | | | | deadlines |
+------------+------------+------------+------------+------------+------------+
5.1 Costa Rica adaptation of M
Costa Rica abolished its standing army in 1948. The M variable is remapped to the security apparatus and the pressures on it: Fuerza Publica (national police), OIJ (judicial investigation), Servicio Nacional de Guardacostas, DIS (intelligence directorate), and the transnational-crime environment (narcotics transshipment through Guanacaste and Pacific coast corridors, which is the dominant hard-security driver for the client AOI). Border posture with Nicaragua is tracked under M at ring R5.
5.2 T for this client
Time is not a residual bucket here; it drives the brief calendar: a new administration seated May 2026 (first-legislative-session dynamics through 2026), municipal elections February 2028, dry season December-April (water-stress and fire-risk window), rainy season May-November (flood/road risk), Annexation Day July 25 (Guanacaste civic mobilization date), and the client’s own construction and permitting milestones registered as watch items.
6. Scoring, tripwires, and product routing
The watch-item mechanics come straight from the OSINT-030/036 collection maps (section 00b): every watch item carries an observable indicator, a tripwire threshold, an L x I score, a severity tier, and an escalation route. This system makes those rows executable: watch items are rules the scorer evaluates on every enriched item.
| L x I band | Tier | System action | Clock (OSINT-064) |
|---|---|---|---|
| 21-25 | Critical | Immediate Telegram alert to TL + client channel, phone follow-up per SLA | T0, ⇐ 1h |
| 16-20 | High | Telegram alert to analyst + TL | T0, ⇐ 1h |
| 11-15 | Elevated | Queued to top of next daily brief, dashboard flag | Daily |
| 6-10 | Moderate | Daily brief inclusion | Daily |
| 1-5 | Low | Archive + trend counters only | Weekly rollup |
sequenceDiagram autonumber participant SRC as Source lanes (N1) participant PIPE as Enrich + classify (N2) participant SCORE as Scorer (watch rules) participant AN as Analyst (QG1/QG2) participant BOT as Telegram bot (SYS-006) participant CL as Client / TL Note over SRC,CL: Flash path (T0) - continuous SRC->>PIPE: raw item PIPE->>SCORE: tagged item (PMESII/ASCOPE, AOI ring) SCORE->>SCORE: evaluate watch rules alt L x I >= 16 (tripwire fired) SCORE->>AN: draft flash alert + evidence link AN->>AN: QG1 source check (minutes) AN->>BOT: approve BOT->>CL: flash alert (inside 1h clock) else below threshold SCORE->>SCORE: store, count toward trends end Note over SRC,CL: Daily brief path - battle rhythm SCORE->>PIPE: 0500 CST - brief-builder queries last 24h PIPE->>AN: draft brief (OSINT-053 sections, cited items,<br/>watch-item status board, ICD 203 language) AN->>AN: QG2 analytic review, edit judgments AN->>BOT: release BOT->>CL: daily intel brief 0600 CST Note over AN: analyst feedback (missed/noisy rules)<br/>tunes classifier and watch thresholds
The daily brief is assembled, never auto-sent: the builder drafts the OSINT-053 structure (BLUF, watch-item status board, new events by PMESII-PT variable, AOI-ring activity, source-grade annex) and the analyst owns the judgments. ICD 203 likelihood and confidence language is inserted by the analyst, not the machine.
6.1 Seed watch items (client-specific, first configuration)
These are the rows that make the system immediately useful to the Parque Tempisque engagement, drawn from what actually moves Guanacaste real-estate risk:
- Water: ASADA capacity or concession changes in Palmira/Sardinal/Carrillo; SENARA aquifer studies; drought or rationing declarations (R1-R2, I/PE).
- Permitting: SETENA resolutions or appeals touching Carrillo canton projects; INVU or municipal zoning-plan changes (R2, P).
- Land tenure: precarismo (organized land invasion) reports in Guanacaste; ZMT (maritime zone, Ley 6043) enforcement or reform (R2-R3, P/S).
- Mobility: Ruta 21 blockades or closures; Liberia (LIR) airport disruptions (R2-R3, I).
- Security: OIJ-reported crime trend breaks in the Filadelfia-Coco-Sardinal corridor; narco-related incidents on the Guanacaste coast (R2-R3, M).
- Labor/social: construction-sector strikes or municipal labor actions; community opposition organizing against coastal development (R2-R3, S).
- National: tax or foreign-investment law changes affecting real estate; colon FX regime shifts; new-administration policy toward coastal development and residency/investor rules (R4, P/E).
- Physical: seismic events > M5 within 100 km, named-storm tracks, fire season alerts for the dry corridor (R1-R3, PE).
7. Software stack summary
| Layer | Component (class, not brand-locked) | Node |
|---|---|---|
| Orchestration | Prefect (flows, retries, lane schedules) | N2 server, N1 worker |
| Scraping | Scrapy spiders (static), Playwright pool (JS), RSS poller, change-detection watchers | N1 |
| Platform clients | Telethon (Telegram), per-platform collectors behind isolated identities | N1 |
| Queue/cache | Redis | N2 |
| System of record | PostgreSQL (items, entities, events, watch rules, audit) | N2 |
| Vector / search | Qdrant + Meilisearch | N2 |
| NLP enrichment | fastText lang-id, local NMT es-en, spaCy es NER, mordecai-style geoparser, MinHash dedup, bge-class embedder | N2 |
| Classification | PMESII-PT multi-label + ASCOPE role typing: LLM API at startup, distilled to local model on N3 at growth | N2 (N3 growth) |
| Products | brief-builder (templated to OSINT-053), alert bot (Telegram, SYS-006 channel discipline) | N2 |
| Analyst UI | dashboard: search, entity pages, AOI map, watch-item board, timeline | N2 |
| Ops | Docker Compose per node, git-managed config, Tailscale, restic offsite backup, Grafana + uptime alerts (the system watches itself) | all |
8. Model integration path (when design is approved)
mbse new system --domain d03 --title "OSINT collection backbone" ...- the platform cell (this hardware + stack), sibling to SYS-008; SYS-008 v2 then consumes it rather than reimplementing collection.mbse new system --domain d01 --title "Country OSINT monitoring system - Costa Rica" ...- the service-facing deliverable that binds the platform to OSINT-030/036/053 for a named AOI, plus its collection-map mirror in this directory (which retires this sketch).- Seams: d03 provides a collection-backbone artifact consumed by d01; existing ART-daily-brief and ART-threat-alert-stream flows gain this system as upstream. cc01 Costa Rica region package (roadmap #3) supplies ART-region-package configuration (AOI rings, source register seed).
- BOM pricing pass on the d03 cell per the SYS-003/004/009/010 convention; BIZ-013 roll-up gains the node capital and proxy/API recurring lines.
9. Assumptions and risks
Assumptions, each with the risk if false:
- A1: Two-node startup tier carries full CR lane load. If false, growth trigger fires early and N4 capital moves forward.
- A2: Client accepts cloud LLM API for classification at startup (no contractual data-processing restriction). If false, N3 must be startup capital, not growth.
- A3: Public .go.cr sources remain scrape-tolerant at polite rates. If false, lanes degrade to manual-assisted collection and cadence slips.
| ID | Risk | L | I | Mitigation |
|---|---|---|---|---|
| R1 | Platform countermeasures (X, Facebook) break collectors or burn identities; coverage gap on the social lane | 4 | 3 | Identity isolation, residential proxies, conservative rates, lane-health alerting, accept degraded cadence over identity loss |
| R2 | Legal/ToS exposure: platform terms prohibit scraping; CR Law 8968 governs personal-data processing | 3 | 3 | Public-data-only doctrine, no closed-group penetration, retention schedule per service annex B, counsel review of platform lanes before client sale |
| R3 | La Gaceta OCR quality misses legal notices (image PDFs, layout drift) | 3 | 3 | Dual pass: OCR plus keyword search on the gazette’s own portal; weekly manual spot check as QG1 sample |
| R4 | Spanish-language NLP (NER, classification) underperforms; mis-tagged items suppress alerts | 3 | 4 | Analyst feedback loop tunes rules; recall-biased tripwires (over-alert, human filters); monthly precision/recall review |
| R5 | Single-site dependence: TOC power/ISP outage stalls a continuous-SLA service | 2 | 4 | Dual WAN (Starlink failover), UPS, offsite backup; growth option: N4 at second site |
| R6 | Alert fatigue: noisy watch rules erode client trust in T0 channel | 3 | 4 | Severity discipline (only >= 16 pages the client), weekly rule-noise review in service-health report |
10. Open decisions for discussion
- Formalization split: d03 platform + d01 service (recommended, section 8) versus a single d01 system cell. The split matches the SYS-008/OSINT-054 precedent and lets the platform serve future countries.
- Startup node count: two boxes (recommended) versus three if A2 fails or local inference is wanted on day one.
- X acquisition method: paid API tier versus scrape-only via managed identities: cost certainty versus fragility (R1).
- Brief delivery channel: Telegram-only at startup (SYS-006 discipline) versus adding formatted PDF/email for the client principal.
END OF DESIGN SKETCH