@jangts/agent-core 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/LICENSE +55 -0
- package/NOTICE +6 -0
- package/README.md +8 -0
- package/development/docs/README.en.md +70 -0
- package/development/docs/README.md +1 -1
- package/development/docs/acceptance.en.md +34 -0
- package/development/docs/agent-development.en.md +42 -0
- package/development/docs/api/README.en.md +62 -0
- package/development/docs/api/advanced-agents.en.md +135 -0
- package/development/docs/api/context-processing.en.md +110 -0
- package/development/docs/api/core.en.md +274 -0
- package/development/docs/api/examples.en.md +118 -0
- package/development/docs/api/kits.en.md +183 -0
- package/development/docs/api/knowledge-answering.en.md +166 -0
- package/development/docs/api/mock.en.md +186 -0
- package/development/docs/api/observability.en.md +166 -0
- package/development/docs/api/reference.en.md +2235 -0
- package/development/docs/api/support.en.md +252 -0
- package/development/docs/api/types.en.md +181 -0
- package/development/docs/api/workflow.en.md +188 -0
- package/development/docs/basic-usage.en.md +78 -0
- package/development/docs/create-app.en.md +76 -0
- package/development/docs/examples/offline-agent.en.md +273 -0
- package/development/docs/examples.en.md +36 -0
- package/development/docs/flows/knowledge-maintenance.en.md +38 -0
- package/development/docs/getting-started.en.md +71 -0
- package/development/docs/knowledge.en.md +89 -0
- package/development/docs/maintenance.en.md +62 -0
- package/development/docs/materials.en.md +38 -0
- package/development/docs/mechanisms.en.md +227 -0
- package/development/docs/memory-and-learning.en.md +42 -0
- package/development/docs/operations.en.md +51 -0
- package/development/docs/records.en.md +63 -0
- package/development/docs/registration.en.md +63 -0
- package/development/skills/agent-core-app/scripts/create-app.mjs +19 -0
- package/development/skills/agent-core-app/scripts/lib/knowledge.mjs +37 -1
- package/development/skills/agent-core-app/scripts/plan.mjs +9 -0
- package/development/skills/agent-core-app/scripts/resources.mjs +17 -0
- package/dist/cjs/diagnostics/catalog.js +6 -0
- package/dist/cjs/support/model/chat-completions.js +1 -1
- package/dist/cjs/support/model/completion/default.js +1 -0
- package/dist/cjs/support/model/completion/session.js +5 -0
- package/dist/esm/diagnostics/catalog.d.ts +6 -0
- package/dist/esm/diagnostics/catalog.js +6 -0
- package/dist/esm/structs/kits/retrieval.d.ts +1 -0
- package/dist/esm/structs/kits/search.d.ts +2 -0
- package/dist/esm/structs/model/messages.d.ts +4 -0
- package/dist/esm/structs/support/model/messages.d.ts +2 -0
- package/dist/esm/support/context/nodes.d.ts +16 -0
- package/dist/esm/support/context/processing.d.ts +7 -0
- package/dist/esm/support/model/chat-completions.js +1 -1
- package/dist/esm/support/model/children.d.ts +2 -0
- package/dist/esm/support/model/completion/default.d.ts +1 -0
- package/dist/esm/support/model/completion/default.js +1 -0
- package/dist/esm/support/model/completion/session.d.ts +5 -0
- package/dist/esm/support/model/completion/session.js +5 -0
- package/dist/esm/support/model/preview-rules.d.ts +6 -0
- package/dist/esm/support/model/reply-preview.d.ts +7 -0
- package/dist/esm/support/model/strategies.d.ts +4 -0
- package/package.json +6 -3
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Knowledge documents, sections, and versions
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [Knowledge API](api/knowledge-answering.md#knowledge) · [Complete answering chain](api/knowledge-answering.md)
|
|
4
|
+
|
|
5
|
+
## How the library learns your knowledge structure
|
|
6
|
+
|
|
7
|
+
Core does not scan knowledge directories, infer a knowledge base from file names, or automatically generate sections from Markdown headings. The App explicitly executes the following chain:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
App reads controlled sources
|
|
11
|
+
→ provides id, revision, locale, and body/structure
|
|
12
|
+
→ Knowledge.parseKnowledgeDocument (only when text anchors are used)
|
|
13
|
+
→ Knowledge.defineKnowledgeCatalog
|
|
14
|
+
→ App checks the task's document/section references
|
|
15
|
+
→ catalog.read with the reads allowed for this round
|
|
16
|
+
→ passes the KnowledgeSnapshot as evidence to subsequent handlers
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This structure is a local specification after adopting the Knowledge Kit, not a document format every Agent must store. The App can generate `KnowledgeDocument.parts` directly without Markdown parsing.
|
|
20
|
+
|
|
21
|
+
## Development-time preparation tools and runtime assembly functions
|
|
22
|
+
|
|
23
|
+
| Entry/asset | Purpose | What it does not do |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| [Maintenance guide](maintenance.md) | Prepare knowledge in the project; organize faithfully when sources exist, keep empty when none | Knowledge must have real sources; ideas are not facts |
|
|
26
|
+
| `Knowledge.parseKnowledgeDocument({id, revision, text, locale?})` | Parse paired section anchors into a document tree | Does not read files, compute revision, or complete all catalog validation |
|
|
27
|
+
| `Knowledge.defineKnowledgeCatalog(documents, options?)` | Compile/freeze an in-memory document catalog, providing ids, sectionIds, assertSelection, read | Does not create databases, watch files, import uploads, or automatically learn or write back |
|
|
28
|
+
| [Section marker notes](#text-section-anchors) | Local code fragment explaining paired anchors and nesting rules | Not initial knowledge and not loaded automatically |
|
|
29
|
+
| [knowledge.mjs](../skills/agent-core-app/scripts/lib/knowledge.mjs) | App-side template shipped with the Skill for explicitly reading files, computing versions, and compiling catalogs | Not a built-in persistent initializer of the library |
|
|
30
|
+
|
|
31
|
+
Minimal document JSON structure:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"id": "service-guide",
|
|
36
|
+
"revision": "content-version-1",
|
|
37
|
+
"locale": "zh-CN",
|
|
38
|
+
"parts": [
|
|
39
|
+
"全局引言。",
|
|
40
|
+
{ "id": "delivery", "parts": [
|
|
41
|
+
"本章节自身正文。",
|
|
42
|
+
{ "id": "delivery.timing", "parts": ["时机说明。"] }
|
|
43
|
+
] }
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
`parts` may mix raw text strings and subsections. Structured section IDs must be non-empty strings and **globally unique within the same document**, not merely unique among adjacent siblings. Document IDs are unique within the catalog; catalog compilation rejects duplicate sections and cycles. Do not run only the text parser and skip catalog compilation.
|
|
49
|
+
|
|
50
|
+
## Text section anchors
|
|
51
|
+
|
|
52
|
+
Sources use paired markers on their own lines, with no indentation:
|
|
53
|
+
|
|
54
|
+
```md
|
|
55
|
+
<!-- agent-section:delivery -->
|
|
56
|
+
本章节自身正文。
|
|
57
|
+
<!-- agent-section:delivery.timing -->
|
|
58
|
+
子章节正文。
|
|
59
|
+
<!-- /agent-section:delivery.timing -->
|
|
60
|
+
<!-- /agent-section:delivery -->
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The characters accepted in IDs by the text adapter are English letters, digits, `_`, `.`, `:`, and `-`. Markers must keep spaces as in the example and occupy their own line; opening and closing IDs must match and nest correctly. Markdown `#` headings are merely body text. The parser recognizes anchors from raw text and is not a full Markdown interpreter; do not put example anchors on their own lines inside code fences in sources, or they will also be recognized as real sections.
|
|
64
|
+
|
|
65
|
+
Stable IDs represent content identity. Changing a title does not require changing the ID; when splitting/deleting sections, migrate task mappings and historical reference policies at the same time. Characters such as `.` are only part of the ID; parent-child relationships are determined by the actual nesting in `parts` and cannot be guessed from names.
|
|
66
|
+
|
|
67
|
+
## Three ways to read
|
|
68
|
+
|
|
69
|
+
| Request | Returned scope |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| `{documentId:'service-guide', selection:{mode:'document'}}` | The whole body text and all descendants, in source order |
|
|
72
|
+
| `{documentId:'service-guide', selection:{mode:'self', sectionIds:['delivery']}}` | The selected section's own string body, excluding subsections |
|
|
73
|
+
| `{documentId:'service-guide', selection:{mode:'subtree', sectionIds:['delivery']}}` | The selected section and all its descendants |
|
|
74
|
+
|
|
75
|
+
Sections explicitly selected are joined by two newlines in the order of the request array; duplicate IDs are rejected. If a parent section and its child are both selected into a subtree as two different IDs, the child text may still be included twice; the library does not automatically eliminate this ancestor overlap. The App should choose the appropriate minimal complete scope.
|
|
76
|
+
|
|
77
|
+
`maxChars` limits the selected, trimmed body text of this call; exceeding it throws rather than silently cutting off the latter half. Document size, storage capacity, and model context budget are different limits. Unknown fields, identity, and file paths coming from the client are not trustworthy just because catalog.assertSelection passes; cross-boundary input is still parsed and authorized by the App according to its own schema.
|
|
78
|
+
|
|
79
|
+
## Versions and snapshots
|
|
80
|
+
|
|
81
|
+
The App provides `revision`. It can be a hash of available content and related metadata, a database version number, or a release version; the library does not compute it for you. Secretly modifying the body text under the same id/revision invalidates version semantics.
|
|
82
|
+
|
|
83
|
+
`KnowledgeSnapshot` contains documentId, selection, revision, locale, content, and id. The id comes from the serialization of the above identity and selection and is **not a body-text hash, signature, persistence ID, or authorization credential**. Different section selections of the same document have different references, and selection order also affects identity. Generation and review should pass the same snapshot and must not re-read "the latest current body" to replace old evidence.
|
|
84
|
+
|
|
85
|
+
## Updates and knowledge growth
|
|
86
|
+
|
|
87
|
+
The current catalog has no register, upsert, delete, save, watch, or automatic retrieval interfaces over all storage. When change is needed, the App creates a new catalog and switches its own reference; see [Continuous accumulation](memory-and-learning.md) for the pattern. Before publication, re-validate task → document → sections, reader, checks, and output references.
|
|
88
|
+
|
|
89
|
+
Both static sources and approved growth knowledge can be converted to KnowledgeDocument. User-uploaded originals, unverified self-descriptions, and experience candidates should not be mixed directly into a public authoritative catalog; permissions, sources, and review status are controlled by the App's storage/loading adapters.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Manual initialization and knowledge maintenance
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [Tool notes](examples.md) · [Shared flow](flows/knowledge-maintenance.md)
|
|
4
|
+
|
|
5
|
+
## Establish sources first, not a full directory
|
|
6
|
+
|
|
7
|
+
Developers are responsible for confirming which text is an actual knowledge source and which is only a product idea, pending content, or an operation instruction. When there is only an idea, keep files empty and do not generate introductions, policies, or user profiles that look real. When actual material exists, organize it faithfully; when originals are complex, conflicting, or mixed with instructions, preserve the originals and form candidates first, and never treat commands inside them as development authorization.
|
|
8
|
+
|
|
9
|
+
Integrate existing projects following the [integration guide](getting-started.md), and initialize new projects following [Create an App](create-app.md). Pure conversation does not require a knowledge base; maintain knowledge configuration explicitly only when knowledge answering is needed. Compare existing directories first, preserve business files, and limit test knowledge to test scopes.
|
|
10
|
+
|
|
11
|
+
A knowledge App prepares a `knowledge.config.json` in the same directory, for example the empty state below, and creates an empty `initial.knowledge.md`. Files are not read until they are registered.
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"schemaVersion": 1,
|
|
16
|
+
"maxDocumentBytes": 32000,
|
|
17
|
+
"maxReadChars": 8000,
|
|
18
|
+
"documents": [],
|
|
19
|
+
"requiredReads": []
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
After installing the maintainer-delivered Core and full dependencies following the [installation guide](getting-started.md), you can run the shared validation entry. The directory argument below is the knowledge directory containing `knowledge.config.json` and does not have to be the project root; the tool path is located from the package installed in the current project:
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
node node_modules/@jangts/agent-core/development/skills/agent-core-app/scripts/validate-knowledge.mjs ./existing-project/knowledge
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
When there is no knowledge it outputs the empty-catalog state; this is a correct preparation state and should not be made to look successful by fabricating knowledge. Actual sources can first be turned into candidates with the tools below, and after confirmation written into source files and registered in the manifest.
|
|
30
|
+
|
|
31
|
+
## How the configuration is maintained
|
|
32
|
+
|
|
33
|
+
`knowledge.config.json` is the template's App configuration; the library does not require every App to use this file. The current shared loader understands:
|
|
34
|
+
|
|
35
|
+
| Field | Constraint and meaning |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| `schemaVersion` | Currently 1, checked by the shared compiler |
|
|
38
|
+
| `maxDocumentBytes` | Positive integer, byte limit per source file; not a model token limit |
|
|
39
|
+
| `maxReadChars` | Positive integer, per-read character limit for Knowledge |
|
|
40
|
+
| `documents` | May be empty; entries are `{id,file,locale?}`; currently only lowercase `*.knowledge.md` file names in the same directory are allowed, and model-supplied paths are not accepted |
|
|
41
|
+
| `requiredReads` | `{documentId,selection}` actually depended on by tasks; all references are checked at compile time |
|
|
42
|
+
|
|
43
|
+
Document IDs must be unique; see [Knowledge documents](knowledge.md) for section rules. Newly added files must be registered explicitly; being on disk does not automatically grant publication or read eligibility. Source and subsequent version traceability are carried by the maintainer's own change records; candidate tools do not replace complete publication records.
|
|
44
|
+
|
|
45
|
+
## Adding and updating reuse the same validation
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
node node_modules/@jangts/agent-core/development/skills/agent-core-app/scripts/prepare-source.mjs ./existing-project/knowledge --source ./revision.md --id initial-doc
|
|
49
|
+
node node_modules/@jangts/agent-core/development/skills/agent-core-app/scripts/validate-knowledge.mjs ./existing-project/knowledge
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The first command only generates a candidate; the second checks the **currently effective configuration** and does not publish the candidate. The candidate contains the original file, document ID, suggested addition/replacement, source hash, revision, as well as the configuration hash at preparation time and existing document versions. Candidate validation also checks existing required section references; deleting a referenced section fails, and the task and configuration must be explicitly adjusted and the candidate prepared again—errors cannot be skipped automatically.
|
|
53
|
+
|
|
54
|
+
The configuration hash comes from the raw bytes actually parsed this time, sharing a single configuration read with the candidate's budget and required-read validation, so it is not re-read after validation and marked against a different baseline. Each source file version comes from content read this time; this does not constitute an atomic multi-file filesystem snapshot.
|
|
55
|
+
|
|
56
|
+
Publication is done by the maintainer: verify sources, body diffs, task references, and permissions → save the candidate to a controlled source file → add the new document to the manifest or update an existing file → use the same check entry → publish one complete version. Before publishing, compare the effective configuration and the revisions of replaced documents against the candidate baseline; if stale, redo the comparison. A single-file write is not a multi-file transaction; production systems should use their own versioned publication, transactions, or atomic switching.
|
|
57
|
+
|
|
58
|
+
Direct editing follows the same flow. A failed validation keeps the published version; generation and review use the same snapshot; a failed update does not delete the original file. Manual and runtime growth can share `compileApplicationKnowledge`, replacing only the input and commit adapters.
|
|
59
|
+
|
|
60
|
+
## What maintenance does not happen automatically
|
|
61
|
+
|
|
62
|
+
The tools have no automatic approval, publication, file watching, indexing, scheduled learning, or database writes. User profiles and business experience are different application data; define their sources, updates, and deletions according to [Continuous accumulation](memory-and-learning.md), then decide whether to convert them into readable Knowledge documents.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# User materials and data boundaries
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [Continuous accumulation](memory-and-learning.md)
|
|
4
|
+
|
|
5
|
+
Receiving material, extracting body text, using it within a round, storing it in a personal profile, and publishing it as shared knowledge are different operations. Core does not automatically convert uploads into long-term memory, nor does it trust instructions in material just because the material contains section anchors.
|
|
6
|
+
|
|
7
|
+
## Minimal processing chain
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Server confirms identity and material ownership
|
|
11
|
+
→ App checks format/size, saves necessary source information
|
|
12
|
+
→ Controlled parser extracts body text, records extraction failures or gaps
|
|
13
|
+
→ Selects content according to this round's authorization
|
|
14
|
+
→ Support context fragment marks it as user data and sets a budget
|
|
15
|
+
→ Handler uses the material and binds output to actual evidence
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Parsing and saving are provided by App adapters. The plain text example does not mean PDF, image OCR, audio transcription, web crawling, or archives are supported. When these formats are needed, register parsing capabilities and acceptable results explicitly; parsing failure must not be treated as empty content and then followed by a complete conclusion.
|
|
19
|
+
|
|
20
|
+
| Field to be made explicit | Purpose |
|
|
21
|
+
| --- | --- |
|
|
22
|
+
| Material ID, owning user/tenant, access scope | The server establishes permissions and does not trust client-claimed owners |
|
|
23
|
+
| Original reference, type, source time, content hash | Retrieve the original and determine versions; do not treat file names as stable identity |
|
|
24
|
+
| Extraction version, body text, gaps, and parsing status | Distinguish originals from model/parser output |
|
|
25
|
+
| Lifecycle, retention, and deletion method | Whether this round, the session, or persistent storage is decided by the product |
|
|
26
|
+
| Review/publication status | Candidate material cannot automatically become shared authoritative knowledge |
|
|
27
|
+
|
|
28
|
+
See [Material record](records.md#material-record) for a reference. It is an App-owned record sample with no corresponding Core persistence API.
|
|
29
|
+
|
|
30
|
+
## Context and tools
|
|
31
|
+
|
|
32
|
+
Use Support fragments to note the real source, `trust: 'user'`, and the corresponding lifecycle. The trust label is part of the assembly contract, not a sandbox; the App still needs to prevent material body text from being treated as higher-privilege instructions or executable code. Do not dynamically add one executable tool per uploaded file; usually keep a controlled `material.read` whose parameters reference IDs authorized for this round.
|
|
33
|
+
|
|
34
|
+
When continuing use across rounds, pass only references available to the session and re-confirm permissions and lifecycle. When persistent storage is needed, enter the application's own candidate and publication flow. After deleting an original, also clean up extracted text, summaries, indexes, and references according to the App policy—do not delete only the UI list.
|
|
35
|
+
|
|
36
|
+
## Delivery limits
|
|
37
|
+
|
|
38
|
+
Do not output the full material text by default in errors, logs, or receipts. Partial reads, insufficient budget, and incomplete parsing should become explicit check results; retries cannot widen the visible scope. Source references, file download URLs, and cross-end presentation are chosen by the App; the Interaction Kit is optional, and front and back ends are not forced to use InteractionProtocol/CommandCatalog uniformly.
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
# How the mechanism works
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [API handbook](api/README.md) · [Knowledge answering contract](api/knowledge-answering.md)
|
|
4
|
+
|
|
5
|
+
This document explains the current implementation with diagrams. Flows labeled "App composition example" are explicitly orchestrated by the application, not a fixed Agent flow built into Core; Core does not require the App to use Support, Kit, or task decomposition.
|
|
6
|
+
|
|
7
|
+
## 1. Overall collaboration relationship
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
flowchart LR
|
|
11
|
+
User[User input] --> App[App: identity, configuration, business orchestration and delivery]
|
|
12
|
+
App -->|calls runtime APIs, registers handlers| Core[Core: execution, model, tools, context contracts]
|
|
13
|
+
Core -->|calls back according to registered contracts| Handler[App handler: business processing and actual ports]
|
|
14
|
+
Handler -->|state updates, results or errors| Core
|
|
15
|
+
App -->|optional integration assistance| Support[Support: builds configuration, adapters and handlers]
|
|
16
|
+
Support -->|artifacts handed to the App for registration| App
|
|
17
|
+
Handler -->|calls as needed| Kit[Optional Kit: knowledge, answering, presentation, interaction, etc.]
|
|
18
|
+
Kit -->|local business results| Handler
|
|
19
|
+
Handler --> IO[App databases, files and external services]
|
|
20
|
+
Core -->|ChatProvider contract| Provider[Model connection provided by the App]
|
|
21
|
+
Provider --> Model[Model service]
|
|
22
|
+
App --> Output[User-visible output]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Core and App have a call/callback relationship. Support assists the App in integrating the same set of contracts; Kit is chosen one-way by the App, and a Kit may call Core APIs internally, still bound by the same budget, cancellation, and error contracts.
|
|
26
|
+
|
|
27
|
+
## 2. How task concepts map to execution mechanisms
|
|
28
|
+
|
|
29
|
+
```mermaid
|
|
30
|
+
flowchart TD
|
|
31
|
+
Question[User question] --> Compose[App organizes this round's processing by business]
|
|
32
|
+
Catalog[Central capability manifest: purpose, schema, constraints, handler] --> View[Capability view visible this round]
|
|
33
|
+
Identity[Server-side identity and resource permissions] --> View
|
|
34
|
+
View --> Compose
|
|
35
|
+
Compose --> Workflow[Optional AgentWorkflow: declares execution nodes and routing]
|
|
36
|
+
Workflow --> Node[Node: requires, run, provides, routes, onErrorNodeId]
|
|
37
|
+
Node --> Handler[App handler]
|
|
38
|
+
Handler --> Model[ModelRunner: obtains model proposals or answers]
|
|
39
|
+
Handler --> Tool[ToolRegistry: executes registered tools]
|
|
40
|
+
Handler --> Tasks[Optional Answering: domain answering tasks]
|
|
41
|
+
Tasks --> Definition[Task declaration: id, inputSchema, readerId, outputId, checkIds, intentIds, scopeId]
|
|
42
|
+
Definition --> Evidence[App reader: authorization, actual reading and evidence]
|
|
43
|
+
Evidence --> Items[AnswerItem: source status and owning input ID]
|
|
44
|
+
Items --> Answer[Generation, checks, local repair and delivery status]
|
|
45
|
+
Model --> Update[Handler returns results or local state updates]
|
|
46
|
+
Tool --> Update
|
|
47
|
+
Answer --> Update
|
|
48
|
+
Update --> Route[Core commits compliant updates, then selects a route per declarations]
|
|
49
|
+
Route -->|continue| Node
|
|
50
|
+
Route -->|complete| Result[Return to App for delivery]
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The three concepts here are different: the **user question** is input, a **workflow node** is an execution stage, and an **answering task/item** is a domain object of the Answering Kit. One node can process multiple answer items; model proposals do not automatically create workflow nodes or install new handlers. A basic `ModelRunner.invoke` call needs neither a workflow nor answering tasks.
|
|
54
|
+
|
|
55
|
+
## 3. How a Core workflow advances
|
|
56
|
+
|
|
57
|
+
Corresponds to the actual rules of `AgentWorkflow` and a bound `AgentCoreEngine.run`.
|
|
58
|
+
|
|
59
|
+
```mermaid
|
|
60
|
+
flowchart TD
|
|
61
|
+
Definition[App declares workflow manifest] --> Validate[Validate on construction: nodes, route references, reachability, bounded cycles]
|
|
62
|
+
Validate --> Entry[entryNodeId corresponds to a startsRound node]
|
|
63
|
+
Entry --> Abort[Check cancellation, obtain target node]
|
|
64
|
+
Abort --> Round{Node marked startsRound?}
|
|
65
|
+
Round -->|yes| Budget{Enough round budget?}
|
|
66
|
+
Budget -->|no| Exhaust[Throw budget exhausted error]
|
|
67
|
+
Budget -->|yes| Count[Consume one round]
|
|
68
|
+
Round -->|no| Enter[Emit enter event]
|
|
69
|
+
Count --> Enter
|
|
70
|
+
Enter --> Requires[Check requires fields]
|
|
71
|
+
Requires --> Run[Call node run, obtain local updates]
|
|
72
|
+
Run --> Commit[Check cancellation, update shape and provides, then commit updates]
|
|
73
|
+
Commit --> Select[Select the first match in routes order]
|
|
74
|
+
Select --> Route{Match result}
|
|
75
|
+
Route -->|target node| Transition[Emit transition, clear previous node error]
|
|
76
|
+
Transition --> Abort
|
|
77
|
+
Route -->|complete| Complete[Compute result, isResult, check cancellation]
|
|
78
|
+
Complete --> End[Emit complete and return]
|
|
79
|
+
Route -->|no match| Contract[Workflow contract error]
|
|
80
|
+
Requires -.->|exception| Error[Error handling within the node try scope]
|
|
81
|
+
Run -.->|exception| Error
|
|
82
|
+
Commit -.->|exception| Error
|
|
83
|
+
Complete -.->|exception| Error
|
|
84
|
+
Contract --> Error
|
|
85
|
+
Error --> Recover{Not cancelled, not a contract error, and onErrorNodeId present?}
|
|
86
|
+
Recover -->|yes| ErrorNode[Move to the error node with context.error]
|
|
87
|
+
ErrorNode --> Abort
|
|
88
|
+
Recover -->|no| Throw[Throw to the caller]
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Only entering a node with `startsRound: true` consumes a round; other stages in the same round do not count separately. Every possible cycle (including error routing) must pass through a round boundary. When the entry node omits the field, it starts a round by default. The budget entry check is outside the node's try scope, so exhaustion is not routed to that node's onErrorNodeId. `run(step)` uses an explicit StepOutcome: `{ type: 'continue' }` to continue, `{ type: 'complete', value }` to complete; value may legitimately be undefined.
|
|
92
|
+
|
|
93
|
+
The commit guard covers only local state updates managed by Core; it does not roll back external writes that the handler has already performed. A failed diagnostic observation does not change business execution.
|
|
94
|
+
|
|
95
|
+
## 4. Timing from model proposal to actual tool execution
|
|
96
|
+
|
|
97
|
+
**App composition example**: uses the Support tool catalog, ModelRunner, and the Core tool executor.
|
|
98
|
+
|
|
99
|
+
```mermaid
|
|
100
|
+
sequenceDiagram
|
|
101
|
+
actor U as User
|
|
102
|
+
participant A as App orchestration
|
|
103
|
+
participant S as Support tool catalog
|
|
104
|
+
participant M as ModelRunner
|
|
105
|
+
participant P as ChatProvider / model
|
|
106
|
+
participant T as Core ToolRegistry
|
|
107
|
+
participant H as App tool handler
|
|
108
|
+
U->>A: asks a question
|
|
109
|
+
A->>S: Obtains capability view and in-request runtime from the same manifest
|
|
110
|
+
S-->>A: Model declarations, parsers, real execution registration
|
|
111
|
+
A->>M: invoke (input and registered transport)
|
|
112
|
+
M->>M: Check cancellation, call quota, input and schema budget
|
|
113
|
+
M->>P: stream (input and visible capabilities)
|
|
114
|
+
P-->>M: Model chunks
|
|
115
|
+
M->>M: Full collection, protocol parsing
|
|
116
|
+
M-->>A: ToolProposal (tool name and raw parameters)
|
|
117
|
+
A->>T: runtime.invoke (tool name, parameters)
|
|
118
|
+
T->>T: Look up registered tool, parseInput
|
|
119
|
+
T->>H: authorize (parameters, server-side context, signal)
|
|
120
|
+
alt Authorization passes
|
|
121
|
+
H-->>T: Allowed
|
|
122
|
+
T->>H: execute, and wait for actual I/O
|
|
123
|
+
H-->>T: Actual result
|
|
124
|
+
T->>T: parseOutput, record success event
|
|
125
|
+
T-->>A: Validated result
|
|
126
|
+
opt App needs to continue generation based on the result
|
|
127
|
+
A->>M: invoke (tool result and follow-up input)
|
|
128
|
+
M->>P: Generate within the remaining quota
|
|
129
|
+
P-->>M: Complete response
|
|
130
|
+
M-->>A: Parsed result
|
|
131
|
+
end
|
|
132
|
+
A->>A: Business checks, bind facts and deliver
|
|
133
|
+
A-->>U: Final reply
|
|
134
|
+
else Authorization denied or execution/output check fails
|
|
135
|
+
H-->>T: Denied or exception
|
|
136
|
+
T-->>A: Error and failure event
|
|
137
|
+
A-->>U: App handles the failure according to the actual cause
|
|
138
|
+
end
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The error branch in the diagram also covers input/output check failures in the Registry itself, where a handler call may not occur. A model proposal is not a success receipt, and Core does not automatically execute a tool just because the model proposed its name; whether to call it subsequently, generate again, or end is decided by the App handler/workflow. A failed tool output check also does not mean side effects that already occurred are rolled back.
|
|
142
|
+
|
|
143
|
+
## 5. Internal flow of one model call
|
|
144
|
+
|
|
145
|
+
```mermaid
|
|
146
|
+
flowchart TD
|
|
147
|
+
Invoke[invoke: normalize input, select registered transport] --> Initial[Check cancellation and remaining call quota]
|
|
148
|
+
Initial --> Prepare[Prepare or reuse this transport snapshot]
|
|
149
|
+
Prepare --> Assemble[Core assembles text, messages, BuiltContext or ContextPlan]
|
|
150
|
+
Assemble --> Check[Actual message, transport instruction, Schema and optional token budget checks]
|
|
151
|
+
Check --> Consume[Obtain model call quota, set call deadline]
|
|
152
|
+
Consume --> Stream[Provider stream: collect chunks and check output budget]
|
|
153
|
+
Stream --> Finish[Complete response: finish, parse, resolve]
|
|
154
|
+
Finish --> Deliver[Await content delivery in order, check cancellation]
|
|
155
|
+
Deliver --> Journal[Commit Journal and completion information]
|
|
156
|
+
Journal --> Result[Return value and invocation]
|
|
157
|
+
Stream -.->|cancellation, timeout, upstream or output error| Error[Mark stage and error code and throw]
|
|
158
|
+
Finish -.->|protocol parsing failure| Error
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Core is responsible for generic input assembly and final budget checks and does not implicitly select or compress. When processing is needed, the App registers Support or custom processing nodes into the same Workflow and uses ordinary routes to decide when to execute them. Model calls inside processing nodes share the request quota, cancellation, and deadlines; see [Context nodes](api/context-processing.md) for details.
|
|
162
|
+
|
|
163
|
+
An ordinary invoke does not require prepare in advance. When early measurement is needed, use `model.prepare(...)` to obtain a single snapshot, call `prepared.measure(input)` repeatedly, then still consume the same handle through `model.invoke({ input, prepared })`. Measurement covers the actual transport instructions and Schema; the final check remains in effect, and the handle is not a quota reservation.
|
|
164
|
+
|
|
165
|
+
`ModelRunner.sink.output` waits in order for consumers of generated chunks, and the fully parsed value is still returned through invoke; `execution.observe.event` is side-channel observation with isolated failures. Chunk preview and final business delivery are different boundaries.
|
|
166
|
+
|
|
167
|
+
## 6. Task checks and local repair in the Answering Kit
|
|
168
|
+
|
|
169
|
+
Corresponds to the seven nodes currently registered by `defineAnswerFlow`; this flow exists only when the Kit is adopted.
|
|
170
|
+
|
|
171
|
+
```mermaid
|
|
172
|
+
flowchart TD
|
|
173
|
+
Input[Validate input IDs, item ownership and count] --> Generate[generate: generate only source=ready items]
|
|
174
|
+
Generate --> Validate[validate: local checks and keep normalized values]
|
|
175
|
+
Validate --> Review[review: review per off / optional / required policy]
|
|
176
|
+
Review --> Select[select-repair: select items that are ready and still have issues]
|
|
177
|
+
Select --> Can{Failed items, repair count and call quota available?}
|
|
178
|
+
Can -->|yes| Repair[repair: consume one repair chance, submit only failed items and issues]
|
|
179
|
+
Repair --> Recheck[recheck: re-check only items generated this time]
|
|
180
|
+
Recheck --> Select
|
|
181
|
+
Can -->|no| Deliver[deliver: judge item by item]
|
|
182
|
+
Deliver --> Accepted[accepted: source ready, value present and checks satisfied]
|
|
183
|
+
Deliver --> Fallback[fallback: App fallback provided a value]
|
|
184
|
+
Deliver --> Blocked[blocked: no deliverable value]
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Initial generation and each repair consume one workflow round; `maxRepairs` additionally limits the number of repairs. `canInvoke` reads the real quota provided by the App, and the Kit does not create an extra model budget. Non-ready sources do not enter generation or repair; items whose review has explicitly failed cannot become passing because review later becomes unavailable. Cancellation, invalid item ownership, and program contract errors throw, and are not automatically disguised as fallback.
|
|
188
|
+
|
|
189
|
+
## 7. Composition timing of App knowledge answering
|
|
190
|
+
|
|
191
|
+
The diagram below illustrates an App composition organized by the [Knowledge, Answering, and Presentation contracts](api/knowledge-answering.md); the concrete orchestration and ports are provided by the App. For complete code that can be copied and run directly see [Offline service answering](examples/offline-agent.md); that code does not enable Knowledge/Answering.
|
|
192
|
+
|
|
193
|
+
```mermaid
|
|
194
|
+
sequenceDiagram
|
|
195
|
+
actor U as User
|
|
196
|
+
participant A as App answer
|
|
197
|
+
participant T as Answering task catalog
|
|
198
|
+
participant K as Knowledge / App reader
|
|
199
|
+
participant F as Answering Flow
|
|
200
|
+
participant M as Same ModelRunner
|
|
201
|
+
participant C as App checks and review
|
|
202
|
+
participant O as Presentation
|
|
203
|
+
U->>A: question, signal
|
|
204
|
+
A->>T: Parse task parameters and read
|
|
205
|
+
T->>K: Call the registered reader
|
|
206
|
+
K->>K: App authorize, read the fixed revision snapshot
|
|
207
|
+
K-->>A: Question and source evidence
|
|
208
|
+
A->>F: Run declared answer items
|
|
209
|
+
F->>M: generate: call with evidence
|
|
210
|
+
M-->>F: Draft
|
|
211
|
+
F->>C: Local checks and policy review
|
|
212
|
+
C-->>F: Check results and issues
|
|
213
|
+
loop issues remain and repair count, real quota allow
|
|
214
|
+
F->>M: Repair only failed items
|
|
215
|
+
M-->>F: Repaired draft
|
|
216
|
+
F->>C: Re-check and review
|
|
217
|
+
C-->>F: Latest check results
|
|
218
|
+
end
|
|
219
|
+
F-->>A: accepted / fallback / blocked
|
|
220
|
+
opt A deliverable value exists
|
|
221
|
+
A->>O: Bind program source fields and render the template
|
|
222
|
+
O-->>A: Body text and sources
|
|
223
|
+
end
|
|
224
|
+
A-->>U: status, text (if any), issues
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
If review uses a model, it should consume quota through the same ModelRunner passed in. Fallback evidence and allowed wording are provided by the App; when no deliverable value is provided, blocked is returned. Authorization, reading, cancellation, or contract errors may be thrown directly, with no guarantee of reaching final delivery.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Memory and continuous accumulation
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [Shared flow](flows/knowledge-maintenance.md) · [Record templates](records.md)
|
|
4
|
+
|
|
5
|
+
The library has no out-of-the-box long-term memory database, user profile merging service, or automatic learner of business experience. Core provides execution contracts, Support helps assemble context and calls, and Kits such as Knowledge/Answering provide local processing once adopted. Whether to record, how to assign ownership, and when to update and delete are all explicitly implemented by the App; not recording is also a valid choice.
|
|
6
|
+
|
|
7
|
+
## Different data needs different rules
|
|
8
|
+
|
|
9
|
+
| Data | Recommended use | Should not be equated with |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| Recent Q&A | Session continuity, disambiguation | Tool execution logs, permanent knowledge |
|
|
12
|
+
| Accumulated user preferences | Addressing, expression preferences, ongoing topics | Identity, permissions, public facts |
|
|
13
|
+
| Business experience candidates | Inducing reusable suggestions and failure patterns from results | Proven rules, automatic authorization |
|
|
14
|
+
| Published knowledge | Business facts with explicit sources, scope, and versions | Unverified user self-descriptions |
|
|
15
|
+
| Original materials and extraction results | Current task evidence or authorized archives | Automatically shared knowledge |
|
|
16
|
+
|
|
17
|
+
Do not use one source-less large summary to hold all categories. Each record category should at least have stable identity, ownership, source, version, status, and retention policy. Template fields are only a starting point; the App defines and validates them, and they are not a new Core protocol that all consumers must follow.
|
|
18
|
+
|
|
19
|
+
## Application flow for updating user preferences
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
Select final Q&A allowed to be recorded, and the watermark
|
|
23
|
+
→ Old summary + new Q&A + explicit merge rules
|
|
24
|
+
→ Model extraction of candidates under budget constraints
|
|
25
|
+
→ Parsing and length/source/sensitive-scope checks
|
|
26
|
+
→ Commit summary and new watermark on the premise of the old version
|
|
27
|
+
→ Subsequent requests read by identity and mark it as low-trust memory
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Do not mix the model's internal reasoning, corrections, or unexecuted actions into user profiles. When new expressions conflict with old preferences, apply the App's explicit rules; authoritative human facts are still provided by the corresponding data source. On model failure or version conflict, keep the old summary and the unconsumed watermark and retry with bounds, avoiding lost messages or duplicate merges. Scheduled tasks, storage transactions/CAS, leases, and retries are implemented by the App; the Core per-request budget cannot be assumed to cover background jobs.
|
|
31
|
+
|
|
32
|
+
## Application flow for experience growth
|
|
33
|
+
|
|
34
|
+
Register extraction, validation, query, and publication implementations with a fixed task type; adding an experience record is only a data change and does not automatically add a handler. Candidates should be associated with actual sources and results, retain applicability scope, counterexamples, and conflicts, and not treat one success as a universal rule.
|
|
35
|
+
|
|
36
|
+
Candidate formation → deduplication/conflict checks → business validation or human confirmation → versioned publication → controlled reading, consistent with the [shared flow](flows/knowledge-maintenance.md). To integrate with Knowledge, the App converts permitted records into `KnowledgeDocument`, compiles a new catalog, and switches the request reference; active requests keep using the old snapshot.
|
|
37
|
+
|
|
38
|
+
`prepare-source.mjs` is used to organize text candidates during development. Runtime persistent learning can reuse its compilation logic and source constraints, while storage, concurrency, and publication policies are provided by the App.
|
|
39
|
+
|
|
40
|
+
## Decisions required before runtime integration
|
|
41
|
+
|
|
42
|
+
Record scope and user choices, tenant isolation, visibility scope, retention and deletion, source priority, update conflicts, idempotency keys/consumption watermarks, failure recovery, and which content is forever candidate-only. Without these implementations, documentation and interfaces should state clearly "used for this round/session" or "manually maintained", and must not claim automatic learning.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Result delivery, diagnostics, and operations
|
|
2
|
+
|
|
3
|
+
[Back to development handbook](README.md) · [Core API](api/core.md) · [Support API](api/support.md)
|
|
4
|
+
|
|
5
|
+
## Boundary of each run
|
|
6
|
+
|
|
7
|
+
Keep startup manifests separate from per-request state. For each request, establish identity, the allowed knowledge view, an `AbortSignal`, model/tool budget, and source and output state. Credentials, endpoints, model characteristics, and error mapping for connecting to the Provider are managed by the App server, and user materials or model parameters are not allowed to override these configurations.
|
|
8
|
+
|
|
9
|
+
Consider rounds, model call counts, timeouts, message and output characters, schema size, and business tool quotas separately. Repair, review, and fallback also consume budget; a step called "recovery" cannot mean unlimited retries. Core's model call budget covers only calls that actually pass through that runner; external HTTP, background jobs, and model calls made by the App itself must be limited by the App.
|
|
10
|
+
|
|
11
|
+
Cancellation must reach the actual model and business I/O; for writes already started, cancellation does not mean rollback. The App should be able to judge whether an operation has executed by idempotency key/real receipt, and query state before retrying. Synchronous ToolRegistry does not wait for arbitrary Promises; asynchronous business logic should be placed in suitable asynchronous handlers/nodes and must not fake synchronous success.
|
|
12
|
+
|
|
13
|
+
## Verify facts first, then form presentable output
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
Parsed model proposal
|
|
17
|
+
→ authorization and real execution
|
|
18
|
+
→ input/output contracts and source checks
|
|
19
|
+
→ generate candidate reply
|
|
20
|
+
→ completeness/business fact checks
|
|
21
|
+
→ program binds sources, action states, and links
|
|
22
|
+
→ deliver in the form chosen by the App
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
A Knowledge Snapshot is a source reference, a tool event is an execution record, and model text is a candidate explanation; the three do not substitute for each other. Answering's tasks, checks, and bounded repair help organize this chain; the concrete fact checks are provided by the App. See the [knowledge answering API](api/knowledge-answering.md) for the relevant local contracts.
|
|
26
|
+
|
|
27
|
+
Presentation/Interaction is an optional Kit. InteractionProtocol/CommandCatalog does not determine how the App exchanges data between front end and back end; when used, the App registers commands, parsing, and presentation implementations, and still needs actual receipts from the peer. The App may also directly adopt its own HTTP/SSE/event protocol.
|
|
28
|
+
|
|
29
|
+
## Error exits
|
|
30
|
+
|
|
31
|
+
| Actual cause | Program handling | Direction of user-facing wording |
|
|
32
|
+
| --- | --- | --- |
|
|
33
|
+
| Source not provided or not allowed to read | Do not widen permissions, do not generate fake facts | State which kind of available knowledge is missing |
|
|
34
|
+
| Parameters or output violate the contract | Record the specific stage and code; repair or end within budget | State the actual action not completed this time |
|
|
35
|
+
| Provider stream break/timeout | Save known execution state, retry with bounds | Reply incomplete, can retry |
|
|
36
|
+
| Insufficient budget/read limit exceeded | Narrow the legal scope or split the task | State the scope limit; no silent truncation |
|
|
37
|
+
| User cancellation | Stop cancellable work, verify executed operations | State clearly that it stopped and what is confirmed |
|
|
38
|
+
|
|
39
|
+
Error messages should not show internal schemas, tokens, call protocols, or stack traces verbatim. Logs keep machine-locatable fields, and user copy keeps the accurate cause; not every failure should be described as a connectivity problem.
|
|
40
|
+
|
|
41
|
+
## What observation and persistence each own
|
|
42
|
+
|
|
43
|
+
Core's run records/diagnostics and Support's Provider observer provide observation boundaries; they do not automatically create a log database. The App decides whether to output to the console, files, telemetry systems, or a persistent repository, and how to authorize queries, redaction, and retention. `breakWhile` tags are classification hints for interruption, not permission or rule filtering switches; follow the [Support reference](api/support.md).
|
|
44
|
+
|
|
45
|
+
It is recommended to correlate request/run, stage, model or tool call ID, business error code, knowledge revision/snapshot id, and actual duration. By default do not collect credentials, full prompts, user materials, or model body text; when body-text diagnostics are needed, the product must explicitly enable and limit the scope. Observation callbacks should not change business returns or escalate a record failure into duplicate execution.
|
|
46
|
+
|
|
47
|
+
## Publication and recovery
|
|
48
|
+
|
|
49
|
+
Deliver code manifests, knowledge, task references, and configuration as one verifiable version. Validate references before publication and prepare a rollback version; new requests switch to the new catalog while existing requests hold old snapshots. Whether multi-file or database publication is atomic is implemented by the App; the Knowledge in-memory catalog itself provides no storage transactions.
|
|
50
|
+
|
|
51
|
+
When the App publishes, also state the enabled capabilities, knowledge version, configuration, and changes in externally visible behavior; the new version must still preserve the original permissions, budget, cancellation, and delivery guarantees.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# App data format examples
|
|
2
|
+
|
|
3
|
+
The JSON below only explains field design for App-owned records; it does not participate in runtime loading, register capabilities, or create data tables. Core does not require this storage format.
|
|
4
|
+
|
|
5
|
+
Use null/empty arrays to indicate not yet provided, and do not fabricate facts from example default values. Field names, states, and versions are defined and validated by the App itself.
|
|
6
|
+
|
|
7
|
+
## Material record
|
|
8
|
+
|
|
9
|
+
Original, extraction status, ownership, lifecycle, and publication status.
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"schemaVersion": 1,
|
|
14
|
+
"id": null,
|
|
15
|
+
"ownerId": null,
|
|
16
|
+
"scope": "private",
|
|
17
|
+
"original": { "reference": null, "mediaType": null, "contentSha256": null, "receivedAt": null },
|
|
18
|
+
"extraction": { "status": "pending", "revision": null, "text": null, "caveats": [] },
|
|
19
|
+
"lifetime": "turn",
|
|
20
|
+
"expiresAt": null,
|
|
21
|
+
"publication": { "status": "unpublished", "documentId": null }
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## User preferences
|
|
26
|
+
|
|
27
|
+
Accumulated interaction preferences, source watermark, and version.
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"schemaVersion": 1,
|
|
32
|
+
"ownerId": null,
|
|
33
|
+
"revision": null,
|
|
34
|
+
"summary": null,
|
|
35
|
+
"sourceWindow": { "after": null, "through": null, "references": [] },
|
|
36
|
+
"updatedAt": null,
|
|
37
|
+
"expiresAt": null,
|
|
38
|
+
"status": "uninitialized"
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Experience candidate
|
|
43
|
+
|
|
44
|
+
Experience source, applicability, validation, and publication status.
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"schemaVersion": 1,
|
|
49
|
+
"id": null,
|
|
50
|
+
"ownerId": null,
|
|
51
|
+
"revision": null,
|
|
52
|
+
"status": "candidate",
|
|
53
|
+
"claim": null,
|
|
54
|
+
"applicability": [],
|
|
55
|
+
"sources": [],
|
|
56
|
+
"counterexamples": [],
|
|
57
|
+
"conflicts": [],
|
|
58
|
+
"validation": { "status": "pending", "references": [] },
|
|
59
|
+
"publication": { "approvedBy": null, "approvedAt": null, "documentId": null }
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
User preferences cannot carry identity and permissions; experience candidates are not published automatically; raw materials do not automatically enter shared knowledge. See [Knowledge maintenance](maintenance.md), [Materials](materials.md), and [Continuous accumulation](memory-and-learning.md).
|