<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Victor Laybats</title>
    <description>The latest articles on DEV Community by Victor Laybats (@victorlaybats).</description>
    <link>https://dev.to/victorlaybats</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4202952%2F9baaff53-d2d3-4618-9409-9dc1abc79657.jpg</url>
      <title>DEV Community: Victor Laybats</title>
      <link>https://dev.to/victorlaybats</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/victorlaybats"/>
    <language>en</language>
    <item>
      <title>30 execution controls for algorithmic trading systems, each tied to evidence and a failure mode</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Sat, 24 Oct 2026 06:43:44 +0000</pubDate>
      <link>https://dev.to/victorlaybats/30-execution-controls-for-algorithmic-trading-systems-each-tied-to-evidence-and-a-failure-mode-377f</link>
      <guid>https://dev.to/victorlaybats/30-execution-controls-for-algorithmic-trading-systems-each-tied-to-evidence-and-a-failure-mode-377f</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/" rel="noopener noreferrer"&gt;IMRYN Research&lt;/a&gt;, 14 August 2026, by Victor Laybats.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A practical register for reviewing systematic execution infrastructure without treating a policy statement, dashboard or successful run as proof that a control works: &lt;strong&gt;30 explicit control checks in 6 review categories, 17 suggested critical priorities.&lt;/strong&gt; Every row pairs a control objective with evidence an evaluator could inspect and a concrete failure the control is intended to surface. The register deliberately avoids pass or fail claims about any implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Governance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GOV-01&lt;/td&gt;
