跳到正文

Knowledge Fact 模型

Patchouli Fact IR v1 包含三种公开记录值:

  • artifact,由 urn:patchouli:schema:artifact:1 验证;
  • knowledge,由 urn:patchouli:schema:knowledge:1 验证;
  • knowledge_relation,由 urn:patchouli:schema:knowledge-relation:1 验证。

三者复用通用实体 CRUD,不增加 Knowledge 专用 JSON-RPC。规范 Schema 与示例位于 产品分支的 packages/protocol/schemas

身份

实体身份与 Fact 值有意分离:

通用实体 Envelope 是实体 ID 与存储版本的唯一权威,因此 Fact 值不会在 metadata 中重复 idrevision。请求 meta 经过配置生成 scope_json, 它属于每个数据库键,也是授权和存储边界。metadata.core.scope 只描述语义上的 租户、工作区、用户和 Session;它是不可信输入,不能扩大配置规定的存储 Scope。

Artifact

文件、向量和其他非 JSON 资源是一等 artifact 实体。Knowledge 不嵌入字节, 也不复制存储细节。每个 Artifact 包含媒体类型、可选名称、可选长度和摘要、语义 元数据,以及唯一一种 Placement:

text
managed  Patchouli 在 provider + key 处拥有字节
indexed  外部 Provider 在 provider + locator + revision 处拥有字节

本地路径和远程对象 ID 使用相同的 indexed 结构。Provider 解释不透明 Locator, 通用 CRUD 与 Knowledge Consumer 不区分本地或远程。Locator 和 Key 不得包含凭据。

managed Artifact 必须同时具有 byte_lengthdigestindexed Artifact 在外部 Provider 只暴露 Revision 时可以缺少两者。修改外部 Revision 或将其提升为 托管存储都会创建正常的新实体版本。

托管字节通过 Artifact Upload RPC 进入后端。Commit 会验证长度和 SHA-256、对相同 内容去重,并通过正常的 Scope、事务、一致性、冲突和变更发布链路创建实体。下载 先解析有 Scope 的实体,客户端永远不会获得后端文件路径。Placement Provider 是 拥有字节的 Daemon Node ID,其他节点可以拒绝误发的请求。

indexed Artifact 使用通用 CRUD,由 Placement 指定的 Provider 解释 Locator。 删除或替换实体不会立刻删除托管字节,因为内容寻址对象可能被共享。未完成上传在 重启时丢弃;v1 尚未实现孤儿回收和跨节点字节复制。

Knowledge 通过 { type: "artifact", id, role } 引用 Artifact。role 可为 sourceattachmentembedding;媒体类型、摘要、Placement 与 Provenance 只在 Artifact 实体中维护一份权威数据。

Knowledge

每个 KnowledgeValue 有四个必填字段:

text
content   文本或结构化 JSON
metadata  固定 Core 与带命名空间的扩展
artifact  零个或多个带类型的 Artifact 引用
profile   七个行为维度

content{ kind: "text", text }{ kind: "structured", value }。 二进制和向量不会嵌入 Content。

metadata.core 固定 Schema 身份、语义 Scope、来源、时间戳、生命周期与 Provenance。 所有可空 Core 字段都显式保留为 null,避免将省略误解为未知。扩展键至少包含一个 命名空间分隔符,例如 local.session。Embedding 模型和维度等表示层信息属于 Artifact Metadata 扩展,不复制到每个引用。

Profile 维度如下:

维度取值
epistemicunknownobservationhypothesisbeliefknowledgederived
temporalunknowntimelessinstantintervalsequence
ownershipunknownworldagentusershared
abstractionunknowninstancepatternconceptrule
persistenceunknownworkingshort_termlong_termpermanent
retrieval一个或多个 unknownexactassociativecontextualcausalprocedural
actionabilityunknowninformationaldirectiveconstraint

Retrieval 描述认知行为,而不是全文、向量或 Trigram 等查询实现。Actionability 也只是描述;存储为 directiveconstraint 不会授予执行权限。

KnowledgeRelation

Relation 值包含固定 Relation Type、非空 from 集合、非空 to 集合和具有独立 Schema 身份的同构 Metadata。每个集合内的引用必须唯一。v1 类型如下:

类型方向
supports支持知识集合 → 被支持知识集合
contradicts冲突知识集合 → 被反驳知识集合
derived_from派生知识集合 → 来源知识集合
generalized_from泛化知识集合 → 来源实例集合
causes原因知识集合 → 结果知识集合
supersedes替代知识集合 → 旧知识集合

所有端点都在 Relation 实体的配置存储 Scope 中解析;v1 不支持跨 Scope Relation。 更新可以同时替换 typefromtometadata,并创建新的不透明版本。 两个集合可以重叠,因此自关系和环都是合法记录;后端不施加图拓扑约束。

JSON Schema 验证本地结构。Controller 还会检查端点存在性、共同 Scope、Tombstone 和通用版本/冲突策略,但不会检查环,也不会强制保留旧 Relation 的类型或端点。

SQLite 条目

SQLite Schema v11 定义两个权威表:

  • patchouli_entity_version:按规范化 scope_json + entity_type + entity_id + version 保存不可变活动值与 Tombstone;
  • patchouli_entity_head:保存当前发布的 Head 集合,通常一个,mvcc 下可有多个。

patchouli_crdt_changepatchouli_crdt_change_parentpatchouli_entity_crdt_head 保存 Automerge Change、依赖图和字段 Frontier; patchouli_change 在同一事务中记录每次已提交 Head 转换,用于响应式投递。

每个已发布版本记录可见时的 Change Cursor。patchouli_work_unit* 通过该 Cursor 跨 RPC 重建固定数据库基线,同时在 Marker Close 前阻止 Staged Version 进入已发布 Head 和类型化 View。

活动行必须包含有效 JSON,Tombstone 的值必须为 null。值只存储一次; patchouli_artifactpatchouli_knowledgepatchouli_knowledge_relation 是活动 Head 上的只读 View,不会成为第二语义权威。旧存储 Schema 会被明确拒绝, 当前阶段不提供迁移或兼容路径。

基于 MIT License 发布。源自 Minecraft 的图标素材另有声明。