@agentunion/fastaun 0.5.21 → 0.5.23
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 +58 -1
- package/_packed_docs/CHANGELOG.md +58 -1
- package/_packed_docs/INDEX.md +469 -453
- package/_packed_docs/KITE_DOCS_GUIDE.md +169 -164
- package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +307 -67
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +41 -15
- package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +5 -5
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +30 -8
- package/_packed_docs/protocol/Ownership/345/215/217/350/256/256/345/256/232/344/271/2112.1.md +669 -666
- package/_packed_docs/sdk/0.5.22-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +212 -0
- package/_packed_docs/sdk/0.5.22-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +199 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +16 -0
- package/_packed_docs/sdk/09-group-rpc-manual.md +10 -0
- package/_packed_docs/sdk/09-storage-rpc-manual.md +64 -7
- package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +3 -1
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +2 -0
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +138 -134
- package/_packed_docs/sdk/INDEX.md +255 -239
- package/_packed_docs/sdk/Ownership-SDK/347/274/226/346/216/222/346/214/207/345/215/2272.1.md +939 -930
- package/_packed_docs/sdk/Ownership2.1-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +312 -363
- package/_packed_docs/sdk/Ownership2.1-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +322 -553
- package/_packed_docs/sdk/Ownership2.1-TDD/345/210/206/351/230/266/346/256/265/345/256/236/346/226/275/350/256/241/345/210/222.md +4 -4
- package/_packed_docs/sdk/Ownership2.1/350/257/246/347/273/206/350/256/276/350/256/241.md +484 -480
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +190 -97
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +158 -127
- package/dist/agent-md.d.ts +16 -2
- package/dist/agent-md.js +59 -23
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +1 -0
- package/dist/aid-store.js +43 -8
- package/dist/aid-store.js.map +1 -1
- package/dist/auth.d.ts +7 -0
- package/dist/auth.js +222 -70
- package/dist/auth.js.map +1 -1
- package/dist/client/delivery.d.ts +28 -0
- package/dist/client/delivery.js +399 -44
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/group-state.js +3 -0
- package/dist/client/group-state.js.map +1 -1
- package/dist/client/rpc-pipeline.js +28 -2
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.js +109 -39
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.js +114 -26
- package/dist/client.js.map +1 -1
- package/dist/group-fs.d.ts +1 -0
- package/dist/group-fs.js +37 -19
- package/dist/group-fs.js.map +1 -1
- package/dist/org-protocol.d.ts +11 -0
- package/dist/org-protocol.js +154 -19
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.d.ts +21 -3
- package/dist/ownership-v21.js +135 -37
- package/dist/ownership-v21.js.map +1 -1
- package/dist/ownership-workflow.d.ts +7 -2
- package/dist/ownership-workflow.js +173 -17
- package/dist/ownership-workflow.js.map +1 -1
- package/dist/storage/lowlevel.d.ts +6 -0
- package/dist/storage/lowlevel.js +24 -7
- package/dist/storage/lowlevel.js.map +1 -1
- package/dist/storage/read-cache.d.ts +70 -0
- package/dist/storage/read-cache.js +625 -0
- package/dist/storage/read-cache.js.map +1 -0
- package/dist/storage/vfs.d.ts +2 -0
- package/dist/storage/vfs.js +50 -15
- package/dist/storage/vfs.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +21 -1
- package/dist/tools/cross-sdk-agent.js +301 -19
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.js +6 -2
- package/dist/transport.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1,553 +1,322 @@
|
|
|
1
|
-
# Ownership 2.1 SDK 开发与移植指南
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
##
|
|
14
|
-
|
|
15
|
-
|
|
|
16
|
-
| --- | --- |
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
|
39
|
-
| --- | --- |
|
|
40
|
-
|
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
|
56
|
-
|
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
|
73
|
-
|
|
|
74
|
-
|
|
|
75
|
-
|
|
|
76
|
-
| NS
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
|
177
|
-
|
|
|
178
|
-
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
|
216
|
-
|
|
|
217
|
-
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
|
266
|
-
|
|
|
267
|
-
|
|
|
268
|
-
|
|
|
269
|
-
|
|
|
270
|
-
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
| 记录分组 | 必须持久保存的内容 |
|
|
325
|
-
| --- | --- |
|
|
326
|
-
| 固定上下文 | operation_id、operation、参与 AID、起始/目标版本、发起方、本端角色。 |
|
|
327
|
-
| 审批 | local_decision 的 pending/accept/reject、按 AID 保存的 approvals;发起意愿与接收方决定分开。 |
|
|
328
|
-
| 文件 | 本人完整已签 raw、全文 hash、原 NS ETag 与起始双文件证据;接收方首次验证转移授权的全文摘要 authorization_sha256 和实际 expires_at,恢复不允许换字节或延期。 |
|
|
329
|
-
| 收件 | inbox 与 received 幂等键,不能因远端失败丢掉原收件。 |
|
|
330
|
-
| 发件 | outbox 的接收 AID 与原载荷、已安排通知标记。 |
|
|
331
|
-
| 结果及清理 | status、step、verified_relation_version、清理授权引用、旧对象条件、最近错误。 |
|
|
332
|
-
|
|
333
|
-
审批决定与待发送回复在同一次 CAS 中保存,然后发送;本方文件 raw/hash/condition 也先保存再写远端。发送成功后再 CAS 清除 outbox,若发送后保存失败则可能重发,接收方必须幂等。当前 TypeScript outbox 保存 to/payload,不应宣称已经持久保存传输 message_id。
|
|
334
|
-
|
|
335
|
-
`decide` 只批准已核验、本端未决定的 bind/transfer 请求;不能批准自己发起的任务,也不能将 accept 改成 reject。原 owner 按审批 AID 收齐转移同意,角色重合以唯一 AID 计决定;尚未决定的另一方拒绝仍结束任务,迟到回复不覆盖已持久决定。
|
|
336
|
-
|
|
337
|
-
`decode` 校验任务身份、固定参与方、版本、角色、审批及集合;completed 还要求持久验收证据包含验收时的 NS ETag、agent.md 全文 SHA256、实际 lock/owner/relation_version,并按本端角色保存本人已签原始完整字节、摘要和原提交条件。bind/transfer 的核验版本等于目标,另须有 owner.md 全文 SHA256及本端同意;release 的任务起始、目标及历史 verified 版本仍为 `v`,真实完成证据保存 `released/v` 或严格关联本任务的 `unbound/0`,不得伪造 released。sub 的 unbound 证据须对应本任务清理原件、摘要、原 CAS,或本人明确 accept 的原 bind/transfer 的匹配 `release_cleanup`,并核对当前 NS 原文、摘要、ETag及已知提交 ETag;owner 须以本任务 release 完整原件、摘要与当前 owner.md 全文、hash 一致且当前证书验证有效确认,不得补造旧条件。权威不存在的 released 证据中 owner 文件摘要可为空。该记录只证明任务当时完成,当前关系仍须重新读取两份权威材料;清理后的 `unbound/0` 不保留历史版本上界。本人原件还须按文件角色、签名者、owner/sub、base/target、action、转移目标/期限及原条件匹配任务固定上下文;历史复验不要求现在仍可签或授权未过期。缺失、损坏证据的旧 completed 返回 persistence_unavailable,不能只看 step 或 completed 字符串跳过,也不能读取当前网络补造历史证据。合法历史完成记录可保留,当前 NS 已进入后续版本不使它变成新的待写任务。
|
|
338
|
-
|
|
339
|
-
### 10.2 恢复顺序与失败重试
|
|
340
|
-
|
|
341
|
-
0.5.20、0.5.19 及更早任务按原格式及原有协议边界兼容;保留原 operation、有效审批、原签名字节和原提交条件,不能因缺少后增本地字段而一律停止或新建任务。历史适配、绑定容错和无参数 reset 的完整范围见 [编排指南第 8 节](Ownership-SDK编排指南2.1.md#8-崩溃与响应丢失后的恢复)。reset 只归档当前身份发起的未完成任务,保留原记录和远端文件,迟到消息不能复活。 旧 Owner 候选尚未发布时,原 `expected_revision` 必须有权威证据精确匹配,不能用当前 version 替代;服务未提供旧 revision 证据时保留原件及任务并返回 unavailable。目标已提交但任务仍待恢复时,只有本地原始签名候选与当前双方共识精确匹配才确认完成;缺少这些证据不能从当前网络补造历史原件或提交条件。
|
|
342
|
-
|
|
343
|
-
TypeScript `resume` 读取原任务,按 sub 串行 `drive`,实际顺序为 `processInbox → flush → 按分支 confirm/推进/清理`。`flush` 在发送每条待办前读取新鲜 NS,按 action 核对原关系或目标关系的完整声明、版本、锁和 owner;陈旧通知从 outbox 移除并持久保存,无法确认时保留待办,不发送。未完成任务的 transfer.ready 另核对持久授权期限。待审批请求重新发本地事件,仍为 pending;不能因为连接恢复或等待超时自动同意。通知发送本身不证明关系完成,后续处理和完成判断仍须核对新鲜 NS。
|
|
344
|
-
|
|
345
|
-
| 中断位置 | 恢复依据和行为 |
|
|
346
|
-
| --- | --- |
|
|
347
|
-
| 审批已保存、回复未发或发送后未清 outbox | 先新鲜核对该 action 所需原关系或目标关系,再按原 operation_id、决定和载荷重发;陈旧通知持久移除,发送本身不确认关系完成。 |
|
|
348
|
-
| 文件已签但未发布 | 复用已保存原始字节与原条件;不换 declaration_id、时间或签名。 |
|
|
349
|
-
| owner 写入响应丢失 | 当前完整 raw/hash 与本任务已签文件匹配则仅确认;否则仅在保存的起始存在性、完整原文和摘要仍匹配时重传。已观察到变化返回 conflict,不从网络补造起始证据。 |
|
|
350
|
-
| sub PUT 响应丢失 | 若尚未持久化本次发布的 NS `agent.md` ETag,只有新鲜核对指定 owner、目标版本、锁及完整原文件均匹配时才能确认并保存该 ETag;若已持久化 ETag,当前 ETag 和完整文件必须匹配,ETag 变化即使原文相同也返回 conflict。未确认发布时,仅在原 If-Match/If-None-Match 条件仍成立时重传;仅版本增加不足以证明成功。 |
|
|
351
|
-
| 当前路径不存在 | 与保存的起始存在性核对;起始文件原先存在而当前不存在时停止旧写入。不能据当前文件判断同内容 ABA 或历史回滚。 |
|
|
352
|
-
| release 已发布、NS 暂不可用 | 保留 release 与确认待办,恢复后请求新鲜 NS 检查。 |
|
|
353
|
-
| 已有后续版本、ETag 或完整原件变化 | 停止旧写入/删除,保留真实结果及错误;不能更换起始原件或刷新 NS 条件强行续写。 |
|
|
354
|
-
| 转移期限到期 | 不延期重签,不自动 release 再 bind;继续须新的明确发起和审批。 |
|
|
355
|
-
| 关系已提交、通知/旧文件/副本仍待处理 | 保持已提交关系,分别补发、条件清理或由 NS 补齐副本。 |
|
|
356
|
-
|
|
357
|
-
TypeScript 的 `publishOwner` 固化起始存在性、完整原文和摘要,连同已签 raw/hash 持久保存,实际发布前再次核对原件;`publishAgent` 固化 NS 原 If-Match/If-None-Match 条件,连同已签 raw/hash 执行 `task.persist()`。重试沿用原件、原字节与 NS 原条件。恢复不能调用 bind/transfer 发起接口代替 resume,因为每次新发起通常生成新 UUID。停止消息只停止后续推进;不能撤回已发布转移授权或已提交关系。撤回未提交授权是原 owner 核对当前完整原件后原子覆盖为同版本 declare 并新鲜确认,不是删除文件,也没有独立取消 Facade。
|
|
358
|
-
|
|
359
|
-
Client `_connectOnce` 通过 `_safeAsync(_resumeOwnershipAfterConnect())` 异步安排身份检查、注册意图和 Workflow 恢复。`await connect()` 不等于所有 Ownership 待办已经恢复完成;实现和应用应以对应结果/事件及 NS 新鲜事实判断。
|
|
360
|
-
|
|
361
|
-
移植恢复入口应恢复原任务,不能用重新调用绑定/转移来代替。下图把本地故障、可重试依赖故障、确定冲突及完成后的待办分开。
|
|
362
|
-
|
|
363
|
-
```mermaid
|
|
364
|
-
flowchart TD
|
|
365
|
-
A[重启或重连:读取并 decode 原任务] --> B{任务、审批、原件与完成证据完整吗}
|
|
366
|
-
B -->|否| P[persistence_unavailable:保留记录,停止副作用]
|
|
367
|
-
B -->|是| C[按 sub 串行:processInbox → flush → confirm / 推进 / 清理]
|
|
368
|
-
C --> D{新鲜权威结果及本人原件能确认本次目标吗}
|
|
369
|
-
D -->|能| E[CAS 保存 completed 与真实完成证据]
|
|
370
|
-
E --> F[按当前事实补有效通知、清理;失败仅留待办和错误]
|
|
371
|
-
D -->|依赖暂不可用| G[pending / retryable:保留任务、原字节和条件]
|
|
372
|
-
D -->|未提交目标| H{当前事实仍满足原声明、原件和条件吗}
|
|
373
|
-
H -->|否;目标未提交| I[conflict:stopped,不覆盖后续文件]
|
|
374
|
-
H -->|是| J{审批和授权状态}
|
|
375
|
-
J -->|未决定| K[重发 ownership.request,等待应用决定]
|
|
376
|
-
J -->|明确拒绝| L[rejected:不复活]
|
|
377
|
-
J -->|已同意且未过期| M[仅补未完成步骤,复用原任务、签名字节和原条件]
|
|
378
|
-
J -->|授权过期或撤回| I
|
|
379
|
-
C -. 确定材料无效 .-> N[invalid:error / false]
|
|
380
|
-
C -. 本地读写或 CAS 失败 .-> P
|
|
381
|
-
K --> G
|
|
382
|
-
M --> D
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
例如移植 `publishAgent` 时,下列顺序约束必须保留:先持久化完整签名文件,再通过原条件提交。片段省略本节及第 4~7 节规定的回源、原件、证书和目标材料校验,不能将它作为绕过这些校验的独立上传入口。
|
|
386
|
-
|
|
387
|
-
```ts
|
|
388
|
-
task.files.agent = saved;
|
|
389
|
-
await task.persist();
|
|
390
|
-
const published = await this.deps.submitAgentMdRaw(
|
|
391
|
-
task.sub_aid, saved.raw, saved.condition,
|
|
392
|
-
);
|
|
393
|
-
```
|
|
394
|
-
|
|
395
|
-
## 11. 三种流程与 self-owner
|
|
396
|
-
|
|
397
|
-
| 流程 | 默认编排和最终依据 |
|
|
398
|
-
| --- | --- |
|
|
399
|
-
| 绑定 | 发起方保存意图和 request;接收方保存同意;owner 用 declareSubaid 发布 `v+1`;sub 用 declareOwneraid 自签 PUT;NS 验收后各端新鲜确认。 |
|
|
400
|
-
| 释放 | 原 owner 用 revokeSubaid 条件发布当前版本 `v` 的 release;NS 动态确认 `v/unlocked`,不另存关系或递增版本;通知 sub,字段与旧文件分别清理。真实权威不存在同样可确认该声明释放。 |
|
|
401
|
-
| 转移 | 原 owner 发 request;新 owner 与 sub 同意;原 owner 用 transferOwneraid 发布旧版本授权;新 owner 发布 `v+1` declare;sub 自签提交 `v+1`;NS 条件提交目标名片,随后从两份权威材料确认及条件清理旧文件,不另存关系或证据表。 |
|
|
402
|
-
|
|
403
|
-
审批阶段不写协议文件。默认编排给出易恢复的步骤顺序,协议本身允许各方乱序独立发布;NS 不维护跨方 prepare 或等待任务。转移授权绑定旧关系、指定新 owner、目标版本及有效期,不依赖另外两方预交目标文件或摘要。TypeScript 首次授权采用本地 3600 秒,持久保存实际 expires_at;恢复不延长它。
|
|
404
|
-
|
|
405
|
-
释放后的 sub 自动清理只使用本端明确 accept、包含 sub 角色、本人已签 agent 中 owner/sub/被释放的完整 statement(含 declaration_id、版本)完全匹配的原 bind/transfer 记录;转移历史匹配目标 owner。收到 release 通知时,因发布响应丢失仍 pending 的原任务也可提供该授权;无控制消息时,仅已完成历史任务的恢复路径触发自动清理,即使没有 relation.confirmed,也须新鲜核对权威释放事实。清理原件、全文摘要和原 CAS 单独持久保存,保持历史 completed 及原完成证据。字段已清空时不签写;响应丢失复用原件/条件,全文、ETag及已知提交 ETag 均对应原清理提交时只观察确认,冲突保留待办。没有该授权且仍有旧字段时,任务保持 pending 并发 action_required;acceptOwnershipRequest/rejectOwnershipRequest 不接受 release 任务,应用可通过已有名片 API 明确签署清理文件。
|
|
406
|
-
|
|
407
|
-
### 11.1 EC CLI 创建 sub 后,由 human owner 确认绑定
|
|
408
|
-
|
|
409
|
-
以下是供 EC CLI 开发者接入的目标流程,EC CLI 当前尚未集成 Ownership。应用需在 Evolcore 一侧创建、加载 sub 身份,再由该 sub 调用 `bindOwneraid(ownerAid)`;先读取当前 agent.md 或确认其可靠不存在,再按原条件建立声明;不能覆盖已有关系或失败稿。sub 的主动发起已保存其同意,不需要没有 UI 的 sub 再交互确认;human owner 的 App 收到 `ownership.request` 后才展示确认。CLI 创建身份的具体命令属于上层应用,SDK 不定义 `ec` 命令。
|
|
410
|
-
|
|
411
|
-
```mermaid
|
|
412
|
-
sequenceDiagram
|
|
413
|
-
participant EC as EC CLI / Evolcore(待接入)
|
|
414
|
-
participant S as sub SDK(无 UI)
|
|
415
|
-
participant O as human owner App / SDK
|
|
416
|
-
participant ST as owner Storage
|
|
417
|
-
participant NS as sub NS
|
|
418
|
-
EC->>S: 创建并加载 sub 身份
|
|
419
|
-
EC->>S: bindOwneraid(ownerAid)
|
|
420
|
-
S->>NS: 新鲜读取 agent.md 或可靠 404,核对基线及版本 v
|
|
421
|
-
S->>S: CAS 保存发起同意、原件和 outbox
|
|
422
|
-
S->>O: 加密 P2P bind.request
|
|
423
|
-
O->>O: inbox 持久化,回源核验后发 ownership.request
|
|
424
|
-
alt human 拒绝
|
|
425
|
-
O->>O: rejectOwnershipRequest;CAS 保存拒绝与回复
|
|
426
|
-
O->>S: bind.reject;双方结束审批,不写关系文件
|
|
427
|
-
else human 点击确认
|
|
428
|
-
O->>O: acceptOwnershipRequest;CAS 保存同意与回复
|
|
429
|
-
O->>S: bind.accept
|
|
430
|
-
O->>ST: declareSubaid:本人签署并原子发布 v+1 owner.md
|
|
431
|
-
O->>NS: SDK 后续推进/确认时新鲜检查
|
|
432
|
-
NS-->>O: sub 尚无匹配声明,不建立新锁
|
|
433
|
-
O->>S: owner.ready
|
|
434
|
-
S->>ST: 权威读取并验证目标 owner.md
|
|
435
|
-
S->>S: declareOwneraid:本人签署,保存原字节与原 CAS
|
|
436
|
-
S->>NS: 以 sub 身份条件 PUT agent.md
|
|
437
|
-
NS->>ST: 新鲜验证 owner 材料、证书与当前关系
|
|
438
|
-
NS->>NS: CAS 保存完整 agent.md,按原机制同步副本
|
|
439
|
-
S->>NS: 提交后再次新鲜检查
|
|
440
|
-
NS-->>S: 双文件共识成立,locked
|
|
441
|
-
S->>S: 新鲜确认共识及本人原件,保存 completed
|
|
442
|
-
S->>O: relation.confirmed
|
|
443
|
-
O->>O: 自行新鲜核查共识与本人原件后 completed
|
|
444
|
-
end
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
任一步骤遇到冲突、未知材料或服务失败,按第 10 节保留原任务或停止旧写入;`owner.ready`、消息 ACK 和图中通知均不替代新鲜共识。反向 `bindSubaid` 仍需要 sub 应用或策略明确审批;上述无人值守常规流程优先由 sub 发起。
|
|
448
|
-
|
|
449
|
-
### 11.2 owner 释放与 sub 清理
|
|
450
|
-
|
|
451
|
-
```mermaid
|
|
452
|
-
flowchart TD
|
|
453
|
-
A[原 owner 调用 releaseSubaid] --> B[新鲜确认本人旧关系 v;保存任务与原件]
|
|
454
|
-
B --> C[revokeSubaid:签署并原子发布同版本 release]
|
|
455
|
-
C --> D[新鲜读取两份权威材料,确认 released / v / unlocked]
|
|
456
|
-
D -->|无法确认| W[保留 release 与确认待办,恢复后重查]
|
|
457
|
-
W --> D
|
|
458
|
-
D -->|确认本任务| E[原 owner 保存 completed;sub 离线不阻碍]
|
|
459
|
-
E --> F[持久 outbox:relation.confirmed → sub]
|
|
460
|
-
F --> G[sub 回源确认释放;查找本人已同意的匹配原任务]
|
|
461
|
-
G --> H{有完整声明、原件和原 CAS 匹配的清理授权吗}
|
|
462
|
-
H -->|没有且仍有旧字段| I[pending;ownership.action_required;由应用明确签署清理]
|
|
463
|
-
H -->|有| J[revokeOwneraid:保存清理原件,以 sub 身份条件 PUT]
|
|
464
|
-
J --> K[NS 保存清理后的 agent.md:unbound / 0,并同步副本]
|
|
465
|
-
K --> L[sub.cleaned;owner 回源核对后更新清理进度]
|
|
466
|
-
E --> M[旧 release 延迟删除:先复核当前 NS 与本任务完整原件]
|
|
467
|
-
M -->|文件或当前关系已变化| N[停止旧删除,保留结果与待办]
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
有效权威不存在也可支持 `released/v`,但超时、无权限或普通下载 404 不属于权威不存在。若 sub 字段已清空,只能按第 10 节的本任务原件及提交证据观察确认,不能仅凭 `unbound/0` 认领完成;不再签写空字段。release 不属于可用 accept/reject 审批的任务。
|
|
471
|
-
|
|
472
|
-
### 11.3 三方连续转移
|
|
473
|
-
|
|
474
|
-
```mermaid
|
|
475
|
-
flowchart TD
|
|
476
|
-
A[原 owner:transferSubaid,保存原关系 v 与转移意图] --> B[持久并发送 transfer.request 给新 owner 和 sub]
|
|
477
|
-
B --> C[新 owner App:核验请求后明确同意或拒绝]
|
|
478
|
-
B --> D[sub 应用或明确配置的策略:核验后同意或拒绝]
|
|
479
|
-
C -->|拒绝| R[transfer.reject;停止未提交任务,原关系保持]
|
|
480
|
-
D -->|拒绝| R
|
|
481
|
-
C -->|同意| E[CAS 保存决定与 transfer.accept]
|
|
482
|
-
D -->|同意| F[CAS 保存决定与 transfer.accept]
|
|
483
|
-
E --> G{原 owner 收齐唯一参与 AID 的同意吗}
|
|
484
|
-
F --> G
|
|
485
|
-
G -->|未收齐| H[等待,不发布授权或目标文件]
|
|
486
|
-
G -->|已收齐| I[复核原件;固定期限及完整签名字节,先 CAS 持久化]
|
|
487
|
-
I --> J[transferOwneraid 发布旧版本授权;编排新鲜核查后发送 transfer.ready]
|
|
488
|
-
J --> K[新 owner 核对本端同意、授权目标、版本与未过期]
|
|
489
|
-
J --> L[sub 核对本端同意及授权,等待目标声明]
|
|
490
|
-
K --> M[declareSubaid:新 owner 自签原子发布 v+1 owner.md]
|
|
491
|
-
M --> N[新 owner 触发 NS 新鲜检查;owner.ready;sub 回源读取目标 owner.md]
|
|
492
|
-
L --> N
|
|
493
|
-
N --> O[declareOwneraid:sub 自签并保存原字节与原 CAS]
|
|
494
|
-
O --> P[以 sub 身份条件 PUT;NS 复核三方材料与期限]
|
|
495
|
-
P -->|通过| Q[CAS 保存目标关系文件 v+1;锁定新关系;sub 提交后新鲜回读]
|
|
496
|
-
P -->|不可确认或冲突| W[原任务保留或停止;不换原件、延期或 release 再 bind]
|
|
497
|
-
Q --> T[sub 新鲜确认目标与本人原件后 completed]
|
|
498
|
-
T --> U[relation.confirmed;各端自行回源确认后 completed]
|
|
499
|
-
U --> V[原 owner 复核当前 NS 及本任务完整旧原件后清理]
|
|
500
|
-
```
|
|
501
|
-
|
|
502
|
-
sub 没有 UI 不表示默认同意所有转移;它仍须由应用或既有明确策略决定。授权期限仅限制新转移提交,过期本身不解除旧关系;已经提交的目标保持,通知或旧文件清理失败分别恢复。
|
|
503
|
-
|
|
504
|
-
### 11.4 sub 的清理授权与 self-owner
|
|
505
|
-
|
|
506
|
-
释放后的 sub 自动清理只使用本端明确 accept、包含 sub 角色且本人已签关系文件中 owner/sub/被释放的完整 statement(含 declaration_id、版本)完全匹配的原 bind/transfer 记录;转移历史匹配目标 owner。收到 release 通知时,因发布响应丢失仍 pending 的原任务也可提供该授权;无控制消息时,仅已完成历史任务的恢复路径触发自动清理,即使没有 relation.confirmed,也须新鲜核对权威释放事实。清理原件、全文摘要和原 CAS 单独持久保存,保持历史 completed 及原完成证据。字段已清空时不签写,可记录当前已清理的观察进度;Go SubCleaned 也可表示这一观察,单独不能证明本任务执行清理或首次完成 release,后者仍须第 10.1 节的原件关联证据。响应丢失复用原件/条件,全文、ETag及已知提交 ETag 均对应原清理提交时只观察确认,冲突保留待办。没有该授权且仍有旧字段时,任务保持 pending 并发 action_required;acceptOwnershipRequest/rejectOwnershipRequest 不接受 release 任务,应用需明确关系资源的清理意愿;应用可按既有名片 API 明确自签清理,仍须核验释放事实及原 CAS。
|
|
507
|
-
|
|
508
|
-
若新鲜有效关系文件的关系字段已经清空,sub 只有以本任务持久清理原件、摘要及原 CAS,或本人明确 accept 的匹配原 bind/transfer.release_cleanup,精确核对当前 NS 原文、摘要、ETag及已知提交 ETag 后,才可仅观察本任务清理完成,无需再签写或审批;空字段本身不证明本任务完成或本端同意。原 owner 的释放任务可早已 completed,历史绑定/转移 completed 也保持原记录;当前关系检查返回 `unbound`,响应版本为 `0`,任务版本仍为 `v`。NS 不保存释放终局或历史版本上界;后续绑定和旧任务恢复须重新核对完整文件与原条件。
|
|
509
|
-
|
|
510
|
-
self-owner 为 owner_aid 等于 sub_aid,同一身份按两个角色分别签自己的 owner.md 和 agent.md;不减少文件、签名或 NS 验收要求,不添加特殊状态。应用本端发起可覆盖本端角色意愿,SDK 不向自己发 P2P;转移中 sub 与新 owner 重合时合并对同一 AID 的请求和决定。
|
|
511
|
-
|
|
512
|
-
self-owner → 外部 owner 仍需当前身份的原 owner 授权及目标 agent.md,外部新 owner 的目标 owner.md;外部 owner → self-owner 仍需原外部 owner 授权及 sub 的两个目标文件。原/新 owner 相同不是有效转移;已有外部锁不能凭两个 self-owner 文件绕过。
|
|
513
|
-
|
|
514
|
-
## 12. 普通/群名片、注册与兼容边界
|
|
515
|
-
|
|
516
|
-
普通 2.1 名片更新保留当前完整 owner 和 statement,使用新鲜 NS 原 ETag 与本人当前签名上传,不递增关系版本。已有普通 legacy owner-only、proof 或 2.0 关系的普通名片入口允许仅更新正文;owner、ownership、ownership_proof、ownership_release 的字段存在性、类型和值必须完整保留,新 metadata 和外层签名执行当前上传规则,不由普通更新新建旧绑定或自动迁入 2.1。旧 SDK 的 owner 变更另走隔离的 legacy RPC/operation ID 兼容入口,只激活旧 `ownership_proof`,不覆盖已存现代声明,不生成 2.1 lock/version/consensus。NS 接受名片后再通过受限可信 nameservice 内部 `storage.put_object` 原子同步 `{sub_aid}:/agent.md` 原始签名副本,无需客户端 HTTP 会话;内部镜像只能写本域 `default/agent.md`,不能写删 `owner.md`。副本失败不回滚关系。正文普通更新会改变文件 ETag,即使关系版本不变也要重新同步;副本不能替代 NS 作为授权依据。
|
|
517
|
-
|
|
518
|
-
四 SDK 普通 `downloadAgentMd`/`download_agent_md` 及文件验签兼容历史 aid-only、无 frontmatter 的已签正文、实体自签及旧关系材料;历史尾签允许 16/64 hex 的 DER/SPKI 指纹、前缀省略、冒号和大小写,时间戳前导零及 CN 去首尾空白/忽略大小写仅适用于 agent.md 历史读取。签名原字节、实际 signer、指纹、证书链及签署时间仍须验证;现代 Group/Org 即使在兼容读取中也要求严格完整 DER 证书指纹、owner 与 entity_cert_fingerprint,主签 cert_fingerprint 必须匹配实体指纹,已出现但无效的指纹不得回退 legacy。旧 Group 读取仅限 type=group、恰一个签名块、无 entity_cert_fingerprint 且主 signer_aid 缺省或等于实体 AID;Org 不开放,上传不采用这些读取宽松规则。读取兼容的证书查询/缓存与通用 Auth、消息及当前 Ownership 验证隔离。`verification.ownership_status` 保留 legacy proof 展示语义,不是 2.1 新鲜共识或授权结果;文件验签成功不代表当前关系,仍须调用 `checkOwnershipConsensus` 及本语言对应方法,业务执行端自行新鲜授权。
|
|
519
|
-
|
|
520
|
-
普通名片候选先通过本地 schema/外层签名验证,在首次远端 preflight 前独立持久保存私有 `local_draft_content`;不覆盖远端 content/ETag。持有本地私钥的自有身份默认 resolve 优先该稿,返回 unverified、in_sync=false、source.agent_md_fetched=false;显式 download/forceRefresh 仍读取远端权威内容并保留草稿,服务端确认对应候选提交成功后才清稿。失败稿仅本地保留,普通 initial 失败稿同样需要应用显式重试;重连即使发现普通 pending 也不自动重传。`AgentMdManager._uploadPrepared` 取得可靠 NS 条件后,仍在 PUT 前持久保存 signedContent、pending_condition 和 pending_relation(原 owner、完整 statement、relation_version、lock)。显式重试既有 pending 时,`resumePendingUpload` **先检查持久原条件,再读取远端**;缺条件保留原元数据及原错误,即使远端同字节也不清待办。2.1 正文更新核对原版本、锁、owner 和完整 statement;受限 legacy 正文更新另保存可信 base 全文、摘要、原 ETag 及全部旧关系快照,核对 base/candidate/remote 的存在性、类型和值,缺上下文不得补造。当前原文与提交 ETag 均对应原提交时只观察确认,否则仅在原 CAS 和关系仍匹配时重传原 blob,不换条件或重签;关系改变、远端消失或已被 2.1 接管则冲突并保留 pending。其它缺原上下文的旧待办仅允许版本 0/unlocked 的初始关系;Ownership 2.1 任务、消息及 outbox 仍由其既有机制恢复。
|
|
521
|
-
|
|
522
|
-
Group/Org 名片失败稿及 pending 保留实体命名空间中的完整多签原文、原 CAS、固定 owner 和实体证书指纹,由应用显式重试,post-connect/重连不隐式 PUT。重试先验证完整原件及当前 owner、状态和证书代际,原条件完整且同代际原文/ETag 已确认提交时只观察完成。转移、rekey 或解散后停止旧代际待办,不更换身份、指纹或条件重签。新 SDK 现代上传不再保存、刷新或检查额外 V2 授权及过期窗口;旧 V2 兼容入口仍按协议 §2.5 校验;普通文件签名与当前证书检查保留。专属 create/transfer 自身 checkpoint 恢复机制不变。
|
|
523
|
-
|
|
524
|
-
普通主体注册指定 owner 时,[aid-store.ts](../../ts/src/aid-store.ts) 先保存 `protocol=2.1` 的 registration_intent 和固定 operation_id;可靠初始化只发布本人无 owner 名片。初次连接由 `_resumeRegistrationIntent` 复用同一 operation_id 进入绑定,注册成功不是关系已成立。Group/Org 的身份准备由专属生命周期使用,不建立通用注册 owner 意图;已有关系/不可靠读取不能作为重新初始化或清空关系的依据。
|
|
525
|
-
|
|
526
|
-
旧 `ownership_proof/ownership_release`、只有 owner 字符串而缺少完整 2.1 statement 的文件不能自动降格为 unbound,也不能用旧 records 解锁。TypeScript `OwnershipFiles.verifyFile` 明确拒绝 legacy;`bindAid/bindOwner/releaseOwnership` 抛出带 `stringCode=unsupported_protocol` 的异常,`getOwner/getOwnershipStatus` 仍读取 legacy records,不能作为 2.1 当前关系查询。升级必须明确核验原权威事实,不借迁移清空版本或 owner 锁。
|
|
527
|
-
|
|
528
|
-
业务执行端仍须认证调用者、目标 sub、权限范围和新鲜共识,绑定 token/ACL 到完整关系声明及其版本并检查当前有效性;清理后版本可重复,不能单凭版本识别关系;客户端事件或布尔值不是授权证明。敏感操作执行前保存完整文件与验证证据。托管私钥和凭据交接由应用另行处理,NS 转移不自动撤销旧私钥、证书、token 的身份能力,也不代表业务交接已经完成。
|
|
529
|
-
|
|
530
|
-
## 13. 跨语言 TDD 与有序验收
|
|
531
|
-
|
|
532
|
-
移植从共同向量开始,再接文件层、持久 Workflow 和真实 Client 通路;先用失败断言固定边界,再实现该边界。不要只用当前语言生成的数据验证自己,也不要以纯 Workflow mock 代替实际收件/连接接线。
|
|
533
|
-
|
|
534
|
-
共同文件是 [tests/vectors/ownership_v21/vectors.json](../../tests/vectors/ownership_v21/vectors.json),测试向量位于顶层 `documents` 键下;当前包含 **119 个完整文件、51 个消息、24 个六态入口**,固定 verification_time 为 `1791524400`,材料范围标为静态单元夹具。`raw_base64` 必须解码为完整原文;文件解析预期与完整验签预期分别检查。
|
|
535
|
-
|
|
536
|
-
TypeScript 消费入口为 [tests/conformance/ownership_v21.test.ts](../../ts/tests/conformance/ownership_v21.test.ts);内部行为参考 [ownership-v21.test.ts](../../ts/tests/unit/ownership-v21.test.ts)、[ownership-workflow.test.ts](../../ts/tests/unit/ownership-workflow.test.ts)、[client-agent-md-api.test.ts](../../ts/tests/unit/client-agent-md-api.test.ts)。随机 ECDSA 不要求各端生成相同签名值,要求签名格式、覆盖字节及跨端验签一致。
|
|
537
|
-
|
|
538
|
-
| 验收顺序 | 完成后才能进入下一项的证据 |
|
|
539
|
-
| --- | --- |
|
|
540
|
-
| 1. 原始文件与密码 | 双角色、严格 JSON/YAML、字节大小、TAG、整数边界、DER 与完整文件签名;坏材料分类一致。 |
|
|
541
|
-
| 2. 权威适配 | NS 原条件/可靠 404,Storage 当前完整文件与存在性再读、可信来源,精确证书及当前吊销状态;故障不解锁。 |
|
|
542
|
-
| 3. 文件方法与六态 | 自签自传、五个内部步骤、绑定/release/权威删除/连续转移/self-owner;前后 NS 一致性。 |
|
|
543
|
-
| 4. 持久 Workflow | 每任务 CAS、审批与 outbox 原子、未决不自动批准、角色去重、固定期限、损坏完成态拒绝。 |
|
|
544
|
-
| 5. 实际 Client 通路 | 解密 JSON 原文保留、push/pull/reconnect 统一拦截、持久成功前零队列移除/游标/ACK;普通与群待办隔离。 |
|
|
545
|
-
| 6. 中断窗口 | 保存后发送前/后、owner/sub 提交后失响应、release 待确认、后续代际、过期、停止前后;原字节与原条件不变。 |
|
|
546
|
-
| 7. 网络互通 | 单域集成 → 单域 E2E → cross-sdk → pub/cn 双向联邦;轮换 sub/原 owner/新 owner,观察真实 NS、Storage、CA 和凭据身份。 |
|
|
547
|
-
| 8. 服务持久与副本 | 真实数据库中的名片原文、CAS 与同步待办原子一致;服务恢复后从两份权威材料验证关系,副本最终逐字节一致;与 SDK 恢复证据分开。 |
|
|
548
|
-
|
|
549
|
-
单元测试可以并行,但每项使用隔离的数据库、AID 和目录;共用 Docker 环境仅一个测试名额,按上表的网络顺序串行执行。服务代码改变后,先重新构建、更新对应容器并核对真实运行版本,再运行受影响的网络验收;不能用旧容器结果验收新服务代码。
|
|
550
|
-
|
|
551
|
-
运行到失败立即停止,保存用例 ID、任务固定上下文、已通过阶段、NS 版本/ETag、文件摘要及日志;修复后先重跑失败项,再从未完成阶段继续。已通过且未受修改影响的项目不重复执行。现有 runner 不存在通用 resume 参数,按 [TDD 第 11 节](Ownership2.1-TDD分阶段实施计划.md#11-测试命令与续跑方法) 的检查点方法续跑;测试环境和命令见 [AUN 测试运行指南](../aun测试运行指南.md)、[分布式指南](../aun分布式测试运行指南.md)、[公网指南](../aun公网测试运行指南.md)。对外地址使用 `{svc}.{issuer}`,Windows Python 使用 `-X utf8`。
|
|
552
|
-
|
|
553
|
-
当前通过项及未完成/受限项只以 [TDD 第 13.4 节](Ownership2.1-TDD分阶段实施计划.md#134-测试与失败续跑账本)、[第 13.6 节](Ownership2.1-TDD分阶段实施计划.md#136-四-sdk-一致性检查点) 和 [第 13.7 节复审修复验收](Ownership2.1-TDD分阶段实施计划.md#137-2026-10-11-本轮复审修复验收)及[第 13.8 节复查更正与修复边界](Ownership2.1-TDD分阶段实施计划.md#138-2026-10-13-复查更正与修复边界)的具体证据为准:共同向量和本地定向通过不表示真实浏览器联网、当前完整 JS bundle 互操作或所有 SDK 跨 PID 强杀恢复均已通过。SQLite/IndexedDB 连接重开、新建 Workflow、服务独立恢复进程和真正进程重启分别记录。新移植 SDK 应提供自己的目标平台与运行版本证据,不能继承参考实现尚未覆盖的环境结论。
|
|
1
|
+
# Ownership 2.1 SDK 开发与移植指南
|
|
2
|
+
|
|
3
|
+
面向 SDK 实现者,以 Node TypeScript `0.5.22` 工作区(未发布,发布基线 `0.5.21`)说明文件验证、权威适配、消息持久化和恢复。应用调用见 [集成指南](Ownership2.1-SDK应用集成指南.md);字段和授权以 [协议 2.1](../protocol/Ownership协议定义2.1.md) 为准,历史兼容见 [编排指南 §8](Ownership-SDK编排指南2.1.md#8-崩溃与响应丢失后的恢复)。
|
|
4
|
+
|
|
5
|
+
## 1. 实现边界与角色
|
|
6
|
+
|
|
7
|
+
关系事实仅来自 sub 在 NS 的当前 `agent.md` 和 owner 在本人 Storage 的当前 `owner.md`。sub 自签自传,owner 自签自传;owner 登录态不能代上传普通 sub 名片。NS 事务原子保存名片、CAS 和同步待办,不另建关系账本;SDK 任务只记录本端编排。
|
|
8
|
+
|
|
9
|
+
普通名片解析、外层验签与关系验证分层。正文更新保留全部关系材料的存在性、类型和值及原 CAS,不以前置共识或 owner Storage 可用为条件;关系字段变更仍执行双文件授权。
|
|
10
|
+
|
|
11
|
+
Group/Org 作为 sub 使用专属生命周期:通用任务抛出 `not_applicable`,共识返回同名结果;它们仍可按普通 owner 规则作为 owner。现代实体名片由实体主签、当前 owner token 上传,可选 owner 附签且全部验证,详见协议 §2.5。
|
|
12
|
+
|
|
13
|
+
## 2. 分层与最小依赖接口
|
|
14
|
+
|
|
15
|
+
| 层次 | TS 参考与职责 |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| 文件/共识 | [ownership-v21.ts](../../ts/src/ownership-v21.ts):严格解析、签验、`OwnershipFiles`、权威 Storage 适配。 |
|
|
18
|
+
| 编排 | [ownership-workflow.ts](../../ts/src/ownership-workflow.ts):审批、每任务 CAS、inbox/outbox、结果和清理。 |
|
|
19
|
+
| HTTP/证书 | [agent-md.ts](../../ts/src/agent-md.ts)、[auth.ts](../../ts/src/auth.ts):NS fresh/原条件 PUT、精确证书和当前吊销状态。 |
|
|
20
|
+
| Client/存储 | [client.ts](../../ts/src/client.ts)、[aid-db.ts](../../ts/src/keystore/aid-db.ts):装配身份、消息、事件、重连和持久任务。 |
|
|
21
|
+
|
|
22
|
+
文件层依赖:`currentAid/now/readAgentMdFresh/submitAgentMdRaw/readOwnerMd/writeOwnerMd/deleteOwnerMd/resolveCertificate`。读返回完整原文、存在性和权威元数据;写使用已保存原字节及原条件。各服务独立实现网络契约,不 import SDK 或其他服务源码。
|
|
23
|
+
|
|
24
|
+
以下是 SDK 内部装配片段;应用只使用集成指南中的公有 Facade:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { OwnershipFiles } from './ownership-v21.js';
|
|
28
|
+
import { OwnershipWorkflow } from './ownership-workflow.js';
|
|
29
|
+
const files = new OwnershipFiles(fileDeps);
|
|
30
|
+
const workflow = new OwnershipWorkflow({
|
|
31
|
+
currentAid: () => identity.aid, store: tokenStore, files,
|
|
32
|
+
send: sendEncryptedMessage, emit: emitLocalEvent,
|
|
33
|
+
});
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 3. 标识、版本与数值
|
|
37
|
+
|
|
38
|
+
| 值 | 规则 |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| AID | 完整小写;分别核对资源、证书、路径和认证身份。 |
|
|
41
|
+
| operation/declaration ID | 小写 UUIDv4;任务 ID 与各文件声明 ID 独立。 |
|
|
42
|
+
| 格式版本 | 名片为语义版本字符串;statement.version 为整数 `2`;NS 协议头为 `2.1`。 |
|
|
43
|
+
| 关系版本 | NS 投影 `0..9007199254740991`,statement 从 `1` 起;递增前检查溢出。 |
|
|
44
|
+
|
|
45
|
+
绑定、转移为当前可见声明 `v+1`;release 保持 `v`;sub 清空关系后投影为 `0`,重绑默认 `1`。版本不是全局代际,旧任务还须核对完整声明、原件和 CAS。双方 statement 的 version、owner、sub、relation_version 相同;declaration_id 和 declared_at 可不同。
|
|
46
|
+
|
|
47
|
+
持久保存 `base_agent_md={exists,raw,sha256,etag,statement}` 和当前/最后 owner 的 `base_owner_md={exists,raw,sha256}`;目标 owner 写前原件另存。尚未签署的本方候选可使用语义未变正文的新鲜 ETag,已签候选重试始终沿用保存的原 CAS。
|
|
48
|
+
|
|
49
|
+
## 4. 原始文件、严格解析与签名
|
|
50
|
+
|
|
51
|
+
### 4.1 容器和角色
|
|
52
|
+
|
|
53
|
+
YAML frontmatter+可选 Markdown+连续尾签块。首签前 payload 最多 4096 UTF-8 字节,整个尾签区最多 2048 字节。拒绝坏 UTF-8、非连续签块、重复字段/YAML 键、tag、锚点、别名和未知关系字段。
|
|
54
|
+
|
|
55
|
+
| 文件 | Schema 和身份 |
|
|
56
|
+
| --- | --- |
|
|
57
|
+
| `agent.md` | 基础字段 `aid/name/type/version`;owner 与 ownership 同时出现/省略,含完整 statement;主签者和认证上传者均为 sub。human 不得声明 owner。 |
|
|
58
|
+
| `owner.md` | 顶层恰为 `owner_aid/sub_aid/ownership`;路径 `owner_aid:/sub_aids/{sub_aid}/owner.md`;ownership 含 statement/action,仅 transfer_owner 另含 transfer。 |
|
|
59
|
+
|
|
60
|
+
statement 恰含 `version/declaration_id/owner_aid/sub_aid/relation_version/declared_at`。action 为 `declare/release/transfer_owner`;transfer 恰含 `new_owner_aid/target_relation_version/expires_at`,绑定 `v+1`。文件角色取自资源上下文,不取自签名 TAG;不为 owner.md 伪造名片字段。
|
|
61
|
+
|
|
62
|
+
### 4.2 数值词法不能在解析后丢失
|
|
63
|
+
|
|
64
|
+
版本只接受原始十进制整数 token;拒绝 `1.0/1e0/+1/01`、数值 tag、字符串和布尔值。JSON 解析保留重复键与 number token,YAML 校验 scalar source,再转数值。
|
|
65
|
+
|
|
66
|
+
`declared_at/expires_at/timestamp` 为 `1..9007199254740991` 的十进制正整数 Unix 秒;非法时间归 invalid。Python 排除 bool,Go 保留 JSON 数值词法;语言整数上限不能扩大协议范围。
|
|
67
|
+
|
|
68
|
+
### 4.3 签名输入和摘要分别保存
|
|
69
|
+
|
|
70
|
+
ECDSA P-256/SHA-256;签名为严格标准 Base64 的 ASN.1 DER,不能直接写 WebCrypto/P1363 的 `r||s`。首块签原始 payload,后块签之前的全部原始 prefix;不重排 YAML、换行或 Unicode。
|
|
71
|
+
|
|
72
|
+
| 保存项 | 用途 |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| 完整原文 raw | 签验、原字节重传和附签。 |
|
|
75
|
+
| 全文 SHA-256 | 包含全部签块的完整性与提交确认。 |
|
|
76
|
+
| NS 原 ETag | 原样用于 If-Match,不能用本地摘要替代。 |
|
|
77
|
+
|
|
78
|
+
agent/owner 默认 TAG 为 `AGENTMD-V2/OWNERSHIP-V2`,兼容标签以协议为准。普通两类文件主块禁止 signer_aid;附签必填,实体主块显式为实体 AID。已有附签全部验,数学失败不能降级成单签;末端删签不保证可检测。
|
|
79
|
+
|
|
80
|
+
`AIDStore.sign/verify`、agent.md 和 owner.md 复用唯一通用签验 core,业务 Schema/当前授权在外层校验。TS/JS 公共签验为 `Promise<Result>`;文件输入显式 `inputType: 'file'`,document 成功后才可原地写回。参数见 [API 手册](06-API手册.md#通用-sign--verify)。
|
|
81
|
+
|
|
82
|
+
## 5. 当前证书与吊销验证
|
|
83
|
+
|
|
84
|
+
关系验证须核对精确 AID/证书 DER 指纹、P-256、可信链、当前有效性、`active_signing` 和可靠吊销状态;通用离线数学验签不承担这些事实。签名 timestamp 须在证书有效期内,未来偏差不超过 300 秒,也不能单独证明历史授权时间。
|
|
85
|
+
|
|
86
|
+
[AuthFlow.resolveOwnershipCertificate](../../ts/src/auth.ts) 请求 authoritative PKI,并检查:
|
|
87
|
+
|
|
88
|
+
| 权威头 | 要求 |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| X-AUN-Cert-Consistency/X-AUN-Cert-Lifecycle-State | authoritative/active_signing。 |
|
|
91
|
+
| X-AUN-Cert-Fingerprint | 与请求和证书 DER 指纹精确匹配。 |
|
|
92
|
+
| X-AUN-Cert-Observed-At | RFC3339;过去 ≤30 秒,未来 ≤5 秒。 |
|
|
93
|
+
|
|
94
|
+
TS 当前使用直接 issuer 亲签的严格 OCSP DER:核对 CertID、ResponderID、签名和状态;ThisUpdate 过去 ≤30 秒,ProducedAt ≤90 秒,未来 ≤5 秒,NextUpdate 晚于当前及 ThisUpdate。网络等待后重读时钟并复核证书,整个验证窗口 ≤30 秒。未知状态、过期材料或缺权威证据为 unavailable;坏签名、吊销或非可签证书为 invalid。通用 CRL fallback 不是该 resolver 的替代证据。
|
|
95
|
+
|
|
96
|
+
## 6. NS HTTP 与六态共识
|
|
97
|
+
|
|
98
|
+
每个新 SDK NS GET/HEAD/PUT(含 fallback 和重试)携带 `X-AUN-Signature-Format: multi-v1`。fresh 再加 `X-AUN-Ownership-Check: 1`、`Cache-Control: no-cache`;TS 使用 GET,禁止自动重定向。浏览器须能读取 CORS 暴露的关系头和 ETag。
|
|
99
|
+
|
|
100
|
+
必验 `X-AUN-Ownership-Protocol: 2.1`、`X-AUN-Ownership-Version` 严格整数及 `X-AUN-Ownership-Lock: locked|unlocked`,存在时保留原 ETag。只有正确 NS 返回完整权威元数据的 404 才能解释为不存在;初始名片缺失仍不能开始绑定写入。
|
|
101
|
+
|
|
102
|
+
```mermaid
|
|
103
|
+
flowchart TD
|
|
104
|
+
A[开始计时;fresh NS 原文与元数据] --> B[严格解析,核对角色及当前证书]
|
|
105
|
+
B --> C[权威读取并验证规范 owner.md 或明确不存在]
|
|
106
|
+
C --> D{NS 元数据与文件材料冲突吗}
|
|
107
|
+
D -->|是,尚未重查| E[额外 fresh 重查一次并重验材料]
|
|
108
|
+
E --> D
|
|
109
|
+
D -->|仍冲突| U[unavailable;保留保护]
|
|
110
|
+
D -->|否| F[再次 fresh NS 核对原文、ETag、存在性、版本和锁]
|
|
111
|
+
F -->|变化或总计超过 30 秒| U
|
|
112
|
+
F -->|稳定| G[返回当前六态及权威摘要]
|
|
113
|
+
B -->|确定材料无效| I[invalid]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
两类元数据冲突共用一次额外重查额度,不能省略最后稳定性复读。六态为 `consensus/released/unbound/single_sided/invalid/unavailable`,含义见 [应用指南 §7](Ownership2.1-SDK应用集成指南.md#7-任务完成与当前共识六态)。pending/unlocked 映射 single_sided,不授权;release 或权威缺失对应 released/v,清理后 unbound/0。转移授权过期不使旧关系失效。
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
const current = await files.checkConsensus(subAid);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
提交使用 `submitAgentMdRaw`:已有文件仅带原 If-Match,首次创建仅带 If-None-Match=`*`;验证完整原件后 PUT,再 fresh 确认。428→unsupported_protocol,409/412→conflict,401/403→forbidden;不能去掉条件降级重试。
|
|
123
|
+
|
|
124
|
+
旧客户端普通读写仍兼容。无 multi-v1 的多签读取投影为首块并使用该表示的 ETag;完整存储不变。Vary、304、Content-Length 和 CAS 映射必须区分表示,不能把投影摘要当完整存储摘要。
|
|
125
|
+
|
|
126
|
+
## 7. Storage 权威读取、完整发布与权限
|
|
127
|
+
|
|
128
|
+
固定 `owner_aid/bucket=default/object_key=sub_aids/{sub_aid}/owner.md/consistency=authoritative`。检查认证服务来源、命名空间、存在性和观察时间;存在时严格解码完整 content 并核对 SHA,前后权威观察 ≤30 秒且一致。普通读缓存、resolve 展示快照、超时或公开下载 404 均不能证明权威不存在。
|
|
129
|
+
|
|
130
|
+
```mermaid
|
|
131
|
+
sequenceDiagram
|
|
132
|
+
participant F as 文件层
|
|
133
|
+
participant L as 本地任务库
|
|
134
|
+
participant T as owner Storage
|
|
135
|
+
F->>T: 权威读取起始原文、存在性、SHA 和对象 version
|
|
136
|
+
F->>L: 保存起始证据、签名全文及原 expected_version
|
|
137
|
+
F->>T: 写前复读,精确核对起始原件
|
|
138
|
+
F->>T: create_upload_session,携带原 expected_version
|
|
139
|
+
T-->>F: session_id 与上传 URL
|
|
140
|
+
F->>T: HTTP PUT 完整文件
|
|
141
|
+
F->>T: complete_upload,同一 session_id/expected_version
|
|
142
|
+
T->>T: 校验大小、SHA、原版本后原子替换
|
|
143
|
+
F->>T: 权威复读确认完整原文
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
创建时 expected_version=`0`,更新时为起始权威对象的正安全整数 version;三阶段 Content-Type 一致,完成时公开可读。object_id/version 不参与只读共识,但发布/删除必须具备有效版本。起始 version 一经持久保存不得追随最新值重写旧任务。
|
|
147
|
+
|
|
148
|
+
删除前 fresh 核对 NS 和本任务完整旧原件,再带最后读取且匹配原件的当前 version 条件删除;缺版本或 `-32009` 冲突即停止。只有本人可写删 owner.md,服务端须同时限制目录、移动、别名和批量入口。删除权威 owner 文件可导致释放,不是取消任务。
|
|
149
|
+
|
|
150
|
+
这些复读不是跨服务一致快照,也不保证识别同内容 ABA 或完整文件回滚。
|
|
151
|
+
|
|
152
|
+
## 8. 七个 Facade、事件与错误契约
|
|
153
|
+
|
|
154
|
+
公有接口和事件见 [应用指南 §4–5](Ownership2.1-SDK应用集成指南.md#4-七个-facade-的参数角色与结果)。内部五步为 `declareOwneraid/declareSubaid/revokeOwneraid/revokeSubaid/transferOwneraid`,不创建任务、不发起审批。
|
|
155
|
+
|
|
156
|
+
发起前匹配本端身份、发起方、操作、全部参与方和 base/target 版本:相同进行中意图复用 ID,同代际不同意图返回 conflict;终态不被迟到消息复活。任务 status 与共识 status 分开,事件在持久保存后发布。
|
|
157
|
+
|
|
158
|
+
| 结果 | 任务语义 |
|
|
159
|
+
| --- | --- |
|
|
160
|
+
| 等审批/材料、unavailable、unsupported_protocol | pending,可保留原任务重试。 |
|
|
161
|
+
| 原条件失效、目标/版本变化、授权过期 | stopped;停止前先核验目标是否已经提交。 |
|
|
162
|
+
| 确定材料 invalid/明确拒绝 | error/rejected,不自动复活。 |
|
|
163
|
+
| 目标与本任务证据精确匹配 | completed;通知和清理失败另留待办。 |
|
|
164
|
+
| 本地存储或 revision CAS 失败 | persistence_unavailable,停止副作用。 |
|
|
165
|
+
|
|
166
|
+
结果读取 code/reason/retryable;TS 异常的业务码为 `AUNError.stringCode`,数字 code 保留 RPC 语义。Storage Base64 传输封装损坏、同次权威元数据与正文摘要不一致归 unavailable;摘要匹配后确定非法的 UTF-8、字段或签名归 invalid。
|
|
167
|
+
|
|
168
|
+
## 9. P2P 载荷与实际收件拦截
|
|
169
|
+
|
|
170
|
+
控制类型固定 `aun.ownership.sdk.v1`;必含 operation_id、operation、action、sub/owner、base/target 版本,transfer 另含 new_owner。未知/缺失字段和非法整数词法拒绝;reason 仅用于 reject 或 operation.stopped。
|
|
171
|
+
|
|
172
|
+
| 消息 | 方向 |
|
|
173
|
+
| --- | --- |
|
|
174
|
+
| bind.request/accept/reject | 绑定双方;owner-first 正常成功不要求 accept 往返。 |
|
|
175
|
+
| transfer.request/ready | 原 owner → 新 owner、sub;accept/reject 反向回复。 |
|
|
176
|
+
| owner.ready | sub-first 的 owner 或 transfer 的新 owner → sub。 |
|
|
177
|
+
| relation.confirmed/sub.cleaned | bind/transfer 的 sub → 参与方;release 的 owner → sub,sub.cleaned 反向。 |
|
|
178
|
+
| operation.stopped | 已关联任务的参与方 → 其他参与方。 |
|
|
179
|
+
|
|
180
|
+
发送使用现有加密持久 `message.send`,不设 volatile TTL;来源只取消息层验证的 from_aid,不接受自发 P2P。ready/confirmed 只是提示,仍回源核对审批、固定上下文、授权和目标。
|
|
181
|
+
|
|
182
|
+
```mermaid
|
|
183
|
+
flowchart TD
|
|
184
|
+
A[push / pull / 重连 / 有序队列] --> B[解密,保留原 JSON 和已认证 from_aid]
|
|
185
|
+
B --> C{Ownership 控制类型吗}
|
|
186
|
+
C -->|否| D[普通应用消息]
|
|
187
|
+
C -->|是| E[检查词法、方向、固定任务上下文]
|
|
188
|
+
E -->|非法或不支持| F[消费控制消息,不作为聊天投递]
|
|
189
|
+
E -->|有效| G[按发送者、任务、action 去重,CAS 保存 inbox]
|
|
190
|
+
G -->|保存失败| H[抛错;保留原队列/游标,不 ACK]
|
|
191
|
+
G -->|保存成功| I[回源核验;失败保留已存待办]
|
|
192
|
+
I --> J[核验并持久保存后,才通知审批或推进]
|
|
193
|
+
J --> K[成功返回,delivery 才可移除消息、推进游标和 ACK]
|
|
194
|
+
F --> K
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Client 拦截点在 `_publishAppEvent('message.received') → _handleOwnershipMessage → receive`;解密原文由 [decrypt.ts](../../ts/src/v2/e2ee/decrypt.ts) 保留。只给 handler 写 await 不够,[delivery.ts](../../ts/src/client/delivery.ts) 的所有实际投递路径都须等待它。
|
|
198
|
+
|
|
199
|
+
```ts
|
|
200
|
+
const consumed = await workflow.receive(authenticatedFromAid, decryptedJsonText);
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
`sub.cleaned` 在保存 inbox 前额外双读 NS,须稳定 unbound/0、空关系字段且 ETag 相同;不可确认则抛错保留投递,仍有关系则消费提示但不确认清理。
|
|
204
|
+
|
|
205
|
+
## 10. 持久任务、审批与恢复
|
|
206
|
+
|
|
207
|
+
### 10.1 存储契约
|
|
208
|
+
|
|
209
|
+
TokenStore 提供 load/list/compareAndSwapOwnershipTask;不存在为 null,读取损坏与 CAS 失败为错误。新建 expectedRevision=null,更新比较原 revision 并递增。TS 使用每任务 SQLite 事务;进程内按 sub 串行,跨实例仍靠持久 CAS。
|
|
210
|
+
|
|
211
|
+
| 记录 | 必须保存 |
|
|
212
|
+
| --- | --- |
|
|
213
|
+
| 上下文/审批 | 固定任务 ID、发起方、参与 AID、角色、base/target;本端决定及各 AID 审批。 |
|
|
214
|
+
| 文件 | 起始双文件证据;本人已签全文、SHA、原 CAS;Stage 候选 raw/SHA/ETag;owner-first 提案原文/SHA。 |
|
|
215
|
+
| 转移授权 | 首次验证的完整授权摘要和实际 expires_at,恢复不替换或延期。 |
|
|
216
|
+
| inbox/outbox | 收件去重键;原回复、接收方、稳定 message_id 和发送进度。 |
|
|
217
|
+
| 完成/清理 | 真实验收状态、版本、锁、NS ETag、双文件摘要、本人的签名原件与原条件;独立清理授权和进度。 |
|
|
218
|
+
|
|
219
|
+
审批决定与回复原子保存后发送;完整签名文件和条件也先保存再发布。发件后清 outbox 失败允许原 message_id 重发,接收方幂等。已保存决定不可反转,同一 AID 的多角色合并,未决定的另一方仍可拒绝。
|
|
220
|
+
|
|
221
|
+
### 10.2 恢复顺序与失败重试
|
|
222
|
+
|
|
223
|
+
```mermaid
|
|
224
|
+
flowchart TD
|
|
225
|
+
A[恢复原身份,读取并验证原任务] --> B{记录和完成证据完整吗}
|
|
226
|
+
B -->|否| P[persistence_unavailable;保留记录]
|
|
227
|
+
B -->|是| C[按 sub 串行:processInbox → flush → 确认/推进/清理]
|
|
228
|
+
C --> D{fresh 事实与本任务原件能确认目标吗}
|
|
229
|
+
D -->|是| E[保存真实 completed 证据,补有效通知和清理]
|
|
230
|
+
D -->|依赖不可用| W[pending;保留原任务]
|
|
231
|
+
D -->|未提交目标| F{原条件、审批及期限仍有效吗}
|
|
232
|
+
F -->|待审批| G[重新通知,等待明确决定]
|
|
233
|
+
F -->|是| H[复用原签名字节与 CAS,只补未完成步骤]
|
|
234
|
+
F -->|真实冲突/过期| I[stopped;不覆盖后续文件]
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
文件发布的持久化顺序示例,省略的前后校验仍按 §4–7 执行:
|
|
238
|
+
|
|
239
|
+
```ts
|
|
240
|
+
task.files.agent = saved;
|
|
241
|
+
await task.persist();
|
|
242
|
+
const published = await fileDeps.submitAgentMdRaw(
|
|
243
|
+
task.sub_aid, saved.raw, saved.condition,
|
|
244
|
+
);
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
响应丢失先回源确认完整目标;仅同版本或某文件同 SHA 不足。已保存 published_etag 时必须匹配;尚未保存时仅在完整共识和本人原件匹配后补记。未提交且原条件有效才重传;不重签、不换 ETag、不延期。
|
|
248
|
+
|
|
249
|
+
flush 每条通知前 fresh 核对对应原/目标关系,陈旧通知持久移除,未知时保留。completed 后只补有效通知或条件清理,不重跑关系提交;历史完成不要求历史证书今天仍可签。
|
|
250
|
+
|
|
251
|
+
0.5.20/0.5.19 及更早任务保留原 operation、审批、字节和条件,不因缺后增字段一律重建。旧 expected_revision 无权威匹配证据时保持 unavailable,不能用当前 version 替代或从网络补造历史原件。reset 仅归档当前身份发起的未完成任务,保留远端文件,迟到消息不能复活。
|
|
252
|
+
|
|
253
|
+
### 10.3 CAS 冲突分类与恢复边界
|
|
254
|
+
|
|
255
|
+
| 条件层 | 结果与处理 |
|
|
256
|
+
| --- | --- |
|
|
257
|
+
| 本地 revision/浏览器 lease-fencing | persistence_unavailable;停止旧内存任务,后续恢复从存储重读。 |
|
|
258
|
+
| NS 原 If-Match/If-None-Match | 412→conflict,语义冲突也可为409;fresh 核对全文、SHA、ETag、锁、版本和本地原证据。 |
|
|
259
|
+
| Storage 原 expected_version | -32009→conflict;权威重读完整原件和版本,不刷新条件覆盖或删除。 |
|
|
260
|
+
|
|
261
|
+
远端冲突只有完整目标及本任务原证据精确匹配才可确认完成;网络未知保留 pending。真实变化停止旧写入,按当前事实重新取得明确同意并发起合法操作,不自动 merge、重签或放宽 CAS。
|
|
262
|
+
|
|
263
|
+
## 11. 三种流程与 self-owner
|
|
264
|
+
|
|
265
|
+
| 流程 | SDK 内部步骤 |
|
|
266
|
+
| --- | --- |
|
|
267
|
+
| sub-first bind | 无锁/Stage 预检 → 保存 sub 同意 → declareOwneraid Stage → owner 审批 → declareSubaid → NS fresh 验收原候选。 |
|
|
268
|
+
| owner-first bind | 无锁预检 → declareSubaid → request → sub 固定提案并同意 → declareOwneraid 直接提交。 |
|
|
269
|
+
| release | revokeSubaid 发布同版本 release → fresh 确认 → 通知 sub → 授权清理 revokeOwneraid。 |
|
|
270
|
+
| transfer | 收齐 sub/新 owner 同意 → transferOwneraid → 新 owner declareSubaid → sub declareOwneraid → fresh 确认和旧文件清理。 |
|
|
271
|
+
|
|
272
|
+
### 11.1 EC CLI 创建 sub 后,由 human owner 确认绑定
|
|
273
|
+
|
|
274
|
+
应用时序及 TS 调用见 [集成指南 §3](Ownership2.1-SDK应用集成指南.md#3-ec-cli-集成示例sub-发起human-owner-同意)。内部 Stage 分支必须保持:
|
|
275
|
+
|
|
276
|
+
```mermaid
|
|
277
|
+
flowchart LR
|
|
278
|
+
A[fresh 确认 Stage: 1] --> B[保存 sub 已同意的原件和原 CAS]
|
|
279
|
+
B --> C[条件 Stage PUT]
|
|
280
|
+
C --> D[响应确认 Stage: 1 和 pending]
|
|
281
|
+
D --> E[owner 发布匹配 declare]
|
|
282
|
+
E --> F[NS fresh CAS 清 pending,候选字节与 ETag 不变]
|
|
283
|
+
F --> G[locked;异步同步 Storage 名片副本]
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Stage 能力由 fresh Check 响应的 `X-AUN-Ownership-Stage: 1` 确认,Stage PUT 成功也须回该头及 pending;缺失即停止。pending 不授权。owner-first 不用 Stage,审批前固定提案 raw/SHA,提交前仍须精确匹配,正常成功无 bind.accept/owner.ready 往返。拒绝只条件清理本任务未锁原件,已验收或被替换则停止。
|
|
287
|
+
|
|
288
|
+
### 11.2 owner 释放与 sub 清理
|
|
289
|
+
|
|
290
|
+
release 保持 v,owner 可在 sub 离线时凭 fresh released/v 完成。sub 已清字段时,只有本任务原件严格关联的真实 unbound/0 才能完成,不能补造 released 或历史条件;事件 relation_version 使用实际验收版本,任务 base/target 仍为 v。
|
|
291
|
+
|
|
292
|
+
### 11.3 三方连续转移
|
|
293
|
+
|
|
294
|
+
审批齐全后固定转移授权字节和 expires_at,再发布旧版本 transfer_owner、新 owner 的 v+1 declare、sub 的 v+1 名片。NS 直接切换,不经过 released;期限只限制新提交,恢复不延期。协议允许独立乱序发布,SDK 默认顺序用于恢复,NS 不维护审批任务。
|
|
295
|
+
|
|
296
|
+
### 11.4 sub 的清理授权与 self-owner
|
|
297
|
+
|
|
298
|
+
自动清理只引用本人明确 accept、含 sub 角色且本人已签完整声明完全匹配的原 bind/transfer 记录。收到释放通知时 pending 原任务也可提供授权;无消息时仅已完成历史任务的恢复触发。清理原件、SHA 和原 CAS 独立持久保存;缺授权发 action_required,release 不接受审批 Facade。
|
|
299
|
+
|
|
300
|
+
self-owner 合并本端角色和决定,不发送自 P2P,仍分别签双文件并核验;human 禁止声明 owner,原/新 owner 相同不是有效转移。清理后重绑同一 owner,先清 sub 旧声明再发布新 declare。
|
|
301
|
+
|
|
302
|
+
## 12. 普通/群名片、注册与兼容边界
|
|
303
|
+
|
|
304
|
+
- 普通名片失败稿留本地;显式重试先检查保存的条件,再回源。缺条件不能因远端同字节而清待办;正文更新保留完整关系材料。重连不自动 PUT 普通 pending。
|
|
305
|
+
- 实体 pending 保存完整多签原文、原 CAS、固定 owner 和实体证书代际,应用显式重试;转移/rekey/解散后停止旧待办。现代上传取消额外 V2 授权,旧入口按协议 §2.5 隔离兼容;专属 create/transfer checkpoint 恢复不变。
|
|
306
|
+
- fresh 实体 GET 同时发 Check、no-cache、multi-v1,验证全部签块及当前实体代际,仍为 not_applicable。独立 AIDStore 的 Python/Go 实体上传需注入权威 owner resolver,TS/JS 默认经 fresh NS/PKI 核对。
|
|
307
|
+
- 普通 agent 注册 owner 可选;有 owner 时固定 registration_intent ID,初始名片不写关系,连接后续跑绑定。注册成功不等于关系完成。
|
|
308
|
+
- 新服务端保留旧认证、普通名片和隔离 legacy owner 操作;新 SDK 2.1 操作不兼容旧服务端。旧 proof 或 metadata 不当作 unbound 或当前授权,不能借升级清空锁。
|
|
309
|
+
|
|
310
|
+
## 13. 跨语言 TDD 与有序验收
|
|
311
|
+
|
|
312
|
+
先通过 [共同向量](../../tests/vectors/ownership_v21/vectors.json),再按下表接线;TS 入口见 [conformance](../../ts/tests/conformance/ownership_v21.test.ts)、[文件测试](../../ts/tests/unit/ownership-v21.test.ts) 和 [Workflow 测试](../../ts/tests/unit/ownership-workflow.test.ts)。随机 ECDSA 不要求签名值一致,要求覆盖字节和跨端验签一致。
|
|
313
|
+
|
|
314
|
+
| 顺序 | 必验边界 |
|
|
315
|
+
| --- | --- |
|
|
316
|
+
| 文件与密码 | 双角色、严格词法、字节限制、DER、多签、当前证书;invalid/unavailable 分类。 |
|
|
317
|
+
| 权威适配 | NS 原条件/可靠不存在、Storage 完整发布/删除 CAS、fresh 稳定性和一次重查。 |
|
|
318
|
+
| 持久编排/实际收件 | 审批/outbox 原子、消息去重、持久成功前不移除队列/推进游标/ACK。 |
|
|
319
|
+
| 中断恢复 | 各提交前后丢响应、同意后断线、过期、后续关系、清理失败;原字节和原条件不变。 |
|
|
320
|
+
| 网络与持久 | 单域 → E2E → cross-SDK → 双域;轮换角色,单独记录真实进程重启和服务数据库/副本证据。 |
|
|
321
|
+
|
|
322
|
+
失败即停,修复失败项后从检查点续跑;已通过且不受影响的项不重跑。命令见 [测试指南](../aun测试运行指南.md),历史验收范围见 [TDD 账本](Ownership2.1-TDD分阶段实施计划.md)。单元通过不代替真实浏览器、跨域或跨进程恢复验收。
|