&lt;td&gt;Named accountable owner&lt;/td&gt;
&lt;td&gt;An approved owner and deputy are recorded for each algorithm.&lt;/td&gt;
&lt;td&gt;No accountable decision-maker during a change or incident.&lt;/td&gt;
&lt;td&gt;Before deployment&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOV-02&lt;/td&gt;
&lt;td&gt;Bounded operating scope&lt;/td&gt;
&lt;td&gt;Permitted accounts, instruments, venues, sessions and order types are versioned.&lt;/td&gt;
&lt;td&gt;The algorithm acts outside its reviewed operating envelope.&lt;/td&gt;
&lt;td&gt;Before deployment&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOV-03&lt;/td&gt;
&lt;td&gt;Versioned algorithm inventory&lt;/td&gt;
&lt;td&gt;Each active algorithm has an identifier, purpose, owner, version and deployment state.&lt;/td&gt;
&lt;td&gt;Operators cannot establish which logic is live.&lt;/td&gt;
&lt;td&gt;Continuous&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOV-04&lt;/td&gt;
&lt;td&gt;Material-change policy&lt;/td&gt;
&lt;td&gt;The team defines, detects, reviews and approves material changes before release.&lt;/td&gt;
&lt;td&gt;A significant change bypasses the intended review path.&lt;/td&gt;
&lt;td&gt;Change&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOV-05&lt;/td&gt;
&lt;td&gt;Independent challenge&lt;/td&gt;
&lt;td&gt;Risk, compliance or another independent reviewer can challenge release evidence.&lt;/td&gt;
&lt;td&gt;Development assumptions remain untested by a separate function.&lt;/td&gt;
&lt;td&gt;Change&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Data integrity
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DATA-01&lt;/td&gt;
&lt;td&gt;Authoritative source map&lt;/td&gt;
&lt;td&gt;Every decision input names its authoritative source, unit, timezone and fallback.&lt;/td&gt;
&lt;td&gt;Conflicting sources silently drive different decisions.&lt;/td&gt;
&lt;td&gt;Before deployment&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA-02&lt;/td&gt;
&lt;td&gt;Freshness boundary&lt;/td&gt;
&lt;td&gt;A maximum acceptable age is defined and visible for each time-sensitive input.&lt;/td&gt;
&lt;td&gt;Stale data is accepted as current.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA-03&lt;/td&gt;
&lt;td&gt;Schema and range validation&lt;/td&gt;
&lt;td&gt;Malformed, missing and implausible values fail explicit validation.&lt;/td&gt;
&lt;td&gt;Bad input reaches decision logic without a controlled stop.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA-04&lt;/td&gt;
&lt;td&gt;Clock synchronization check&lt;/td&gt;
&lt;td&gt;Clock source, drift tolerance and alerting are documented and tested.&lt;/td&gt;
&lt;td&gt;Event ordering and latency evidence become unreliable.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DATA-05&lt;/td&gt;
&lt;td&gt;Replayable input record&lt;/td&gt;
&lt;td&gt;A bounded record can reconstruct the inputs used for a reviewed decision.&lt;/td&gt;
&lt;td&gt;An incident cannot be reproduced without relying on memory.&lt;/td&gt;
&lt;td&gt;After execution&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Pre-trade risk
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RISK-01&lt;/td&gt;
&lt;td&gt;Instrument and venue allowlist&lt;/td&gt;
&lt;td&gt;Orders are rejected unless the instrument and destination are explicitly permitted.&lt;/td&gt;
&lt;td&gt;An unintended market or product receives an order.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RISK-02&lt;/td&gt;
&lt;td&gt;Order size and notional limits&lt;/td&gt;
&lt;td&gt;Hard per-order quantity and notional ceilings are enforced before transmission.&lt;/td&gt;
&lt;td&gt;A malformed or extreme order leaves the system.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RISK-03&lt;/td&gt;
&lt;td&gt;Position and exposure limits&lt;/td&gt;
&lt;td&gt;Projected exposure is checked at the relevant account and aggregate levels.&lt;/td&gt;
&lt;td&gt;Individually valid orders create an invalid aggregate exposure.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RISK-04&lt;/td&gt;
&lt;td&gt;Price collars&lt;/td&gt;
&lt;td&gt;Order prices are checked against a documented reference and tolerance.&lt;/td&gt;
&lt;td&gt;A stale or malformed price creates an extreme instruction.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RISK-05&lt;/td&gt;
&lt;td&gt;Message-rate controls&lt;/td&gt;
&lt;td&gt;Order, cancel and replace rates have hard limits and tested behavior.&lt;/td&gt;
&lt;td&gt;A loop overwhelms a venue, gateway or downstream control.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Execution lifecycle
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;EXEC-01&lt;/td&gt;
&lt;td&gt;Idempotent order intent&lt;/td&gt;
&lt;td&gt;A stable intent identifier prevents duplicate transmission after retry or reconnect.&lt;/td&gt;
&lt;td&gt;The same decision creates multiple live orders.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXEC-02&lt;/td&gt;
&lt;td&gt;Decision-to-order trace&lt;/td&gt;
&lt;td&gt;Decision, risk result, transmitted instruction and venue response share a trace key.&lt;/td&gt;
&lt;td&gt;An order cannot be tied back to its initiating decision.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXEC-03&lt;/td&gt;
&lt;td&gt;Acknowledgement timeout&lt;/td&gt;
&lt;td&gt;A bounded wait state and escalation path exist for missing venue acknowledgement.&lt;/td&gt;
&lt;td&gt;The system assumes an unknown order is absent or complete.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXEC-04&lt;/td&gt;
&lt;td&gt;Explicit state machine&lt;/td&gt;
&lt;td&gt;Accepted, rejected, resting, partial, filled, cancel-pending and cancelled states are distinct.&lt;/td&gt;
&lt;td&gt;Ambiguous lifecycle state drives an unsafe next action.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EXEC-05&lt;/td&gt;
&lt;td&gt;Venue isolation&lt;/td&gt;
&lt;td&gt;A degraded venue can be restricted without disabling unaffected routes by accident.&lt;/td&gt;
&lt;td&gt;One venue failure propagates uncontrolled behavior across routes.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Human control
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HUM-01&lt;/td&gt;
&lt;td&gt;Rapid disable mechanism&lt;/td&gt;
&lt;td&gt;Authorized operators can stop new activity in a small, documented number of steps.&lt;/td&gt;
&lt;td&gt;The algorithm continues while operators search for a control.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HUM-02&lt;/td&gt;
&lt;td&gt;Cancel and exposure procedure&lt;/td&gt;
&lt;td&gt;The runbook separates stopping new orders, cancelling open orders and managing exposure.&lt;/td&gt;
&lt;td&gt;A stop command leaves unmanaged orders or exposure.&lt;/td&gt;
&lt;td&gt;Incident&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HUM-03&lt;/td&gt;
&lt;td&gt;Role and entitlement separation&lt;/td&gt;
&lt;td&gt;Release, limit changes and emergency actions use least privilege and named roles.&lt;/td&gt;
&lt;td&gt;One compromised or mistaken identity has unnecessary authority.&lt;/td&gt;
&lt;td&gt;Continuous&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HUM-04&lt;/td&gt;
&lt;td&gt;Override audit trail&lt;/td&gt;
&lt;td&gt;Every override records actor, time, prior value, new value, reason and approval.&lt;/td&gt;
&lt;td&gt;Temporary exceptions become invisible permanent behavior.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HUM-05&lt;/td&gt;
&lt;td&gt;Escalation thresholds&lt;/td&gt;
&lt;td&gt;Conditions for review, automatic restriction and executive escalation are pre-defined.&lt;/td&gt;
&lt;td&gt;Teams improvise authority during a fast-moving event.&lt;/td&gt;
&lt;td&gt;Incident&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Operations and evidence
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Failure surfaced&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OPS-01&lt;/td&gt;
&lt;td&gt;Health and dependency view&lt;/td&gt;
&lt;td&gt;Market data, gateways, venues, storage and control services have distinct health states.&lt;/td&gt;
&lt;td&gt;A green aggregate status hides a critical dependency failure.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPS-02&lt;/td&gt;
&lt;td&gt;Actionable alert ownership&lt;/td&gt;
&lt;td&gt;Each material alert has a severity, owner, response time and tested destination.&lt;/td&gt;
&lt;td&gt;An alert exists but no one is responsible for acting.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPS-03&lt;/td&gt;
&lt;td&gt;Order and position reconciliation&lt;/td&gt;
&lt;td&gt;Internal records are periodically compared with authoritative external state.&lt;/td&gt;
&lt;td&gt;Silent divergence persists between local and venue or broker state.&lt;/td&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPS-04&lt;/td&gt;
&lt;td&gt;Incident timeline&lt;/td&gt;
&lt;td&gt;Significant events preserve configuration, inputs, decisions, controls, orders and interventions.&lt;/td&gt;
&lt;td&gt;Post-incident review lacks a coherent sequence.&lt;/td&gt;
&lt;td&gt;Incident&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OPS-05&lt;/td&gt;
&lt;td&gt;Post-incident action closure&lt;/td&gt;
&lt;td&gt;Findings receive an owner, due date, verification test and closure evidence.&lt;/td&gt;
&lt;td&gt;The same control weakness recurs without a verified fix.&lt;/td&gt;
&lt;td&gt;After incident&lt;/td&gt;
&lt;td&gt;high&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Source synthesis
&lt;/h2&gt;

