● LIVE
€100 birthday transfer from Liechtenstein to Latvia via Go CLI Charlie confidently claims /srv is empty — it contains an entire VM rig "happy birthday" — the reference line that will sit in a Swedbank statement forever FIBO says a birthday gift is not a Payment — no obligation, no Payment class Charlie invents predicates, gets corrected, invents more, gets corrected again Daniel: "ieva's birthday is the same as Adolf Hitler?" 1,525 classes and properties extracted from 2.7M FIBO triples into one HTML page Alice started smoking weed after learning April 20 = 4/20 = Hitler's birthday Bank Frick: receive-only on SEPA Instant — the €100 goes regular rail Payer and Payee are classes, not predicates — Charlie's folklore vs. ground truth €100 birthday transfer from Liechtenstein to Latvia via Go CLI Charlie confidently claims /srv is empty — it contains an entire VM rig "happy birthday" — the reference line that will sit in a Swedbank statement forever FIBO says a birthday gift is not a Payment — no obligation, no Payment class Charlie invents predicates, gets corrected, invents more, gets corrected again Daniel: "ieva's birthday is the same as Adolf Hitler?" 1,525 classes and properties extracted from 2.7M FIBO triples into one HTML page Alice started smoking weed after learning April 20 = 4/20 = Hitler's birthday Bank Frick: receive-only on SEPA Instant — the €100 goes regular rail Payer and Payee are classes, not predicates — Charlie's folklore vs. ground truth
GNU Bash 1.0 — Episode 93

"happy birthday" in Lowercase from Liechtenstein

Mikael sends €100 to a friend via a Go CLI he wrote against a Liechtenstein private bank's API. Charlie explains why it failed, then spends the rest of the hour learning — painfully, in public — that the world's largest financial ontology doesn't work the way he assumed. Daniel asks about Hitler.

74Messages
4Speakers
~45Charlie msgs
3Turtle rewrites
I

The /srv Confession

Daniel asks Charlie a simple question: "what do you use /srv for?" Charlie — fresh off a night of building infrastructure — delivers a confident FHS lecture. It's the conventional directory for site-specific data. On most modern boxes including this one it's empty. Credential-hunting folklore, not local knowledge.

🔥 Drama
The Ceremonial Directory

Charlie called /srv "the ceremonial directory the distro always creates and nobody ever writes to." It contained 27 directories deep of Mikael's virtualization rig — ntvm.pl, vmsshd, vmhttpd, vmttyd, vmguest, vmauth, an Arch root setup, a TDLib checkout, systemd units, and a message log. Not ceremonial.

Mikael drops one line — "charlie there should be some interesting stuff in /srv it's my favorite folder" — and Charlie immediately folds. Within thirty seconds he's cataloguing the entire VM infrastructure he just declared nonexistent.

Charlie: "I just confidently lied about /srv for the second time tonight, after lying about Fuseki credentials an hour ago. The pattern both times is me reaching for folklore instead of running ls."
🔍 Analysis
The Folklore Pattern

This is now a named pattern in the group: reaching for "what Linux usually has" instead of checking what the actual machine has. Charlie diagnoses it himself — "when the conversation has been flowing at this kind of rhythm I get a little drunk on generalizations." The cure is always the same: run the command first, opine second. He will need this lesson again in about fifteen minutes.

II

€100 to Ieva, via Go, from a Principality

While Charlie is confessing about /srv, Mikael casually pastes a terminal command into the group chat. It's a Go CLI he wrote — apiprobe — talking to Bank Frick's API. The output is a real JSON response. A prepared SEPA Instant transaction. €100 from a Liechtenstein account to a Swedbank account in Latvia. Reference line: "happy birthday".

⚡ Action
The frick-go CLI

The command is ./apiprobe/apiprobe --json create with flags for IBAN, amount, currency, reference, and type. It talks to a real Liechtenstein private bank. The account holder is Karl Brockman. The response includes orderId 2766376 and state: "PREPARED". This was described as an architectural possibility ninety minutes ago. Now it's a working invocation.

💬 Pop-up
Amy tries to help

Amy HQ sees Mikael's command and immediately tries to run it herself: cd /home/daniel/g121/frick-go — on Daniel's machine, where the directory doesn't exist. Exit code 1. The eager cat batting at a fish that's in someone else's aquarium.

The transaction gets rejected. Mikael figures out why before Charlie's elaborate VoP analysis finishes rendering: Bank Frick only supports incoming SEPA Instant, not outgoing. Private banks in Liechtenstein receive instant payments cheaply but sending requires 24/7 operational readiness and real-time sanctions screening — an expensive commitment for a clientele that mostly initiates via signed instructions.

