The idea

Four objects. Two relations. Nothing else.

Agenda's designers published their architecture in Communications of the ACM in July 1990. The claim they make is a strong one. These four objects are enough, and anything richer belongs in conditions and actions rather than in a fifth object.

The primitives

I'm keeping these exact. Adding a fifth is the one change I've decided is out of bounds.

Item

Free text, about 350 characters. A task, an idea, a fact, a reminder. No internal structure required, and none imposed.

Note

A larger body of text, roughly 10,000 characters, attachable to an item or to a category.

Category

A named set of items. Items belong to many. Categories form a hierarchy carrying the two relations below, under a built-in root called MAIN.

View

A query-driven window onto the pile - and editing a view edits the database.

The four objects and the two relations Three items on the left are joined by lines to the categories they are assigned to, in a hierarchy under MAIN: Calls, Meetings, and Ideas under Activities; High, Medium, and Low under Priority, marked as an exclusive family; Kapor under People; and the built-in date categories Entry, When, and Done. A note hangs off one item. On the right, a view window lists the items by section, reading from the hierarchy and writing back to it. Items Call Mitch Kapor about the Agenda demo next Tuesday Meet with Ed Belove and Jerry Kaplan to review the view model on Friday Think about whether every category should be mutually exclusive Note Up to about 10,000 characters, on an item or on a category. Categories MAIN Activities Calls Meetings Ideas Priority exclusive children High Medium Low People Kapor Entry When Done built-in date categories inherited View View: Activities Calls When Call Mitch Kapor… 09/15/26 Meetings When Meet with Ed Belove… 09/11/26 Ideas Think about whether… reads writes back assigned inherited through the tree exclusive children
Three items from the Planner file, the categories they were assigned to, and one view of them. The bracket beside High, Medium, and Low is how the category manager marks an exclusive family, and the dashed arrow is inheritance, which is what subsumption looks like on screen. Every file has this shape: MAIN at the top, up to twelve levels under it, and Entry, When, and Done built in.

The two relations

The hierarchy carries meaning that the engine acts on.

Subsumption

A parent implicitly contains its children's items. Assign something to Death Star and it's also in Projects, with no second assignment and no copy. The manual calls this inheritance, and it runs one way: assign the item to Projects directly and the Death Star assignment breaks.

Mutual exclusion

A parent can be marked so an item may join only one of its children; join a second and the first assignment breaks. This is how a priority works - an item is High, Medium, or Low, never two of them - without inventing a priority field.

There's no priority field, no status field, no due-date field, and no project field. Each of those is a category, and that's why an item can be in three projects at once without anything being duplicated. Even the dates are categories. Every file ships with three of them, Entry, When, and Done, and a date column is a column headed by one.

What a view is made of

A view has three independent parts. Most tools give you the first one and stop.

Selection

The criteria deciding which items appear at all.

Demarcation

Sections within the view, each headed by a category. The same item can appear in more than one section.

Annotation

Columns, each headed by a category - which is why “Project” and “When” are columns in the Tasks screen, not fields on the item.

What a view is made of A schematic of the Tasks view. The title row reads View: Tasks [High], with the filter in brackets. Two sections headed Calls and Meetings list items beside Project and When columns; one item appears under both heads; an empty highlighted line under Meetings is where a new item is typed. Four numbered callouts name the parts: selection, demarcation, annotation, and write-back. View: Tasks [High] 1 2 Calls 3 Project When Call Mitch Kapor about the demo Agenda 09/15/26 Call Ed to confirm Friday Agenda 09/11/26 2 Meetings Project When Meet with Ed Belove on Friday Agenda 09/11/26 Call Ed to confirm Friday Agenda 09/11/26 a new item, typed here 4 1 Selection The filter. Only items assigned to High get in, and it shows in brackets after the view name. 2 Demarcation Sections, each headed by a category. One item can sit in two of them without being copied. 3 Annotation Columns, each headed by a category. Project and When are categories, not fields on the item. 4 Write-back Type on the empty line and the item joins Meetings and High on its own.
The Tasks view, redrawn with a filter added so all three parts are in one picture. Every part is a category: the filter, the section heads, and the column heads. The real screen →