&lt;p&gt;The categories were synthesized from public supervisory guidance and operational incident-review practices, then normalized into implementation-neutral review questions.&lt;/p&gt;

&lt;p&gt;Primary references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fca.org.uk/publications/multi-firm-reviews/algorithmic-trading-controls-high-level-observations" rel="noopener noreferrer"&gt;FCA, 2025 multi-firm review of algorithmic trading controls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.finra.org/industry/notices/15-09" rel="noopener noreferrer"&gt;FINRA Regulatory Notice 15-09&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sec.gov/rules-regulations/2011/06/risk-management-controls-brokers-or-dealers-market-access" rel="noopener noreferrer"&gt;SEC Market Access Rule overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://handbook.fca.org.uk/technical-standards/s119c1039" rel="noopener noreferrer"&gt;FCA Handbook, resilience of trading systems&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use and limits
&lt;/h2&gt;

&lt;p&gt;This register is educational. It is not a compliance mapping, certification, investment recommendation or claim about the controls implemented by IMRYN. A firm must determine applicable legal requirements and calibrate controls to its markets, systems and risk appetite.&lt;/p&gt;

&lt;p&gt;A documented control is not an effective control until its enforcement, failure behavior, ownership and evidence have been tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/data.csv" rel="noopener noreferrer"&gt;Register as CSV&lt;/a&gt;, &lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/data.json" rel="noopener noreferrer"&gt;JSON&lt;/a&gt; and &lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/fields.json" rel="noopener noreferrer"&gt;field dictionary&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/methodology.txt" rel="noopener noreferrer"&gt;Method and scope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/laybatsvictor-cyber/ivryn-open-research/tree/main/datasets/imryn-execution-control" rel="noopener noreferrer"&gt;GitHub mirror&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;License: &lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/LICENSE.txt" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Suggested citation: Victor Laybats for IMRYN Research (2026), "Systematic execution control evidence register", version 2026-08-14, &lt;a href="https://imryn.com/blog/execution-control-checklist/2026-08-14/" rel="noopener noreferrer"&gt;https://imryn.com/blog/execution-control-checklist/2026-08-14/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Related on IMRYN: the &lt;a href="https://imryn.com/constraints/human-approval" rel="noopener noreferrer"&gt;human approval constraint&lt;/a&gt; explains why the final execution step remains intentionally reviewable, and the free &lt;a href="https://imryn.com/guides/position-size-calculator/" rel="noopener noreferrer"&gt;position size calculator&lt;/a&gt; turns a risk per trade and a stop into units.&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>devops</category>
      <category>architecture</category>
      <category>testing</category>
    </item>
    <item>
      <title>How long until a missed heartbeat is flagged? A reproducible detection timing table</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Sat, 24 Oct 2026 06:42:52 +0000</pubDate>
      <link>https://dev.to/victorlaybats/how-long-until-a-missed-heartbeat-is-flagged-a-reproducible-detection-timing-table-1c82</link>
      <guid>https://dev.to/victorlaybats/how-long-until-a-missed-heartbeat-is-flagged-a-reproducible-detection-timing-table-1c82</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://datvero.com/research/heartbeat-detection-envelope/2026-08-14T00-48-39-865Z/index.html" rel="noopener noreferrer"&gt;Datvero Research&lt;/a&gt;. Author: Victor Laybats, IVRYN.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When a scheduled workflow (n8n, Make, Zapier or a plain cron job) stops sending its heartbeat, how long does it take before a monitor marks it late, then down? We derived the answer from the detector implementation itself instead of guessing: a reproducible timing table, with the source fingerprint published next to it.&lt;/p&gt;

