The most powerful medicine we have

Mike's Notes

Doing the rounds at the moment.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

11/10/2025

The most powerful medicine we have

By: A US Physician
UAMS Patient Experiences group: 01/10/2025

Note by Kristen Koll

From a US physician [And in response to those who have asked: I am still trying to confirm authorship, but the post appears to originate from UAMS Patient Experiences group (facebook page) and I’ve messaged them to see if the author can be named. Also, they confirmed in response to another query that the names are pseudonyms, so HIPAA privacy was not violated]


I know the exact pressure it takes to crack a rib during CPR. But last Tuesday, I learned a patient’s silence can break a doctor’s soul.

His name was David Chen, but on my screen, he was "Male, 82, Congestive Heart Failure, Room 402." I spent seven minutes with him that morning. Seven minutes to check his vitals, listen to the fluid in his lungs, adjust his diuretics, and type 24 required data points into his Electronic Health Record. He tried to tell me something, gesturing toward a faded photo on his nightstand. I nodded, said "we'll talk later," and moved on. There was no billing code for "talk later."

Mr. Chen died that afternoon. As a nurse quietly cleared his belongings, she handed me the photo. It was him as a young man, beaming, his arm around a woman, standing before a small grocery store with "CHEN'S MARKET" painted on the window.

The realization hit me like a physical blow. I knew his ejection fraction and his creatinine levels. I knew his insurance provider and his allergy to penicillin. But I didn't know his wife's name or that he had built a life from nothing with his own two hands. I hadn’t treated David Chen. I had managed the decline of a failing organ system. And in the sterile efficiency of it all, I had lost a piece of myself.

The next day, I bought a small, black Moleskine notebook. It felt like an act of rebellion.

My first patient was Eleanor Gable, a frail woman lost in a sea of white bedsheets, diagnosed with pneumonia. I did my exam, updated her chart, and just as I was about to leave, I paused. I turned back from the door.

"Mrs. Gable," I said, my voice feeling strange. "Tell me one thing about yourself that’s not in this file."

Her tired eyes widened in surprise. A faint smile touched her lips. "I was a second-grade teacher," she whispered. "The best sound in the world... is the silence that comes just after a child finally reads a sentence on their own."

I wrote it down in my notebook. Eleanor Gable: Taught children how to read.

I kept doing it. My little black book began to fill with ghosts of lives lived.

Frank Miller: Drove a yellow cab in New York for 40 years.

Maria Flores: Her mole recipe won the state fair in Texas, three years running.

Sam Jones: Proposed to his wife on the Kiss Cam at a Dodgers game.

Something began to change. The burnout, that heavy, gray cloak I’d been wearing for years, started to feel a little lighter. Before entering a room, I’d glance at my notebook. I wasn’t walking in to see the "acute pancreatitis in 207." I was walking in to see Frank, who probably had a million stories about the city. My patients felt it too. They'd sit up a little straighter. A light would flicker back in their eyes. They felt seen.

The real test came with Leo. He was 22, angry, and refusing dialysis for a condition he’d brought on himself. He was a "difficult patient," a label that in hospital-speak means "we've given up." The team was frustrated.

I walked into his room and sat down, leaving my tablet outside. We sat in silence for a full minute. I didn't look at his monitors. I looked at the intricate drawings covering his arms.

"Who's your artist?" I asked.

He scoffed. "Did 'em myself."

"They're good," I said. "This one... it looks like a blueprint."

For the first time, his gaze lost its hard edge. "Wanted to be an architect," he muttered, "before... all this."

We talked for twenty minutes about buildings, about lines, about creating something permanent. We didn't mention his kidneys once. When I stood up to leave, he said, so quietly I almost missed it, "Okay. We can try the dialysis tomorrow."

Later that night, I opened my Moleskine. I wrote: Leo Vance: Designs cities on paper.

The system I work in is designed to document disease with thousands of data points. It logs every cough, every pill, every lab value. It tells the story of how a body breaks down.

My little black book tells a different story. It tells the story of why a life mattered.

