From 1b98111c9a56d4c533073596b8e303bb2ec9c3f7 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:01:02 +0800 Subject: [PATCH 01/32] docs(prediction): add day2 verification record --- .../data-concepts/prediction-day2-targets.mdx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 0b48310..f4b0b65 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -102,3 +102,58 @@ icon: "list-check" 7. 缓存:`PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false` 时没有 firstscreen queue 堆积,也没有持续 firstscreen cache write 日志。 8. 日志:生产无持续 decode error、ClickHouse insert error、cache write error。 9. 发布:aggregation/services/SDK 的生产记录均包含 tag 值、对应 main commit、workflow 或 rollout 链接。 + +## 2026-06-05 验收记录 + +### 已验证 + +- services 已合并 PR 并从 `main` 打 tag:`v1.20260605-prediction-activities`,对应 main commit `1cc1250`。 +- aggregation-pipelines 已合并 PR: + - `#37 feat(prediction): add wallet token activities pipeline`,merge commit `f21974b0`。 + - `#38 fix: make prediction activity release build pass`,merge commit `3e55e724`。 +- aggregation 生产部署 tag 为 `deploy-prediction-activities-20260605-3e55e724`,该 tag 中: + - topic job 配置 `polygon.v2.prediction.wallet-token-activities` retention 为 `86400000`。 + - realtime channel 固定为 `pred:evt:{event_slug}:act` 与 `pred:tok:{token_id}:act`。 + - realtime payload 外层为 `a`,内部字段使用 `id`、`amt`、`cid`、`mid`、`tid`、`tx`、`ty` 等短字段。 + - activity Kafka、realtime、firstscreen cache publish 均为 best-effort;失败只记录 debug 日志并继续主流程。 + - `PREDICTION_FIRSTSCREEN_CACHE_ENABLED` 默认值为 `false`。 + - `PREDICTION_FIRSTSCREEN_CACHE_TTL_SECS` 默认值为 `86400`。 +- activity 映射单测覆盖: + - buy 使用 `trade_buyer`。 + - sell 使用 `trade_seller`。 + - redemption 映射为 `redeem`。 + - split/merge 映射为 `inventory_adjust`。 +- services OpenAPI 单测 `verify_prediction_event_activities_schema` 锁定 `chainstream_fields >= features_new_fields`,并要求画像兜底字段存在。 +- 生产 services 端口转发 API 验收已完成: + - `GET /v1/prediction/events/world-cup-winner/activities?limit=20` 返回 200。 + - 返回 20 条 activity。 + - activity item 字段数为 27,Future.news activity 字段映射后缺失字段为 `[]`。 + - 相比 Future.news activity item 额外返回 `activityId`、`conditionId`、`logIndex`、`source`。 + - 当前页 `activityId` 无重复,`seqIndex` 倒序。 + - `takerImage`、`takerName`、`takerPseudonym` 缺失画像时仍返回 key,值为空字符串。 +- chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 12 ahead`。 +- chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4624807620`。 +- SDK 本地验证已完成: + - TypeScript example build 通过。 + - TypeScript SDK build 通过。 + - TypeScript stream tests 通过。 + - Rust example `cargo check` 通过。 + - Rust stream tests 通过。 +- SDK 静态与测试覆盖: + - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 + - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 + - REST API 方法和类型由 `openapi.yaml` 生成。 + +### 待最终验收 + +- SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 +- SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 +- 当前环境没有 `CHAINSTREAM_ACCESS_TOKEN` 或 `CHAINSTREAM_API_KEY`,尚未完成 SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收。 +- 当前 kubectl 集群查询超时,尚未补最新一轮 rollout/logs/cache queue 的运行态截图或命令输出。 +- 公网 `https://api.chainstream.io` unauthenticated curl 返回 Cloudflare `402`,接口验收以 production services port-forward 结果为准。 +- SDK PR 当前 CI 为 `UNSTABLE`: + - TypeScript/Rust build、tests、examples 通过。 + - TypeScript lint 存在全仓 JSDoc/member-ordering/import baseline 问题。 + - Python lint/format 存在 ruff baseline 问题,Python tests 通过。 + - Go lint/test 存在生成 openapi client unused imports 与缺依赖问题。 From 49cc53712b55d63fc2b4964902befd62ecc235c4 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:04:10 +0800 Subject: [PATCH 02/32] docs(prediction): refresh sdk verification head --- cn/guides/data-concepts/prediction-day2-targets.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index f4b0b65..5bc2993 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -132,12 +132,13 @@ icon: "list-check" - 当前页 `activityId` 无重复,`seqIndex` 倒序。 - `takerImage`、`takerName`、`takerPseudonym` 缺失画像时仍返回 key,值为空字符串。 - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 12 ahead`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 13 ahead`,当前 head commit 为 `37d2c53`。 - chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4624807620`。 - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 - TypeScript stream tests 通过。 + - TypeScript activity 相关文件 Prettier check 通过。 - Rust example `cargo check` 通过。 - Rust stream tests 通过。 - SDK 静态与测试覆盖: From 037b02e5b16d42333b012f742344cccf02343ad5 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:10:06 +0800 Subject: [PATCH 03/32] docs(prediction): clarify day2 verification gates --- cn/guides/data-concepts/prediction-day2-targets.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 5bc2993..ec571e8 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -150,8 +150,8 @@ icon: "list-check" - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 -- 当前环境没有 `CHAINSTREAM_ACCESS_TOKEN` 或 `CHAINSTREAM_API_KEY`,尚未完成 SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收。 -- 当前 kubectl 集群查询超时,尚未补最新一轮 rollout/logs/cache queue 的运行态截图或命令输出。 +- 当前环境没有 `CHAINSTREAM_ACCESS_TOKEN` 或 `CHAINSTREAM_API_KEY`;仓库内只找到 SDK `.env.example`,尚未完成 SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收。 +- 当前 kubectl 集群查询超时,尚未补最新一轮 rollout/logs/cache queue 的运行态截图或命令输出。当前 kubeconfig 通过 `aws eks get-token --cluster-name dexes-k8s-cluster` 鉴权;`aws sts get-caller-identity` 与 `aws eks describe-cluster` 在禁用 EC2 metadata 后仍超时,需要先恢复本机 AWS 凭证链或网络访问。 - 公网 `https://api.chainstream.io` unauthenticated curl 返回 Cloudflare `402`,接口验收以 production services port-forward 结果为准。 - SDK PR 当前 CI 为 `UNSTABLE`: - TypeScript/Rust build、tests、examples 通过。 From 922d5374e7d712783b35d780dff56aec78b40b19 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:17:11 +0800 Subject: [PATCH 04/32] docs(prediction): record sdk ci gate evidence --- cn/guides/data-concepts/prediction-day2-targets.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index ec571e8..952733d 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -141,6 +141,10 @@ icon: "list-check" - TypeScript activity 相关文件 Prettier check 通过。 - Rust example `cargo check` 通过。 - Rust stream tests 通过。 + - 复核 `git diff --check origin/main...HEAD` 通过。 + - 复核 TypeScript activity 相关文件 Prettier check 通过。 + - 复核 `corepack pnpm --dir typescript test -- --run src/stream/stream.test.ts` 通过,5 个 test files / 31 个 tests 通过。 + - 复核 `cargo test --manifest-path rust/Cargo.toml stream --lib` 通过,7 个 tests 通过。 - SDK 静态与测试覆盖: - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 @@ -158,3 +162,4 @@ icon: "list-check" - TypeScript lint 存在全仓 JSDoc/member-ordering/import baseline 问题。 - Python lint/format 存在 ruff baseline 问题,Python tests 通过。 - Go lint/test 存在生成 openapi client unused imports 与缺依赖问题。 + - SDK PR diff 未包含 `go/` 或 `python/` 文件变更,Go/Python 红灯不是本次 prediction activity SDK 改动直接引入;若 SDK 发布要求所有语言 CI 全绿,需在 release 前单独修复这些 baseline。 From 742db0397a8b13c183e553cae2627ab50bcc2082 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:22:31 +0800 Subject: [PATCH 05/32] docs(prediction): add services tag verification evidence --- cn/guides/data-concepts/prediction-day2-targets.mdx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 952733d..fc9a0f2 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -108,6 +108,7 @@ icon: "list-check" ### 已验证 - services 已合并 PR 并从 `main` 打 tag:`v1.20260605-prediction-activities`,对应 main commit `1cc1250`。 +- services 当前本地复核工作区干净,HEAD 为 `main`,且指向 tag `v1.20260605-prediction-activities`。 - aggregation-pipelines 已合并 PR: - `#37 feat(prediction): add wallet token activities pipeline`,merge commit `f21974b0`。 - `#38 fix: make prediction activity release build pass`,merge commit `3e55e724`。 @@ -118,12 +119,17 @@ icon: "list-check" - activity Kafka、realtime、firstscreen cache publish 均为 best-effort;失败只记录 debug 日志并继续主流程。 - `PREDICTION_FIRSTSCREEN_CACHE_ENABLED` 默认值为 `false`。 - `PREDICTION_FIRSTSCREEN_CACHE_TTL_SECS` 默认值为 `86400`。 +- aggregation 当前本地工作区仍停在 Day1 metadata 分支,且有大量未提交改动;topic retention 验证以 `origin/main` 与生产部署 tag 为准,两者均为 `86400000`,不以该本地工作区文件为准。 - activity 映射单测覆盖: - buy 使用 `trade_buyer`。 - sell 使用 `trade_seller`。 - redemption 映射为 `redeem`。 - split/merge 映射为 `inventory_adjust`。 - services OpenAPI 单测 `verify_prediction_event_activities_schema` 锁定 `chainstream_fields >= features_new_fields`,并要求画像兜底字段存在。 +- services tag 上复核 focused tests: + - `cargo test -p api verify_prediction_event_activities_schema` 通过。 + - `cargo test -p infrastructure firstscreen_cache_requires_first_unfiltered_desc_page` 通过。 + - `cargo test -p infrastructure prediction_activity_firstscreen_keys_match_aggregation_contract` 通过。 - 生产 services 端口转发 API 验收已完成: - `GET /v1/prediction/events/world-cup-winner/activities?limit=20` 返回 200。 - 返回 20 条 activity。 From d23781e83a14f34f51f494e30b8f152472075afc Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:29:26 +0800 Subject: [PATCH 06/32] docs(prediction): record public api field comparison --- cn/guides/data-concepts/prediction-day2-targets.mdx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index fc9a0f2..4cb439c 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -137,6 +137,16 @@ icon: "list-check" - 相比 Future.news activity item 额外返回 `activityId`、`conditionId`、`logIndex`、`source`。 - 当前页 `activityId` 无重复,`seqIndex` 倒序。 - `takerImage`、`takerName`、`takerPseudonym` 缺失画像时仍返回 key,值为空字符串。 +- 公网 API Bearer 鉴权验收已完成: + - `GET https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?limit=20` 返回 200。 + - 使用第一页 cursor 请求第二页返回 200。 + - 第一页与第二页各返回 20 条 activity,页内与跨页均无重复 `activityId`。 + - `seqIndex` 页内倒序,第一页末尾到第二页开头仍保持倒序。 + - Future.news 样本字段数为 23,公网 ChainStream activity item 字段数为 27,映射覆盖 23/23,缺失字段为 `[]`。 + - 公网 ChainStream 相比 Future.news 额外返回 `activityId`、`conditionId`、`logIndex`、`source`。 + - 第一页 activity type 覆盖 `buy`、`sell`、`inventory_adjust`。 + - 缺失画像类字段仍返回 key;当前样本中 `takerImage`、`takerName`、`takerPseudonym` 为空字符串兜底。 + - 当前样本中部分 `inventory_adjust` activity 的 `takerOrderHash` 为空字符串兜底,字段 key 保持存在。 - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 - chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 13 ahead`,当前 head commit 为 `37d2c53`。 - chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4624807620`。 From 0d0fa094f5df7815684aab91a6519c865d3c3469 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:40:52 +0800 Subject: [PATCH 07/32] docs(prediction): record pagination duplicate follow-up --- .../data-concepts/prediction-day2-targets.mdx | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 4cb439c..1c45d47 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -130,6 +130,14 @@ icon: "list-check" - `cargo test -p api verify_prediction_event_activities_schema` 通过。 - `cargo test -p infrastructure firstscreen_cache_requires_first_unfiltered_desc_page` 通过。 - `cargo test -p infrastructure prediction_activity_firstscreen_keys_match_aggregation_contract` 通过。 +- production rollout 已复核: + - `chainstream/services` 运行镜像为 `440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/service:v1.20260605-prediction-activities`,deployment 为 `2/2` ready,pod restart 为 `0`。 + - `pol-prediction-trades-to-clickhouse-pipeline` 与 `pol-prediction-settlements-to-clickhouse-pipeline` 运行镜像均为 `440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/aggregation/prediction-to-clickhouse-pipeline:deploy-prediction-activities-20260605-3e55e724`,deployment 为 `1/1` ready,pod restart 为 `0`。 + - services、trades sink、settlements sink 最近日志未发现持续 `decode error`、`ClickHouse insert`、`cache write`、`prediction activity failed`、`panic`、`fatal`、`error`。 +- 生产 topic 与 ClickHouse 已复核: + - Redpanda topic `polygon.v2.prediction.wallet-token-activities` partitions 为 `12`,`retention.ms` 为 `86400000`,`retention.local.target.ms` 为 `86400000`。 + - ClickHouse local table engine 为 `MergeTree`,`ORDER BY (event_slug, seq_index, activity_id)`,热表 TTL 为 `ts + toIntervalDay(3)`。 + - ClickHouse 当前 activity 样本存在 `buy`、`sell`、`inventory_adjust`,但原始表中发现少量重复 `activity_id`,需由 API 查询层去重。 - 生产 services 端口转发 API 验收已完成: - `GET /v1/prediction/events/world-cup-winner/activities?limit=20` 返回 200。 - 返回 20 条 activity。 @@ -137,7 +145,7 @@ icon: "list-check" - 相比 Future.news activity item 额外返回 `activityId`、`conditionId`、`logIndex`、`source`。 - 当前页 `activityId` 无重复,`seqIndex` 倒序。 - `takerImage`、`takerName`、`takerPseudonym` 缺失画像时仍返回 key,值为空字符串。 -- 公网 API Bearer 鉴权验收已完成: +- 公网 API Bearer 鉴权验收已完成,并于 2026-06-05 重新拉取确认: - `GET https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?limit=20` 返回 200。 - 使用第一页 cursor 请求第二页返回 200。 - 第一页与第二页各返回 20 条 activity,页内与跨页均无重复 `activityId`。 @@ -147,6 +155,14 @@ icon: "list-check" - 第一页 activity type 覆盖 `buy`、`sell`、`inventory_adjust`。 - 缺失画像类字段仍返回 key;当前样本中 `takerImage`、`takerName`、`takerPseudonym` 为空字符串兜底。 - 当前样本中部分 `inventory_adjust` activity 的 `takerOrderHash` 为空字符串兜底,字段 key 保持存在。 + - 当前最新两页已满足字段完整性与普通 cursor 分页验收。 +- 深分页重复问题已定位: + - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 + - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 + - PR #29 在 ClickHouse 查询中增加 `LIMIT 1 BY activity_id`,在 API page limit 前按 `activity_id` 去重。 + - PR #29 focused tests 已通过: + - `cargo test -p infrastructure database::prediction::tests` + - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 - chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 13 ahead`,当前 head commit 为 `37d2c53`。 - chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4624807620`。 @@ -168,11 +184,13 @@ icon: "list-check" ### 待最终验收 +- services PR #29 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 +- services PR #29 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测深分页探针重复数为 `0`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 -- 当前环境没有 `CHAINSTREAM_ACCESS_TOKEN` 或 `CHAINSTREAM_API_KEY`;仓库内只找到 SDK `.env.example`,尚未完成 SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收。 -- 当前 kubectl 集群查询超时,尚未补最新一轮 rollout/logs/cache queue 的运行态截图或命令输出。当前 kubeconfig 通过 `aws eks get-token --cluster-name dexes-k8s-cluster` 鉴权;`aws sts get-caller-identity` 与 `aws eks describe-cluster` 在禁用 EC2 metadata 后仍超时,需要先恢复本机 AWS 凭证链或网络访问。 -- 公网 `https://api.chainstream.io` unauthenticated curl 返回 Cloudflare `402`,接口验收以 production services port-forward 结果为准。 +- SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 +- Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成。 +- Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 - SDK PR 当前 CI 为 `UNSTABLE`: - TypeScript/Rust build、tests、examples 通过。 - TypeScript lint 存在全仓 JSDoc/member-ordering/import baseline 问题。 From 5d1e1b1d75f203cb2fee1b2b8fca90629616bd38 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 02:48:04 +0800 Subject: [PATCH 08/32] docs(prediction): record realtime live check status --- cn/guides/data-concepts/prediction-day2-targets.mdx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 1c45d47..71e5169 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -181,6 +181,12 @@ icon: "list-check" - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 - REST API 方法和类型由 `openapi.yaml` 生成。 +- SDK live 订阅验收尝试已完成: + - 使用 `~/.chainstream/credentials.env` client credentials 获取 fresh token,token 有效期为 24 小时。 + - TypeScript SDK PR 分支本地 `dist` 可以完成 REST seed:`world-cup-winner` 拉取 50 条 activity,并从中得到 token channel 列表。 + - TypeScript SDK 能连接 `wss://realtime-dex.chainstream.io/connection/websocket`,连接阶段通过。 + - 订阅 `pred:evt:world-cup-winner:act` 与 `pred:tok:{tokenId}:act` 时,production realtime 返回 `code=102, message=unknown channel`。 + - 判断:SDK channel 构造与解析逻辑已由本地测试覆盖,但 production realtime 侧尚未开放 `pred` namespace,因此 realtime live receive 与 SDK live receive 尚未通过。 ### 待最终验收 @@ -189,7 +195,7 @@ icon: "list-check" - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 -- Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成。 +- Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 - SDK PR 当前 CI 为 `UNSTABLE`: - TypeScript/Rust build、tests、examples 通过。 From 687314591d4244275afdcec82743312a3ee326ba Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 03:09:20 +0800 Subject: [PATCH 09/32] docs(prediction): add activities api comparison --- .../prediction-activities-api-comparison.md | 216 ++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 cn/guides/data-concepts/prediction-activities-api-comparison.md diff --git a/cn/guides/data-concepts/prediction-activities-api-comparison.md b/cn/guides/data-concepts/prediction-activities-api-comparison.md new file mode 100644 index 0000000..32f24ff --- /dev/null +++ b/cn/guides/data-concepts/prediction-activities-api-comparison.md @@ -0,0 +1,216 @@ +# Prediction Activities API 对比 + +本文记录 ChainStream prediction activities API 的调用方式、当前返回样本、futures.new 抓包样本,以及字段差异。 + +验证日期:2026-06-05 +ChainStream event:`world-cup-winner` +ChainStream endpoint:`GET https://api.chainstream.io/v1/prediction/events/{event_slug}/activities` + +## ChainStream 调用方式 + +先通过 client credentials 获取 Bearer token,再调用 activities API。 + +```bash +export CHAINSTREAM_CLIENT_ID="..." +export CHAINSTREAM_CLIENT_SECRET="..." +export CHAINSTREAM_AUTH_URL="..." +export CHAINSTREAM_AUDIENCE="..." + +TOKEN="$( + curl -sS "$CHAINSTREAM_AUTH_URL" \ + -H "Content-Type: application/json" \ + -d "{ + \"grant_type\": \"client_credentials\", + \"client_id\": \"$CHAINSTREAM_CLIENT_ID\", + \"client_secret\": \"$CHAINSTREAM_CLIENT_SECRET\", + \"audience\": \"$CHAINSTREAM_AUDIENCE\" + }" | jq -r '.access_token' +)" + +curl -sS \ + "https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?limit=1" \ + -H "Authorization: Bearer $TOKEN" +``` + +支持的 query 参数: + +| 参数 | 说明 | +|---|---| +| `cursor` | 上一页返回的 cursor,用于继续分页 | +| `limit` | 返回条数,当前接口支持 clamp 到服务端上限 | +| `token_id` | 按 outcome token id 过滤 | +| `market_id` | 按 market id 过滤,兼容 condition id 语义 | +| `condition_id` | 按 condition id 过滤 | +| `wallet` | 按 taker wallet 过滤 | +| `activity_type` | `buy` / `sell` / `redeem` / `inventory_adjust` | +| `order` | `desc` 或 `asc` | + +## ChainStream 返回样本 + +请求: + +```http +GET /v1/prediction/events/world-cup-winner/activities?limit=1 +``` + +返回: + +```json +{ + "eventSlug": "world-cup-winner", + "cursor": "WyIxNzgwNjAwMDg2MDAwMDAwMDQiLCIweDQ2MTIwNDk0Yzc0NjRhMTJiNWYxMjhlOTgxYWE0YTg0YWYxNjQ3MTY4MGY3Y2I2NGI2NThkY2UxZDczMmZmOWE6NDoxMDY1OTM1Mzk0MzcwMzI0Njc2MTUxNDg1NTM3MDc5OTg0NzI4MjkzMzQwNTA2MTcxMjgyNDQ5MjA4MjE5MTcwMjU3NDY0ODExODQxMDk6c2VsbCJd", + "limit": 1, + "order": "desc", + "retentionDays": 3, + "activities": [ + { + "activityId": "0x46120494c7464a12b5f128e981aa4a84af16471680f7cb64b658dce1d732ff9a:4:106593539437032467615148553707998472829334050617128244920821917025746481184109:sell", + "amount": "0.999999", + "assetIds": [ + "106593539437032467615148553707998472829334050617128244920821917025746481184109", + "22335540631248526397385139154377717431237265005174891396662761131414559126312" + ], + "blockNumber": 87930067, + "conditionId": "0xe5bd80313b8859e3f5761568ac9498866ea9d4419e4d1b6a877a9a9bd2754cb4", + "eventSlug": "world-cup-winner", + "logIndex": 4, + "marketIcon": "https://polymarket-upload.s3.us-east-2.amazonaws.com/world-cup-winner-croatia-flag-20260603-192743.png", + "marketId": "558976", + "marketQuestion": "Will Croatia win the 2026 FIFA World Cup?", + "outcome": "Yes", + "outcomes": [ + "Yes", + "No" + ], + "price": "0.0089999910089999", + "quantity": "111.111111", + "seqIndex": 178060008600000004, + "source": "chainstream", + "taker": "0xe2222d279d744050d28e00520010520000310F59", + "takerAge": 0, + "takerImage": "", + "takerName": "", + "takerOrderHash": "0x47d38fed0cdeb7d4487e652142cdf1fc75cc5015cc142a6dcbc12a475e7c3569", + "takerPseudonym": "", + "takerTags": [], + "timestamp": 1780600086000, + "tokenId": "106593539437032467615148553707998472829334050617128244920821917025746481184109", + "txHash": "0x46120494c7464a12b5f128e981aa4a84af16471680f7cb64b658dce1d732ff9a", + "type": "sell" + } + ] +} +``` + +## futures.new 返回样本 + +样本来源:本地 Future.news 抓包样本,`event_slug=world-cup-winner`。 + +返回: + +```json +{ + "code": 0, + "reason": "", + "message": "success", + "data": { + "activities": [ + { + "taker": "0xc0066bf4d562183a49f4570f5b68ecd962d65d0b", + "taker_name": "0xc0066BF4D562183A49f4570F5B68ecD962d65d0b-1780174254021", + "taker_pseudonym": "Surprised-Bugle", + "taker_image": "", + "taker_age": 1780174594000, + "type": "sell", + "event_slug": "world-cup-winner", + "asset_ids": null, + "outcomes": null, + "market_id": "0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894", + "market_question": "Will France win the 2026 FIFA World Cup?", + "market_icon": "", + "token_id": "108233603819467706476318984012158651931658302669301887462181073562758483842092", + "outcome": "Yes", + "quantity": "6", + "amount": "1.02", + "taker_order_hash": "0xc85b977249aa57b9da846937b90e2e7f9b7aaf724715b6cb7bee47655d1cf259", + "seq_index": 87812400001579, + "block_number": 0, + "tx_hash": "0x9ab944b84e19d6d64cdf3f94f7c355ff2f77d6d64ed1ff363fcffd3a645c0f7a", + "timestamp": 1780411421000, + "price": "0.17", + "taker_tags": [ + "fresh_wallet" + ] + } + ], + "cursor": "ODc4MTE4OTAwMDA2NjM=" + } +} +``` + +## 顶层结构差异 + +| 对比项 | ChainStream | futures.new | +|---|---|---| +| HTTP envelope | 直接返回业务对象 | 外层为 `code` / `reason` / `message` / `data` | +| activities 路径 | `activities` | `data.activities` | +| cursor 路径 | `cursor` | `data.cursor` | +| event slug | `eventSlug` | activity 内的 `event_slug` | +| limit | `limit` | 未在样本顶层返回 | +| order | `order` | 未在样本顶层返回 | +| 数据保留说明 | `retentionDays` | 未在样本顶层返回 | +| 字段命名风格 | `camelCase` | `snake_case` | + +## Activity 字段对比 + +| futures.new 字段 | ChainStream 字段 | 状态 | 说明 | +|---|---|---|---| +| `taker` | `taker` | 对齐 | taker wallet | +| `taker_name` | `takerName` | 对齐 | 缺失时返回 `""` | +| `taker_pseudonym` | `takerPseudonym` | 对齐 | 缺失时返回 `""` | +| `taker_image` | `takerImage` | 对齐 | 缺失时返回 `""` | +| `taker_age` | `takerAge` | 对齐 | 数字 | +| `type` | `type` | 对齐 | `buy` / `sell` / `redeem` / `inventory_adjust` | +| `event_slug` | `eventSlug` | 对齐 | 当前 Day2 支持 `world-cup-winner` | +| `asset_ids` | `assetIds` | 对齐 | futures 样本为 `null`,ChainStream 可返回数组 | +| `outcomes` | `outcomes` | 对齐 | futures 样本为 `null`,ChainStream 可返回数组 | +| `market_id` | `marketId` / `conditionId` | 语义拆分 | futures 样本里的 `market_id` 是 condition id 风格;ChainStream 同时返回 numeric `marketId` 和 hex `conditionId` | +| `market_question` | `marketQuestion` | 对齐 | 市场问题 | +| `market_icon` | `marketIcon` | 对齐 | 缺失时返回 `""` | +| `token_id` | `tokenId` | 对齐 | outcome token id | +| `outcome` | `outcome` | 对齐 | 如 `Yes` / `No` | +| `quantity` | `quantity` | 对齐 | 字符串 | +| `amount` | `amount` | 对齐 | 字符串 | +| `taker_order_hash` | `takerOrderHash` | 对齐 | settlement 或 inventory 类 activity 可能返回 `""` | +| `seq_index` | `seqIndex` | 对齐 | 排序和 cursor 使用 | +| `block_number` | `blockNumber` | 对齐 | ChainStream 返回链上 block number;futures 样本为 `0` | +| `tx_hash` | `txHash` | 对齐 | 交易 hash | +| `timestamp` | `timestamp` | 对齐 | 毫秒时间戳 | +| `price` | `price` | 对齐 | 字符串 | +| `taker_tags` | `takerTags` | 对齐 | 缺失时返回 `[]` | + +## ChainStream 额外字段 + +| ChainStream 字段 | futures.new 是否存在 | 说明 | +|---|---|---| +| `activityId` | 否 | activity 唯一 ID,用于去重和幂等 | +| `conditionId` | 否 | Polymarket condition id | +| `logIndex` | 否 | 链上 log index | +| `source` | 否 | 数据来源,当前为 `chainstream` | + +## 数量对比 + +| 对比项 | ChainStream | futures.new | +|---|---:|---:| +| activity item 字段数 | 27 | 23 | +| futures.new 字段映射缺失 | 0 | - | +| ChainStream 额外字段数 | 4 | - | + +## 差异结论 + +1. ChainStream activity 字段集合覆盖 futures.new activity 字段集合,按命名映射后缺失字段为 `[]`。 +2. ChainStream 使用 `camelCase`,futures.new 使用 `snake_case`。 +3. ChainStream 顶层不返回 `code/reason/message/data` wrapper,而是直接返回业务对象。 +4. ChainStream 多返回 `activityId`、`conditionId`、`logIndex`、`source`,便于去重、链上追溯和数据来源标识。 +5. `market_id` 语义需要注意:futures.new 样本里是 condition id 风格;ChainStream 拆成 `marketId` 和 `conditionId`,语义更明确。 +6. 当前生产最新两页普通 cursor 分页无重复;深分页重复 `activityId` 已定位,services 修复 PR 为 `https://github.com/chainstream-io/services/pull/29`,待 review 后再 merge、tag、部署和复测。 From 3341bb49575c0564e905418845063dfc3628383b Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 03:14:18 +0800 Subject: [PATCH 10/32] docs(prediction): clarify single prediction activity query --- .../prediction-activities-api-comparison.md | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/cn/guides/data-concepts/prediction-activities-api-comparison.md b/cn/guides/data-concepts/prediction-activities-api-comparison.md index 32f24ff..45e01a1 100644 --- a/cn/guides/data-concepts/prediction-activities-api-comparison.md +++ b/cn/guides/data-concepts/prediction-activities-api-comparison.md @@ -2,9 +2,11 @@ 本文记录 ChainStream prediction activities API 的调用方式、当前返回样本、futures.new 抓包样本,以及字段差异。 +注意:产品上需要看的不是整个 `world-cup-winner` 专题的 activity feed,而是某一个 prediction / market 的 activity feed。`event_slug=world-cup-winner` 只是专题上下文,真正锁定单个预测需要传 `condition_id` 或 `market_id`。如果要进一步锁定 Yes / No 单个 outcome,再追加 `token_id`。 + 验证日期:2026-06-05 ChainStream event:`world-cup-winner` -ChainStream endpoint:`GET https://api.chainstream.io/v1/prediction/events/{event_slug}/activities` +ChainStream endpoint:`GET https://api.chainstream.io/v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` ## ChainStream 调用方式 @@ -28,7 +30,7 @@ TOKEN="$( )" curl -sS \ - "https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?limit=1" \ + "https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=1" \ -H "Authorization: Bearer $TOKEN" ``` @@ -45,12 +47,20 @@ curl -sS \ | `activity_type` | `buy` / `sell` / `redeem` / `inventory_adjust` | | `order` | `desc` 或 `asc` | +推荐调用口径: + +| 使用场景 | 调用方式 | +|---|---| +| 某个 prediction / market 的全部 activity | `GET /v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` | +| 某个 prediction / market 的某个 outcome activity | `GET /v1/prediction/events/{event_slug}/activities?condition_id={condition_id}&token_id={token_id}` | +| 整个 event / topic feed | `GET /v1/prediction/events/{event_slug}/activities`,仅用于专题聚合,不建议作为单个预测页数据源 | + ## ChainStream 返回样本 请求: ```http -GET /v1/prediction/events/world-cup-winner/activities?limit=1 +GET /v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=1 ``` 返回: @@ -58,45 +68,45 @@ GET /v1/prediction/events/world-cup-winner/activities?limit=1 ```json { "eventSlug": "world-cup-winner", - "cursor": "WyIxNzgwNjAwMDg2MDAwMDAwMDQiLCIweDQ2MTIwNDk0Yzc0NjRhMTJiNWYxMjhlOTgxYWE0YTg0YWYxNjQ3MTY4MGY3Y2I2NGI2NThkY2UxZDczMmZmOWE6NDoxMDY1OTM1Mzk0MzcwMzI0Njc2MTUxNDg1NTM3MDc5OTg0NzI4MjkzMzQwNTA2MTcxMjgyNDQ5MjA4MjE5MTcwMjU3NDY0ODExODQxMDk6c2VsbCJd", + "cursor": "WyIxNzgwNjAwMzMwMDAwMDAwMTciLCIweDcwN2U1NmQ5NWMyODgwMTZhYmVjZDg5ZmY0OTFkNzQ0MDg3Mjc5ZDI4ZjljODI3Y2RjNDFiZWIwNDM2MDg5M2M6MTY6MzIyNzA0MTE2OTQ1MjM1Mzk0OTUyNjIzMDM4Njg2Mjk0Nzc4NjEwMTc4Mjk3MjIyODI1NzY0NTgwMzE4MTUzMzM0ODYzNjgyMzk1NDQ6aW52ZW50b3J5X2FkanVzdCJd", "limit": 1, "order": "desc", "retentionDays": 3, "activities": [ { - "activityId": "0x46120494c7464a12b5f128e981aa4a84af16471680f7cb64b658dce1d732ff9a:4:106593539437032467615148553707998472829334050617128244920821917025746481184109:sell", - "amount": "0.999999", + "activityId": "0x707e56d95c288016abecd89ff491d744087279d28f9c827cdc41beb04360893c:16:32270411694523539495262303868629477861017829722282576458031815333486368239544:inventory_adjust", + "amount": "1061.432325", "assetIds": [ - "106593539437032467615148553707998472829334050617128244920821917025746481184109", - "22335540631248526397385139154377717431237265005174891396662761131414559126312" + "108233603819467706476318984012158651931658302669301887462181073562758483842092", + "32270411694523539495262303868629477861017829722282576458031815333486368239544" ], - "blockNumber": 87930067, - "conditionId": "0xe5bd80313b8859e3f5761568ac9498866ea9d4419e4d1b6a877a9a9bd2754cb4", + "blockNumber": 87930230, + "conditionId": "0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894", "eventSlug": "world-cup-winner", - "logIndex": 4, - "marketIcon": "https://polymarket-upload.s3.us-east-2.amazonaws.com/world-cup-winner-croatia-flag-20260603-192743.png", - "marketId": "558976", - "marketQuestion": "Will Croatia win the 2026 FIFA World Cup?", - "outcome": "Yes", + "logIndex": 16, + "marketIcon": "https://polymarket-upload.s3.us-east-2.amazonaws.com/world-cup-winner-france-flag-20260603-192743.png", + "marketId": "558936", + "marketQuestion": "Will France win the 2026 FIFA World Cup?", + "outcome": "No", "outcomes": [ "Yes", "No" ], - "price": "0.0089999910089999", - "quantity": "111.111111", - "seqIndex": 178060008600000004, + "price": "0", + "quantity": "1061.432325", + "seqIndex": 178060033000000017, "source": "chainstream", - "taker": "0xe2222d279d744050d28e00520010520000310F59", + "taker": "0xd91E80cF2E7be2e162c6513ceD06f1dD0dA35296", "takerAge": 0, "takerImage": "", "takerName": "", - "takerOrderHash": "0x47d38fed0cdeb7d4487e652142cdf1fc75cc5015cc142a6dcbc12a475e7c3569", + "takerOrderHash": "", "takerPseudonym": "", "takerTags": [], - "timestamp": 1780600086000, - "tokenId": "106593539437032467615148553707998472829334050617128244920821917025746481184109", - "txHash": "0x46120494c7464a12b5f128e981aa4a84af16471680f7cb64b658dce1d732ff9a", - "type": "sell" + "timestamp": 1780600330000, + "tokenId": "32270411694523539495262303868629477861017829722282576458031815333486368239544", + "txHash": "0x707e56d95c288016abecd89ff491d744087279d28f9c827cdc41beb04360893c", + "type": "inventory_adjust" } ] } @@ -104,7 +114,7 @@ GET /v1/prediction/events/world-cup-winner/activities?limit=1 ## futures.new 返回样本 -样本来源:本地 Future.news 抓包样本,`event_slug=world-cup-winner`。 +样本来源:本地 Future.news 抓包样本,调用口径为 `event_slug=world-cup-winner`、`market_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894`、`token_id=108233603819467706476318984012158651931658302669301887462181073562758483842092`。 返回: @@ -156,6 +166,7 @@ GET /v1/prediction/events/world-cup-winner/activities?limit=1 | activities 路径 | `activities` | `data.activities` | | cursor 路径 | `cursor` | `data.cursor` | | event slug | `eventSlug` | activity 内的 `event_slug` | +| prediction / market id | query `condition_id`,响应 `conditionId` / `marketId` | query `market_id`,响应 `market_id` | | limit | `limit` | 未在样本顶层返回 | | order | `order` | 未在样本顶层返回 | | 数据保留说明 | `retentionDays` | 未在样本顶层返回 | @@ -213,4 +224,5 @@ GET /v1/prediction/events/world-cup-winner/activities?limit=1 3. ChainStream 顶层不返回 `code/reason/message/data` wrapper,而是直接返回业务对象。 4. ChainStream 多返回 `activityId`、`conditionId`、`logIndex`、`source`,便于去重、链上追溯和数据来源标识。 5. `market_id` 语义需要注意:futures.new 样本里是 condition id 风格;ChainStream 拆成 `marketId` 和 `conditionId`,语义更明确。 -6. 当前生产最新两页普通 cursor 分页无重复;深分页重复 `activityId` 已定位,services 修复 PR 为 `https://github.com/chainstream-io/services/pull/29`,待 review 后再 merge、tag、部署和复测。 +6. 单个预测页推荐使用 `condition_id` 过滤;如果要和 futures.new 的 outcome tab 完全一致,再追加 `token_id`。 +7. 当前生产最新两页普通 cursor 分页无重复;深分页重复 `activityId` 已定位,services 修复 PR 为 `https://github.com/chainstream-io/services/pull/29`,待 review 后再 merge、tag、部署和复测。 From c54210ab03113792033d8b487ef032d171ee441e Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 03:29:46 +0800 Subject: [PATCH 11/32] docs(prediction): document market activities endpoint --- .../prediction-activities-api-comparison.md | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/cn/guides/data-concepts/prediction-activities-api-comparison.md b/cn/guides/data-concepts/prediction-activities-api-comparison.md index 45e01a1..9618be6 100644 --- a/cn/guides/data-concepts/prediction-activities-api-comparison.md +++ b/cn/guides/data-concepts/prediction-activities-api-comparison.md @@ -2,11 +2,13 @@ 本文记录 ChainStream prediction activities API 的调用方式、当前返回样本、futures.new 抓包样本,以及字段差异。 -注意:产品上需要看的不是整个 `world-cup-winner` 专题的 activity feed,而是某一个 prediction / market 的 activity feed。`event_slug=world-cup-winner` 只是专题上下文,真正锁定单个预测需要传 `condition_id` 或 `market_id`。如果要进一步锁定 Yes / No 单个 outcome,再追加 `token_id`。 +注意:产品上需要看的不是整个 `world-cup-winner` 专题的 activity feed,而是某一个 prediction / market 的 activity feed。`event_slug=world-cup-winner` 只是专题上下文,真正锁定单个预测应使用 `condition_id`。如果要进一步锁定 Yes / No 单个 outcome,再追加 `token_id`。 验证日期:2026-06-05 ChainStream event:`world-cup-winner` -ChainStream endpoint:`GET https://api.chainstream.io/v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` +ChainStream 目标 endpoint:`GET https://api.chainstream.io/v1/prediction/markets/{condition_id}/activities` +当前生产验证 endpoint:`GET https://api.chainstream.io/v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` +服务端目标 endpoint PR:`https://github.com/chainstream-io/services/pull/30` ## ChainStream 调用方式 @@ -29,35 +31,50 @@ TOKEN="$( }" | jq -r '.access_token' )" +curl -sS \ + "https://api.chainstream.io/v1/prediction/markets/0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894/activities?limit=1" \ + -H "Authorization: Bearer $TOKEN" +``` + +当前生产环境在 PR #30 merge、tag、部署前,可用 event endpoint 加 `condition_id` 作为兼容验证方式: + +```bash curl -sS \ "https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=1" \ -H "Authorization: Bearer $TOKEN" ``` -支持的 query 参数: +目标 market endpoint 支持的 query 参数: | 参数 | 说明 | |---|---| | `cursor` | 上一页返回的 cursor,用于继续分页 | | `limit` | 返回条数,当前接口支持 clamp 到服务端上限 | | `token_id` | 按 outcome token id 过滤 | -| `market_id` | 按 market id 过滤,兼容 condition id 语义 | -| `condition_id` | 按 condition id 过滤 | | `wallet` | 按 taker wallet 过滤 | | `activity_type` | `buy` / `sell` / `redeem` / `inventory_adjust` | | `order` | `desc` 或 `asc` | +event endpoint 额外兼容 `market_id` / `condition_id` query 参数,用于从专题 feed 中过滤单个 prediction。 + 推荐调用口径: | 使用场景 | 调用方式 | |---|---| -| 某个 prediction / market 的全部 activity | `GET /v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` | -| 某个 prediction / market 的某个 outcome activity | `GET /v1/prediction/events/{event_slug}/activities?condition_id={condition_id}&token_id={token_id}` | +| 某个 prediction / market 的全部 activity | `GET /v1/prediction/markets/{condition_id}/activities` | +| 某个 prediction / market 的某个 outcome activity | `GET /v1/prediction/markets/{condition_id}/activities?token_id={token_id}` | +| PR #30 部署前的生产兼容调用 | `GET /v1/prediction/events/{event_slug}/activities?condition_id={condition_id}` | | 整个 event / topic feed | `GET /v1/prediction/events/{event_slug}/activities`,仅用于专题聚合,不建议作为单个预测页数据源 | ## ChainStream 返回样本 -请求: +目标请求: + +```http +GET /v1/prediction/markets/0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894/activities?limit=1 +``` + +当前生产验证请求: ```http GET /v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=1 @@ -166,7 +183,7 @@ GET /v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef24904 | activities 路径 | `activities` | `data.activities` | | cursor 路径 | `cursor` | `data.cursor` | | event slug | `eventSlug` | activity 内的 `event_slug` | -| prediction / market id | query `condition_id`,响应 `conditionId` / `marketId` | query `market_id`,响应 `market_id` | +| prediction / market id | path `{condition_id}`,响应 `conditionId` / `marketId`;生产兼容调用也支持 query `condition_id` | query `market_id`,响应 `market_id` | | limit | `limit` | 未在样本顶层返回 | | order | `order` | 未在样本顶层返回 | | 数据保留说明 | `retentionDays` | 未在样本顶层返回 | @@ -224,5 +241,5 @@ GET /v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef24904 3. ChainStream 顶层不返回 `code/reason/message/data` wrapper,而是直接返回业务对象。 4. ChainStream 多返回 `activityId`、`conditionId`、`logIndex`、`source`,便于去重、链上追溯和数据来源标识。 5. `market_id` 语义需要注意:futures.new 样本里是 condition id 风格;ChainStream 拆成 `marketId` 和 `conditionId`,语义更明确。 -6. 单个预测页推荐使用 `condition_id` 过滤;如果要和 futures.new 的 outcome tab 完全一致,再追加 `token_id`。 -7. 当前生产最新两页普通 cursor 分页无重复;深分页重复 `activityId` 已定位,services 修复 PR 为 `https://github.com/chainstream-io/services/pull/29`,待 review 后再 merge、tag、部署和复测。 +6. 单个预测页目标接口为 `/v1/prediction/markets/{condition_id}/activities`;如果要和 futures.new 的 outcome tab 完全一致,再追加 `token_id`。 +7. 当前生产最新两页普通 cursor 分页无重复;深分页重复 `activityId` 已定位,services 修复 PR 为 `https://github.com/chainstream-io/services/pull/29`,market-level endpoint PR 为 `https://github.com/chainstream-io/services/pull/30`,均待 review 后再 merge、tag、部署和复测。 From 872a3b0c2d9086fee9a597ec1d98a511496babe5 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 03:47:38 +0800 Subject: [PATCH 12/32] docs(prediction): refresh day2 acceptance status --- .../data-concepts/prediction-day2-targets.mdx | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 71e5169..47293c7 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -10,7 +10,7 @@ icon: "list-check" 1. 基于远程 `origin/main` 创建 Day2 实施分支,隔离 Day1 工作区改动。 2. 为 Polygon prediction trades / settlements 生成 wallet-token activity 明细,写入 ClickHouse activity 表。 -3. REST API 新增 `GET /v1/prediction/events/{event_slug}/activities`,返回字段不少于 Future.news activity 字段集合。 +3. REST API 新增 event feed 与 market feed:`GET /v1/prediction/events/{event_slug}/activities`、`GET /v1/prediction/markets/{condition_id}/activities`,返回字段不少于 Future.news activity 字段集合。 4. OpenAPI 注册 prediction activity path、query params、response schema,并用 schema 测试锁定字段完整性。 5. Realtime 使用短 channel: - event activity: `pred:evt:{eventSlug}:act` @@ -37,8 +37,9 @@ icon: "list-check" ### REST API -- OpenAPI path 存在:`/v1/prediction/events/{event_slug}/activities`。 -- Query 支持 `cursor`、`limit`、`token_id`、`market_id`、`condition_id`、`wallet`、`activity_type`、`order`。 +- OpenAPI path 存在:`/v1/prediction/events/{event_slug}/activities` 与 `/v1/prediction/markets/{condition_id}/activities`。 +- event endpoint query 支持 `cursor`、`limit`、`token_id`、`market_id`、`condition_id`、`wallet`、`activity_type`、`order`。 +- market endpoint path 使用 `{condition_id}` 锁定单个 prediction,query 支持 `cursor`、`limit`、`token_id`、`wallet`、`activity_type`、`order`,不要求传 `event_slug`。 - `market_id` 与 `condition_id` 同时传入且不一致时返回 bad request。 - 当前 event allowlist 为 `world-cup-winner`。 - OpenAPI 单测验证 activity schema 完整字段。 @@ -60,7 +61,8 @@ icon: "list-check" - `subscribe_prediction_token_activities` - SDK activity type 使用枚举:`buy`、`sell`、`redeem`、`inventory_adjust`。 - TypeScript 与 Rust SDK 能把短字段 payload 反序列化为完整 activity model。 -- TypeScript 与 Rust REST SDK 方法由 `openapi.yaml` 生成。 +- TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 +- Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 - Go 与 Python 的全量 REST SDK 生成不在当前 Day2 PR 的已完成范围内;如果发布要求覆盖所有语言,需要在 SDK 发布前单独修复 Go/Python 生成器与生成物。 ### 缓存 @@ -96,7 +98,7 @@ icon: "list-check" 1. Kafka topic:`polygon.v2.prediction.wallet-token-activities` 存在,retention 为 `86400000` ms。 2. ClickHouse:activity local/distributed/archive/realtime view 存在,热表 TTL 为 3 天。 3. Pipeline:trade buy/sell、settlement redeem/split/merge 样本能落 activity 表。 -4. API:`GET /v1/prediction/events/world-cup-winner/activities` 返回 200,字段不少于 features.new;分页下一页无重复 `activityId`。 +4. API:`GET /v1/prediction/events/world-cup-winner/activities` 返回 200,字段不少于 features.new;目标 market endpoint `/v1/prediction/markets/{condition_id}/activities` 在 PR #30 部署后返回 200;分页下一页无重复 `activityId`。 5. Realtime:`pred:evt:world-cup-winner:act` 与 `pred:tok:{tokenId}:act` 能收到短字段 payload。 6. SDK:TypeScript 或 Rust 示例能订阅 WorldCup activity,并解析成完整模型。 7. 缓存:`PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false` 时没有 firstscreen queue 堆积,也没有持续 firstscreen cache write 日志。 @@ -163,9 +165,16 @@ icon: "list-check" - PR #29 focused tests 已通过: - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` +- 单个 prediction / market endpoint 已补 PR: + - services PR #30 已创建:`https://github.com/chainstream-io/services/pull/30`。 + - PR #30 新增 `GET /v1/prediction/markets/{condition_id}/activities`,用于直接获取某一个 prediction / market 的 activity,不需要调用方指定 `event_slug`。 + - PR #30 保留 event endpoint 作为专题 feed 与生产兼容路径,event endpoint 仍可用 `condition_id` 过滤单个 market。 + - PR #30 focused tests 已通过: + - `cargo test -p infrastructure database::prediction::tests` + - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 13 ahead`,当前 head commit 为 `37d2c53`。 -- chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4624807620`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 14 ahead`,当前 head commit 为 `1886bd2`。 +- chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564`。 - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -177,10 +186,14 @@ icon: "list-check" - 复核 TypeScript activity 相关文件 Prettier check 通过。 - 复核 `corepack pnpm --dir typescript test -- --run src/stream/stream.test.ts` 通过,5 个 test files / 31 个 tests 通过。 - 复核 `cargo test --manifest-path rust/Cargo.toml stream --lib` 通过,7 个 tests 通过。 + - 复核 TypeScript SDK build `./node_modules/.bin/tsup` 通过。 + - 复核 TypeScript 全量 unit tests `./node_modules/.bin/vitest --config=./vitest.config.ts run` 通过,5 个 test files / 31 个 tests 通过。 + - 复核 Rust 全量 `cargo test` 通过。 + - 复核 OpenAPI smoke check 确认 `/v1/prediction/markets/{condition_id}/activities`、`get.prediction.market.activities`、`PredictionActivityType`、`PredictionActivityOrder` 存在。 - SDK 静态与测试覆盖: - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 - - REST API 方法和类型由 `openapi.yaml` 生成。 + - TypeScript/Rust REST API 方法和类型由 `openapi.yaml` 生成,event 与 market activities endpoint 均已覆盖。 - SDK live 订阅验收尝试已完成: - 使用 `~/.chainstream/credentials.env` client credentials 获取 fresh token,token 有效期为 24 小时。 - TypeScript SDK PR 分支本地 `dist` 可以完成 REST seed:`world-cup-winner` 拉取 50 条 activity,并从中得到 token channel 列表。 @@ -192,10 +205,12 @@ icon: "list-check" - services PR #29 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #29 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测深分页探针重复数为 `0`。 +- services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 +- services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 -- Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 +- Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 - SDK PR 当前 CI 为 `UNSTABLE`: - TypeScript/Rust build、tests、examples 通过。 From f5867c68b1ce12ac452e7773c20e02400b1ff2c5 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:04:35 +0800 Subject: [PATCH 13/32] docs(prediction): refresh sdk day2 gate status --- .../data-concepts/prediction-day2-targets.mdx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 47293c7..a0c9430 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -173,8 +173,10 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 14 ahead`,当前 head commit 为 `1886bd2`。 -- chainstream-sdk PR 已补 review note:`https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 15 ahead`,当前 head commit 为 `4be0aa4`。 +- chainstream-sdk PR 已补 review note: + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -190,6 +192,9 @@ icon: "list-check" - 复核 TypeScript 全量 unit tests `./node_modules/.bin/vitest --config=./vitest.config.ts run` 通过,5 个 test files / 31 个 tests 通过。 - 复核 Rust 全量 `cargo test` 通过。 - 复核 OpenAPI smoke check 确认 `/v1/prediction/markets/{condition_id}/activities`、`get.prediction.market.activities`、`PredictionActivityType`、`PredictionActivityOrder` 存在。 + - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 + - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 + - 复核缺依赖相关文件 focused ESLint 通过:`src/utils/export.ts`、`src/utils/serializeTransaction.ts`、`src/types/calls.ts`。 - SDK 静态与测试覆盖: - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 @@ -213,8 +218,9 @@ icon: "list-check" - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 - SDK PR 当前 CI 为 `UNSTABLE`: - - TypeScript/Rust build、tests、examples 通过。 - - TypeScript lint 存在全仓 JSDoc/member-ordering/import baseline 问题。 - - Python lint/format 存在 ruff baseline 问题,Python tests 通过。 - - Go lint/test 存在生成 openapi client unused imports 与缺依赖问题。 + - TypeScript build、format、lockfile、examples、unit tests 通过。 + - Rust build、format、format-examples、lockfile、stable/beta tests 通过;Rust lint 与 lint-examples 当前仍在等待 GitHub Actions 返回。 + - TypeScript lint 仍存在全仓 JSDoc/member-ordering/no-console/import-order baseline 问题;`import/no-unresolved` 缺依赖问题已由 `4be0aa4` 关闭。 + - Python build、lockfile、3.10/3.11/3.12 tests 通过;Python lint/format 存在 ruff baseline 问题。 + - Go lint/test 存在生成 openapi client unused imports 与生成依赖声明问题。 - SDK PR diff 未包含 `go/` 或 `python/` 文件变更,Go/Python 红灯不是本次 prediction activity SDK 改动直接引入;若 SDK 发布要求所有语言 CI 全绿,需在 release 前单独修复这些 baseline。 From ba9d4eac7f97094449295ec1f63966777a1bdbf3 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:05:30 +0800 Subject: [PATCH 14/32] docs(prediction): finalize sdk rust ci status --- cn/guides/data-concepts/prediction-day2-targets.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index a0c9430..c657f82 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -219,7 +219,7 @@ icon: "list-check" - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 - SDK PR 当前 CI 为 `UNSTABLE`: - TypeScript build、format、lockfile、examples、unit tests 通过。 - - Rust build、format、format-examples、lockfile、stable/beta tests 通过;Rust lint 与 lint-examples 当前仍在等待 GitHub Actions 返回。 + - Rust build、format、format-examples、lint、lint-examples、lockfile、stable/beta tests 通过。 - TypeScript lint 仍存在全仓 JSDoc/member-ordering/no-console/import-order baseline 问题;`import/no-unresolved` 缺依赖问题已由 `4be0aa4` 关闭。 - Python build、lockfile、3.10/3.11/3.12 tests 通过;Python lint/format 存在 ruff baseline 问题。 - Go lint/test 存在生成 openapi client unused imports 与生成依赖声明问题。 From 8060c2304120fe7f4a58e1237b20343769fda102 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:32:44 +0800 Subject: [PATCH 15/32] docs(prediction): record sdk ci green status --- .../data-concepts/prediction-day2-targets.mdx | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index c657f82..f3d8dc9 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -63,7 +63,7 @@ icon: "list-check" - TypeScript 与 Rust SDK 能把短字段 payload 反序列化为完整 activity model。 - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 -- Go 与 Python 的全量 REST SDK 生成不在当前 Day2 PR 的已完成范围内;如果发布要求覆盖所有语言,需要在 SDK 发布前单独修复 Go/Python 生成器与生成物。 +- Go 与 Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python CI baseline,发布前不再存在 Go/Python 红灯。 ### 缓存 @@ -173,10 +173,13 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 15 ahead`,当前 head commit 为 `4be0aa4`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 19 ahead`,当前 head commit 为 `39e1ce6`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625795368` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625833281` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625859236` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -195,6 +198,18 @@ icon: "list-check" - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 - 复核缺依赖相关文件 focused ESLint 通过:`src/utils/export.ts`、`src/utils/serializeTransaction.ts`、`src/types/calls.ts`。 + - 复核 Python ruff baseline 修复:`ruff format --check` 通过,`ruff check` 通过。 + - 复核 TypeScript 全量 lint `pnpm --dir typescript lint` 通过。 + - 复核 Go lint config 使用 CI 同版本 `golangci-lint v2.12.2` 执行 `config verify` 通过。 +- SDK PR GitHub Actions 已全绿: + - TypeScript Checks:build、lint、format、lockfile、build-examples、check-auth-crypto-imports 全部通过。 + - TypeScript Tests:通过。 + - Rust Checks:build、lint、format、lockfile、format-examples、lint-examples 全部通过。 + - Rust Tests:stable 与 beta 全部通过。 + - Go Linting:通过。 + - Go Tests:1.23 与 1.24 全部通过。 + - Python Checks:build、lint、format、lockfile 全部通过。 + - Python Tests:3.10、3.11、3.12 全部通过。 - SDK 静态与测试覆盖: - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 @@ -217,10 +232,4 @@ icon: "list-check" - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 -- SDK PR 当前 CI 为 `UNSTABLE`: - - TypeScript build、format、lockfile、examples、unit tests 通过。 - - Rust build、format、format-examples、lint、lint-examples、lockfile、stable/beta tests 通过。 - - TypeScript lint 仍存在全仓 JSDoc/member-ordering/no-console/import-order baseline 问题;`import/no-unresolved` 缺依赖问题已由 `4be0aa4` 关闭。 - - Python build、lockfile、3.10/3.11/3.12 tests 通过;Python lint/format 存在 ruff baseline 问题。 - - Go lint/test 存在生成 openapi client unused imports 与生成依赖声明问题。 - - SDK PR diff 未包含 `go/` 或 `python/` 文件变更,Go/Python 红灯不是本次 prediction activity SDK 改动直接引入;若 SDK 发布要求所有语言 CI 全绿,需在 release 前单独修复这些 baseline。 +- SDK PR 当前 CI 为 `CLEAN`,所有 GitHub Actions checks 已通过;仍等待 reviewer 确认,确认前不 merge、不 tag、不发布。 From 4dd9d053c9a110083b2d185041814ba9fa646297 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:47:06 +0800 Subject: [PATCH 16/32] docs(prediction): record go python sdk stream coverage --- .../data-concepts/prediction-day2-targets.mdx | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index f3d8dc9..4fea107 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -59,11 +59,17 @@ icon: "list-check" - Rust SDK 方法: - `subscribe_prediction_event_activities` - `subscribe_prediction_token_activities` +- Go SDK 方法: + - `SubscribePredictionEventActivities` + - `SubscribePredictionTokenActivities` +- Python SDK 方法: + - `subscribe_prediction_event_activities` + - `subscribe_prediction_token_activities` - SDK activity type 使用枚举:`buy`、`sell`、`redeem`、`inventory_adjust`。 -- TypeScript 与 Rust SDK 能把短字段 payload 反序列化为完整 activity model。 +- TypeScript、Rust、Go、Python SDK 均使用 enum + builder 生成 prediction activity channel,并能把短字段 payload 反序列化为完整 activity model。 - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 -- Go 与 Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python CI baseline,发布前不再存在 Go/Python 红灯。 +- Go 与 Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python realtime stream API 与 CI baseline,发布前不再存在 Go/Python 红灯。 ### 缓存 @@ -90,7 +96,7 @@ icon: "list-check" 1. aggregation-pipelines:确认 topic、DDL、activity 映射、ClickHouse 写入、realtime publish、firstscreen cache gate。 2. services:确认 REST schema、features.new 字段完整性、profile fallback、cursor 分页、firstscreen cache read gate。 -3. chainstream-sdk:确认 TypeScript/Rust REST 生成、realtime enum builder、短字段 parser、示例。 +3. chainstream-sdk:确认 TypeScript/Rust REST 生成,TypeScript/Rust/Go/Python realtime enum builder、短字段 parser、示例。 4. docs:确认目标、验收目录、部署顺序、发布门禁。 ## 生产验收证据 @@ -100,7 +106,7 @@ icon: "list-check" 3. Pipeline:trade buy/sell、settlement redeem/split/merge 样本能落 activity 表。 4. API:`GET /v1/prediction/events/world-cup-winner/activities` 返回 200,字段不少于 features.new;目标 market endpoint `/v1/prediction/markets/{condition_id}/activities` 在 PR #30 部署后返回 200;分页下一页无重复 `activityId`。 5. Realtime:`pred:evt:world-cup-winner:act` 与 `pred:tok:{tokenId}:act` 能收到短字段 payload。 -6. SDK:TypeScript 或 Rust 示例能订阅 WorldCup activity,并解析成完整模型。 +6. SDK:TypeScript 或 Rust 示例能订阅 WorldCup activity,并解析成完整模型;TypeScript/Rust/Go/Python parser 单测能把短字段 payload 解析成完整模型。 7. 缓存:`PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false` 时没有 firstscreen queue 堆积,也没有持续 firstscreen cache write 日志。 8. 日志:生产无持续 decode error、ClickHouse insert error、cache write error。 9. 发布:aggregation/services/SDK 的生产记录均包含 tag 值、对应 main commit、workflow 或 rollout 链接。 @@ -173,13 +179,15 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 19 ahead`,当前 head commit 为 `39e1ce6`,GitHub merge state 为 `CLEAN`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 20 ahead`,当前 head commit 为 `aa31a9d`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625795368` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625833281` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625859236` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625946849` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625968505` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -201,6 +209,8 @@ icon: "list-check" - 复核 Python ruff baseline 修复:`ruff format --check` 通过,`ruff check` 通过。 - 复核 TypeScript 全量 lint `pnpm --dir typescript lint` 通过。 - 复核 Go lint config 使用 CI 同版本 `golangci-lint v2.12.2` 执行 `config verify` 通过。 + - 复核 Python prediction activity stream targeted tests 通过:`chainstream/stream/test_prediction_activity.py`,3 个 tests 通过。 + - 复核 Go prediction activity stream 新增单测已随 GitHub Actions `Go Tests` 1.23 / 1.24 通过;本地 Go test 在 desktop 环境中无输出卡住,未作为本地证据。 - SDK PR GitHub Actions 已全绿: - TypeScript Checks:build、lint、format、lockfile、build-examples、check-auth-crypto-imports 全部通过。 - TypeScript Tests:通过。 @@ -211,8 +221,8 @@ icon: "list-check" - Python Checks:build、lint、format、lockfile 全部通过。 - Python Tests:3.10、3.11、3.12 全部通过。 - SDK 静态与测试覆盖: - - TypeScript/Rust 都使用 enum + builder 生成 prediction activity channel。 - - TypeScript/Rust 都能把短字段 realtime payload 解析成完整 activity model。 + - TypeScript/Rust/Go/Python 都使用 enum + builder 生成 prediction activity channel。 + - TypeScript/Rust/Go/Python 都能把短字段 realtime payload 解析成完整 activity model。 - TypeScript/Rust REST API 方法和类型由 `openapi.yaml` 生成,event 与 market activities endpoint 均已覆盖。 - SDK live 订阅验收尝试已完成: - 使用 `~/.chainstream/credentials.env` client credentials 获取 fresh token,token 有效期为 24 小时。 From 945be852f9b718d63c4da1f04f732af779c96998 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:55:49 +0800 Subject: [PATCH 17/32] docs(prediction): record sdk generation config update --- cn/guides/data-concepts/prediction-day2-targets.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 4fea107..a43c3ab 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -69,7 +69,8 @@ icon: "list-check" - TypeScript、Rust、Go、Python SDK 均使用 enum + builder 生成 prediction activity channel,并能把短字段 payload 反序列化为完整 activity model。 - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 -- Go 与 Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python realtime stream API 与 CI baseline,发布前不再存在 Go/Python 红灯。 +- Go OpenAPI 生成配置已纳入 `Prediction` tag:`MODULES` 包含 `prediction`,生成目标为 `go/openapi/prediction/client.gen.go`;Go generated REST client 文件本次未生成提交。 +- Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python realtime stream API 与 CI baseline,发布前不再存在 Go/Python 红灯。 ### 缓存 @@ -179,7 +180,7 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 20 ahead`,当前 head commit 为 `aa31a9d`,GitHub merge state 为 `CLEAN`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 21 ahead`,当前 head commit 为 `9cb5f3a`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` @@ -188,6 +189,8 @@ icon: "list-check" - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625859236` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625946849` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625968505` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626012457` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626033235` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -203,6 +206,7 @@ icon: "list-check" - 复核 TypeScript 全量 unit tests `./node_modules/.bin/vitest --config=./vitest.config.ts run` 通过,5 个 test files / 31 个 tests 通过。 - 复核 Rust 全量 `cargo test` 通过。 - 复核 OpenAPI smoke check 确认 `/v1/prediction/markets/{condition_id}/activities`、`get.prediction.market.activities`、`PredictionActivityType`、`PredictionActivityOrder` 存在。 + - 复核 Go OpenAPI Makefile 生成配置已纳入 Prediction:`MODULES` 包含 `prediction`,`oapi-codegen` 使用 `-include-tags Prediction` 输出 `go/openapi/prediction/client.gen.go`;本地安装 `oapi-codegen v2.7.0` 超时,未生成/提交 Go REST client 文件。 - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 - 复核缺依赖相关文件 focused ESLint 通过:`src/utils/export.ts`、`src/utils/serializeTransaction.ts`、`src/types/calls.ts`。 From ba717c133ee740bffe2d9826188d6ae44b48ae58 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 04:58:04 +0800 Subject: [PATCH 18/32] docs(prediction): record services pr readiness --- cn/guides/data-concepts/prediction-day2-targets.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index a43c3ab..4865cae 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -168,12 +168,14 @@ icon: "list-check" - 深分页重复问题已定位: - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 + - PR #29 基于最新 `origin/main`:`0 behind / 1 ahead`,当前 head commit 为 `b7151a`,GitHub merge state 为 `CLEAN`,无仓库 checks 配置。 - PR #29 在 ClickHouse 查询中增加 `LIMIT 1 BY activity_id`,在 API page limit 前按 `activity_id` 去重。 - PR #29 focused tests 已通过: - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - 单个 prediction / market endpoint 已补 PR: - services PR #30 已创建:`https://github.com/chainstream-io/services/pull/30`。 + - PR #30 基于最新 `origin/main`:`0 behind / 1 ahead`,当前 head commit 为 `1beaca3`,GitHub merge state 为 `CLEAN`,无仓库 checks 配置。 - PR #30 新增 `GET /v1/prediction/markets/{condition_id}/activities`,用于直接获取某一个 prediction / market 的 activity,不需要调用方指定 `event_slug`。 - PR #30 保留 event endpoint 作为专题 feed 与生产兼容路径,event endpoint 仍可用 `condition_id` 过滤单个 market。 - PR #30 focused tests 已通过: From d6fd70ecd2d46b8b884e389fd595be0731adb0ea Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 05:06:41 +0800 Subject: [PATCH 19/32] docs(prediction): clarify sdk rest generation gap --- cn/guides/data-concepts/prediction-day2-targets.mdx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 4865cae..3a3d622 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -70,7 +70,8 @@ icon: "list-check" - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 - Go OpenAPI 生成配置已纳入 `Prediction` tag:`MODULES` 包含 `prediction`,生成目标为 `go/openapi/prediction/client.gen.go`;Go generated REST client 文件本次未生成提交。 -- Python 的 prediction activity REST 方法生成不在当前 Day2 功能验收范围内;当前 SDK PR 已补 Go/Python realtime stream API 与 CI baseline,发布前不再存在 Go/Python 红灯。 +- Python OpenAPI generation 会从合并后的 `openapi.yaml` 生成所有 tag;当前 committed generated client 尚未包含 prediction API/model 文件。 +- 若 Day2 SDK REST 验收要求覆盖 Go/Python generated REST client,则 SDK PR 仍需在可用生成器环境中补 `go/openapi/prediction/client.gen.go` 与 Python prediction API/model generated 文件。 ### 缓存 @@ -209,6 +210,8 @@ icon: "list-check" - 复核 Rust 全量 `cargo test` 通过。 - 复核 OpenAPI smoke check 确认 `/v1/prediction/markets/{condition_id}/activities`、`get.prediction.market.activities`、`PredictionActivityType`、`PredictionActivityOrder` 存在。 - 复核 Go OpenAPI Makefile 生成配置已纳入 Prediction:`MODULES` 包含 `prediction`,`oapi-codegen` 使用 `-include-tags Prediction` 输出 `go/openapi/prediction/client.gen.go`;本地安装 `oapi-codegen v2.7.0` 超时,未生成/提交 Go REST client 文件。 + - 2026-06-05 复核 Go/Python generated REST client 缺口:当前分支没有 `go/openapi/prediction/client.gen.go`,Python generated client 也没有 `prediction_api.py` 和 prediction activity model 文件。 + - 2026-06-05 本地生成器尝试未通过:`go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.7.0` 第一次被系统 kill,第二次低并发超过 3 分钟无输出后停止;`java -version` 5 秒无输出,无法可靠运行 `openapi-generator 7.11.0`。 - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 - 复核缺依赖相关文件 focused ESLint 通过:`src/utils/export.ts`、`src/utils/serializeTransaction.ts`、`src/types/calls.ts`。 @@ -244,6 +247,7 @@ icon: "list-check" - services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 +- SDK REST generated client 仍需 reviewer 决策:若 Day2 要求 Go/Python REST API 也由 `openapi.yaml` 生成并随包发布,则必须先在可用生成器环境中补 committed generated 文件,再重新跑 CI。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 From 00b927204e889c90adb21a8bc851d8070a86040c Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:08:28 +0800 Subject: [PATCH 20/32] docs(prediction): record go rest sdk coverage --- .../data-concepts/prediction-day2-targets.mdx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 3a3d622..f380bd0 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -69,9 +69,9 @@ icon: "list-check" - TypeScript、Rust、Go、Python SDK 均使用 enum + builder 生成 prediction activity channel,并能把短字段 payload 反序列化为完整 activity model。 - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 -- Go OpenAPI 生成配置已纳入 `Prediction` tag:`MODULES` 包含 `prediction`,生成目标为 `go/openapi/prediction/client.gen.go`;Go generated REST client 文件本次未生成提交。 +- Go REST SDK 已补 `go/openapi/prediction/client.gen.go`,并通过 `client.Prediction` 暴露 event / market activities methods。 - Python OpenAPI generation 会从合并后的 `openapi.yaml` 生成所有 tag;当前 committed generated client 尚未包含 prediction API/model 文件。 -- 若 Day2 SDK REST 验收要求覆盖 Go/Python generated REST client,则 SDK PR 仍需在可用生成器环境中补 `go/openapi/prediction/client.gen.go` 与 Python prediction API/model generated 文件。 +- 若 Day2 SDK REST 验收要求覆盖 Python generated REST client,则 SDK PR 仍需在可用生成器环境中补 Python prediction API/model generated 文件。 ### 缓存 @@ -183,7 +183,7 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 21 ahead`,当前 head commit 为 `9cb5f3a`,GitHub merge state 为 `CLEAN`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 22 ahead`,当前 head commit 为 `d0c245d`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` @@ -194,6 +194,8 @@ icon: "list-check" - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625968505` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626012457` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626033235` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626107819` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626744276` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -209,8 +211,10 @@ icon: "list-check" - 复核 TypeScript 全量 unit tests `./node_modules/.bin/vitest --config=./vitest.config.ts run` 通过,5 个 test files / 31 个 tests 通过。 - 复核 Rust 全量 `cargo test` 通过。 - 复核 OpenAPI smoke check 确认 `/v1/prediction/markets/{condition_id}/activities`、`get.prediction.market.activities`、`PredictionActivityType`、`PredictionActivityOrder` 存在。 - - 复核 Go OpenAPI Makefile 生成配置已纳入 Prediction:`MODULES` 包含 `prediction`,`oapi-codegen` 使用 `-include-tags Prediction` 输出 `go/openapi/prediction/client.gen.go`;本地安装 `oapi-codegen v2.7.0` 超时,未生成/提交 Go REST client 文件。 - - 2026-06-05 复核 Go/Python generated REST client 缺口:当前分支没有 `go/openapi/prediction/client.gen.go`,Python generated client 也没有 `prediction_api.py` 和 prediction activity model 文件。 + - 复核 Go OpenAPI Makefile 生成配置已纳入 Prediction:`MODULES` 包含 `prediction`,`oapi-codegen` 使用 `-include-tags Prediction` 输出 `go/openapi/prediction/client.gen.go`。 + - 复核 Go REST generated client 已补:`go/openapi/prediction/client.gen.go` 包含 event / market activities 方法、activity model、order/type enum;`go/chainstream.go` 已挂载 `client.Prediction`。 + - 复核 Go REST focused checks:本地 `gofmt`、`git diff --check`、`go list ./openapi/prediction` 通过;GitHub Actions `Go Linting` 通过,`Go Tests` 1.23 / 1.24 通过。 + - 2026-06-05 复核 Python generated REST client 缺口:Python generated client 还没有 `prediction_api.py` 和 prediction activity model 文件。 - 2026-06-05 本地生成器尝试未通过:`go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.7.0` 第一次被系统 kill,第二次低并发超过 3 分钟无输出后停止;`java -version` 5 秒无输出,无法可靠运行 `openapi-generator 7.11.0`。 - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 @@ -247,7 +251,7 @@ icon: "list-check" - services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 -- SDK REST generated client 仍需 reviewer 决策:若 Day2 要求 Go/Python REST API 也由 `openapi.yaml` 生成并随包发布,则必须先在可用生成器环境中补 committed generated 文件,再重新跑 CI。 +- SDK REST generated client 仍需 reviewer 决策:若 Day2 要求 Python REST API 也由 `openapi.yaml` 生成并随包发布,则必须先在可用生成器环境中补 committed generated 文件,再重新跑 CI。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 From 6ffe92994c497a5044c362f170cea2a4a36bffbc Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:19:06 +0800 Subject: [PATCH 21/32] docs(prediction): record python rest sdk coverage --- .../data-concepts/prediction-day2-targets.mdx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index f380bd0..7eb3fdc 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -70,8 +70,7 @@ icon: "list-check" - TypeScript REST SDK 由 `openapi.yaml` 生成 `getPredictionEventActivities` 与 `getPredictionMarketActivities`。 - Rust REST SDK 由 `openapi.yaml` 生成 `get_prediction_event_activities` 与 `get_prediction_market_activities`。 - Go REST SDK 已补 `go/openapi/prediction/client.gen.go`,并通过 `client.Prediction` 暴露 event / market activities methods。 -- Python OpenAPI generation 会从合并后的 `openapi.yaml` 生成所有 tag;当前 committed generated client 尚未包含 prediction API/model 文件。 -- 若 Day2 SDK REST 验收要求覆盖 Python generated REST client,则 SDK PR 仍需在可用生成器环境中补 Python prediction API/model generated 文件。 +- Python OpenAPI client 已补 `PredictionApi`、`PredictionActivitiesResponse`、`PredictionActivity`、`PredictionActivityOrder`、`PredictionActivityType`,event / market activities endpoint 均已覆盖。 ### 缓存 @@ -183,7 +182,7 @@ icon: "list-check" - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 -- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 22 ahead`,当前 head commit 为 `d0c245d`,GitHub merge state 为 `CLEAN`。 +- chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 23 ahead`,当前 head commit 为 `32e7416`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625505564` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4625651585` @@ -196,6 +195,9 @@ icon: "list-check" - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626033235` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626107819` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626744276` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626760602` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626796373` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626807595` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 @@ -214,7 +216,9 @@ icon: "list-check" - 复核 Go OpenAPI Makefile 生成配置已纳入 Prediction:`MODULES` 包含 `prediction`,`oapi-codegen` 使用 `-include-tags Prediction` 输出 `go/openapi/prediction/client.gen.go`。 - 复核 Go REST generated client 已补:`go/openapi/prediction/client.gen.go` 包含 event / market activities 方法、activity model、order/type enum;`go/chainstream.go` 已挂载 `client.Prediction`。 - 复核 Go REST focused checks:本地 `gofmt`、`git diff --check`、`go list ./openapi/prediction` 通过;GitHub Actions `Go Linting` 通过,`Go Tests` 1.23 / 1.24 通过。 - - 2026-06-05 复核 Python generated REST client 缺口:Python generated client 还没有 `prediction_api.py` 和 prediction activity model 文件。 + - 复核 Python REST OpenAPI client 已补:`prediction_api.py`、`prediction_activities_response.py`、`prediction_activity.py`、`prediction_activity_order.py`、`prediction_activity_type.py` 已纳入 committed client,并在 package exports 中暴露。 + - 复核 Python REST focused tests 通过:`test_prediction_api.py`、`test_prediction_activity.py`、`test_prediction_activities_response.py`、`test_prediction_activity_order.py`、`test_prediction_activity_type.py`,7 个 tests 通过。 + - 复核 Python REST import smoke 通过:`PredictionApi`、`PredictionActivitiesResponse`、`PredictionActivity`、`PredictionActivityOrder`、`PredictionActivityType` 均可从 `chainstream.openapi_client` 导入。 - 2026-06-05 本地生成器尝试未通过:`go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.7.0` 第一次被系统 kill,第二次低并发超过 3 分钟无输出后停止;`java -version` 5 秒无输出,无法可靠运行 `openapi-generator 7.11.0`。 - 复核 TypeScript runtime dependency 修复:`@solana/web3.js`、`viem` 已加入 dependencies,`bs58` 已从 devDependencies 移到 dependencies。 - 复核 `pnpm --dir typescript install --frozen-lockfile` 通过。 @@ -236,7 +240,7 @@ icon: "list-check" - SDK 静态与测试覆盖: - TypeScript/Rust/Go/Python 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust/Go/Python 都能把短字段 realtime payload 解析成完整 activity model。 - - TypeScript/Rust REST API 方法和类型由 `openapi.yaml` 生成,event 与 market activities endpoint 均已覆盖。 + - TypeScript/Rust/Go/Python REST API client 均覆盖 event 与 market activities endpoint,并暴露 activity type/order enum。 - SDK live 订阅验收尝试已完成: - 使用 `~/.chainstream/credentials.env` client credentials 获取 fresh token,token 有效期为 24 小时。 - TypeScript SDK PR 分支本地 `dist` 可以完成 REST seed:`world-cup-winner` 拉取 50 条 activity,并从中得到 token channel 列表。 @@ -251,7 +255,6 @@ icon: "list-check" - services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 -- SDK REST generated client 仍需 reviewer 决策:若 Day2 要求 Python REST API 也由 `openapi.yaml` 生成并随包发布,则必须先在可用生成器环境中补 committed generated 文件,再重新跑 CI。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 From f6e0fc60786807acccb75b84158942bf901dfc4b Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:27:22 +0800 Subject: [PATCH 22/32] docs(prediction): record fresh activity api probe --- cn/guides/data-concepts/prediction-day2-targets.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 7eb3fdc..75274fa 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -165,6 +165,16 @@ icon: "list-check" - 缺失画像类字段仍返回 key;当前样本中 `takerImage`、`takerName`、`takerPseudonym` 为空字符串兜底。 - 当前样本中部分 `inventory_adjust` activity 的 `takerOrderHash` 为空字符串兜底,字段 key 保持存在。 - 当前最新两页已满足字段完整性与普通 cursor 分页验收。 +- 公网 API 于 2026-06-05 07:24 CST 重新按单个 prediction 口径验收: + - 验证 endpoint:`GET https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=20`。 + - 使用 `curl` + Bearer token 调用返回 200;Python `urllib` 被 Cloudflare 1010 browser signature 拦截,因此公网 API 自动化验收使用 `curl` 发起 HTTP 请求。 + - 第一页返回 20 条、第二页返回 20 条;第一页页内重复 `activityId` 数为 `0`,第一页和第二页跨页重复 `activityId` 数为 `0`。 + - 返回字段数为 27,字段集合为 `activityId`、`amount`、`assetIds`、`blockNumber`、`conditionId`、`eventSlug`、`logIndex`、`marketIcon`、`marketId`、`marketQuestion`、`outcome`、`outcomes`、`price`、`quantity`、`seqIndex`、`source`、`taker`、`takerAge`、`takerImage`、`takerName`、`takerOrderHash`、`takerPseudonym`、`takerTags`、`timestamp`、`tokenId`、`txHash`、`type`。 + - Future.news 23 个字段映射后缺失字段为 `[]`;required 字段缺失样本为 `[]`。 + - 画像兜底样本:`takerImage=""`、`takerName=""`、`takerPseudonym=""`、`takerTags=[]`,字段 key 均存在。 + - `token_id` 过滤探针返回 200,返回 5 条,所有返回项的 `tokenId` 均等于请求 token。 + - 单独按 `activity_type=buy`、`sell`、`redeem`、`inventory_adjust` 过滤时均返回 200,样本条数均为 3,样本 `type` 均与请求值一致。 + - 最近两页 activity type 计数为 `buy=8`、`sell=12`、`inventory_adjust=20`;最新 activity lag 约 `195s`。 - 深分页重复问题已定位: - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 @@ -259,4 +269,5 @@ icon: "list-check" - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 +- 2026-06-05 07:25 CST 新鲜生产日志复查未完成:`dexes-eks` context 下 `kubectl get ns`、`kubectl get deploy -A`、`kubectl get pods -A` 未在 30 秒内返回,已停止这些只读查询;最终部署验收前需重新拉取 services、trades sink、settlements sink 日志,确认无持续 `decode error`、`ClickHouse insert`、`cache write`、`prediction activity failed`。 - SDK PR 当前 CI 为 `CLEAN`,所有 GitHub Actions checks 已通过;仍等待 reviewer 确认,确认前不 merge、不 tag、不发布。 From f550dead1c030539c75a0a292e087357048dc40d Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:34:58 +0800 Subject: [PATCH 23/32] docs(prediction): record fresh production log probe --- cn/guides/data-concepts/prediction-day2-targets.mdx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 75274fa..7292425 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -142,7 +142,15 @@ icon: "list-check" - production rollout 已复核: - `chainstream/services` 运行镜像为 `440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/service:v1.20260605-prediction-activities`,deployment 为 `2/2` ready,pod restart 为 `0`。 - `pol-prediction-trades-to-clickhouse-pipeline` 与 `pol-prediction-settlements-to-clickhouse-pipeline` 运行镜像均为 `440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/aggregation/prediction-to-clickhouse-pipeline:deploy-prediction-activities-20260605-3e55e724`,deployment 为 `1/1` ready,pod restart 为 `0`。 - - services、trades sink、settlements sink 最近日志未发现持续 `decode error`、`ClickHouse insert`、`cache write`、`prediction activity failed`、`panic`、`fatal`、`error`。 + - services、trades sink、settlements sink 最近日志未发现持续 `decode error`、`ClickHouse insert error`、`cache write`、`prediction activity failed`、`panic`、`fatal`、`error`。 +- production rollout 于 2026-06-05 07:34 CST 重新用 Kubernetes direct API 复核: + - Homebrew `aws` CLI 在本地执行 `aws --version`、`aws sts get-caller-identity`、`aws eks get-token` 时卡住;改用本地 SigV4 presigned STS URL 生成 EKS bearer token 后,Kubernetes `/version` 返回 200,cluster version 为 `v1.35.4-eks-40737a8`。 + - `pol-prediction-trades-to-clickhouse-pipeline` 为 `1/1` ready,运行 pod `pol-prediction-trades-to-clickhouse-pipeline-77f5b7745-mksvt`,restart 为 `0`,镜像 tag 为 `deploy-prediction-activities-20260605-3e55e724`。 + - `pol-prediction-settlements-to-clickhouse-pipeline` 为 `1/1` ready,运行 pod `pol-prediction-settlements-to-clickhouse-pipeline-5dfcb69ckxvxz`,restart 为 `0`,镜像 tag 为 `deploy-prediction-activities-20260605-3e55e724`。 + - `chainstream/services` 为 `2/2` ready,运行 pod `services-846cb4c66f-fp65w`、`services-846cb4c66f-hqzsz`,restart 均为 `0`,镜像 tag 为 `v1.20260605-prediction-activities`。 + - `chainstream/services` deployment 未设置 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED`,`chainstream` namespace ConfigMap 中也未发现 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED` 或 firstscreen/prediction 相关覆盖项;services 代码默认值为 `false`。 + - 最近 1 小时 logs(每个 pod tail 1500 行)扫描结果:trades sink、settlements sink、两个 services pod 的 `decode_error`、`cache_write`、`prediction_activity_failed`、`panic_fatal`、`generic_error` 计数均为 `0`。 + - trades sink 最近日志持续出现 `CH_INSERT_OK` 写入 `dexes_dwd2.polygon_prediction_wallet_token_activities_local`;settlements sink 最近日志持续出现 `CH_INSERT_OK` 写入 ClickHouse。 - 生产 topic 与 ClickHouse 已复核: - Redpanda topic `polygon.v2.prediction.wallet-token-activities` partitions 为 `12`,`retention.ms` 为 `86400000`,`retention.local.target.ms` 为 `86400000`。 - ClickHouse local table engine 为 `MergeTree`,`ORDER BY (event_slug, seq_index, activity_id)`,热表 TTL 为 `ts + toIntervalDay(3)`。 @@ -269,5 +277,4 @@ icon: "list-check" - SDK 示例 live 订阅 WorldCup activity 并收到完整模型的生产验收尚未完成。 - Realtime event channel `pred:evt:world-cup-winner:act` 与 token channel `pred:tok:{tokenId}:act` 的生产 live receive 验收尚未完成;按当前要求 realtime 先不部署,后续需补 production `pred` namespace 或等价放行配置后再复测。 - Firstscreen cache 默认关闭已由代码与日志复核;若后续打开,需要单独补缓存命中率、陈旧数据和 cache write 日志验收。 -- 2026-06-05 07:25 CST 新鲜生产日志复查未完成:`dexes-eks` context 下 `kubectl get ns`、`kubectl get deploy -A`、`kubectl get pods -A` 未在 30 秒内返回,已停止这些只读查询;最终部署验收前需重新拉取 services、trades sink、settlements sink 日志,确认无持续 `decode error`、`ClickHouse insert`、`cache write`、`prediction activity failed`。 - SDK PR 当前 CI 为 `CLEAN`,所有 GitHub Actions checks 已通过;仍等待 reviewer 确认,确认前不 merge、不 tag、不发布。 From e29224baebe05527c4116d50e1fd70a2031a60d3 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:37:15 +0800 Subject: [PATCH 24/32] docs(prediction): add code evidence for gates --- cn/guides/data-concepts/prediction-day2-targets.mdx | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 7292425..bfea743 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -128,13 +128,24 @@ icon: "list-check" - activity Kafka、realtime、firstscreen cache publish 均为 best-effort;失败只记录 debug 日志并继续主流程。 - `PREDICTION_FIRSTSCREEN_CACHE_ENABLED` 默认值为 `false`。 - `PREDICTION_FIRSTSCREEN_CACHE_TTL_SECS` 默认值为 `86400`。 + - `deploy/k8s/pol/pol-prediction-trades-to-clickhouse-pipeline.yaml` 与 `deploy/k8s/pol/pol-prediction-settlements-to-clickhouse-pipeline.yaml` 均显式配置 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED: "false"`、`PREDICTION_FIRSTSCREEN_CACHE_TTL_SECS: "86400"`。 + - `prediction-to-clickhouse-pipeline/src/activity.rs` 只有在 `prediction_firstscreen_cache_enabled()` 返回 true 时才调用 `write_firstscreen_cache`;该函数默认读取 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false`。 + - `prediction-to-clickhouse-pipeline/src/activity.rs` 未发现 firstscreen queue 写入路径;关闭时不写 firstscreen Redis hot/payload/meta key,也不存在 queue 堆积入口。 - aggregation 当前本地工作区仍停在 Day1 metadata 分支,且有大量未提交改动;topic retention 验证以 `origin/main` 与生产部署 tag 为准,两者均为 `86400000`,不以该本地工作区文件为准。 - activity 映射单测覆盖: - buy 使用 `trade_buyer`。 - sell 使用 `trade_seller`。 - redemption 映射为 `redeem`。 - split/merge 映射为 `inventory_adjust`。 +- activity 映射代码证据: + - `prediction-to-clickhouse-pipeline/src/model.rs` 中 `DwdPolygonPredictionWalletTokenActivity::from_trade` 根据 `trade_is_outcome_buy` 映射 `buy` / `sell`,并分别选择 `trade_buyer` / `trade_seller` 作为 `taker`。 + - `prediction-to-clickhouse-pipeline/src/model.rs` 中 `settlement_activity_type` 将 `REDEMPTION` / `Redemption` / `PayoutRedemption` 映射为 `redeem`,将 `SPLIT` / `Split` / `PositionSplit` / `MERGE` / `Merge` / `PositionsMerge` 映射为 `inventory_adjust`。 + - `prediction-to-clickhouse-pipeline/src/model.rs` 单测 `settlement_activity_maps_redemption_to_redeem` 与 `settlement_activity_maps_split_and_merge_to_inventory_adjust` 锁定 settlement 映射。 - services OpenAPI 单测 `verify_prediction_event_activities_schema` 锁定 `chainstream_fields >= features_new_fields`,并要求画像兜底字段存在。 +- services firstscreen read gate 代码证据: + - `crates/infrastructure/src/database/prediction.rs` 中 `firstscreen_cache_enabled()` 默认读取 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false`。 + - `firstscreen_cache_eligible_with` 要求开关为 true、desc 首页、无 cursor、无 token / market / condition / wallet / activity_type filter 且 limit 不超过 firstscreen limit;关闭时 `try_fetch_firstscreen_cache` 不会读取 firstscreen cache。 + - 单测 `firstscreen_cache_requires_first_unfiltered_desc_page` 锁定关闭时不可命中、过滤页不可命中、cursor 下一页不可命中。 - services tag 上复核 focused tests: - `cargo test -p api verify_prediction_event_activities_schema` 通过。 - `cargo test -p infrastructure firstscreen_cache_requires_first_unfiltered_desc_page` 通过。 @@ -259,6 +270,8 @@ icon: "list-check" - TypeScript/Rust/Go/Python 都使用 enum + builder 生成 prediction activity channel。 - TypeScript/Rust/Go/Python 都能把短字段 realtime payload 解析成完整 activity model。 - TypeScript/Rust/Go/Python REST API client 均覆盖 event 与 market activities endpoint,并暴露 activity type/order enum。 + - TypeScript `src/stream/stream.ts`、Rust `src/stream/client.rs`、Go `stream/stream.go`、Python `chainstream/stream/client.py` 均通过 `PredictionActivityChannelKind` / `WsPredictionActivityChannelKind` builder 生成 `pred:evt:{key}:act` 与 `pred:tok:{key}:act`,用户无需手写 channel。 + - TypeScript、Rust、Go、Python 的 prediction activity stream tests 均断言 event channel 为 `pred:evt:world-cup-winner:act`,token channel 为 `pred:tok:{token}:act`,并验证短字段 `ty` 等 payload 能解析成完整 activity model。 - SDK live 订阅验收尝试已完成: - 使用 `~/.chainstream/credentials.env` client credentials 获取 fresh token,token 有效期为 24 小时。 - TypeScript SDK PR 分支本地 `dist` 可以完成 REST seed:`world-cup-winner` 拉取 50 条 activity,并从中得到 token channel 列表。 From 194537199b481207d1e7b11dbacb2f296f1b5da9 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:39:23 +0800 Subject: [PATCH 25/32] docs(prediction): add day2 completion matrix --- .../data-concepts/prediction-day2-targets.mdx | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index bfea743..18e52f1 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -112,6 +112,24 @@ icon: "list-check" 8. 日志:生产无持续 decode error、ClickHouse insert error、cache write error。 9. 发布:aggregation/services/SDK 的生产记录均包含 tag 值、对应 main commit、workflow 或 rollout 链接。 +## 完成状态矩阵 + +| 目标项 | 当前状态 | 已有证据 | 剩余动作 | +|---|---|---|---| +| Activities 数据链路 | 已验证 | Polygon trades / settlements sink 运行 tag `deploy-prediction-activities-20260605-3e55e724`;ClickHouse activity 表有 `buy`、`sell`、`inventory_adjust` 样本;logs 有 `CH_INSERT_OK` | PR #29 部署后复测深分页去重 | +| Activity topic retention | 已验证 | `polygon.v2.prediction.wallet-token-activities` partitions 为 `12`,`retention.ms=86400000`,`retention.local.target.ms=86400000` | 无 | +| ClickHouse 3 天热表 | 已验证 | `polygon_prediction_wallet_token_activities_local` engine 为 `MergeTree`,TTL 为 `ts + toIntervalDay(3)` | 无 | +| trade / settlement 映射 | 已验证 | `from_trade` 使用 `trade_buyer` / `trade_seller`;`settlement_activity_type` 映射 `redeem` / `inventory_adjust`;对应单测已记录 | 无 | +| Event REST API | 已验证 | `GET /v1/prediction/events/world-cup-winner/activities` 公网返回 200,字段数 27,Future.news 23 字段缺失 `[]`,连续两页无重复 | PR #29 部署后补深分页重复探针 | +| Market REST API | PR ready,未部署 | services PR #30 新增 `/v1/prediction/markets/{condition_id}/activities`,focused tests 通过,PR `OPEN / CLEAN` | 等 reviewer 确认后 merge、从 main 打 tag、部署、公网复测 200 | +| OpenAPI / SDK REST | PR ready,未发布 | SDK PR #10 head `32e7416` 覆盖 TypeScript/Rust/Go/Python REST client;CI 全绿 | 等 reviewer 确认后 merge、从 main 打 SDK release tag、发布 | +| Realtime channel / payload | 代码 ready,生产 live 未通过 | aggregation tag 使用 `pred:evt:{event_slug}:act` / `pred:tok:{token_id}:act`,payload 短字段;SDK parser 单测通过 | 按当前要求 realtime 先不部署;后续放行 `pred` namespace 后复测 live receive | +| Realtime failure rule | 已验证代码证据 | Kafka/realtime/cache publish 失败只 debug 记录并继续主流程;不补发、不进 DLQ、不阻塞 offset commit | 生产 live receive 放行后补端到端验证 | +| SDK realtime 订阅 | PR ready,live receive 未通过 | TS/Rust/Go/Python enum + builder 构造 channel,短字段 payload 解析为完整模型;SDK CI 全绿 | 等 SDK PR review/发布;realtime namespace 放行后跑 SDK live 示例 | +| Firstscreen cache gate | 已验证默认关闭 | aggregation YAML 显式 `PREDICTION_FIRSTSCREEN_CACHE_ENABLED=false`;services deployment 未设置覆盖项;代码默认 false;最近 logs 无 cache write error | 后续打开开关前补命中率、陈旧数据、cache write 日志验收 | +| 发布流程 | 部分完成,剩余受 review gate 控制 | aggregation/services 已有历史生产 tag;services #29/#30、SDK #10、docs #3 均 `OPEN / CLEAN` | 等 reviewer 确认;确认前不 merge、不 tag、不部署、不发布 | +| 最终验收 | 未完成 | topic、DDL、pipeline、API、SDK、logs 已有记录 | 还缺 services #29/#30 部署后验收、SDK 发布、realtime live receive、SDK live receive | + ## 2026-06-05 验收记录 ### 已验证 From a5c7252446053fd5092395fce586400adda958c9 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:44:49 +0800 Subject: [PATCH 26/32] docs(prediction): refresh live activity api probe --- cn/guides/data-concepts/prediction-day2-targets.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 18e52f1..c200ddb 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -212,6 +212,14 @@ icon: "list-check" - `token_id` 过滤探针返回 200,返回 5 条,所有返回项的 `tokenId` 均等于请求 token。 - 单独按 `activity_type=buy`、`sell`、`redeem`、`inventory_adjust` 过滤时均返回 200,样本条数均为 3,样本 `type` 均与请求值一致。 - 最近两页 activity type 计数为 `buy=8`、`sell=12`、`inventory_adjust=20`;最新 activity lag 约 `195s`。 +- 公网 API 于 2026-06-05 07:44 CST 再次按单个 prediction 口径复测: + - 验证 endpoint 仍为 `GET https://api.chainstream.io/v1/prediction/events/world-cup-winner/activities?condition_id=0x9b6fef249040fd17e9c107955b37ac2c3e923509b6b0ff01cc463a331ddeb894&limit=20`。 + - 第一页与第二页均返回 200,各返回 20 条 activity。 + - 第一页页内重复 `activityId` 数为 `0`,第一页和第二页跨页重复 `activityId` 数为 `0`。 + - 返回字段数为 27,Future.news 23 个字段映射后缺失字段为 `[]`,required 字段缺失样本为 `[]`。 + - 最近两页 activity type 计数为 `buy=16`、`sell=16`、`inventory_adjust=8`。 + - 最新 activity lag 约 `38s`。 + - 画像兜底样本仍为 `takerImage=""`、`takerName=""`、`takerPseudonym=""`、`takerTags=[]`,字段 key 均存在。 - 深分页重复问题已定位: - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 From 8918b919c752853dd17003114e9012076e74c691 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:45:25 +0800 Subject: [PATCH 27/32] docs(prediction): record sdk pr body refresh --- cn/guides/data-concepts/prediction-day2-targets.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index c200ddb..039bf5c 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -253,6 +253,7 @@ icon: "list-check" - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626760602` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626796373` - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626807595` + - `https://github.com/chainstream-io/chainstream-sdk/pull/10#issuecomment-4626909758` - SDK 本地验证已完成: - TypeScript example build 通过。 - TypeScript SDK build 通过。 From abfe34448f6005710ec6b22c57a0abd61cdc66f3 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:46:58 +0800 Subject: [PATCH 28/32] docs(prediction): record services pr merge order --- cn/guides/data-concepts/prediction-day2-targets.mdx | 1 + 1 file changed, 1 insertion(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 039bf5c..a9b0502 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -311,6 +311,7 @@ icon: "list-check" - services PR #29 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #29 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测深分页探针重复数为 `0`。 - services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 +- services PR #30 与 PR #29 在 `crates/infrastructure/src/database/prediction.rs` 存在预期内容冲突;release 顺序固定为先 merge #29,再刷新 #30 到最新 `origin/main` 并解决冲突,通过 focused tests 后才能 merge。 - services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。 From dfcb58d05a540decb756cddcb84d2846312f5102 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:49:37 +0800 Subject: [PATCH 29/32] docs(prediction): add post-review release runbook --- .../data-concepts/prediction-day2-targets.mdx | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index a9b0502..d64c91d 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -86,13 +86,31 @@ icon: "list-check" - `kubectl -n blockchain-streaming-aggregation-pol set image deployment/pol-prediction-trades-to-clickhouse-pipeline pol-prediction-trades-to-clickhouse-pipeline=440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/aggregation/prediction-to-clickhouse-pipeline:${AGG_TAG}` - `kubectl -n blockchain-streaming-aggregation-pol set image deployment/pol-prediction-settlements-to-clickhouse-pipeline pol-prediction-settlements-to-clickhouse-pipeline=440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/aggregation/prediction-to-clickhouse-pipeline:${AGG_TAG}` - services:提 PR;review 通过并合并后拉最新 `origin/main`;从 main 打 tag;部署 API。 -- services tag 必须指向 main commit;production workflow 使用 tag 值作为镜像 tag,验收记录中写明 `${SERVICES_TAG}`、GitHub Actions run、镜像 tag 和 rollout 结果。 +- services tag 必须指向 main commit;production workflow 监听 `v*` tag 并校验该 commit 位于 `origin/main`,workflow 使用 tag 值作为镜像 tag,验收记录中写明 `${SERVICES_TAG}`、GitHub Actions run、镜像 tag 和 rollout 结果。 - chainstream-sdk:提 PR;review 通过并合并后拉最新 `origin/main`;从 main 打 tag;发布 SDK。 -- chainstream-sdk release tag 必须从 main 创建;TypeScript 使用 `js-v*` tag,Rust 使用 `rust-v*` tag,验收记录中写明 `${SDK_TAG}`、GitHub Actions run 和发布包版本。 +- chainstream-sdk release tag 必须从 main 创建;TypeScript 使用 `js-v*` tag,Rust 使用 `rust-v*` tag,Python 使用 `py-v*` tag,Go 使用 `go-v*` tag,验收记录中写明 `${SDK_TAG}`、GitHub Actions run 和发布包版本。 - 部署后验证 OpenAPI YAML、REST 首页、cursor 下一页、realtime event channel、realtime token channel、SDK 订阅解析。 - 禁止使用 feature branch 或 `latest` 作为生产发布依据;生产发布使用 tag 镜像或 tag commit,review 未确认前不创建这些 tag。 - reviewer 未确认前不 merge、不 tag、不部署。 +### Review 后执行 runbook + +1. services PR #29 review 通过后合并到 `main`。 +2. 在 services 仓库执行 `git checkout main && git pull --ff-only origin main`,确认 `git rev-parse HEAD` 为 #29 merge 后的 main commit。 +3. 从 services main 创建 `${SERVICES_TAG}`,格式使用 `v*`,执行 `git tag -a ${SERVICES_TAG} -m "${SERVICES_TAG}" && git push origin ${SERVICES_TAG}`。 +4. 等待 services `CD - Production` workflow 完成,记录 workflow run、ECR image `440744256864.dkr.ecr.ap-southeast-1.amazonaws.com/chainstream/service:${SERVICES_TAG}`。 +5. 部署 services image tag 到 production services deployment,记录 rollout status、pod image tag、pod restart。 +6. 复测深分页重复探针,验收 `activityId` 页内重复数为 `0`、跨页重复数为 `0`。 +7. 刷新 services PR #30 到最新 `origin/main`,解决 `crates/infrastructure/src/database/prediction.rs` 冲突。 +8. 对 PR #30 重跑 `cargo test -p infrastructure database::prediction::tests`、`cargo test -p api verify_prediction_event_activities_schema`、OpenAPI smoke check、`git diff --check`。 +9. PR #30 review 通过后合并到 `main`。 +10. 在 services 仓库重新执行 `git checkout main && git pull --ff-only origin main`,从 main 创建新的 `${SERVICES_TAG}` 并推送。 +11. 等待 services `CD - Production` workflow 完成,部署新 services image tag,复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且调用方不需要 `event_slug`。 +12. chainstream-sdk PR #10 review 通过后合并到 `main`。 +13. 在 SDK 仓库执行 `git checkout main && git pull --ff-only origin main`,从 main 创建并推送需要发布的 SDK tag:`js-v*`、`rust-v*`、`py-v*`、`go-v*`。 +14. 等待 SDK release workflows 完成,记录 npm、crates.io、PyPI、Go SDK repo/tag 发布结果。 +15. Realtime 仍按当前要求先不部署;生产 live receive 与 SDK live receive 在 `pred` namespace 放行后单独补验收。 + ## PR 审核顺序 1. aggregation-pipelines:确认 topic、DDL、activity 映射、ClickHouse 写入、realtime publish、firstscreen cache gate。 @@ -220,6 +238,12 @@ icon: "list-check" - 最近两页 activity type 计数为 `buy=16`、`sell=16`、`inventory_adjust=8`。 - 最新 activity lag 约 `38s`。 - 画像兜底样本仍为 `takerImage=""`、`takerName=""`、`takerPseudonym=""`、`takerTags=[]`,字段 key 均存在。 +- 公网 API 于 2026-06-05 07:48 CST 复测仍通过: + - 第一页与第二页均返回 200,各返回 20 条 activity。 + - 第一页页内重复 `activityId` 数为 `0`,第一页和第二页跨页重复 `activityId` 数为 `0`。 + - 返回字段数为 27,Future.news 23 个字段映射后缺失字段为 `[]`,required 字段缺失样本为 `[]`。 + - 最近两页 activity type 计数为 `buy=17`、`sell=15`、`inventory_adjust=8`。 + - 最新 activity lag 约 `146s`。 - 深分页重复问题已定位: - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 From c50a1122b88a9b72ed6dc4a22a57b6c9f2258dc3 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:54:43 +0800 Subject: [PATCH 30/32] docs(prediction): record latest activity filter probe --- cn/guides/data-concepts/prediction-day2-targets.mdx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index d64c91d..d418f81 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -244,6 +244,14 @@ icon: "list-check" - 返回字段数为 27,Future.news 23 个字段映射后缺失字段为 `[]`,required 字段缺失样本为 `[]`。 - 最近两页 activity type 计数为 `buy=17`、`sell=15`、`inventory_adjust=8`。 - 最新 activity lag 约 `146s`。 +- 公网 API 于 2026-06-05 07:54 CST 复测: + - 单个 prediction 口径 endpoint 第一页与第二页均返回 200,各返回 20 条 activity。 + - 第一页页内重复 `activityId` 数为 `0`,第一页和第二页跨页重复 `activityId` 数为 `0`。 + - 返回字段数为 27,Future.news 23 个字段映射后缺失字段为 `[]`,required 字段缺失样本为 `[]`。 + - 最新 activity lag 约 `31s`。 + - `token_id` 过滤返回 200,5 条样本全部匹配请求 token。 + - 单个 prediction 口径下 `activity_type=buy`、`sell`、`inventory_adjust` 均返回 200,样本数均为 3,样本 `type` 全部匹配请求值。 + - 单个 prediction 口径下 `activity_type=redeem` 返回 200,但当前该 market 返回 0 条样本;event 口径不带 `condition_id` 的 `activity_type=redeem` 返回 200,5 条样本全部为 `redeem`,样本来自 condition `0xc7c21c8972c773b34f36f67f15dada2584474d959f7e338aca5994727d37ae39`。 - 深分页重复问题已定位: - 使用生产 ClickHouse 中重复 `activity_id` 附近的 cursor 访问公网 API,`limit=10` 返回 200,但存在 2 个重复 `activityId`。 - services 修复 PR 已创建:`https://github.com/chainstream-io/services/pull/29`。 From 3c1c0c50200078d29bb2b0fd40a825b127db7f5a Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:57:06 +0800 Subject: [PATCH 31/32] docs(prediction): record latest services pr validation --- cn/guides/data-concepts/prediction-day2-targets.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index d418f81..8f16c71 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -260,6 +260,11 @@ icon: "list-check" - PR #29 focused tests 已通过: - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` + - 2026-06-05 07:56 CST 重新在 PR #29 head `b7151a1` 验证通过: + - `cargo test -p infrastructure database::prediction::tests`:4 个 prediction tests 通过,包含 `activities_sql_deduplicates_activity_ids_before_page_limit`。 + - `cargo test -p api verify_prediction_event_activities_schema`:schema test 在 `api` lib 与 `data-service` test binary 均通过。 + - `git diff --check` 通过。 + - 输出仅包含仓库既有 warnings,无新增失败。 - 单个 prediction / market endpoint 已补 PR: - services PR #30 已创建:`https://github.com/chainstream-io/services/pull/30`。 - PR #30 基于最新 `origin/main`:`0 behind / 1 ahead`,当前 head commit 为 `1beaca3`,GitHub merge state 为 `CLEAN`,无仓库 checks 配置。 @@ -268,6 +273,12 @@ icon: "list-check" - PR #30 focused tests 已通过: - `cargo test -p infrastructure database::prediction::tests` - `cargo test -p api verify_prediction_event_activities_schema` + - 2026-06-05 07:56 CST 重新在 PR #30 head `1beaca3` 验证通过: + - `cargo test -p infrastructure database::prediction::tests`:5 个 prediction tests 通过,包含 event slug filter 与 market condition-only SQL tests。 + - `cargo test -p api verify_prediction_event_activities_schema`:schema test 在 `api` lib 与 `data-service` test binary 均通过。 + - `git diff --check` 通过。 + - OpenAPI smoke check 确认 `/v1/prediction/events/{event_slug}/activities`、`/v1/prediction/markets/{condition_id}/activities`、`PredictionActivitiesResponse`、`PredictionActivity`、`PredictionActivityOrder`、`PredictionActivityType` 与 `Prediction` tag 存在。 + - 输出仅包含仓库既有 warnings,无新增失败。 - chainstream-sdk PR 已创建:`https://github.com/chainstream-io/chainstream-sdk/pull/10`。 - chainstream-sdk PR 基于最新 `origin/main`:`0 behind / 23 ahead`,当前 head commit 为 `32e7416`,GitHub merge state 为 `CLEAN`。 - chainstream-sdk PR 已补 review note: From 63829d57869b6e441f2ec64607f82d1d47c54a92 Mon Sep 17 00:00:00 2001 From: Q Date: Fri, 5 Jun 2026 07:59:29 +0800 Subject: [PATCH 32/32] docs(prediction): document services conflict resolution --- .../data-concepts/prediction-day2-targets.mdx | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/cn/guides/data-concepts/prediction-day2-targets.mdx b/cn/guides/data-concepts/prediction-day2-targets.mdx index 8f16c71..15e0db5 100644 --- a/cn/guides/data-concepts/prediction-day2-targets.mdx +++ b/cn/guides/data-concepts/prediction-day2-targets.mdx @@ -102,14 +102,16 @@ icon: "list-check" 5. 部署 services image tag 到 production services deployment,记录 rollout status、pod image tag、pod restart。 6. 复测深分页重复探针,验收 `activityId` 页内重复数为 `0`、跨页重复数为 `0`。 7. 刷新 services PR #30 到最新 `origin/main`,解决 `crates/infrastructure/src/database/prediction.rs` 冲突。 -8. 对 PR #30 重跑 `cargo test -p infrastructure database::prediction::tests`、`cargo test -p api verify_prediction_event_activities_schema`、OpenAPI smoke check、`git diff --check`。 -9. PR #30 review 通过后合并到 `main`。 -10. 在 services 仓库重新执行 `git checkout main && git pull --ff-only origin main`,从 main 创建新的 `${SERVICES_TAG}` 并推送。 -11. 等待 services `CD - Production` workflow 完成,部署新 services image tag,复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且调用方不需要 `event_slug`。 -12. chainstream-sdk PR #10 review 通过后合并到 `main`。 -13. 在 SDK 仓库执行 `git checkout main && git pull --ff-only origin main`,从 main 创建并推送需要发布的 SDK tag:`js-v*`、`rust-v*`、`py-v*`、`go-v*`。 -14. 等待 SDK release workflows 完成,记录 npm、crates.io、PyPI、Go SDK repo/tag 发布结果。 -15. Realtime 仍按当前要求先不部署;生产 live receive 与 SDK live receive 在 `pred` namespace 放行后单独补验收。 +8. 冲突 resolution 固定保留 PR #30 的 market endpoint query 重构,并把 PR #29 的 `LIMIT 1 BY activity_id` 放在 ClickHouse SQL 的 `ORDER BY seq_index {order}, activity_id {order}` 后、page `LIMIT {limit}` 前。 +9. 冲突 resolution 固定保留 PR #30 的 `event_activities_sql_keeps_event_slug_filter`、`market_activities_sql_filters_condition_without_event_slug` tests,并补回 PR #29 的 `activities_sql_deduplicates_activity_ids_before_page_limit` test。 +10. 对 PR #30 重跑 `cargo test -p infrastructure database::prediction::tests`、`cargo test -p api verify_prediction_event_activities_schema`、OpenAPI smoke check、`git diff --check`。 +11. PR #30 review 通过后合并到 `main`。 +12. 在 services 仓库重新执行 `git checkout main && git pull --ff-only origin main`,从 main 创建新的 `${SERVICES_TAG}` 并推送。 +13. 等待 services `CD - Production` workflow 完成,部署新 services image tag,复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且调用方不需要 `event_slug`。 +14. chainstream-sdk PR #10 review 通过后合并到 `main`。 +15. 在 SDK 仓库执行 `git checkout main && git pull --ff-only origin main`,从 main 创建并推送需要发布的 SDK tag:`js-v*`、`rust-v*`、`py-v*`、`go-v*`。 +16. 等待 SDK release workflows 完成,记录 npm、crates.io、PyPI、Go SDK repo/tag 发布结果。 +17. Realtime 仍按当前要求先不部署;生产 live receive 与 SDK live receive 在 `pred` namespace 放行后单独补验收。 ## PR 审核顺序 @@ -354,7 +356,7 @@ icon: "list-check" - services PR #29 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 - services PR #29 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测深分页探针重复数为 `0`。 - services PR #30 等待 reviewer 确认;确认前不 merge、不 tag、不部署。 -- services PR #30 与 PR #29 在 `crates/infrastructure/src/database/prediction.rs` 存在预期内容冲突;release 顺序固定为先 merge #29,再刷新 #30 到最新 `origin/main` 并解决冲突,通过 focused tests 后才能 merge。 +- services PR #30 与 PR #29 在 `crates/infrastructure/src/database/prediction.rs` 存在预期内容冲突;release 顺序固定为先 merge #29,再刷新 #30 到最新 `origin/main` 并解决冲突,通过 focused tests 后才能 merge。冲突 resolution 必须同时保留 #30 的 market endpoint query 重构、#30 的 event/market SQL tests、#29 的 `LIMIT 1 BY activity_id` 和 #29 的 dedup SQL test。 - services PR #30 merge 后,必须拉最新 `origin/main`,从 main 打 tag,再部署 services,并复测 `GET /v1/prediction/markets/{condition_id}/activities` 公网返回 200,且无需 `event_slug`。 - SDK PR 仍等待 reviewer 确认;确认前不 merge、不 tag、不发布。 - SDK release tag 尚未创建;必须在 PR merge 后拉最新 `origin/main`,再从 main 创建 tag。