<?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>How a flight alert app decides a fare drop is real: trimmed medians, score gates and append-only snapshots</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Tue, 27 Oct 2026 00:01:13 +0000</pubDate>
      <link>https://dev.to/victorlaybats/how-a-flight-alert-app-decides-a-fare-drop-is-real-trimmed-medians-score-gates-and-append-only-1k74</link>
      <guid>https://dev.to/victorlaybats/how-a-flight-alert-app-decides-a-fare-drop-is-real-trimmed-medians-score-gates-and-append-only-1k74</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://flareflights.com/methodology.html" rel="noopener noreferrer"&gt;flareflights.com&lt;/a&gt;. Last substantive review of the source page: 9 August 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Flare is a flight alert app I build at IVRYN. Its public deal pages are generated from scan output, so we wrote down exactly which gates a fare must pass before it is shown, what the reference price is, and what the figures cannot prove. Here is that method.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short answer
&lt;/h2&gt;

&lt;p&gt;Flare is a fare-monitoring and discovery product. The public pages contain timestamped observations selected from the latest scan output. They are not a booking engine, travel agency quote or promise that a seat remains available.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a fare enters the public collection
&lt;/h2&gt;

&lt;p&gt;The upstream scanner combines fare candidates available to the product from multiple airline and flight-search data feeds. For the public collection, the generator applies the same explicit minimum gates to every candidate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;both the current amount and its comparison reference must be positive;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the measured drop must be at least 30%;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the Flare Deal Score must be at least 55;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a destination page enters with 7 distinct combinations and can remain during a 14-day grace window with 5 current combinations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a departure-city page must contain at least 12 observations across 10 active destination pages.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Deal Score is a prioritisation signal, not an external rating. It weighs the size and confidence of the deviation alongside itinerary characteristics such as stops, duration and trip shape. It does not make a fare “verified” merely by being high.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “reference price” means
&lt;/h2&gt;

&lt;p&gt;Where sufficient route history exists, the comparison value is based on a median of observed baseline prices. The scoring engine trims the outer 10% of those observations before taking the median, and it requires a minimum history before allowing the comparison to imply a large drop.&lt;/p&gt;

&lt;p&gt;For some long-haul routes with limited history, the upstream engine can use a conservative distance-calibrated reference. That fallback carries lower confidence and cannot by itself qualify a fare for the system’s reserved mistake-fare band. A Flare reference is therefore a product measurement, not a universal market average or a price published by every airline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freshness and verification
&lt;/h2&gt;

&lt;p&gt;The public deal collection is scheduled to rebuild every three hours. Each page prints its own UTC snapshot time. Some promising candidates can receive an additional live recheck upstream, but coverage varies and a public page does not claim that every row has the same verification status.&lt;/p&gt;

&lt;p&gt;Airfares are volatile. Inventory, currency conversion, point of sale, passenger count, taxes and optional services can alter the final amount. A result can disappear between the page refresh and the reader’s search.&lt;/p&gt;

&lt;h2&gt;
  
  
  City and airport consolidation
&lt;/h2&gt;

&lt;p&gt;Destination and departure pages group airport or metropolitan codes only when the city name and country match in Flare’s airport reference. Every fare card still prints the exact IATA codes used by its itinerary. Consolidation prevents near-duplicate city pages; it does not imply that two airports have the same access time, fees or practical value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row-level provenance
&lt;/h2&gt;

&lt;p&gt;Each downloadable row records the source market and the UTC timestamp exposed by the upstream batch that contained the candidate, together with the later UTC publication time. This is batch-level provenance. The source payload does not expose a reliable provider identity for every row, so Flare does not publish or infer one. A source batch time must not be read as a provider quote time or a live verification time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning and reproducibility
&lt;/h2&gt;

&lt;p&gt;Every published dataset is copied into a timestamped archive directory. Archive files are append-only: the generator refuses to replace a file with different bytes at an existing version URL. A SHA-256 checksum manifest lets a reader verify downloaded JSON, CSV, field definitions and citation text. The &lt;a href="https://flareflights.com/fare-snapshot-archive.html" rel="noopener noreferrer"&gt;version index&lt;/a&gt; links every retained snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measured answers from this dataset
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://flareflights.com/research/stats/average-flight-deal-discount/" rel="noopener noreferrer"&gt;Average discount of a qualifying flight deal right now&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flareflights.com/research/stats/median-flight-deal-price/" rel="noopener noreferrer"&gt;Median price of a qualifying flight deal&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flareflights.com/research/stats/share-of-deep-flight-discounts/" rel="noopener noreferrer"&gt;Share of deals at 50% off or more&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flareflights.com/research/stats/one-way-share-of-flight-deals/" rel="noopener noreferrer"&gt;One-way share of observed deals&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flareflights.com/research/stats/flight-deals-under-50-euros/" rel="noopener noreferrer"&gt;Share of deals under 50 EUR&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://flareflights.com/research/fare-drop-digest/" rel="noopener noreferrer"&gt;Weekly Fare Drop Digest&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reuse rights
&lt;/h2&gt;

