howone 0.1.30 → 0.1.32

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.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/howone/01-architect/01-app-generation.md +138 -176
  3. package/templates/vite/.howone/skills/howone/01-architect/02-manifest-codegen.md +2 -2
  4. package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/01-schema-design.md +12 -30
  5. package/templates/vite/.howone/skills/howone/02-entity-schema/02-schema-operations.md +329 -0
  6. package/templates/vite/.howone/skills/howone/02-entity-schema/03-access-models.md +151 -0
  7. package/templates/vite/.howone/skills/howone/02-entity-schema/04-query-contracts.md +123 -0
  8. package/templates/vite/.howone/skills/howone/02-entity-schema/05-ai-persistence-patterns.md +255 -0
  9. package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/01-ai-capability-architecture.md +42 -36
  10. package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/02-workflow-contract-rules.md +5 -4
  11. package/templates/vite/.howone/skills/howone/{04-ai/04-service-capability-catalog.md → 03-ai-capabilities/03-service-capability-catalog.md} +15 -11
  12. package/templates/vite/.howone/skills/howone/03-ai-capabilities/04-workflow-operations.md +141 -0
  13. package/templates/vite/.howone/skills/howone/{04-ai/06-ai-feature-playbooks.md → 03-ai-capabilities/05-ai-feature-playbooks.md} +8 -29
  14. package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/01-client-setup.md +7 -6
  15. package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/07-ai-action-calls.md +5 -5
  16. package/templates/vite/.howone/skills/howone/{04-ai/03-ai-sdk-handoff.md → 04-app-sdk/08-ai-manifest-handoff.md} +8 -7
  17. package/templates/vite/.howone/skills/howone/{03-sdk/08-extension-boundaries.md → 04-app-sdk/09-extension-boundaries.md} +1 -1
  18. package/templates/vite/.howone/skills/howone/{02-database/03-data-access-patterns.md → 04-app-sdk/11-entity-data-access-patterns.md} +4 -4
  19. package/templates/vite/.howone/skills/howone/{02-database/04-query-dsl-and-responses.md → 04-app-sdk/12-query-dsl-and-responses.md} +1 -1
  20. package/templates/vite/.howone/skills/howone/SKILL.md +137 -133
  21. package/templates/vite/.howone/skills/howone/agents/openai.yaml +3 -3
  22. package/templates/vite/AGENTS.md +2 -2
  23. package/templates/vite/.howone/skills/howone/02-database/02-schema-operations.md +0 -398
  24. package/templates/vite/.howone/skills/howone/02-database/05-ai-persistence-patterns.md +0 -372
  25. package/templates/vite/.howone/skills/howone/04-ai/05-workflow-operations.md +0 -256
  26. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/02-entity-operations.md +0 -0
  27. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/03-auth.md +0 -0
  28. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/04-react-integration.md +0 -0
  29. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/05-file-upload.md +0 -0
  30. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/06-raw-http.md +0 -0
  31. /package/templates/vite/.howone/skills/howone/{03-sdk/09-workflow-execute-sse.md → 04-app-sdk/10-workflow-execute-sse.md} +0 -0