&lt;p&gt;The detector checks every &lt;strong&gt;60 seconds&lt;/strong&gt;, marks a workflow &lt;strong&gt;late&lt;/strong&gt; after &lt;strong&gt;1.5 times&lt;/strong&gt; its expected interval and &lt;strong&gt;down&lt;/strong&gt; after &lt;strong&gt;2 times&lt;/strong&gt; its expected interval.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detection timing by expected heartbeat interval
&lt;/h2&gt;

&lt;p&gt;Each range covers all 60 whole-second offsets between a stored heartbeat and the detector's recurring check. Threshold comparisons are strict, so a check exactly on the threshold does not transition state.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Expected heartbeat&lt;/th&gt;
&lt;th&gt;Late threshold&lt;/th&gt;
&lt;th&gt;Late observed range&lt;/th&gt;
&lt;th&gt;Late p95&lt;/th&gt;
&lt;th&gt;Down threshold&lt;/th&gt;
&lt;th&gt;Down observed range&lt;/th&gt;
&lt;th&gt;Down p95&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 min&lt;/td&gt;
&lt;td&gt;1 min 30 s&lt;/td&gt;
&lt;td&gt;1 min 31 s to 2 min 30 s&lt;/td&gt;
&lt;td&gt;2 min 27 s&lt;/td&gt;
&lt;td&gt;2 min&lt;/td&gt;
&lt;td&gt;2 min 01 s to 3 min&lt;/td&gt;
&lt;td&gt;2 min 57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;td&gt;7 min 30 s&lt;/td&gt;
&lt;td&gt;7 min 31 s to 8 min 30 s&lt;/td&gt;
&lt;td&gt;8 min 27 s&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;10 min 01 s to 11 min&lt;/td&gt;
&lt;td&gt;10 min 57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;15 min&lt;/td&gt;
&lt;td&gt;15 min 01 s to 16 min&lt;/td&gt;
&lt;td&gt;15 min 57 s&lt;/td&gt;
&lt;td&gt;20 min&lt;/td&gt;
&lt;td&gt;20 min 01 s to 21 min&lt;/td&gt;
&lt;td&gt;20 min 57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;td&gt;45 min&lt;/td&gt;
&lt;td&gt;45 min 01 s to 46 min&lt;/td&gt;
&lt;td&gt;45 min 57 s&lt;/td&gt;
&lt;td&gt;60 min&lt;/td&gt;
&lt;td&gt;60 min 01 s to 61 min&lt;/td&gt;
&lt;td&gt;60 min 57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60 min&lt;/td&gt;
&lt;td&gt;90 min&lt;/td&gt;
&lt;td&gt;90 min 01 s to 91 min&lt;/td&gt;
&lt;td&gt;90 min 57 s&lt;/td&gt;
&lt;td&gt;120 min&lt;/td&gt;
&lt;td&gt;120 min 01 s to 121 min&lt;/td&gt;
&lt;td&gt;120 min 57 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Implementation rule: late when elapsed &amp;gt; expected × 1.5, down when elapsed &amp;gt; expected × 2, evaluation every 60 s.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the table was produced
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Extract.&lt;/strong&gt; The generator reads the current detector source and extracts its check interval and status multipliers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enumerate.&lt;/strong&gt; It evaluates every whole-second scheduler phase from 1 through 60 seconds for each configured example interval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record.&lt;/strong&gt; It records earliest, median, p95 and latest transition time for late and down states.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fingerprint.&lt;/strong&gt; The output stores the repository commit, source path, dirty state and SHA-256 of the tested implementation (source SHA-256 &lt;code&gt;d1ff53f470a80addc76384515fca0e17567588e44c550b903f7bc01ae1940321&lt;/code&gt;, version 2026-08-14T00:48:39.865Z).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Interpretation and limits
&lt;/h2&gt;

&lt;p&gt;This is implementation evidence, not a production response-time promise. Actual notification time includes more systems than the detector threshold.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This table is derived from a source-code snapshot and is not a production latency measurement or service-level agreement.&lt;/li&gt;
&lt;li&gt;Whole-second scheduler phases are sampled. Sub-second phase offsets are not enumerated.&lt;/li&gt;
&lt;li&gt;Network transit, database latency, process stalls, alert rendering and delivery-channel latency are excluded.&lt;/li&gt;
&lt;li&gt;The model starts from the last stored heartbeat timestamp and assumes the detector continues to run every configured check interval.&lt;/li&gt;
&lt;li&gt;The results do not measure third-party workflow reliability or customer outcomes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data and reproduction
&lt;/h2&gt;