We are taught to practice medicine with data, but we heal with humanity. And in a world drowning in information, a single sentence that says, "I see you," isn't just a kind gesture.

It’s the most powerful medicine we have.

Pipi release cadence

Mike's Notes

The current work on building SaaS workspaces has raised the question of the Pipi release cadence. Documentation also has to be versioned. Then there is the monthly research newsletter. Here is a plan to use Fridays to create a rhythm of deadlines.

I was deeply influenced by writings from Shopify and Refactoring.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > Refactoring
  • Home > Handbook > Teams > Cadence

Last Updated

2/01/2026

Pipi release cadence

By: Mike Peters
On a Sandy Beach: 10/10/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

There have been thousands of changes to Pipi since version 9, but the official Pipi version is frozen till full automated self-management kicks in 2026. This is a description of what will happen then.

Pipi Versioning

Pipi uses Semantic Versioning <major>.<minor>.<patch>+<build>

Example

  • 9.04.23+1453455072

Build

  • Every change to a namespaced object increments the Build Number by 1
  • It is the internal system change ID
  • Daily Builds could vary from 0 to 1,000s
  • Never resets.

Patch

  • Release daily if there have been Build Number increases
  • Numbered 0-999
  • Resets when a Minor Release occurs
  • Minor documentation edits

Minor Release

  • Release 4x per year, 3 months apart on the 2nd Friday.
  • Numbered 0-99
  • Resets when a Major Release occurs
  • Documentation officially updated

Major Release

  • Release when a Minor Release backwards-incompatible change occurs, on the 2nd Friday of January, April, July or October.
  • Usually every 2-3 years
  • Numbered 1-99
  • New documentation released
  • Account migration required

On a Sandy Beach

  • Published daily
  • My notes on building Pipi, a self-organising platform to support critical infrastructure

Friday Report

  • Published every Friday 
  • A summary of the week's work is sent to other researchers.

Research Newsletter

  • Published 12x per year on the 1st Friday.
  • Numbered 1-99999
  • Dated by month and year, eg "January 2026"
  • Named by theme, eg " Design Systems Issue"

Cadence

Type What Date
Newsletter Workspace 1st Friday, January
Release 9.1.0 2nd Friday, January
Newsletter Accessibility 1st Friday, February
Newsletter
1st Friday, March
Newsletter 1st Friday, April
Release 9.2.0 2nd Friday, April
Newsletter Origins of Pipi 1st Friday, May
Newsletter
1st Friday, June
Newsletter i18n 1st Friday, July
Release 9.3.0 2nd Friday, July
Newsletter
1st Friday, August
Newsletter Open Handbook 1st Friday, September
Newsletter
1st Friday, October
Release 9.4.0 2nd Friday, October
NewsletterComplex Adaptive Systems 1st Friday, November
Newsletter
1st Friday, December

Agentic Design Patterns

Mike's Notes

This book looks interesting.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

09/10/2025

Agentic Design Patterns

By: Antonio Gulli
On a Sandy Beach: 01/10/2025

Note by Pawel Huryn
The Product Compass

A senior AI engineer at Google just dropped a 400-page book for review: Agentic Design Patterns.

It’s got everything about AI agents + code:

  • Prompting
  • MCP
  • Tools
  • RAG
  • Memory
  • Humans in the loop
  • Multi-agent
  • Guardrails
  • You name it

You can read it here (Google Drive + links to chapters): docs.google.com/documen…

Remember to pre-order (published by Springer): a.co/d/b5SxY8t (all royalties go to Save the Children).


Agentic Design Patterns

A Hands-On Guide to Building Intelligent Systems Antonio Gulli

Table of Contents - total 424 pages   = 1+2+1+1+4+9+103+61+34+114+74+5+4 11

Dedication, 1 page 

Acknowledgment, 2 pages  [final, last read done]

Foreword, 1 page   [final, last read done]

A Thought Leader's Perspective: Power and Responsibility   [final, last read done]

Introduction, 4 pages [final, last read done]

What makes an AI system an "agent"?, 9 pages [final, last read done]