&lt;p&gt;IVRYN grants reuse only for the Flare-authored compilation elements it owns. Underlying fare facts, feed rights, provider material, airline names and third-party database rights are not relicensed. Read the exact scope on the &lt;a href="https://flareflights.com/fare-data-license.html" rel="noopener noreferrer"&gt;data reuse page&lt;/a&gt; and consult the &lt;a href="https://flareflights.com/fare-snapshot-fields.json" rel="noopener noreferrer"&gt;machine-readable field dictionary&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use the information
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Read the IATA codes, dates, trip type and stop count shown on the card.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run a fresh search and compare the complete itinerary with the observation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirm baggage, airport changes, self-transfers, cancellation rules and the final payable total.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check passport, visa, transit, health and entry requirements with the relevant official authorities.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Publishing responsibility
&lt;/h2&gt;

&lt;p&gt;These automated data pages are authored and maintained as product output by Flare, an IVRYN product. Travel guides follow the separate &lt;a href="https://flareflights.com/blog/editorial-policy/" rel="noopener noreferrer"&gt;editorial policy&lt;/a&gt;. Questions or corrections can be sent to &lt;a href="mailto:contact@flareflights.com"&gt;contact@flareflights.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flare: &lt;a href="https://flareflights.com/" rel="noopener noreferrer"&gt;https://flareflights.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>opendata</category>
      <category>travel</category>
      <category>data</category>
    </item>
    <item>
      <title>How a nature app turns an 8-second video into a species suggestion, and where it stops</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Tue, 27 Oct 2026 00:01:07 +0000</pubDate>
      <link>https://dev.to/victorlaybats/how-a-nature-app-turns-an-8-second-video-into-a-species-suggestion-and-where-it-stops-2bi1</link>
      <guid>https://dev.to/victorlaybats/how-a-nature-app-turns-an-8-second-video-into-a-species-suggestion-and-where-it-stops-2bi1</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://naturego.app/how-nature-go-identifies/" rel="noopener noreferrer"&gt;naturego.app&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nature GO is a free Android app that builds a nature dex from short videos. This is how it turns an 8-second clip into a species suggestion, and where it deliberately stops.&lt;/p&gt;

&lt;p&gt;In short: you film the animal live in the app for about eight seconds while moving the phone the way the app asks. A server samples four frames, checks that they come from one real scene, then suggests a species with the visible evidence behind it. You confirm the suggestion before it enters your nature dex.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. A live clip fills the dex, a photo only gets a name
&lt;/h2&gt;

&lt;p&gt;Only video filmed in the app can add a species to the dex, so every entry is something you actually found. Since version 1.14 you can also pick a photo from your gallery: Professor Hazel, the app's AI, suggests a name, the photo counts as one of the day's analyses, and nothing is added to the dex. Before you record, the app gives one movement to make: keep the subject in frame and move the phone slowly to the left, or to the right. The direction is drawn at random for each clip and the challenge expires after ten minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Four frames checked on the server
&lt;/h2&gt;

&lt;p&gt;You choose whether to send each clip. The server decodes it, keeps four frames spread across the recording and looks at three things: whether the frames show one coherent natural scene, whether the camera moved as asked, and whether there are signs of a screen or a printed picture, such as borders, pixels or moiré. These checks are informative, not forensic: a clip is refused only when a screen or print is suspected and the frames do not hold together.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A suggestion with its evidence
&lt;/h2&gt;

