@creator-notes/cnotes 0.58.0 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,6 +20,9 @@ export declare const BRAND: {
20
20
  readonly url: "https://creatornotes.app";
21
21
  /** Bare domain. */
22
22
  readonly domain: "creatornotes.app";
23
+ /** Developer portal (docs only). The API stays on `url`; never a server target. */
24
+ readonly devUrl: "https://cnotes.dev";
25
+ readonly devDomain: "cnotes.dev";
23
26
  /** The installed command. */
24
27
  readonly command: "cnotes";
25
28
  /** Published package name. */
@@ -1 +1 @@
1
- {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK;IAChB,kDAAkD;;IAElD,kEAAkE;;IAElE,mBAAmB;;IAEnB,6BAA6B;;IAE7B,8BAA8B;;IAE9B,uFAAuF;;IAEvF,oCAAoC;;CAE5B,CAAC"}
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,KAAK;IAChB,kDAAkD;;IAElD,kEAAkE;;IAElE,mBAAmB;;IAEnB,mFAAmF;;;IAGnF,6BAA6B;;IAE7B,8BAA8B;;IAE9B,uFAAuF;;IAEvF,oCAAoC;;CAE5B,CAAC"}
package/dist/lib/brand.js CHANGED
@@ -20,6 +20,9 @@ export const BRAND = {
20
20
  url: "https://creatornotes.app",
21
21
  /** Bare domain. */
22
22
  domain: "creatornotes.app",
23
+ /** Developer portal (docs only). The API stays on `url`; never a server target. */
24
+ devUrl: "https://cnotes.dev",
25
+ devDomain: "cnotes.dev",
23
26
  /** The installed command. */
24
27
  command: "cnotes",
25
28
  /** Published package name. */
@@ -1 +1 @@
1
- {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,kDAAkD;IAClD,IAAI,EAAE,eAAe;IACrB,kEAAkE;IAClE,GAAG,EAAE,0BAA0B;IAC/B,mBAAmB;IACnB,MAAM,EAAE,kBAAkB;IAC1B,6BAA6B;IAC7B,OAAO,EAAE,QAAQ;IACjB,8BAA8B;IAC9B,WAAW,EAAE,uBAAuB;IACpC,uFAAuF;IACvF,SAAS,EAAE,SAAS;IACpB,oCAAoC;IACpC,IAAI,EAAE,uBAAuB;CACrB,CAAC"}
1
+ {"version":3,"file":"brand.js","sourceRoot":"","sources":["../../src/lib/brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,kDAAkD;IAClD,IAAI,EAAE,eAAe;IACrB,kEAAkE;IAClE,GAAG,EAAE,0BAA0B;IAC/B,mBAAmB;IACnB,MAAM,EAAE,kBAAkB;IAC1B,mFAAmF;IACnF,MAAM,EAAE,oBAAoB;IAC5B,SAAS,EAAE,YAAY;IACvB,6BAA6B;IAC7B,OAAO,EAAE,QAAQ;IACjB,8BAA8B;IAC9B,WAAW,EAAE,uBAAuB;IACpC,uFAAuF;IACvF,SAAS,EAAE,SAAS;IACpB,oCAAoC;IACpC,IAAI,EAAE,uBAAuB;CACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@creator-notes/cnotes",
3
- "version": "0.58.0",
3
+ "version": "0.59.1",
4
4
  "description": "CLI for CreatorNotes — create notes, build canvases, search knowledge from the terminal",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,18 +1,19 @@
1
1
  ---
2
2
  name: attention-planner
3
- description: Turn everything that arrived into either finished agent work or one answerable Attention card scheduled as a focus block, then close the loop when the human answers. Use when the user invokes /attention-planner, asks "what needs me today", "plan my attention", "triage the digest", "triage this transcript", "what did I answer", "close the day", "close the week", or says they answered a card ("I filled ATTENTION-12"). Runs on the cnotes CLI and expects the cnotes skill to be installed.
3
+ description: Turn everything that arrived into either finished agent work or one answerable Attention card scheduled as a focus block, then close the loop when the human answers. Use when the user invokes /attention-planner, asks "what needs me today", "plan my attention", "protect a block for <thing>", "triage the digest", "triage this transcript", "what did I answer", "close the day", "close the week", or says they answered a card ("I filled ATTENTION-12"). Runs on the cnotes CLI and expects the cnotes skill to be installed.
4
4
  metadata:
5
- short-description: One answerable card a day, loop closed by the agent
5
+ short-description: One open card at a time, loop closed by the agent
6
6
  ---
7
7
 
8
8
  # Attention planner
9
9
 
10
10
  The job: restore the human's control over their commitments, one answerable
11
11
  card at a time. The human holds three things an agent cannot supply: judgment,
12
- authorization, and accountability. The agent holds unlimited attention. So
13
- route every item that arrived to the cheapest resource that can safely settle
14
- it, hand the human only the residue as a card they can answer in the time it
15
- says, and when they answer, make things move and say what moved.
12
+ authorization, and accountability. The agent's attention is cheap, bounded
13
+ only by its tools, access, runtime, and cost, never by a working day. So route
14
+ every item that arrived to the cheapest resource that can safely settle it,
15
+ hand the human only the residue as a card they can answer in the time it says,
16
+ and when they answer, make things move and say what moved.
16
17
 
17
18
  Felt from the chair: "I answered one thing, five things moved, and I know what
18
19
  is still waiting." Judge every write by that sentence. Create the smallest
@@ -26,31 +27,49 @@ canvas layout, the humanizer). Consult it rather than guessing.
26
27
 
27
28
  | Concept | CreatorNotes shape |
28
29
  |---|---|
29
- | Rules | One standing note the human ratified, titled `Attention rules`: hours and timezone, deep units per day and their length, the protected morning, sources the agent may read, actions it may take unasked, actions that always need a yes. Found with `cnotes search "attention rules"`. Mentioned from every card |
30
+ | Rules | One standing note the human ratified, titled `Attention rules`: hours and timezone, deep units per day and their length, the protected morning, protected priorities, sources the agent may read, actions it may take unasked, reviews it may complete unasked, actions that always need a yes. Found with `cnotes search "attention rules"`. Mentioned from every card |
30
31
  | Queue | Today's **IncomingDigest** note. The only list. Headings: `Agent completed`, `Ready for shallow window`, `Waiting for Deep Work`, `Moved today`. Versioned through the day, never duplicated. If the intake pipeline wrote none, create today's from what arrived |
31
- | Card | An **Attention** note: a time-boxed decision interface for one human. Tagged `open` plus `deep` or `shallow`. At most one deep and one shallow per run. Shapes and worked examples in [references/card-shapes.md](references/card-shapes.md) |
32
+ | Card | An **Attention** note: a time-boxed interface for one human. Four shapes: **decide** (deep), **make** (deep), **shallow**, and the one-time **rules** card. Tagged `deep` or `shallow` plus a state: `open` (unanswered), `answered` (answer recorded, follow-through running), `closed` (every promise settled). Shapes and worked examples in [references/card-shapes.md](references/card-shapes.md) |
32
33
  | Block | A `cnotes focus plan` landed on the card with `--canvas` and `--target`. The only source of truth for when. The card title carries no time, so a moved block never leaves a stale title |
33
- | Orientation canvas | Deep cards only: `<Card title> · Orientation`, the card first, then the notes it rests on, laid out once with `cnotes canvas place`. The block opens here |
34
+ | Orientation canvas | For a deep card whose answer rests on more than the card itself: `ATTENTION-N · Orientation`, built once with `cnotes canvas place` as a left-to-right story with the flow of thought written beside the notes, per [references/orientation-canvas.md](references/orientation-canvas.md). The block opens here. A card that carries everything the reader needs lands its block on the home board instead |
34
35
 
35
36
  An Attention is not a Task. A Task says what work must be done. A card says
36
37
  why this needs the human now, gives enough context to decide without opening
37
38
  other notes, separates confirmed from inferred, asks only for the inputs that
38
- person alone can give, states what the agent does after the answer, and names
39
- which external actions still wait for approval.
39
+ person alone can give, states what the agent does after the answer, names
40
+ which external actions still wait for approval, and says how the agent will
41
+ learn that the answer exists.
40
42
 
41
43
  ## Lanes
42
44
 
43
45
  | Lane | What belongs here | Budget | Block |
44
46
  |---|---|---|---|
45
- | Agent automatic | Retrieve, compare, summarize, draft, reproduce, organize. Anything an existing decision or rule already settles | Unlimited | None. Do it now, version the notes it touched, list it under `Agent completed` |
46
- | Deep Work | Making or judging that cannot be drafted and batch-approved | Deep units from the Rules (default four of 45 minutes, combinable to 90 or 135 for one sitting) | One card, morning first |
47
- | Shallow PM | Approve, send, route, or a two-minute yes or no after the agent prepared the draft | One 30-minute window per working day after the first deep block. Never a deep unit | Lands on the queue, or on the shallow card |
47
+ | Agent automatic | Retrieve, compare, summarize, draft, reproduce, organize. Anything an existing decision or rule already settles | Bounded by tools, access, runtime, and cost. Never by human attention | None. Do it now, version the notes it touched, list it under `Agent completed` |
48
+ | Deep Work | Deciding or making that cannot be drafted and batch-approved. Two shapes: **decide** ends in an answer; **make** ends in an artifact the human had to produce or explore themselves | Deep units from the Rules (default four of 45 minutes, combinable to 90 or 135 for one sitting) | One card, morning first |
49
+ | Shallow PM | Approve, send, route, complete a prepared review, or a two-minute yes or no after the agent prepared the draft | One 30-minute window per working day after the first deep block. Never a deep unit | Lands on the queue, or on the shallow card |
48
50
  | Interrupt | A real customer blocked, an irreversible move imminent, a committed response at risk | The next unused deep unit | The card names what it displaced |
49
51
 
50
52
  Inbox processing is never Deep Work. A ready approve-and-send is never Deep
51
53
  Work. An unscheduled deep item is not a card; it waits on the queue under
52
54
  `Waiting for Deep Work`.
53
55
 
56
+ ## Budgets
57
+
58
+ Three numbers, kept apart because they answer different questions.
59
+
60
+ | Budget | Value | Governs |
61
+ |---|---|---|
62
+ | Daily capacity | The Rules' deep units (default four of 45 minutes) | How much sitting time exists. A card's block spends one to three units. Units the block leaves unplanned stay unplanned; a later run may plan a second sitting on the same open card, never a second card |
63
+ | Open cards | One open deep card and one open shallow card at any moment, plus the rules card on the first run | Whether a new card may exist at all. A card leaves this count when it becomes `answered`, so follow-through never blocks the next question |
64
+ | New cards per run | At most one deep and one shallow | How much a single run may add. Three runs a day cannot stack three deep cards: the open-card cap holds across runs. A run that finds the deep slot taken versions that card or leaves the item under `Waiting for Deep Work` |
65
+
66
+ Open cards inherited above the cap (from an older planner, or a run that
67
+ broke the rule) are not planned. The gates in intake step 6 pick the one that
68
+ holds the slot; the rest wait under `Waiting for Deep Work`, named with a
69
+ mention, until it frees. An inherited card is brought up to the current
70
+ contract (shape on the Lane line, the trigger line) only when its block is
71
+ planned, never as a sweep.
72
+
54
73
  ## Three loops
55
74
 
56
75
  ### 1 · Intake (agent, every morning)
@@ -59,94 +78,165 @@ Work. An unscheduled deep item is not a card; it waits on the queue under
59
78
  create it exactly as [references/attention-type.md](references/attention-type.md)
60
79
  says, then read the rubric back and author to it.
61
80
  2. **Read the Rules.** If none exist, this run's only card is the Rules card
62
- (shape in card-shapes). Do not guess a schedule.
63
- 3. **Load the delta, not the world.** `cnotes focus list --days 7`, open cards
64
- (`cnotes notes list --type Attention --tags open --json`), today's queue,
65
- the priority board the Rules name if any, then what arrived since the last
66
- run: `cnotes shared`, `cnotes timeline --since 1d`, new Transcript notes,
67
- and the digest the intake pipeline wrote. A digest or canvas digest is
68
- orientation; open the underlying notes before any consequential claim.
81
+ (shape in card-shapes). Do not guess a schedule. If the Rules exist but
82
+ lack a line this skill reads (protected priorities, reviews the agent may
83
+ complete unasked), treat the missing line as "none", say so on the queue,
84
+ and put the two lines under `Ready for shallow window` as one item. Never
85
+ mint a second Rules card.
86
+ 3. **Load the delta, not the world.** `cnotes focus list --days 7`, open and
87
+ answered cards (`cnotes notes list --type Attention --tags open --json`,
88
+ then `--tags answered`), today's queue, the priority board the Rules name
89
+ if any, then what arrived since the last run: `cnotes shared`,
90
+ `cnotes timeline --since 1d`, new Transcript notes, and the digest the
91
+ intake pipeline wrote. A digest or canvas digest is orientation; open the
92
+ underlying notes before any consequential claim.
69
93
  4. **Open the run.** `cnotes operations begin --prompt "Attention planner · <date> · intake"`.
70
94
  One active run per user: if `begin` refuses, another session is writing.
71
95
  Hold the run only while writing.
72
- 5. **Do the agent-automatic work first.** For each item ask: can the agent
73
- retrieve, compare, draft, reproduce, or organize it; does an existing
74
- decision or rule settle it; would waiting block a customer, a deadline, or
75
- a dependent owner; is the evidence ready enough to decide? Version the
76
- existing notes with the results. Never turn a research chore into human
77
- attention. If evidence is missing, assign its retrieval to the agent or
78
- the responsible owner.
96
+ 5. **Do the agent-automatic work first.** Settle any `answered` card's
97
+ unfinished follow-through before anything new (loop 3). Then for each
98
+ item ask: can the agent retrieve, compare, draft, reproduce, or organize
99
+ it; does an existing decision or rule settle it; would waiting block a
100
+ customer, a deadline, or a dependent owner; is the evidence ready enough
101
+ to decide? Version the existing notes with the results. Never turn a
102
+ research chore into human attention. If evidence is missing, assign its
103
+ retrieval to the agent or the responsible owner.
79
104
  6. **Choose at most one deep item.** Ordered gates, not a score: Interrupt,
80
- then the one decision that unlocks the most dependent work, then queue.
81
- Ties: the item already named highest priority, the earliest real deadline,
82
- enough evidence to decide now, the least context switching. Search for an
83
- open card asking the same decision and version it rather than minting a
84
- sibling. If an urgent item displaces a planned block, name the displaced
85
- block on the card. Never hide the trade.
105
+ then a protected priority (an item the Rules or the priority board name
106
+ as protected or highest, in that order), then the one decision or making
107
+ that unlocks the most dependent work, then queue. A busy operational
108
+ decision never outranks a protected priority just because more things
109
+ hang off it. Ties: the earliest real deadline, enough evidence to decide
110
+ now, the least context switching. Search for an open card asking the same
111
+ thing and version it rather than minting a sibling. If the deep slot is
112
+ already taken by an open card, the item waits. If an urgent item displaces
113
+ a planned block, name the displaced block on the card. Never hide the
114
+ trade.
86
115
  7. **Write the card.** Read `cnotes types show Attention` and the cnotes
87
- skill's humanizer reference first. Question and default first, context
88
- second, evidence per [references/evidence-ledger.md](references/evidence-ledger.md),
89
- the post-answer contract last. Every card names one existing Project,
116
+ skill's humanizer reference first. Pick the shape: **decide** when the
117
+ block ends in an answer the agent can act on; **make** when the human must
118
+ produce or explore something themselves (a strategy, a draft only they
119
+ can write, a problem not yet answerable) and the block protects that
120
+ sitting. Question and default first for decide; what the sitting produces
121
+ first for make. Context second, evidence per
122
+ [references/evidence-ledger.md](references/evidence-ledger.md), the
123
+ post-answer contract last, ending with how the agent learns the answer
124
+ exists (step 9 of loop 3). Every card names one existing Project,
90
125
  Decision, or Customer with an `advances` mention plus one sentence of what
91
- becomes true. No such object exists: the work is queue hygiene. Leave it on
92
- the queue and do not invent a Project to hang it on. Mention every note by
93
- `[ID: Title](relationship:verb)`, never as a bare display ID.
126
+ becomes true. No such object exists: the work is queue hygiene. Leave it
127
+ on the queue and do not invent a Project to hang it on. Mention every note
128
+ by `[ID: Title](relationship:verb)`, never as a bare display ID.
94
129
  8. **Route artifact review.** When the human must inspect a canvas, section,
95
130
  or draft, create the official request only after the artifact exists:
96
131
  `cnotes review request <canvas> --reviewer me --target <ref> --brief "…" --acceptance "…" --source ATTENTION-N --idempotency-key "attention-N-<slug>-v1" --json`.
97
- Paste the returned `url` and `requestId` into the card. Never construct the
98
- URL. Private comments (`canvas comments add`) are working notes, not a
99
- request. `comments submit` sends a finished review to someone else's canvas
100
- and requests nothing.
101
- 9. **Schedule.** Deep card: prepare its orientation canvas, then
102
- `cnotes focus plan --start <ISO with the Rules' offset> --duration 45m|90m|135m --goal "Deep Work · <decision>" --canvas CANVAS-X --target ATTENTION-N`.
103
- Shallow window: one block after the first deep block, landed on the queue
104
- or the shallow card when that note sits on a canvas, goal-only otherwise.
105
- Cancel the window when `Ready for shallow window` is empty. A block that
106
- moves is cancelled before it is re-planned. Never plan a closed or past
107
- card. Verify with `cnotes focus list`.
132
+ Paste the returned `url` and `requestId` into the card, and write on the
133
+ card what an `approved` outcome authorizes. Never construct the URL.
134
+ Private comments (`canvas comments add`) are working notes, not a request.
135
+ `comments submit` sends a finished review to someone else's canvas and
136
+ requests nothing.
137
+ 9. **Schedule.** Deep card: decide whether it needs an orientation canvas.
138
+ It does when the answer rests on something beyond the card: a standing
139
+ decision that constrains it, a source that left things open, an artifact
140
+ to inspect. Build it per
141
+ [references/orientation-canvas.md](references/orientation-canvas.md)
142
+ (frames, labelled edges, banner, portals, and a text card per step that
143
+ projects the card), then
144
+ `cnotes focus plan --start <ISO with the Rules' offset> --duration 45m|90m|135m --goal "Deep Work · <decision or artifact>" --canvas CANVAS-X --target ATTENTION-N`.
145
+ A card that carries everything the reader needs skips the canvas: land the
146
+ block on the home board with `--canvas <home board> --target ATTENTION-N`,
147
+ or goal-only when there is no home board. Shallow window: one block after
148
+ the first deep block, landed on the queue or the shallow card when that
149
+ note sits on a canvas, goal-only otherwise. Cancel the window when
150
+ `Ready for shallow window` is empty. A block that moves is cancelled
151
+ before it is re-planned. Never plan a closed or past card. Verify with
152
+ `cnotes focus list`.
108
153
  10. **Update the queue.** Version today's digest with `Agent completed`,
109
154
  `Ready for shallow window`, and `Waiting for Deep Work`. Mark the intake
110
155
  source processed only after those writes and plans succeeded.
111
- 11. **Close the run.** Report the card by title, when its block runs, what the
112
- agent finished, and what waits. Surface the orientation canvas link.
156
+ 11. **Close the run.** Report the card by title and shape, when its block
157
+ runs, what the agent finished, what waits, and how the agent will learn
158
+ the answer (a scheduled close, or the human saying so). Surface the
159
+ orientation canvas link when one exists.
113
160
 
114
161
  ### 2 · Decide (human, time-boxed)
115
162
 
116
- The block opens the orientation canvas landed on the card. The human reads the
117
- question and the recommended default first; everything else is on the card if
118
- they want it. They answer by filling the `Your decision` line and saving, or
119
- by replying in chat with the card's title. Nothing else is asked of them: no
120
- "tell the agent" ritual, no naming of the next step. The card already says
121
- what happens next.
163
+ The block opens the canvas landed on the card. On a decide card the human
164
+ reads the question and the recommended default first; everything else is on
165
+ the card if they want it. They answer by filling the `Your decision` line and
166
+ saving, or by replying in chat with the card's title. On a make card they
167
+ work in the sitting, then fill the `Outcome` line with what now exists or
168
+ "continue", or leave the produced note versioned; either is an answer. Nothing
169
+ else is asked of them when a scheduled close will find the answer. When no
170
+ schedule exists, the card's last line asks them to say they answered, and
171
+ that one sentence is the whole ritual.
122
172
 
123
173
  ### 3 · Close the loop (agent, after each block and at day end)
124
174
 
125
- 1. **Find answered cards.** An open card whose latest version has a filled
126
- `Your decision` line, a chat reply naming a card, or a review request that
127
- reached a terminal status (`cnotes review get <requestId> --json`).
128
- 2. **Open the run**, then convert each answer into the promised updates:
175
+ 1. **Find answered cards.** An open card is answered when its latest version
176
+ has text after `**Your decision:**` or `**Outcome:**`, when a chat reply
177
+ names it, when a make card's produced note carries a version by the human
178
+ after the block started, or when a linked review request reached an
179
+ outcome that maps to an answer. Map every review state explicitly, as
180
+ `cnotes review get <requestId> --json` returns it:
181
+
182
+ | Review state | Meaning for the card |
183
+ |---|---|
184
+ | `submitted`, outcome `approved` | Yes to what the card's `Review action` says the review settles. Follow through on that, and on nothing the card did not name |
185
+ | `submitted`, outcome `changes_requested` | No as drafted. The findings are the human's edit: version the artifact, request again under the next idempotency key (`-v2`), card stays `open` |
186
+ | `submitted`, no outcome | Not an answer; a plain comment send. Read the comments as working notes and keep the card `open` |
187
+ | `returned` | Not an answer. The reason names what the reviewer lacked; supply it and request again |
188
+ | `revoked`, `expired` | Not an answer. The ask died; request again or move the item to the queue |
189
+ | `pending`, `accepted` | Waiting |
190
+
191
+ Execute only when the answer resolves the card's question and grants the
192
+ permission the action needs. A terminal review is not by itself a grant.
193
+ 2. **Record the answer.** Open the run, then version the card with a
194
+ `## Follow-through` section (shape in card-shapes): the version number the
195
+ answer was read from, and one line per promised action from `After you
196
+ answer`, each with a status: `done`, `waiting: <whose yes>`,
197
+ `failed: <reason>`, `skipped: <why>`. Tag it `answered,<lane>`. Write this
198
+ before executing anything, so a crash leaves a ledger, not a mystery.
199
+ 3. **Execute from the ledger.** Convert the answer into the promised updates:
129
200
  version connected notes, produce the promised draft or brief, hand named
130
- owners their requests.
131
- 3. **Mint durable objects only when the answer created them.** A Decision,
201
+ owners their requests. Update each line as it lands. On a rerun, read the
202
+ ledger first: a `done` line is never repeated, a `failed` line is retried,
203
+ a `waiting` line is checked for its yes. A send recorded `done` is never
204
+ sent twice, whatever the queue says.
205
+ 4. **Mint durable objects only when the answer created them.** A Decision,
132
206
  Requirement, Task, Question, or Issue, and only then. Prefer a new version
133
207
  of an existing note over a sibling.
134
- 4. **Respect the reserved actions.** Customer contact, commitments, deletions,
208
+ 5. **Respect the reserved actions.** Customer contact, commitments, deletions,
135
209
  and anything irreversible happen only if the answer explicitly approved
136
- them. Record what still waits.
137
- 5. **Close the card.** Version it with a `## Closed` section (what was done,
138
- what still waits, with mentions), then `cnotes notes update ATTENTION-N --tags closed,<lane>`.
139
- Open the next card only if judgment is still needed, and still only one.
140
- 6. **Update the queue.** `Moved today`, in outcome language.
210
+ them. Otherwise the line stays `waiting: <whose yes>` and the ask goes to
211
+ the queue under `Ready for shallow window`.
212
+ 6. **Close the card.** Only when no ledger line is `failed` and every
213
+ `waiting` line names a yes that now sits on the queue: version it with a
214
+ `## Closed` section (what was done, what still waits, with mentions), then
215
+ `cnotes notes update ATTENTION-N --tags closed,<lane>`. A card with a
216
+ `failed` line stays `answered` and is the first thing the next run
217
+ settles. A new answer on an already `answered` card (the human edited the
218
+ line after the recorded version) gets a second `Follow-through` block, not
219
+ a silent rerun.
220
+ 7. **Open the next card** only if judgment is still needed, and still only
221
+ one, and only if the deep slot is empty.
222
+ 8. **Update the queue.** `Moved today`, in outcome language, including any
223
+ follow-through that failed or still waits.
224
+ 9. **State the trigger.** The last line of every card's `After you answer`
225
+ says how the agent learns the answer exists: "A scheduled close runs at
226
+ <time>" when a routine exists, or "Tell the agent you answered" when none
227
+ does. Never promise follow-through the host cannot wake up for.
141
228
 
142
229
  ## Closing the day and the week
143
230
 
144
231
  **Day.** When the user says so, or after the last block, version today's
145
232
  digest with `Moved today`: what is now true that was not true this morning;
146
233
  deep units used of the budget; whether the shallow window ran or was
147
- cancelled; what is still open. A sent email is not a move. A drafted note is
148
- not a move. If nothing moved, write that. Do not mint a journal or an
149
- Achievement note.
234
+ cancelled; what is still open, including answered cards whose follow-through
235
+ failed or waits. A move is a change in what is true: a commitment made, a
236
+ blocker released, a decision recorded, an artifact that now exists. A sent
237
+ email or a drafted brief counts by the change it enabled, named in outcome
238
+ language; the artifact alone is not the move. If nothing moved, write that.
239
+ Do not mint a journal or an Achievement note.
150
240
 
151
241
  **Week.** Friday after the last block, version the standing Update titled
152
242
  `Attention spend · weekly close` (create it once if it does not exist, never a
@@ -158,10 +248,14 @@ shows a trade the human must choose.
158
248
  ## Intake sources
159
249
 
160
250
  - **IncomingDigest.** Already synthesized, PII-free evidence. Read only the
161
- latest version of today's. Never write PII, names, ticket IDs, or
162
- source-system identifiers into CreatorNotes. Join Q-IDs only through the
163
- owner's private action key if they gave one. Older IntakeDigest or
164
- DailyAttentionDigest notes are superseded: read them, never create them.
251
+ latest version of today's. PII here means what the pipeline stripped: end
252
+ users' names, emails, phone numbers, ticket IDs, and source-system
253
+ identifiers. Never write those into CreatorNotes. Workspace members, named
254
+ owners, Customer notes (an account, not a person), and speaker attribution
255
+ by role or member name are workspace vocabulary and belong on cards. Join
256
+ Q-IDs only through the owner's private action key if they gave one. Older
257
+ IntakeDigest or DailyAttentionDigest notes are superseded: read them, never
258
+ create them.
165
259
  - **Transcript.** Raw evidence, never a reading assignment for the human.
166
260
  Preserve it. Write one short Huddle outcome note `derived-from` it,
167
261
  separating what participants settled from what they proposed, questioned,
@@ -169,10 +263,17 @@ shows a trade the human must choose.
169
263
  artifact production to the named owners. Tag the transcript `digested` only
170
264
  after the linked updates and plans succeed. The card carries the
171
265
  decision-ready context and links the transcript as provenance only.
172
- - **Shared with you.** `cnotes shared` is the inbox of asks and shares. A
173
- review assigned to you is agent work: `cnotes review get`, judge the pinned
174
- target against every criterion, then `complete` or `return`. Never fabricate
175
- an outcome you could not judge.
266
+ - **Shared with you.** `cnotes shared` is the inbox of asks and shares. The
267
+ agent prepares every review assigned to the human: `cnotes review get`,
268
+ judge the pinned target against every criterion, draft the findings and
269
+ the outcome. It runs `complete` or `return` itself only when the Rules
270
+ delegate that class of review (the Rules card names which). Every other
271
+ prepared review goes under `Ready for shallow window` with the drafted
272
+ outcome as the recommended default, the criterion that fails and the edit
273
+ that would satisfy it, and the human completes it in the window. Dates and
274
+ promises inside a draft go stale while a review waits; check them against
275
+ today before calling a criterion met. Never fabricate an outcome you could
276
+ not judge.
176
277
 
177
278
  ## Board hygiene
178
279
 
@@ -187,8 +288,9 @@ when the send rests on them.
187
288
  ## Invariants
188
289
 
189
290
  1. Work the agent can do safely never becomes a card.
190
- 2. At most one deep card per run. A shallow card only for a drafted,
191
- consequential external send. The Rules card is the single exception.
291
+ 2. One open deep card and one open shallow card at a time, at most one of
292
+ each minted per run. A shallow card only for a drafted, consequential
293
+ external send. The Rules card is the single exception.
192
294
  3. Every card names what it advances with an `advances` mention, or the work
193
295
  stays on the queue.
194
296
  4. Untested product behaviour is Unknown. It never appears as fact in a
@@ -196,16 +298,32 @@ when the send rests on them.
196
298
  Validation, then draft.
197
299
  5. A review request carries the server-returned URL and request ID, or it
198
300
  does not exist on the card.
199
- 6. PII and source identifiers never enter CreatorNotes from the queue.
301
+ 6. End-user PII and source identifiers never enter CreatorNotes from the
302
+ queue.
200
303
  7. Intake is marked processed only after the writes and plans succeed.
304
+ 8. The agent executes only on an answer that resolves the question and grants
305
+ the permission the action needs. A terminal review, a cancelled ask, or a
306
+ returned review is not an answer.
307
+ 9. A card closes only from its follow-through ledger, and a ledger line is
308
+ never repeated once `done`.
201
309
 
202
310
  Triage mints nothing but Attention, plus Comms or Validation when a card will
203
311
  approve or rest on that object, plus one Huddle on the transcript path. Every
204
312
  other type waits for the answer.
205
313
 
206
- ## Run it unasked
314
+ ## How the agent wakes
207
315
 
208
316
  Three moments: morning intake, the close after the last block, the Friday
209
- close. If the host agent supports scheduled routines, schedule all three so
210
- the card is waiting when the human sits down and nobody has to remember to
211
- ask.
317
+ close. The text of this skill cannot wake anyone; only one of these can:
318
+
319
+ - **Scheduled routines**, when the host agent supports them. Schedule all
320
+ three so the card is waiting when the human sits down and the close finds
321
+ the answer without being told. This is the intended mode.
322
+ - **The human's invocation**: "I filled ATTENTION-12", "close the day",
323
+ "what did I answer". Always a trigger, and the only one when no routine
324
+ exists.
325
+
326
+ There is no event trigger: saving an answer or finishing a block does not
327
+ notify the agent. So at the end of intake, say which mode is in force, and
328
+ write it on the card (loop 3, step 9). Automatic follow-through that was
329
+ never scheduled is a broken promise, not a feature.
@@ -23,7 +23,7 @@ it must never block a quick human capture.
23
23
 
24
24
  ```bash
25
25
  RUBRIC=$(cat <<'TXT'
26
- An Attention note is a time-boxed decision interface for one human. It asks only for judgment, permission, preference, or accountability that an agent cannot supply safely. A good one leads with the question and a recommended default, says why it needs attention now, gives enough source-grounded context to decide without opening other notes, and states what happens after the answer and which external actions still need approval. Keep the time box honest: about two minutes for a shallow approve-or-send, 45 to 135 minutes for deep judgment.
26
+ An Attention note is a time-boxed interface for one human. It asks only for judgment, permission, preference, or accountability that an agent cannot supply safely, or protects a sitting in which the human must make or explore something themselves. A good one leads with the question and a recommended default, or with what the sitting produces, says why it needs attention now, gives enough source-grounded context to decide without opening other notes, and states what happens after the answer, which external actions still need approval, and how the agent will learn the answer exists. Keep the time box honest: about two minutes for a shallow approve-or-send, 45 to 135 minutes for deep judgment or making.
27
27
 
28
28
  If you are an agent: do every safe step first and list it under "What the agent already did". Name the Project, Decision, or Customer this card advances with an advances mention and one sentence of what becomes true. Classify each consequential claim as Confirmed, Reported, Inference, Recommendation, or Unknown, and link its source with a readable relationship mention such as [NOTE-12: Title](relationship:references); never a bare display ID. Treat untested product behaviour as Unknown. Lean less the harder the choice is to undo; on a pure value fork, do not pick, give the default with its dissent. When the human must inspect a canvas or draft, link an official review request with its server-returned URL and request ID; private comments are not a request. Write "Complete when" as an observable state, never "discussed" or "reviewed".
29
29
  TXT
@@ -37,7 +37,8 @@ cnotes types show Attention -w <workspaceId> --json # validationPrompt must be
37
37
  ```
38
38
 
39
39
  If an existing Attention type comes back with an empty `validationPrompt`,
40
- apply the same rubric the same way and read it back again.
40
+ or one that predates the make shape (no mention of a sitting), apply the
41
+ rubric above the same way and read it back again.
41
42
 
42
43
  ## Related types the planner may touch
43
44
 
@@ -1,27 +1,34 @@
1
1
  # Card shapes
2
2
 
3
- Three shapes, one rule: the reader arrives cold and should be able to answer
3
+ Four shapes, one rule: the reader arrives cold and should be able to answer
4
4
  before scrolling. Question first, recommended default second, context third,
5
5
  evidence fourth, the post-answer contract last. Depth follows the stakes: a
6
6
  shallow card is a screen at most, a deep card a few, and neither carries a
7
7
  section that adds no decision value. Provenance and the post-answer contract
8
- are never omitted.
9
-
10
- The human answers after the colon on a `**Your decision:**` line. A card is
11
- answered when any such line has text after the colon, or when the human names
12
- the card in chat. Titles carry no time: the focus block is the source of truth
8
+ are never omitted, and the contract always ends by saying how the agent will
9
+ learn the answer exists.
10
+
11
+ The human answers after the colon on a `**Your decision:**` line (decide and
12
+ shallow cards) or an `**Outcome:**` line (make cards). A card is answered when
13
+ any such line has text after the colon, when the human names the card in chat,
14
+ or, on a make card, when the produced note carries a version by the human after
15
+ the block started. Titles carry no time: the focus block is the source of truth
13
16
  for when, and a moved block must not leave a stale title behind.
14
17
 
18
+ States travel as tags: `open` until answered, `answered` while the ledger runs,
19
+ `closed` once every promise is settled. The lane tag (`deep`, `shallow`) stays
20
+ throughout.
21
+
15
22
  Read `cnotes types show Attention` and the cnotes skill's humanizer reference
16
23
  before writing. Mention every note as `[ID: Title](relationship:verb)`; reuse
17
24
  the workspace's relationship vocabulary (`cnotes rel types`).
18
25
 
19
- ## Deep card
26
+ ## Deep card · decide
20
27
 
21
28
  ```markdown
22
29
  # <The decision the human will produce>
23
30
 
24
- **Lane:** Deep Work · 45 min
31
+ **Lane:** Deep Work · 45 min · decide
25
32
  **Advances:** [PROJECT-N: Title](relationship:advances) by <what becomes true if this block succeeds>
26
33
  **Rules:** [NOTE-N: Attention rules](relationship:references)
27
34
 
@@ -69,6 +76,8 @@ options cost. Under one screen. Orientation mentions belong here:>
69
76
  2. The agent will <scheduling, delegation, or preparation step>.
70
77
  3. The agent will not <customer contact, commitment, destructive change, or
71
78
  other external side effect> without your explicit yes.
79
+ 4. <"A scheduled close runs at HH:MM and picks this up." or "Tell the agent
80
+ you answered; nothing runs until you do.">
72
81
 
73
82
  ## Complete when
74
83
 
@@ -82,6 +91,8 @@ after the artifact exists and `cnotes review request` returned:
82
91
  ## Review action
83
92
 
84
93
  **Decision:** <what this review settles>
94
+ **An approved outcome authorizes:** <exactly what the agent may then do, and
95
+ what still needs a separate yes>
85
96
  **Acceptance:** <short, testable criteria>
86
97
  **Open the review:** [Review the proposal](<url returned by the server>)
87
98
  **Request:** `<requestId>`
@@ -90,6 +101,72 @@ after the artifact exists and `cnotes review request` returned:
90
101
  [SECTION-N: The exact review surface](relationship:related-to)
91
102
  ```
92
103
 
104
+ ## Deep card · make
105
+
106
+ For a sitting the human must spend themselves: a strategy to develop, a
107
+ problem to explore before it has an answerable question, a draft only they
108
+ can write. The block protects the making; the agent scaffolds it and takes
109
+ over afterwards. The card leads with what the sitting produces, not with a
110
+ question.
111
+
112
+ ```markdown
113
+ # <The artifact or state the sitting produces>
114
+
115
+ **Lane:** Deep Work · 90 min · make
116
+ **Advances:** [PROJECT-N: Title](relationship:advances) by <what becomes true when this exists>
117
+ **Rules:** [NOTE-N: Attention rules](relationship:references)
118
+
119
+ ## What this sitting produces
120
+
121
+ <One sentence: the note, section, or canvas that exists at the end, and the
122
+ state it must reach. Name the target note with a mention:>
123
+
124
+ - [STRATEGY-N: Title](relationship:produces)
125
+
126
+ **Outcome:**
127
+
128
+ ## Why now
129
+
130
+ <Stakes and what waits on this. Three sentences.>
131
+
132
+ ## Start here
133
+
134
+ <The agent's scaffold: the notes to open first, the draft or outline it
135
+ prepared, the questions to hold in mind, the constraints that already bind
136
+ the answer. Under one screen. Orientation mentions belong here.>
137
+
138
+ ## Evidence
139
+
140
+ <Only the claims the making rests on. The full table when a claim would
141
+ change what gets made; otherwise one line per claim with its class and
142
+ source.>
143
+
144
+ ## What the agent already did
145
+
146
+ - <the outline, comparison, or research that seeds the sitting>
147
+ - <what is assigned to another owner, by name>
148
+
149
+ ## After the block
150
+
151
+ 1. The agent will read the produced note and <version the linked notes, or
152
+ extract the decisions it contains into Decision notes>.
153
+ 2. The agent will <schedule the next sitting if the outcome says "continue",
154
+ or route what now exists>.
155
+ 3. The agent will not <share, send, or commit the artifact> without your
156
+ explicit yes.
157
+ 4. <"A scheduled close runs at HH:MM and picks this up." or "Tell the agent
158
+ you finished; nothing runs until you do.">
159
+
160
+ ## Complete when
161
+
162
+ <An observable state of the artifact: "a version of STRATEGY-N names the
163
+ wedge and the two alternatives it rejects", never "time was spent".>
164
+ ```
165
+
166
+ The `Outcome` line takes what now exists, or `continue` with what is still
167
+ missing. A make card whose outcome is `continue` stays `open` and the next run
168
+ plans another sitting on the same card; it never mints a sibling.
169
+
93
170
  ## Shallow card
94
171
 
95
172
  Only for a consequential external send that already has a draft. Anything
@@ -142,6 +219,8 @@ The one shallow card allowed without a draft. Its answer becomes the standing
142
219
  - Sources the agent may read: <the intake workspace, shared items, transcripts, the priority board>
143
220
  - Actions the agent may take unasked: research, compare, draft, version notes, plan and cancel focus blocks
144
221
  - Actions that always need a yes: customer contact, commitments, deletions, anything irreversible
222
+ - Protected priorities: <the one or two objects that outrank throughput, such as a strategy canvas, or "none">
223
+ - Reviews the agent may complete unasked: <a class, such as reviews it requested itself or drafts under 500 words, or "none: prepare every review, I complete it">
145
224
  - Interrupt rule: a blocked customer takes the next unused deep unit
146
225
 
147
226
  **Your decision:**
@@ -152,27 +231,48 @@ The agent saves the ratified lines as the standing `Attention rules` note,
152
231
  mentions it from every future card, and runs intake.
153
232
  ```
154
233
 
234
+ ## Follow-through section
235
+
236
+ Appended as a new version the moment an answer is found, before anything is
237
+ executed, and updated as each line lands. The tags change to
238
+ `answered,<lane>` in the same write. A rerun reads this first: `done` is never
239
+ repeated, `failed` is retried, `waiting` is checked for its yes.
240
+
241
+ ```markdown
242
+ ## Follow-through
243
+
244
+ Answer read from version <N>, <date>: <the answer in one line>.
245
+
246
+ 1. <promised action> · done · [NOTE-N: Title](relationship:references)
247
+ 2. <promised action> · waiting: <whose yes, and where it sits on the queue>
248
+ 3. <promised action> · failed: <reason, and what the next run will try>
249
+ 4. <promised action> · skipped: <why the answer made it unnecessary>
250
+ ```
251
+
252
+ A second answer on the same card (the human changed the line after version
253
+ N) gets a second `Follow-through` block under it, never an edit of the first.
254
+
155
255
  ## Closed section
156
256
 
157
- Appended as a new version when the loop closes, before the tags change to
158
- `closed,<lane>`:
257
+ Appended as a new version only when no line above is `failed` and every
258
+ `waiting` line names a yes that now sits on the queue. The tags change to
259
+ `closed,<lane>` in the same write.
159
260
 
160
261
  ```markdown
161
262
  ## Closed
162
263
 
163
- Answered <date>: <the answer in one line>.
164
264
  Done: <what the agent did, with mentions>.
165
- Still waiting: <the external action that needs a yes, or "nothing">.
265
+ Still waiting: <the external action that needs a yes and where it sits, or "nothing">.
166
266
  ```
167
267
 
168
- ## Worked example · deep
268
+ ## Worked example · decide
169
269
 
170
270
  A fictional customer, written the way a real card should read.
171
271
 
172
272
  ```markdown
173
273
  # Choose the recovery offer for Northwind's export failures
174
274
 
175
- **Lane:** Deep Work · 45 min
275
+ **Lane:** Deep Work · 45 min · decide
176
276
  **Advances:** [CUSTOMER-7: Northwind Logistics](relationship:advances) by a recovery offer they can accept this week instead of escalating to procurement
177
277
  **Rules:** [NOTE-31: Attention rules](relationship:references)
178
278
 
@@ -216,6 +316,7 @@ Exports over 50,000 rows time out; the agent reproduced it today. The fix is sch
216
316
  1. The agent will fill the offer into the draft and version it.
217
317
  2. The agent will queue the send for the shallow window.
218
318
  3. The agent will not send anything to Northwind without your explicit yes on the draft.
319
+ 4. A scheduled close runs at 12:15 and picks this up.
219
320
 
220
321
  ## Complete when
221
322
 
@@ -252,4 +353,25 @@ Their procurement conversation is Friday. Sending today gives them two working d
252
353
  1. `yes`: the agent sends it and records the send on the customer note.
253
354
  2. `edit`: the agent applies your edit, then sends.
254
355
  3. `hold`: it returns to the queue under `Ready for shallow window`.
356
+ 4. A scheduled close runs at 12:15 and picks this up.
255
357
  ```
358
+
359
+ ## Worked example · follow-through
360
+
361
+ The decide card above, after the human wrote "fix date plus one month's
362
+ credit" on version 3 and the close loop ran:
363
+
364
+ ```markdown
365
+ ## Follow-through
366
+
367
+ Answer read from version 3, Tuesday: fix date plus one month's credit.
368
+
369
+ 1. Fill the offer into [COMMS-12: Northwind recovery note](relationship:references) · done
370
+ 2. Queue the send for the shallow window · done · listed under `Ready for shallow window` on [INCOMINGDIGEST-9: Tuesday](relationship:references)
371
+ 3. Send to Northwind · waiting: your yes on [ATTENTION-43: Send the recovery note to Northwind?](relationship:references)
372
+ ```
373
+
374
+ Every line is `done` or `waiting` on a yes that sits on the queue, so the card
375
+ closes in the same run. Had line 1 failed (the draft locked by another
376
+ session, say), the card would stay `answered` and the next run would retry
377
+ line 1 before minting anything new.
@@ -44,10 +44,11 @@ The ledger's depth follows the stakes, not the template.
44
44
 
45
45
  | Card | Ledger |
46
46
  |---|---|
47
- | Deep | The full table, one row per consequential claim |
47
+ | Decide | The full table, one row per consequential claim |
48
+ | Make | Only the claims the making rests on. The full table when a claim would change what gets made; otherwise one line per claim with its class and source |
48
49
  | Shallow | One line per claim the draft makes, each with its class and source. If the draft makes no product-behaviour claims, one line saying so |
49
50
  | Rules | None. The card asks for preferences, not facts |
50
51
 
51
- A deep card with no Reported, Inference, or Unknown rows is a signal to look
52
+ A decide card with no Reported, Inference, or Unknown rows is a signal to look
52
53
  again: either the decision is agent-automatic and should not be a card, or a
53
54
  claim has been promoted without a source.
@@ -0,0 +1,112 @@
1
+ # Orientation canvas
2
+
3
+ A deep card whose answer rests on more than itself gets a canvas the block
4
+ opens on: a standing decision that constrains it, a source that left things
5
+ open, an artifact to inspect. A card that carries everything the reader needs
6
+ skips the canvas and lands its block on the home board; a canvas that would
7
+ hold only the card and its source is presentation overhead, not orientation.
8
+ When the canvas is warranted, it is not done when the right notes are on it. A flat pile of five correct notes makes the human
9
+ reconstruct the chain the agent already knows, which is the failure the canvas
10
+ exists to prevent. Lay it as a story the reader follows left to right in ten
11
+ seconds, and write the flow of thought on the board beside the notes.
12
+
13
+ Title: `ATTENTION-N · Orientation`, using the card's immutable display id, never
14
+ its heading. Goal: one sentence saying what the block decides and that the card
15
+ is first. One `cnotes canvas place` call builds the whole thing from a spec; the
16
+ sections size themselves around their content, so no coordinates.
17
+
18
+ ## The frames, left to right
19
+
20
+ | Frame | Holds | Edge to the card |
21
+ |---|---|---|
22
+ | `1 · Came from` | The digest, transcript, or share the card was minted from, plus one text card saying which item and why nothing else needed the sitting | `produced` |
23
+ | `2 · Decide here` | The Attention card, with a text card beside it per element: why now, then one per numbered decision with its recommendation and what flips it | none; this is the card |
24
+ | `What it rests on` (under frame 2) | The standing Decision that constrains the answer, the Huddle or Validation that left things open, each with a text card | `constrains`, `left open`, `grounds` |
25
+ | `3 · Advances` | The Project, Decision, or Customer the card names in `advances`, with a text card saying what becomes true if the block succeeds and which external send still needs a yes | from the card: `advances` |
26
+ | `Where things live` (bottom) | Portals: the work board the card came from and the home board | none |
27
+
28
+ Banner at the top, `richtext` medium, untinted, at most five sentences, in the
29
+ cnotes skill's banner order (hard rule 7 under "Canvas Elements"): what happened,
30
+ what this board is for, who answers and where, how to read it. Then the lines
31
+ only this canvas needs: the block day and time, "answer on the card", where the
32
+ portals go. A banner that opens with the block time and the reading order and
33
+ never says what the card is about fails the cnotes cold-reader test.
34
+ Reminder material (rules, operating plan) does not go on an orientation canvas;
35
+ the home board carries it.
36
+
37
+ ## The text cards
38
+
39
+ Each text card is a projection of a note that already holds the full record.
40
+ The rules are the cnotes skill's rules for text elements, applied hard:
41
+
42
+ - At most three sentences. One bold lead phrase is fine (`**Why now.**`, `**1 · The date you owe.**`).
43
+ - Every number, date, name, and recommendation is lifted from the card or its
44
+ source verbatim. Never restate a figure, never add one. Run the preservation
45
+ gate before placing.
46
+ - Name every note and canvas with a relationship mention carrying its real title
47
+ (`[DECISION-6J2: Title](relationship:constrains)`); it renders as a chip. A bare
48
+ display id is a defect. The chip is for the reader, not the graph: the note body
49
+ still carries the mention that travels.
50
+ - Untinted by default. Tint only by role: `#F59E0B` for the constraining rule,
51
+ `#3B82F6` for source evidence. Nothing else.
52
+ - `size: "small"` (560px) beside a 280px note card. Put text cards in the same
53
+ frame as the note they project, in a vertical stack under or beside it.
54
+
55
+ A text card that says something no note says is a bug: put it in the note first,
56
+ then project it.
57
+
58
+ ## Spec template
59
+
60
+ ```json
61
+ { "placement": "exact", "origin": { "x": 100, "y": 100 },
62
+ "root": { "kind": "stack", "axis": "vertical", "gap": "spacious", "items": [
63
+ { "kind": "item", "type": "richtext", "size": "medium", "content": "# <Day HH:MM> · <card title>\n<reading order; answer on the card; portals below>" },
64
+ { "kind": "stack", "axis": "horizontal", "gap": "spacious", "align": "start", "items": [
65
+ { "kind": "section", "name": "1 · Came from", "child": { "kind": "stack", "axis": "vertical", "gap": "medium", "items": [
66
+ { "kind": "item", "type": "note", "noteId": "<DIGEST>", "key": "src" },
67
+ { "kind": "item", "type": "richtext", "size": "small", "content": "<which item, why only this sitting>" } ] } },
68
+ { "kind": "stack", "axis": "vertical", "gap": "medium", "items": [
69
+ { "kind": "section", "name": "2 · Decide here", "child": { "kind": "stack", "axis": "horizontal", "gap": "medium", "align": "start", "items": [
70
+ { "kind": "item", "type": "note", "noteId": "ATTENTION-N", "key": "card" },
71
+ { "kind": "stack", "axis": "vertical", "gap": "tight", "items": [
72
+ { "kind": "item", "type": "richtext", "size": "small", "content": "**Why now.** <from the card>" },
73
+ { "kind": "item", "type": "richtext", "size": "small", "content": "**1 · <decision>.** <recommendation>. Flips if <condition>." } ] } ] } },
74
+ { "kind": "section", "name": "What it rests on", "child": { "kind": "stack", "axis": "horizontal", "gap": "medium", "align": "start", "items": [
75
+ { "kind": "stack", "axis": "vertical", "gap": "tight", "items": [
76
+ { "kind": "item", "type": "note", "noteId": "<DECISION>", "key": "rule" },
77
+ { "kind": "item", "type": "richtext", "size": "small", "colorHex": "#F59E0B", "content": "<the standing rule and what it forces here>" } ] },
78
+ { "kind": "stack", "axis": "vertical", "gap": "tight", "items": [
79
+ { "kind": "item", "type": "note", "noteId": "<HUDDLE or VALIDATION>", "key": "open" },
80
+ { "kind": "item", "type": "richtext", "size": "small", "colorHex": "#3B82F6", "content": "<what it left open, what is reported, what is unknown>" } ] } ] } } ] },
81
+ { "kind": "section", "name": "3 · Advances", "child": { "kind": "stack", "axis": "vertical", "gap": "medium", "items": [
82
+ { "kind": "item", "type": "note", "noteId": "<PROJECT>", "key": "obj" },
83
+ { "kind": "item", "type": "richtext", "size": "small", "content": "<what becomes true; which send stays with the human>" } ] } } ] },
84
+ { "kind": "section", "name": "Where things live", "child": { "kind": "stack", "axis": "horizontal", "gap": "medium", "items": [
85
+ { "kind": "item", "type": "canvas", "linkedCanvasId": "<work board convex id>" },
86
+ { "kind": "item", "type": "canvas", "linkedCanvasId": "<home board convex id>" } ] } } ] },
87
+ "edges": [
88
+ { "from": "@src", "to": "@card", "label": "produced" },
89
+ { "from": "@card", "to": "@obj", "label": "advances" },
90
+ { "from": "@rule", "to": "@card", "label": "constrains" },
91
+ { "from": "@open", "to": "@card", "label": "left open" } ] }
92
+ ```
93
+
94
+ Drop a frame that has nothing to hold; never leave an empty one. Add a frame
95
+ only when the card rests on something the reader must see (a Contradiction or a
96
+ Fork gets its own layout from the workspace's layout catalog instead).
97
+
98
+ ## Rebuilding
99
+
100
+ An orientation canvas is rebuilt, not patched: `bulk-remove` every node (notes,
101
+ sections, portals, the banner) inside one operations run, then `place` the new
102
+ spec. Section ids change; nothing should reference them by id. The focus block
103
+ targets the card, not a section, so it survives the rebuild. Verify with
104
+ `cnotes focus list` that the block still lands on the canvas and the card.
105
+
106
+ ## Read-back test
107
+
108
+ `cnotes canvas read`: every note sits in a named frame, every edge carries a
109
+ verb, every text card is at most three sentences and traceable to a note, the
110
+ banner names the block, and both portals resolve. Then the glance test: a
111
+ person zoomed to fit should see came from, decide here, advances, and start
112
+ reading at the card.
@@ -253,7 +253,11 @@ cnotes canvas digest <canvasId>
253
253
  # NAMING: never put an em-dash (—) or en-dash (–) in a canvas name. Use the interpunct
254
254
  # · (U+00B7, MIDDLE DOT — a small mid-height dot, NOT a bullet •) as the separator,
255
255
  # e.g. "Path to Revenue · Funding strategy", not "Path to Revenue — Funding strategy".
256
- cnotes canvas create "<name>" [--goal "<text>"] [--audience "<text>"] # prints Ref (CANVAS-N) + Link — surface them to the user (see "Surfacing the canvas link")
256
+ cnotes canvas create "<name>" --goal "<text>" [--audience "<text>"] # prints Ref (CANVAS-N) + Link — surface them to the user (see "Surfacing the canvas link")
257
+ # --goal is not optional in practice: write it FIRST, for a reader, as the decision or artifact
258
+ # the board exists to produce ("Decide whether X; pick the first slice"), never as a brief to
259
+ # yourself ("Research Tufte, diverge on..."). The goal renders only inside the (i) popover, so
260
+ # nobody sees it before the banner; the banner restates it (hard rule 7).
257
261
  cnotes canvas update <canvasId> [--title "<text>"] [--goal "<text>"] [--audience "<text>"]
258
262
  cnotes canvas delete <canvasId>
259
263
  cnotes canvas set-as-home <canvasId>
@@ -266,10 +270,12 @@ cnotes canvas add-node <canvasId> --note <noteId> [--x <n>] [--y <n>] # (despi
266
270
  # text = free-form rich text placed on the canvas (wire type: richtext). Markdown —
267
271
  # headings, emphasis, images. Optional background tint (--color); DEFAULT IS NO BACKGROUND.
268
272
  # A HEADING IS JUST `--content '# Q1 Goals'` with no tint — there is no separate heading
269
- # element. CARD-sized framing (at most ~3 sentences): orientation banners, emphasis
273
+ # element. CARD-sized framing (at most ~3 sentences; the orientation banner may run to ~5 and follows hard rule 7), emphasis
270
274
  # quoting a note, image tiles. Unversioned, unsearchable, no display ID (nothing can cite
271
- # it) — never the sole home of a claim. NO [NOTE-X](relationship:...) / [[...]] mention
272
- # syntax (corrupts the card; use plain display IDs). Knowledge worth keeping = a typed note.
275
+ # it) — never the sole home of a claim. When the card names a note or canvas, write a
276
+ # relationship mention with the REAL title, `[NOTE-12: Title](relationship:verb)`: it renders
277
+ # as a chip (verified 2026-09-05). A bare display id in card prose is a defect. The chip is
278
+ # presentational (no graph edge), so knowledge worth keeping = a typed note.
273
279
  cnotes canvas add-text <canvasId> --content "<markdown>" [--size small|medium|large] [--color "<hex>"] [--x <n>] [--y <n>] # inline (short only)
274
280
  cnotes canvas add-text <canvasId> --content-file <path.md> [--size small|medium|large] [--color "<hex>"] [--x <n>] [--y <n>]
275
281
  cnotes canvas add-richtext ... # DEPRECATED alias of add-text (identical flags). Use add-text.
@@ -876,7 +882,7 @@ A canvas holds two tiers of material, and the difference is load-bearing:
876
882
  | N distinct things (questions, risks, options, findings) | **N notes** grouped in a **list**; `--description` = one-line frame | bullets in one text element or in a list `--description` |
877
883
  | A named REGION of the canvas ("Shaping", "Open Questions") | a **section** frame (`add-section`) — draggable region, mention-addressable as `[[SECTION-<n>]]` from note bodies | a floating text heading over an implied area |
878
884
  | A heading / one-line label where a frame is too heavy (a column header inside a frame, a lane key) | a **text** element holding a markdown heading — `add-text --content '# Q1 Goals'`, no `--color` (leave it untinted), title case | a tinted card, or a section frame for something that isn't a region |
879
- | Prose telling the reader how to traverse THIS canvas | a **text** orientation banner (one per canvas or band; up to ~5 sentences) | a Guide note nobody needs off-canvas |
885
+ | Orientation: what happened, what this board is for, and how to read it | a **text** orientation banner in the fixed shape of rule 7 (one per canvas; a band may add a short one; up to ~5 sentences) | a reading-order-only banner, or a Guide note nobody needs off-canvas |
880
886
  | Emphasis — restating a key claim for screen presence | a **text** element that QUOTES a note (the note stays the home) | the text element as the only copy |
881
887
  | An image tile (logo, mockup, screenshot) | a **text** element holding the image, beside the owning note; embed the same image in the note body via `cnotes files upload <path> --markdown` so the note stays self-contained | the image as the knowledge itself |
882
888
  | A grid of images for review (mood board) | N text-element image tiles in a `grid` place spec + ONE note holding the decision criteria / rationale for the set | a caption note per tile, or rationale in the tiles |
@@ -887,7 +893,7 @@ A canvas holds two tiers of material, and the difference is load-bearing:
887
893
  #### Hard rules (each one has burned a real canvas)
888
894
 
889
895
  1. **A canvas element must never be the sole home of a claim.** Verdict tallies, dates, scan provenance, and even a moat-defining sentence have each been authored as text elements — then cited downstream while being unversioned, unsearchable, and uncitable. If a text element says something true and useful, a note says it first; the text element may quote the note. (Canvas-specific wayfinding — how to read THIS canvas — is the one exemption; it has no off-canvas value.)
890
- 2. **No relationship-mention syntax inside text elements or list descriptions.** `[NOTE-12](relationship:references)` and `[[NOTE-12]]` corrupt a canvas text element — the card renders blank. Reference notes in canvas prose as plain display IDs ("see RISK-64"). Mentions belong in NOTE bodies, where they create real graph edges.
896
+ 2. **Name notes and canvases from text elements with relationship mentions, never bare ids.** `[NOTE-12: Title](relationship:references)` inside a text element renders as a mention chip carrying the target's real title (the Text node registers the mention schema; verified live 2026-09-05, and a list description renders the same mention as a labelled span). "See RISK-64" as plain prose is a defect: the reader gets no title and no link. Pick the relationship type from the verb the sentence uses and reuse the workspace vocabulary. The chip is presentational: it creates no graph relationship, is not searchable, and is not versioned, so a relationship that must survive off the canvas still lives as a mention in a NOTE body (rule 5).
891
897
  3. **A text element is capped at card size**: at most 3 sentences, one heading at most, never a list of distinct knowledge items (questions, risks, findings — those are N notes; a 3-line color legend or lane key is fine). The one exception is the orientation banner (table row 5, up to ~5 sentences). A heading-only text element (`--content '# Q1 Goals'`) is of course fine — that is the smallest legitimate use. The cap is physical as much as doctrinal: a text element renders its full content inline, so long blocks explode the canvas — one canvas hit 43,000px tall from eight text reference blocks and had to be rebuilt as notes.
892
898
  4. **Detail's HOME is the note body; text detail cards are projections.** Write the full spec/content INTO each note's body first. A parallel text card under a note is allowed only as a projection — it condenses or quotes a note that already contains everything, and says so ("from STAGE-3"). A detail card whose content exists nowhere else is the anti-pattern: one teaching canvas carried its entire method in text cards over one-line stub notes, and an agent reading it back got seven stubs and no method.
893
899
  5. **Edges can connect any node type** (note, text, list, canvas-link, section — plus legacy heading nodes), as long as both endpoints are on the same canvas; labels are short verb phrases ("fixes", "grounds", "depends on"). A section endpoint is addressed by the section node's Convex id (`sectionNodes[].id` in `canvas get --json` — `canvas read` shows only display ids), not its SECTION-n display id, and the edge anchors to the frame's border — use one when the relationship's endpoint is genuinely the whole region ("this cluster feeds that stage"), not as a shortcut for a note-to-note link. `canvas read` returns edges, so they are no longer invisible on read-back — but an edge is still CANVAS-LOCAL: it is not part of the note graph, never appears in `rel list`, is not searchable, and means nothing once you leave this canvas. So any relationship **between notes** that must survive off the canvas has to ALSO exist as a mention inside the note bodies. The mention is the copy that travels; the edge is the copy you can see. Edges to text/list/canvas-link nodes are diagram decoration (pointing a label at a cluster, wiring a portal) and carry no note-to-note relationship to mirror.
@@ -904,14 +910,23 @@ A canvas holds two tiers of material, and the difference is load-bearing:
904
910
 
905
911
  Do not hand-pick a hex outside this table: the renderer snaps every tint to the nearest role by hue, so an off-palette color does not get you a new shade — it just picks a role imprecisely (`#c2410c` lands on Danger, not Warning). A tint colors the CARD only; text inside it keeps the normal prose colors, so the tint can never make a card harder to read. If you cannot name the role, omit the color.
906
912
 
907
- #### Two completion tests
913
+ 7. **The orientation banner opens for a stranger, in a fixed order.** The banner is the first and often the only card a cold reader sees (the goal sits behind the (i) button; nobody reads it first), so a banner that gives only the reading order fails: one shipped as "A story in six frames, read top to bottom. Frames 1 to 3 are the events: a release note is written, an agent writes an ad from it, the scope changes" and the reader could not say which release note, whose agent, or why any of it mattered. Write it in this order, at most ~5 sentences, heading = the board's subject (the canvas title or the goal), never a clever name for the banner:
914
+ 1. **What happened** — one dated sentence naming the people, products and events a stranger can look up ("On 19 September 2026 Deniss asked why CreatorNotes records every note a person opens but nothing an agent reads").
915
+ 2. **What this board is for** — the goal restated in reader's words: the decision or artifact it produces.
916
+ 3. **Who acts on it and how** — who decides, answers, or builds, and where the answer goes (as a mention chip with its real title, rule 2).
917
+ 4. **How to read it** — reading order and what each frame holds.
918
+ Nothing before the banner has defined anything, so no unnamed referents in it: not "the ad", "the app", "the scope", "the card" until the thing has been named or chipped. Wayfind maps and Attention orientation canvases add their own lines (destination, block time) after these four, never instead of them.
908
919
 
909
- Run both before ending your operation:
920
+ #### Three completion tests
921
+
922
+ Run all three before ending your operation:
910
923
 
911
924
  **The read-back test (for the next agent):** run `cnotes canvas read` and check that every claim is present as a NOTE section with a display ID, and the reasoning can be followed through note bodies and their mentions. Content that appears only as anonymous text-element prose fails the test even when visible — nothing can cite, search, or version it. List members read back as ID+title links without bodies; that is fine — the IDs are citable and batch-fetchable via `cnotes notes get`. As a heuristic for working canvases, at least ~4 notes per text element (zero text elements is fine); fewer means text elements are carrying content. Explainer canvases using the projection pattern (rule 4) are exempt from the ratio, not from the test.
912
925
 
913
926
  **The glance test (for the human):** zoomed to fit, a person should grasp what this canvas argues and where to start reading in about 10 seconds. A canvas that passes read-back but renders as an undifferentiated card grid is also not done — that is what section labels, orientation banners, projections, and layout are for.
914
927
 
928
+ **The cold-reader test (for the person who was not in the session):** cover everything but the banner. Can someone who never saw the conversation say what happened, what this board decides or produces, and who acts on it? If the banner only gives the reading order, or leans on "the ad" / "the app" / "the card" before naming them, it fails (rule 7). Run this on the banner text itself, not on your memory of the run.
929
+
915
930
  #### Worked example
916
931
 
917
932
  Right shape (a real competitor scan): 31 typed notes (COMPETITOR profile, FACT evidence row, INSIGHT verdicts per dimension, RISK/IDEA/STRATEGY response bands, QUESTION follow-ups in a list), three short text banners framing the bands ("Threats, Steals, Response — what hurts us, what's worth taking, the plan"), and labeled edges mirrored as mentions (`FACT-44 --grounds--> INSIGHT-361`).
@@ -922,7 +937,7 @@ Wrong shape (same material): one 5,000-char text element holding a "deep scan wr
922
937
 
923
938
  The durable rules above stand on versioning, search, and citability. Four rules also lean on today's platform behavior — if a future release changes these, the corresponding rule can relax:
924
939
 
925
- - Mention syntax corrupts canvas text elements / list descriptions (motivates rule 2; an @-mention affordance is planned).
940
+ - Mentions inside text elements and list descriptions are presentational chips only: no graph relationship, no search presence, no versions (motivates rule 1 and the mirror-as-mentions half of rule 5).
926
941
  - `canvas read` returns sections, edges and portals, but list containers still read back as their one-line frame only. An edge read back is still canvas-local and ungraphed (motivates rule 5's mirror-as-mentions requirement).
927
942
  - Agents have no update verb for **text or list** elements — to change one, remove and re-add it (one more reason content that evolves belongs in notes, which have versions). Section frames are the exception: `canvas update-section` edits a frame in place.
928
943
 
@@ -1100,7 +1115,7 @@ Full DSL alternative: a layout doc whose leaves are
1100
1115
 
1101
1116
  The optional `key` lets edges and other items reference this leaf later (`@<key>`).
1102
1117
 
1103
- `richtext.content` (the **text** element) accepts markdown directly — the server converts to TipTap before measuring. Plain markdown only: NO `[NOTE-X](relationship:...)` / `[[...]]` mention syntax (it corrupts the card — reference notes as plain display IDs), and keep it card-sized per "Canvas Elements — When to Use What".
1118
+ `richtext.content` (the **text** element) accepts markdown directly — the server converts to TipTap before measuring. Markdown including relationship mentions: `[NOTE-X: Title](relationship:verb)` renders as a chip with the real title, so use one wherever the card names a note or canvas (a bare id is a defect), and keep it card-sized per "Canvas Elements — When to Use What".
1104
1119
 
1105
1120
  `list.description` is a one-line **frame**, never the content itself — the content is `noteIds` (the member notes). For N distinct things, create N notes (right type per item, e.g. `Question` for open questions) and list their ids. A `list` with a multi-item description and an empty `noteIds` is the wrong shape — use a card-sized **text** element (`richtext`, at most ~3 sentences) only for a short framing block with no members; anything longer, or any set of distinct items, is N notes.
1106
1121
 
@@ -252,8 +252,9 @@ These are objective and never need judgment. Enforce them on every write:
252
252
  - **Relationship type matches the narrated verb** — prose "Blocks X" around a
253
253
  `references`/untyped chip is a graph bug, not a style choice: retype to
254
254
  `relationship:blocks` (or `[[blocks::NOTE-123]]`) and drop the redundant verb.
255
- - **No mention syntax inside canvas richtext or list descriptions** — it corrupts
256
- the card. Reference notes there as plain display IDs ("see RISK-64").
255
+ - **Canvas richtext and list descriptions name notes with relationship mentions** —
256
+ `[NOTE-12: Title](relationship:verb)` renders as a chip with the real title; a bare
257
+ display id in card prose ("see RISK-64") is a defect.
257
258
  - **Richtext stays card-sized** — at most ~3 sentences, one heading; distinct
258
259
  items are N typed notes, not a wall of text.
259
260
  - **No placeholder or artifact tokens** — "lorem ipsum", "TODO", "[insert X]",
@@ -137,8 +137,10 @@ The user arrives with a loose idea.
137
137
  `wayfind` plus the mode.
138
138
  5. **Place the map** in one `cnotes canvas place` spec: orientation banner,
139
139
  the four sections with their contents, blocking edges (blocker → dependent,
140
- label "blocks"). Banner is at most five sentences, plain display IDs only —
141
- mention syntax corrupts richtext.
140
+ label "blocks"). Banner is at most five sentences in the cnotes skill's banner
141
+ order (hard rule 7 under "Canvas Elements"): what happened and who asked,
142
+ the destination in reader's words, who resolves tickets and how, then how the
143
+ four frames read. Plain display IDs only — mention syntax corrupts richtext.
142
144
  6. **Fire the research subagents** for frontier research tickets; fold whatever
143
145
  returns into resolutions (steps 4–6 of the work loop) before closing.
144
146
  7. **Close the run, surface the canvas link, stop.** Charting resolves nothing