Part One, (Total: 103 pages)

  1. Chapter 1: Prompt Chaining (code), 12 pages [final, last read done, code ok]

  2. Chapter 2: Routing (code), 13 pages [fina, last read done, code ok]

  3. Chapter 3: Parallelization (code), 15 pages [final, last read done, code okl]

  4. Chapter 4: Reflection (code), 13 pages [final, last read done, code okl]

  5. Chapter 5: Tool Use (code), 20 pages [final, last read done, code ok]

  6. Chapter 6: Planning (code), 13 pages [final, last read done, code ok]

  7. Chapter 7: Multi-Agent (code), 17 pages [final,  last read done, code ok], 121

Part Two (Total: 61 pages)

  1. Chapter 8: Memory Management (code), 21 pages [final, last read done, code ok]

  2. Chapter 9: Learning and Adaptation (code), 12 pages [final, last read done, code ok]

  3. Chapter 10: Model Context Protocol (MCP) (code), 16 pages  [final, last read done, code ok]

  4. Chapter 11: Goal Setting and Monitoring (code), 12 pages [final, last read don, code oe], 182

Part Three (Total: 34 pages)

  1. Chapter 12: Exception Handling and Recovery (code), 8 pages [final,  last read done, code ok]  

  2. Chapter 13: Human-in-the-Loop (code), 9 pages [final, last read done, code ok]

  3. Chapter 14: Knowledge Retrieval (RAG) (code), 17 pages [final, last read done, code ok], 216

Part Four (Total: 114 pages)

  1. Chapter 15: Inter-Agent Communication (A2A) (code), 15 pages [final, last read done, code ok]

  2. Chapter 16: Resource-Aware Optimization (code), 15 pages  [final,  last read done, code ok]

  3. Chapter 17: Reasoning Techniques (code), 24 pages [final,  last read done, code ok]

  4. Chapter 18: Guardrails/Safety Patterns (code), 19 pages [final, last read done, code ok]

  5. Chapter 19: Evaluation and Monitoring (code), 18 pages [final, last read done, code ok]

  6. Chapter 20: Prioritization (code), 10 pages [final, last read done, code ok ]

  7. Chapter 21: Exploration and Discovery (code), 13 pages [final, last read done, code ok],330

Appendix (Total: 74 pages)

  1. Appendix A: Advanced Prompting Techniques, 28 pages [final, last read done, code ok]

  2. Appendix B - AI Agentic ….: From GUI to Real world environment, 6 pages [final, last read done, code ok]

  3. Appendix C - Quick overview of Agentic Frameworks, 8 pages [final, last read done, code ok] ,

  4. Appendix D - Building an Agent with AgentSpace (on-line only), 6 pages [final, last read done, code ok]

  5. Appendix E - AI Agents on the CLI (online) , 5 pages [final, last read done, code ok]

  6. Appendix F - Under the Hood: An Inside Look at the Agents’ Reasoning Engines, 14 pages [final, lrd, code ok],

  7. Appendix G -  Coding agents, 7 pages  406

Conclusion, 5 pages [final, last read done] 

Glossary, 4 pages  [final, last read done]

Index of Terms, 11 pages  (Generated by Gemini. Reasoning step included as an agentic example) [final, lrd]

Online Contribution - Frequently Asked Questions: Agentic Design Patterns

Pre Print:>https://www.amazon.com/Agentic-Design-Patterns-Hands-Intelligent/dp/3032014018/ 

 [1] All my royalties will be donated to Save the Children

8 load balancing algorithms you should know

Mike's Notes

I found this via Neo Kim's SubStack. Very useful.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

11/01/2026

8 load balancing algorithms you should know

By: Petar Ivanov
The T-shaped Dev: 05/09/2025

A weekly newsletter sharing practical tips on React, Node, and Software Architecture. Elevate your Full-Stack JavaScript skills to the next level!.

1. Round Robin:

  • It sends each new request to the next server in a rotating order.
  • Useful when all servers have similar capabilities and you want to spread the load evenly.