&lt;p&gt;The identification returns up to three candidates, from species to genus or family, each with a confidence level and the visible features it relies on, for example a bill colour, a wing pattern or the shape of a leaf. When the evidence is thin, the answer stays at genus level or says it is uncertain instead of guessing. A clip is accepted when a living subject is named and at least three of the four frames differ. You review the suggestion before you confirm it, and only confirmed, server-verified captures fill the catalogue of 151 species.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why a clip can come back without an answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Not enough evidence: no living subject could be named. Film closer and steadier, with the whole animal in frame.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frames too still: fewer than three different frames, for example a video of a still image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Screen or print suspected: the frames look like a screen or a printed page and do not form a coherent scene.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New clip needed: the challenge has expired, the clip was already used or it is larger than 16 MB. Record a new one.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Analysis paused: no connection, the daily limit is reached or the service is busy. The clip stays pending.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. What we measured
&lt;/h2&gt;

&lt;p&gt;On 21 October 2026 we ran the identification engine on eight reference photos from Wikimedia Commons, outside the video flow of the app. It named the five snakes to the exact species: western diamondback rattlesnake, ball python, corn snake, Indian cobra and common garter snake. For the three spiders it found the right genus: two answers stopped at genus level (widow spiders, recluse spiders), and the third proposed a species of the right genus with low confidence, Argiope trifasciata for a wasp spider (Argiope bruennichi). Eight photos are a small sample, not an accuracy rate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Limits
&lt;/h2&gt;

&lt;p&gt;An identification is a suggestion, not a guarantee. Nature GO never says whether a plant, fungus or animal is edible, venomous or safe. It needs an internet connection, and analysis pauses when the daily limit is reached: 3 analyses a day for free, 10 with Nature GO Plus while the service has capacity. Notes and place labels stay on your phone and are never sent for analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Price: free on Android, with 3 analyses a day. Optional Nature GO Plus: 10 analyses a day while the service has capacity, 30, 90 and 365-day field reports and a text export.&lt;/li&gt;
&lt;li&gt;Account: none to create. Notes and place labels stay on the phone.&lt;/li&gt;
&lt;li&gt;Catalogue: 151 species in 5 drawers: 42 birds, 45 plants, 34 insects, 15 mammals and 15 others (frogs, lizards, snails, spiders, fungi).&lt;/li&gt;
&lt;li&gt;Safety: it never says whether a plant, fungus or animal is edible, venomous or safe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nature GO on Google Play: &lt;a href="https://play.google.com/store/apps/details?id=com.ivryn.wildkeep" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.ivryn.wildkeep&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The full page, with the FAQ and the species guides: &lt;a href="https://naturego.app/how-nature-go-identifies/" rel="noopener noreferrer"&gt;https://naturego.app/how-nature-go-identifies/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>machinelearning</category>
      <category>computervision</category>
      <category>mobile</category>
    </item>
    <item>
      <title>What a crawler can retrieve from nine small product sites: robots, sitemaps, JSON-LD and llms.txt</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:01:32 +0000</pubDate>
      <link>https://dev.to/victorlaybats/what-a-crawler-can-retrieve-from-nine-small-product-sites-robots-sitemaps-json-ld-and-llmstxt-50jb</link>
      <guid>https://dev.to/victorlaybats/what-a-crawler-can-retrieve-from-nine-small-product-sites-robots-sitemaps-json-ld-and-llmstxt-50jb</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you run several small product sites, it is easy to assume that robots rules, sitemaps, structured data and language annotations are all in place. We checked instead, once, on all nine public sites of the IVRYN portfolio, and published the result as a dated snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was collected
&lt;/h2&gt;

&lt;p&gt;One automated pass, without authentication, fetched each public homepage, &lt;code&gt;robots.txt&lt;/code&gt;, the root sitemap, the blog sitemap and &lt;code&gt;llms.txt&lt;/code&gt;. It parsed the XML locations, the JSON-LD types, the hreflang values and the root-path crawler rules. The observation is dated 2026-08-14 (00:22 UTC).&lt;/p&gt;

&lt;h2&gt;
  
  
  Observed results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;Home&lt;/th&gt;