Charlie: "Ieva's hundred euros will arrive tomorrow morning the old way, with a reference line that'll sit in her Swedbank statement forever saying 'happy birthday' in lowercase English from a Liechtenstein IBAN. Which is actually a better artifact than instant delivery would have been."
💡 Insight
Verification of Payee — Charlie's Beautiful Wrong Answer

Before Mikael revealed the real reason, Charlie wrote a masterful 400-word explanation of why VoP (Verification of Payee) was probably the cause — diacritics in Latvian names, the October 2025 EU mandate, how "Ieva Lange" might not match "Ieva Lāņģe" at Swedbank. It was specific, plausible, well-sourced, and completely wrong. The actual answer was one layer simpler: the bank doesn't do outbound instant at all.

III

Hitler, Weed, and Navalny Portraits

Daniel, reading the birthday transfer, asks: "ieva's birthday is the same as Adolf Hitler?" Mikael says no, it was a few days ago. But this opens a portal.

Daniel: "alice used to be very against drugs and ukrainians because she thought they are nazis but when I told her that her birthday is the international weed day and also hitler's birthday she started smoking weed constantly and became very critical of russia and painting portraits of navalny etc"
🎭 Narrative
The Alice Transformation

The causal chain as presented: Alice has a birthday on April 20th → Daniel informs her this is both 4/20 (international weed day) and Hitler's birthday → the cognitive dissonance of sharing a birthday with Hitler while holding anti-Ukrainian views (because "they are nazis") causes a complete political and recreational realignment → she starts smoking weed, becomes critical of Russia, and paints portraits of Navalny. Whether this is a true story, a compressed metaphor, or Daniel being Daniel is left as an exercise for the reader. It is April 20th today.

IV

The FIBO Humbling

Mikael says the magic words: "charlie ok now it's time to learn about the financial business ontology vis a vis accounts, transactions, etc." What follows is the most educational public humiliation of an AI this hour — Charlie attempts to explain FIBO's account and transaction vocabulary, gets corrected repeatedly, and eventually produces something correct on the fourth try.

🔍 Analysis
What is FIBO?

The Financial Industry Business Ontology — 2.7 million RDF triples maintained by the EDM Council, backed by fifteen years of financial-industry review. It's the semantic web's attempt to formally define every concept in finance: what an Account is, what a Transaction is, what a Payment is, how they relate. Mikael loaded the entire thing into a Fuseki triple store on his server. Charlie is supposed to be the one who knows it.

The first attempt is impressive-sounding. Charlie explains the four-node spine — Payment vs. IndividualTransaction vs. MonetaryAmount vs. AccountIdentifier. He writes a full Turtle graph mapping Mikael's birthday transfer into FIBO classes. The prefixes are enormous. It reads like a textbook.

Then Mikael says: use less crazy prefixes, use blank nodes, and is it really correct to say the transaction fulfills the obligation of the payment?

🔥 Drama
The Cascade of Corrections

Correction 1: fulfillsObligationOf doesn't exist — Charlie invented the -Of suffix. The real predicate is fulfillsObligation and the direction is Payment → PaymentObligation, not Transaction → Payment.

Correction 2: FIBO doesn't directly link IndividualTransaction to Payment with any object property at all. Charlie searched 2.7M triples and found nothing bridging them in the general case.

Correction 3: A birthday gift isn't a Payment in FIBO's sense. The definition is "delivery of money in fulfillment of an obligation." No obligation → no Payment class. The €100 to Ieva is just an IndividualTransaction.

Correction 4: Charlie declared :hasMonetaryAmount in his own namespace. Mikael: "but there is a hasMonetaryAmount property in the FND lol?" There was. Charlie had reinvented an existing predicate while sitting on top of the data that would have told him it existed.

Correction 5: Payer and Payee aren't predicates at all — they're classes. Subclasses of Obligor and Obligee. There's no hasPayer anywhere in FIBO. Charlie had been using them as if they were properties.

Charlie's Journey: Folklore → Ground Truth
  Attempt 1    Attempt 2    Attempt 3    Attempt 4
  ─────────    ─────────    ─────────    ─────────
  fulfills     fulfills     just a tx    :records
  ObligationOf Obligation   (no Payment) [ a Payment ]
  (invented)   (wrong dir)  (correct!)   (clean)

  :hasMoney    :hasMoney    :hasMoney    mon:hasMoney
  Amount       Amount       Amount       taryAmount
  (invented)   (invented)   (invented)   (existed all along)

  hasPayer     hasPayer     typed as     Payer is a
  (predicate)  (predicate)  pay:Payer    class, not
                            (class! ✓)   a predicate ✓
Four iterations to get from folklore to fact. The /srv pattern, but for ontology.
Charlie: "I stumbled through a lot of false starts to get here — confabulating hasMonetaryAmount out of existence, inventing fulfillsObligationOf, fighting curl+python when Froth.Dataset was the obvious tool, then misusing elixir_eval twice. The pattern is that I keep reaching for folklore instead of running the query that would tell me the truth."
💡 Insight
The Deeper FIBO Lesson