2. Least Connections:

  • It directs traffic to the server with the fewest active connections.
  • Useful when servers have different workloads, balancing them more efficiently.

3. Weighted Round Robin:

  • It gives more requests to servers with higher weights or capacities.
  • Useful when some servers are more powerful and can handle more traffic.

4. Weighted Least Connections:

  • It considers both server capacity and current connections to assign requests.
  • Useful when servers differ in performance, ensuring a fair distribution.

5. IP Hash:

  • It uses the client's IP address to decide which server will handle the request.
  • Useful to keep a client connected to the same server, which is important for session consistency.

6. Least Response Time:

  • It sends requests to the server with the quickest response and fewest connections.
  • Useful to reduce delays and improve the user experience.

7. Random:

  • It picks a server at random for each new request.
  • Useful when you don't need to consider server load or differences in server capacity.

8. Least Bandwidth:

  • It directs traffic to the server using the least network bandwidth at the moment.
  • Useful when managing network usage is important to prevent congestion.


[IMG]

Image Credits: DesignGurus

How SQL JOINs work

Mike's Notes

Another gem from Neo Kim. I'm a visual learner and like the use of Venn Diagrams in the sketch.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > The System Design Newsletter
  • Home > Handbook > 

Last Updated

07/10/2025

How SQL JOINs work

By: Neo Kim
The System Design Newsletter: 01/10/2025

(explained in 2 mins or less):

  1. Inner join
    It returns rows with matching values in both tables
  2. Full outer join
    It returns all rows when there is a match in either the left or the right table
  3. Full outer exclusive
    It returns all rows from both tables with no match in the other table
  4. Left join
    It returns all rows from the left table and matched rows from the right table
  5. Left exclusive
    It returns rows from the left table with no match in the right table
  6. Right join
    It returns all rows from the right table and matched rows from the left table
  7. Right exclusive
    It returns rows from the right table with no match in the left table
  8. Cross join
    It returns the Cartesian product of both tables; every combination of rows
  9. Self join
    It joins a table with itself to compare rows within the same table

The JOIN clause lets you combine data from tables based on a related column.

What else?



Workspace URL naming pattern decision

Mike's Notes

I was able to decide on the workspace URL naming pattern after conducting some experiments over the last week.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

25/10/2025

Workspace URL naming pattern decision

By: Mike Peters
On a Sandy Beach: 06/10/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

Over the last week, I have been experimenting with different URL naming patterns. I had to devise patterns for Pipi to use when it automatically generates SaaS applications with User Interfaces (UI).

Note: The URLs below don't link to anything.

Learning from others

I looked at how common and very popular cloud products use URL naming patterns, including;

  • Google Workspace
  • MuleSoft
  • Odoo
  • Salesforce
  • ServiceNow
  • Zoho

Conclusion

I started with the simplicity of Google and ended with the richness of ServiceNow. The pattern simply needs to be predictable and consistently effective. The URLs after the  i18n codename need to be in the local language, eg French.

Components

The Pipi-generated URLs will be made up of the following parts;

  • User account, eg demo
  • Device/screen specific, eg mobile m , braille b , kiosk k , VR v
  • Platform, eg cloud.ajabbi.com
  • i18n code, eg eng-UK
  • Major version, eg 9
  • Account type, eg e for enterprise
  • Account subtype, eg a for app, s for settings
  • Industry name, eg rail
  • One or more nested industry objects, eg rolling stock
  • CRUD verbs, eg patient-new
  • Multi instances directory, eg email/e/
  • ID etc can be masked as a UUID, eg durmdis7d3kbp
  • Workflow specific, eg page/administer/ui-builder/concept

Pattern examples

  • demo.cloud.ajabbi.com/eng/9/e/a/screen/location/l/adytenm.html
  • demo.m.cloud.ajabbi.com/fra/9/e/a/écran/emplacement/e/adytenm.html

URL masking and pattern configuration

