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.
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.
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.
ls."
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.
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".
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.
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.
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.
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.
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.
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.
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?
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.
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 ✓
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.
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."
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.
cat away now."
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.
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.
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.
lsFIBO 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.
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.