&lt;th&gt;Declared URLs&lt;/th&gt;
&lt;th&gt;Schema types&lt;/th&gt;
&lt;th&gt;Languages&lt;/th&gt;
&lt;th&gt;OAI-SearchBot&lt;/th&gt;
&lt;th&gt;GPTBot&lt;/th&gt;
&lt;th&gt;ClaudeBot&lt;/th&gt;
&lt;th&gt;llms.txt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IVRYN&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;Organization, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMRYN&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;FAQPage, Organization, SoftwareApplication, WebSite&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datvero&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;Organization, SoftwareApplication, WebSite&lt;/td&gt;
&lt;td&gt;en, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cascads&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;FAQPage, Organization, SoftwareApplication, VideoObject, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reef&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;FAQPage, MobileApplication, Organization, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flare&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;458&lt;/td&gt;
&lt;td&gt;FAQPage, MobileApplication, Organization, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sealed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;FAQPage, MobileApplication, Organization, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crucible CLUB&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Organization, WebPage, WebSite&lt;/td&gt;
&lt;td&gt;en, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victor Laybats&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;FAQPage, Person, ProfessionalService, WebPage&lt;/td&gt;
&lt;td&gt;en, es, fr, x-default&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;allowed&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In short: 9 of 9 homepages returned HTTP 200, 9 of 9 roots allowed OAI-SearchBot, and the sitemaps declared 760 unique URLs in total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioning
&lt;/h2&gt;

&lt;p&gt;The dated directory is immutable by convention. CSV and JSON files come with checksums, so a later snapshot can be compared line by line. The current URL may be refreshed by a future observed snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not tell you
&lt;/h2&gt;

&lt;p&gt;This is a complete census of one owner-operated portfolio, not a representative sample of websites, startups or production stacks. It describes retrievable public artefacts at one point in time. It does not measure search placement, backlink authority, audience, adoption, revenue or the probability of citation by a search or AI system.&lt;/p&gt;

&lt;p&gt;A crawler being allowed does not mean it visited, indexed, ranked or cited a page. A sitemap declaration is not proof of indexation.&lt;/p&gt;

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

&lt;p&gt;The CSV, JSON, field dictionary and reproduction notes are on the original page: &lt;a href="https://ivryn.com/research/portfolio-web-transparency/2026-08-14/" rel="noopener noreferrer"&gt;Nine-site public web transparency snapshot&lt;/a&gt;. Protocol references: RFC 9309 (Robots Exclusion Protocol), the Sitemaps XML protocol and Schema.org Dataset.&lt;/p&gt;

&lt;p&gt;Do you run a similar check on your own sites, and which field would you add?&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>opendata</category>
      <category>ai</category>
    </item>
    <item>
      <title>26 questions to ask before joining a builder residency or hacker house</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:01:14 +0000</pubDate>
      <link>https://dev.to/victorlaybats/26-questions-to-ask-before-joining-a-builder-residency-or-hacker-house-4il2</link>
      <guid>https://dev.to/victorlaybats/26-questions-to-ask-before-joining-a-builder-residency-or-hacker-house-4il2</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A beautiful house and a focused month are not enough information for a travel or financial commitment. Builder residencies, hacker houses and coliving cohorts for founders are easy to like from a landing page, and much harder to check before you send a deposit or book a flight.&lt;/p&gt;

&lt;p&gt;I wrote this checklist for Crucible CLUB, a builder residency project at IVRYN, from its public participation methodology and from the decision-critical gaps that any cohort-specific offer must resolve. It gives prospective participants, organisers and journalists a shared set of 26 questions. Every item asks for evidence rather than awarding a score, and the framework is independent of the status of any current Crucible cohort (cohort details are still pending).&lt;/p&gt;