It should be straightforward for a User Account holder to mask these URLs and modify other pattern configurations.

  • m.rail.example.com/en-au/rolling-stock/rolling-stock-new/
  • m.en-au.example.com/rail/rolling-stock/new/
  • en-au.bigrail.com/rolling-stock/r/2945/history/
  • k.en-au.app.bigrail.com/rolling-stock/r/2945/history/

Industry names

Third draft revision of the Pipi 6 industry names used for English i18n URLs. This has been imported into Pipi 9 for testing purposes. The nouns are singular.

  • Agriculture: agriculture/
  • Art: art/
  • Aviation: aviation/
  • Conservation: conservation/
  • Construction: construction/
  • Drainage: drainage/
  • Electricity Supply: electricity-supply/
  • Forestry: forestry/
  • GLAM (Galleries-Libraries-Archives-Museums): glam/
  • Health: health/
  • Horticulture: horticulture/
  • Learning: learning/
  • Port: port/
  • Rail: rail/
  • Research: research/
  • Road: road/
  • Screen (was Film): screen/
  • Sewer: sewer/
  • Transport: transport/
  • Water Supply: water-supply/
  • Website: website/
  • Zoo: zoo/

Next steps

  • Begin creating full-page mockups for community testing.
  • Adjust as necessary

Using free tiers on the cloud

Mike's Notes

A job starting in the next few months. I'm gathering information for now.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

12/10/2025

Using free tiers on the cloud

By: Mike Peters
On a Sandy Beach: 05/10/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

I need to learn how to work with multiple cloud platforms. Many offer a generous free tier for learning and production. Initially, I thought I would do all the available training and just build things.

Then move part of the Ajabbi/Pipi infrastructure to all of these platforms, staying within the free-tier limits.

This means being able to use MSSQL, Postgres, Oracle, MySQL, etc. And being familiar and confident with multiple languages like .NET, PHP, Java, Python, Go, etc

VMs, Kubernetes, Docker, et al.

This is preparation for when paying customers decide to use Pipi as part of their enterprise SaaS, on their platform of choice. At least I will be ready.

Known available free tiers (more to come)

  • Alibaba Cloud
  • AWS
  • Azure
  • Cloudflare
  • Container Hosting Service
  • DigitalOcean
  • Google Cloud
  • Hetzner Cloud
  • IBM Cloud
  • JFrog
  • Linode
  • Netlify
  • OpenShift
  • Oracle Cloud
  • OVHcloud
  • Render
  • Salesforce
  • Tencent Cloud
  • Vercel
  • Wasabi
  • Zeabur

Documenting your data: WordPress case study, pt. 1

Mike's Notes

Another very useful article by Alexey Makhotkin.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library > Subscriptions > Minimal Modelling
  • Home > Handbook > 

Last Updated

04/10/2025

Documenting your data: WordPress case study, pt. 1

By: Alexey Makhotkin
Minimal Modelling: 01/10/2025

I started working with databases around 1996. The idea of this Substack has been brewing for few years already.

Super-short CV: software developer (+database administrator) — team lead — project manager — head of software development (150+ people) — burned out — dinosaur.

240 tables and no documentation: making sense of your database.

A very common question I see on database-related forums goes something like:

“At my new place of work, there is a database with hundreds of tables, barely any documentation, and I need to understand it to do my job: running SQL queries.

[additional complications are usually described]

Any advice on how should I approach this problem?”

You could answer that question on different levels, but I’d like to discuss an approach that is focused on the immediate situation that this person is in. How to organize the company’s data management processes is a bit above our pay grade here.

A problem

Suppose that you’ve recently joined a new company as a data engineer, business analyst, or some such. Basically your job is to create reports of all sorts, building queries, pipelines etc. A very common situation is that there are a lot of tables (say, a few hundreds), and a very limited amount of documentation. Sometimes you have access to people who’ve worked at the company for quite some time, but they are not readily available for advice. Usually there are also several different databases: say, an OLTP database in Postgres, MySQL or Oracle, and a copy of that in some sort of data warehouse, sometimes in many different versions.

How do you start learning what is what in the database? What sort of data is there, how is it stored, how reliable is the data, how clean, etc., etc?

