Sweetwater 五 Host 持久入口
运行一个 supervisor,管理五个独立 Node MCP Host 进程:
claw-bot sweetwater start --installation /absolute/path/installation.json
连接单个 Host 的标准 MCP stdio 入口(决策 Agent 每角色配置一个连接):
claw-bot sweetwater host --installation /absolute/path/installation.json --role dolores
安装配置只保存引用,不保存 bearer:
{
"endpoint": "https://crowdverse.ai",
"loopId": "loop_78a283271d5045a3abb9dcb88287a8bd",
"stateDirectory": "/var/lib/claw-bot/sweetwater",
"hosts": [
{"roleKey":"dolores","authRef":"env:CROWDVERSE_DOLORES_BEARER"},
{"roleKey":"teddy","authRef":"env:CROWDVERSE_TEDDY_BEARER"},
{"roleKey":"maeve","authRef":"env:CROWDVERSE_MAEVE_BEARER"},
{"roleKey":"clementine","authRef":"env:CROWDVERSE_CLEMENTINE_BEARER"},
{"roleKey":"lawrence","authRef":"env:CROWDVERSE_LAWRENCE_BEARER"}
]
}
每个 hosts 项还必须有既有本地权威 authorization 记录,例如 "authorization":{"authorizationId":"既有授权ID","version":3,"state":"active","scope":{"hostId":"canonical逻辑HostID","bodyId":"canonical BodyID"}},可带 expiresAt。此记录属于 Clawbot;CrowdVerse 只提供 authorizationVersion,启动核对 version 和 Host/Body scope。缺少记录直接报错,不能编造授权ID。
由受支持凭据存储向进程环境注入角色 scoped bearer。GET /api/claw-bot/brain/binding 必须返回 binding 对象:roleKey、hostId、bodyId、loopId、bindingEpoch、authorizationVersion、status=active、frozen=true。epoch/version 为正整数,role/loop 必须匹配。逻辑 Host 身份只来自响应,不来自 simulator 物理角色 ID。缺失 authority 字段直接停止启动,不能构造替代值。
每角色使用 ${stateDirectory}/${roleKey}.sqlite 和 ${stateDirectory}/${roleKey}/config/environments.json。HostStore 获得 writer lock 后才写配置;第二 writer 不能覆盖配置。首次 bootstrap 保留 canonical epoch;重启已有 body/epoch/environment 不匹配时停止,需显式恢复/迁移。不会静默替换 body。
重启把 sent/accepted/running 标为 unknown,再通过现有 MCP robot_act 的 unknown 分支 GET action 和 GET command 对账,禁止 POST replay。无法对账时启动失败并保留数据库。恢复完成后 stderr 输出 sweetwater_host_ready,stdout 保持 MCP 协议。
Supervisor stdin 每行是 {"roleKey":"dolores","message":{...JSON-RPC...}},stdout 同样用 roleKey 包装对应 Host 响应。单角色 host 命令直接接收标准 MCP JSON-RPC。stdin 关闭或 SIGTERM/SIGINT 会关闭所有子进程并释放 writer。任一子进程失败时 supervisor 停止其余进程。
决策 Agent 必须先 robot_status,再 robot_perceive,使用返回观察规划,robot_act 派发;不设置默认行动,不合成 cognition context。五进程在线仅证明执行入口可用,五个 Agent 的决策和 CrowdVerse 真机闭环需另行取得运行证据。
独立验证:
node --test test/crowdverse/sweetwater-runtime.test.js
npm test
npm run pack:check
测试使用真实本地 HTTP 服务和真实 CLI 子进程,覆盖五DB隔离、canonical bootstrap、观察/动作/结果、unknown重启GET-only对账、拒绝缺失授权/角色错配。测试端 controller 回执不等同于公网 CrowdVerse 或物理机器人验收。
每 Host 真实决策进程
claw-bot sweetwater start --installation /absolute/path/installation.json --brain
每个 hosts 项增加 brain:{"provider":"codex","model":"gpt-6.1-sol","effort":"medium","goal":"已确认的本Host目标","intervalMs":2000,"timeoutMs":60000}。Codex 使用现有登录;模型子进程不继承 CrowdVerse bearer,采用 ephemeral、read-only、structured output。Agent 实际接收 robot_status、robot_perceive 与 durable Host memory version;输出 hold/stop/velocity 提案,由 MCP/Host runtime 核验 capability、上下文和 authority 后派发。当前 provider 支持 canonical planar twist;不假装支持 navigation 或行为策略网络。提案和实际执行反馈写入每角色 sqlite.evidence.jsonl。unknown/accepted/running 优先只读对账,不进入新规划。模型失败停止该脑并保留 ledger;SIGTERM 等待在途规划终止后释放 Host writer。
此入口需要新的有效 Loop 安装配置;不得沿用过期 Loop。组织 scoped credential 与既有本体授权记录、角色 goal 是实际配置缺口,不能自动编造。
冻结静态世界与本 Host 初始先验
--brain 强制在 robot_perceive 中读取 canonical
GET /api/claw-bot/brain/bootstrap;外部 MCP Agent 可在 installation 中设置
requireWorldBootstrap: true 使用同一读路径。请求使用已有安装 bearer,禁止
redirect、使用 no-store、15 秒超时和 1 MiB 上限,不创建 key、授权或绑定。
旧 v1 Loop 的 409 static_world_unavailable 会停止该次规划,不能推测 v2 地图。
只接受 schemaVersion 1 / sweetwater-static-v2。完整 contentHash 固定为
sha256:d74d3c7990a0f3d822f2dc085def9e74017df9018a58f0624f0338a1d12346ab,
它标识完整 Park 静态资产,不能从缺少其他角色先验的 Host 投影重算。
客户端独立重算并核验已发布的 semanticMapHash,以及排除 projectionHash
字段后整个 bootstrap 的 canonical JSON hash。后者包含 identity、ParkVersion、
NarrativeVersion、静态世界、本 Host prior、task 与 freshness;首次读取后的投影
不得在同一 Host 运行中漂移。installation 可用 narrativeVersionId 进一步固定
已确认的 NarrativeVersion。新增世界版本需显式更新合同与测试,不能静默兼容。
读取前后都核验 active/frozen binding 的 Loop、逻辑 Host、HostVersion、Body、role、
epoch、authorizationVersion 与 ParkVersion;原有本地授权和行动前双重 fencing
继续有效。只把静态语义地图、本 Host 的粗初始区域/朝向、冻结路线传给 Agent。
prior 的 initial_spawn_only 不能充当晚连接或移动后的实时 pose correction;
Agent 必须用当前 RGB-D/proprio/odom 处理定位不确定性,证据不足时 hold。
任务 dwell 使用 simulation_seconds,路线项是 logical_marker,不表示物体抓取。
test/fixtures/sweetwater-bootstrap-v1.json 是协议 fixture,身份不是实际安装授权,
不能作为五脑、公网或真机联合验收证据。
Virtual 安装授权执行约束
初始化授权和发放安装凭据必须等待批次确认;代码与测试不会替代该确认。
安装必须提供 organizationId、新有效 loopId、virtualOnly:true。每角色本体 authorization 必须具有有效的未来 expiresAt,scope 强制匹配 binding 的 organizationId/loopId/roleKey/hostVersionId/hostId/bodyId,并提供当前 environmentId、environmentType:"simulator"、virtualOnly:true。还必须提供 actions:["stop","velocity"](可缩小)、maxPlanarSpeed、maxYawRate、maxValidForMs,各上限不得超过 0.2、0.2、1000ms。0.2 是拟议 virtual 测试命令上限,不提供物理安全证据。
这不是仅登记 scope JSON:新 action 创建前核验 current DB 授权 state/version/expiry 和完整批准 scope;发出 POST 前使用刚读取的 canonical binding 复验全部身份及 epoch,并重读本体授权状态。局部覆盖 Host、Body、authorization 或环境、序列/其他动作、超限速度向量/yaw/时长均拒绝。授权过期前不足以覆盖动作有效期也拒绝。配置不自动覆盖已有被撤销授权,scope 改动不能在同一版本下默默生效。
unknown 的 GET action/command 对账保留;撤销禁止新的执行,不删除旧执行证据。canonical 身份漂移导致预派发失败,不能通过重新配置自动跨 Loop/Body 继承授权。
canonical binding 还必须提供 environment:{id:loopId,kind:"virtual_simulator",scenario:"sweetwater_morning_v1",parkVersionId}。安装顶层和授权 scope 的 parkVersionId 必须与此 immutable 证明一致;客户端 virtualOnly 和 readiness 都不能代替虚拟证明。
每角色安装项增加 installTarget:{sceneId,robotId};授权 scope 同样绑定这两个字段,严格对照 binding.readiness.clawbotInstallTarget:{sceneId,robotId}。scope.sceneId/robotId 和 scope.parkVersionId 均为必填。旧版 canonical endpoint 缺少 virtual 证明时拒绝启动,不降低校验。
角色 scoped MCP 禁止环境重配置和通过反馈请求执行本体迁移。robot_feedback 仅凭既有 actionId 发起 GET 对账,不信任调用者声称的 terminal state 或 evidenceRef。controller 结果查询继续走既有 robot_* MCP 边界。
实际传感器 payload 与模型视觉
三模态均通过受支持 GET /api/claw-bot/brain/payload?payloadRef=... 读取,仅使用 observation ledger 引用;不访问 spool 文件路径或 operator 数据。客户端验证 ref digest、x-content-sha256 与实际 bytes,限制 16MiB,拒绝重定向和错误 MIME。使用真实 canonical wire 的 stream/capture/delivery 与顶层 authorizationVersion,核验当前身份;capture.time 是模拟时间,不冒充墙钟。实时新鲜度强制依据采样边界 metadata.captureWallTime,要求明确 captureClock;delivery.time 仅为传输时间,不能为排队旧帧刷新新鲜度。缺少任一模态直接拒绝规划。
本体/odom JSON 必须匹配身份、capture、frame/profile/calibration 和受支持 packet schema;拒绝额外 world truth 字段。旧 sweetwater-g1-sensors-v1 odom 是 simulator body-local root velocity×dt 的增量工程 profile,仅用于原冻结旧 launch 或历史回放,生产兼容随最后一个活动旧 launch 退役;保留历史证据读取。新 launch 的 sweetwater-g1-sensors-v2 使用 IMU/encoder 支撑假设,无 root velocity/contact truth 输入;仍非 map-frame 真值,uncertainty/gyro bias 未作硬件标定。RGB-D 使用 torch.load(weights_only=True,map_location="cpu"),要求 PyTorch>=2.6、Pillow、numpy;限制 archive 展开大小和640×480/plain tensor格式,不执行TorchScript或自定义对象。生成实际 RGB PNG、深度 PNG 与米制保守最小值网格;图片通过 MCP image content 及 Codex --image 附件传入,JSON不承载像素base64。
v2 必须经冻结 bootstrap 的 sensorProfile 读取,不接受仅在 packet 中声称 v2。客户端保留上游原始 profile 资源,核验原始字节 hash sha256:f2e25cea8ff1610917df71d53e5d599d43a0c1fbd43f3682328ff111afdf215c,再逐结构比对 bootstrap 完整定义;这不是重新序列化 JSON 后的 hash。整个 bootstrap projection 继续固定。三流的 profile/frame/calibration 均须匹配冻结角色定义,混用 v1/v2、篡改定义或身份漂移直接拒绝。
v2 odom 保留全部经验证的 estimator provenance,包括 segmentId、支撑假设状态、contactTruthUsed=false 与未标定声明。dtSeconds=0 仅在增量 translation/yaw 全零时合法,表示新局部分段的首采样;不同 segment 不能拼成同一连续运动,也不能用旧记忆或 initial spawn prior 为重置后的当前位姿纠偏。Agent 接收原 segment/status 并在定位证据不足时 hold;Clawbot 不把局部估计转成世界位姿。新增来源字段或未经支持的 estimator/status 仍拒绝。
在已有安装环境配置 tensorPython 为含上述依赖的 Python 绝对路径,也支持 CLAW_BOT_TENSOR_PYTHON。临时 tensor/PNG 仅存系统临时目录,模型结束和解码失败后删除;不写 Documents。
node --test test/crowdverse/sensor-payloads.test.js
CLAW_BOT_TENSOR_PYTHON=/absolute/path/to/python node --test test/crowdverse/rgbd-integration.test.js
前者验证transport/JSON与拒绝路径;后者生成明确fixture tensor,通过真正PyTorch解码并检查模型CLI图像附件传递。二者均不证明公网传感器/五脑导航,真实联调仍需部署后的endpoint、新有效Loop及已确认安装授权。
本地已验证解码环境:PyTorch 2.14.1 / Pillow 12.3.0 / numpy 2.5.3。独立图像provider验证可显式运行:
CLAW_BOT_TENSOR_PYTHON=/absolute/path/to/python CLAW_BOT_LIVE_VISION_TEST=1 node --test --test-name-pattern='real Sol' test/crowdverse/rgbd-integration.test.js
此测试将生成已知颜色的fixture RGB-D tensor,解码后以实际图片附件调用官方Sol Medium,要求正确识别颜色并hold;证据明确标记fixtureOnly。它证明图像实际抵达模型,不证明模拟器传感器数据、定位、导航或物理安全。
Capture-boundary freshness
显式墙钟契约为 metadata.captureClock=utc_wall,metadata.captureWallTime 为 ISO8601 UTC 字符串(Z 或 +00:00,允许微秒精度),必须在实际 capture 边界记录,不能在 artifact 处理或投递时补成当前时间。缺字段、未知 clock、无效日期、超过30秒、超过1秒未来偏差均 fail closed;旧版无墙钟证据的帧不能用于实时规划。simulation capture.time 与现有 sensor packet schema 保留。
解码前后及模型调用前后均复核 wall capture age。即使 delivery.time 刚更新,只要 capture 已过期就拒绝规划/派发。选择各stream最新seq后才验证其capture age,历史旧帧不代替新帧,也不能让新delivery掩盖旧capture。
这些拒绝路径由本地测试验证;实际capture freshness仍需CrowdVerse新字段部署、capture边界来源和现场时钟证据,当前不得称其已在真实五脑环境通过。