&lt;h2&gt;
  
  
  Operator
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-01. The legal or responsible operator is named.&lt;/strong&gt; A participant needs to know who accepts money and carries obligations. &lt;em&gt;Evidence to record:&lt;/em&gt; Record the operator name, registration or legal status and service address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-02. A monitored contact and escalation route are provided.&lt;/strong&gt; Questions and urgent issues need more than a social profile. &lt;em&gt;Evidence to record:&lt;/em&gt; Test the ordinary and urgent contact routes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-03. Application status and decision dates are current.&lt;/strong&gt; An open label can become misleading when dates have passed or a cohort has started. &lt;em&gt;Evidence to record:&lt;/em&gt; Capture the page, timestamp and stated decision timeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-04. Exact arrival, departure and program dates are stated.&lt;/strong&gt; Travel and accommodation decisions depend on unambiguous dates and time zones. &lt;em&gt;Evidence to record:&lt;/em&gt; Record dates, check-in windows and time zone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Venue
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-05. The city and venue status are confirmed.&lt;/strong&gt; A concept image or provisional city is not a confirmed accommodation booking. &lt;em&gt;Evidence to record:&lt;/em&gt; Request the address or a documented disclosure of when it will be supplied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-06. Room allocation, occupancy and accessibility are described.&lt;/strong&gt; Shared-room assumptions materially affect fit, privacy and cost. &lt;em&gt;Evidence to record:&lt;/em&gt; Record bed type, room sharing, bathrooms, stairs and accessibility constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-07. Capacity and minimum viable cohort are disclosed.&lt;/strong&gt; A residency can change or cancel if too few or too many people join. &lt;em&gt;Evidence to record:&lt;/em&gt; Record maximum capacity, minimum cohort and the consequence if unmet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Money
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-08. The total price, currency and taxes are stated.&lt;/strong&gt; A headline price may omit taxes, deposits or mandatory extras. &lt;em&gt;Evidence to record:&lt;/em&gt; Request an itemized total in the payment currency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-09. Included and excluded services are itemized.&lt;/strong&gt; Accommodation, food, transport, workspace and activities should not be inferred. &lt;em&gt;Evidence to record:&lt;/em&gt; Create an inclusion and exclusion list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-10. Payment recipient, schedule and method are verifiable.&lt;/strong&gt; The payee should match the responsible operator or a disclosed agent. &lt;em&gt;Evidence to record:&lt;/em&gt; Record invoice issuer, payee, due dates and payment protection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-11. Cancellation, refund and organiser-cancellation terms are supplied before payment.&lt;/strong&gt; A participant needs to understand losses under each cancellation scenario. &lt;em&gt;Evidence to record:&lt;/em&gt; Save the terms version accepted at payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Travel
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-12. Visa and work-authorisation responsibility is explicit.&lt;/strong&gt; A residency invitation does not determine immigration or work rights. &lt;em&gt;Evidence to record:&lt;/em&gt; Check current official authority guidance for the participant’s nationality and activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-13. Insurance expectations and exclusions are explicit.&lt;/strong&gt; Travel, health, equipment and cancellation risks may require different cover. &lt;em&gt;Evidence to record:&lt;/em&gt; Record required cover and who bears uninsured costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-14. Emergency contacts and evacuation procedures exist.&lt;/strong&gt; Shared accommodation in an unfamiliar place needs a practical incident plan. &lt;em&gt;Evidence to record:&lt;/em&gt; Request emergency numbers, exits, assembly point and hospital route.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-15. Health, accessibility and accommodation needs have a private route.&lt;/strong&gt; Participants need a way to discuss needs without public disclosure. &lt;em&gt;Evidence to record:&lt;/em&gt; Test the confidential request and response process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Community
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-16. House rules cover guests, noise, substances and shared spaces.&lt;/strong&gt; Common expectations reduce avoidable conflict in a live-work house. &lt;em&gt;Evidence to record:&lt;/em&gt; Review the cohort-specific house rules before acceptance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-17. Conflict, harassment and removal procedures are defined.&lt;/strong&gt; A community promise needs a safe route for complaints and proportionate action. &lt;em&gt;Evidence to record:&lt;/em&gt; Record reporter options, decision owner and consequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-18. Photography and public-content participation require separate agreement.&lt;/strong&gt; Joining a residency is not consent to marketing or documentary content. &lt;em&gt;Evidence to record:&lt;/em&gt; Review release wording and the opt-out path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-19. Confidential projects and intellectual property remain under participant control.&lt;/strong&gt; Proximity should not force disclosure or transfer of project rights. &lt;em&gt;Evidence to record:&lt;/em&gt; Review confidentiality and intellectual-property clauses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-20. The expected work rhythm and mandatory activities are stated.&lt;/strong&gt; A participant cannot assess fit without knowing the balance of focus and group time. &lt;em&gt;Evidence to record:&lt;/em&gt; Record mandatory sessions, quiet hours and uninterrupted blocks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-21. Each participant controls their project and milestone.&lt;/strong&gt; Selection should not imply employment, investment or transfer of decision rights. &lt;em&gt;Evidence to record:&lt;/em&gt; Review the agreement and milestone process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-22. Selection criteria and conflicts of interest are described.&lt;/strong&gt; Applicants should understand what is assessed and whether sponsors influence selection. &lt;em&gt;Evidence to record:&lt;/em&gt; Record criteria, reviewers and material relationships.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claims
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-23. Testimonials identify the cohort and have publication permission.&lt;/strong&gt; A quote without context or consent cannot establish a repeatable outcome. &lt;em&gt;Evidence to record:&lt;/em&gt; Verify the speaker, cohort, approved wording and date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-24. Launch, revenue, funding and partnership claims link to a verifiable record.&lt;/strong&gt; Residency association should not be confused with causation or endorsement. &lt;em&gt;Evidence to record:&lt;/em&gt; Request the public artifact and participant-approved attribution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BRD-25. Outcomes state starting point, time horizon and limitations.&lt;/strong&gt; Without a baseline and timeframe, progress claims are easy to overread. &lt;em&gt;Evidence to record:&lt;/em&gt; Record milestone, observed deliverable, later result and external factors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;BRD-26. Unresolved questions are listed before payment or travel.&lt;/strong&gt; A visible open-questions list prevents enthusiasm from becoming assumed fact. &lt;em&gt;Evidence to record:&lt;/em&gt; Publish or retain a dated decision log with owner and due date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;This is a due-diligence aid, not legal, immigration, tax, medical, insurance or financial advice. It does not verify a venue, operator or cohort and it does not guarantee safety or project outcomes. Time-sensitive details must be checked directly with the organiser and relevant authorities before commitment.&lt;/p&gt;