@@ -1,372 +0,0 @@
1
- # AI Persistence Patterns
2
-
3
- Use this reference when an AI workflow output must become durable product data: generation history,
4
- saved results, analysis reports, retryable jobs, share pages, or user libraries.
5
-
6
- AI workflow contracts describe **how to produce an output**. Entity schemas describe **what the app
7
- persists, lists, edits, shares, and reloads**. Do not merge those two responsibilities.
8
-
9
- ## Core Rule
10
-
11
- ```text
12
- AI capability outputSchema != database entity schema
13
- ```
14
-
15
- The output schema is the workflow return contract. It can contain transient execution details,
16
- intermediate data, model metadata, or provider-shaped structures. The database schema is a product
17
- contract. It should store only fields that the app needs after refresh, across sessions, or on public
18
- pages.
19
-
20
- For every AI feature, ask:
21
-
22
- | Question | Persist? | Where |
23
- |---|---:|---|
24
- | Must the user see this after refresh? | yes | Entity field |
25
- | Must it appear in history/library/search? | yes | Entity field + index if queried |
26
- | Is it only needed while streaming/running? | no | Local UI state / runtime event |
27
- | Is it provider debug data? | usually no | Logs, not entity data |
28
- | Is it needed to retry or resume? | yes | Entity field |
29
- | Is it sensitive model/provider metadata? | usually no | Avoid public entity fields |
30
-
31
- ## Recommended Flow
32
-
33
- For long-running or user-visible AI operations, create a pending record before calling the workflow.
34
-
35
- ```ts
36
- import { runAiActionAndPersist } from '@howone/sdk'
37
-
38
- await runAiActionAndPersist({
39
- entity: howone.entities.Generation,
40
- input: { prompt },
41
- createPending: (input) => ({
42
- prompt: input.prompt,
43
- status: 'pending',
44
- requestedAt: new Date().toISOString(),
45
- }),
46
- run: (input) => howone.ai.generateImage.run(input),
47
- mapCompleted: ({ output }) => ({
48
- status: 'completed',
49
- resultUrl: output.imageUrl,
50
- completedAt: new Date().toISOString(),
51
- }),
52
- mapFailed: ({ error }) => ({
53
- status: 'failed',
54
- errorMessage: error instanceof Error ? error.message : 'Generation failed',
55
- }),
56
- })
57
- ```
58
-
59
- Why pending-first:
60
-
61
- - refresh can show an in-progress item instead of losing the request;
62
- - failure can be displayed in history;
63
- - retry can reuse the original prompt/options;
64
- - support/debug can identify which input produced the failed state;
65
- - UI can render from persisted data instead of assuming local state survived.
66
-
67
- For very fast, disposable AI actions, persistence may be unnecessary. Do not create an entity just
68
- because an AI workflow exists.
69
-
70
- ## Status Fields
71
-
72
- Every persisted AI job/history entity should have a status field.
73
-
74
- Recommended:
75
-
76
- ```json
77
- {
78
- "status": {
79
- "type": "string",
80
- "description": "pending | running | completed | failed | canceled",
81
- "default": "pending"
82
- }
83
- }
84
- ```
85
-
86
- Use stable string values:
87
-
88
- | Status | Meaning |
89
- |---|---|
90
- | `pending` | Record exists, workflow has not produced final output. |
91
- | `running` | Optional if the app receives a running state after submission. |
92
- | `completed` | Output fields are valid for display. |
93
- | `failed` | `errorMessage` or failure fields explain the failure. |
94
- | `canceled` | User/system canceled and no final output should be expected. |
95
-
96
- Rules:
97
-
98
- - Do not infer completion only from `resultUrl` or another output field.
99
- - Keep failed records when the product has history or retry UX.
100
- - If the UI shows a spinner from persisted data, it must also handle stale `pending/running` records.
101
-
102
- ## Minimal Generation History Schema
103
-
104
- Use for image/text/report/music/video generation history.
105
-
106
- ```json
107
- {
108
- "name": "Generation",
109
- "type": "object",
110
- "visibility": "private",
111
- "properties": {
112
- "prompt": { "type": "string" },
113
- "status": { "type": "string", "default": "pending" },
114
- "resultUrl": { "type": ["string", "null"], "default": null },
115
- "resultText": { "type": ["string", "null"], "default": null },
116
- "errorMessage": { "type": ["string", "null"], "default": null },
117
- "requestedAt": { "type": "date" },
118
- "completedAt": { "type": ["date", "null"], "default": null }
119
- },
120
- "required": ["prompt", "status", "requestedAt"],
121
- "access": {
122
- "authenticated": { "read": "own", "create": "own", "update": "own", "delete": "own" },
123
- "public": { "read": "none", "create": "none", "update": "none", "delete": "none" }
124
- },
125
- "indexes": [
126
- { "name": "owner_updated", "fields": ["updatedDate"], "scope": "owner" },
127
- { "name": "owner_status_updated", "fields": ["status", "updatedDate"], "scope": "owner" }
128
- ],
129
- "performance": {
130
- "defaultLimit": 20,
131
- "maxLimit": 100,
132
- "allowedSorts": ["updatedDate", "requestedAt"]
133
- },
134
- "presentation": {
135
- "titleField": "prompt",
136
- "subtitleField": "status"
137
- }
138
- }
139
- ```
140
-
141
- Use separate result fields instead of one opaque `result` object when the UI lists or filters them.
142
- Use an object field only for genuinely nested, product-level structured results.
143
-
144
- ## Analysis Report Schema
145
-
146
- Use when AI returns a structured report that users browse later.
147
-
148
- ```json
149
- {
150
- "name": "AnalysisReport",
151
- "type": "object",
152
- "visibility": "private",
153
- "properties": {
154
- "sourceTitle": { "type": "string" },
155
- "sourceUrl": { "type": ["string", "null"], "default": null },
156
- "status": { "type": "string", "default": "pending" },
157
- "summary": { "type": ["string", "null"], "default": null },
158
- "insights": { "type": "array", "default": [] },
159
- "score": { "type": ["number", "null"], "default": null },
160
- "errorMessage": { "type": ["string", "null"], "default": null },
161
- "requestedAt": { "type": "date" },
162
- "completedAt": { "type": ["date", "null"], "default": null }
163
- },
164
- "required": ["sourceTitle", "status", "requestedAt"],
165
- "access": {
166
- "authenticated": { "read": "own", "create": "own", "update": "own", "delete": "own" },
167
- "public": { "read": "none", "create": "none", "update": "none", "delete": "none" }
168
- }
169
- }
170
- ```
171
-
172
- Mapping rule:
173
-
174
- ```ts
175
- const output = await howone.ai.analyzeDocument.run(input)
176
-
177
- await howone.entities.AnalysisReport.update(report.id, {
178
- status: 'completed',
179
- summary: output.summary,
180
- insights: output.insights,
181
- score: output.score,
182
- completedAt: new Date().toISOString(),
183
- })
184
- ```
185
-
186
- Do not save the whole workflow envelope unless the entity has an explicitly designed field for that
187
- envelope and the product needs it.
188
-
189
- ## Public AI Result Share Page
190
-
191
- Use when a user can share one generated result publicly.
192
-
193
- Recommended split:
194
-
195
- - private `Generation` entity for user history and edits;
196
- - public or scoped `SharedGeneration` entity for anonymous viewing.
197
-
198
- Why split:
199
-
200
- - private history may include prompts, failures, drafts, and internal metadata;
201
- - public page should expose only curated fields;
202
- - public access rules stay simple and auditable;
203
- - unsharing can delete or deactivate the shared record without destroying private history.
204
-
205
- Public scoped schema:
206
-
207
- ```json
208
- {
209
- "name": "SharedGeneration",
210
- "type": "object",
211
- "visibility": "public",
212
- "properties": {
213
- "shareId": {
214
- "type": "string",
215
- "autoGenerate": { "strategy": "uuid" }
216
- },
217
- "title": { "type": "string" },
218
- "resultUrl": { "type": "string" },
219
- "active": { "type": "boolean", "default": true },
220
- "sourceGenerationId": { "type": "string" }
221
- },
222
- "required": ["shareId", "title", "resultUrl", "active", "sourceGenerationId"],
223
- "access": {
224
- "authenticated": { "read": "own", "create": "own", "update": "own", "delete": "own" },
225
- "public": {
226
- "read": "scoped",
227
- "create": "none",
228
- "update": "none",
229
- "delete": "none",
230
- "requiredScopes": ["shareId"],
231
- "allowedFilters": ["shareId", "active"],
232
- "allowedSorts": ["updatedDate"],
233
- "defaultLimit": 1,
234
- "maxLimit": 1
235
- }
236
- },
237
- "indexes": [
238
- { "name": "share_id_unique", "fields": ["shareId"], "unique": true },
239
- { "name": "owner_updated", "fields": ["updatedDate"], "scope": "owner" }
240
- ]
241
- }
242
- ```
243
-
244
- Public page:
245
-
246
- ```ts
247
- const result = await howone.public.entities.SharedGeneration.queryScoped({
248
- where: { shareId, active: true },
249
- page: { number: 1, size: 1 },
250
- })
251
-
252
- const shared = result.items[0] ?? null
253
- ```
254
-
255
- Rules:
256
-
257
- - Do not expose private prompt fields unless the product explicitly wants that.
258
- - Use `active` or a deletion flow for unshare.
259
- - Keep public `maxLimit` at `1` for one-share pages.
260
-
261
- ## Retry Design
262
-
263
- If the product has retry, store enough input fields to rebuild the workflow request.
264
-
265
- Persist:
266
-
267
- - user prompt or source content reference;
268
- - selected mode/model/style options that affect output;
269
- - uploaded file IDs/URLs needed by the workflow;
270
- - status and failure message;
271
- - timestamps.
272
-
273
- Do not persist:
274
-
275
- - temporary UI component state;
276
- - auth/session/token values;
277
- - raw streaming chunks;
278
- - provider secrets;
279
- - hidden prompt text that should stay server-side;
280
- - large binary content when file upload should store a URL or file id.
281
-
282
- Retry example:
283
-
284
- ```ts
285
- const old = await howone.entities.Generation.getOrThrow(id)
286
-
287
- const retry = await howone.entities.Generation.create({
288
- prompt: old.prompt,
289
- status: 'pending',
290
- requestedAt: new Date().toISOString(),
291
- })
292
-
293
- const output = await howone.ai.generateImage.run({
294
- prompt: old.prompt,
295
- })
296
-
297
- await howone.entities.Generation.update(retry.id, {
298
- status: 'completed',
299
- resultUrl: output.imageUrl,
300
- completedAt: new Date().toISOString(),
301
- })
302
- ```
303
-
304
- Prefer creating a new retry record when the product is history-oriented. Prefer updating the same
305
- record only when the product treats retry as replacing the original attempt.
306
-
307
- ## Resume Design
308
-
309
- On page load, query persisted records instead of relying on local state:
310
-
311
- ```ts
312
- const history = await howone.entities.Generation.query.mine({
313
- where: { status: { in: ['pending', 'running', 'completed', 'failed'] } },
314
- orderBy: { updatedDate: 'desc' },
315
- page: { number: 1, size: 20 },
316
- })
317
- ```
318
-
319
- Then:
320
-
321
- - render `completed` from output fields;
322
- - render `failed` from `errorMessage`;
323
- - render `pending/running` as in progress only if the app has a way to poll status;
324
- - mark stale pending records as failed/canceled when product rules define a timeout.
325
-
326
- Do not leave indefinite pending rows with no recovery path.
327
-
328
- ## Field Mapping Checklist
329
-
330
- Before implementing persistence, write the mapping explicitly:
331
-
332
- ```text
333
- workflow input.prompt -> Generation.prompt
334
- workflow input.style -> Generation.style
335
- workflow output.imageUrl -> Generation.resultUrl
336
- workflow output.caption -> Generation.resultText
337
- workflow error.message -> Generation.errorMessage
338
- runtime request started -> Generation.requestedAt
339
- runtime request completed -> Generation.completedAt
340
- ```
341
-
342
- If a workflow output field has no mapping, decide whether it is intentionally transient or whether
343
- the entity schema is missing a product field.
344
-
345
- ## Access Checklist
346
-
347
- Choose access based on product behavior:
348
-
349
- | Product behavior | Entity access |
350
- |---|---|
351
- | User-only private generation history | authenticated own, public none |
352
- | Team/shared authenticated library | authenticated all or future role-scoped model |
353
- | Anonymous public gallery | public list with safe fields only |
354
- | One public share link | public scoped with share id |
355
- | Public submission to AI queue | public create only if abuse constraints are handled |
356
-
357
- Never make the main generation history public just to support a public share page. Create a scoped
358
- share entity or a curated public entity.
359
-
360
- ## Common Mistakes
361
-
362
- | Mistake | Fix |
363
- |---|---|
364
- | Treating `outputSchema` as the entity schema | Design product persistence separately. |
365
- | Saving raw workflow envelopes | Map only fields the product needs after refresh. |
366
- | No status field | Add `status` and explicit failure fields. |
367
- | Creating history only after success | Create pending first when history/resume matters. |
368
- | Losing failures | Persist `failed` state and `errorMessage`. |
369
- | Publicly exposing private prompt/history | Use a separate public scoped/share entity. |
370
- | Retrying without stored inputs | Persist the inputs/options needed for retry. |
371
- | Rendering from local state only | Reload from entity queries on page load. |
372
- | Leaving stale pending forever | Add timeout/recovery behavior in product logic. |
@@ -1,256 +0,0 @@
1
- # Workflow Operations
2
-
3
- Use this reference when submitting or checking external workflow create/update operations.
4
-
5
- Source: `docs/ai-worlfow-guide-schema.md`.
6
-
7
- ## Endpoints
8
-
9
- | Purpose | Method | Path |
10
- |---|---|---|
11
- | Submit create/update operations | `POST` | `/workflow/{project_short_id}/operate` |
12
- | Check operation status | `GET` | `/workflow/status_check/{request_id}` |
13
-
14
- All requests require `Authorization: Bearer <token>`.
15
-
16
- ## Operation Object
17
-
18
- ```json
19
- {
20
- "appId": "proj_docs",
21
- "workflowId": "550e8400-e29b-41d4-a716-446655440000",
22
- "mode": "create",
23
- "capability": {
24
- "name": "summarizeDocument",
25
- "description": "Reads an uploaded document and produces a concise summary highlighting the key points.",
26
- "inputSchema": {},
27
- "outputSchema": {},
28
- "outputEntityName": "DocumentSummary"
29
- },
30
- "requestMeta": {}
31
- }
32
- ```
33
-
34
- Field rules:
35
-
36
- | Field | Required | Notes |
37
- |---|---:|---|
38
- | `appId` | yes | Must match path project short ID. |
39
- | `workflowId` | yes | UUID v4 from manifest/capability contract. |
40
- | `mode` | yes | `"create"` or `"update"`. |
41
- | `capability` | yes | Synced capability contract. |
42
- | `workflowConfigID` | update only | Comes from completed status result. |
43
- | `updatePrompt` | update only | Natural language behavior change request. |
44
- | `requestMeta` | no | Optional execution metadata. |
45
-
46
- Do not hand-copy stale schemas. Submit from synced `.howone/ai/manifest.json` whenever possible.
47
-
48
- ## Create Request
49
-
50
- ```json
51
- {
52
- "operations": [
53
- {
54
- "appId": "proj_docs",
55
- "workflowId": "550e8400-e29b-41d4-a716-446655440000",
56
- "mode": "create",
57
- "capability": {
58
- "name": "summarizeDocument",
59
- "description": "Reads an uploaded document and produces a concise summary highlighting the key points.",
60
- "inputSchema": {
61
- "type": "object",
62
- "properties": {
63
- "document_url": {
64
- "type": "string",
65
- "format": "uri",
66
- "description": "Supabase Storage URL of the uploaded document."
67
- },
68
- "summary_length": {
69
- "type": "string",
70
- "description": "Desired summary length, e.g. short, medium, long, or a specific sentence count."
71
- }
72
- },
73
- "required": ["document_url"]
74
- },
75
- "outputSchema": {
76
- "type": "object",
77
- "properties": {
78
- "summary": {
79
- "type": "string",
80
- "description": "The generated summary in the same language as the source document."
81
- }
82
- },
83
- "required": ["summary"]
84
- },
85
- "outputEntityName": "DocumentSummary"
86
- },
87
- "requestMeta": {}
88
- }
89
- ]
90
- }
91
- ```
92
-
93
- Create response:
94
-
95
- ```json
96
- {
97
- "request_ids": [
98
- {
99
- "request_id": "req_abc123",
100
- "workflow_id": "550e8400-e29b-41d4-a716-446655440000",
101
- "workflow_config_id": null,
102
- "operation_type": "generate"
103
- }
104
- ]
105
- }
106
- ```
107
-
108
- Store every `request_id`.
109
-
110
- ## Update Request
111
-
112
- Use update when the external workflow implementation already exists.
113
-
114
- ```json
115
- {
116
- "operations": [
117
- {
118
- "appId": "proj_docs",
119
- "workflowId": "550e8400-e29b-41d4-a716-446655440000",
120
- "workflowConfigID": "cfg_xyz789",
121
- "mode": "update",
122
- "capability": {
123
- "name": "summarizeDocument",
124
- "description": "Reads an uploaded document and produces a concise summary. Supports paragraph or bullet-point format.",
125
- "inputSchema": {
126
- "type": "object",
127
- "properties": {
128
- "document_url": {
129
- "type": "string",
130
- "format": "uri",
131
- "description": "Supabase Storage URL of the uploaded document."
132
- },
133
- "output_format": {
134
- "type": "string",
135
- "description": "Format of the summary output: paragraphs or bullet_points."
136
- }
137
- },
138
- "required": ["document_url"]
139
- },
140
- "outputSchema": {
141
- "type": "object",
142
- "properties": {
143
- "summary": {
144
- "type": "string",
145
- "description": "The generated summary in the requested format and same language as the source document."
146
- }
147
- },
148
- "required": ["summary"]
149
- },
150
- "outputEntityName": "DocumentSummary"
151
- },
152
- "updatePrompt": "Add support for optional bullet-point summary output through output_format.",
153
- "requestMeta": {}
154
- }
155
- ]
156
- }
157
- ```
158
-
159
- Update response has `operation_type: "edit"`.
160
-
161
- ## Status Polling
162
-
163
- ```text
164
- POST /workflow/{project_short_id}/operate
165
- -> request_ids[]
166
-
167
- GET /workflow/status_check/{request_id}
168
- -> queued/running/completed/failed
169
- ```
170
-
171
- Poll every 2-5 seconds until terminal.
172
-
173
- Status values:
174
-
175
- | Status | Meaning | Action |
176
- |---|---|---|
177
- | `queued` | waiting | continue polling |
178
- | `running` | being generated/edited | continue polling |
179
- | `completed` | operation finished | inspect `payload.success` |
180
- | `failed` | system failure | report/display error |
181
-
182
- Completed success:
183
-
184
- ```json
185
- {
186
- "success": true,
187
- "jobId": "req_abc123",
188
- "status": "completed",
189
- "payload": {
190
- "success": true,
191
- "workflow_details": {
192
- "workflow_graph": {},
193
- "new_workflow_config_id": "cfg_xyz789"
194
- }
195
- }
196
- }
197
- ```
198
-
199
- Completed business failure:
200
-
201
- ```json
202
- {
203
- "success": true,
204
- "status": "completed",
205
- "payload": {
206
- "success": false,
207
- "display_error_message": "Unable to generate workflow: the requested capability is not supported.",
208
- "full_error_message": "Detailed internal error..."
209
- }
210
- }
211
- ```
212
-
213
- System failure:
214
-
215
- ```json
216
- {
217
- "success": true,
218
- "status": "failed",
219
- "payload": {
220
- "success": false,
221
- "display_error_message": "Service temporarily unavailable.",
222
- "full_error_message": "Timeout after 120s waiting for LLM response."
223
- }
224
- }
225
- ```
226
-
227
- On success, persist:
228
-
229
- - `request_id`;
230
- - `workflowId`;
231
- - `new_workflow_config_id`;
232
- - capability name;
233
- - mode;
234
- - any status/error useful for future update.
235
-
236
- ## Agent Handoff Notes
237
-
238
- When another tool/layer owns submission:
239
-
240
- - provide the synced capability name and manifest path;
241
- - do not rewrite raw schemas if the tool can load manifest;
242
- - preserve returned request IDs;
243
- - after status success, preserve `workflowConfigID` for future edits;
244
- - regenerate SDK only after manifest changes, not after behavior-only workflow edits.
245
-
246
- ## Operation Checklist
247
-
248
- - Manifest is synced before submit.
249
- - `appId` matches path project ID.
250
- - `workflowId` is a UUID.
251
- - `mode=create` omits `workflowConfigID`.
252
- - `mode=update` includes confirmed `workflowConfigID`.
253
- - `updatePrompt` says what to change, not a whole new fake schema.
254
- - Request IDs are stored.
255
- - Status is polled to terminal.
256
- - Business failure and system failure are handled differently.