Automatic assignment

The category hierarchy is a program that runs against every item you create or change. Each category can carry conditions - text matches, tests on what else the item is assigned to, date tests, and numeric tests - along with actions. An item that matches the conditions gets assigned, and being assigned fires the actions, which can send the item back through so the rules cascade. Conditions pull and their assignments break on their own when the item stops matching; actions push and their assignments stick.

The Agenda category manager with conditions shown: Calls;Phone;Telephone, Meetings;Mtg;Mtgs;(meet with);(talk to);meet, Ideas;;(think about), and Miscellaneous Activity C= -Activity,Tasks.
The program, as shipped in the Planner starter file. Alt-F7 in the category manager shows every rule beside its category. More screens →

Two dials govern how aggressively this runs.

Initiative

How strong a match must be before the engine acts on it at all.

Authority

Whether a match is applied immediately, or queued as a guess for a human to confirm.

That second dial is the whole product. A filing system that acts on every guess is annoying. One that asks about every guess is useless. Agenda made the threshold a setting you control, and I'm claiming I can do that at least as well.

The Auto-assign Global Settings box, with Required match strength set to Exact (100%) and Confirm assignments set to Never.
The two dials as the product names them: Required match strength (Exact, Partial, or Minimal) and Confirm assignments (Never, Always, or Sometimes). One box deep under File Properties.

Update through views

Put an item in a section and it joins that section's category. Put it in a filtered view and Agenda runs the criteria backwards so the new item satisfies them. If the view shows items due next week, an item you type into it picks up a date next week.

This is where the 1990 paper stops. String matching is “beyond the scope of this article,” and update-through-views gets credited to unspecified “formal methods and heuristics.” The Users Guide fills in more of the first than I expected. Chapter 19 says how item text is cut into words, names, dates, and numbers, which suffixes get stripped, and that match strength is nothing fancier than the fraction of a category's words that appear in the item. It also documents a hook the paper never mentions: a category can refuse explicit assignments and then make items fit, assigning whatever its own condition requires. That's reverse inference, shipped as a setting.

Chapter 11 then gives the filter half, and it's plainer than the paper let on. Type an item into a view filtered by a category and it gets that category. Filtered by a date or number range, it gets the start of the range; filtered to outside a range, the value just before it. No formal methods, no heuristics: a rule.

That leaves the case the rule doesn't cover. A filter across an exclusive family (High or Medium) admits an item that's in either, so which one does a new item get? The manual doesn't say, and the paper's answer, look at the neighbouring items, appears nowhere in it. So I asked the program, seven times. A new item copies the item directly above it: below a Medium call it comes out Medium, below a High one it comes out High, even when everything else in the view is Medium. With nothing above it at all, it takes whichever filter was entered first, even with a High item sitting directly beneath it. Not the last filter, not the most common, not the top of the tree, not the one below: the one above. The manual never wrote it down, but a Lotus support note from October 1990 did, almost word for word: check the previous item in the view, and with none, take the first category. So did the patent Lotus filed in November 1988, in the language of claims: resolve the ambiguity from “data immediately adjacent to or preceding the data to be modified in the view.” The patent adds that with nothing preceding, the following item “may be used”; the seventh run says the shipped program didn't. I read both after the first six runs.

Agenda 2.0b runs under DOSBox Staging on my desk, and I can watch what it does instead of guessing. That answer took seven typed items and an assignment profile. Chandler never had that.

Two invariants I'm honoring on day one

Both are cheap now and expensive to retrofit later. Both come straight from the paper.

Storage does not depend on hierarchy

Changing the category tree must require no reformatting, no re-indexing, and no migration. The tree is allowed to keep changing, so nothing may be tied to its current shape.

No terminal / non-terminal distinction

An item can be assigned anywhere in the tree, including the root. There's no internal difference between a leaf category and a parent one.