sequence-base 0.3.0__tar.gz

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.
Files changed (150) hide show
  1. sequence_base-0.3.0/.github/workflows/ci.yml +32 -0
  2. sequence_base-0.3.0/.gitignore +6 -0
  3. sequence_base-0.3.0/PKG-INFO +12 -0
  4. sequence_base-0.3.0/README.md +38 -0
  5. sequence_base-0.3.0/docs/platform/README.md +66 -0
  6. sequence_base-0.3.0/docs/platform/REVIEW.md +86 -0
  7. sequence_base-0.3.0/docs/platform/START.md +366 -0
  8. sequence_base-0.3.0/docs/platform/accounts.md +162 -0
  9. sequence_base-0.3.0/docs/platform/billing.md +116 -0
  10. sequence_base-0.3.0/docs/platform/build/BUILD_LOG.md +222 -0
  11. sequence_base-0.3.0/docs/platform/build/goal_sha256.json +31 -0
  12. sequence_base-0.3.0/docs/platform/build/gs-build-wave.js +163 -0
  13. sequence_base-0.3.0/docs/platform/build/gs-spec-goals.js +41 -0
  14. sequence_base-0.3.0/docs/platform/container.md +55 -0
  15. sequence_base-0.3.0/docs/platform/contracts.md +233 -0
  16. sequence_base-0.3.0/docs/platform/deploy/PLAN.md +93 -0
  17. sequence_base-0.3.0/docs/platform/deploy/PROD_REORG.md +78 -0
  18. sequence_base-0.3.0/docs/platform/deploy/SCHEMA_COMPAT.md +38 -0
  19. sequence_base-0.3.0/docs/platform/deploy/archive/sequences-gw.genseq-506918.20261001.yaml +109 -0
  20. sequence_base-0.3.0/docs/platform/eval.md +102 -0
  21. sequence_base-0.3.0/docs/platform/gateway.md +80 -0
  22. sequence_base-0.3.0/docs/platform/goals/A1.yaml +39 -0
  23. sequence_base-0.3.0/docs/platform/goals/A2.yaml +26 -0
  24. sequence_base-0.3.0/docs/platform/goals/A3.yaml +24 -0
  25. sequence_base-0.3.0/docs/platform/goals/C1.yaml +32 -0
  26. sequence_base-0.3.0/docs/platform/goals/C2.yaml +27 -0
  27. sequence_base-0.3.0/docs/platform/goals/C3.yaml +22 -0
  28. sequence_base-0.3.0/docs/platform/goals/C4.yaml +22 -0
  29. sequence_base-0.3.0/docs/platform/goals/C5.yaml +34 -0
  30. sequence_base-0.3.0/docs/platform/goals/G1.yaml +30 -0
  31. sequence_base-0.3.0/docs/platform/goals/G2.yaml +26 -0
  32. sequence_base-0.3.0/docs/platform/goals/G3.yaml +32 -0
  33. sequence_base-0.3.0/docs/platform/goals/G4.yaml +45 -0
  34. sequence_base-0.3.0/docs/platform/goals/G5.yaml +43 -0
  35. sequence_base-0.3.0/docs/platform/goals/O1.yaml +19 -0
  36. sequence_base-0.3.0/docs/platform/goals/O2.yaml +27 -0
  37. sequence_base-0.3.0/docs/platform/goals/O3.yaml +28 -0
  38. sequence_base-0.3.0/docs/platform/goals/O4.yaml +25 -0
  39. sequence_base-0.3.0/docs/platform/goals/O5.yaml +30 -0
  40. sequence_base-0.3.0/docs/platform/goals/R1.yaml +30 -0
  41. sequence_base-0.3.0/docs/platform/goals/R2.yaml +23 -0
  42. sequence_base-0.3.0/docs/platform/goals/R3.yaml +30 -0
  43. sequence_base-0.3.0/docs/platform/goals/S1.yaml +32 -0
  44. sequence_base-0.3.0/docs/platform/goals/S2.yaml +30 -0
  45. sequence_base-0.3.0/docs/platform/goals/S3.yaml +30 -0
  46. sequence_base-0.3.0/docs/platform/goals/S4.yaml +30 -0
  47. sequence_base-0.3.0/docs/platform/goals/S5.yaml +56 -0
  48. sequence_base-0.3.0/docs/platform/goals/S6.yaml +34 -0
  49. sequence_base-0.3.0/docs/platform/goals/V1-storage.md +26 -0
  50. sequence_base-0.3.0/docs/platform/goals/V2-user-quotas.md +27 -0
  51. sequence_base-0.3.0/docs/platform/goals/W0.1.yaml +30 -0
  52. sequence_base-0.3.0/docs/platform/goals/W0.2.yaml +21 -0
  53. sequence_base-0.3.0/docs/platform/modal/README.md +26 -0
  54. sequence_base-0.3.0/docs/platform/modal/architecture.md +27 -0
  55. sequence_base-0.3.0/docs/platform/modal/connect.md +41 -0
  56. sequence_base-0.3.0/docs/platform/modal/cost.md +52 -0
  57. sequence_base-0.3.0/docs/platform/modal/custom-domain.md +47 -0
  58. sequence_base-0.3.0/docs/platform/modal/debugging.md +42 -0
  59. sequence_base-0.3.0/docs/platform/modal/goals.md +92 -0
  60. sequence_base-0.3.0/docs/platform/modal/limits.md +50 -0
  61. sequence_base-0.3.0/docs/platform/modal/plan.md +65 -0
  62. sequence_base-0.3.0/docs/platform/modal/white-label.md +33 -0
  63. sequence_base-0.3.0/docs/platform/modal/wiring.md +36 -0
  64. sequence_base-0.3.0/docs/platform/observability.md +128 -0
  65. sequence_base-0.3.0/docs/platform/references.md +48 -0
  66. sequence_base-0.3.0/docs/platform/sdk.md +246 -0
  67. sequence_base-0.3.0/pyproject.toml +20 -0
  68. sequence_base-0.3.0/sequence_base/__init__.py +134 -0
  69. sequence_base-0.3.0/sequence_base/auth.py +35 -0
  70. sequence_base-0.3.0/sequence_base/codec/__init__.py +25 -0
  71. sequence_base-0.3.0/sequence_base/codec/image.py +136 -0
  72. sequence_base-0.3.0/sequence_base/codec/resize.py +147 -0
  73. sequence_base-0.3.0/sequence_base/constants/__init__.py +0 -0
  74. sequence_base-0.3.0/sequence_base/constants/env.py +14 -0
  75. sequence_base-0.3.0/sequence_base/constants/headers.py +5 -0
  76. sequence_base-0.3.0/sequence_base/constants/version.py +9 -0
  77. sequence_base-0.3.0/sequence_base/contract/__init__.py +111 -0
  78. sequence_base-0.3.0/sequence_base/contract/accounts.py +93 -0
  79. sequence_base-0.3.0/sequence_base/contract/act.py +89 -0
  80. sequence_base-0.3.0/sequence_base/contract/benchmarks.py +130 -0
  81. sequence_base-0.3.0/sequence_base/contract/connect.py +53 -0
  82. sequence_base-0.3.0/sequence_base/contract/deployments.py +197 -0
  83. sequence_base-0.3.0/sequence_base/contract/errors.py +45 -0
  84. sequence_base-0.3.0/sequence_base/contract/eval.py +201 -0
  85. sequence_base-0.3.0/sequence_base/contract/flags.py +92 -0
  86. sequence_base-0.3.0/sequence_base/contract/policy.py +172 -0
  87. sequence_base-0.3.0/sequence_base/errors/__init__.py +0 -0
  88. sequence_base-0.3.0/sequence_base/errors/transport.py +36 -0
  89. sequence_base-0.3.0/sequence_base/obs/__init__.py +0 -0
  90. sequence_base-0.3.0/sequence_base/obs/log.py +57 -0
  91. sequence_base-0.3.0/sequence_base/obs/rid.py +31 -0
  92. sequence_base-0.3.0/sequence_base/schema_export.py +238 -0
  93. sequence_base-0.3.0/sequence_base/schemas/ActionChunk.json +102 -0
  94. sequence_base-0.3.0/sequence_base/schemas/ActionContract.json +43 -0
  95. sequence_base-0.3.0/sequence_base/schemas/ActionStep.json +23 -0
  96. sequence_base-0.3.0/sequence_base/schemas/AdapterTransform.json +42 -0
  97. sequence_base-0.3.0/sequence_base/schemas/Autoscaler.json +43 -0
  98. sequence_base-0.3.0/sequence_base/schemas/BenchmarkRegisterRequest.json +302 -0
  99. sequence_base-0.3.0/sequence_base/schemas/BenchmarkSpec.json +401 -0
  100. sequence_base-0.3.0/sequence_base/schemas/BootstrapResponse.json +76 -0
  101. sequence_base-0.3.0/sequence_base/schemas/ClampInfo.json +27 -0
  102. sequence_base-0.3.0/sequence_base/schemas/CodeBundle.json +27 -0
  103. sequence_base-0.3.0/sequence_base/schemas/Concurrency.json +21 -0
  104. sequence_base-0.3.0/sequence_base/schemas/Conditions.json +59 -0
  105. sequence_base-0.3.0/sequence_base/schemas/ConnectRequest.json +16 -0
  106. sequence_base-0.3.0/sequence_base/schemas/ConnectResponse.json +81 -0
  107. sequence_base-0.3.0/sequence_base/schemas/DeploymentAccepted.json +22 -0
  108. sequence_base-0.3.0/sequence_base/schemas/DeploymentPolicy.json +101 -0
  109. sequence_base-0.3.0/sequence_base/schemas/DeploymentRequest.json +467 -0
  110. sequence_base-0.3.0/sequence_base/schemas/DeploymentStatusResponse.json +45 -0
  111. sequence_base-0.3.0/sequence_base/schemas/ErrorBody.json +32 -0
  112. sequence_base-0.3.0/sequence_base/schemas/Estimate.json +25 -0
  113. sequence_base-0.3.0/sequence_base/schemas/EvalDryRunResponse.json +41 -0
  114. sequence_base-0.3.0/sequence_base/schemas/EvalReport.json +179 -0
  115. sequence_base-0.3.0/sequence_base/schemas/EvalRequest.json +111 -0
  116. sequence_base-0.3.0/sequence_base/schemas/EvalResponse.json +88 -0
  117. sequence_base-0.3.0/sequence_base/schemas/ImageFrame.json +36 -0
  118. sequence_base-0.3.0/sequence_base/schemas/ImageSpec.json +123 -0
  119. sequence_base-0.3.0/sequence_base/schemas/ImageStepApt.json +18 -0
  120. sequence_base-0.3.0/sequence_base/schemas/ImageStepEnv.json +18 -0
  121. sequence_base-0.3.0/sequence_base/schemas/ImageStepRun.json +18 -0
  122. sequence_base-0.3.0/sequence_base/schemas/ImageStepUvPip.json +18 -0
  123. sequence_base-0.3.0/sequence_base/schemas/Lease.json +28 -0
  124. sequence_base-0.3.0/sequence_base/schemas/LossyTransform.json +21 -0
  125. sequence_base-0.3.0/sequence_base/schemas/MetricAgg.json +87 -0
  126. sequence_base-0.3.0/sequence_base/schemas/Observation.json +133 -0
  127. sequence_base-0.3.0/sequence_base/schemas/PolicyRegistration.json +438 -0
  128. sequence_base-0.3.0/sequence_base/schemas/PolicySpec.json +346 -0
  129. sequence_base-0.3.0/sequence_base/schemas/Proprioception.json +67 -0
  130. sequence_base-0.3.0/sequence_base/schemas/RenderSpec.json +22 -0
  131. sequence_base-0.3.0/sequence_base/schemas/Resources.json +29 -0
  132. sequence_base-0.3.0/sequence_base/schemas/RolloutResult.json +59 -0
  133. sequence_base-0.3.0/sequence_base/schemas/SecretCreateRequest.json +25 -0
  134. sequence_base-0.3.0/sequence_base/schemas/SecretInfo.json +44 -0
  135. sequence_base-0.3.0/sequence_base/schemas/SecretRef.json +16 -0
  136. sequence_base-0.3.0/sequence_base/schemas/SeqFlags.json +33 -0
  137. sequence_base-0.3.0/sequence_base/schemas/Step.json +68 -0
  138. sequence_base-0.3.0/sequence_base/schemas/SuiteAgg.json +26 -0
  139. sequence_base-0.3.0/sequence_base/schemas/TaskAgg.json +26 -0
  140. sequence_base-0.3.0/sequence_base/schemas/Timeouts.json +20 -0
  141. sequence_base-0.3.0/sequence_base/schemas/UsageReport.json +38 -0
  142. sequence_base-0.3.0/sequence_base/schemas/Variant.json +24 -0
  143. sequence_base-0.3.0/sequence_base/schemas/VolumeAttach.json +26 -0
  144. sequence_base-0.3.0/sequence_base/schemas/VolumeMount.json +21 -0
  145. sequence_base-0.3.0/sequence_base/schemas/VolumeRef.json +28 -0
  146. sequence_base-0.3.0/sequence_base/schemas/WarmingError.json +50 -0
  147. sequence_base-0.3.0/sequence_base/telemetry/__init__.py +13 -0
  148. sequence_base-0.3.0/sequence_base/telemetry/events.py +101 -0
  149. sequence_base-0.3.0/tests/test_codec_roundtrip.py +101 -0
  150. sequence_base-0.3.0/tests/test_contracts.py +629 -0
