Skip to content

Commit 025d129

Browse files
Pigbibicodex
andcommitted
feat(control): add research kms policy root
Co-Authored-By: Codex <noreply@openai.com>
1 parent 315bdc6 commit 025d129

6 files changed

Lines changed: 29 additions & 16 deletions

docs/QSL_P0_P6_CURRENT_STATE_AND_DRIVER_POLICY.zh-CN.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
| 阶段 | 当前可携带状态 | 边界 |
2121
| --- | --- | --- |
22-
| P0 | 已完成 21 个 retired review caller 的本地清理,待各仓独立提交、CI 与合并;自治运行策略 V2 已有外部签名策略的验签门。`binancequant``charlesschwabquant``firstradequant``interactivebrokersquant``longbridgequant` 已各自安装并读取核验一把公开 Cloud KMS P-256 root;没有 signer IAM、已签 policy 或接入运行服务。 | 仅清理、复核和记录可验证的控制面后续项;不因此推导运行资格。 |
22+
| P0 | 已完成 21 个 retired review caller 的本地清理,待各仓独立提交、CI 与合并;自治运行策略 V2 已有外部签名策略的验签门。`binancequant``charlesschwabquant``firstradequant``interactivebrokersquant``longbridgequant``qslresearchquant` 已各自安装并读取核验一把公开 Cloud KMS P-256 root;没有 signer IAM、已签 policy 或接入运行服务。 | 仅清理、复核和记录可验证的控制面后续项;不因此推导运行资格。 |
2323
| P1–P3 | TQQQ / Alpaca 主线为 **non-live**`2026-08-17` 的一次手动历史链路中,P1 输入获取与私有上传成功,P3 在验证下载后 `PARKED`| 这只说明一次历史研究链路的技术结果,不是策略通过、paper、shadow、live、部署或 promotion 授权。后续工作只能继续准备、核查或产生 non-live 证据。 |
2424
| P4–P6 | 待核定。 | 本文不臆造其具体范围、顺序、目标、验收条件或完成度;主控会话须先取得新的可复核任务定义。 |
2525

@@ -58,7 +58,7 @@ python3 python/scripts/qslctl.py check --repo-root /path/to/consumer-repo
5858
- `2026-08-15``compat/bundles/2026.08.0.toml` 记录该 compatibility bundle 的创建日期。
5959
- `2026-08-17``UsEquitySnapshotPipelines` 合并 TQQQ P1–P3 non-live workflow;同日一次手动运行的 P1 历史输入获取、完整性验证和私有上传成功,P3 验证下载后 `PARKED`。该历史技术结果不表示策略验收或任何 promotion 已获批准。
6060
- `2026-08-19`:只读复核确认上述 P1 根的原始数据按既有短期保留规则自动到期;未复制、延长或删除该数据。P3 停车时的精确内部原因未被持久化,因此不得事后臆造为策略结论。
61-
- `2026-08-19`5 个已计费的券商运行 GCP 项目各创建一把 `EC_SIGN_P256_SHA256` 的 software-protected 公共 P0 root,逐把重新读取 key version 与 PEM 后校验通过;没有授予 signer IAM、没有签发 active policy,也没有修改运行服务`qslresearchquant` 未关联 billing account,保持未初始化。详见下方部署记录。
61+
- `2026-08-19`6 个 Quant GCP 项目各创建一把 `EC_SIGN_P256_SHA256` 的 software-protected 公共 P0 root,逐把重新读取 key version 与 PEM 后校验通过;没有授予 signer IAM、没有签发 active policy,也没有修改运行服务。详见下方部署记录。
6262
- `2026-08-12``docs/QUANT_ROADMAP.md` 被标记为历史指针,历史正文应从 Git history 读取。
6363
- 上述仓内记录只支撑文档、兼容性和协作边界;不支撑账户、密钥、私有位置或任何未重新读取的部署状态。
6464

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"created_at": "2026-08-19T02:35:49Z",
3+
"digest_algorithm": "sha256",
4+
"effective_at": "2026-08-19T02:35:49Z",
5+
"expires_at": "2027-08-19T02:35:49Z",
6+
"kms_key_version": "projects/qslresearchquant/locations/global/keyRings/qsl-p0-policy-root/cryptoKeys/autonomy-policy-root-v1/cryptoKeyVersions/1",
7+
"public_key_pem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEUbq/zI1gufE5N5C5rjvXGezK5ELL\n1gXkFlMLIz7Kw7a8ESwQhbxv+FzzOXlYfa/vPviDsCthEefOdgKBCwnJEA==\n-----END PUBLIC KEY-----\n",
8+
"public_key_sha256": "91bd603d3c226b75e9b7ccabf7a0cbe0f2d667a58e949102c170380021fcbd62",
9+
"root_id": "qsl-qslresearchquant-p0-root-v1",
10+
"schema": "qsl.gcp_kms_policy_root.v1",
11+
"signature_algorithm": "EC_SIGN_P256_SHA256",
12+
"trusted_policy_root_sha256": "22c74c37080d93fefcbcffb91d8862fb2d9a4f3dc81d21d6e7055ebc1b93e7d3"
13+
}