A knee-jerk approach is to document the tables and their columns. This is what’s often considered the data catalog. Unfortunately, if you try this you’ll find that this approach does not work. In a follow-up article we’ll discuss why, but let’s focus on an approach that may have a better chance of working for you.

Case study: WordPress

Let’s use a real-world database as an example: a WordPress database schema. The official description could be found on https://codex.wordpress.org/Database_Description. This page has everything that is traditionally used to document databases:

  • a physical ERD diagram;
  • an overview of tables;
  • a detailed table structure (in a tabular format);

We could also consult a more compact database schema expressed as a sequence of SQL CREATE TABLE statements: https://gist.github.com/squadette/3bafa201a04f1372d69c182f206f8975.

We’re going to use a different approach based on Minimal Modeling (https://minimalmodeling.com/).

We’ll be documenting the database using a four-part catalog in a tabular format:

  • list of anchors;
  • list of attributes;
  • list of links;
  • list of secondary data.

We’ll work incrementally. In the first part we’ll show how to document just a few of each data element: anchors, attributes and links, just enough to illustrate the approach. In the follow-up posts, we’ll build the complete database documentation.

It’s not necessary to build the full design upfront. This helps you deal with large databases: you need to document only the parts that you are directly interested in. The entire data catalog is structured in such a way that you can easily document additional data elements.

Anchors first

We start with anchors (also known as entities). Anchors are nouns, but not every noun is an anchor. To find anchors, we need to look for things that could be added and counted.

Let’s look at the list of tables:

mysql> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.00 sec)

The most common anchor is probably User (we found it in the wp_users table). It’s easy to confirm that users could indeed be added and counted:

  • We have 100 users in our database.
  • One more user has just registered.

Such sentences sound trivial in simple cases, but would become useful in more complicated cases. Hopefully, later we’ll find an example of such in WordPress.

WordPress is a content management system, and the most common type of content is Post and Comment. Both posts and comments could be added and counted. Let’s add those three into the first part of our Minimal Modeling catalog:

The first column is an anchor name; you choose anchor names according to the business vocabulary. They do not necessarily match table names (table names are often unclear or misleading).

The second column documents ID type; in this case it’s “bigint”, an SQL data type. If you have more interesting IDs you could also provide examples of IDs so that you could better recognize them in data. In most cases, of course, the IDs are pretty opaque: just some integers or UUIDs.

The third table contains an SQL query fragment that returns all the IDs of the corresponding anchor, and nothing else. So if we have ten users, the query would return ten different IDs of those users.

Here we begin to see some interesting details, for example the fact that Comment uses a different naming convention for the ID column than the other two.

Three anchors is enough for the start, now let’s look at some attributes.

Attributes

Let’s document a couple of attributes for each anchor. Attributes contain the actual data: strings, numbers, yes/no values, and so on. Note that attributes cannot contain anchor IDs (this is handled by links, see below).

Let’s look at the definitions of wp_users, wp_posts and wp_comments, and find some simple attributes. If we look at the real data in a test WordPress installation, it’s easy to see which data goes where.

The first column is the attribute name. It combines the name of the anchor and some short readable name of the attribute. You can use this string to refer to the specific attribute in other documentation, or just during the discussion.

Note that the attribute name is only remotely related to the column name where the attribute is stored.

The second column of our table contains the most important piece of documentation: a question. We use questions for every attribute. In casual speech people would often just say something like “Name of the User”, or “Item price”, but we take one step further and provide longer and more unambiguous description. Questions help you to document the semantics of less trivial attributes. Additionally, it helps LLMs to understand what exactly is stored here.

The third column is an example value. Practice shows that even a single representative sample of data immediately help with understanding a piece of data. That’s how you can see, for example, that the login name of the User is clearly machine-readable, or that Comment/posted_at has the granularity of one second.

Column #4 is the physical data type. Here we just use normal SQL data types, as defined in your schema.

