Add Motion: the go-to-market operating system on top of the ledger

The ledger answers which contracted capacity is sold, to whom, at what
margin. It says nothing about the motion — the repeatable practice that
turns a customer conversation into a scoped deployment, and turns that
deployment into something the next one reuses.

Motion is deliberately not a parallel entity tree. DEMAND_STAGES already
is the motion, so Motion binds reusable artefacts to the stages of a
demand deal that already exists: an engagement hangs off one deal,
cascade deleted, one per deal by unique constraint.

Nine closed kinds, each declaring which stages it serves, and a starter
library of twelve templates covering all eight open stages.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-17 18:27:03 -07:00
parent 99d165b5e5
commit 516685526c
61 changed files with 13013 additions and 29 deletions
+14 -1
View File
@@ -134,7 +134,14 @@ describe('reads', () => {
describe('the whole role × capability matrix', () => {
const EXPECTED: Readonly<Record<TeamRole, readonly Capability[]>> = {
viewer: ['book:read', 'team:read'],
member: ['book:read', 'economics:read', 'team:read', 'deal:write', 'activity:write'],
member: [
'book:read',
'economics:read',
'team:read',
'deal:write',
'activity:write',
'motion:write',
],
lead: [
'book:read',
'economics:read',
@@ -142,6 +149,8 @@ describe('the whole role × capability matrix', () => {
'deal:write',
'activity:write',
'commitment:write',
'motion:write',
'motion:publish',
],
admin: [
'book:read',
@@ -153,6 +162,8 @@ describe('the whole role × capability matrix', () => {
'contract:sign',
'data:import',
'integration:connect',
'motion:write',
'motion:publish',
],
};
@@ -188,6 +199,8 @@ describe('the whole role × capability matrix', () => {
'data:import',
'fact:review',
'integration:connect',
'motion:write',
'motion:publish',
]),
);
});