docs/qsl_autonomous_operating_policy_v2.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,4 @@ Cloud KMS 根固定到一个具体 CryptoKeyVersion,并使用 `EC_SIGN_P256_SH
6969

7070
本次控制面升级将 `qsl.activation.v1` / `human_authority` 和依赖它的 `qsl.reconciliation_record.v1` 一并替换为 V2。仓内未发现已签发的 activation 工件,因此不保留双协议运行路径。
7171

72-
5 个已计费的券商运行 GCP 项目现已有公开 Cloud KMS root,且 key version 和 PEM 已逐把读取核验;详见 [GCP P0 控制根部署 V1](qsl_gcp_p0_control_root_deployment_v1.zh-CN.md)。这些 root 没有 signer IAM,root digest 也尚未注入任何运行服务。仓内仍没有签名 policy 或已接入该 gate 的执行服务;因此仍然**没有 active 自治策略**,也没有启用 P4–P6、账户、订单或资金动作。下一步只能在独立控制根准备就绪后,把 gate 接到 paper 的确定性执行风控服务;不能把本文件、测试签名或 CI 绿灯当成运行许可。
72+
6 个 Quant GCP 项目现已有公开 Cloud KMS root,且 key version 和 PEM 已逐把读取核验;详见 [GCP P0 控制根部署 V1](qsl_gcp_p0_control_root_deployment_v1.zh-CN.md)。这些 root 没有 signer IAM,root digest 也尚未注入任何运行服务。仓内仍没有签名 policy 或已接入该 gate 的执行服务;因此仍然**没有 active 自治策略**,也没有启用 P4–P6、账户、订单或资金动作。下一步只能在独立控制根准备就绪后,把 gate 接到 paper 的确定性执行风控服务;不能把本文件、测试签名或 CI 绿灯当成运行许可。

docs/qsl_deterministic_execution_gateway_v1.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ AI / driver(研究、监测、证据)
7171
3. 接入只读对账,验证断网、时钟偏差、数据/策略不一致和重复幂等键都默认为 `PARKED`
7272
4. 仅当上述证据完整时,再为纸面或影子执行提出新的、可复核的任务定义。
7373

74-
第 1 步的公开 Cloud KMS root 已在 5 个已计费的券商运行项目初始化,并逐把读取核验;记录见 [GCP P0 控制根部署 V1](qsl_gcp_p0_control_root_deployment_v1.zh-CN.md)。但其 SHA-256 尚未注入任何网关部署配置,步骤 2–3 也未在任何真实服务安装。本设计和 P0 准入代码都不能被作为部署、交易或 promotion 许可。
74+
第 1 步的公开 Cloud KMS root 已在 6 个 Quant GCP 项目初始化,并逐把读取核验;记录见 [GCP P0 控制根部署 V1](qsl_gcp_p0_control_root_deployment_v1.zh-CN.md)。但其 SHA-256 尚未注入任何网关部署配置,步骤 2–3 也未在任何真实服务安装。本设计和 P0 准入代码都不能被作为部署、交易或 promotion 许可。

docs/qsl_gcp_p0_control_root_deployment_v1.zh-CN.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# QSL GCP P0 控制根部署 V1
22

3-
> 状态:`P0_ROOT_BOOTSTRAP_IMPLEMENTED_NOT_RUNTIME_WIRED`
3+
> 状态:`P0_SIX_PUBLIC_ROOTS_DEPLOYED_NOT_RUNTIME_WIRED`
44
>
55
> 本文只定义 Cloud KMS 的公开验签根初始化;不创建订单接口、不授予任何工作负载签名权限、不读取券商或市场数据,也不改变现有 Cloud Run、GitHub Actions、账户或资金路径。
66
@@ -12,18 +12,18 @@ P0 按独立运行/GCP 项目隔离根:一个根只对应一个 project 的后
1212

1313
| GCP 项目 | P0 根覆盖的主要仓库/运行域 | 资源状态(2026-08-19 盘点) |
1414
| --- | --- | --- |
15-
| `binancequant` | `BinancePlatform``CryptoStrategies``CryptoLivePoolPipelines` | 已计费,可初始化 |
16-
| `charlesschwabquant` | `CharlesSchwabPlatform``SchwabTokenAutoRefresher` | 已计费,可初始化 |
17-
| `firstradequant` | `FirstradePlatform` | 已计费,可初始化 |
18-
| `interactivebrokersquant` | `InteractiveBrokersPlatform``IBKRGatewayManager`、美股策略/快照链 | 已计费,可初始化 |
19-
| `longbridgequant` | `LongBridgePlatform`、港股策略/快照链 | 已计费,可初始化 |
20-
| `qslresearchquant` | 研究、信号与上下文仓 | 当前未关联 billing account;不得尝试初始化 |
15+
| `binancequant` | `BinancePlatform``CryptoStrategies``CryptoLivePoolPipelines` | 已初始化并读取核验 |
16+
| `charlesschwabquant` | `CharlesSchwabPlatform``SchwabTokenAutoRefresher` | 已初始化并读取核验 |
17+
| `firstradequant` | `FirstradePlatform` | 已初始化并读取核验 |
18+
| `interactivebrokersquant` | `InteractiveBrokersPlatform``IBKRGatewayManager`、美股策略/快照链 | 已初始化并读取核验 |
19+
| `longbridgequant` | `LongBridgePlatform`、港股策略/快照链 | 已初始化并读取核验 |
20+
| `qslresearchquant` | 研究、信号与上下文仓 | 已初始化并读取核验 |
2121

2222
核心控制/资料仓(例如 `QuantRuntimeSettings``QuantPlatformKit``AIAuditBridge`)不直接拥有 Cloud KMS 根。它们只能验证公开 root record,不能签名。
2323

2424
## 最小资源与权限
2525

26-
对每个已计费项目,初始化器只会创建:
26+
对每个项目,初始化器只会创建:
2727

2828
1. 启用 `cloudkms.googleapis.com`
2929
2. 不可删除的 key ring:`global/qsl-p0-policy-root`
@@ -41,11 +41,11 @@ Cloud KMS 将 `EC_SIGN_P256_SHA256` 作为推荐椭圆曲线签名算法;公
4141
```bash
4242
python3 python/scripts/provision_gcp_kms_policy_roots.py \
4343
--project binancequant --project charlesschwabquant --project firstradequant \
44-
--project interactivebrokersquant --project longbridgequant
44+
--project interactivebrokersquant --project longbridgequant --project qslresearchquant
4545
```
4646

47-
得到授权后才附加 `--apply`。初始化器会在**所有项目 billing 预检通过后**才开始改动;重跑会验证既有 key 的 purpose 和算法,不会替换密钥。每个公开记录写入 `docs/p0_control_roots/gcp/<project>.json`;该文件不含私钥、KMS credential 或订单/账户资料。
47+
得到授权后才附加 `--apply`。初始化器会在**所有项目 billing 预检通过后**才开始改动;重跑会验证既有 key 的 purpose 和算法,不会替换密钥。2026-08-19 已对表中的六个项目执行初始化,并逐把重新读取 version、PEM 和 SHA-256 后通过交叉核验。每个公开记录写入 `docs/p0_control_roots/gcp/<project>.json`;该文件不含私钥、KMS credential 或订单/账户资料。
4848

4949
根 record 的 SHA-256 还不能放进 workflow input 或仓库变量当作“外部 pin”。真正接入未来只读核对服务时,`QSL_TRUSTED_POLICY_ROOT_SHA256` 必须由该服务独立控制的部署配置注入;本 P0 bootstrap 不修改现有运行服务,因此也不假称已接入。
5050

51-
`qslresearchquant` 在关联明确的 billing account 前保持 `PARKED`不能为省事把研究 policy 改由某个券商项目的根签发,因为那会扩大跨域故障半径。
51+
六个项目现在各自拥有独立 root;不能为省事把研究 policy 改由某个券商项目的根签发,因为那会扩大跨域故障半径。

python/tests/test_provision_gcp_kms_policy_roots.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def test_checked_in_public_root_records_are_closed_and_self_validating(self):
9292
records = {path.stem: json.loads(path.read_text(encoding="utf-8")) for path in root_directory.glob("*.json")}
9393
self.assertEqual(
9494
set(records),
95-
{"binancequant", "charlesschwabquant", "firstradequant", "interactivebrokersquant", "longbridgequant"},
95+
{"binancequant", "charlesschwabquant", "firstradequant", "interactivebrokersquant", "longbridgequant", "qslresearchquant"},
9696
)
9797
for project, root in records.items():
9898
with self.subTest(project=project):

0 commit comments

Comments
 (0)