@@ -0,0 +1,32 @@
1
+ # Run the test suite on every push and pull request.
2
+ #
3
+ # In one sentence: install the [codec] extra (pillow + numpy) and run pytest, so the codec
4
+ # round-trip / geometry drift guard runs on every change — base is what the SDK, gateway, and
5
+ # container all build on, so a break here breaks all three.
6
+ #
7
+ # Upstream trigger — push to main, or any pull request
8
+ # Downstream effect — a red check on the commit / PR
9
+ name: CI
10
+
11
+ on:
12
+ push:
13
+ branches: [main]
14
+ pull_request:
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ test:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: actions/setup-python@v5
25
+ with:
26
+ python-version: "3.12" # base is requires-python >=3.11
27
+ - name: Install
28
+ run: |
29
+ python -m pip install -q --upgrade pip
30
+ python -m pip install -q -e '.[codec,test]'
31
+ - name: Test
32
+ run: python -m pytest -q
@@ -0,0 +1,6 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .env
4
+ .venv/
5
+ *.egg-info/
6
+ .DS_Store
@@ -0,0 +1,12 @@
1
+ Metadata-Version: 2.5
2
+ Name: sequence-base
3
+ Version: 0.3.0
4
+ Summary: Shared foundation for the Sequences platform — wire contract, correlation, error taxonomy, constants. Used by the robot SDK, gateway, and container harness.
5
+ Requires-Python: >=3.11
6
+ Requires-Dist: pydantic>=2.0
7
+ Provides-Extra: codec
8
+ Requires-Dist: numpy>=1.26; extra == 'codec'
9
+ Requires-Dist: pillow>=10; extra == 'codec'
10
+ Provides-Extra: test
11
+ Requires-Dist: jsonschema>=4; extra == 'test'
12
+ Requires-Dist: pytest; extra == 'test'
@@ -0,0 +1,38 @@
1
+ # sequence-base
2
+
3
+ The **shared foundation** for the Sequences platform — the wire protocol + primitives that the robot
4
+ SDK, the gateway, and the container harness ALL use, defined once so they cannot drift.
5
+
6
+ ```python
7
+ from sequence_base import Observation, ActionChunk # contract
8
+ from sequence_base import log, new_rid, HEADER # correlation
9
+ from sequence_base import TransportWarming, TransportOverloaded # error taxonomy
10
+ ```
11
+
12
+ ## Layout (a subpackage per concern; each grows independently)
13
+
14
+ ```
15
+ sequence_base/
16
+ contract/ act.py — Observation / ActionChunk / ImageFrame / Proprioception / ActionSpace / ActionStep
17
+ (grows: chat.py, perceive.py) · sdk + gateway + container
18
+ obs/ rid.py (HEADER, new_rid, clean) · log.py (log, Timer) · sdk + gateway + container
19
+ errors/ transport.py (Warming / Rejected / Overloaded / Unavailable) · gateway + container
20
+ (grows: client.py)
21
+ constants/ headers.py · env.py · version.py · all three
22
+ codec/ [P1] image.py (encode/decode) · resize.py — sdk encodes, container decodes; MUST match
23
+ telemetry/ [P1] events.py — container→gateway event shapes
24
+ ```
25
+
26
+ ## The one rule for what goes in here
27
+
28
+ Only things **used by ≥2 of {sdk, gateway, container}** *and* that would **silently drift** if each
29
+ kept its own copy. Model-specific code (handlers), provider-specific code (drivers), and catalogue
30
+ values (per-model client_resize, pricing, licensing) stay out — in container / gateway / spec.py.
31
+
32
+ ## Install
33
+
34
+ `pip install -e .` (core = pydantic). The image codec pulls PIL/numpy, so it is an optional extra —
35
+ `pip install -e ".[codec]"` — which the gateway (which never encodes/decodes) skips.
36
+
37
+ Extracted from `general-sequences/backend/sequences/` (`api/schema.py`, `obs.py`,
38
+ `api/handoff/runpod.py`). Renamed from `sequence-contract` once it grew past just the contract.
@@ -0,0 +1,66 @@
1
+ # GS deploy platform — 设计总览(Modal-way,GCP-first)
2
+
3
+ > 本文件夹是**三个 repo(gateway / container / sdk)统一设计文档**的入口。canonical 设计在此(sequence-base 是三方都 import 的共享仓,放这不漂移)。两个 session 协同:一侧做 SDK(用户面),一侧做 container/GPU/gateway/GCP(runtime + control plane);契约见 [contracts.md](contracts.md),eval / CI-CD 半边见 [eval.md](eval.md),账户 / secret 机制见 [accounts.md](accounts.md),定价 / 成本 / 统一费率表 / GCP 成本硬闸见 [billing.md](billing.md),debugging / latency / telemetry 见 [observability.md](observability.md),全部参考见 [references.md](references.md)。**怎么建(workflow + subagent 执行计划、WU 依赖图)→ [START.md](START.md)。**
4
+
5
+ ## 我们要造什么(一句话)
6
+
7
+ 让用户把**自己训好的 policy(如 fine-tuned pi0.5:一个 checkpoint + 一个 `@seq.policy` 类)** 一行 `seq deploy` 上到 GS,`connect(model)` 就能 `act` —— 像 Modal 部署一个 GPU 服务那样,但 policy 的 obs→ActionChunk 合同、episode/streaming、warming 由平台内建。**我们不做训练**(只部署已训好的 checkpoint),不拥有 model / sim / 数据。
8
+
9
+ 这是更大 thesis(GS = 跑 Real2Sim2Real loop 的 compute+编排引擎)的**入口(on-ramp)**:先把「部署 + 服务一个 policy」(loop 的 Stage 6)做实,再扩到大规模 rollout/eval(Stage 3)。deploy 层是入口,不是终点。
10
+
11
+ ## MVP 架构(先做这个):1 worker = 1 VM = 1 L4,on-demand + stop-to-zero
12
+
13
+ **最简形状 —— 不养 pool、不做 snapshot。**
14
+ - **worker = 一台 GCE L4 VM**(g2-standard-8:8 vCPU / 32GB / 1× L4),跑 harness 容器、装一个 policy。**1 worker = 1 VM = 1 L4 = 1 policy**(pi05 独占显存,一张卡装不下两个 policy)。
15
+ - **按 policy(deployment)现起**:有人 connect 而没有在跑的 worker → gateway `driver.create` 起一台(冷启 boot ~1-2min + 加载 86s)。
16
+ - **scale-to-zero = 关 VM**:reaper 见 idle 过 cooldown → `driver.stop`(GPU 费归零、保 boot 盘);下次 connect 再 start(GCE GPU VM 不能 suspend,只能 stop/start,吃全 boot)。
17
+ - **并行 = 进程级 replica + 加 worker**:一台 worker 内用**进程级 replica(`SubprocessReplica`,非线程)**并发,受 VRAM 限(L4 24GB / pi05 8.6GB ≈ 1~2 个,JAX 关预分配才放得下 2);超了 → 加 VM(每台一张卡),gateway 分流,受 GPU quota + 成本限。
18
+ - **存储 3 处**:① 你本地(deploy)② GCS(耐久,checkpoint 永久存 `gs://…`)③ worker 的 **boot disk**(首次 create 从 GCS 拷权重 45s;**boot disk 在 stop 后存活**,gce-1 → 重启免重拉,权重别放会被清的 Local SSD)。
19
+
20
+ ## 为什么 GCE 裸 VM(不是 Cloud Run)
21
+
22
+ - **gateway 自己控 scale-to-zero**:按闭环 idle 精确关 / 起 worker(见 reaper),不借云商内建 serverless 的黑盒伸缩。
23
+ - **direct-connect 要一个可直达的 worker**:机器人 `act` 直连 worker 的公网 IP(绕开 gateway 省 hop);Cloud Run 只给代理在前的 URL,拿不到直连 pod。
24
+ - **driver 形状可移植**:`gcloud compute instances create` 起 L4 VM,同形状可复制到 AWS/Azure。
25
+ - L4 24GB 装 pi05 宽裕(serving VRAM ~8.6GB)。
26
+ - ⚠️ **GCE GPU VM 不能 suspend/resume** —— 只能 stop/start,吃全 OS boot(~1-2min)。但 **boot disk 存活**(gce-1):**首次 create** = boot + 45s 拉权重 + JIT;**start-after-stop** = boot + JIT(权重已在盘,免那 45s)。⚠️ warm 83ms / JIT 34s / cold 86s 是 **RTX 4090** 实测(RS-3),L4 带宽只 ~1/3(300 vs 1010 GB/s)→ L4 大概率更慢,**真机重测再定预算**;MVP 接受冷启,SDK warming-wait 兜底。
27
+
28
+ ## 三个 repo 的分工
29
+
30
+ | repo | 角色 | 详见 |
31
+ |---|---|---|
32
+ | **sequence-sdk** | 用户面:`@seq.*` authoring 装饰器 + `Image`/`Volume` 声明 + `seq deploy` CLI + `connect/act` client。copy Modal 的 DX。 | [sdk.md](sdk.md) |
33
+ | **sequence-container** | harness runtime:跑在 GCE VM 上的容器,加载用户 policy(或 benchmark)、`/act /ping /health`、GCS 拉权重。 | [container.md](container.md) |
34
+ | **sequence-gateway** | control plane / scheduler:`POST /v1/deployments` 注册、`gcp_gce` driver、scheduler(MVP:找 / 起 worker)、fleet state、connect/lease 发直连坐标、gateway 控 scale-to-zero(关 VM)。 | [gateway.md](gateway.md) |
35
+ | **sequence-base** | 共享 wire 契约(三方 import,不漂移):`@seq.*` registry、`POST /v1/deployments` payload、`/act` req/resp。 | [contracts.md](contracts.md) |
36
+
37
+ 数据流(一次 deploy + 一次 act):
38
+ ```
39
+ seq deploy → gateway POST /v1/deployments(handler ref + manifest + weights URI + image 声明)
40
+ → Cloud Build 出 policy 镜像(harness base + 用户 Handler + deps)
41
+ → scheduler:有 running worker? 复用 : driver.create/boot GCE L4 VM 跑 harness
42
+ → harness:GCS 拉权重 → @seq.load → serve
43
+ connect(model) → gateway /v1/act/connect(一次):scheduler.acquire → ensure worker up
44
+ → 返回 { worker_url(static IP), cert 指纹, direct_secret(per-worker Bearer), lease_ttl }
45
+ act(obs) [稳态] → worker_url/act 直连(Bearer secret,keepalive)→ ActionChunk ← 无 gateway hop
46
+ 直连失败/归零/lease 过期 → SDK 回退 gateway 重 connect(ensure_up: start/boot VM → 新 url+secret)→ 恢复直连
47
+ idle → reaper:cooldown 后 stop VM;下次 connect 再 start
48
+ ```
49
+
50
+ **⚠️ 关键:control plane / data plane 分离(不要每步过 gateway)**。每次 `act` 都过 gateway 会给机器人闭环**每步加一个 gateway hop**,正好抵消 SDK 连接复用省下的握手(~184.9ms)。所以:
51
+ - **connect() 经 gateway 一次**(control plane):resolve model → `scheduler.acquire` → ensure worker up → 返回 **worker 直连 URL(static IP)+ cert 指纹 + `SEQ_DIRECT_SECRET`(per-worker、按代数轮换)+ lease**。
52
+ - **之后 act() 直连 worker**(data plane):SDK 保一条 kept-alive 连接到 worker,`Bearer direct_secret` 打 worker `/act` —— **gateway 不在热路径**,一跳保温。
53
+ - **gateway 仍控 scale-to-zero + 兜底**:worker 归零 / 直连失败 / lease 过期 → SDK 透明回退 gateway 重 acquire(ensure_up:start/boot VM)→ 换新 url+secret → 恢复直连。
54
+ - **复用已有件**:harness `transport/auth.py::make_guard(SEQ_DIRECT_SECRET)` 就是这个直连守卫(早期为「pod 公网 IP 上 /act 直连」建的)。
55
+ - **这正是 Modal 的做法(不是分野)**:Modal 同一 deployed function 有两条路 —— `.remote()` 走控制面任务队列(~100ms 派发开销),`@modal.fastapi_endpoint` 是容器**直连 web 端点、绕开队列**;机器人走后者。我们 direct-connect = 后者,gateway = Modal 控制面(只在 setup/warming 在路径里)。
56
+ - **metering**:gateway 不在热路径 → GPU-秒由 gateway lifecycle 计、request 数由 worker 异步 telemetry(`coldstart.emit` 同模式)上报。
57
+
58
+ ## 范围(只做 v1,不过早复杂化)
59
+
60
+ - **v1(MVP)**:stock pi05 → 自定义 pi 在 GCE L4 上端到端跑通;**1 worker = 1 VM = 1 L4**;`deploy → provision(GCS 拉权重)→ serve → direct-connect → idle 过 cooldown 关 VM`;冷启:首次 create = boot + 45s 拉权重 + JIT,重启免 45s(boot disk 存活,gce-1);83ms/86s 是 4090 数、待 L4 重测(RS-3);SDK warming-wait 兜底。eval 半边:`eval(policy, benchmark)` 批量并行(见 [eval.md](eval.md))。
61
+ - **冷启优化(snapshot / warm pool / weight-cache 等)= 明确不做**,已从本设计删,别过早复杂化;真需要时再从 git 历史捞回。
62
+
63
+ ## 非目标 / 边界
64
+ - **不做训练**;不拥有 model / sim engine / 用户数据(用户 checkpoint pre-stage 到 GCS,平台不 train、不跨租户复用)。
65
+ - **不做 warm pool、不做 snapshot、不做冷启优化**(已从设计删);不做 self-serve 自动镜像 build(先 operator-assisted register)、不做多 region、不做多 provider。
66
+ - eval 半边**已开始规划**(见 [eval.md](eval.md)):**benchmark 是第二类可授权 artifact** —— `@seq.benchmark`「create a benchmark」(LIBERO 是例子,对称于 `@seq.policy`/pi05);`eval()` 是 deploy 后可调的**批量并行函数**(与 `act` 服务解耦、无 gate)。spec 分落 sdk/container/gateway/contracts。首个目标 = agentic VLM + pi0.5 在 LIBERO 上测。simulation-as-product / 更大 Real2Sim2Real loop 仍在此设计之外。
@@ -0,0 +1,86 @@
1
+ # plan review —— 2026-09-27(8 个 Opus reviewer,4 维 × review+skeptic)
2
+
3
+ 四维度 reviewer(correctness / trust-and-money / executability / architecture)各配一个反驳型 skeptic 复核。**28 条发现 → 26 确认、2 驳回**(6 blocker / 15 major / 5 minor)。本文是审计线索 + 修复状态;修复直接改进各 md。
4
+
5
+ ## 决策(用户 2026-09-27)
6
+
7
+ - **worker 直连 TLS**(blocker F1/TM1/A4):选 **公网 IP + 自签证书 + SDK pin**。worker 保留 static external IP(地址稳定跨 stop/start);harness uvicorn 加载自签 cert;connect 响应下发 cert 指纹;SDK 用自定义 SSLContext pin 该指纹(不走默认 CA)。保住「直连省 hop」。
8
+
9
+ ## 状态图例
10
+
11
+ > ✅ **两轮的确认修复已全部落到各设计 md**(commit 见 git log;含 START 的 E1–E9、accounts 的 A1 secret 模型 + ⑨ TLS + TM2/5/7、billing 的 F1/F3/TM3/TM4/A6、contracts/README/eval/references/container/gateway/sdk/observability 的外部事实与 TLS/composite 修正)。➖=驳回(不改)。落完做过残留自检(无「一次性 secret」「restore/boot」「:8000」「Spot ÷3」等矛盾)。
12
+
13
+ ### Blocker
14
+ | id | doc | 一句话 | 状态 |
15
+ |---|---|---|---|
16
+ | F1 / TM1 / A4 | contracts/container/accounts/gateway/sdk/README | 数据面无 TLS,direct_secret 明文可截获重放;GCE ephemeral IP 会变 | ✅ 公网+自签+pin+static IP |
17
+ | E1 | START | 四 repo 无 `integration` 分支,第一个 `worktree add integration` 就 fatal | ✅ runbook 建分支 + build agent fallback |
18
+ | E2 | START | 跨 repo 的 goal-diff 完整性闸算不出(goals 在 base、commit 在目标 repo) | ✅ verifier 在 base 仓查 goal diff |
19
+ | E3 | START | 每个 WU 强制 USER-TEST,基础件(W0.1/C1/C2/G1/A2)无用户面必 escalate | ✅ USER-TEST 降到里程碑级 + user_task 可选 |
20
+ | A1 | accounts | direct_secret per-worker 单值、每 connect 覆盖 → 多机器人互踢 | ✅ 改长寿命 secret、epoch=worker 代数 |
21
+
22
+ ### Major
23
+ | id | doc | 一句话 | 状态 |
24
+ |---|---|---|---|
25
+ | E4 | START | BUILD schema 单 commit 装不下跨仓 WU(W0.2/G1/O5) | ✅ commits[] 数组 |
26
+ | E5 | START/sdk | `@seq.plan` 只在 C4,SDK 侧无 WU 建装饰器 | ✅ PLAN flag 进 W0.1、装饰器进 S1 |
27
+ | E6 | START | O1–O5 没排进 wave 图;「同 wave」违反无 barrier | ✅ 排进 wave 图 |
28
+ | E7 | START/billing | real-tier VM 预算 ≤2 单 agent vs 整 run 口径打架 | ✅ 每 WU ≤1 VM、real run 串行 |
29
+ | E8 | START | REVIEW reviewer 挂掉 fail-open 放行 | ✅ `(!rv || rv.blocking)` |
30
+ | TM2 | accounts/billing | eval `reserved_usd` 余额判定不读 → 并发 eval 穿透超花 | ✅ 预留落成 usage 行 + 缓存同步 |
31
+ | TM3 | gateway/billing | `daily_spend_cap` 算瞬时燃烧非当日累计 → churn 绕过 | ✅ 改当日累计 |
32
+ | TM4 | billing/gateway | killswitch 删 Cloud Run service、不碰 GCE VM → GPU 照烧 | ✅ 改按标签停 GCE 实例 |
33
+ | TM5 | accounts | GPU-秒三处写入无幂等键 → 重复计费 | ✅ record_id=(instance,window) |
34
+ | TM7 | accounts | serve 敞口低估,应是 (boot+cooldown)×单价 | ✅ 改敞口不变式 |
35
+ | A2 | container/sdk/eval | batched composite 与单例 self.instruction 冲突 | ✅ plan 状态 keyed by env |
36
+ | A3 | eval/container | openpi main.py 是 websocket、单 env,不「正好对上 /act」 | ✅ 改「抽 sim 驱动 + 向量化」 |
37
+ | A6 | billing/gateway | serve+eval GPU 上限画在 2 卡池、无全局记账 | ✅ 全局 GPU 会计 |
38
+ | A7 | container/accounts | pi05 真 checkpoint 可能首-load 联网自取,与「从你桶挂载」冲突 | ✅ 加 provenance 核实 |
39
+
40
+ ### Minor
41
+ | id | doc | 一句话 | 状态 |
42
+ |---|---|---|---|
43
+ | F2 | contracts | 端口 8000 应是 8080 | ✅ |
44
+ | F3 | accounts | 漏 `/v1/perceive`(代码注释警告过的 stale) | ✅ |
45
+ | F4 | references | 还留被删的 snapshot 归零结论、与 v1 矛盾 | ✅ 标为已弃 |
46
+ | E9 | START | C5 依赖标成 S5 应是 W0.1 | ✅ |
47
+ | A8 | README/gateway | 权重落盘持久性三处互斥 | ✅ 定死放被保留的 boot disk |
48
+
49
+ ### 驳回(skeptic 判 real=false,不改)
50
+ | id | 为什么不改 |
51
+ |---|---|
52
+ | TM6 | 脱敏「矛盾」不成立:不变式限的是「不进主进程**环境**/端点」,不是「值绝不进主进程内存」;harness 主进程本就是取 secret 注入子进程的那方,建脱敏表不违反 |
53
+ | A5 | reaper idle「只靠异步 usage」不成立:gateway.md 已明写 last_used 由 usage 上报 **+ lease 续租**两条腿刷新 |
54
+
55
+ ---
56
+
57
+ # 第 2 轮:联网核对外部事实(gs-plan-webcheck,task wuvobw554)
58
+
59
+ 4 维(gce-compute / gcp-billing-security / modal / robotics-stack)× reviewer + skeptic(独立**重搜**证伪),每条带 source_url。**11 条 → 7 确认记错(0 blocker / 5 major / 2 minor)、4 驳回;32 条 load-bearing 外部主张验证为对**(Modal DX 映射、GCE suspend/quota/实例身份 JWT/metadata 限额、budget 非硬顶 + Pub/Sub killswitch + detach-billing、Secret Manager 角色、GCS/AR/disk 价、on-demand $0.85 —— 全部核实无误)。
60
+
61
+ ### 确认记错(real=true,待改)
62
+ | id | doc | plan 记错 | 实际(官方) | 状态 |
63
+ |---|---|---|---|---|
64
+ | RS-1 | eval/container | openpi `main.py`「正好对上 harness /act」 | 它是 **msgpack-over-websocket**(`WebsocketClientPolicy` → `serve_policy` 的 `WebsocketPolicyServer`),单-env 顺序 loop,非 HTTP REST | ✅ 改「复用 env-loop,把 infer 那步换成进程内 batched policy.act」(= 一轮 A3) |
65
+ | RS-2 | eval | 用 `pi05_droid` 跑 LIBERO baseline | LIBERO SOTA 是 **`pi05_libero`** checkpoint(README 96.85 avg);droid 的 LIBERO 数不可比 | ✅ baseline 用 pi05_libero;droid 仅作 wire 占位须标注 |
66
+ | RS-3 | references/README | 83ms/34s JIT/86s 当 L4 冷启预算 | 那是 **RTX 4090** 数;L4 带宽 ~1/3(300 vs 1010 GB/s)、FP16 tensor ~73% → L4 warm 大概率数百 ms、JIT 更久 | ✅ 标注 4090 基线、R1/M3 真机重测(= 一轮 improvement) |
67
+ | gce-1 | README | 权重「VM 关即失」、start-after-stop 吃全 45s 重拉 | **boot disk 在 stop 后存活**(只 Local SSD 丢);权重放 boot disk → 重启免 GCS 重拉,只 JIT | ✅ 权重落 boot disk;重启建模为 JIT-only(顺带定死 A8) |
68
+ | F1 | billing | Spot ≈ on-demand 的 1/3 | L4 spot 只省 ~15%($0.72–0.74 vs $0.85);「91% off」不适用抢手的 L4/G2 | ✅ 改 gpu_rates spot 价 + 删「÷3」措辞 |
69
+ | F2 | accounts | `roles/compute.instanceAdmin`(无 .v1) | 预定义角色是 `roles/compute.instanceAdmin.v1`;且 gateway SA 还需 `roles/iam.serviceAccountUser` 才能把 worker SA 附到 VM | ✅ |
70
+ | F3 | billing | 成本表漏 external IP | in-use external IPv4 ~$0.005/hr(spot VM ~$0.0025);teardown 随 VM release,别留 reserved 空转 | ✅ 加一行 |
71
+
72
+ ### 驳回(real=false / 不构成 plan 错)
73
+ | id | 结论 |
74
+ |---|---|
75
+ | modal-tls-gap | Modal 自带 managed TLS(*.modal.run)属实,但我们**已决**公网+自签+pin 正是为补这个 gap → 非 plan 错,已在 TLS 决策里 own |
76
+ | RS-4 | Isaac Sim「几十 GB」不算错:NGC 当前 tag 压缩 9.9GB、解压几十 GB;finding 引的 7GB 是过时值 |
77
+ | gce-2 | finding 的 web_says 错了:static IP 挂在**停机**实例上仍算 in-use($0.005/hr),不是它说的 $0.01/hr 更贵档 → 用 F3 的正确版 |
78
+ | F4 | killswitch 官方 sample 确实硬编 zone/无 label,但 plan 本就说要「adapt」→ 已被一轮 TM4 覆盖 |
79
+
80
+ ## 高价值 improvement(已并入对应修复)
81
+ - secret 模型简化(长寿命 per-worker,epoch=worker 代数)→ 解 A1。
82
+ - 活性权威归一:reaper 认 `lease_expires_at`,lease 过期先探 `/ping` 再 terminate。
83
+ - pi05 的 83ms/86s/290MB/s 是 RunPod-4090/S3 基线,非 L4 → R1/M3 goal 改「量出并记录 L4 数」。
84
+ - eval 端点校验 caller 拥有 model+benchmark(403)。
85
+ - USER-TEST 前由 workflow 显式拉起 mock 端点。
86
+ - dashboard/results-store 补归属 WU 或把 `dashboard_url` 标 optional。