&lt;p&gt;The structured dataset, row-level CSV, schema, reproduction note and integrity hashes contain no customer or workflow records.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datvero.com/research/heartbeat-detection-envelope/dataset.json" rel="noopener noreferrer"&gt;Dataset JSON&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datvero.com/research/heartbeat-detection-envelope/detection-envelope.csv" rel="noopener noreferrer"&gt;Timing CSV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datvero.com/research/heartbeat-detection-envelope/dataset.schema.json" rel="noopener noreferrer"&gt;JSON Schema&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datvero.com/research/heartbeat-detection-envelope/manifest.json" rel="noopener noreferrer"&gt;Manifest&lt;/a&gt; and &lt;a href="https://datvero.com/research/heartbeat-detection-envelope/SHA256SUMS.txt" rel="noopener noreferrer"&gt;SHA-256 checksums&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datvero.com/research/heartbeat-detection-envelope/reproduce.mjs" rel="noopener noreferrer"&gt;Reproduction note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/laybatsvictor-cyber/ivryn-open-research/tree/main/datasets/datvero-heartbeat-envelope" rel="noopener noreferrer"&gt;GitHub mirror&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The original compilation, authored method and generated timing table are licensed under &lt;a href="https://creativecommons.org/licenses/by/4.0/" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Suggested citation: Laybats, Victor. "Heartbeat monitoring detection envelope." Datvero Research, IVRYN, 9 Aug. 2026. &lt;a href="https://datvero.com/research/heartbeat-detection-envelope/2026-08-14T00-48-39-865Z/index.html" rel="noopener noreferrer"&gt;https://datvero.com/research/heartbeat-detection-envelope/2026-08-14T00-48-39-865Z/index.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are setting up the schedule itself, our free &lt;a href="https://datvero.com/tools/cron-expression-generator/" rel="noopener noreferrer"&gt;cron expression explainer&lt;/a&gt; reads a 5 or 6 field expression and lists the next runs in your time zone.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>automation</category>
      <category>n8n</category>
      <category>devops</category>
    </item>
    <item>
      <title>How we keep a social media scheduler from double-posting: a 200-process contention test</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Fri, 23 Oct 2026 18:13:00 +0000</pubDate>
      <link>https://dev.to/victorlaybats/how-we-keep-a-social-media-scheduler-from-double-posting-a-200-process-contention-test-4ljb</link>
      <guid>https://dev.to/victorlaybats/how-we-keep-a-social-media-scheduler-from-double-posting-a-200-process-contention-test-4ljb</guid>
      <description>&lt;p&gt;A social media scheduler has one job it must never get wrong: publish a post once. If two workers wake up for the same scheduled item at the same moment, a naive scheduler posts twice, and a duplicate on a client's account is worse than a late post.&lt;/p&gt;

&lt;p&gt;In Cascads, a multi-brand social media cockpit, the guard is a durable claim: for one content item and one network key, exactly one process may call the provider while the claim is active. We wanted evidence that this holds under real contention, not just a passing unit test, so we measured it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;p&gt;Each round follows the same five steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new temporary ledger for the round.&lt;/li&gt;
&lt;li&gt;Start 8 independent Node.js processes and hold them at a common barrier.&lt;/li&gt;
&lt;li&gt;Release the barrier so every process contests the same item and platform key.&lt;/li&gt;
&lt;li&gt;Count callback marker files, which are written only inside the provider stub.&lt;/li&gt;
&lt;li&gt;Require one delivered state, 7 blocked contenders and one callback in every round.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We ran 25 rounds, so 200 simultaneous attempts in total. The tested source is &lt;code&gt;lib/publication-claims.js&lt;/code&gt;; the study page records its commit, its SHA-256 and whether it had uncommitted changes at test time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Every round satisfied the invariant. Across the 200 attempts, 25 workers reached the provider stub and 175 contenders were rejected before the side effect: 25 callbacks for 25 rounds, 0 duplicate callbacks and 0 unexpected worker outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does and does not show
&lt;/h2&gt;

&lt;p&gt;This is narrow evidence about one local concurrency boundary. It is not evidence of customer outcomes, platform acceptance or distributed exactly-once delivery. In particular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is a controlled single-host process-contention study, not a production traffic sample.&lt;/li&gt;
&lt;li&gt;The provider callback is a local deterministic stub: no social network API was called.&lt;/li&gt;
&lt;li&gt;It does not test multi-host setups or distributed filesystems.&lt;/li&gt;
&lt;li&gt;It covers the shared X and YouTube claim module through the X branch only.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build a scheduler, a queue consumer or anything that triggers an external side effect, this kind of barrier test is cheap to write and catches the race that unit tests never see.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data
&lt;/h2&gt;

&lt;p&gt;The summary, round-level results, schema and checksums are public under CC BY 4.0: the &lt;a href="https://cascads.com/research/publication-proof/" rel="noopener noreferrer"&gt;study page on cascads.com&lt;/a&gt; and the &lt;a href="https://github.com/laybatsvictor-cyber/ivryn-open-research/tree/main/datasets/cascads-publication-contention" rel="noopener noreferrer"&gt;dataset in the IVRYN open research repository&lt;/a&gt;. No customer content, account identifier or credential is included.&lt;/p&gt;