Finally, SQL query. It needs to return a dataset with exactly two columns: anchor ID and the attribute value. The queries presented here are simple, but you can also extend them to show how to clean the data. We’ll discuss data quality later.

Links

Links roughly correspond to relationships. Links connect two anchors using a verb. Let’s write down all the links that we have between our three anchors so far:

  • User publishes a Post;
  • User posts a Comment;
  • Post has Comments;

How did we find those links? Because we, as users, understand how WordPress works. To make sense of the database, you should have some understanding of the business. As you explore the database schema and present it as the Minimal Modeling catalog, you’ll get more detailed understanding.

Each link has an associated SQL query. This query must return exactly two columns: an ID of the first anchor and an ID of the second anchor.

Let’s discuss each of the columns in that table. The first column contains names of both anchors and the main verb that connects them. Both anchors must be present in the list of anchors that we have.

In our example the anchors are different, but they could also be the same: for example, “An Employee is a manager of another Employee”.

The second column shows link cardinality. In Minimal Modeling, we use only three options:

  • 1:N;
  • M:N;
  • 1:1.

In column #3 we describe the link in a more verbose, slightly formalized way. We write down TWO sentences, one in each direction. We use the words “only one” and “several”: this helps us to confirm the cardinality of the link (we avoid using word “many”).

For example, “several Posts” means that the Post anchor is on the N-side of cardinality, “only one User” means that User is on the 1-side.

Here all three links are 1:N, but we hope to try and find some M:N and 1:1 links later in our investigation.

Finally, we have a column that contains an SQL query for each link. Note that this query must return clean data: two valid IDs, no NULLs or anything like that.

Taking the first link, “User / publishes / Post”, as an example, here is how its table is defined:

