docs(agent): 修复计划未闭合代码块 + Task 6 改用常驻测试校验样例

未闭合的 ```go 让 Task 4-6 的标题落进代码块,task-brief 无法提取;
Task 6 原用 go run 校验样例文件,该文件在 module 外无法解析 import,
改为常驻测试 TestACLExampleFileStaysValid,并断言样例 uuid 为占位符
以防真实 dp_uuid 入库。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-07-23 01:12:06 +08:00
parent e4d014ba99
commit 6df7c9de44
2 changed files with 387 additions and 403 deletions
@@ -774,6 +774,7 @@ func buildRoute(acl *ACLConfig, warp *WarpConfig) map[string]any {
// 访问权的 dp_uuid 白名单与对应的私有域名/端口。它仍不含任何账户身份(email/user_id),
// 但确实让节点知道「这几个 dp_uuid 属于同一组权限」—— 知情接受的不变式弱化,
// 设计与权衡见 docs/private-dest-acl-design.html §12。
```
⑤ 修改 `server/internal/agentd/singbox.go` 第 326 行,补一个 nil 实参(Task 4 会替换成真实 ACL):
@@ -1119,6 +1120,7 @@ git commit -m "feat(agent): SIGHUP 重读节点本地配置并热重渲染,不
**Files:**
- Create: `deploy/single-node/acl.json.example`
- Modify: `server/internal/agentd/acl_test.go`(追加样例文件常驻校验测试)
- Modify: `docs/private-dest-acl-design.html`(把 §8 runbook 里的占位符换成指向样例文件)
**Interfaces:**
@@ -1153,32 +1155,45 @@ git commit -m "feat(agent): SIGHUP 重读节点本地配置并热重渲染,不
> `_comment` 字段会被 `encoding/json` 忽略(`ACLConfig` 无对应字段且未启用 `DisallowUnknownFields`),可安全保留作自文档。样例里的 `TODO-` 值是**样例文件**的占位,不是计划的占位——真实 uuid 属 PII 级标识,不入 git,由运维按 Step 2 的 SQL 现取现填。
- [ ] **Step 2: 验证样例能被解析且渲染出预期规则**
- [ ] **Step 2: 加一条测试,锁死「样例文件永远可解析」**
```bash
cd server && cat > /tmp/acl_example_check.go <<'EOF'
package main
样例文件会随需求漂移(改了 target 形状却忘了同步样例),靠人工 `go run` 检查一次没有约束力。改为一条常驻测试。追加到 `server/internal/agentd/acl_test.go`
import (
"fmt"
"os"
"github.com/wangjia/pangolin/server/internal/agentd"
)
func main() {
ac, err := agentd.LoadACLConfig(os.Args[1])
```go
// 样例文件必须始终可被解析且产出预期规则,防止改了 ACLTarget 形状却忘了同步样例。
func TestACLExampleFileStaysValid(t *testing.T) {
path := filepath.Join("..", "..", "..", "deploy", "single-node", "acl.json.example")
ac, err := LoadACLConfig(path)
if err != nil {
fmt.Println("FAIL:", err)
os.Exit(1)
t.Fatalf("样例文件解析失败 %s: %v", path, err)
}
if ac == nil {
t.Fatalf("样例文件不存在: %s", path)
}
if !ac.active() {
t.Error("样例文件应当是一份 active 的 ACL")
}
if len(ac.Targets) != 2 {
t.Errorf("样例 targets = %d, want 2", len(ac.Targets))
}
// 样例里的 uuid 是占位符,不该是真实 uuid(真实 uuid 属标识信息,不入 git)
for _, u := range ac.AllowDpUUIDs {
if !strings.HasPrefix(u, "TODO-") {
t.Errorf("样例文件混入了非占位 uuid %q —— 真实 dp_uuid 不得入 git", u)
}
}
fmt.Printf("OK enabled=%v uuids=%d targets=%d\n", ac.Enabled, len(ac.AllowDpUUIDs), len(ac.Targets))
}
EOF
go run /tmp/acl_example_check.go ../deploy/single-node/acl.json.example && rm /tmp/acl_example_check.go
```
Expected: `OK enabled=true uuids=2 targets=2`
跑:
```bash
cd server && go test ./internal/agentd/ -run 'ExampleFileStaysValid' -v
```
Expected: PASS。
> 注:`_comment` 字段会被 `encoding/json` 忽略(`ACLConfig` 无对应字段且未启用 `DisallowUnknownFields`),故样例里的自文档注释不影响解析——这条测试同时守着这个前提。
- [ ] **Step 3: 更新设计文档的 runbook 指向**
@@ -1192,10 +1207,12 @@ Expected: `OK enabled=true uuids=2 targets=2`
```bash
cd server && go build ./... && go test ./internal/agentd/...
git add deploy/single-node/acl.json.example docs/private-dest-acl-design.html
git commit -m "docs(agent): 私有目的地 ACL 配置样例与 runbook 指向"
git add deploy/single-node/acl.json.example server/internal/agentd/acl_test.go docs/private-dest-acl-design.html
git commit -m "docs(agent): 私有目的地 ACL 配置样例与常驻校验测试"
```
> `git add` 只列具体路径,**切勿 `git add -A`**:仓库里有未跟踪的 `pangolin-release.jks`Android 签名密钥)与若干无关的本地改动,误提交会泄露密钥。
---
## 上线验收(人工,非代码任务)