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.
- package/README.md +59 -18
- package/dist/bind.js +25 -3
- package/dist/config/json.js +11 -3
- package/dist/console.js +4 -1
- package/dist/doctor.js +126 -19
- package/dist/handoff.js +11 -0
- package/dist/main.js +26 -9
- package/dist/mcpProbe.js +25 -2
- package/dist/setup.js +13 -9
- package/dist/skills.js +90 -128
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/skills/aiakiv-cards/SKILL.md +152 -0
- package/skills/aiakiv-console/SKILL.md +253 -0
- package/skills/aiakiv-contents/SKILL.md +840 -0
- package/skills/aiakiv-dashboard/SKILL.md +172 -0
- package/skills/aiakiv-graph-query/SKILL.md +278 -0
- package/skills/aiakiv-links/SKILL.md +123 -0
- package/skills/aiakiv-onboarding/SKILL.md +176 -0
- package/skills/aiakiv-save-and-recall/SKILL.md +165 -0
- package/skills/bundle.json +47 -0
|
@@ -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.
|