CREATE TABLE `wp_posts` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_author` bigint(20) unsigned NOT NULL DEFAULT ‘0’,
. . . .
);

See that the “post_author” column is defined as NOT NULL, but then it immediately allows using a value of 0 to, apparently, mean that the post has no author. We must make sure that only valid IDs are returned, so we filter out NULLs and other sentinel values (e.g., “WHERE post_author <> 0”).

That’s enough data elements for the first part. We’ll continue assembling the data catalog in the following article.

Tooling

To use this approach, you need to maintain four tables. Here we show anchors, attributes, and links, but there is also secondary data, more on that later.

There is no “official” tooling at the moment, but you can use any spreadsheet-like tool that is convenient. Most probably you want to use a collaborative tool, but in some cases even having private notes about the database is what you need.

You can use Google Docs, like I do as I write this document. You can use Notion, Roam, or Obsidian. You can use any Wiki that has good support for tabular data, or even Markdown.

Early adopters of Minimal Modeling use Grist, and I guess that Airtable or something similar would also work great. You can use Google Sheets too, or Excel.

Process

The idea is that you never try to do big modeling upfront. Instead you start just with a handful of data elements in a shared document, and add new entries as needed.

For example, as you work on some query, you learn about some new tables and columns that are not yet documented. So you document them: do they contain a new anchor? A new attribute? A new link?

Note that sometimes a single database table column can store many different attributes. The most common example here is EAV (Entity-Attribute-Value approach).

Note that the catalog tables could be extended with the extra information that you’re interested in. For example, in many companies it makes sense to keep track which of the attributes contain personally-identifiable information (PII), or other regulated data, such as financial information. You can just add another column in the “attributes” table, and enter the required information.

It takes three pieces of data to describe and anchor, five for the attribute, and four for the link, so adding a new entry should take less than five minutes.

What’s next

That was a short introduction into documenting your database using the Minimal Modeling approach.

In the following posts we’ll continue exploring WordPress database schema. The end goal is to have a complete description, covering every single table and column.

Also, we’ll discuss the Minimal Modeling approach in more detail, as related to understanding your existing database. Particularly, we’ll see how to handle multi-database cases, both for primary data and for secondary (analytical) data, like data warehouses.

Domain Model Templates

Mike's Notes

This is my first attempt to define a Domain Model Template.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook >

Last Updated

03/10/2025

Domain Model Templates

By: Mike Peters
On a Sandy Beach: 03/10/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

An industry application, as defined by Pipi, can be filtered and constrained by a Domain Model Template. This creates a custom model with workflows, properties, and i18n for a specific use. A bit like different Lego models built out of the same bricks.

Examples

The screen industry application includes these templates

  • Feature Film
  • Short Film
  • Documentary
  • Live Broadcast
  • Film Studio

The health industry application consists of these templates

  • Family Doctor
  • Hospital
  • Public Health
  • Allied Health
  • Personal Health

Industry object

For the same Industry application, Domain Model Templates may use different collections of industry objects. The UI control menus can differ. Workspace URLs are not always changed by these templates, but can be.

Pipi digital twin

The underlying industry digital twin, Pipi, captures the entire picture, using a world model, regardless of the specific Domain Model Templates in use.

User Accounts

A User Account using a Domain Model Template sees only part of the whole. The account pays only for the actual usage of that part of the digital twin.

User account types and workspace URLs

Mike's Notes

My notes to make explicit how workspace URLs work with different user account types. I tend to make these sorts of decisions as late as possible, when the correct choice becomes very obvious.

Resources

References

  • Reference

Repository

  • Home > Ajabbi Research > Library >
  • Home > Handbook > 

Last Updated

08/11/2025

User account types and workspace URLs

By: Mike Peters
On a Sandy Beach: 02/10/2025

Mike is the inventor and architect of Pipi and the founder of Ajabbi.

My work this week has been focused on determining the naming pattern for workspace URLs. The pattern can differ by user account type.

User Account Types

  • Agent
  • Developer
  • Enterprise
  • Personal
  • Research
  • SME
  • Temp

Agent Account

  • Always in credit and paid by usage.
  • For Pipi to self-manage.
  • Utilises a swarm of Pipi hosts operating within an ecosystem.
  • i18n English-UK URLs.
  • "a" prefix.
  • Uses agent-tenanted workspaces.
  • Uses raw codename patterns in the workspace URL naming.
  • It is a digital twin.
  • Permanent.

Developer Account

  • Always in credit and paid by usage.
  • For developers to support enterprise accounts.
  • Uses a dedicated Pipi host.
  • i18n URLs available.
  • "d" prefix.
  • Uses sole-tenanted workspaces.
  • Uses selectable patterns in the workspace URL naming.
  • No digital twin. Works with customer digital twins.
  • Permanent.

Enterprise Account

  • Always in credit and paid by usage.
  • For large organisations with huge systems.
  • Uses dedicated Pipi hosts.
  • i18n URLs available.
  • "e" prefix.
  • Uses sole-tenanted workspaces.
  • Uses customised patterns in the workspace URL naming.
  • Dedicated digital twin.
  • Permanent.

Personal Account

  • Free.
  • Everyone who gets a username and password.
  • Shares a common Pipi host.
  • i18n URLs available.
  • "p" prefix.
  • Uses a multi-tenanted workspace.
  • Uses standard patterns in the workspace URL naming.
  • Shared digital twin.
  • Permanent.

Research Account

  • Always in credit and paid by usage.
  • For researchers to train Pipi.
  • Uses a dedicated Pipi host.
  • i18n URLs available.
  • "r" prefix.
  • Uses sole-tenanted workspaces.
  • Uses raw codename patterns in the workspace URL naming.
  • Dedicated digital twin.
  • Permanent.

SME Account

  • Always in credit and paid by plan.
  • For small organisations or businesses that want to use simple apps.
  • Shares a common Pipi host.
  • i18n URLs available.
  • "s" prefix.
  • Uses multi-tenanted workspaces.
  • Uses standard patterns in the workspace URL naming.
  • Shared digital twin.
  • Permanent.

Temp Account

  • Free.
  • For temporary users who need to do something without creating an account.
  • No Pipi host.
  • i18n URLs available.
  • "t" prefix.
  • Uses a multi-tenanted workspace.
  • Uses standard patterns in the workspace URL naming.
  • No digital twin.
  • Temporary.