diff --git a/.task/fix-svc-test-port-governance.md b/.task/fix-svc-test-port-governance.md new file mode 100644 index 00000000..e4d079fc --- /dev/null +++ b/.task/fix-svc-test-port-governance.md @@ -0,0 +1,93 @@ +# fix/svc-test-port-governance 任务卡 + +任务主记录:;状态:进行中;owner:weichen + +- 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 33d6ef69212595c680a744549986c19bb6acd6c3 +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-svc-test-port-governance(worktree);分支:fix/svc-test-port-governance +- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false +- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=bb1fb490ff22f2cc7a7edfe11e0400569bf98c4e879d5527493186aa75429f31;triage_receipt=/tmp/port2-triage2.json;receipt_sha256=a8e49e2792cd069b95e4db5bc7f7d492d164ff84c21ef1001c3bbaf3de7ba364 + +- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) +- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) +- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) + +## 目标与非目标 + +<预期结果、受影响入口/模块/契约;明确不做什么。> + +## Agent 实施收据 + +路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。 + +| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---|---| +| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — | + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | 33d6ef69212595c680a744549986c19bb6acd6c3 | 33d6ef69212595c680a744549986c19bb6acd6c3 | 2026-10-22T06:18:16Z | + +## 证据(Evidence) + + +| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) | +|---|---|---|---|---|---| + +## 结果与验证(完成后填写) + +- 结果: +- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> +- 影响与剩余项: + +## 合入与清理 + +- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据) +- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) +- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) +- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-22T06:17:27.856549+00:00", + "command": "make precheck", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev", + "before_head": "33d6ef69212595c680a744549986c19bb6acd6c3", + "after_head": "33d6ef69212595c680a744549986c19bb6acd6c3", + "branch": "main", + "target_branch": "main", + "target_head": "33d6ef69212595c680a744549986c19bb6acd6c3", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_tail": [ + "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'", + "[repo] branch=main head=33d6ef6921", + "[remote] origin/main=33d6ef6921 ahead=0 behind=0", + "[tree] clean submodules_drift=0 uninit=0", + "[worktrees] linked=6", + "[recycle] merged un-recycled branches: fix/rdm-pin-advance-latest", + "[initiatives] local cards (not authoritative): none", + "[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)", + "[facts] policy/facts.md 6 条事实均在有效期内", + "[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md", + "[R0] 33d6ef6921(完整:33d6ef69212595c680a744549986c19bb6acd6c3)", + "[worktree] before-sync: recursive component checks passed", + "[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'" + ], + "output_sha256": "bae6a238774330d77e016166c60b79b796a22ec8cbdfed58574a18058fce3679", + "receipt_sha256": "74d9784c1101c6a196fe3571ae41323a102a8d97a92fe15bc3270d00a7a71b7d", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/74d9784c1101c6a196fe3571ae41323a102a8d97a92fe15bc3270d00a7a71b7d.json" +} +``` +| 同步(记录前对象) | d65195bd41317e480c5a0cfa5133b0ad98a48d4b | a1e0c85c0400ce300a847da276e70d520f842844 | 2026-10-22T07:17:59Z | diff --git a/tests/test_svc.py b/tests/test_svc.py index e67d20e3..da2e34df 100644 --- a/tests/test_svc.py +++ b/tests/test_svc.py @@ -349,18 +349,21 @@ class SvcDbRecoveryTests(unittest.TestCase): self.register_pg("pg1", 18892, password="addr-pw-3") dsn = "postgresql://agent:addr-pw-3@127.0.0.1:18892/agent" d = self.runtime("dev") - self.seed_agent("dev", 18793, - "--addr 127.0.0.1:18793 --data %s --plugins %s --auth auto" - % (d / "data", d / "plugins"), + with socket.socket() as reservation: + reservation.bind(("127.0.0.1", 0)) + port = reservation.getsockname()[1] + self.seed_agent("dev", port, + "--addr 127.0.0.1:%d --data %s --plugins %s --auth auto" + % (port, d / "data", d / "plugins"), extra_rows=[("dbref", "pg1/agent"), ("db", "pg")]) self.clear_serve_record() - self.svc("dev", "restart", "--addr", "127.0.0.1:18794") + self.svc("dev", "restart", "--addr", "127.0.0.1:%d" % port) record = self.serve_record() self.assertIn("AGENT_SYSTEM_DSN=%s" % dsn, record) self.assertIn("--auth auto", record) self.assertEqual(self.kv("dev", "dbref"), "pg1/agent") - self.assertEqual(self.kv("dev", "addr"), "127.0.0.1:18794") - self.assertIn("--addr 127.0.0.1:18794", self.kv("dev", "exec")) + self.assertEqual(self.kv("dev", "addr"), "127.0.0.1:%d" % port) + self.assertIn("--addr 127.0.0.1:%d" % port, self.kv("dev", "exec")) self.assertEqual(self.kv("dev", "db"), "pg") # ---- 4. 外部直连与配置文件来源:后续无参数启动仍恢复 ---- diff --git a/tests/test_svc_backup.py b/tests/test_svc_backup.py index a478fb6f..1759d619 100644 --- a/tests/test_svc_backup.py +++ b/tests/test_svc_backup.py @@ -10,11 +10,15 @@ import os import shutil import sqlite3 import subprocess +import sys import tempfile import time import unittest from pathlib import Path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from _port_alloc import free_test_port # noqa: E402 + SOURCE = Path(__file__).resolve().parents[1] SVC_SCRIPT = SOURCE / "scripts" / "svc.sh" @@ -67,7 +71,9 @@ class SvcAgentBackupTests(unittest.TestCase): self.assertEqual(proc.returncode, 0, proc.stdout) return proc - def register_agent(self, name="t1", port=8899): + def register_agent(self, name="t1", port=None): + if port is None: + port = free_test_port() d = self.root / "runtime" / name (d / "data").mkdir(parents=True, exist_ok=True) (d / "svc.env").write_text(