<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
  <title>Notes by Akbr Kanyesigye</title>
  <subtitle>Short posts about work, and the odd thing outside it.</subtitle>
  <link href="https://kanyeceejaya.github.io/notes/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://kanyeceejaya.github.io/notes/" rel="alternate" type="text/html"/>
  <id>https://kanyeceejaya.github.io/notes/</id>
  <updated>2026-09-24T08:00:00Z</updated>
  <author><name>Akbr Kanyesigye</name><uri>https://kanyeceejaya.github.io/</uri></author>
  <icon>https://kanyeceejaya.github.io/favicon.ico</icon>
  <entry>
    <title>We live in a simulation, and I have slides to prove it</title>
    <link href="https://kanyeceejaya.github.io/notes/2026-09-we-live-in-a-simulation.html" rel="alternate" type="text/html"/>
    <id>https://kanyeceejaya.github.io/notes/2026-09-we-live-in-a-simulation.html</id>
    <published>2026-09-21T08:00:00Z</published>
    <updated>2026-09-21T08:00:00Z</updated>
    <summary>My talk at Ritah's presentation night: a very serious investigation into whether we live in a simulation, with the slides to prove it.</summary>
    <content type="html">&lt;div class="body"&gt; &lt;p&gt;On Saturday night Ritah hosted a presentation night, and we went into some deep topics. My case, made with 25 slides and a straight face, was that we live in a simulation.&lt;/p&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-talk.jpg"&gt;&lt;img 30="" alt="Akbr, in a black T-shirt, presenting in a living room next to a TV that shows the slide " argument="" decoding="async" height="1170" loading="lazy" seconds.""="" src="https://kanyeceejaya.github.io/images/notes/simulation-talk.jpg" takes="" the="" width="1560"/&gt;&lt;/a&gt; &lt;figcaption&gt;Slide two: the argument takes 30 seconds.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;I wasn't the only one with evidence. One friend opened the files on boda boda riders, who turn out to be a nationwide intelligence network. Another showed that the Jim Carrey we see today is a clone.&lt;/p&gt; &lt;div class="gallery"&gt; &lt;figure&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-boda.jpg"&gt;&lt;img a="" alt="A presenter holding a laptop beside a TV that shows " boda="" decoding="async" height="1600" intelligence="" loading="lazy" network"="" secret="" src="https://kanyeceejaya.github.io/images/notes/simulation-boda.jpg" stamp."="" the="" top="" width="1200" with=""/&gt;&lt;/a&gt; &lt;figcaption&gt;The Boda Boda Intelligence Network. How does the boda guy know everything?&lt;/figcaption&gt; &lt;/figure&gt; &lt;figure&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-jim-carrey.jpg"&gt;&lt;img alt="A presenter pointing at a TV that shows " carrey="" decoding="async" files"."="" height="1600" jim="" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-jim-carrey.jpg" the="" width="1200"/&gt;&lt;/a&gt; &lt;figcaption&gt;The Jim Carrey Files, an investigation into celebrity replacement.&lt;/figcaption&gt; &lt;/figure&gt; &lt;figure&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-king.jpg"&gt;&lt;img a="" alt="A presenter in a cap, leaning on the wall beside a TV that shows " born.="" decoding="async" elected.""="" height="1560" is="" king="" loading="lazy" not="" src="https://kanyeceejaya.github.io/images/notes/simulation-king.jpg" width="1170"/&gt;&lt;/a&gt; &lt;figcaption&gt;A king is born, not elected.&lt;/figcaption&gt; &lt;/figure&gt; &lt;/div&gt; &lt;h2&gt;The argument&lt;/h2&gt; &lt;p&gt;The whole argument takes 30 seconds. We already build fake worlds, and they get better every year. Follow that far enough and you have to ask who built ours.&lt;/p&gt; &lt;h2&gt;Exhibit A: we already build fake worlds&lt;/h2&gt; &lt;p&gt;In 1972 the best graphics on Earth were two lines and a square. In 2025, Google DeepMind's Genie 3 turns a typed sentence into a world you can walk around in.&lt;/p&gt; &lt;figure class="pair even"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-04.jpg"&gt;&lt;img alt="Slide: 1972. This was the best graphics on Earth. Two lines and a square, next to a drawing of Pong." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-04.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-05.jpg"&gt;&lt;img alt="Slide: 2025. Type a sentence. Walk around inside it. AI now builds playable worlds from a prompt." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-05.jpg" width="1440"/&gt;&lt;/a&gt; &lt;figcaption&gt;Fifty-three years of progress in two slides.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;In 2023, researchers at Stanford and Google put 25 AI characters in a small digital town. One of them decided to throw a party, and the rest spread the word and showed up.&lt;/p&gt; &lt;p&gt;That's where Nick Bostrom's argument from 2003 comes in. If any civilisation can simulate minds and bothers to do it often, simulated minds will far outnumber real ones. So if you pick a mind at random, it's probably simulated. On my slide that was one pink dot in a sea of purple ones, and the question was whether you're the pink one.&lt;/p&gt; &lt;h2&gt;Exhibit B: the universe runs like software&lt;/h2&gt; &lt;p&gt;Nothing travels faster than 299,792,458 metres per second, which looks a lot like a computer's top clock speed. Physics also has a smallest useful length. That's my evidence that reality has pixels.&lt;/p&gt; &lt;p&gt;My favourite slide was about measurement. Particles stay blurry until someone measures them, and games use the same trick to save memory, because they only draw what you're looking at. The physicist James Gates even found error-correcting codes in the maths of supersymmetry, the same kind your browser uses.&lt;/p&gt; &lt;figure class="pair even"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-11.jpg"&gt;&lt;img alt="Slide: Reality has pixels. Physics has a smallest useful length, with a magnifying glass over a pixelated line." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-11.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-12.jpg"&gt;&lt;img alt="Slide: It only renders what you look at. An eye lights up one tree while another stays a dotted outline." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-12.jpg" width="1440"/&gt;&lt;/a&gt; &lt;figcaption&gt;Reality has pixels, and it only renders what you look at.&lt;/figcaption&gt; &lt;/figure&gt; &lt;h2&gt;Exhibit C: the glitches&lt;/h2&gt; &lt;p&gt;Déjà vu is the same frame loading twice. Most people remember the Monopoly man with a monocle, but he never had one, so somebody must have patched him. Astronomers have found billions of planets and nobody home, maybe because the developer only rendered us.&lt;/p&gt; &lt;p&gt;And you know the guy who walks past at the same time every day and says the same thing. That's an NPC.&lt;/p&gt; &lt;figure class="pair even"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-16.jpg"&gt;&lt;img alt="Slide: The Monopoly man never had a monocle. You remember one anyway. Somebody patched him." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-16.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-18.jpg"&gt;&lt;img alt="Slide: You know this guy. Same route. Same time. That is an NPC." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-18.jpg" width="1440"/&gt;&lt;/a&gt; &lt;figcaption&gt;A monocle that never existed, and the guy on the same route every day.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;Then came a short comic.&lt;/p&gt; &lt;figure class="strip"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-19.jpg"&gt;&lt;img alt="Comic, part 1: one stick figure asks, what if none of this is real?" decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-19.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-20.jpg"&gt;&lt;img alt="Comic, part 2: the other stick figure asks, then why does my back hurt?" decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-20.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-21.jpg"&gt;&lt;img alt="Comic, part 3: realistic physics engine. Ticket received: remove back pain. Priority: low." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-21.jpg" width="1440"/&gt;&lt;/a&gt; &lt;figcaption&gt;The ticket is still open, at low priority.&lt;/figcaption&gt; &lt;/figure&gt; &lt;h2&gt;The catch&lt;/h2&gt; &lt;p&gt;In 2020 the Columbia astronomer David Kipping ran the numbers and got roughly a coin flip. Nobody can prove any of this, which is exactly what a simulation would want.&lt;/p&gt; &lt;p&gt;For the record, the physics on the slides is real. The conclusions are mine.&lt;/p&gt; &lt;h2&gt;If you're in one&lt;/h2&gt; &lt;p&gt;I closed with some advice. Be interesting, because boring simulations get switched off. Be kind to the NPCs, since one of them could be the developer. The last slide asked everyone to rate the simulation, because five stars keeps the servers on.&lt;/p&gt; &lt;figure class="pair even"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-24.jpg"&gt;&lt;img alt="Slide: If this is a simulation. Be interesting. Be kind to the NPCs. Save often." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-24.jpg" width="1440"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/simulation-slide-25.jpg"&gt;&lt;img alt="Slide: Please rate this simulation, with five stars. Five stars keeps the servers on." decoding="async" height="810" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/simulation-slide-25.jpg" width="1440"/&gt;&lt;/a&gt; &lt;figcaption&gt;My closing advice, and a request for five stars.&lt;/figcaption&gt; &lt;/figure&gt; &lt;h2&gt;More of these, please&lt;/h2&gt; &lt;p&gt;Thank you, Ritah, for hosting. I think more friend groups should hold presentation nights, where everyone picks a topic they care about far too much and defends it with slides. If you're planning one, invite me. I'll bring slides.&lt;/p&gt; &lt;p&gt;The &lt;a href="https://kanyeceejaya.github.io/docs/We%20Live%20in%20a%20Simulation.pdf"&gt;slides are here as a PDF&lt;/a&gt;, if you'd like to present them yourself.&lt;/p&gt; &lt;/div&gt;</content>
  </entry>
  <entry>
    <title>A wedding website for Conrad and Vanessa</title>
    <link href="https://kanyeceejaya.github.io/notes/2026-09-a-wedding-website-for-conrad-and-vanessa.html" rel="alternate" type="text/html"/>
    <id>https://kanyeceejaya.github.io/notes/2026-09-a-wedding-website-for-conrad-and-vanessa.html</id>
    <published>2026-09-15T08:00:00Z</published>
    <updated>2026-09-24T08:00:00Z</updated>
    <summary>How I built the website for Conrad and Vanessa's wedding in Cape Town, for a guest list that mostly lives in Kampala.</summary>
    <content type="html">&lt;div class="body"&gt; &lt;p&gt;Conrad and Vanessa married on Friday 11 September 2026 at St George's Cathedral in Cape Town, with the reception that afternoon at Belair Pavilion in Paarl. Most of the people who love them live in Kampala, more than four thousand kilometres and one visa away. That distance shaped almost everything I built for them.&lt;/p&gt; &lt;p&gt;The site lives at &lt;a href="https://conradxvanessa.com"&gt;conradxvanessa.com&lt;/a&gt;. It started as a pledge form and grew one section at a time, until most of the wedding's paperwork ran through it. Behind it sits a small back office that the wedding committee used every day.&lt;/p&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-landing.jpg"&gt;&lt;img alt="The wedding website's home page: a photo of the couple beside the invitation, their names, the date, the ceremony and reception venues, and buttons to choose a meal or make a pledge." decoding="async" height="900" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-landing.jpg" width="1385"/&gt;&lt;/a&gt; &lt;figcaption&gt;The home page, in the couple's navy and rose gold.&lt;/figcaption&gt; &lt;/figure&gt; &lt;h2&gt;How Ugandans pay for a wedding&lt;/h2&gt; &lt;p&gt;In Uganda a crowd pays for a wedding. Friends and family meet to pledge what they can, then pay it off in the months before the day. Conrad and Vanessa launched theirs at a wedding meeting in Kampala on 15 May 2026, and most guests first reached the site through the QR codes at that meeting.&lt;/p&gt; &lt;p&gt;On the pledge form, a guest enters their details and the amount in shillings, then picks a date for a reminder. The guest gets a thank-you on WhatsApp straight away, or by SMS if WhatsApp can't reach a Ugandan number. On the reminder date, the site sends an SMS on its own. The page also lists the Mobile Money codes to pay with, and the committee members to call.&lt;/p&gt; &lt;figure class="pair"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-pledge-form.jpg"&gt;&lt;img alt="The pledge form, filled in for a made-up guest: name, phone number, email, an amount of 500,000 shillings, and a reminder date with quick buttons for 15 days, end of month and 30 days." decoding="async" height="1320" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-pledge-form.jpg" width="1400"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-pledge-card.jpg"&gt;&lt;img alt="A tall pledge card for a made-up guest, with a photo of the couple, the guest's name and the amount pledged, next to buttons to share or download it." decoding="async" height="900" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-pledge-card.jpg" width="1400"/&gt;&lt;/a&gt; &lt;figcaption&gt;The pledge form, and the card every guest gets once they pledge.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;Every pledge comes with its own card showing the guest's name and amount. There are photo designs, and a tall one for a WhatsApp or Instagram story. A pledge card on someone's status thanks them in public, and quietly invites the next person.&lt;/p&gt; &lt;h2&gt;Getting Kampala to Cape Town&lt;/h2&gt; &lt;p&gt;A wedding abroad means a visa for most Ugandan guests. The RSVP form asks the usual things, like how many are coming and which hotel they'd like. One switch opens the questions the visa needs, and lets guests join a group trip to the visa centre in June or July. Guests could change their answers through a personal link until 4 September.&lt;/p&gt; &lt;p&gt;Each guest still applied for their own visa. The site collected what the couple's team needed to write each invitation letter, and gave the committee a table to filter and export for the visa office. A help page walked guests through the process, with the forms and a checklist.&lt;/p&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-admin-visa.jpg"&gt;&lt;img alt="The Attendees and Visa page in the back office: counts of submissions, guests and letter requests, then a table of made-up guests with nationality, occupation, passport number, travel dates and whether each wants a letter." decoding="async" height="760" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-admin-visa.jpg" width="1400"/&gt;&lt;/a&gt; &lt;figcaption&gt;Guests who asked for visa help, as the committee saw them. It exports to a spreadsheet for the visa office.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;The travel pages listed six Cape Town hotels, with prices in both rand and shillings, and things to do during the five days of celebrations, 9 to 13 September.&lt;/p&gt; &lt;h2&gt;Invitations, one guest at a time&lt;/h2&gt; &lt;p&gt;The invitation cards come in four designs, some light and floral, one deep burgundy. Each card carries the guest's name in script and a QR code back to the RSVP page. The committee issued them from the back office, one guest at a time or straight from a pledge, and downloaded them as images or PDFs for printing. A whole batch could come down as one ZIP file.&lt;/p&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-invitations.jpg"&gt;&lt;img alt="Two invitation cards side by side for made-up guests: a light design with white flowers and green watercolour, and a burgundy design with red and pink flowers." decoding="async" height="960" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-invitations.jpg" width="1400"/&gt;&lt;/a&gt; &lt;figcaption&gt;Two of the four designs, printed for made-up guests.&lt;/figcaption&gt; &lt;/figure&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-admin-ecards.jpg"&gt;&lt;img alt="The card maker in the back office: a design picker, a guest name field, and download buttons beside a live preview of a burgundy invitation." decoding="async" height="900" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-admin-ecards.jpg" width="1400"/&gt;&lt;/a&gt; &lt;figcaption&gt;The card maker: pick a design and type a name.&lt;/figcaption&gt; &lt;/figure&gt; &lt;h2&gt;The committee's side&lt;/h2&gt; &lt;p&gt;Most of the work happened in the back office. The pledges page showed each guest's pledge next to what they had paid. From there the committee recorded part payments and sent reminders to many guests at once. Every message the site sent landed in one log, so nobody had to wonder whether a guest had heard from us.&lt;/p&gt; &lt;p&gt;My favourite part is the smallest. The committee already kept its pledge list in a WhatsApp group, with an emoji beside each name for paid or pending. Nobody had to retype it. They pasted the list into the back office, which read the emoji and converted any dollar pledges to shillings.&lt;/p&gt; &lt;figure class="wide"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-admin-pledges.jpg"&gt;&lt;img alt="The Pledges page in the back office: totals for pledged, collected and balance, then a table of made-up guests with amounts, payment state, reminder dates and actions." decoding="async" height="900" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-admin-pledges.jpg" width="1400"/&gt;&lt;/a&gt; &lt;figcaption&gt;Pledges in the back office, with made-up guests: the totals first, then every pledge with its payment state and reminder date.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;Committee members signed in with different roles, so some could edit records and others could only look.&lt;/p&gt; &lt;h2&gt;Built for the phone in your hand&lt;/h2&gt; &lt;p&gt;Nearly every guest arrived on a phone, usually through a QR code or a link in a WhatsApp group, so I designed every page for a phone first.&lt;/p&gt; &lt;figure class="pair phones"&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-phone-landing.jpg"&gt;&lt;img alt="The wedding website's home page on a phone." decoding="async" height="1688" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-phone-landing.jpg" width="780"/&gt;&lt;/a&gt; &lt;a class="zoom" href="https://kanyeceejaya.github.io/images/notes/wedding-phone-rsvp.jpg"&gt;&lt;img alt="The RSVP form on a phone, filled in for a made-up guest." decoding="async" height="1688" loading="lazy" src="https://kanyeceejaya.github.io/images/notes/wedding-phone-rsvp.jpg" width="780"/&gt;&lt;/a&gt; &lt;figcaption&gt;The home page and the RSVP form on a phone.&lt;/figcaption&gt; &lt;/figure&gt; &lt;p&gt;Under the hood it's plain HTML and CSS with a little JavaScript, and no framework. It began on Cloudflare Pages, with Pages Functions for the API and a D1 database. Later I moved it to a small server of its own, where a thin Node wrapper runs the same functions against SQLite. A command-line tool on that server sends the WhatsApp messages, and EgoSMS carries the texts.&lt;/p&gt; &lt;p&gt;The site grew in the open. Sections went live as the wedding needed them, nine of twelve in the end. The rest, like the guestbook, stayed behind the scenes.&lt;/p&gt; &lt;p&gt;Congratulations, Conrad and Vanessa. May the marriage outlast the website by a very long time.&lt;/p&gt; &lt;p class="aside"&gt;Every guest in these screenshots is made up, down to the phone numbers and passports. No real guest's details appear in this post.&lt;/p&gt; &lt;/div&gt;</content>
  </entry>
  <entry>
    <title>Five rules for AI over official statistics</title>
    <link href="https://kanyeceejaya.github.io/notes/2026-08-five-rules-for-ai-over-official-statistics.html" rel="alternate" type="text/html"/>
    <id>https://kanyeceejaya.github.io/notes/2026-08-five-rules-for-ai-over-official-statistics.html</id>
    <published>2026-08-04T08:00:00Z</published>
    <updated>2026-09-24T08:00:00Z</updated>
    <summary>The five conditions UBOS wrote down before releasing Sanyu, its AI assistant over official statistics, and why each one exists.</summary>
    <content type="html">&lt;div class="body"&gt; &lt;p&gt;Statistics offices across the continent are buying generative AI this year, often in a hurry. They tend to judge it by how fluent it sounds, and check whether its numbers are right later. When a model gives a confident, wrong district population, the office that published it pays for the mistake. Official statistics only matter because the public trusts the figure.&lt;/p&gt; &lt;p&gt;So before the Bureau releases Sanyu to the public, we wrote down the conditions we had to meet first. There are five, and each one came from a problem we hit while building it. They're short enough to check.&lt;/p&gt; &lt;h2&gt;1. Every figure comes from the statistical system&lt;/h2&gt; &lt;p&gt;The model chooses what to look up, and the database supplies the value. A number reaches the user only if a structured query returned it. That's the whole architecture in one sentence. The language model never writes a figure itself. It calls a typed function, and Sanyu copies the verified result into the answer word for word.&lt;/p&gt; &lt;h2&gt;2. Every figure carries its source&lt;/h2&gt; &lt;p&gt;Each value travels with its source table and survey, so a reader can trace it to the printed report. Charts draw from the same verified values as the text around them, so a picture can't disagree with its caption.&lt;/p&gt; &lt;h2&gt;3. Sanyu says no outside its data&lt;/h2&gt; &lt;p&gt;When a question goes beyond the published statistics, the right answer says so plainly. Keeping quiet about a limit counts as a bug. This one was harder to build than it sounds, because a fluent model would much rather answer.&lt;/p&gt; &lt;h2&gt;4. We publish the test results before launch&lt;/h2&gt; &lt;p&gt;A named benchmark with known answers runs on every build, along with regression tests that check exact published figures. Ours has 45 tests, including golden facts that must match the printed census tables to the digit. Anyone can see the results.&lt;/p&gt; &lt;h2&gt;5. A statistician signs&lt;/h2&gt; &lt;p&gt;A named statistician reviews any text the model writes before it goes out. The machine drafts, and the office stays the author.&lt;/p&gt; &lt;blockquote&gt;Sanyu already meets all five.&lt;/blockquote&gt; &lt;p&gt;None of these rules depends on a particular vendor or model. Any statistics office could adopt them this year, and we'd like other offices to argue with them and tell us what we missed. The details of how Sanyu meets them are in &lt;a href="https://kanyeceejaya.github.io/#p-sanyu"&gt;Sanyu's write-up&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;</content>
  </entry>
  <entry>
    <title>A week in Rome with SDMX</title>
    <link href="https://kanyeceejaya.github.io/notes/2025-10-a-week-in-rome-with-sdmx.html" rel="alternate" type="text/html"/>
    <id>https://kanyeceejaya.github.io/notes/2025-10-a-week-in-rome-with-sdmx.html</id>
    <published>2025-10-06T08:00:00Z</published>
    <updated>2026-09-24T08:00:00Z</updated>
    <summary>What we presented at the 10th SDMX Global Conference in Rome, and what we changed back home.</summary>
    <content type="html">&lt;div class="body"&gt; &lt;p&gt;Ivan Atwiine and I spent last week in Rome at the 10th SDMX Global Conference, which the Bank of Italy hosted. It ran for three days of plenaries and two days of training. The theme was "Smarter data for better insights", and the call for papers asked for exactly our kind of work: AI in statistical pipelines, and dissemination tools that people actually use.&lt;/p&gt; &lt;p&gt;We went to talk about the pipeline. Our paper, "From fragmentation to intelligence", describes how UBOS pulls data straight from source systems into one platform and checks it on the way in, before it reaches the national dashboard. Rule-based checks catch the obvious problems, and machine learning helps spot odd values in what communities submit. It's the plumbing behind everything else the Bureau now does with data.&lt;/p&gt; &lt;h2&gt;What I took home&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;SDMX works as a join key.&lt;/strong&gt; I had been treating it as a way to publish. But once two datasets share the same concepts and code lists, a question that spans both becomes cheap to answer. A chatbot over official statistics needs exactly that. Most of the work of grounding a language model is agreeing on what an indicator means, and SDMX writes that agreement down.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Validation rules can be data too.&lt;/strong&gt; The sessions on SDMX 3.0 and VTL, the validation and transformation language, treated rules as something offices share with each other. We write ours in Python scripts. Some of them should probably live next to the data instead.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Everyone struggles with scattered data.&lt;/strong&gt; Central banks and statistical offices told the same story at different sizes. The exciting demos all rested on the boring, careful part, which is people agreeing on structure. I found that reassuring, because it's the part we can control.&lt;/p&gt; &lt;p&gt;The two training days made the tooling concrete. Reading the standard is one thing. Building a dataflow next to someone who has done it a hundred times, and watching where they slow down, teaches you more.&lt;/p&gt; &lt;h2&gt;What changed back home&lt;/h2&gt; &lt;p&gt;When we got back, we started a prototype that turns tables from the demographic and health survey and the household survey into SDMX-ready structures. We define structures by table shape, so one definition covers many tables. A crosswalk of indicators tells us quickly which survey holds a given figure. It's a first step toward chatbot answers that draw on more than one survey.&lt;/p&gt; &lt;p&gt;As for Rome, it was warm, and the coffee was as good as everyone says.&lt;/p&gt; &lt;/div&gt;</content>
  </entry>
</feed>