</description>
      <category>node</category>
      <category>concurrency</category>
      <category>testing</category>
      <category>socialmedia</category>
    </item>
    <item>
      <title>A production readiness matrix for n8n and AI workflows: 32 checks</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Fri, 23 Oct 2026 17:46:27 +0000</pubDate>
      <link>https://dev.to/victorlaybats/a-production-readiness-matrix-for-n8n-and-ai-workflows-32-checks-8j8</link>
      <guid>https://dev.to/victorlaybats/a-production-readiness-matrix-for-n8n-and-ai-workflows-32-checks-8j8</guid>
      <description>&lt;p&gt;A workflow is not production-ready because the happy path ran once. This matrix lists thirty-two checks for n8n workflows and AI agents. Each one asks for evidence you can inspect and a failure test you can actually trigger before deployment, so it stays useful when tools, model providers and infrastructure change.&lt;/p&gt;

&lt;p&gt;Rows marked &lt;em&gt;all&lt;/em&gt; apply broadly, rows marked &lt;em&gt;n8n&lt;/em&gt; refer to platform-level review, and rows marked &lt;em&gt;ai&lt;/em&gt; cover non-deterministic output, tool use and agent authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ownership and scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OWN-01 Named workflow owner&lt;/strong&gt; (critical, scope all). Evidence: Owner, deputy and business approver are recorded. Failure test: No one has authority to decide during failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OWN-02 Observable success condition&lt;/strong&gt; (high, scope all). Evidence: A measurable output, acceptance rule and review window are written down. Failure test: A successful execution is mistaken for a useful outcome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OWN-03 Stop conditions&lt;/strong&gt; (critical, scope all). Evidence: The workflow defines inputs and states that must block automation. Failure test: Automation continues through ambiguity or unsafe context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OWN-04 Dependency inventory&lt;/strong&gt; (high, scope all). Evidence: APIs, models, credentials, queues, databases and human steps are listed. Failure test: A hidden dependency fails without an owner or fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Inputs and data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IN-01 Authenticated trigger&lt;/strong&gt; (critical, scope all). Evidence: Public triggers use appropriate authentication or a documented public-access decision. Failure test: An unauthorized caller starts a sensitive workflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IN-02 Schema validation&lt;/strong&gt; (critical, scope all). Evidence: Required fields, types, sizes and allowed values are checked before processing. Failure test: Malformed input causes unsafe branching or downstream errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IN-03 Untrusted-content boundary&lt;/strong&gt; (critical, scope ai). Evidence: External text and files are treated as data, not instructions. Failure test: Injected content changes tool or model behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IN-04 Data minimization&lt;/strong&gt; (high, scope all). Evidence: Only fields necessary for the workflow are collected and retained. Failure test: Sensitive data is exposed without operational need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IN-05 Authoritative source rule&lt;/strong&gt; (high, scope all). Evidence: Conflicts between systems resolve to a named source of truth. Failure test: Different runs produce inconsistent decisions from conflicting data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Execution and recovery
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-01 Idempotency key&lt;/strong&gt; (critical, scope all). Evidence: Repeated triggers and retries cannot duplicate the external effect. Failure test: A timeout or replay creates duplicate records or messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-02 Bounded retry policy&lt;/strong&gt; (critical, scope all). Evidence: Only transient failures retry, with a cap, delay and terminal path. Failure test: A persistent failure loops, increases cost or repeats side effects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-03 Explicit timeout&lt;/strong&gt; (high, scope all). Evidence: Every remote dependency has a timeout shorter than the workflow budget. Failure test: One call holds the workflow indefinitely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-04 Error workflow&lt;/strong&gt; (critical, scope n8n). Evidence: Unhandled failures reach a tested error path with useful context. Failure test: The execution stops silently or alerts without diagnostic data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-05 Partial-failure policy&lt;/strong&gt; (critical, scope all). Evidence: The design states when to stop, compensate, queue or continue. Failure test: Continue-on-error hides a missing critical step.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-06 Dead-letter path&lt;/strong&gt; (high, scope all). Evidence: Terminal failures are retained for bounded, authorized replay. Failure test: Failed work is lost or retried blindly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FLOW-07 Manual recovery runbook&lt;/strong&gt; (high, scope all). Evidence: A person can identify state, avoid duplicates and resume safely. Failure test: Recovery requires ad hoc database or workflow edits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI behavior
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI-01 Representative evaluation set&lt;/strong&gt; (critical, scope ai). Evidence: Typical, edge, ambiguous and refusal cases are versioned. Failure test: A prompt change ships without behavioral comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-02 Structured output validation&lt;/strong&gt; (critical, scope ai). Evidence: Model output is parsed against a strict schema before use. Failure test: Malformed or invented fields reach downstream actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-03 Least-capability tools&lt;/strong&gt; (critical, scope ai). Evidence: The agent receives only the tools and parameters required for its task. Failure test: A manipulated or mistaken choice has excessive impact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-04 Human approval for material actions&lt;/strong&gt; (critical, scope ai). Evidence: External, financial, sensitive or irreversible actions require proportionate approval. Failure test: A plausible but wrong output directly changes external state.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-05 Model and prompt version&lt;/strong&gt; (high, scope ai). Evidence: Model, parameters, prompt and tool manifest are identifiable per execution. Failure test: A behavioral regression cannot be attributed or reproduced.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-06 Cost and loop ceiling&lt;/strong&gt; (critical, scope ai). Evidence: Token, step, time and tool-call ceilings stop runaway execution. Failure test: An agent loop consumes unbounded budget or API capacity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security and privacy
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SEC-01 Least-privilege credentials&lt;/strong&gt; (critical, scope all). Evidence: Each credential exposes only necessary operations and environments. Failure test: A node compromise grants broad account access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEC-02 Secret hygiene&lt;/strong&gt; (critical, scope all). Evidence: Secrets stay in credential storage or controlled environment configuration. Failure test: Keys leak into workflow JSON, logs or error messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEC-03 Risky-node review&lt;/strong&gt; (high, scope n8n). Evidence: Code, shell, file, database and community nodes receive explicit review. Failure test: A powerful node expands the attack surface unnoticed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEC-04 Log redaction&lt;/strong&gt; (critical, scope all). Evidence: Tokens, personal data and confidential payloads are removed or minimized in traces. Failure test: Debug evidence becomes a data leak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEC-05 Retention and deletion rule&lt;/strong&gt; (high, scope all). Evidence: Execution data has a documented retention period and deletion process. Failure test: Sensitive payloads remain indefinitely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Operations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OPS-01 Deployment version and rollback&lt;/strong&gt; (critical, scope all). Evidence: A release is identifiable and a prior safe version can be restored. Failure test: An incident cannot be contained without rebuilding from memory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPS-02 Health versus outcome metrics&lt;/strong&gt; (high, scope all). Evidence: Availability, error rate, latency, cost and output quality are measured separately. Failure test: HTTP success hides wrong or low-quality output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPS-03 Actionable alerts&lt;/strong&gt; (high, scope all). Evidence: Alerts have severity, owner, destination, threshold and response expectation. Failure test: Noise masks a material failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPS-04 Synthetic failure test&lt;/strong&gt; (critical, scope all). Evidence: Timeout, bad input, rate limit and downstream outage paths are exercised. Failure test: The fallback exists only on the canvas and fails when needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OPS-05 Periodic access and audit review&lt;/strong&gt; (high, scope n8n). Evidence: Credentials, webhooks, nodes, versions and inactive workflows are reviewed. Failure test: Old access and exposed triggers accumulate silently.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use and limits
&lt;/h2&gt;