&lt;p&gt;The checklist is published under CC BY 4.0, with CSV and JSON downloads and checksums, on the original page: &lt;a href="https://crucibleclub.com/research/builder-residency-due-diligence-checklist/" rel="noopener noreferrer"&gt;Builder Residency Due-Diligence Checklist v1.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have run or joined a residency, which question would you add?&lt;/p&gt;

</description>
      <category>career</category>
      <category>startup</category>
      <category>productivity</category>
      <category>remote</category>
    </item>
    <item>
      <title>The Kelly criterion for traders: formulas, a worked example and the limits</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Sun, 25 Oct 2026 07:38:18 +0000</pubDate>
      <link>https://dev.to/victorlaybats/the-kelly-criterion-for-traders-formulas-a-worked-example-and-the-limits-45fb</link>
      <guid>https://dev.to/victorlaybats/the-kelly-criterion-for-traders-formulas-a-worked-example-and-the-limits-45fb</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://imryn.com/guides/kelly-criterion-calculator/" rel="noopener noreferrer"&gt;IMRYN&lt;/a&gt;, where the interactive calculator runs in the browser. Reviewed 2026-10-24.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Kelly criterion gives the fraction of capital that maximises long-run logarithmic growth. For a trade that either wins R times the amount risked or loses it, the Kelly fraction is &lt;code&gt;f = p - (1 - p) / R&lt;/code&gt;, where p is the win probability.&lt;/p&gt;

&lt;p&gt;Example: a 55 % win rate with a 2:1 win/loss ratio gives &lt;code&gt;f = 0.55 - 0.45 / 2 = 32.5 %&lt;/code&gt;. Most practitioners stake a fraction of Kelly, because the inputs are estimates and full Kelly swings hard.&lt;/p&gt;

&lt;p&gt;The calculator has three modes: win rate and win/loss ratio, partial loss (gain and loss fractions), and investment (return and volatility). Everything is calculated in your browser, nothing you type is sent anywhere, and the &lt;a href="https://github.com/laybatsvictor-cyber/imryn-trading-calculators" rel="noopener noreferrer"&gt;source code and tests are on GitHub under MIT&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worked example
&lt;/h2&gt;

&lt;p&gt;Win rate 55 %, win/loss ratio 2:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;full Kelly 32.5 %&lt;/li&gt;
&lt;li&gt;half Kelly 16.25 %&lt;/li&gt;
&lt;li&gt;quarter Kelly 8.125 %&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expected log growth per trade: 9.86 % at full Kelly, 7.50 % at half Kelly.&lt;/p&gt;

