Skip to content

Four axes

A profile is not a workflow, a workflow is not an interface, and none of them is a model. Four independent axes, one declaration each, every projection derived.

Ask what a piece of AI-assisted work is and four different answers get folded into one field, usually called model. They are not the same question, they do not change at the same rate, and collapsing them is how a repository ends up with a vendor's name compiled into its build.

They separate cleanly.

01 / the axes

Four questions, four declarations

Each axis is declared once and read everywhere. None of them names another: a profile does not know which model will answer it, a workflow does not know which interface invoked it, and an interface does not know which profile the caller is running under.

Profile

4 profiles

answers: with how much context, effort and ceremony

One file per working mode under the layer.

It declares a capability class and an effort, never a vendor or a model name.

See it →

Workflow

4 workflows

answers: in what order, and what must exist before it may end

A sequence a worker follows, seeded into every repository.

It names capabilities and phases, never the backend that answers them.

See it →

Surface

3 interfaces

answers: where the same capability can be reached

Not a file anyone writes: the exposure a capability declares once.

An interface is a projection of the declaration; a projection that disagrees with it fails the build.

See it →

Model

0 named in the layer

answers: what actually executes the work

Chosen per run, outside the repository.

Majordomus never invokes one. Continuity lives in the records, so the model can change mid-task without the work losing its state.

See it →
Four axes, deliberately not onefrom profiles, workflows and the capability registry
flowchart TD
    I["Intent<br/><small>one task, started once</small>"]
    A0["Profile<br/><small>4 profiles</small>"]
    A1["Workflow<br/><small>4 workflows</small>"]
    C["Capability<br/><small>78 · declared once</small>"]
    I --> A0 --> A1 --> C
    S0["Command line<br/><small>32 of 78</small>"]
    C --> S0
    S1["HTTP + OpenAPI<br/><small>78 of 78</small>"]
    C --> S1
    S2["MCP tools and resources<br/><small>76 of 78</small>"]
    C --> S2
    M(["Model<br/><small>chosen per run · named in no file of the layer</small>"])
    A1 -. "executed by" .-> M

02 / the model is not the agent

A profile declares requirements, never a vendor

Writing model: some-vendor-model into a configuration file does not remove a lock-in; it gives it a directory. A profile here declares a capability class and an effort, and the run decides what satisfies them. No file of the layer names a model, and a check refuses one that starts to.

capability classes
fast · standard · strong · strongest
effort levels
high · low · medium
what a worker must return
blockers · changes · decisions · next_action · outcome · verification

Continuity is the point. The task, its decisions, its evidence and its handover are records in the repository, so the model answering a task may change mid-flight without the work losing its state — and so may the vendor.

03 / the surface axis

78 capabilities, 3 interfaces, one declaration

A surface is not a page someone builds. It is the exposure a capability declares, and the command line, the HTTP API with its OpenAPI document, and the MCP tools and resources are all read out of that one declaration. Nothing is registered anywhere a second time; a projection that disagrees with the registry fails the build.

Command line
32 of 78
HTTP + OpenAPI
78 of 78
MCP tools and resources
76 of 78

The gaps are deliberate and visible, which is the difference between a derived matrix and a hand-kept one. 44 reach http + mcp; 32 reach cli + http + mcp; 2 reach http. Nobody has to remember to add a row.

modulecapabilitiesclihttpmcp
plan 8 0 8 8
executions 7 6 7 7
why 6 6 6 6
distribution 5 5 5 5
product 5 5 5 5
design 4 0 4 4
objects 4 0 4 4
worktree 4 4 4 4
capabilities 3 3 3 3
commands 3 0 3 3
deploy 3 0 3 3
health 3 0 3 1
repository 3 1 3 3
trace 3 0 3 3
environment 2 0 2 2
graph 2 0 2 2
obligations 2 0 2 2
peers 2 0 2 2
release 2 0 2 2
artifacts 1 0 1 1
continuity 1 0 1 1
directories 1 0 1 1
perf 1 0 1 1
quality 1 1 1 1
server 1 1 1 1
web 1 0 1 1

26 modules. Every row is a count over the registry the executable generates, never a mark someone typed. Every capability, one page each.