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.

Workspace URL examples

Mike's Notes

Today, I'm diving deep into the existing configuration settings for industry domain-based applications. They were done for Pipi 6 and 7, which is a while ago. They now need to be edited and migrated into Pipi 9. Work on creating the workspace UI can then begin. Eventually, Pipi 9 will no longer be headless.

Resources

References

  • Reference

Repository

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

Last Updated

25/10/2025

Workspace URL examples

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

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

This is a working draft and subject to change as I experiment. I need to test this across multiple diverse industries to ensure it works automatically and reliably.

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

General Notes

  • Industry object names can be aliased to conform to industry-specific terms, depending on the parent industry name. Hence, Stock in a Plant Nursery has a different meaning than Rolling Stock in Rail.
  • Applying i18n will change the URLs. However, the underlying ASCI code names remain the same.
  • Unique ASCI code names to avoid namespace collisions.
  • These URLs are for logged-in users.
  • Style Guide: Use plural or singular names? Are they all nouns?
  • Each of these industry names has a corresponding three-letter code. They could also be used for the URLs. eg, cst/ for construction, but not very user-friendly.
  • Ajabbi subdomain name options: workspace, app, cloud, or wsp. I think I will go with "cloud". It is shorter than "workspace". The term workspace can be used as a noun to describe what cloud.ajabbi.com is.

Industry names

Second draft revision of the Pipi 6 industry names used for English i18n URLs. The final revision will be 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/
  • Learning: learn/
  • Health: health/
  • Horticulture: horticulture/
  • Port: port/
  • Rail: rail/
  • Research: research/
  • Road: road/
  • Screen (was Film): screen/
  • Sewer: sewer/
  • Transport: transport/
  • Water Supply: water-supply/
  • Website: website/
  • Zoo: zoo/

Industry objects

First draft revision of the Pipi 7 industry names used for URLs. Industry domains can be combined with industry objects, provided that this is allowed by schema constraints. Final revision will be imported into Pipi 9.

  • Task: task/
  • Settings: settings/
  • Person: person/
  • Script: script/
  • Storyboard: storyboard/
  • Shot list: shot/
  • Shooting schedule: schedule/
  • Prop: prop/
  • Location: location/
  • Location: location/l/
  • Set: set/
  • Crew: crew/
  • Wardrobe: wardrobe/
  • Rolling Stock: rolling-stock/
  • Budget: budget/
  • Loan: loan/
  • Mail: email/
  • Mail: email/inbox/
  • Mail: email/inbox/i/
  • Patient: patient/

Default Enterprise "e" deployment examples