&lt;p&gt;The matrix is a review aid, not a security certification, warranty or substitute for a project-specific legal, privacy or compliance assessment. Not every check applies to every workflow.&lt;/p&gt;

&lt;p&gt;A green execution status proves that the engine completed a path. It does not prove that the output was correct, authorized or useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/hosting/securing/security-audit/" rel="noopener noreferrer"&gt;n8n security audit documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io/build/flow-logic/handle-errors-gracefully/" rel="noopener noreferrer"&gt;n8n error handling documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nist.gov/itl/ai-risk-management-framework" rel="noopener noreferrer"&gt;NIST AI Risk Management Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owasp.org/www-project-top-10-for-large-language-model-applications/" rel="noopener noreferrer"&gt;OWASP Top 10 for LLM applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The versioned matrix, with CSV and JSON downloads, is &lt;a href="https://victorlaybats.com/research/automation-readiness/2026-08-14/" rel="noopener noreferrer"&gt;on victorlaybats.com&lt;/a&gt; and mirrored in the &lt;a href="https://github.com/laybatsvictor-cyber/ivryn-open-research/tree/main/datasets/victor-automation-readiness" rel="noopener noreferrer"&gt;IVRYN open research repository&lt;/a&gt;. If you run n8n or agents in production, I would like to know which check you would add.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>What broke when we generated daily trivia from Wikidata</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Fri, 23 Oct 2026 15:48:46 +0000</pubDate>
      <link>https://dev.to/victorlaybats/what-broke-when-we-generated-daily-trivia-from-wikidata-1mda</link>
      <guid>https://dev.to/victorlaybats/what-broke-when-we-generated-daily-trivia-from-wikidata-1mda</guid>
      <description>&lt;p&gt;I wanted daily quizzes whose answers anyone can check, so every question on &lt;a href="https://playwikicards.com/trivia-questions/" rel="noopener noreferrer"&gt;our trivia pages&lt;/a&gt; is generated from a Wikidata fact, and every answer links back to its Wikidata item. Twenty questions a day, capitals, flags, rivers, literary works, films, events, championship winners.&lt;/p&gt;

&lt;p&gt;The quiz part was easy. The data part was not. Here is what broke, measured on 23 October 2026, and what we changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Nearly one famous person in five had no English or French label
&lt;/h2&gt;