&lt;p&gt;Continuous form with 8 % expected return, 3 % risk-free rate and 20 % volatility: 125 %, which means leverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Formula
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Binary outcome, general form (Kelly 1956): &lt;code&gt;f = p / l - q / g&lt;/code&gt;, where p is the win probability, q = 1 - p, g is the fraction of the stake gained on a win and l the fraction lost on a loss.&lt;/li&gt;
&lt;li&gt;Trading form with a full loss of the amount risked (l = 1) and payoff ratio R = average win / average loss: &lt;code&gt;f = p - q / R&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expected log growth per bet at fraction f: &lt;code&gt;G(f) = p ln(1 + g f) + q ln(1 - l f)&lt;/code&gt;. Betting twice the Kelly fraction brings growth back to about zero.&lt;/li&gt;
&lt;li&gt;Continuous approximation for an investment: &lt;code&gt;f = (mu - r) / sigma^2&lt;/code&gt;, with mu the expected return, r the risk-free rate and sigma the volatility, all annual. A result above 100 % implies leverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;p and R are estimates. A small error in the win rate moves the Kelly fraction a lot, and an overestimated edge leads to over-betting, which lowers growth and deepens drawdowns.&lt;/li&gt;
&lt;li&gt;The formula assumes independent repeated bets with known odds. Trades are often correlated, fat tailed and affected by costs and slippage.&lt;/li&gt;
&lt;li&gt;Fractional Kelly (half or quarter) reduces volatility and the chance of ruin at the cost of slower growth.&lt;/li&gt;
&lt;li&gt;The continuous form assumes a symmetric return distribution.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is a good Kelly fraction?&lt;/strong&gt; There is no universal value. Full Kelly maximises long-run log growth only if the inputs are exact. Many traders use half or quarter Kelly to absorb estimation error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the Kelly result is negative?&lt;/strong&gt; A zero or negative result means the inputs show no edge: the criterion says not to take the bet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Kelly the amount to risk or the position size?&lt;/strong&gt; In the trading form it is the fraction of capital put at risk on a trade that loses the full amount risked at the stop. Convert it into units with the &lt;a href="https://imryn.com/guides/position-size-calculator/" rel="noopener noreferrer"&gt;position size calculator&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kelly, J. L. (1956), &lt;a href="https://doi.org/10.1002/j.1538-7305.1956.tb03809.x" rel="noopener noreferrer"&gt;A New Interpretation of Information Rate&lt;/a&gt;, Bell System Technical Journal 35(4), 917-926&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Kelly_criterion" rel="noopener noreferrer"&gt;Kelly criterion, Wikipedia&lt;/a&gt; (formulas f = p/l - q/g and f = (mu - r)/sigma^2)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Educational calculator, not financial advice. It does not know your situation, costs, taxes or the real distribution of your returns. Past or estimated figures do not predict future results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://imryn.com/guides/kelly-criterion-calculator/" rel="noopener noreferrer"&gt;Try the Kelly criterion calculator on IMRYN&lt;/a&gt;&lt;/p&gt;

</description>
      <category>trading</category>
      <category>math</category>
      <category>finance</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Which countries are in Europe? What Wikidata told us while building a daily quiz</title>
      <dc:creator>Victor Laybats</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:02:01 +0000</pubDate>
      <link>https://dev.to/victorlaybats/which-countries-are-in-europe-what-wikidata-told-us-while-building-a-daily-quiz-3foo</link>
      <guid>https://dev.to/victorlaybats/which-countries-are-in-europe-what-wikidata-told-us-while-building-a-daily-quiz-3foo</guid>
      <description>&lt;p&gt;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Last night we added a daily Europe quiz, in six languages, to our Wikidata trivia pages: the country highlighted on a map, its capital, its flag, with every wrong answer also taken from Europe. The question we thought would take five minutes was the first line of the spec: which countries count as European?&lt;/p&gt;

&lt;p&gt;Here is what Wikidata answered, and the rules we ended up writing down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Continent (P30) is a property, not a definition
&lt;/h2&gt;

&lt;p&gt;Our country list is every sovereign state (&lt;code&gt;wd:Q3624078&lt;/code&gt;) with its continent statements (&lt;code&gt;wdt:P30&lt;/code&gt;). For most countries there is exactly one value. The query below, run on 25 October 2026, returns the exceptions:&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;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?cLabel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;DISTINCT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?cont&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;?n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&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;?c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;wdt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;P31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;wd&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;Q3624078&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;?c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;wdt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;P30&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?cont&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;SERVICE&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;label&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;bd&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;serviceParam&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;language&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?cLabel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;HAVING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;?n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;It lists Turkey and Kazakhstan (Europe and Asia), Russia with three values (Europe, Asia and Eurasia), four Pacific states recorded in both "Oceania" and "Insular Oceania", which we merge, and the Russian Empire, a historical item that we filter out. So the real question is three countries: Russia, Turkey and Kazakhstan.&lt;/p&gt;

&lt;p&gt;The borderline cases you might expect are not borderline in the data. Georgia and Cyprus have Europe as their only continent. Armenia and Azerbaijan have Asia only.&lt;/p&gt;