The URL pattern is /e/industry name/industry object/

  • demo.cloud.ajabbi.com/eng/9/e/aviation/aircraft/
  • demo.cloud.ajabbi.com/eng/9/e/aviation/airport/
  • demo.cloud.ajabbi.com/eng/9/e/aviation/airspace/
  • demo.cloud.ajabbi.com/eng/9/e/aviation/cargo/
  • demo.cloud.ajabbi.com/eng/9/e/aviation/flight/
  • demo.cloud.ajabbi.com/eng/9/e/aviation/passenger/
  • demo.cloud.ajabbi.com/eng/9/e/glam/collection/
  • demo.cloud.ajabbi.com/eng/9/e/glam/loan/
  • demo.cloud.ajabbi.com/eng/9/e/glam/9/event/
  • demo.cloud.ajabbi.com/eng/9/e/rail/booking/
  • demo.cloud.ajabbi.com/eng/9/e/rail/freight/
  • demo.cloud.ajabbi.com/eng/9/e/rail/rolling-stock/new/
  • demo.cloud.ajabbi.com/eng/9/e/rail/track/
  • demo.cloud.ajabbi.com/eng/9/e/screen/budget/
  • demo.cloud.ajabbi.com/eng/9/e/screen/location/
  • demo.cloud.ajabbi.com/eng/9/e/screen/scritp/
  • demo.cloud.ajabbi.com/eng/9/e/sewer/network/
  • demo.cloud.ajabbi.com/eng/9/e/website/wiki/page-edit/

    Additional examples

    Use more levels if required.

    • demo.cloud.ajabbi.com/eng/9/e/health/email/inbox/
    • demo.cloud.ajabbi.com/eng/9/e/health/email/inbox/i/

    Workspace URL naming pattern

    Mike's Notes

    I'm working out a pattern to use for naming workspace URLs. This is part of the current build roadmap.

    Resources

    References

    • Reference

    Repository

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

    Last Updated

    21/11/2025

    Workspace URL naming pattern

    By: Mike Peters
    On a Sandy Beach: 30/09/2025

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

    Logged-in Ajabbi users will be able to use web-based applications called a workspace. Each application requires a URL that follows a predefined pattern.

    Again, this is a work in progress and is likely to change, especially as it addresses performance, usability, security, and privacy issues.

    Here are examples used by other companies.

    Google Workspace example URLs

    • https://calendar.google.com/calendar/u/0/r/week
    • https://calendar.google.com/calendar/u/0/r/month
    • https://mail.google.com/mail/u/0/#inbox
    • https://mail.google.com/mail/u/0/#sent
    • https://draft.blogger.com/blog/posts/jsdksjdksJK;Sjk;SJDKsjd/
    • https://draft.blogger.com/blog/post/edit/hhddfddfd/
    • https://docs.google.com/document/d/5fd8f5/
    • https://contacts.google.com/directory
    • https://contacts.google.com/person/123456789/
    • https://groups.google.com/all-groups
    • https://groups.google.com/g/ontolog-forum
    • https://groups.google.com/g/ontolog-forum/c/coj8JqR6nzw

    Zoho Office Suite example URLs

    • https://www.zoho.com/mail/
    • https://accounts.zoho.com.au/signin?

    Service Now example URLs

    • <instance>.service-now.com/now/cmdb/relationship-health-dashboard/
    • https://www.servicenow.com/docs/bundle/zurich-healthcare-life-sciences/page/product/healthcare-life-sciences/concept/hcls-cto-care-team-portal.html
    • <instance>.service-now.com/now/servicenow-studio/home
    • https://www.servicenow.com/docs/bundle/zurich-application-development/page/administer/ui-builder/concept/ui-builder-overview.html

    MuleSoft example URLs

    • https://docs.mulesoft.com/exchange/to-describe-an-asset

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

    Ajabbi workspace domain

    Note: workspace. or app. or cloud. or wsp/ ? I have decided on cloud.

    The default naked domain URL is

    • https;//cloud.ajabbi.com/

    The user account code name will be added as a URL before the domain.

    • https;//example.cloud.ajabbi.com/

    Domain redirection enables

    • https://cloud.example.com/

    Ajabbi Workspace proposed available URL patterns

    A lot of customisation will be possible for user accounts.

    • https://cloud.ajabbi.com/eng/9/e/calendar/
    • https://example.cloud.ajabbi.com/eng/9/e/calendar/
    • https://example.com/cloud/eng/9/e/calendar/
    • https://example.com/eng-uk/cloud/9/e/calendar/
    • https://app.example.com/eng-uk/e/calendar/
    • https://calendar.example.com/eng-uk/
    • https://en.example.com/workspace/e/calendar/
    • https://fr.example.com/espace/e/calendrier/

    Workspace application directories

    Each application has directories associated with different tasks.

    Mail

    • inbox/
    • draft/
    • sent/

    Some simple examples using mail.

    • https://cloud.ajabbi.com/eng/9/e/email/inbox/
    • https://cloud.ajabbi.com/eng/9/e/email/draft/12345678/

    Security concerns

    Long, meaningless code will be used to name endpoints similar to those used by Google.

      • https;//cloud.ajabbi.com/eng/9/e/email/draft/hnjsdhtrhxn79snrfusni9c5/

      To do next

      1. Define the code names to use with all the workspace applications
      2. Build some static web-based workspace mockups
      3. Make some examples in other languages and scripts
      4. Share with volunteer testers
      5. Reiterate till people are happy
      6. Build a working demo at
        • https://demo.cloud.ajabbi.com/
      7. Provide a Template Engine template for the Pipi Render Engine to render on demand from the Pipi Deployment Engine.
      8. Automate the deployment of workspaces for logged-in users.

      Ajabbi high-level navigation options

      Mike's Notes

      Ajabbi is the home of Pipi. Today's task has been to think about the common navigation bar used across Ajabbi.com and make it more useful.

      The common navigation bar has been added to the top of this blog website as an experiment.

      Resources

      • Resource

      References

      • Reference

      Repository

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

      Last Updated

      02/02/2026

      Ajabbi high-level navigation options

      By: Mike Peters
      On a Sandy Beach: 29/09/2025

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

      Common navigation bar

      The ajabbi.com website uses a common navigation bar across all its subdomain sites. It deliberately resembles a ribbon. It's inspired by PostHog's previous website navigation.

      For logged-in users, a toolbar will be added to each sub-menu.

      The bar comprises 8 menu items, 6 of which are permanent and 2 are contextual. Choosing any permanent menu item brings up a sub-menu and 2 possible contextual menus. There are spaces for a total of 12 contextual menus (6x2).

      Sub-menu

      There is room for up to 8 sub-menu items.

      8 menu items x 8 sub-menu items gives a total of 64 possible sub-menu items.

      Existing permanent menu items (6)

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research

      Existing contextual menu items (12 possible)

      • Developer
      • pipiWiki
      • i18n
      • Project
      • Design

      Possible menu items

      • Example
      • i18n
      • API
      • Schema
      • Help
      • Blog
      • Cloud

      Audience

      Are these menu options helpful for website visitors? Who are the groups by audience/task/need?
      • Ajabbi.com (customers)
      • Blog (readers, curious about why)
      • Community (users)
      • Developers (building stuff)
      • Foundation (supporting open-source)
      • Researcher (standards & science behind Pipi)

      Changes to be made to the common navigation bar

      Each menu item choice has 2 contextual items.

      Ajabbi.com

      • Ajabbi.com
        • About
        • Legal
        • Privacy
        • News
        • Press Releases
        • Pricing
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Developer
      • i18n

      Blog

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Developer
      • Blog
      • Newsletter

      Community

      • Ajabbi.com
      • Learn
        • Reference
        • Docs
        • Guides
        • Tutorials
        • Demo
      • Community
      • Handbook
      • Foundation
      • Research
      • Project
      • i18n

      Design

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Design
        • Acessibility
        • Components
        • Content
        • Data Visualisation
        • Foundations
        • Objects
        • Style Guide
        • Tokens
        • Usability
      • i18n

      Developer

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Developer
        • Reports
        • Support
        • Tools
        • Translate
      • i18n

      Learn

      • Ajabbi.com
      • Learn
        • Reference
        • Docs
        • Guides
        • Tutorials
        • Demo
      • Community
      • Handbook
      • Foundation
      • Research
      • pipiWiki
      • i18n

      Foundation

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
        • Mission
        • Board
        • Program
        • Events
        • User Groups
      • Research
      • TBA1
      • i18n

      Handbook

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
        • Ajabbi
        • Handbook
        • Design
        • Documentation
        • Engineering
        • Product
        • Publication
        • Teams
      • Foundation
      • Research
      • Design
      • i18n

      i18n

    • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Design
      • i18n
        • Languages
        • Downloads

      pipiWiki

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • pipiWiki
        • Recently Added
        • Interaction
        • Toolbox
        • Platform
      • i18n

      Project

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
      • Project
        • Current
        • Planned
        • Completed
        • Workshops
        • Status
        • FAQ
      • i18n

      Research

      • Ajabbi.com
      • Learn
      • Community
      • Handbook
      • Foundation
      • Research
        • Research
        • News & Events
        • People
        • Complex Systems
        • About
      • TBA1
      • i18n

      On a Sandy Beach, database version 2 is underway

      Mike's Notes

      In May, after manually reformatting every page and post of "On a Sandy Beach," I wrote.

      "A blogging module needs to be built and added to Pipi 9 CMS. This could then be used to create blog posts using an underlying database, which could be modified to be more useful."

      Resources

      References

      • Reference

      Repository

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

      Last Updated

      28/09/2025

      On a Sandy Beach, database version 2 is underway

      By: Mike Peters
      On a Sandy Beach: 28/09/2025

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

      The datamodel version 2 to support blogging is now being built. It is designed to support On a Sandy Beach. Yesterday, this Blogger post index was scraped and imported to initially populate the database.

      In future, the blogging module will also support other blogs/newsletters, including the Ajabbi Research Monthly Newsletter, which begins next month in October on Substack.

      The new database and blogger will be synced while other jobs are completed, including;

      • The tags need consolidating
      • The same tags will form a topic map and be used across Ajabbi
      • etc

      Data Model version 1 (current)

      • Mike's Note
      • Resources
      • References
      • Repository links
      • Date Updated
      • Title
      • Page Url
      • Author
      • Source publication
      • Date Created
      • Author description
      • Body of the article
      • Tags
      • Comments

      Data Model version 2 (now being built)

      • Title
      • Page Url
      • Site-wide Navigation
      • Site-wide Breadcrumb
      • Mike's Note
      • Author
      • Source publication
      • Date Created
      • Author description
      • Body of the article
      • References
      • Further Reading (replacing References)
      • Articles
      • See Also (cross-links to Ajabbi.com website pages, replacing Repository URL)
      • External Links (replacing Resources)
      • Keywords (replacing Tags)
      • Sharing
      • Updated
      • Forum (replacing Comments)

      The Bitter Lesson

      Mike's Notes

      I found this article written by Rich Sutton in today's Gary Marcus Substack.

      I agree with both Rich and Gary, LLMs don't have a world model, and that's a point of failure. LLMs are great for translating between languages. They are overhyped and contributing to a speculative bubble. There will be tears.

      Resources

      References

      • Reference

      Repository

      • Home > Ajabbi Research > Library > Subscriptions > Marcus on AI
      • Home > Handbook > 

      Last Updated

      27/09/2025

      The Bitter Lesson

      By: Rich Sutton
      Incomplete Ideas: 13/03/2019

      I am seeking to identify general computational principles underlying what we mean by intelligence and goal-directed behavior. I start with the interaction between the intelligent agent and its environment. Goals, choices, and sources of information are all defined in terms of this interaction. In some sense it is the only thing that is real, and from it all our sense of the world is created. How is this done? How can interaction lead to better behavior, better perception, better models of the world? What are the computational issues in doing this efficiently and in realtime? These are the sort of questions that I ask in trying to understand what it means to be intelligent, to predict and influence the world, to learn, perceive, act, and think..

      The biggest lesson that can be read from 70 years of AI research is that general methods that leverage computation are ultimately the most effective, and by a large margin. The ultimate reason for this is Moore's law, or rather its generalization of continued exponentially falling cost per unit of computation. Most AI research has been conducted as if the computation available to the agent were constant (in which case leveraging human knowledge would be one of the only ways to improve performance) but, over a slightly longer time than a typical research project, massively more computation inevitably becomes available. Seeking an improvement that makes a difference in the shorter term, researchers seek to leverage their human knowledge of the domain, but the only thing that matters in the long run is the leveraging of computation. These two need not run counter to each other, but in practice they tend to. Time spent on one is time not spent on the other. There are psychological commitments to investment in one approach or the other. And the human-knowledge approach tends to complicate methods in ways that make them less suited to taking advantage of general methods leveraging computation.  There were many examples of AI researchers' belated learning of this bitter lesson, and it is instructive to review some of the most prominent.

      In computer chess, the methods that defeated the world champion, Kasparov, in 1997, were based on massive, deep search. At the time, this was looked upon with dismay by the majority of computer chess researchers who had pursued methods that leveraged human understanding of the special structure of chess. When a simpler, search-based approach with special hardware and software proved vastly more effective, these human-knowledge-based chess researchers were not good losers. They said that ``brute force" search may have won this time, but it was not a general strategy, and anyway it was not how people played chess. These researchers wanted methods based on human input to win and were disappointed when they did not.

      A similar pattern of research progress was seen in computer Go, only delayed by a further 20 years.

      Enormous initial efforts went into avoiding search by taking advantage of human knowledge, or of the special features of the game, but all those efforts proved irrelevant, or worse, once search was applied effectively at scale. Also important was the use of learning by self play to learn a value function (as it was in many other games and even in chess, although learning did not play a big role in the 1997 program that first beat a world champion). Learning by self play, and learning in general, is like search in that it enables massive computation to be brought to bear. Search and learning are the two most important classes of techniques for utilizing massive amounts of computation in AI research.

      In computer Go, as in computer chess, researchers' initial effort was directed towards utilizing human understanding (so that less search was needed) and only much later was much greater success had by embracing search and learning.

      In speech recognition, there was an early competition, sponsored by DARPA, in the 1970s. Entrants included a host of special methods that took advantage of human knowledge---knowledge of words, of phonemes, of the human vocal tract, etc. On the other side were newer methods that were more statistical in nature and did much more computation, based on hidden Markov models (HMMs).

      Again, the statistical methods won out over the human-knowledge-based methods. This led to a major change in all of natural language processing, gradually over decades, where statistics and computation came to dominate the field. The recent rise of deep learning in speech recognition is the most recent step in this consistent direction. Deep learning methods rely even less on human knowledge, and use even more computation, together with learning on huge training sets, to produce dramatically better speech recognition systems. As in the games, researchers always tried to make systems that worked the way the researchers thought their own minds worked---they tried to put that knowledge in their systems---but it proved ultimately counterproductive, and a colossal waste of researcher's time, when, through Moore's law, massive computation became available and a means was found to put it to good use.

      In computer vision, there has been a similar pattern. Early methods conceived of vision as searching for edges, or generalized cylinders, or in terms of SIFT features. But today all this is discarded.

      Modern deep-learning neural networks use only the notions of convolution and certain kinds of invariances, and perform much better.

      This is a big lesson. As a field, we still have not thoroughly learned it, as we are continuing to make the same kind of mistakes. To see this, and to effectively resist it, we have to understand the appeal of these mistakes. We have to learn the bitter lesson that building in how we think we think does not work in the long run. The bitter lesson is based on the historical observations that 1) AI researchers have often tried to build knowledge into their agents, 2) this always helps in the short term, and is personally satisfying to the researcher, but 3) in the long run it plateaus and even inhibits further progress, and 4) breakthrough progress eventually arrives by an opposing approach based on scaling computation by search and learning. The eventual success is tinged with bitterness, and often incompletely digested, because it is success over a favored, human-centric approach.

      One thing that should be learned from the bitter lesson is the great power of general purpose methods, of methods that continue to scale with increased computation even as the available computation becomes very great. The two methods that seem to scale arbitrarily in this way are search and learning.

      The second general point to be learned from the bitter lesson is that the actual contents of minds are tremendously, irredeemably complex; we should stop trying to find simple ways to think about the contents of minds, such as simple ways to think about space, objects, multiple agents, or symmetries.

      All these are part of the arbitrary, intrinsically-complex, outside world. They are not what should be built in, as their complexity is endless; instead we should build in only the meta-methods that can find and capture this arbitrary complexity. Essential to these methods is that they can find good approximations, but the search for them should be by our methods, not by us. We want AI agents that can discover like we can, not which contain what we have discovered. Building in our discoveries only makes it harder to see how the discovering process can be done