@c956180462/awbs 0.0.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/AWBS_CORE_DESIGN.md +983 -0
- package/AWBS_CURRENT_FEATURES.md +463 -0
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/TASK_001_VIEW_AUTHORITY.md +446 -0
- package/TASK_003_AUTHORITY_LEDGER_AND_DB_AUDIT.md +268 -0
- package/TASK_004_TRUSTED_AUTHORITY_LAYER.md +547 -0
- package/TASK_005_AUTHORITY_SESSION.md +218 -0
- package/TASK_006_TRUST_BOUNDARY_HARDENING.md +381 -0
- package/TASK_007_TRUSTED_OPERATION_ENTRY.md +129 -0
- package/bin/awbs.js +2 -0
- package/docs/DEVELOPMENT_LEARNING.md +319 -0
- package/docs/FULL_CHAIN.md +295 -0
- package/docs/PRODUCT.md +188 -0
- package/docs/USAGE.md +294 -0
- package/package.json +45 -0
- package/src/adapters/file-summary-store.ts +88 -0
- package/src/adapters/git-cli.ts +107 -0
- package/src/adapters/local-authority-session.ts +606 -0
- package/src/adapters/local-file-database.ts +199 -0
- package/src/adapters/sealed-authority.ts +725 -0
- package/src/adapters/session-authority-client.ts +176 -0
- package/src/adapters/sqlite-index-store.ts +176 -0
- package/src/cli.ts +491 -0
- package/src/domain/authority-types.ts +194 -0
- package/src/domain/constants.ts +11 -0
- package/src/domain/errors.ts +6 -0
- package/src/domain/hash.ts +27 -0
- package/src/domain/path-policy.ts +36 -0
- package/src/domain/paths.ts +65 -0
- package/src/domain/session-proof.ts +140 -0
- package/src/domain/session-types.ts +101 -0
- package/src/domain/types.ts +94 -0
- package/src/ports/authority-session.ts +8 -0
- package/src/ports/authority.ts +26 -0
- package/src/ports/file-database.ts +18 -0
- package/src/ports/git.ts +23 -0
- package/src/ports/index-store.ts +7 -0
- package/src/ports/summary-store.ts +16 -0
- package/src/runtime.ts +56 -0
- package/src/session-entry.ts +1 -0
- package/src/usecases/authority.ts +53 -0
- package/src/usecases/changeset.ts +437 -0
- package/src/usecases/db.ts +192 -0
- package/src/usecases/index.ts +136 -0
- package/src/usecases/init.ts +48 -0
- package/src/usecases/ledger.ts +146 -0
- package/src/usecases/session.ts +48 -0
- package/src/usecases/trusted-chain.ts +56 -0
- package/src/usecases/view.ts +166 -0
|
@@ -0,0 +1,446 @@
|
|
|
1
|
+
# TASK 001: View Authority / 视图鉴权器
|
|
2
|
+
|
|
3
|
+
## 目标
|
|
4
|
+
|
|
5
|
+
在 AWBS v0 的工作空间视图机制之上,增加一套视图鉴权器,使每个衍生工作区的读写声明成为可验证、不可篡改、可追溯的视图契约。
|
|
6
|
+
|
|
7
|
+
本任务不追求操作系统级文件权限,也不做细粒度文件 ACL。它要解决的是 AWBS 自身的写入制度问题:
|
|
8
|
+
|
|
9
|
+
> 只读路径被修改时,changeset 永远不能自动入仓;如果要修改该路径,必须重新申请一个新的视图,并在新视图中把该路径声明为可写。
|
|
10
|
+
|
|
11
|
+
本任务也不追求绝对安全边界。它的目标不是让 agent 在理论上永远拿不到签名能力,而是提高 agent 绕过 AWBS 工作流的成本:正常工作空间中没有现成的 key;正常任务链路中不会暴露签名能力;agent 如果要伪造视图契约,必须主动偏离任务、跨越多层实现细节并寻找派生链路。
|
|
12
|
+
|
|
13
|
+
## 术语说明
|
|
14
|
+
|
|
15
|
+
本文档中提到的 seal,统一理解为“密封包”或“密封契约”。
|
|
16
|
+
|
|
17
|
+
它不是一个神秘的新数据库,也不是普通压缩包。它指的是:
|
|
18
|
+
|
|
19
|
+
> 系统真正读取和信任的那份数据,被加密保存,并且带有完整性校验。明文展示文件可以给人看,但系统不信明文展示文件。
|
|
20
|
+
|
|
21
|
+
也就是说:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
明文镜像
|
|
25
|
+
给人看,可以被重新生成,不作为事实源。
|
|
26
|
+
|
|
27
|
+
密封包
|
|
28
|
+
给系统信,不能被随便改;一旦被改,解密或校验会失败。
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 核心规则
|
|
32
|
+
|
|
33
|
+
- 每个 view 创建时生成唯一 UUID。
|
|
34
|
+
- view 的读写权限形成 view contract。
|
|
35
|
+
- view contract 只能由 AWBS View Authority 创建。
|
|
36
|
+
- view contract 创建后不可修改。
|
|
37
|
+
- view 只允许 create 和 revoke,不允许 update。
|
|
38
|
+
- revoke 不应物理删除历史 contract,而应追加撤销事件。
|
|
39
|
+
- `changeset collect` 和 `changeset apply` 都必须回查 view contract。
|
|
40
|
+
- 只要某个路径不在 contract 的 `writePaths` 中,该路径变化就永远不能 apply。
|
|
41
|
+
- 人类审阅不能 override 只读路径修改;要修改只读路径,只能重新创建新 view。
|
|
42
|
+
|
|
43
|
+
## 建议目录
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
.awbs/
|
|
47
|
+
authority/
|
|
48
|
+
catalog.seal.json
|
|
49
|
+
catalog.mirror.json
|
|
50
|
+
repo.json
|
|
51
|
+
views/
|
|
52
|
+
<viewId>/
|
|
53
|
+
contract.seal.json
|
|
54
|
+
mirror.json
|
|
55
|
+
receipt.json
|
|
56
|
+
view-events.jsonl
|
|
57
|
+
|
|
58
|
+
private/
|
|
59
|
+
local.json
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`authority/` 应进入 Git,成为长期事实源。
|
|
63
|
+
|
|
64
|
+
`private/` 必须进入 `.gitignore`,用于保存本地派生材料或运行状态。这里不应保存最终 K,也不应提供一个名为 `authority.key` 的明文钥匙文件。
|
|
65
|
+
|
|
66
|
+
## Authority Catalog / 鉴权目录总账
|
|
67
|
+
|
|
68
|
+
001 的 View Authority 不应只记录“某一个 view 的 read/write 权限”。它应该承担更接近数据库 catalog 的职责。
|
|
69
|
+
|
|
70
|
+
在普通数据库里,系统会知道:
|
|
71
|
+
|
|
72
|
+
```text
|
|
73
|
+
这个数据库有哪些表
|
|
74
|
+
每个表有哪些列
|
|
75
|
+
每个列是什么类型
|
|
76
|
+
哪些结构当前有效
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
AWBS 是文件系统数据库,所以它对应的 catalog 应该记录:
|
|
80
|
+
|
|
81
|
+
```text
|
|
82
|
+
当前数据库有哪些受管理目录
|
|
83
|
+
这些目录叫什么名字
|
|
84
|
+
目录之间是什么层级关系
|
|
85
|
+
每个目录在 AWBS 中的资源身份是什么
|
|
86
|
+
每个目录默认是什么权限语义
|
|
87
|
+
哪些 view 使用了哪些目录
|
|
88
|
+
每个 view 中这些目录分别是 read 还是 write
|
|
89
|
+
哪些 view 仍然 active
|
|
90
|
+
哪些 view 已经 revoked
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
因此,001 的鉴权器应当维护一份“鉴权目录总账”:
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
.awbs/authority/catalog.seal.json
|
|
97
|
+
系统真正读取和信任的密封 catalog。
|
|
98
|
+
|
|
99
|
+
.awbs/authority/catalog.mirror.json
|
|
100
|
+
给人类和工具查看的明文 catalog 镜像,不作为事实源。
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
`catalog.seal.json` 可以理解为 AWBS 文件系统数据库的结构描述和权限描述。它不是业务内容本身,不保存正文、报告、图片或仿真结果;它保存的是 AWBS 对数据库结构、资源和视图权限的认知。
|
|
104
|
+
|
|
105
|
+
建议 catalog 解密后的逻辑内容包括:
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"schemaVersion": 1,
|
|
110
|
+
"repoId": "uuid",
|
|
111
|
+
"catalogVersion": 1,
|
|
112
|
+
"createdAt": "2026-05-20T00:00:00.000Z",
|
|
113
|
+
"resources": [
|
|
114
|
+
{
|
|
115
|
+
"resourceId": "res_A",
|
|
116
|
+
"path": "A",
|
|
117
|
+
"kind": "directory",
|
|
118
|
+
"parent": null,
|
|
119
|
+
"defaultMode": "read"
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"resourceId": "res_B",
|
|
123
|
+
"path": "B",
|
|
124
|
+
"kind": "directory",
|
|
125
|
+
"parent": null,
|
|
126
|
+
"defaultMode": "read"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"views": [
|
|
130
|
+
{
|
|
131
|
+
"viewId": "uuid",
|
|
132
|
+
"status": "active",
|
|
133
|
+
"baseCommit": "abc123",
|
|
134
|
+
"readPaths": ["A"],
|
|
135
|
+
"writePaths": ["B"]
|
|
136
|
+
}
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
这里的 `defaultMode` 不是操作系统权限,而是 AWBS 生成 view 时的默认语义。真正某次工作能不能写,仍然以该 view contract 中的 `writePaths` 为准。
|
|
142
|
+
|
|
143
|
+
catalog 的明文镜像可以被人看,也可以被工具展示;但如果人或 agent 手动修改 `catalog.mirror.json`,不会改变系统行为。系统行为只以 `catalog.seal.json` 解密和校验后的内容为准。
|
|
144
|
+
|
|
145
|
+
catalog 也不应该随意原地修改。对于结构变化和 view 变化,优先采用事件化记录:
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
RESOURCE_ADDED
|
|
149
|
+
RESOURCE_REMOVED
|
|
150
|
+
VIEW_CREATED
|
|
151
|
+
VIEW_REVOKED
|
|
152
|
+
CATALOG_RESEALED
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
这样未来可以追溯:某个目录什么时候进入 AWBS 管理,某个 view 什么时候创建,什么时候撤销。
|
|
156
|
+
|
|
157
|
+
001 的具体 JSON 字段由实现固定,后续不应随意改名或改语义。为了保留演化空间,catalog、view contract 和 receipt 都应保留 `ext` 字段,用于未来扩展非核心信息。
|
|
158
|
+
|
|
159
|
+
## 视图契约
|
|
160
|
+
|
|
161
|
+
视图契约的逻辑内容应当可以通过明文镜像查看,便于审计和排错。但系统不应直接信任明文镜像。真正的不可篡改性由密封契约保证。
|
|
162
|
+
|
|
163
|
+
示例:
|
|
164
|
+
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"schemaVersion": 1,
|
|
168
|
+
"viewId": "uuid",
|
|
169
|
+
"baseCommit": "abc123",
|
|
170
|
+
"createdAt": "2026-05-19T00:00:00.000Z",
|
|
171
|
+
"status": "active",
|
|
172
|
+
"readPaths": ["A"],
|
|
173
|
+
"writePaths": ["B"],
|
|
174
|
+
"sources": [
|
|
175
|
+
{
|
|
176
|
+
"path": "A",
|
|
177
|
+
"sha256": "...",
|
|
178
|
+
"mode": "read"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"path": "B",
|
|
182
|
+
"sha256": "...",
|
|
183
|
+
"mode": "write"
|
|
184
|
+
}
|
|
185
|
+
]
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## 密封视图契约
|
|
190
|
+
|
|
191
|
+
在进一步设计中,AWBS 可以把 view contract 分成两个层次:
|
|
192
|
+
|
|
193
|
+
```text
|
|
194
|
+
sealed contract
|
|
195
|
+
系统真正读取和信任的密封契约。
|
|
196
|
+
|
|
197
|
+
mirror contract
|
|
198
|
+
给人类和工具查看的明文镜像,不作为事实源。
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
建议目录:
|
|
202
|
+
|
|
203
|
+
```text
|
|
204
|
+
.awbs/
|
|
205
|
+
authority/
|
|
206
|
+
views/
|
|
207
|
+
<viewId>/
|
|
208
|
+
contract.seal.json
|
|
209
|
+
mirror.json
|
|
210
|
+
receipt.json
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
其中:
|
|
214
|
+
|
|
215
|
+
- `contract.seal.json` 是真正的视图契约事实源。
|
|
216
|
+
- `mirror.json` 是展示缓存,可以被系统从 seal 重新生成。
|
|
217
|
+
- `receipt.json` 保存非敏感元信息,例如 viewId、算法版本、创建时间、contract hash。
|
|
218
|
+
|
|
219
|
+
系统规则:
|
|
220
|
+
|
|
221
|
+
- `changeset collect` 和 `changeset apply` 永远读取 `contract.seal.json`。
|
|
222
|
+
- `mirror.json` 只用于展示,不参与权限判断。
|
|
223
|
+
- 人类或 agent 修改 `mirror.json` 没有写入效果。
|
|
224
|
+
- 如果 `mirror.json` 与 seal 解出的 contract 不一致,系统应报告 mirror drift,或者用 seal 自动重建 mirror。
|
|
225
|
+
- 001 默认采用自动重建策略:一旦发现 mirror drift,系统直接用密封契约解出的真实内容覆盖 mirror。
|
|
226
|
+
- 如果 `contract.seal.json` 被修改,解密或认证应失败,该 view 立即不可用。
|
|
227
|
+
- seal 损坏后,如果 Git 历史中有未损坏版本,可以通过 Git 恢复。
|
|
228
|
+
|
|
229
|
+
密封契约不应只是普通加密,而应使用带完整性认证的加密方式,例如:
|
|
230
|
+
|
|
231
|
+
```text
|
|
232
|
+
sealed = AES-256-GCM(K, canonical_json(view_contract), aad)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
或:
|
|
236
|
+
|
|
237
|
+
```text
|
|
238
|
+
sealed = ChaCha20-Poly1305(K, canonical_json(view_contract), aad)
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
这里的 `aad` 是不加密但参与认证的上下文,例如:
|
|
242
|
+
|
|
243
|
+
```text
|
|
244
|
+
viewId
|
|
245
|
+
repoId
|
|
246
|
+
schemaVersion
|
|
247
|
+
baseCommit
|
|
248
|
+
algorithmVersion
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
这样,密文或认证上下文只要被改动,验证就会失败。系统不能在失败时 fallback 到 `mirror.json`。
|
|
252
|
+
|
|
253
|
+
这套设计的核心是:
|
|
254
|
+
|
|
255
|
+
> 明文给人看,密文给系统信。
|
|
256
|
+
|
|
257
|
+
它不宣称强安全隔离,而是提高 agent 绕过 AWBS 视图契约的成本。agent 想伪造权限,不能只改一个明文 JSON;它必须主动理解 sealed contract 的格式、密钥派生链、canonical JSON、AEAD 算法和本机派生材料。
|
|
258
|
+
|
|
259
|
+
## 签名与密封机制
|
|
260
|
+
|
|
261
|
+
v1 可以先采用 HMAC-SHA256 作为完整性校验基础。如果采用密封契约,则在此基础上使用带认证的加密方式,例如 AES-256-GCM。
|
|
262
|
+
|
|
263
|
+
```text
|
|
264
|
+
K = derive_authority_key(repo_context, local_context, runtime_context)
|
|
265
|
+
signature = HMAC_SHA256(K, canonical_json(view_contract)) # 签名模式
|
|
266
|
+
sealed = AES-256-GCM(K, canonical_json(view_contract), aad) # 密封模式
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
其中:
|
|
270
|
+
|
|
271
|
+
- `K` 是运行时派生出来的签名 key,不落盘保存。
|
|
272
|
+
- `repo_context` 来自 `.awbs/authority/repo.json`,例如 `repoId`、`authoritySalt`、算法版本。
|
|
273
|
+
- `local_context` 来自仓库外或 `.awbs/private/local.json` 中的本机材料,不进入 Git,也不投影到 workspace。
|
|
274
|
+
- `runtime_context` 来自 AWBS authority 的内部实现和运行环境。
|
|
275
|
+
- `view_contract` 是视图契约的逻辑内容。
|
|
276
|
+
- 在签名模式中,`view_contract` 可以明文进入 Git,并由 `.sig` 校验。
|
|
277
|
+
- 在密封模式中,系统信任的是 `contract.seal.json`,明文 `mirror.json` 只是展示缓存。
|
|
278
|
+
- `canonical_json` 是稳定序列化后的 JSON,避免字段顺序或空格变化影响签名。
|
|
279
|
+
- `.sig` 文件或 seal envelope 保存算法、key id、contract hash、nonce、认证 tag 等必要元信息。
|
|
280
|
+
|
|
281
|
+
这套机制不是强安全边界,而是高摩擦鉴权机制。只要 agent 拥有与 authority 完全相同的本机读写和执行权限,并且主动寻找所有派生材料和派生逻辑,它理论上可以复现 K。AWBS v1 的目标是让这种行为不出现在正常 agent 工作流中,而不是宣称本地同权限强 agent 永远无法破解。
|
|
282
|
+
|
|
283
|
+
后续如果需要多人协作或跨机器验证,可以升级为 Ed25519 非对称签名:
|
|
284
|
+
|
|
285
|
+
```text
|
|
286
|
+
private key 签名
|
|
287
|
+
public key 验证
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 验证流程
|
|
291
|
+
|
|
292
|
+
创建 view 时:
|
|
293
|
+
|
|
294
|
+
```text
|
|
295
|
+
生成 viewId
|
|
296
|
+
生成 view contract
|
|
297
|
+
authority 在内存中派生 K
|
|
298
|
+
使用 K 对 contract 进行签名或密封
|
|
299
|
+
写入 .awbs/authority/views/<viewId>/contract.seal.json
|
|
300
|
+
写入 .awbs/authority/views/<viewId>/mirror.json
|
|
301
|
+
更新 catalog.seal.json
|
|
302
|
+
更新 catalog.mirror.json
|
|
303
|
+
追加 VIEW_CREATED 事件
|
|
304
|
+
copy 生成 workspace
|
|
305
|
+
workspace/.awbs-view.json 只记录 viewId 和展示信息
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
收集 changeset 时:
|
|
309
|
+
|
|
310
|
+
```text
|
|
311
|
+
读取 workspace/.awbs-view.json 得到 viewId
|
|
312
|
+
读取 authority/views/<viewId>/contract.seal.json
|
|
313
|
+
解密并认证 sealed contract
|
|
314
|
+
回查 catalog.seal.json
|
|
315
|
+
确认 view 未被 revoke
|
|
316
|
+
使用 contract 中的 writePaths 判断每个 change 是否 allowed
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
应用 changeset 时:
|
|
320
|
+
|
|
321
|
+
```text
|
|
322
|
+
读取 changeset manifest
|
|
323
|
+
根据 viewId 回查 view contract
|
|
324
|
+
再次解密并认证 sealed contract
|
|
325
|
+
再次回查 catalog.seal.json
|
|
326
|
+
再次检查每个 change.path 是否在 writePaths 中
|
|
327
|
+
若存在只读路径变化,永远拒绝 apply
|
|
328
|
+
若 view 已 revoke,拒绝 apply
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## 被篡改时的行为
|
|
332
|
+
|
|
333
|
+
如果 `authority/views/<viewId>/contract.seal.json` 被人手动修改:
|
|
334
|
+
|
|
335
|
+
- 解密或认证失败。
|
|
336
|
+
- 该 view 进入不可用状态。
|
|
337
|
+
- 基于该 view 的 workspace 不能 collect 出可用 changeset。
|
|
338
|
+
- 基于该 view 的 changeset 不能 apply。
|
|
339
|
+
- 系统应明确报错,不得伪装成功。
|
|
340
|
+
|
|
341
|
+
如果 `authority/views/<viewId>/mirror.json` 被人手动修改:
|
|
342
|
+
|
|
343
|
+
- 不改变系统行为。
|
|
344
|
+
- 系统发现 mirror drift 后,应直接用密封契约重新生成 mirror。
|
|
345
|
+
- collect/apply 不能 fallback 到 mirror。
|
|
346
|
+
|
|
347
|
+
如果 Git 历史中有未被篡改的旧版本,可以通过 Git 恢复该 contract 文件。
|
|
348
|
+
|
|
349
|
+
如果本地派生材料丢失:
|
|
350
|
+
|
|
351
|
+
- 可能导致旧签名无法继续验证。
|
|
352
|
+
- 应视为本机 authority 损坏或迁移不完整。
|
|
353
|
+
- 可以从备份恢复本地派生材料,或执行明确的 authority rotate / reissue 流程。
|
|
354
|
+
|
|
355
|
+
如果 agent 主动找到全部派生材料和派生逻辑:
|
|
356
|
+
|
|
357
|
+
- 它可能复现 K。
|
|
358
|
+
- 这属于同权限强 agent 绕过流程,不是 AWBS v1 要宣称完全防住的范围。
|
|
359
|
+
- 后续如果要继续提高强度,应将 authority 移到 agent 无法直接读取的进程、用户、服务或机器边界之外。
|
|
360
|
+
|
|
361
|
+
## v1 实现边界
|
|
362
|
+
|
|
363
|
+
- 不实现操作系统只读属性。
|
|
364
|
+
- 不实现文件级 ACL。
|
|
365
|
+
- 不实现人类 override。
|
|
366
|
+
- 不允许 update view contract。
|
|
367
|
+
- 只实现 create / revoke / verify。
|
|
368
|
+
- collect 和 apply 都必须 verify。
|
|
369
|
+
- apply 不能只相信 changeset 自己的 `status` 字段,必须重新按 contract 验证。
|
|
370
|
+
- 不保存最终 K。
|
|
371
|
+
- 不把 authority 派生材料投影到 workspace。
|
|
372
|
+
- 不把签名能力暴露给普通 agent 命令链路。
|
|
373
|
+
|
|
374
|
+
## Revoke 边界
|
|
375
|
+
|
|
376
|
+
撤销 view 只改变这个 view 未来是否还能作为工作入口和写入依据,不处理任何历史数据。
|
|
377
|
+
|
|
378
|
+
也就是说:
|
|
379
|
+
|
|
380
|
+
- 不删除旧 workspace。
|
|
381
|
+
- 不删除旧 changeset。
|
|
382
|
+
- 不回滚已经 apply 的 changeset。
|
|
383
|
+
- 不修改 Git 历史。
|
|
384
|
+
- 不删除或修改已经入仓的数据。
|
|
385
|
+
|
|
386
|
+
这和 SQL 删除 view 不会删除底层 table 是同一个道理。view 是访问视图,不是数据本体。撤销 view 只意味着:
|
|
387
|
+
|
|
388
|
+
```text
|
|
389
|
+
以后基于该 view 的 collect / apply 必须拒绝。
|
|
390
|
+
如果还要继续工作,必须重新创建一个新的 view。
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
## 当前实现状态
|
|
394
|
+
|
|
395
|
+
001 已按第一版落地为可运行 CLI 能力。
|
|
396
|
+
|
|
397
|
+
已完成:
|
|
398
|
+
|
|
399
|
+
- `awbs init` 初始化 `.awbs/authority` 和 `.awbs/private/local.json`。
|
|
400
|
+
- `awbs view create` 创建 UUID view,并写入密封视图契约、明文镜像、receipt 和鉴权目录总账。
|
|
401
|
+
- `awbs view inspect <viewId>` 读取密封契约并展示 view 状态。
|
|
402
|
+
- `awbs view revoke <viewId>` 通过更新鉴权目录总账撤销 view。
|
|
403
|
+
- `awbs authority verify` 验证 catalog 和所有 view contract,并自动修复 mirror drift。
|
|
404
|
+
- `awbs authority repair-mirrors` 从密封包重建所有明文镜像。
|
|
405
|
+
- `changeset collect` 不再信任 workspace manifest 的权限字段,而是回查密封 view contract。
|
|
406
|
+
- `changeset apply` 再次回查密封 view contract,并重新判断每个变更是否落在 writePaths 内。
|
|
407
|
+
- `changeset apply` 会验证 authority 状态,并把合法的 `.awbs/authority` 变更一起纳入 Git commit。
|
|
408
|
+
|
|
409
|
+
测试已覆盖:
|
|
410
|
+
|
|
411
|
+
- view 创建后 authority 文件齐全。
|
|
412
|
+
- workspace `.awbs-view.json` 被改写也不能扩大权限。
|
|
413
|
+
- view `mirror.json` 被修改后会自动从密封契约重建。
|
|
414
|
+
- `contract.seal.json` 被篡改后 collect/apply 失败。
|
|
415
|
+
- 只读路径修改产生 invalid changeset,不能 apply。
|
|
416
|
+
- view revoke 后,后续 collect/apply 拒绝。
|
|
417
|
+
- 已经 apply 的数据不会因为 revoke 被回滚或删除。
|
|
418
|
+
- authority verify / repair-mirrors 能检查并修复明文镜像。
|
|
419
|
+
|
|
420
|
+
## 后续索引与摘要接口补充
|
|
421
|
+
|
|
422
|
+
001 完成后,索引层又补了一次边界拆分,并在 002 中升级为磁盘 SQLite + FTS5:
|
|
423
|
+
|
|
424
|
+
- 索引查询走嵌入式磁盘 SQLite。
|
|
425
|
+
- 索引持久文件是 `.awbs/index/files.sqlite`。
|
|
426
|
+
- FTS5 索引 `path` 和 `summary`。
|
|
427
|
+
- 旧 `.awbs/index/files.jsonl` 只作为 v0 迁移输入使用。
|
|
428
|
+
- 摘要不由 AWBS 内置 AI 模型生成。
|
|
429
|
+
- AWBS 只提供摘要读写接口,由外部业务应用或 agent 写入摘要。
|
|
430
|
+
|
|
431
|
+
新增 CLI:
|
|
432
|
+
|
|
433
|
+
```text
|
|
434
|
+
awbs summary set <path> --text <summary>
|
|
435
|
+
awbs summary set <path> --file <file>
|
|
436
|
+
awbs summary get <path> [--json]
|
|
437
|
+
awbs summary list [--json]
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
外部摘要保存在:
|
|
441
|
+
|
|
442
|
+
```text
|
|
443
|
+
.awbs/summaries/files.jsonl
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
`index rebuild` 会优先使用外部摘要;没有外部摘要时,只生成机械 fallback 摘要,不在底座里伪装业务理解。
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
# AWBS 003:可信数据链与可信重建
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
003 的核心不是“清理 Git 脏提交”,而是建立 **AWBS Trusted Chain / AWBS 可信数据链**。
|
|
6
|
+
|
|
7
|
+
AWBS 认证数据库不再等于普通 Git `HEAD`,也不等于当前工作区文件。AWBS 认证数据库只等于可信链头对应的 Git tree。
|
|
8
|
+
|
|
9
|
+
可信链规则是:
|
|
10
|
+
|
|
11
|
+
```text
|
|
12
|
+
trustedCommit(Tn)
|
|
13
|
+
-> view projection 基于 Tn
|
|
14
|
+
-> changeset 声明基于 Tn
|
|
15
|
+
-> apply 只把 changeset 写入 Tn
|
|
16
|
+
-> 生成 trustedCommit(Tn+1)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
任何不来自 AWBS `changeset apply` 的提交、文件写入或 Git 操作,都不会自动进入 AWBS 可信链。它们可以被 `db audit` 报告,也可以通过可信重建排除,但 AWBS 不承认它们是认证数据库的一部分。
|
|
20
|
+
|
|
21
|
+
## Design Position
|
|
22
|
+
|
|
23
|
+
003 后,AWBS 的数据库事实源分成两层:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
Git repository
|
|
27
|
+
保存所有普通 Git 对象、提交、分支和工作区状态。
|
|
28
|
+
|
|
29
|
+
AWBS trusted chain
|
|
30
|
+
只保存 AWBS 承认的数据库状态推进链。
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Git 仍然是底层版本管理器,但 Git 当前 `HEAD` 只是普通工作状态,不再自动代表 AWBS 数据库状态。
|
|
34
|
+
|
|
35
|
+
AWBS 当前认证数据库头由两部分共同确定:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
.awbs/authority/ledger.seal.json
|
|
39
|
+
refs/awbs/trusted
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
其中:
|
|
43
|
+
|
|
44
|
+
- `ledger.seal.json` 是 sealed trusted ledger。
|
|
45
|
+
- `ledger.mirror.json` 是给人看的明文镜像,可重建,不作为事实源。
|
|
46
|
+
- `ledger-events.jsonl` 是诊断事件日志。
|
|
47
|
+
- `refs/awbs/trusted` 指向当前 AWBS 认证数据库头。
|
|
48
|
+
|
|
49
|
+
## Why Git User Is Not Enough
|
|
50
|
+
|
|
51
|
+
Git commit 中的这些字段都可以被本地调用者任意设置:
|
|
52
|
+
|
|
53
|
+
```text
|
|
54
|
+
author.name
|
|
55
|
+
author.email
|
|
56
|
+
committer.name
|
|
57
|
+
committer.email
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
例如:
|
|
61
|
+
|
|
62
|
+
```powershell
|
|
63
|
+
git -c user.name="A" -c user.email="a@example.com" commit -m "..."
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
因此:
|
|
67
|
+
|
|
68
|
+
- 不能说“只允许某个 Git 用户名提交”。
|
|
69
|
+
- 不能通过 Git 用户名判断合法写入。
|
|
70
|
+
- GitHub 登录身份只能说明谁 push 了 commit,不等于 commit author 可信。
|
|
71
|
+
- signed commit 可以提高外部身份可信度,但不等于 AWBS 写入流程可信。
|
|
72
|
+
|
|
73
|
+
AWBS 需要自己的可信数据链,而不是把 Git 用户名当权限系统。
|
|
74
|
+
|
|
75
|
+
## Authority Ledger Layout
|
|
76
|
+
|
|
77
|
+
003 增加:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
.awbs/
|
|
81
|
+
authority/
|
|
82
|
+
ledger.seal.json
|
|
83
|
+
ledger.mirror.json
|
|
84
|
+
ledger-events.jsonl
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
密封账本解密后包含:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"schemaVersion": 1,
|
|
92
|
+
"repoId": "uuid",
|
|
93
|
+
"ledgerVersion": 1,
|
|
94
|
+
"createdAt": "iso time",
|
|
95
|
+
"updatedAt": "iso time",
|
|
96
|
+
"headEntryId": "uuid",
|
|
97
|
+
"entries": [],
|
|
98
|
+
"ext": {}
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
每条 entry 至少包含:
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"schemaVersion": 1,
|
|
107
|
+
"entryId": "uuid",
|
|
108
|
+
"kind": "bootstrap | changeset",
|
|
109
|
+
"parentTrustedCommit": "git commit",
|
|
110
|
+
"baseCommit": "git commit",
|
|
111
|
+
"changesetId": "changeset_xxx",
|
|
112
|
+
"viewId": "uuid",
|
|
113
|
+
"createdAt": "iso time",
|
|
114
|
+
"appliedPaths": [],
|
|
115
|
+
"changesetManifestHash": "sha256:...",
|
|
116
|
+
"authorityContractHash": "sha256:...",
|
|
117
|
+
"operationHash": "sha256:...",
|
|
118
|
+
"ext": {}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`resultCommit` 不写进同一个 sealed entry。原因是 Git commit hash 由 commit 内容决定,如果账本文件里预先写入 result commit hash,会形成自引用。
|
|
123
|
+
|
|
124
|
+
当前实现的策略是:
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
sealed ledger entry
|
|
128
|
+
记录可提前确定的操作事实。
|
|
129
|
+
|
|
130
|
+
Git commit trailer
|
|
131
|
+
记录 AWBS-Ledger-Entry 和 AWBS-Operation-Hash。
|
|
132
|
+
|
|
133
|
+
refs/awbs/trusted
|
|
134
|
+
指向包含最新 sealed ledger entry 的认证数据库提交。
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Bootstrap
|
|
138
|
+
|
|
139
|
+
003 新增:
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
awbs ledger bootstrap
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
bootstrap 要求当前 Git `HEAD` 存在,并创建第一条可信链记录。
|
|
146
|
+
|
|
147
|
+
这一步会:
|
|
148
|
+
|
|
149
|
+
1. 读取当前 Git `HEAD` 作为 `parentTrustedCommit`。
|
|
150
|
+
2. 写入第一份 sealed ledger。
|
|
151
|
+
3. 创建一个 AWBS bootstrap commit。
|
|
152
|
+
4. 将 `refs/awbs/trusted` 指向 bootstrap commit。
|
|
153
|
+
|
|
154
|
+
从这一刻开始,AWBS 数据库头不再由普通 `HEAD` 决定,而由 `refs/awbs/trusted` 决定。
|
|
155
|
+
|
|
156
|
+
## View / Index / Apply Behavior
|
|
157
|
+
|
|
158
|
+
003 后,核心流程变成:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
view create
|
|
162
|
+
从 currentTrustedCommit 的 Git tree 投影文件。
|
|
163
|
+
不读取当前污染工作区。
|
|
164
|
+
|
|
165
|
+
index rebuild
|
|
166
|
+
扫描 currentTrustedCommit 的 Git tree。
|
|
167
|
+
不把当前工作区污染文件写入索引。
|
|
168
|
+
|
|
169
|
+
changeset collect
|
|
170
|
+
比较 view baseline 和 workspace 当前状态。
|
|
171
|
+
changeset.baseCommit 来自 sealed view contract。
|
|
172
|
+
|
|
173
|
+
changeset apply
|
|
174
|
+
只接受 baseCommit 等于 currentTrustedCommit 的 valid changeset。
|
|
175
|
+
只读路径违规永远拒绝。
|
|
176
|
+
成功后写入业务文件变化、sealed ledger entry,并推进 refs/awbs/trusted。
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
如果当前工作区干净且 `HEAD` 正好等于 currentTrustedCommit,apply 可以在当前工作区原地提交,方便普通使用。
|
|
180
|
+
|
|
181
|
+
如果当前 Git `HEAD` 已经被外部 commit 推走,AWBS 不在外部 commit 上继续生长。apply 会基于 currentTrustedCommit 的临时 worktree 生成新的可信提交,并推进 `refs/awbs/trusted`。外部 commit 仍然留在 Git 里,但不进入 AWBS 认证数据库。
|
|
182
|
+
|
|
183
|
+
旧 view 基于旧 trusted commit。可信链推进后,旧 view 的 apply 会被拒绝;要继续工作,必须从新的 currentTrustedCommit 重新创建 view。
|
|
184
|
+
|
|
185
|
+
## Database Audit
|
|
186
|
+
|
|
187
|
+
003 新增:
|
|
188
|
+
|
|
189
|
+
```text
|
|
190
|
+
awbs ledger inspect [--json]
|
|
191
|
+
awbs ledger verify [--json]
|
|
192
|
+
awbs db audit [--json]
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
`ledger inspect` / `ledger verify` 检查:
|
|
196
|
+
|
|
197
|
+
- `refs/awbs/trusted` 是否存在。
|
|
198
|
+
- trusted commit 中的 sealed ledger 是否可解密。
|
|
199
|
+
- ledger head entry 是否存在。
|
|
200
|
+
|
|
201
|
+
`db audit` 检查:
|
|
202
|
+
|
|
203
|
+
- 当前 Git `HEAD` 是否等于 currentTrustedCommit。
|
|
204
|
+
- 当前 `HEAD` 是否偏离 AWBS trusted chain。
|
|
205
|
+
- 当前工作树是否有未提交变化。
|
|
206
|
+
- authority / ledger 是否可验证。
|
|
207
|
+
|
|
208
|
+
审计的语义不是“阻止 Git”,而是明确告诉用户:哪些内容属于 AWBS 认证数据库,哪些只是普通 Git 或文件系统状态。
|
|
209
|
+
|
|
210
|
+
## Trusted Rebuild
|
|
211
|
+
|
|
212
|
+
003 新增:
|
|
213
|
+
|
|
214
|
+
```text
|
|
215
|
+
awbs db clean-rebuild [--json]
|
|
216
|
+
awbs db backups list [--json]
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
`clean-rebuild` 不在污染目录里做复杂递归删除。它采用更稳的方式:
|
|
220
|
+
|
|
221
|
+
```text
|
|
222
|
+
1. 读取 currentTrustedCommit。
|
|
223
|
+
2. 从该 commit 克隆/检出一个干净数据库目录。
|
|
224
|
+
3. 复制 .awbs/private/local.json,保证新目录能解密 authority。
|
|
225
|
+
4. 验证新目录 authority / ledger。
|
|
226
|
+
5. 将原数据库目录改名为 <name>.backup-<timestamp>。
|
|
227
|
+
6. 将干净目录改名接管原数据库路径。
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
旧目录默认保留,不自动删除。003 不实现 purge。
|
|
231
|
+
|
|
232
|
+
这样清理不会在污染现场逐个删除文件,也不会试图理解所有软链接、临时文件或外部写入。AWBS 只从自己的可信链头重建一个干净数据库。
|
|
233
|
+
|
|
234
|
+
## Current CLI
|
|
235
|
+
|
|
236
|
+
003 后新增命令:
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
awbs ledger bootstrap [--json]
|
|
240
|
+
awbs ledger inspect [--json]
|
|
241
|
+
awbs ledger verify [--json]
|
|
242
|
+
awbs db audit [--json]
|
|
243
|
+
awbs db clean-rebuild [--json]
|
|
244
|
+
awbs db backups list [--json]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
基本流程变为:
|
|
248
|
+
|
|
249
|
+
```powershell
|
|
250
|
+
awbs init
|
|
251
|
+
git add .
|
|
252
|
+
git commit -m "initialize database"
|
|
253
|
+
awbs ledger bootstrap
|
|
254
|
+
|
|
255
|
+
awbs view create --out workspace --read A --write B
|
|
256
|
+
awbs changeset collect --workspace workspace
|
|
257
|
+
awbs changeset apply <changesetId>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## Boundaries
|
|
261
|
+
|
|
262
|
+
- 003 不实现强安全沙箱。
|
|
263
|
+
- 003 不阻止本地用户直接修改文件或直接 Git commit。
|
|
264
|
+
- 003 只是不承认这些绕过 AWBS 的写入属于 AWBS 认证数据库。
|
|
265
|
+
- 已提交外部历史不静默删除、不重写。
|
|
266
|
+
- 清理核心采用可信重建和目录替换,不采用精细递归删除。
|
|
267
|
+
- 备份目录删除后续另做显式 purge 任务,003 不做自动删除。
|
|
268
|
+
- 摘要仍然永远由上层写入,AWBS 不内置 AI 摘要。
|