@antprofuse/saddle-skill 0.3.9 → 0.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +14 -7
- package/agents/openai.yaml +1 -1
- package/assets/business-example/Cargo.lock +2606 -0
- package/assets/business-example/Cargo.toml +11 -0
- package/assets/business-example/contracts/api.proto +17 -0
- package/assets/business-example/contracts/saddle_external_function.proto +13 -0
- package/assets/business-example/mappings/users.json +1 -0
- package/assets/business-example/saddle.toml +31 -0
- package/assets/business-example/src/main.rs +389 -0
- package/package.json +2 -2
- package/references/business-example.md +40 -0
- package/references/consumer-start.md +2 -2
- package/references/database-name-mapping.md +47 -2
- package/references/external-function-contracts.md +2 -2
- package/references/local-integration.md +9 -6
- package/references/operations-observability.md +4 -3
- package/references/programming-model.md +21 -3
- package/references/response-model.md +2 -0
- package/references/validation.md +6 -4
- package/scripts/saddle-03-gate.js +7 -5
|
@@ -38,7 +38,7 @@ target/release/my-saddle-app --config /etc/my-saddle-app/saddle.toml
|
|
|
38
38
|
|
|
39
39
|
生产推荐传绝对配置路径。`--config saddle.toml` 与 `--config ./saddle.toml` 也合法,它们都相对进程当前工作目录定位配置文件;配置中的 `mappingDir` 和业务 `resolve_path()` 则相对 `saddle.toml` 所在目录解析。进程只接受这一对参数,不从默认位置搜索、不合并多文件、不热更新。
|
|
40
40
|
|
|
41
|
-
0.3.
|
|
41
|
+
0.3.11 部署配置只接受 `[framework.profusecontract].authority`。有业务配置的完整最小文件是 [saddle-configured.toml](../assets/saddle-configured.toml),`business_config ();` 应用使用不含 `[business]` 的 [saddle-unit.toml](../assets/saddle-unit.toml):
|
|
42
42
|
|
|
43
43
|
```toml
|
|
44
44
|
[framework]
|
|
@@ -82,7 +82,7 @@ dataPath = "fixtures/data"
|
|
|
82
82
|
- `[framework.lifecycle].shutdownTimeoutMs`:可选正整数,默认 `30000` 毫秒;从 SIGTERM 起算,共同覆盖停止接收、请求 drain、逆序 shutdown、post-driver 和资源 ZERO 的唯一总预算。超时记录 typed 阶段并 fail-closed,不伪报 clean shutdown。
|
|
83
83
|
- `[framework.admission].cpuCores`:必填正整数、无默认值;是部署分配给进程的 CPU 核数,不是业务期望并发。
|
|
84
84
|
- `[framework.admission].memoryMb`:必填正整数、无默认值;按十进制 MB 冻结部署内存预算。
|
|
85
|
-
- `[framework.admission].requestTimeoutMs`:可选正整数;省略时固定为 `5000`
|
|
85
|
+
- `[framework.admission].requestTimeoutMs`:可选正整数;省略时固定为 `5000` 毫秒。仅当 ingress 没有绝对 deadline 时用它形成请求期限;已有 deadline 原样贯穿 body、handler、连接、unary 与 terminal,不能分阶段重置或延长。
|
|
86
86
|
- `[framework.admission.dependencies].databaseConcurrency`:必填正整数、无默认值;是进程可同时占用的 Database 依赖额度。
|
|
87
87
|
- `[framework.admission.dependencies].profusecontractConcurrency`:必填正整数、无默认值;是进程可同时占用的 ProfuseContract 依赖额度。
|
|
88
88
|
- `[framework.profusecontract].authority`:必填字符串、无默认值;必须是 plaintext `http://host:port` 固定地址,或只含一个 `{zone}` 的模板。模板由同一请求的 LDC zone 在调用前解析;禁止 path、query、fragment、userinfo、凭据和其他模板。
|
|
@@ -94,9 +94,9 @@ dataPath = "fixtures/data"
|
|
|
94
94
|
|
|
95
95
|
所有配置在 listener 建立前一次解析和冻结。普通字段不能由环境变量覆盖;secret 只能通过 `[secrets]` 中明确声明的环境变量引用注入。文件不可读、未知/旧键、缺失字段、类型错误、非法 bind/authority、secret 缺失、数据库配置不完整或映射目录非法都必须 fail-fast,并返回稳定的 `saddle.process.*` 错误码。
|
|
96
96
|
|
|
97
|
-
配置中没有 `maxActiveRequests`。框架从冻结输入确定唯一 active capacity:`min(CPU、封闭单请求内存额度、Database concurrency、ProfuseContract concurrency)`;wait capacity 固定为 `W=0
|
|
97
|
+
配置中没有 `maxActiveRequests`。框架从冻结输入确定唯一 active capacity:`min(CPU、封闭单请求内存额度、Database concurrency、ProfuseContract concurrency)`;wait capacity 固定为 `W=0`。超出任一维度时同步返回 HTTP 503,不进入等待队列,也不执行框架后台重试。socket 已 accept 后的慢读/断连或响应背压也只能形成有界 HTTP 503 或正常终态,不能出现 0-byte EOF。
|
|
98
98
|
|
|
99
|
-
每个 ingress body、ProfuseContract 请求与 ProfuseContract 响应都受 1 MiB 边界约束,框架还把解码、响应和固定开销计入同一封闭内存额度。正常完成、客户端断连和绝对 timeout 均归还原请求的准入资源。无 DB route 由框架形成 `NotUsed`;真实 DB route 由生成的 query/write/单层 transaction 执行链形成 `Returned` 或 `Discarded`。DB 值返回 handler 生成响应后,框架在写回、断连或 timeout 终态到达时才 finish 请求;业务不得提前终结或丢弃资源 owner。
|
|
99
|
+
每个 ingress body、ProfuseContract 请求与 ProfuseContract 响应都受 1 MiB 边界约束,框架还把解码、响应和固定开销计入同一封闭内存额度。正常完成、客户端断连和绝对 timeout 均归还原请求的准入资源。无 DB route 由框架形成 `NotUsed`;真实 DB route 由生成的 query/write/单层 transaction 执行链形成 `Returned` 或 `Discarded`。DB timeout 污染并 discard 当前连接,框架补回池槽;transaction 只有成功路径 commit,失败、timeout、cancel rollback,rollback 不能证明完成时 discard。DB 值返回 handler 生成响应后,框架在写回、断连或 timeout 终态到达时才 finish 请求;业务不得提前终结或丢弃资源 owner。terminal 后四维及 aggregate used metrics 必须归零。
|
|
100
100
|
|
|
101
101
|
## 管理探针与退出顺序
|
|
102
102
|
|
|
@@ -104,10 +104,11 @@ dataPath = "fixtures/data"
|
|
|
104
104
|
- `GET /ready`:只有所有受管组件启动完成后的 Ready 阶段为 HTTP 200 与 `{"ready":true}`;Starting、Draining 等非 Ready 阶段为 HTTP 503 与 `{"ready":false}`。
|
|
105
105
|
- `GET /metrics`:在同一独立 management listener 返回 OpenMetrics-compatible 进程内有界快照。指标名与 label 集合固定、低基数;禁止 request/trace/rpc/user/payload/authority/error text、secret 或业务值作为 label。
|
|
106
106
|
- SIGTERM 到达后,框架先原子清除 readiness,使负载均衡停止新流量,再等待已准入请求 drain。drain 期间 management listener 与 `/live` 保持可用;业务 listener 先停止,management listener 最后停止,进程退出后两者均不可达。
|
|
107
|
+
- `shutdownTimeoutMs` 从 SIGTERM 到达起只计算一次,是停止接收、drain、资源归还和组件停止共享的总预算;任一阶段不得重置。
|
|
107
108
|
|
|
108
109
|
这些端点是框架生命周期的只读投影,不执行数据库查询、profusecontract RPC、磁盘探测或任意业务自检。不得在 handler 中写健康状态,不得增加动态 management route。部署系统负责探针调度、失败阈值、摘流和重启策略。
|
|
109
110
|
|
|
110
|
-
该 authority 是部署输入,不进入业务 spec、request 或 handler。TLS、鉴权、服务发现、负载均衡和生产凭据不属于 0.3.
|
|
111
|
+
该 authority 是部署输入,不进入业务 spec、request 或 handler。TLS、鉴权、服务发现、负载均衡和生产凭据不属于 0.3.11;需要其中任一能力时立即停止,不得在业务 crate 自建 client。
|
|
111
112
|
|
|
112
113
|
## 联调完成条件
|
|
113
114
|
|
|
@@ -119,6 +120,8 @@ dataPath = "fixtures/data"
|
|
|
119
120
|
4. 返回 `Completed` 或八类 `TechnicalFailure × ExecutionCertainty` 之一;业务代码显式处理,不自动重试。
|
|
120
121
|
5. 受管请求只形成一个 terminal;DB 物理资源先收敛,但准入 finish 仅在 HTTP response 写回、断连或 timeout 之后完成。
|
|
121
122
|
|
|
122
|
-
结构化日志至少按正式 API 暴露的字段记录 trace/rpc、span/parent、request/call、app/interface、zone、outcome 与 duration;不得记录 payload、Cookie、session、原始 context、PII、secret 或数据库值。业务不得安装第二日志 subscriber。`saddle.log` 是框架结构化日志;stdout/stderr 是独立进程流,运维采集时不得与文件日志拼接成同一记录源。Saddle 0.3.
|
|
123
|
+
结构化日志至少按正式 API 暴露的字段记录 trace/rpc、span/parent、request/call、app/interface、zone、outcome 与 duration;不得记录 payload、Cookie、session、原始 context、PII、secret 或数据库值。业务不得安装第二日志 subscriber。`saddle.log` 是框架结构化日志;stdout/stderr 是独立进程流,运维采集时不得与文件日志拼接成同一记录源。Saddle 0.3.11 不提供按大小轮转、归档压缩或历史清理;目录容量、外部采集、压缩与保留期由业务运维环境负责。
|
|
123
124
|
|
|
124
125
|
联调 harness 可托管 listener 与受控 profusecontract server;业务源码不得复制 harness、直接依赖中间件 crate或注册第二入口。
|
|
126
|
+
|
|
127
|
+
长期 deadline、慢读、DB 锁等待与日志队列背压专项由 Saddle 框架回归运行。业务部署只需运行本 Skill 的正式 Gate 与代表性流量验证,不应复制或定期运行该重型专项。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 生产日志还原与排障
|
|
2
2
|
|
|
3
|
-
Saddle 0.3.
|
|
3
|
+
Saddle 0.3.11 的框架事件只写入同一 `saddle.log`。运维应以 ingress 提供的 `trace_id` 为主键,在单个进程文件顺序内还原请求,不依赖请求 body、Header 或数据库细节。
|
|
4
4
|
|
|
5
5
|
## 还原一条请求
|
|
6
6
|
|
|
@@ -33,10 +33,11 @@ jq -c 'select(
|
|
|
33
33
|
|
|
34
34
|
## 容量与终态判断
|
|
35
35
|
|
|
36
|
-
- capacity 事件提供四项安全 budget、统一 active `limit`、当前 `used`、确定性 `bottleneck` 与封闭 `reject_reason`。同一请求 accepted 或 rejected
|
|
36
|
+
- capacity 事件提供四项安全 budget、统一 active `limit`、当前 `used`、确定性 `bottleneck` 与封闭 `reject_reason`。同一请求 accepted 或 rejected 的四维记录必须一致;`W=0` 超限同步返回 HTTP 503。已 accept socket 的响应背压不得产生 0-byte EOF。
|
|
37
37
|
- resource finalization 只接受 `NotUsed`、`Returned`、`Discarded`,并在 Admission 完成资源归还后记录 `credit=released`。断连和 timeout 也必须能观察到最终归还。
|
|
38
38
|
- lifecycle 使用 Starting、Running、Draining、Stopped;健康状态使用 Healthy、Degraded、Failed。SIGTERM 后应先看到 Draining/readiness 清除,再看到资源终结和 Stopped。
|
|
39
|
-
- logger health 包含 dropped 数与 output failure stage
|
|
39
|
+
- logger health 包含 dropped 数与 output failure stage。队列满只 drop 并计数,不能阻塞请求、改变业务结果或资源终态;底层输出失败无法依赖同一个已失败文件自证,必须同时检查前台进程的 flush/shutdown 错误返回。
|
|
40
|
+
- 请求 terminal 后,CPU、memory、database、profusecontract 与 aggregate `used` 均应回到零;DB timeout/discard 后池容量必须恢复,不能用进程重启掩盖泄漏。
|
|
40
41
|
|
|
41
42
|
## 安全字段边界
|
|
42
43
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## 应用显式声明
|
|
4
4
|
|
|
5
|
-
业务应用使用 `saddle-framework = "=0.3.
|
|
5
|
+
业务应用使用 `saddle-framework = "=0.3.11"` 的公开编程面:
|
|
6
6
|
|
|
7
7
|
```rust
|
|
8
8
|
saddle::application! {
|
|
@@ -13,7 +13,7 @@ saddle::application! {
|
|
|
13
13
|
|
|
14
14
|
profusecontract {
|
|
15
15
|
contract_dir "contracts";
|
|
16
|
-
capability
|
|
16
|
+
capability Capabilities;
|
|
17
17
|
response_code BusinessCode;
|
|
18
18
|
functions {
|
|
19
19
|
QueryBoundAccounts => query_bound_accounts {
|
|
@@ -40,7 +40,7 @@ saddle::application! {
|
|
|
40
40
|
|
|
41
41
|
`deployment_app` 是本部署唯一固定应用身份。profusegw body 的 `target.app` 必须逐字匹配它;每个 service 的 `operation_type` 是对应 `target.interfaceId` 的静态身份。两者都是声明期字面量,不是 handler 参数或动态路由键。
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
handler 的第三参数是同一个应用能力聚合:所有 route 都保留声明过的
|
|
44
44
|
ProfuseContract 强类型方法;需要数据库的 route 另外在 service 声明中选择唯一静态
|
|
45
45
|
operation,例如 `database query_optional find_user (generated::FindUser);`、
|
|
46
46
|
`database write save_user (generated::SaveUser);`、`database transaction_commit save_user
|
|
@@ -107,6 +107,24 @@ database transaction_commit transaction (generated::SaveUserCommit);
|
|
|
107
107
|
database transaction_rollback rollback (generated::SaveUserRollback);
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
+
生成步骤就是正常 `cargo build`:在业务源码使用公开 `saddle::database_operations!`,声明逻辑表及具名 Params/Row。完整声明、字段规则与调用示例见 [数据库声明与映射](database-name-mapping.md)。不需要独立生成器、build.rs、手写 SQL 或隐藏 trait。
|
|
111
|
+
|
|
112
|
+
DB 方法只消费一次 DB 能力,并返回结果与剩余外呼能力:
|
|
113
|
+
|
|
114
|
+
```rust
|
|
115
|
+
let (result, c) = c.read(ops::ReadParams { id: request.id }.into_parameters()).await;
|
|
116
|
+
match result {
|
|
117
|
+
Ok(row) => {
|
|
118
|
+
let row = ops::ReadRow::from_database(row);
|
|
119
|
+
// 显式处理 Some/None;用具名行字段构造强类型外呼请求。
|
|
120
|
+
// c 的外呼继续沿用本请求;c 已无 read/write 等 DB 方法。
|
|
121
|
+
}
|
|
122
|
+
Err(error) => { /* 映射为封闭失败响应,不把错误当成无行 */ }
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
同一个 operation 可被多个 route 引用。`transaction_commit` 与 `transaction_rollback` 是静态 route 决策,不代表可在 handler 内动态开始、多步组合、commit 或 rollback 的事务 API。
|
|
127
|
+
|
|
110
128
|
- 无 DB route 没有数据库方法,框架以 `NotUsed` 结束。query 和 write 只消费生成的有界参数/行类型。
|
|
111
129
|
- 单层 transaction 的操作与 commit/rollback 决策都是 route 的生成期事实;同一连接成功后 commit,失败、timeout 或 cancel 时 rollback,无法证明可复用时 discard。业务不得调用 commit/rollback,不得嵌套 transaction。
|
|
112
130
|
- DB 物理终态后,handler 先使用返回值形成响应;框架保留私有 post-DB terminal,直到响应写回成功、断连或 timeout 后才 finish 原请求并归还准入资源。
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## 唯一响应
|
|
4
4
|
|
|
5
|
+
响应还受框架现有 1MiB 编码与 framing 边界约束;超界形成技术失败,不截断为成功数据。这个边界不等于全进程 RSS、driver/TLS 或任意业务分配的绝对硬上限。
|
|
6
|
+
|
|
5
7
|
handler 必须直接返回 `saddle::ingress::ProfuseGwResponse<Data, BusinessCode>`。合法语义只有两支:成功 `Success { data }`,失败 `Failure { failure: { code, message } }`。标准 JSON 投影为:
|
|
6
8
|
|
|
7
9
|
```json
|
package/references/validation.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Saddle 0.3.
|
|
1
|
+
# Saddle 0.3.11 Skill 正式业务 Gate
|
|
2
2
|
|
|
3
3
|
## 依赖与锁
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@ edition = "2024"
|
|
|
12
12
|
rust-version = "1.95"
|
|
13
13
|
|
|
14
14
|
[dependencies]
|
|
15
|
-
saddle-framework = "=0.3.
|
|
15
|
+
saddle-framework = "=0.3.11"
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
在允许访问正式 registry 的依赖准备阶段生成并提交 `Cargo.lock`。禁止 `path`、`git`、`[patch]`、source replacement 或宽松 Saddle 版本。
|
|
@@ -25,16 +25,18 @@ saddle-framework = "=0.3.9"
|
|
|
25
25
|
npx --no-install saddle-03-gate --manifest-path Cargo.toml
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
命令由已安装的 `@antprofuse/saddle-skill@0.3.
|
|
28
|
+
命令由已安装的 `@antprofuse/saddle-skill@0.3.11` 提供,不需要 Saddle 源码仓库。它会检查:
|
|
29
29
|
|
|
30
30
|
- facade 精确版本、禁止直接中间件依赖和 Cargo source 旁路;
|
|
31
|
-
- `Cargo.lock` 中 admission、boundary、core、db、framework、macros、observability、runtime、service 九包统一精确映射 `0.3.
|
|
31
|
+
- `Cargo.lock` 中 admission、boundary、core、db、framework、macros、observability、runtime、service 九包统一精确映射 `0.3.11`;
|
|
32
32
|
- 唯一 `contract_dir`、目录存在、禁止旧单文件 contract 声明;
|
|
33
33
|
- 目录根部 `saddle_external_function.proto` 与 Skill 权威模板逐字一致且仅出现一次,使用 option 的业务 proto 必须 direct import 根文件;
|
|
34
34
|
- 编译期递归扫描/import 闭包、option-only 索引、身份唯一、请求结果类型匹配,以及所有 function 均有实际 `uses`;
|
|
35
35
|
- 固定 `ProfuseGwContext`、应用声明、八类技术失败与三种 certainty 均被显式引用;
|
|
36
36
|
- handler 第三参数统一为生成 `Capabilities`,DB route 只选择 query/write/单层 transaction 的生成静态 operation;
|
|
37
37
|
- lifecycle 只有两个正整数超时(省略均为 30000),management 固定包含 `/live`、`/ready`、`/metrics`;
|
|
38
|
+
- ingress absolute deadline 优先且跨 body/handler/connect/unary/terminal 不重置;缺失时才使用默认 5000ms;
|
|
39
|
+
- 四维 `W=0` 同步 503、DB timeout/discard 恢复、terminal metrics 归零、日志队列满只 drop 计数及 SIGTERM 单一总预算均由框架长期回归覆盖;业务 Gate 不复制该重型专项;
|
|
38
40
|
- `application/2` 显式 `business_config Type`(无配置为 `()`),handler 四参数接收同型冻结 `BusinessConfig<Type>`;
|
|
39
41
|
- 部署配置使用唯一正式键 `[framework.profusecontract].authority`;有配置与 unit 应用分别使用 Skill 的完整样例,unit 文件不得出现 `[business]`;旧长键与旧配置类型模块路径均拒绝;
|
|
40
42
|
- handler 直接返回框架 `ProfuseGwResponse`,应用声明封闭 `response_code`,业务码实现 `ProfuseGwCode` 并注册无碰撞稳定机器码;
|
|
@@ -30,8 +30,8 @@ if (/^\s*\[(patch|replace)\b/m.test(cargo) || /\b(path|git|branch|tag)\s*=/.test
|
|
|
30
30
|
stop("DEPENDENCY_SOURCE", "禁止 path/git/patch/replace 依赖旁路");
|
|
31
31
|
}
|
|
32
32
|
const facade = cargo.match(/^\s*saddle-framework\s*=\s*(.+)$/m);
|
|
33
|
-
if (!facade || !/^"=0\.3\.
|
|
34
|
-
stop("SADDLE_VERSION", '必须直接且精确依赖 saddle-framework = "=0.3.
|
|
33
|
+
if (!facade || !/^"=0\.3\.11"\s*(?:#.*)?$/.test(facade[1].trim())) {
|
|
34
|
+
stop("SADDLE_VERSION", '必须直接且精确依赖 saddle-framework = "=0.3.11"');
|
|
35
35
|
}
|
|
36
36
|
const internals = ["saddle-core","saddle-admission","saddle-boundary","saddle-db","saddle-macros","saddle-observability","saddle-runtime","saddle-service"];
|
|
37
37
|
for (const name of internals) {
|
|
@@ -44,8 +44,8 @@ if (!fs.existsSync(lockPath)) {
|
|
|
44
44
|
const publicClosure = ["saddle-admission", "saddle-boundary", "saddle-core", "saddle-db", "saddle-framework", "saddle-macros", "saddle-observability", "saddle-runtime", "saddle-service"];
|
|
45
45
|
for (const name of publicClosure) {
|
|
46
46
|
const escaped = name.replaceAll("-", "\\-");
|
|
47
|
-
if (!new RegExp(`name = "${escaped}"\\nversion = "0\\.3\\.
|
|
48
|
-
stop("LOCK", `Cargo.lock 未绑定 ${name} 0.3.
|
|
47
|
+
if (!new RegExp(`name = "${escaped}"\\nversion = "0\\.3\\.11"`).test(lock)) {
|
|
48
|
+
stop("LOCK", `Cargo.lock 未绑定 ${name} 0.3.11`);
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -161,6 +161,7 @@ if (!/\bcapability\s+Capabilities\s*;/.test(source)) stop("CAPABILITIES", "appli
|
|
|
161
161
|
if (!/\bcapabilities\s*:\s*Capabilities(?:\s*<[^>]+>)?/.test(source)) stop("CAPABILITIES", "handler 第三参数必须使用生成 Capabilities");
|
|
162
162
|
if (/\b(?:contract|client)\s*:\s*[A-Za-z_][A-Za-z0-9_]*(?:Contract|Client)\b/.test(source)) stop("CAPABILITIES", "禁止旧第三参数 capability/client");
|
|
163
163
|
for (const db of source.matchAll(/\bdatabase\s+([A-Za-z_][A-Za-z0-9_]*)\s+/g)) {
|
|
164
|
+
if (!source.includes('database_operations!')) stop('DATABASE_DECLARATION', 'DB route 必须使用公开 database_operations!');
|
|
164
165
|
if (!new Set(["query_optional", "write", "transaction_commit", "transaction_rollback"]).has(db[1])) {
|
|
165
166
|
stop("DATABASE", `禁止非静态或未批准数据库模式 ${db[1]}`);
|
|
166
167
|
}
|
|
@@ -226,6 +227,7 @@ for (const certainty of ["NotExecuted","Executed","MayHaveExecuted"]) {
|
|
|
226
227
|
if (!source.includes(certainty)) stop("EXECUTION_CERTAINTY", `缺少显式分支 ${certainty}`);
|
|
227
228
|
}
|
|
228
229
|
const forbidden = [
|
|
230
|
+
["HIDDEN_DATABASE", /saddle::__private|\bStaticQueryOptionalOperation\b|\bStaticWriteOperation\b/],
|
|
229
231
|
["WILDCARD", /_\s*=>/], ["LISTENER", /\b(TcpListener|axum|hyper|actix_web|warp)\b/],
|
|
230
232
|
["RUNTIME", /\b(tokio::runtime|Runtime::new|spawn\s*\()/], ["RAW_RPC", /\b(tonic|Channel|ProfuseContractBoundary|raw_invoke|invoke_raw)\b/],
|
|
231
233
|
["DYNAMIC_FUNCTION", /\b(dynamic_function|call_dynamic|DynamicExternalFunction)\b/],
|
|
@@ -250,4 +252,4 @@ try {
|
|
|
250
252
|
fs.rmSync(target, {recursive: true, force: true});
|
|
251
253
|
}
|
|
252
254
|
if (process.exitCode) process.exit(process.exitCode);
|
|
253
|
-
process.stdout.write("SADDLE_03_GATE PASS; SKILL=0.3.
|
|
255
|
+
process.stdout.write("SADDLE_03_GATE PASS; SKILL=0.3.11; RUST=0.3.11; ADMISSION_DERIVED; W0; CLOSED_RESPONSE; CLOSED_CODES; FAILURE_MESSAGE_256; FAILURE_8X3; LOCKED_OFFLINE\n");
|