aiakiv 0.3.0 → 0.3.2

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.
@@ -0,0 +1,840 @@
1
+ ---
2
+ name: aiakiv-contents
3
+ description: >-
4
+ Where to start, and what not to do, in AiAkiv Contents: the app where a
5
+ creator writes a work (parts, scenes, settings, facts and world lines,
6
+ memos, drafts) through run_aiakiv_app_action(app="contents"). Use when
7
+ the user talks about their Contents work, a scene, a part, a setting, a
8
+ fact, a memo or a draft ("Contents 에서 내 작품 이어서 쓰자", "메모로 남겨 줘",
9
+ "초안으로 넣어 줘"); wants memos, style or another team's memory
10
+ searched or attached; wants the value basis, narrative stance, narrator
11
+ or how a scene is told set; wants beats extracted, a scene written in
12
+ another language, or an anchor set, or asks what a style, beats or
13
+ narration mark means; wants cases of similar scenes; wants the work
14
+ process kept or read ("과정으로 남겨 줘"); wants the work exported for a
15
+ game or video, a shot list or the visual style; wants installments cut
16
+ or a hook or recap written ("회차로 잘라 줘"); says the context was lost
17
+ ("전체 맥락 요약해 줘"); says "ak save" on a Contents work; or is about
18
+ to call run_aiakiv_app_action with app="contents".
19
+ ---
20
+
21
+ # AiAkiv Contents
22
+
23
+ The rules of Contents live in the app, not in this skill.
24
+ `run_aiakiv_app_action(app="contents", action="describe", data={"topic": ...})`
25
+ is the live contract, and it changes whenever the app is deployed. This skill
26
+ only says where to start and which mistakes to avoid. Whenever this file and
27
+ `describe` disagree, follow `describe`. Take action arguments from `describe`,
28
+ never from memory.
29
+
30
+ ## Does this connection have app features? Check first
31
+
32
+ The AI works in Contents only on a connection that has **app features**,
33
+ that is, one where `run_aiakiv_app_action` is in the tool list. Check before
34
+ the first call, `describe` included.
35
+
36
+ - **The tool is in your tool list.** Go on to "Start here". When this
37
+ conversation has two AiAkiv connections, call it on the connection that
38
+ has it; if both have it, on the one bound to a folder or to an API key.
39
+ - **It is not in your tool list, or a call came back with "This tool is not
40
+ available on this connection."** Nothing happened. Do not call it again.
41
+ Tell the creator that this connection does not support app features, that
42
+ they can write, edit and confirm the work by hand on the Contents
43
+ screens, and that having the AI do what they asked for (name it) takes
44
+ **a new MCP connection** that names a project, which shows every tool:
45
+ the connection folder from the "AI connection" screen, any other folder
46
+ connection (`npx aiakiv bind` in the working folder writes one), or an
47
+ API key connection. An account connection (a sign-in with the plain
48
+ address `https://mcp.aiakiv.com/mcp`) does not show this tool; that
49
+ covers Claude on the web and in the mobile apps, ChatGPT, Claude Desktop
50
+ with a connector added by hand, and the AiAkiv plugin's own connection.
51
+ If the creator only uses one of those, say that the work is done on the
52
+ Contents screens there, or in a new folder connection in Claude Code or
53
+ Claude Desktop. If what they asked for is account management (teams,
54
+ invitations, projects, Main) rather than the work itself, point them to
55
+ the web console, or in a client with a shell to `npx aiakiv console`
56
+ (the `aiakiv-dashboard` skill). The steps are at
57
+ https://www.aiakiv.com/docs/app-actions. For ChatGPT, see
58
+ https://www.aiakiv.com/docs/chatgpt.
59
+
60
+ This is a different check from "Is this connection the work team?" below.
61
+ That one asks which project the connection follows and only decides whether
62
+ the link tools can be used. This one asks whether the app action tool is
63
+ there at all. Without it the creator still works on the Contents screens by
64
+ hand; a missing tool never blocks the work itself.
65
+
66
+ ## Start here
67
+
68
+ 1. Read the overview:
69
+ `run_aiakiv_app_action(app="contents", action="describe", data={"topic": "overview"})`.
70
+ 2. Read one more topic that fits the task, with the same call and another
71
+ `topic` (writing a scene: `tree`; facts and world lines: `facts`; beats:
72
+ `beats`; another language or style: `lang`; the narrator or how a scene
73
+ is told: `settings` and `slots`; cases of similar scenes: `memory`; the
74
+ whole work for a game or another medium: `export`; cutting into
75
+ installments: `release`). The topics today are `overview`, `tree`,
76
+ `slots`, `settings`, `facts`, `time`, `links`, `assets`, `export`,
77
+ `lang`, `beats`, `memory`, `review`, `release`, `names`, `screens`,
78
+ `errors`. The list and what each topic says come from `describe`; if
79
+ they differ from this line, `describe` wins.
80
+ 3. Pick the work with `get_work`. Called without `doc_id` it lists the user's
81
+ works with `recent_work_id`. If the user named a work by its title and you
82
+ do not know its `doc_id`, find it in that list, then call `get_work` with
83
+ that `doc_id`.
84
+ 4. When starting work on a work, say once the one sentence about asking for a
85
+ context summary; see "When the context is lost".
86
+ 5. When the work is empty or just begun, suggest the order of work before
87
+ making anything; see "Building a new work: facts first, then scenes".
88
+
89
+ **Works of kind `screens`.** A work has a kind, `kind` in `get_work`: `novel`
90
+ (the default, shown as Story) or `screens` (Screen flow: the screens of a web
91
+ service and the features users go through). In a `screens` work a character
92
+ is a user type, a world line is a feature (one path a user takes), a fact is
93
+ a screen or state reached on that path, a scene is what the user does on one
94
+ screen, and a location (`facet: "world"`, a scene's `place_node_id`) is the
95
+ screen itself. The creator's screens show a world line as a Feature, a part
96
+ as a Feature group and story time as Category, and the top row of the Scene
97
+ flow chart reads Summary.
98
+
99
+ A fact's time in a `screens` work is not an order but a category column
100
+ (such as Common, claude, chatgpt). The column names, left to right, are
101
+ `columns` in `list_calendars`; `set_calendar` with only `columns` (a list of
102
+ names) rewrites them. Write a fact's `time` as a column name
103
+ (`{"text": "claude"}`) or as `Y{n}` for the n-th column (`{"text": "Y2"}`);
104
+ both are stored as `Y{n}`. A name not in the list is refused with
105
+ `invalid_data`, `reason` `column_unknown`, and the names you can use in
106
+ `params.choices`. Put each fact in one column only: if it holds for every
107
+ category, use a shared column such as Common; if it differs by category,
108
+ make one fact per category. A column has no order inside it; when order
109
+ matters, link the facts (`before`, `causes`). The category belongs to the
110
+ fact, not to the location. Until the columns are written, column numbers
111
+ show as plain numbers; do not make a calendar for a `screens` work.
112
+
113
+ The creator chooses the kind on the Work kind screen in Studio; the AI cannot
114
+ change it, and once any item has been confirmed nobody can. A `screens` work
115
+ has no installments, narration, beats, style slots and checks or visual
116
+ style (packs `release`, `narration`, `beat_script`, `prose_voice`,
117
+ `visual`): their slots and the `released_in` link are refused with
118
+ `invalid_data`. The rest is in `describe` (`overview`, `tree`, `time`,
119
+ `errors`).
120
+
121
+ ## Building a new work: facts first, then scenes
122
+
123
+ When a work is empty or just begun (the `nodes` in `get_work` hold no
124
+ scenes, or only a few), do not start making scenes. First suggest an order
125
+ of work to the creator, and wait for their answer.
126
+
127
+ The order to suggest:
128
+
129
+ 1. **Facts on the world lines.** List with the creator what happens in the
130
+ world: the facts (`facet: "event"`), when each one happens in story time,
131
+ and the world line (`facet: "line"`) it sits on. Refine the list together
132
+ until it holds. The `facts` and `time` topics of `describe` have the
133
+ calls.
134
+ 2. **Parts and scenes from the facts.** When the facts have settled, design
135
+ the parts and the scenes on top of them, and link each scene to the facts
136
+ it tells (`tells`).
137
+ 3. **The content.** Only then write the bodies.
138
+
139
+ In a `screens` work the same order reads: first agree on the category
140
+ columns (`columns`; see "Works of kind `screens`" in "Start here"), then for
141
+ each feature (a world line) list the screens and states (facts) a user goes
142
+ through, then design what the user does on each screen (the scenes).
143
+
144
+ Discuss at every step. Show a list or a plan first, listen to the creator,
145
+ revise it, and add as drafts only what the creator has said yes to. Do not
146
+ make many items at once; add a few, then ask again.
147
+
148
+ This is advice, not a rule. If the creator wants another order, for example
149
+ starting from a scene they already have in mind, follow theirs.
150
+
151
+ ## Finding memos and style
152
+
153
+ There are two ways to read the memo team and the style team.
154
+
155
+ 1. **App actions**, from any connection that has app features, whichever
156
+ project it follows: `search_scratch` and `get_scratch` for memos,
157
+ `search_work_memory` and `get_work_memory` for confirmed content (`team`
158
+ `work`) and the creator's style (`team` `technique`). They search and
159
+ read the full text.
160
+ 2. **Links**, only when this connection is bound to the work team (see
161
+ "Is this connection the work team?" below). The work team reads the memo
162
+ team and the style team through links. Pass the `link_id` to
163
+ `search_partner_memory`, `find_partner_memory_connections` or
164
+ `query_partner_memory_graph`. Use links to follow connections between
165
+ memories, to look at them as a graph, or to scan many memos broadly. Follow
166
+ the `aiakiv-links` skill for how. Links only read.
167
+
168
+ Which `link_id`: if the `get_work` response carries `links`, use
169
+ `links.memo.link_id` and `links.style.link_id`. `links.sources`, when
170
+ present, lists other memory attached to this work (see "Attaching other
171
+ memory" below); each entry's `label` says what it is, and its `link_id` goes
172
+ to the same partner tools. If `links` is missing, call
173
+ `list_partner_links` and find the memo team's link by matching its
174
+ `partner_org_id` with the `scratch_org_id` in a `search_scratch` response. If
175
+ you cannot tell which link is which, use the app actions.
176
+
177
+ Is this connection the work team? Check before the first link tool call,
178
+ not after. Either sign is enough; without one, do not use the link tools for
179
+ Contents at all.
180
+
181
+ - `get_save_target` reports `binding` `folder` or `api-key` and a `project`
182
+ whose name ends in `:canonical` (the work's own team, for example
183
+ `contents:myproject:canonical`). A `binding` of `main`, or a project with
184
+ any other name (another app's project, the user's own project, a style team
185
+ ending in `:technique`), is not the work team. A project ending in
186
+ `:process` is the memo team's process place (see "The process log"), not
187
+ the work team either: do not use the link tools there; read memos and
188
+ style with the app actions.
189
+ - `get_work(doc_id=...)` reports `session_in_work: true`. The app decides
190
+ this from the session itself, so it is the final word when the two
191
+ disagree.
192
+
193
+ Most conversations reach Contents through `run_aiakiv_app_action` from a
194
+ connection that follows Main or sits on some other project. There the work
195
+ team's links are not this connection's links: `list_partner_links` shows
196
+ other things, and `search_partner_memory` with a `link_id` from `get_work`
197
+ fails or reads the wrong team. Use the app actions there.
198
+
199
+ Which way: on a connection bound to the work team, try links first for memos
200
+ and style. Otherwise use the app actions. If a link tool returns an error or
201
+ there is no link, go back to the app actions. The app actions work whichever
202
+ project the connection follows, so do not ask the creator to change the
203
+ connection. Leaving a memo is always `add_scratch`; links never write.
204
+
205
+ Memos come in chains: a memo can be linked to the memo before it.
206
+ `get_scratch` and `get_work_memory` return `prev` and `next` (each
207
+ `{event_id, summary, timestamp}` or null), and a `chain` line when either is
208
+ present. On the process connection, where `search_memory` returns memos too,
209
+ its hits carry `connections.sequential {prev, next}` as well. When a memo you
210
+ read has `prev` or `next`, read the linked memos before acting on it, as far
211
+ as the chain goes: a later memo may correct an earlier one, and the latest in
212
+ the chain is the one to follow. `search_scratch` and `search_work_memory`
213
+ hits do not show the chain; read the memo to see it.
214
+
215
+ Memos are not edited. To correct or continue one, leave a new memo with
216
+ `add_scratch` and pass the earlier memo's `event_id` as `prev_event_id`. The
217
+ response carries `linked_prev_event_id` when the link was made, or
218
+ `link_error` (`{prev_event_id, reason}`) when the memo was saved but the link
219
+ was refused, for example because the earlier entry is a process entry or
220
+ belongs to another team. Then tell the creator so, and do not retry with the
221
+ same text.
222
+
223
+ Hiding a memo is `hide_scratch` with the memo's `event_id`, and only when
224
+ the creator points at that memo and asks for it to be hidden. Never hide a
225
+ memo on your own judgment. There is no tool that brings a hidden memo back,
226
+ so after hiding say which memo was hidden. The memo screen still lists it,
227
+ marked as hidden. Only memos in this work's memo place can be hidden: a
228
+ process entry, another team's memory or confirmed content is refused with
229
+ `scratch_unavailable`, `reason` `not_a_memo`. If AiAkiv does not know the
230
+ action yet the reason is `hide_unsupported`; tell the creator and stop.
231
+
232
+ ## Attaching other memory to the work
233
+
234
+ The work team can read any other team's memory through a link: the creator's
235
+ own brainstorming team, someone else's team, or a public org. Two steps, both
236
+ from the conversation.
237
+
238
+ 1. Get a code. For a team the user owns, call
239
+ `run_aiakiv_app_action(app="console", action="create_link_invite", ...)`
240
+ on that team with the user's own email as the invitee (the `aiakiv-console`
241
+ skill has the arguments; the user's `link:invite` permission must be on).
242
+ For someone else's team, the user pastes the code they received. A public
243
+ org needs no code, only its org id.
244
+ 2. Attach it to the work:
245
+ `run_aiakiv_app_action(app="contents", action="add_work_source",
246
+ data={"doc_id": ..., "code": ..., "label": "brainstorm"})`, or
247
+ `public_org_id` instead of `code`. Take the arguments from `describe`.
248
+
249
+ Direction matters: the team that issued the code is the one being read, and
250
+ the work team is the reader. Do not redeem a code issued by the work team on
251
+ the other side; that links the other way round. A code is consumed when it is
252
+ redeemed, so never retry a successful call with the same code. A link covers
253
+ the whole team, so everything in that team's memory becomes readable from the
254
+ work; if the user wants a narrower scope, suggest a separate team for it.
255
+
256
+ Attached memory is read only through links, so it needs a connection bound to
257
+ the work team (the check above). On a connection that follows Main
258
+ there is no app action that reads it; tell the user to connect through the
259
+ working folder from the advanced settings on the "AI connection" screen.
260
+ `remove_work_source` detaches; the memo team and style team links that the
261
+ app created with the work cannot be detached.
262
+
263
+ ## Value basis and narrative stance
264
+
265
+ `slots.value_basis` is one key with two meanings. On the One line (the
266
+ work's top sentence) it is the **Value basis**: what the Value line on the
267
+ Scene flow chart measures, and from whose side (pack `dramaturgy_core`). On a Part
268
+ (resolution `synopsis`) it is the **Narrative stance**: from what standpoint
269
+ that part is told and judged (pack `stance_core`, for every kind of work).
270
+ The `slots` topic of `describe` has the wording.
271
+
272
+ - Read the value basis, and the part's narrative stance, before you pick a
273
+ scene's `turn`.
274
+ - `fields.slots` in `update_node` overwrites the whole `slots` object, so
275
+ read it with `get_node` first and send it back whole.
276
+ - The creator can write both on the "Value basis and narrative stance"
277
+ screen (`basis` in the `screens` topic), so the AI is not the only way in.
278
+ Keep the two apart: do not put a part's narrative stance into the One
279
+ line's `value_basis`, or the work's value basis into a Part's.
280
+ - The Scene flow chart draws the Value line itself, one line per zoom joined from
281
+ the `turn` values; a part's narrative stance does not break it. Fill in
282
+ `turn` and the basis; do not draw or compute the line.
283
+
284
+ ## Beats
285
+
286
+ A body node (kind `body`) holds the prose in `description`. Beats (pack
287
+ `beat_script`) are a language-neutral script of that prose, which the AI
288
+ extracts into the body's `slots.beats`, a list of beat objects. The app
289
+ stores, counts and publishes beats and notices when the prose has moved on;
290
+ it does not judge them. Read the `beats` topic of `describe` before the
291
+ first extraction; the fields, `think_modes`, `rhythms` and `relation_axes`
292
+ come from there (`novel.beat_fields`, `novel.relation_axes`).
293
+
294
+ - Extract in the draft, right after writing or fixing the prose and before
295
+ the creator confirms.
296
+ - Call `get_node` on the scene, not on the body node. Its `body` (and each
297
+ entry of `bodies[]`) carries `node_id`, `prose_hash`, `beats_count` and
298
+ `beats_stale`.
299
+ - Then call `update_node` on that body `node_id` with `fields.slots` holding
300
+ `beats` and `beats_from: {"prose_hash": ...}`, echoing the `prose_hash`
301
+ you read exactly; never compute a hash. `fields.slots` overwrites the whole
302
+ object, so send the body's other slots (such as `source`) back with it.
303
+ - Write `act` and `say.content` plainly, in the work's default language.
304
+ - `say.relation` is a closed vocabulary, tokens joined by spaces, at most one
305
+ per axis, any order, possibly empty: power `up|level|down` (speaker
306
+ relative to listener), distance `close|neutral|far`, formality
307
+ `formal|plain|casual`, for example `"down far formal"`. An unknown token,
308
+ or two on one axis, is `invalid_data`. Write the relationship, not a speech
309
+ style; `get_node`'s `language.relation_map` says how a language renders it.
310
+ - Check the round trip: unfold the beats into a flat paraphrase and compare
311
+ with the prose. If an event is missing or invented, or something withheld
312
+ leaks, leave `add_review` with `kind: "beats_drift"` on the body node.
313
+ - `beats_missing`, `beats_stale` and `beats_count` appear as suggestions in
314
+ the confirm preview and never block confirming. If confirmed prose is
315
+ edited later, the app opens a `beats_stale` review item; extracting again
316
+ in that same new version closes it.
317
+ - Do not rewrite the prose from the beats; the prose is canonical. Do not
318
+ open a new version of a confirmed body only to add beats; extract in the
319
+ next version. Do not translate from another language's body alone; the
320
+ source is the author-language prose plus its beats.
321
+
322
+ ## Writing in another language and form settings
323
+
324
+ Style lives on form settings: `kind: "setting"` with `facet: "form"`. Only a
325
+ form setting takes `lang` (`payload.lang` in `add_node`, `fields.lang` in
326
+ `update_node`). Empty means every language; a value limits the setting to
327
+ bodies in that language. The `lang` topic of `describe` has the rules.
328
+
329
+ - The optional style slots (pack `prose_voice`) are in the `settings` topic
330
+ under `novel.slots_by_facet.form`: `register`, `dialogue_convention`,
331
+ `description_density` (`sparse`, `even`, `dense`), `sense_bias`,
332
+ `image_system` (key to meaning), `banned_patterns` (regular expressions;
333
+ one that does not compile is `invalid_data`) and `ending_profile`.
334
+ - Put style on a form setting, never on a scene or a body: at the work root
335
+ for the whole work, or under a part for that part only.
336
+ - Before writing a body in a language, or translating into it, call
337
+ `get_node` on the scene with `data.lang` set to that language (left out,
338
+ it is the body's language for a body node, else the work's default).
339
+ - Read `form` from that response: the merged form settings, with `slots`
340
+ holding the values, `sources` naming which setting gave each value, and
341
+ `texts` holding each setting's description, far to near. The nearer
342
+ ancestor wins; `banned_patterns` are joined rather than overwritten.
343
+ - Read `language`: the language pack brief, with `relation_map`,
344
+ `rendering_rules`, `typography`, `tells` and `asks`. It is `null` when the
345
+ app has no pack for that language.
346
+ - Read `continuity.withhold`: what earlier scenes' beats still withhold
347
+ (the latest five scenes with beats, up to 40 items, `truncated` when cut),
348
+ so the new prose does not give it away.
349
+ - Two suggestions may appear, and neither blocks: `banned_pattern_hit` when
350
+ the prose matches a banned pattern (the merged list plus the language
351
+ pack's defaults), and, for Korean bodies, `relation_mismatch` when dialogue
352
+ endings and the beats' formality tokens disagree in distribution.
353
+
354
+ ## Anchors and the marks in a response
355
+
356
+ A form setting has an optional slot `anchors` (pack `prose_voice`): a list of
357
+ `{node_id, version, take, weight}`. `node_id` and `version` name a confirmed
358
+ body and its version. `take` lists what to borrow from it: `rhythm`
359
+ (sentence length and rhythm), `endings` (sentence endings), `dialogue`
360
+ (dialogue manner), `description` (description density), `imagery` (figures
361
+ and images); empty means everything. `weight` is `strict` or `loose` (empty
362
+ is `loose`; `strict` makes the checks narrower). Both vocabularies come from
363
+ the `settings` topic of `describe` (`anchor_takes`, `anchor_weights`).
364
+
365
+ - Write `anchors` only for a body the creator named as the model. Never pick
366
+ one yourself, not even because it reads well or scored well.
367
+ - Write it with `update_node` on the form setting. `fields.slots` overwrites
368
+ the whole object, so read the setting with `get_node` first and send its
369
+ other slots back. Like every AI edit it is a draft the creator confirms. A
370
+ wrong shape, or the same `node_id` and `version` twice, is `invalid_data`.
371
+ A nearer form setting's anchors add to a farther one's.
372
+ - Before writing a body, call `get_node` on the scene with `data.lang` (as
373
+ in the previous section) and read three more keys under `form`.
374
+ - `form.anchors`: each anchor with `state` and, when the app has it, `text`.
375
+ `current` means that body is confirmed now at that version and `text` is
376
+ its prose; `archived` means the version has moved on and `text` is that
377
+ version's confirmed prose; `other_lang` and `missing` carry no text. Learn
378
+ only what `take` names from the text; never lift its sentences. Long texts
379
+ are cut (`truncated`), farther settings' anchors first.
380
+ - `form.profile`: statistics of all confirmed bodies in that language except
381
+ this scene's. It is `null` with fewer than two bodies or too few sentences.
382
+ - `form.baseline`: what the style checks compare against, with `axes` (per
383
+ axis `anchors`, `profile` or `null`), `stats` and `thresholds`. Read
384
+ `thresholds` before writing; it says what the app will measure. When
385
+ `baseline` is `null` no style statistics run; tell the creator the checks
386
+ start once they pick one anchor (or on their own once enough confirmed
387
+ content in that language has built up).
388
+ - `add_node` with `kind: "body"`, and `update_node` that sends a body's
389
+ `description` or `slots`, answer with `marks`: a list of
390
+ `{kind, level, text}` for that body only. They are the style checks
391
+ (`banned_pattern_hit`, `uniform_rhythm`, `ending_monotony`,
392
+ `figure_density`, `adverb_density`) and the beats checks. The `lang` topic
393
+ of `describe` has each check's condition.
394
+ - Marks are suggestions: they never block confirming and leave no review
395
+ item. When one points at something worth fixing, fix the prose and send it
396
+ again. Do not loop on a mark you judge wrong, and do not tell the creator
397
+ the app rejected anything.
398
+
399
+ ## Narration: pace, interiority, withhold and the narrator
400
+
401
+ Pack `narration` adds how each scene is told and who tells the work; every
402
+ slot is optional. Its tokens are `slots_by_resolution.treatment` in the
403
+ `slots` topic of `describe`; the narrator's are `narrator_persons`,
404
+ `narrator_tenses`, `narrator_intrusions` and `narrator_reliabilities` in
405
+ `settings`.
406
+
407
+ - Three slots go on the scene (resolution `treatment`). `pace` is telling
408
+ time against story time (`scene`, `summary`, `stretch`, `ellipsis`,
409
+ `pause`); it is not `tempo`, which is sentence speed. `interiority` is how a
410
+ mind is shown. `withhold` is text: what the reader must not yet know in
411
+ this scene, apart from the beats' sentence-level `withhold`.
412
+ - `narrator` goes on a form setting: `{person, tense, access, attitude,
413
+ intrusion, reliability}`, every key optional, `attitude` free text.
414
+ `access` lists the character settings whose minds the narrator may enter:
415
+ `[]` is nobody (external narration), no key is not decided, and a node that
416
+ is missing, abandoned or not a character setting is `invalid_data`.
417
+ - The nearer form setting's `narrator` replaces the farther one whole (unlike
418
+ `banned_patterns` and `anchors`, which join), so to change only the person
419
+ for one chapter, write the whole object on that chapter's form setting. It
420
+ is language neutral and usually sits on a form setting without `lang`. As
421
+ with `anchors`, read the setting first and send its other slots back.
422
+ - Before writing a body, read `narration` from `get_node` on the scene:
423
+ `pace`, `interiority` and `withhold` (`null` when not set) and `narrator`,
424
+ the merged value with `source` and `access` as `{node_id, title, state}`.
425
+ A `missing` state means that setting is gone; tell the creator instead of
426
+ guessing. The key is absent when the pack is off.
427
+ - Read `continuity.scene_withhold` (earlier scenes' `withhold`, the latest
428
+ five, oldest first) with `continuity.withhold`, so the new prose gives
429
+ nothing away. The `lang` topic describes both.
430
+ - Four review kinds, left by the AI with `add_review` on the body node; the
431
+ app measures none of them (the `review` topic has them):
432
+ - `pov_violation`: the prose tells the inside of a character outside
433
+ `narrator.access`. Not `pov_drift`, which is whose eyes see the scene.
434
+ - `withhold_leak`: the prose reveals a scene's or a continuity `withhold`.
435
+ - `narrator_tone_drift`: the voice departs from `attitude` or `intrusion`.
436
+ - `honorific_mismatch`: the relationship changed (beats `say.relation`,
437
+ settings) but the speech level did not, or the other way round.
438
+ - These are the creator's story decisions. Fill them when the creator states
439
+ them, or to match a scene you just drafted and say so; they are drafts the
440
+ creator confirms. When prose leaks a `withhold`, fix the prose, not the slot.
441
+
442
+ ## Cases from the style memory
443
+
444
+ `get_node` on a scene, or on a scene's body node, returns `memory`:
445
+ `{case_query, medium, lang, sources, tool, how}`. The app built `case_query` from the
446
+ scene's slots, title and `done_when`, with the same function that wrote the
447
+ summary of every case in the style team, so the two share one vocabulary.
448
+ The `memory` topic of `describe` has the recipe ("사례 찾기", finding cases).
449
+
450
+ - Search when making a scene plan (after reading the arc with `get_node`,
451
+ before `add_node` with `kind: "plan"`) and again before writing a body.
452
+ - Pass `case_query` verbatim as `query` to `search_work_memory(doc_id,
453
+ query=..., team="technique")`, adding `tags` when `memory.sources` is not
454
+ empty (see "Media and technique sources"), then read the top three hits with
455
+ `get_work_memory(doc_id, event_id, team="technique")`. `how` says the same
456
+ in one sentence; if it differs from this line, `how` wins.
457
+ - A case is an analysis block (where the scene enters, what it withholds,
458
+ the beat order, the slot values) followed by the text of a scene from one
459
+ of the creator's own works. Take its structure; never copy its sentences.
460
+ - `lang` is not in the query: cases are shared across languages, so a scene
461
+ written in English still finds Korean cases.
462
+ - No `memory` key above a scene or on a setting, a `null` `case_query`, zero
463
+ hits, or `memory_unavailable` (`reason` `no_binding`, `no_session` or
464
+ `read_failed`) all mean: write on without cases, and do not ask the creator
465
+ to change the connection.
466
+ - On a connection bound to the work team, the same `case_query` works as the
467
+ `query` of `search_partner_memory` with `links.style.link_id`.
468
+
469
+ ## The process log
470
+
471
+ Inside the memo team, a work can have a process project,
472
+ `contents:<name>:process`. The connection folder the creator downloads from
473
+ the "AI connection" screen is tied to it. It keeps the work process: which
474
+ decisions were made and why, what was tried and dropped, where the direction
475
+ changed. The creator chooses whether to keep each one.
476
+
477
+ - Recognise it: `get_save_target` reports a `project` ending in `:process`,
478
+ or one equal to `process.project` at the top level of the `get_work`
479
+ response. There `session_in_work` is `false`, and that is normal; it is
480
+ `true` only on the work team itself. `get_work`'s `session_hint` says the
481
+ same.
482
+ - At the start of a conversation on that connection, read the past process
483
+ once with `search_memory`. It returns memos and process entries together.
484
+ - After a big decision or a change of direction, ask the creator once
485
+ whether to keep it as process. Do not ask every turn.
486
+ - When the creator agrees, or says "ak save", call `save_memory` right away.
487
+ Follow the `aiakiv-save-and-recall` skill for the summary and entities.
488
+ - `update_memory` is allowed there on your own process entries.
489
+ - Do not put the work's content there. Scenes, settings and bodies go through
490
+ `add_node` and `update_node` as drafts, and the app publishes them when the
491
+ creator confirms.
492
+ - Do not put memos there. Ideas still go to memos with `add_scratch`.
493
+ - On Main or a `:canonical` connection, do not ask the creator to switch or
494
+ rebind the connection only to log process. If they ask how to keep
495
+ process, point to the connection folder on the "AI connection" screen.
496
+ - When `get_work` has no `process` key, the work has no process place yet.
497
+ Opening the "AI connection" screen once creates it; tell the creator that
498
+ if they want one. Do not try to create it yourself.
499
+
500
+ ## When the context is lost
501
+
502
+ The AI's context window is limited. Hosts drop or compress the early part of
503
+ a long conversation, and writing on after that drifts away from what was
504
+ decided: the work's one line, the value basis, the narrative stance, the
505
+ current part's plan, earlier scenes. The fix is to re-read the decisions from
506
+ the work and the memory, summarise them, and continue from the summary.
507
+
508
+ - **When you can tell the context was lost.** The signs: the host shows a
509
+ compaction or summary notice; you cannot recall a decision you know was
510
+ made; the one line, the current part or the previous scene looks different
511
+ from what you remember. Then:
512
+ 1. Tell the creator in one sentence that the earlier context was lost, and
513
+ ask to re-read.
514
+ 2. Call `get_node` on the One line and on the current Part and read
515
+ `slots.value_basis` on each (the value basis and the narrative stance;
516
+ see "Value basis and narrative stance"), then on the scene you were on.
517
+ 3. On the process connection, read the process log with `search_memory`
518
+ (see "The process log"). Search the memos with `search_scratch`.
519
+ 4. Show the creator a short summary, a few lines, not the raw results, and
520
+ continue from it.
521
+ - **When you cannot tell.** Most hosts give no signal. So at the start of
522
+ work on a work, and again in the middle of long work (after several scenes
523
+ or a long stretch of writing), say one sentence to the creator, in the
524
+ creator's language, to this effect: "If anything in what I write looks
525
+ off, ask me to summarise the whole context from the memos and the process
526
+ log." Say it once at each of those points, not every turn. When the
527
+ creator asks, do the re-read above.
528
+ - **Keep the summary.** When the re-read is done, offer once to keep the
529
+ summary in the process log with `save_memory`, following "The process log"
530
+ (the process project only). The next time the context is lost, read that
531
+ entry first.
532
+ - Do not keep writing on a guess after you notice a loss.
533
+ - Do not re-read everything every turn; re-read only on the signs above or
534
+ when the creator asks.
535
+ - Do not write the summary into the work as a draft or a memo. It is
536
+ process, not content.
537
+
538
+ ## Naming characters and places
539
+
540
+ Each session names without memory of the others, so across sessions and
541
+ works the AI reaches for the same names, and readers notice it.
542
+
543
+ - Before naming, read the work's existing character and place settings, so a
544
+ new name does not collide or rhyme with one already there.
545
+ - Pick from the work's time, place and language, not from your first
546
+ instinct. Pass over the names you reach for first.
547
+ - When the creator wants options, give several from different sources and
548
+ let them choose. Do not present one name as settled.
549
+ - The `names` topic of `describe` says what the app offers for names today.
550
+ Use it when the creator asks about the name pool, and do not assume more
551
+ than it says.
552
+
553
+ ## The game world: places, creatures, items and the whole work
554
+
555
+ Contents keeps the facts of the world and the creator's intent, whatever
556
+ medium the work becomes. It does not keep engine numbers and does not write
557
+ engine files. The AI reads the whole work and writes the engine file from
558
+ it, the way it writes prose from a scene plan. The response shape and the
559
+ recipe are in the `export` topic of `describe`.
560
+
561
+ - Three setting facets sit beside `character` and `world`: `item` (an
562
+ object), `creature` and `faction`. They have no slots; the description
563
+ says what the thing looks like and what it is in the story, never its
564
+ numbers. Rooms and regions are places (`facet: "world"`, called Location
565
+ on the screens), and a place
566
+ inside a place is a `part_of` link, not a child in the tree.
567
+ - Four directed link relations, free text in `note`: `part_of` (place in
568
+ place), `connects_to` (place to place, one way: a two-way passage is two
569
+ links), `located_in` (a character's usual place; a scene's own place is
570
+ its `place_node_id` slot) and `member_of` (character to faction). No
571
+ compass direction is stored; "the north gate" in `note` is only text.
572
+ `add_link` refuses other pairings; see the `links` topic.
573
+ - Order of work for a game:
574
+ 1. Read the `export` topic, then the game tool's file format in its own
575
+ repository.
576
+ 2. `export_work` with `confirmed_only: true`; add `include_bodies: true`
577
+ only when the prose itself is needed, since a big work is large.
578
+ 3. Map. A place becomes a room (title to shown name, description to
579
+ description, you choose the key). A `connects_to` link becomes one
580
+ exit on its `from` room; the direction comes from `note` or the game
581
+ worker, and a way back exists only if the reverse link does. A
582
+ creature becomes a monster; its usual place is in its description or
583
+ a fact, since `located_in` takes characters only. An item becomes an
584
+ entry in the game's own item list. `part_of`, factions, characters,
585
+ scenes, facts and world lines feed descriptions, quests and dialogue,
586
+ not file entries.
587
+ 4. Settle every number (hit points, attack, drops, caps, levels) with the
588
+ game worker, and write the file into the engine repository.
589
+ - Register the written file as an asset setting: `facet: "asset"`, the five
590
+ slots `asset_type`, `asset_state`, `file_url`, `spec`, `canon_revision`
591
+ (the `export_work` response's `doc.revision`), and `depicts` links to what
592
+ it shows (none for a file of the whole work). Ask the creator to confirm
593
+ the entry: `list_assets` signals (`stale`, `review_open` with
594
+ `depicted_changed`) start only after that first confirmation.
595
+ - When the game needs a place or creature the story lacks, tell the
596
+ creator, who adds it on the Contents screens or asks you to add a draft;
597
+ only then does it enter the file. Nothing flows back from the file.
598
+ - The creator gets the same JSON as a file from "Export" in the top menu.
599
+
600
+ ## Video and images: shot lists and the visual style
601
+
602
+ The canon for video and images is a scene's shot description, the looks in
603
+ the setting descriptions and the work's visual style. Prompts, seeds,
604
+ numbers, takes and the tool's file format are not canon.
605
+
606
+ - A shot list is a body: `add_node` with `kind: "body"` and
607
+ `medium: "shots"` (`prose` is the default). A scene holds a `prose` and a
608
+ `shots` body per language side by side. `medium` cannot change after
609
+ creation, and a `source` must have the same medium.
610
+ - Read it with `get_node` on the scene and `data.medium: "shots"`: `body` is
611
+ that medium's body, and `bodies` lists all with `lang` and `medium`.
612
+ - Write plain text, a numbered list, one shot per paragraph: what is seen,
613
+ who, where, the action, the line spoken, the sound. Shot size and angle in
614
+ words are fine. The shape is advised, not checked.
615
+ - Style checks, anchors, beats and cases are for prose: `marks` stays empty
616
+ and `beats` on a shot list is refused. That is intended.
617
+ - The look to keep across video and images is `visual_style` on a form
618
+ setting (pack `visual`): mood, colour, light, what to avoid. A nearer form
619
+ setting replaces it whole; read it in `get_node`'s `form`. The looks of
620
+ characters and places stay in their setting descriptions.
621
+ - Register only the adopted file, as an asset with `depicts` to the scene,
622
+ the shot number in `spec` and `canon_revision`, as above.
623
+ - The creator writes and confirms shot lists on the same Studio screens as
624
+ prose.
625
+
626
+ ## Media and technique sources
627
+
628
+ **Media.** A body's `medium` is one of six: `prose` (the default), `shots`
629
+ (shown as Video: a shot list), `web` (a web page), `game`, `cartoon` and
630
+ `image`. Choose it in `add_node` with `kind: "body"`; it cannot change
631
+ afterwards. What each medium's text looks like is the one line for it in the
632
+ `medium` argument of `add_node` and in the `lang` topic of `describe`; follow
633
+ that line. Every medium is plain text, and the shape is advised, not checked.
634
+ A scene holds one body per medium and language side by side; `get_node` on
635
+ the scene with `data.medium` picks `body`, and `bodies` lists them all. Style
636
+ checks, anchors, beats and case search are for prose only: a body in another
637
+ medium gets no `marks`, `beats` on it is refused, and the case search in
638
+ `memory` is for prose bodies.
639
+
640
+ **Technique sources.** A record in the style team can carry a source tag,
641
+ `출처/<key>`, naming whose technique it is (for example
642
+ `출처/aiakiv-web`). A work picks its sources in the form setting slot
643
+ `technique_sources`, a list of source keys such as `["aiakiv-web"]`
644
+ (lowercase letters, digits and hyphens, up to 41 characters, not starting
645
+ with a hyphen). Every kind of work has it, `screens` included. Like
646
+ `anchors`, a nearer form setting adds to a farther one's.
647
+
648
+ - `memory.sources` in `get_node` holds those keys as tags. When it is not
649
+ empty, call `search_work_memory(doc_id, query=case_query,
650
+ team="technique", tags=sources)`; when it is empty, leave `tags` out.
651
+ - `tags` works only with `team: "technique"`, five at most.
652
+ - When the creator asks for one author's or one source's technique only,
653
+ suggest writing that source key into `technique_sources` on a form setting
654
+ (at the work root, or under a part). You write it with `update_node`;
655
+ `fields.slots` replaces the whole object, so read the setting with
656
+ `get_node` first and send its other slots back. It is a draft the creator
657
+ confirms; the screens call the slot Source tags.
658
+ - With `tags`, the response carries `tags` (the tags actually used) and
659
+ `filtered`. `filtered: false` means the results were not filtered by
660
+ source, because the memory server does not filter by tag yet. Tell the
661
+ creator the cases may come from any source.
662
+ - Zero hits with a `note` means no record carries that source tag. Ask the
663
+ creator whether to search again without `tags`; do not drop them on your
664
+ own.
665
+ - The memory server matches only the last part of a tag, so a source key
666
+ must be a distinct name that is not the last part of any other tag. `web`
667
+ would not do, since `매체/web` already ends in it.
668
+
669
+ ## Cutting an arc into installments
670
+
671
+ An installment (the Korean screens call it "회차") is what goes out at one
672
+ time when a work is released as a serial. It is a cut drawn over the reading
673
+ order, not a resolution and not a level of the tree: the scenes stay under
674
+ their parts. It is a setting node with `facet: "release"`, and its members
675
+ are `released_in` links to it. Slot names, link attributes, the stats keys
676
+ and the recipe are in the `release` topic of `describe`; read it first.
677
+
678
+ - Three principles. Development is decided in the arc: `pace`, `tempo`,
679
+ `turn` and the completion conditions are plan slots, so the rhythm is set
680
+ before the prose exists and cutting comes after; do not try to fix pacing
681
+ by cutting. The hook and the recap are a layer on the installment, written
682
+ into its `hook` and `recap` slots and never into a scene's `description`,
683
+ so the serial text (recap, bodies, hook) and the collected text (bodies
684
+ only) come from the same prose. The app does not judge; it gives numbers.
685
+ - A scene enters in one of two ways. Whole: a `released_in` link from the
686
+ scene, with `ord` in `attrs`. By paragraph range: a link from its body node
687
+ (`body.node_id` in `get_node` on the scene), with `ord`, `from_par` and
688
+ `to_par`. A paragraph is a block separated by a blank line; paragraphs are
689
+ counted from 0 and `to_par` is exclusive; an empty `from_par` means the
690
+ start and an empty `to_par` the end. The form on the Contents screens
691
+ counts from 1 and includes the end, so speak to the creator in the numbers
692
+ they see and send 0-based numbers in the call.
693
+ - Two rules, refused with `invalid_data`. A scene enters one way only: never
694
+ whole in one installment and by body range in another. A paragraph belongs
695
+ to one installment only: ranges of the same body in different installments
696
+ must not overlap. To change a cut, `remove_link` and `add_link` again; a
697
+ link is not edited in place.
698
+ - Order of work:
699
+ 1. Read the part and its scenes with `get_node`: each `body`'s length and
700
+ `slots.pace`.
701
+ 2. Decide the cuts with the creator. Choosing where to cut against
702
+ `target_chars` is your work and theirs, from the numbers; the app
703
+ offers no candidates.
704
+ 3. `add_node` the installment: `kind: "setting"`, `facet: "release"`,
705
+ `slots` with `no` and `target_chars` as numeric strings. Then
706
+ `add_link` the members.
707
+ 4. `list_releases` with `doc_id` returns the installments in number order
708
+ with `members` and `stats`, and `unreleased`: the scenes in no
709
+ installment. `unreleased` is the to-do list, not an error, and no stat
710
+ is a verdict.
711
+ 5. Write `recap` and `hook` with `update_node`. `fields.slots` replaces the
712
+ whole object, so read the four slots with `get_node` first and send all
713
+ four back.
714
+ - `get_node` on an installment carries `release` (members, stats, hook,
715
+ recap); on a scene or a body it carries `released_in` when there is one.
716
+ - When a body changes after it was cut, the check `release_stale` (a
717
+ suggestion) appears on the installment and the body, and `members[].stale`
718
+ is `true`. Look at the range again and re-link. It blocks nothing.
719
+ - The creator sees the numbers, the members and the serial and collected
720
+ texts on the installments list and the installment view (the `screens`
721
+ topic names them), and adds, removes, edits and confirms there. What you
722
+ make here is a draft. A confirmed installment is published as a setting;
723
+ links are not published, and the confirmed prose of the scenes does not
724
+ change by one character.
725
+ - Not in the app: upload to a platform, scheduling, per-installment
726
+ pricing, automatic cutting, pacing verdicts ("slow", "padded"), reader
727
+ screens, and cutting by beats (paragraphs only).
728
+
729
+ ## Common mistakes
730
+
731
+ - **Everything the AI creates or edits is a draft.** The creator confirms it
732
+ on the Contents screens, and the app publishes the confirmed version to
733
+ memory at that moment. Do not tell the creator it is saved before then.
734
+ - **Do not fill an empty work in one go.** In a new or nearly empty work,
735
+ making many scenes at once without discussing them skips the creator's
736
+ choices. Suggest the order first and add drafts a few at a time; see
737
+ "Building a new work: facts first, then scenes".
738
+ - **Do not save the work's content with `save_memory`.** On the work team
739
+ and the memo team's other projects, `save_memory` and `hide_memory` are
740
+ refused by default (while the account permission `app-memory:write` is
741
+ off, which only the user can change). The process project is the
742
+ exception, and only for the work process; see "The process log". Do not
743
+ use `update_memory` to edit memory the app published either: the app's
744
+ publish records and review marks would stop matching it.
745
+ - **Facts and world lines are not in the Studio tree.** Do not send the
746
+ creator to Studio to find or confirm one. The creator reads, edits, deletes
747
+ and confirms facts on the fact list and fact view screens, which the
748
+ `facts` topic of `describe` names. When asked to confirm a fact, point to
749
+ the fact view; the AI cannot confirm. A world line is edited (title,
750
+ description, calendar), deleted and confirmed on the world line view,
751
+ which the `facts` topic also names; send the creator there, not to Studio.
752
+ - **Changing a world line's calendar opens review items.** Changing a world
753
+ line's `slots.calendar` through `update_node` opens a `calendar_changed`
754
+ item on that line's confirmed facts that have a time, and the response
755
+ reports how many in `review_items_opened`. Do not change it as a side
756
+ effect of another edit; tell the creator first what it will open.
757
+ - **There are no episodes.** A scene's place in story time comes from its
758
+ own `time` or from the facts it `tells`. A scene with neither shows "Not
759
+ placed in story time" under Needs check on the Scene flow chart. Do not look for,
760
+ ask about or set episodes; an `episode_id` left on an old node is a
761
+ leftover and places nothing.
762
+ - **Do not put the category on the location; it belongs to the fact.** In
763
+ a `screens` work each fact sits in one category column; when a screen
764
+ differs by category, make one fact per category; see "Start here".
765
+ - **Style belongs to form settings, not to scenes.** Register, banned
766
+ patterns and the other style slots go on a form setting; see "Writing in
767
+ another language and form settings".
768
+ - **Beats never replace prose.** Do not rewrite prose from beats; see
769
+ "Beats".
770
+ - **Anchors are the creator's choice.** Do not write `anchors` for a body the
771
+ creator did not name, and do not copy an anchor's text; see "Anchors and
772
+ the marks in a response".
773
+ - **Marks are suggestions, not errors.** A `marks` entry in a body response,
774
+ or a style suggestion in the confirm preview, blocks nothing; fix what is
775
+ worth fixing and move on.
776
+ - **The narrator lives on a form setting, not on a scene.** `narrator` goes
777
+ on a form setting (`facet: "form"`), and a nearer one replaces the whole
778
+ object; `pace`, `interiority` and `withhold` go on the scene. See
779
+ "Narration: pace, interiority, withhold and the narrator".
780
+ - **Withheld things stay withheld.** A scene's `withhold`,
781
+ `continuity.scene_withhold` and `continuity.withhold` are what the reader
782
+ must not learn yet; never write them into the prose. When prose leaks one,
783
+ fix the prose and leave a `withhold_leak` review rather than deleting the
784
+ slot.
785
+ - **Do not write your own case query.** Use `memory.case_query` unchanged.
786
+ The app built it with the function that wrote the cases' summaries, so a
787
+ reworded or translated query misses them.
788
+ - **A source is a tag, not words in the query.** Pass `memory.sources` as
789
+ `tags`; a source name added to `case_query` only blurs the search and
790
+ filters nothing. Do not pass `tags` with `team: "work"`; it is refused. See
791
+ "Media and technique sources".
792
+ - **Do not keep writing on a lost context.** When the signs of a lost context
793
+ show, or the creator says something looks off, stop and re-read the
794
+ decisions first; see "When the context is lost".
795
+ - **No cases is not a blocker.** A missing `memory` key, a `null` query,
796
+ `memory_unavailable` or zero hits all mean "write without cases". Do not
797
+ stop, do not ask the creator to bind or switch anything, and do not invent
798
+ a case.
799
+ - **Engine numbers are not canon.** Hit points, attack, drop weights, mint
800
+ caps, compass directions and the file format belong to the game tool and
801
+ its repository. Do not write them into a setting's description or slots,
802
+ and do not ask the creator to decide them in Contents.
803
+ - **The app does not write the world file.** `export_work` gives the whole
804
+ work as one neutral JSON; the AI assembles the engine file from it and
805
+ registers the file as an asset. Do not look for an export action that
806
+ returns `world.toml`, and do not send the JSON to the creator as if it
807
+ were the game file.
808
+ - **Prompts, seeds and takes are not canon.** The shot list and the visual
809
+ style are canon; the prompt text, seed, duration, aspect ratio, tool ids
810
+ and the tries belong to the tool. Register only the adopted file as an
811
+ asset.
812
+ - **Do not write the hook into the scene.** The hook and the recap are the
813
+ installment's `hook` and `recap` slots; put in a scene's `description`
814
+ they would also appear in the collected text. See "Cutting an arc into
815
+ installments".
816
+ - **Do not ask the app where to cut.** `list_releases` gives numbers only,
817
+ no candidates and no verdict; decide the cuts with the creator from the
818
+ numbers and the arc's rhythm, and do not look for a "slow" or "padded"
819
+ judgment in any response.
820
+ - **Ideas go to memos** with `add_scratch`. The creator sees them as memos
821
+ ("메모" on the Korean screens), so use that word with the creator.
822
+ - **Do not edit a memo.** `update_memory` and `hide_memory` are not for
823
+ memos: the memo team outside the process project is read through the app
824
+ only, and a memo's text is never changed. Correct it with a new memo linked
825
+ by `prev_event_id`, and read the whole chain before acting on an old memo.
826
+ Hiding one is `hide_scratch`, only when the creator asks for that memo to
827
+ be hidden, and it cannot be undone; see "Finding memos and style".
828
+ - **`save_memory` has two places: style notes and the process log.** Build
829
+ up style descriptions on the style team with `save_memory`, from a folder
830
+ connected to the style team, following the `aiakiv-save-and-recall` skill.
831
+ Keep the work process in the process project; see "The process log".
832
+ Nowhere else in a Contents work.
833
+ - **"ak save" on a work connection.** If the user says "ak save" and this
834
+ connection's project ends in `:process`, save right away with
835
+ `save_memory`. If it ends in `:canonical`, or is the memo team's own
836
+ project, say that the save will be refused there. Then offer a memo
837
+ (`add_scratch`), or the connection folder from the "AI connection"
838
+ screen, which is tied to the process project. Do not pick another
839
+ destination on a guess.
840
+ - **On an error**, read the `errors` topic of `describe` before trying again.