&lt;p&gt;Wikidata is right to keep several values for the three transcontinental states. A quiz still has to decide. Our rule: a country is in the Europe quiz if Europe is its only continent, or if it spans several continents and its capital lies in Europe. That puts Russia in (Moscow) and leaves Turkey (Ankara) and Kazakhstan (Astana) out. The rule is written on the page, in each language, because someone will ask. The result is 46 countries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrong answers have to stay on the continent
&lt;/h2&gt;

&lt;p&gt;A flag question with Norway as the answer and Bolivia as a decoy is not a question. Every capital, flag and map question draws its three decoys from the same 46 countries. That works because the pool is large enough: even the flag family, the smallest, keeps 40 countries.&lt;/p&gt;

&lt;p&gt;Why 40? Six European countries have more than one current flag file in &lt;code&gt;P41&lt;/code&gt; (no end date): Belgium, Bulgaria, Hungary, Spain, Switzerland and Vatican City. Our generator only asks about a flag when there is exactly one, so those six are left out of flag questions and stay in capital and map questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Germany's 16 states: two have no capital at all
&lt;/h2&gt;

&lt;p&gt;We added a quiz on the German Länder at the same time (&lt;code&gt;wd:Q1221156&lt;/code&gt;). Three surprises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Berlin and Hamburg have no capital statement (&lt;code&gt;P36&lt;/code&gt;). They are city-states, so the state and the city are one item. A capital question would show the answer in the question anyway.&lt;/li&gt;
&lt;li&gt;Bremen's item is "Freie Hansestadt Bremen", the state, whose capital is the city of Bremen, a different item. We display the state as "Bremen" and skip its capital question for the same reason as above.&lt;/li&gt;
&lt;li&gt;Bavaria has two current flags, the lozenge flag and the striped flag, both official. Here we keep one (the first by file name) rather than drop the state, because 16 is already a small pool.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With 16 items, a day's quiz asks 16 questions, each state once, and rotates the question type so a state does not come back with the same question the next day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The query that timed out
&lt;/h2&gt;

&lt;p&gt;Our first Länder query asked for labels of the state and of its capital in one go, using the usual &lt;code&gt;OPTIONAL&lt;/code&gt; label pattern with a fallback to the &lt;code&gt;mul&lt;/code&gt; label. It returned HTTP 504 twice. The bare query (items, capital, flag, locator map) returns in under a second, and the labels in six languages come back from a second query over a &lt;code&gt;VALUES&lt;/code&gt; list. For small classes, two light queries beat one clever one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Labels are not display names
&lt;/h2&gt;

&lt;p&gt;Portuguese labels (we use the Brazilian ones first) gave "República da Irlanda" for Ireland and "Cidade de Bruxelas" for Brussels. Both are correct and both look odd as quiz choices. We keep a short override table for display names, the same way we already show "China" rather than "People's Republic of China".&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Europe quiz: &lt;a href="https://playwikicards.com/europe-quiz/" rel="noopener noreferrer"&gt;English&lt;/a&gt;, &lt;a href="https://playwikicards.com/fr/quiz-europe/" rel="noopener noreferrer"&gt;French&lt;/a&gt;, &lt;a href="https://playwikicards.com/es/capitales-de-europa/" rel="noopener noreferrer"&gt;Spanish&lt;/a&gt;, &lt;a href="https://playwikicards.com/de/europa-quiz/" rel="noopener noreferrer"&gt;German&lt;/a&gt;, &lt;a href="https://playwikicards.com/it/capitali-europee/" rel="noopener noreferrer"&gt;Italian&lt;/a&gt;, &lt;a href="https://playwikicards.com/pt/paises-da-europa/" rel="noopener noreferrer"&gt;Portuguese&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://playwikicards.com/de/bundeslaender-quiz/" rel="noopener noreferrer"&gt;Bundesländer-Quiz&lt;/a&gt; (German)&lt;/li&gt;
&lt;li&gt;How the questions are generated: &lt;a href="https://playwikicards.com/how-the-quizzes-are-made/" rel="noopener noreferrer"&gt;method page&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The facts come from Wikidata (CC0) and the images from Wikimedia Commons. If you have a better rule for transcontinental countries, I would like to hear it.&lt;/p&gt;

</description>
      <category>wikidata</category>
      <category>sparql</category>
      <category>opendata</category>
      <category>webdev</category>
    </item>
    <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;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&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;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&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;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&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;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&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;&lt;em&gt;This article was created with the help of AI.&lt;/em&gt;&lt;/p&gt;

&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>
