Product records

What you are building,
written down as records.

Solutions, the features under them, the models and fields below those, and the handlers, rules and screens around them. Each one is a real record with a name, an owner, notes and where it stands, so the shape of your product is something a person can open and read instead of something you re-explain every time somebody asks.

Product records, close up

A tree, the things hanging off it, and what reads it back.

PlanningTo doDoingTestingProduction

Comes from

The tree

Hangs off it

What is travelling those lines

  • A board becomes a treea note becomes a record only when you confirm it
  • An agent drafts the shapestraight in, nothing queued, and no delete to call
  • A field learns which way it pointswhich model, which way round, and how many
  • A decision lands on what it changeson the record, not in a file with a similar name
  • A moment finds what reports itnamed before the code that reports it exists
  • The row shows where the parts have got toa picture of the children, never a status of its own
  • A draft points back at the featurea checked row, written from the draft side

This is the same map as the one on the front of Solutions, zoomed into one surface. The tree runs down the middle. What feeds it is on the left, what hangs off it is on the right, and the one place work waits is you.

What it does

The shape of your product, in records you can open.

A tree of records, not a drawing

A solution, the features under it, the models under those, the fields on them. Each is a real row with a name, notes, an owner and where it stands, on its own page, searchable by name across every kind at once. Nothing has to be redrawn when something changes, because there was never a drawing to keep in step.

The status spread, and what it is not

A row shows the statuses of what is attached to it: a solution shows its features and every model under them, a model shows its fields, its handlers and its moments. It is a picture of where the parts have got to. Nothing is worked out from it, and the record's own status stays a value a person set.

Click a colour, land on the record

Each segment of a bar is one record, and clicking it opens that record, so the bar is a way in rather than a decoration. A segment for a moment takes you to where moments are edited, because that is where it actually lives.

Fields that know which way they point

A field pointing at another model records the target, how many of each there are, and the naming on both sides, then says it back in plain words: this belongs to many of those. That is what lets the data diagram draw the line the right way round instead of guessing.

Your product's rules, not ours

A handler carries the rules that guard it and the roles allowed to reach it, each rule with its own settings. All of it is a record of your product's access model. None of it changes who can do what inside this workspace, which is decided somewhere else entirely.

The reasoning attaches to the record

A decision, a design note or a release note attaches to the thing it is about: a solution, a feature, a model, a handler, a page, a shell, a block, a rule, a role, a hook or an interceptor. Fields are the one exception. It is a short list of one, and you should hear it from us.

The whole thing, drawn

One request returns every record and every join for the brand, and the same answer is drawn several ways: everything at once, the architecture layer by layer, the data and its relations, and the chain from a model to a handler to a moment. Different conversations, one set of records underneath.

Nobody silently overwrites anybody

Every kind here carries a version that travels with your save, so two tabs, two people, or an agent and you cannot land on top of each other in silence. Walking away from a record with unsaved changes asks first.

The layers

Use the layers that fit. Leave the rest empty.

The tree nests: a solution holds features, a feature holds models, a model holds fields. Around it sit the handlers that act on a model and the screens that render it. Every layer is optional, and an empty one is not a gap the product will nag you about.

The spine, each one inside the last

Solutionholds features

One product, or one large area of one. Its row shows where its features stand, and where every model under them stands.

Featureholds models

A unit of what your product does. Delete the solution above it and this keeps its own record instead of going down with it.

Modelholds fields

A thing your product stores or reasons about: an order, a subscriber, a device. Fields, handlers, hooks and moments all point here.

Attributea field

A field on a model. One that points at another model records which one, which way round and how many, and says it back in plain words.

Attached to a model

  • ControllerA named handler in your product: what runs when something is asked for. It records the method, the path and whether a signed-in user is needed.
  • PolicyA reusable rule you attach to a handler, with its own settings each time you attach it.
  • RoleA role in your product's own access model, attached to the handlers it is allowed to reach.
  • LifecycleA record of a hook around a model's changes. Its model is optional, because plenty of real hooks have no single parent to name.

Rules and roles here are a record of your product. They have no effect on who can do what inside this workspace.

Beside the tree, not under it

  • ViewA page, with its route and whether it needs a signed-in user.
  • LayoutThe shell a page sits inside. Its row shows where each page inside it stands.
  • ComponentA block reused by pages and shells, with its own category and a note of whether it is used everywhere.
  • MiddlewareAn interceptor that runs before a page, attached to the pages it guards.

None of these hang off a model, so you can write down the screens of something without creating a model first.

  • A layer you skip stays empty. Nothing is required to have a parent except a field, which needs its model. Everything else stands on its own if that is what your product looks like.
  • Every kind carries the same handful of things. A name, notes, an owner, where it stands, and a version that stops two saves landing on top of each other. Learn one record and you have learned all of them.
  • Every kind is findable by name. Search reaches all of them, so the layer something was filed under stops mattering the moment you are looking for it.

Where this sits

What the tree is wired to, and what each one does for it.

The tree is worth keeping on its own. The reason it stays current is that the rest of the workspace points at it: the boards it gets thought up on, the notes that explain it, the moments it will report, and the drafts written about it.

Whiteboards

Where a lot of this is thought up. A note becomes a real record on the tree through a confirm you drive, and records already here drop back onto a board as live cards showing their current status.

Read Whiteboards

Artifacts

The decisions and notes that explain the tree. They attach to the record they are about, that record's tab lists them, and its row shows how many are on it.

Read Artifacts

Events

The moments your product will report, agreed here before the code that reports them exists, attached to the model they are about and to the handlers that will report them.

Read Events

Content

A draft can name the feature it describes from inside its own body, and the link is a checked row rather than a phrase. It is written from the draft side today.

Read Content

Your agent

What an agent may do with all of it, under your permissions and your brand limits, and what it is structurally unable to do.

Read Your agent

Yours to keep

This is the surface where an honest claim matters most.

Every one of these we would choose again.

Nothing is worked out behind your back

Where something stands is a value a person sets, checked against the workspace's own status list before it is stored. No parent is calculated from its children, and no colour on any row will ever tell you something moved on its own.

Deleting a solution does not delete its features

They keep their own records and simply stop naming a parent, so a reorganisation cannot quietly take a month of writing with it.

Empty layers cost nothing

Use the layers that fit what you are building. A hook does not need a model above it, the screen layer needs nothing above it at all, and nothing here nags you about a layer you left empty.

Removing things stays with you

An agent can work this tree all day. There is no delete for it to call, so what disappears is what you chose to remove.

The status words are yours

One status list covers the product tree, your writing, your files and your notes, so a word means the same thing wherever you meet it, and the list itself is yours to change.

Your rules stay documentation

The roles and rules you record here describe your product. They are never quietly turned into controls over this workspace, and that is a promise worth making out loud rather than leaving to the word.

Questions

Questions people ask about product records.

No, and it is worth being blunt because plenty of tools imply otherwise. What you see on a parent is a bar of its children's statuses, a picture of where the parts have got to, and every segment links to the record it came from. The parent's own status is a value a person set, and nothing else touches it.

Keep reading

The surfaces on either side of this one.

Whiteboards

Where the tree usually gets thought up before it is written down.

Artifacts

The tasks and decisions that hang off every record here.

Events

The moments your product reports, named before the code exists.

Your agent

What an agent is allowed to do with all of it.

Start free. Bring your own agent.

Open the workspace, do one real piece of work in it, and the joins will show you the rest.