&lt;p&gt;Since 2024 Wikidata stores many proper names once, under a label for all languages (&lt;code&gt;mul&lt;/code&gt;), instead of repeating them in every language. A query that asks for &lt;code&gt;lang(?label) = "en"&lt;/code&gt; silently drops those items.&lt;/p&gt;

&lt;p&gt;On a sample of the 200 most-read people of our card catalogue, 36 had no English or no French label: George Washington, Barack Obama, William Shakespeare and Novak Djokovic among them. Juneau, the capital of Alaska, only had the &lt;code&gt;mul&lt;/code&gt; label, so Alaska disappeared from our US states quiz.&lt;/p&gt;

&lt;p&gt;The fix is a fallback chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sparql"&gt;&lt;code&gt;&lt;span class="k"&gt;OPTIONAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?fr&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;FILTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fr"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;OPTIONAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?en&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;FILTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?en&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;OPTIONAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;rdfs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;label&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?mul&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FILTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?mul&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mul"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;BIND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?fr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?mul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?en&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?labelFr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;BIND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;COALESCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?en&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?mul&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?labelEn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Scanning a whole class times out
&lt;/h2&gt;

&lt;p&gt;The public SPARQL service stops a query after 60 seconds. "Every mountain with its elevation" or "every novel with its author" ended in an HTTP 504 or in a truncated JSON body, depending on the load of the service.&lt;/p&gt;

&lt;p&gt;What works: start from a list of known items. We map our most-read Wikipedia articles to their Wikidata ids through the Wikipedia API (&lt;code&gt;prop=pageprops&amp;amp;ppprop=wikibase_item&lt;/code&gt;, 50 titles per call), then query them with &lt;code&gt;VALUES ?x { ... }&lt;/code&gt; in batches of 100 ids. We also write the output after each kind of fact, so one failure no longer loses the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Nile was 2,850 km long
&lt;/h2&gt;

&lt;p&gt;Many items carry several values for one property. The Nile has 6,650 km with a preferred rank and also 2,850 km with a normal rank. The Amazon has 6,400 km with a preferred rank and four other values, from 3,690 to 6,992 km. A median of all values makes "which river is the longest?" wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sparql"&gt;&lt;code&gt;&lt;span class="nv"&gt;?x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;p&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;P2043&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?st&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;?st&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;psn&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;P2043&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nn"&gt;wikibase&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;quantityAmount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nn"&gt;wikibase&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;rank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?rank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="k"&gt;FILTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?rank&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;wikibase&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;DeprecatedRank&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We keep preferred-rank values when they exist, drop items whose remaining values disagree by more than 12 %, and only compare four rivers when the first is at least 15 % longer than the second. The Nile and the Amazon, about 4 % apart, are never the two candidates of the same question.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. True in Wikidata, unfair in a quiz
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pop songs often record a single co-writer as composer: Wikidata gives RedOne for Poker Face, which he wrote with Lady Gaga. We removed music.&lt;/li&gt;
&lt;li&gt;"Discoverer" also applies to places: Persepolis would be credited to a Spanish diplomat. Anything with coordinates is out of the discoveries.&lt;/li&gt;
&lt;li&gt;Franchises keep their current name for past titles: Super Bowl XI (1977) is won by the Las Vegas Raiders, who were the Oakland Raiders then. American leagues only use editions from 2000.&lt;/li&gt;
&lt;li&gt;Oceania exists twice (Oceania and Insular Oceania), which left Tuvalu without a continent. We merge them.&lt;/li&gt;
&lt;li&gt;Capitals with an internationally disputed status are never asked, and are marked in the list of capitals.&lt;/li&gt;
&lt;li&gt;A wrong answer is never a prefix of the right one, so "Rugby" never sits next to "Rugby union".&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Commons refuses 320 px thumbnails
&lt;/h2&gt;

&lt;p&gt;Flags and locator maps are Wikimedia Commons thumbnails. A width of 320 px returns HTTP 400 with "Use thumbnail sizes listed on &lt;a href="https://w.wiki/GHai" rel="noopener noreferrer"&gt;https://w.wiki/GHai&lt;/a&gt;", while 120, 250, 330 and 500 px are served:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;thumb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;330&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.svg&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://upload.wikimedia.org/wikipedia/commons/thumb/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;px-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Sixteen quiz pages, twenty questions a day each, every answer with its source. The cleaned fact set is open data (CC0) &lt;a href="https://github.com/laybatsvictor-cyber/ivryn-open-research/tree/main/datasets/wikicards-wikidata-trivia-facts" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;, and the full write-up with the French version is &lt;a href="https://playwikicards.com/how-the-quizzes-are-made/" rel="noopener noreferrer"&gt;on our site&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you build on Wikidata, I would love to hear about the quirks I missed.&lt;/p&gt;

</description>
      <category>wikidata</category>
      <category>sparql</category>
      <category>opendata</category>
      <category>python</category>
    </item>
  </channel>
</rss>