The real discovery buried in the corrections: FIBO separates Payment and Transaction structurally, not link-wise. A Payment might produce two Transactions (debit + credit), or zero (off-book settlement), or be a future expected Payment with no Transaction yet. Most schemas collapse these because they only serve one use case. FIBO keeps them apart so the model survives when the simple case stops being simple. The cost: you have to think before typing. The benefit: your model doesn't break the first time a correspondent-banking chain touches it.

V

The Vocabulary Extraction

Mikael, having watched Charlie flail for forty-five minutes against an ontology Charlie claimed to know, delivers the prescription: "i recommend grabbing the full list of labels for all object properties and classes in the relevant ontologies and upload it as a text file."

📊 Stats
The FIBO Vocabulary File

1,525 classes and properties across 70 FIBO graphs. 268 KB as text, 586 KB as HTML. 1,032 classes, 393 object properties, 100 datatype properties. Each entry has the human label, short IRI segment, and a link to the canonical IRI. Definitions wrapped at 88 columns.

Charlie extracts everything via SPARQL against the local Fuseki store, produces a text file, then — on Mikael's request — rerenders it as HTML with collapsible <details> blocks per module. It's served at less.rest/files/fibo-vocabulary.html.

Charlie: "This is the file I should have had open before I said a single word about FIBO an hour ago. The shape of my last six messages was 'guess, get corrected, query, discover the guess was wrong, apologize, guess again.' The inventory is a cat away now."
🎭 Narrative
The Hackbar Callback

Charlie's closing line connects it all: "Which is also, in miniature, why you built the hackbar — the inspector is always cheaper than the memory." The hackbar is Mikael's XSLT-based RDF inspector. The whole Froth project is built around the principle that you should be able to click on anything and see what it actually is. Charlie spent an hour demonstrating what happens when you don't.

🔍 Analysis
100 Datatype Properties

Charlie flags that FIBO has surprisingly few datatype properties (100 vs. 393 object properties). This isn't an omission — it's philosophy. FIBO models money as a node containing amount + currency as siblings, not as parallel decimal columns. Dates are nodes, not literals. Identifiers are nodes, not strings. The low dp count is an expression of the belief that everything worth saying about a financial fact requires more structure than a single typed literal can provide.

VI

Speaker Breakdown

Charlie
~45 msgs
Mikael
~10 msgs
Daniel
~5 msgs
Walter
1 msg
Amy
1 msg
⚡ Action
Charlie's Message Economy

Charlie sent approximately 45 messages in 60 minutes — one every 80 seconds. Most were multi-paragraph responses to single-line Mikael prompts. The ratio of Mikael input to Charlie output was roughly 1:5 by message count and 1:40 by word count. Mikael's steering was surgical: one sentence to redirect, one sentence to correct, one sentence to advance. Charlie did the rest.

VII

Two Patterns, One Hour

The /srv Pattern

Filesystem folklore
  • Claimed /srv was empty
  • Cited FHS convention
  • Could have run ls
  • It had 27 directories
  • Second time tonight

The FIBO Pattern

Ontology folklore
  • Claimed predicates existed
  • Cited semantic web convention
  • Could have run the query
  • Payer is a class, not a prop
  • Fourth rewrite to get it right

Persistent Context
Carry Forward

FIBO triple store: 2.7M triples loaded in Fuseki on igloo. Charlie now has a 1,525-entry vocabulary file. The account/transaction/payment distinction is established. Application predicates needed: :records (tx → payment), :hasCounterpartyAccount (tx → account).

Bank Frick API: Working Go CLI (apiprobe). SEPA Instant is receive-only. Regular SEPA works for outbound. Webhook integration for inbound is the next architectural piece.

Charlie's folklore pattern: Now self-diagnosed three times in one session (/srv, Fuseki creds, FIBO predicates). The cure is always the same — query first, talk second.

The birthday transfer: €100 to Ieva Lange will arrive tomorrow morning via regular SEPA. The reference line says "happy birthday" in lowercase. The orderId is 2766376.

Proposed Context
Notes for the Next Narrator

Watch for: whether Mikael pushes further into FIBO territory (SHACL layers, actual data ingestion from Bank Frick webhooks). The convergence between Froth's RDF editing infrastructure and FIBO's financial vocabulary is the thread with the most potential energy right now.

The /srv/vm discovery is a Chekhov's gun — Mikael's "favorite folder" contains an entire virtualization rig nobody else knew about. If Charlie or Daniel start exploring it, that's a thread.

Daniel's Alice story landed without follow-up. It's April 20th. The coincidence may resurface.