Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
9f7f248
feat(cindy): migrate Cindy accounts to the OpenAI API-key preset
Sep 25, 2026
eae72a9
fix(accounts): stream batch connection tests and show upstream errors…
Sep 25, 2026
d87686c
fix(accounts): recover tested accounts through upstream RecoverAccoun…
Sep 25, 2026
126876b
feat(ui): console design tokens, Tailwind role mapping and Geist fonts
Sep 25, 2026
d5a5922
feat(accounts): port BatchAccountTestModal for streaming batch tests
Sep 25, 2026
1b210ab
docs(downstream): describe verbatim connection-test errors and stream…
Sep 25, 2026
8222140
refactor(admin-ui): remove Cindy as a separate platform from the admi…
Sep 25, 2026
a3d3944
feat(accounts): add a Cindy (Laxa) preset for OpenAI API-key accounts
Sep 25, 2026
a26bf59
fix(accounts): choose batch test models inside the concurrency bound
Sep 25, 2026
7c3998a
feat(ui): console component recipes, shared components and layout
Sep 25, 2026
668a0e2
refactor(ui): de-sweep page classes back to upstream v0.2.8
Sep 25, 2026
4697f0b
refactor(prompts): replace prompt rules with a system prompt library
Sep 25, 2026
dc11d1d
ci(prompts): drop Skill bundle checks and prompt capture gates
Sep 25, 2026
45841c6
feat(prompts): simple system prompt page and account binding control
Sep 25, 2026
ef1bf68
docs(prompts): describe the system prompt library
Sep 25, 2026
d139700
refactor(capacity): one precedence over a single upstream metadata sn…
Sep 25, 2026
6a7dcc5
fix(prompts): keep customer array bytes when inserting a prompt item
Sep 25, 2026
b84c001
fix(ui): visual QA follow-ups for charts and dark inputs
Sep 25, 2026
9daf2ae
docs(downstream): describe the console theme layers
Sep 25, 2026
b9154d6
fix(prompts): avoid the RULE keyword as a migration loop variable
Sep 25, 2026
68a25fd
test(prompts): drop SQL-text tests of the removed prompt storage
Sep 25, 2026
084bcfa
fix(prompts): match whitespace-only checks of the imported prompts to…
Sep 25, 2026
64ce4b8
Merge branch 'fix/rework-cindy-frontend' into fix/admin-rework
Sep 25, 2026
d45c479
fix(prompts): keep an invalid stored configuration editable
Sep 25, 2026
37a515d
fix(keys): download the Codex catalog at the configured client version
Sep 25, 2026
4ef0461
fix(capacity): show the single capacity precedence in account forms
Sep 25, 2026
a138881
docs(downstream): describe the single model capacity precedence
Sep 25, 2026
3b1c2b1
Merge branch 'fix/rework-prompts' into fix/admin-rework
Sep 25, 2026
0a11a90
refactor(capacity): parse capacity declarations outside the capabilit…
Sep 25, 2026
d87b77b
Merge branch 'fix/rework-capacity' into fix/admin-rework
Sep 25, 2026
c22ccb4
fix(cindy): keep the image bridge off and drop the image bridge switc…
Sep 25, 2026
75d3990
refactor(cindy): remove the Cindy provider and treat Cindy as an Open…
Sep 25, 2026
4d47e61
feat(accounts): validate openai_prompt_cache_key_mode on account writes
Sep 25, 2026
a4156e4
fix(auth): reload API key auth snapshots cached before migration 260
Sep 25, 2026
48a7748
test: drop tests of the removed Cindy provider and follow the generic…
Sep 25, 2026
5207872
chore(deploy): drop the Cindy rollout flags
Sep 25, 2026
407f75c
docs(downstream): describe Cindy as an ordinary OpenAI API key
Sep 25, 2026
dde1c22
fix(cindy): clear lint findings left by the provider removal
Sep 25, 2026
7a12756
Merge branch 'fix/admin-rework' into fix/rework-ui
Sep 25, 2026
1e8bc6a
refactor(ui): re-run the de-sweep on the merged integration files
Sep 25, 2026
815ab8b
Merge branch 'fix/admin-rework' into fix/rework-cindy-backend
Sep 25, 2026
a04d73f
Merge branch 'fix/rework-ui' into fix/admin-rework
Sep 25, 2026
20f979f
fix: satisfy errcheck and ineffassign in prompt and capacity code
Sep 25, 2026
5061906
fix(accounts): log the cause of failed upstream model syncs
Sep 25, 2026
d7f2bb0
test: drop tests of the removed edit-context API and capabilities route
Sep 25, 2026
cd310e0
fix: keep shared invalidation helpers and drop the dead classificatio…
Sep 25, 2026
bed129e
fix(migrations): bound 259 lock waits and harden the Cindy conversion
Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
66 changes: 28 additions & 38 deletions .downstream/gpt6-routing-and-prompts.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,21 @@

账号模型管理的“同步最新支持模型”补齐内置列表;“同步上游支持的模型”才请求账号目录并保存快照。两者保留人工模型和映射。

同步返回的 `model_list_source` 单独标明型号名单来自实时上游还是配置回退,与能力补充来源分开;只有实时目录可用来确认账号当时公布了哪些型号。
同步返回的 `model_list_source` 单独标明型号名单来自实时上游还是配置回退,与能力补充来源分开;只有实时目录可用来确认账号当时公布了哪些型号。Anthropic(`limit=1000`、`after_id`/`has_more`)与 Gemini(`pageSize=1000`、`nextPageToken`)目录按页取全。

| 接入方式 | GPT-6 Sol / Luna 上下文 | 输出与推理 |
容量对所有主机使用同一优先级:自定义覆盖 > 本账号上游声明 > 参考目录 > models.dev 参考 > 未知。声明与 models.dev 参考存放在账号 `extra.upstream_model_metadata` 的模型条目中(`context_window`、`max_context_window`、`max_input_tokens`、`max_output_tokens`、`source: upstream|registry`、`observed_at`),旧的 `upstream_model_context_capacities` 已由迁移 258 并入。`context_window` 是默认工作窗口,`max_context_window` 是真实最大值。分组对外容量取能服务该模型的全部 `active` 账号(含 OAuth)的最小值;未知容量不写入 `/v1/models`,Codex 清单保留上游描述模板;图像、视频和音频模型不带文本容量。

`active` 的 API Key 账号每 24 小时分批重新同步(失败退避),创建或修改凭据后立即同步;OAuth 账号不轮询,Codex 清单经过网关时记录其声明。手动同步保留。

| 来源 | GPT-6 Sol / Luna 上下文 | 输出与推理 |
| --- | --- | --- |
| 官方 API | 1,050,000 | 最大输出 128,000;none、low、medium、high、xhigh、max |
| Codex 打包参考 | 默认 272,000,扩展最大 872,000 | 默认 medium;Sol 支持客户端 Ultra 委派,Luna 最高 Max |
| 账号原始目录 | 按实际声明及既有覆盖优先级 | 实时能力优先于旧快照和默认值 |
| 官方 API 文档 | 1,050,000(不作容量参考) | 最大输出 128,000;none、low、medium、high、xhigh、max |
| 参考目录(Codex 订阅值,适用于所有账号类型) | 默认 272,000,最大 872,000 | 默认 medium;Sol 支持客户端 Ultra 委派,Luna 最高 Max |
| 账号上游或中转声明 | 按实际声明,优先于参考目录 | 实时能力优先于旧快照和默认值 |

参考目录的其他 GPT 值同样取 Codex 订阅值:gpt-5.5 为 272,000/272,000,gpt-5.4 默认 272,000、最大 1,000,000,gpt-5.4-mini 与 gpt-5.2 为 272,000,gpt-5.6-* 为 272,000/872,000;Codex 目录中没有的型号保留 API 规格。只收录官方文档列出的日期快照别名;Qwen 参考只适用于百炼(dashscope)主机。

API Key 使用完整 Responses。OAuth 目录保留实际 Lite 与上下文字段,回退值标记为“Codex 参考”。Ultra 不作为原生 API reasoning effort 发送。Cindy 库存不因 OpenAI 发布新模型而扩大。
API Key 使用完整 Responses。OAuth 目录保留实际 Lite 与上下文字段。Ultra 不作为原生 API reasoning effort 发送。Cindy 库存不因 OpenAI 发布新模型而扩大。

两款型号有独立价卡及严格大于 272,000 输入的长请求倍率,保留人工定价。未知 GPT-6 名称不套 Astra 身份或价格。固定来源与指令摘要见 [官方提取记录](../backend/internal/pkg/openai/gpt6_codex_reference.json)。

Expand All @@ -37,40 +43,26 @@ API Key 使用完整 Responses。OAuth 目录保留实际 Lite 与上下文字

管理员接口位于 `/api/v1/admin/accounts/:id/codex-fingerprint`,profile 选择使用其 `/profile` 子路径和账号版本 CAS。`/codex-routing/validate` 是独立、不登记自动续期的限额验证操作,固定支持三款 GPT-6,一次 UUID 绑定一个账号和最多七个出站阶段;重复操作不能重新花费相同阶段。

## 提示词规则与账号选择
## 系统提示词

从侧栏“扩展功能 → 系统提示词”打开编辑器,选择提示词、修改正文与投递范围,再点击“保存并生效”。页面只保留核心配置和当前提示词的简易历史;独立模板库、来源同步、Skill 发布和请求 JSON 调试已退出管理流程,旧入口在管理员鉴权后返回 HTTP 410。
侧栏“扩展功能 → 系统提示词”:一个全局开关、一个站点默认提示词和提示词库(名称、正文 ≤64 KiB、位置 prepend/append、角色 auto/system/developer,最多 50 条)。整份配置存为 `settings.system_prompts` 一行 JSON;`GET/PUT /api/v1/admin/system-prompts` 读写整份配置并返回账号使用统计,删除仍被自定义账号使用的提示词返回 409。

管理员 `GET /api/v1/admin/system-prompts/config` 返回配置、按规则 ID 索引的正文和协议能力。`PUT` 提交 `expected_revision`、运行开关、v2 `policy` 及仅包含改动正文的 `contents`,一次事务生成不可变内容版本并更新配置,只递增一次 revision。新规则携带零模板/版本 ID 和正文;历史恢复按当前规则校验,仍加入草稿并通过同一次保存生效。`GET /api/v1/admin/system-prompts/rules/:rule_id/history` 只读取该规则的历史。未展示的 Compact、回显兼容值省略时沿用当前值。

| 位置 | 含义 |
| --- | --- |
| control_prepend / control_append | 控制指令区前后 |
| conversation_head / conversation_tail | 本次最终发送的消息数组头尾 |
| before_last_user / after_last_user | 本次序列中最后一条真实用户消息的前后,纯工具结果不算用户输入 |
账号绑定存于 `accounts.extra.system_prompt`(`inherit`、`off`、`custom` + `prompt_id`,缺省为继承)。账号编辑、行菜单和批量栏(≤1000 个)通过 `PUT /api/v1/admin/system-prompts/bindings` 写入,普通账号编辑保留该键。继承的账号在所有平台使用站点默认;全局开关关闭时一律不注入。

v2 使用独立 `role=auto/system/developer` 与 `position`。平台必须显式选择,模型默认按最终上游 ID 精确匹配;空模型集合表示全部,也可选择按请求模型匹配。同一落点按列表顺序排列。
请求路径只读内存快照(保存即替换,60 秒后台刷新以同步多实例)和调度账号自带的绑定,不查询数据库;配置不可用时不注入并告警,不向客户端返回错误。每个最终协议只注入一次:

| 最终协议 | 实际投递 |
| 最终协议 | 投递 |
| --- | --- |
| Responses | auto 控制区使用 instructions,auto 消息位置使用 developer;显式角色保留在 input。Codex OAuth 不接受 system。 |
| Chat Completions | auto 使用 system;明确要求 system 的目标不接受严格 developer,不做静默角色替换。 |
| Messages | 控制区使用顶层 system;会话内 system 仅对明确支持的模型及合法边界开放。developer 不支持。 |
| Gemini | 使用 systemInstruction,系统指令只支持控制区前后。Antigravity upstream 账号按其实际 Messages 协议处理。 |
| Responses | auto/system 追加到 `instructions` 前/后(空行分隔);developer 作为 developer 输入项放最前,或放在开头 system/developer 之后。Codex Responses Lite 与 compact 请求不注入。 |
| Chat Completions | 在开头或开头 system/developer 之后插入一条消息;上游只接受 system 时 developer 按 system 发送。 |
| Anthropic Messages | 顶层 system 前/后(developer 按 system)。Claude OAuth 伪装前注入,随客户端 system 一起迁入 `[System Instructions]`。 |
| Gemini / Antigravity | `systemInstruction` parts 前/后。 |

找不到最后用户消息,或插入会拆开工具调用配对时,跳过该条规则并返回原因,请求继续。角色/位置与目标不兼容则明确返回错误。位置只指本次出站序列,不包含 previous_response_id 指向的隐藏历史。
count_tokens / countTokens 不注入。`prompt_cache_key` 不改写。响应中回显的 `instructions`(JSON、SSE、WS)还原为客户端原值(未传则为 null)。

账号详情和账号批量操作提供 `inherit / off / custom`:继承默认规则、关闭、或用指定规则替换默认集合。默认集合留空、指定账号选择 custom,即可只对指定账号开启。账号仅存规则引用,不复制正文;shadow 使用自身绑定。
Claude OAuth 伪装系统块只由上游设置决定:设置 → 网关的 `enable_claude_oauth_system_prompt_injection`、`claude_oauth_system_prompt` 与 `claude_oauth_system_prompt_blocks` 块编辑器。

实际转发先转换协议和准备基础指令,再应用规则、生成缓存标识/签名并发送;每次重试从干净输入构建,WS 历史累计器不保存本站注入。每轮冻结内容快照,换账号时重新解析绑定;规则变化隔离缓存,保留续接标识及精确载体回显保护。编辑器直接根据后端协议能力约束可选角色、位置和范围。

迁移 `255_prompt_rule_policy_v2.sql` 固定旧 follow_active 当时的真实版本,并将旧各域开关折入相应规则,保留 OpenAI/Cindy 范围,避免自动扩散到新平台。Claude 旧自定义块保留布局、缓存属性、模型条件及单次占位符展开,统一投递;Settings 页的旧正文字段仅保留核对,修改请求返回迁移提示。单文档保留 64 KiB 上限;配置最多 64 条规则以容纳旧两个域的并集,每个实际请求命中的编译正文仍限制为 256 KiB,互斥平台的配置不相加计算请求预算。

迁移 `256_prompt_independent_content.sql` 提供独立内容及冻结文件存储,应用启动时在同一事务中核验并固定升级前实际生效的正文和完整公共文件集合。规则 ID、顺序、默认选择、范围和账号引用保持;混合 Skill 使用活动配对的有效正文,不能用模板存档代替。迁移不联网、不初始化种子,缺少有效正文或活动文件时不提交部分结果,并使应用初始化失败;完成后重启不重复迁移。

已有 `/skills/security-research/current/` 链接继续读取冻结文件,不再跟随来源更新。旧数据保留;需要其他文件包的旧 Skill 版本只能查看档案,不能恢复文件包。普通正文和 Claude 结构化版本可恢复;结构化文本编辑保留块顺序和缓存属性。迁入的公开 Skill 版本保留原回显语义,编辑后创建的普通新版本默认私有,全局回显兼容值不因此改变。

配置冲突保留编辑器草稿,重新读取后可合并未编辑的远端字段。账号仍用自身版本比较;被账号引用的规则不能直接删除。
迁移 `259_system_prompt_library.sql` 把旧 v2 规则里的纯文本正文导入提示词库(开关关闭、无默认,请求行为不变),启用的旧 Claude 规则只在与设置不同时写回设置,`prompt_skills` 的 off 转为新键,并删除 12 张旧提示词/Skill 表及其保护函数。旧模板、版本、历史、Skill 注册表与 `/skills/security-research/current/` 均已删除;回滚到旧镜像需先恢复这些表的备份。

## 292 采集代理输入

Expand All @@ -80,15 +72,13 @@ v2 使用独立 `role=auto/system/developer` 与 `position`。平台必须显式

`POST /api/v1/admin/settings/openai-codex-ticket/proxy-parse` 只解析候选,不存储输入、不连接网络。保存和测试携带原文、缺省协议及可选 `proxy_selection_id`,服务端重新解析并核对选择,最终仅保存一个规范代理地址。修改输入、缺省协议或管理员会话会失效旧选择和测试结果;格式错误、未选择或选择过期不会发起连接。测试和实际采集使用同一选定端点,保持证书信任及采集连接隔离。

## 批量账号连接测试

选择账号后即可开始,默认逐账号自动选择支持文本对话的模型;指定模型、推理强度和测试文本在设置中展开。批量请求的 `items` 接受 `selection_mode=auto/explicit`;省略模式且已有 `model_id` 的旧请求视为显式指定,否则默认自动选择。
## 账号连接测试与批量测试

后台逐项读取统一连接测试计划,目录失败或没有适用模型只影响该账号。发送前保存实际模型和必要执行信息,已解析的失败项重试沿用原模型;能力或映射变化时明确要求重新配置。沿用共享并发 5、每项 90 秒和 24 小时请求资料有效期,100 仅是目录及任务分块大小。
单账号、批量和定时测试共用同一测试路径,错误按上游 v0.2.8 原样显示:`API returned <状态码>: <原始响应>`、`Request failed: <错误>` 及流内 `error`/`response.failed` 的上游 message;服务日志 `Account test error:` 与界面文本相同。成功仍要求有效协议终态和可见文本,失败终态附上游原始内容,例如 `stream ended before terminal (last event: …)`、`completed without visible text (finish_reason=…)`、`finish_reason=…`。

连接成功要求可展示的非空文本和有效协议终态,不判断答案质量。空流、提前 EOF、纯推理或失败终态不能显示成功;正常拒绝文本及带有效文本的输出额度结束可以证明连接完成。列表显示模型、耗时、明确失败类别和恢复结果,不保存完整回答或原始上游错误。
批量测试移植上游 PR #6522:`POST /api/v1/admin/accounts/batch-test`(`account_ids`,`model_id` 可空)以 SSE 逐账号返回 `batch_start`/`account_started`/`account_result`/`batch_complete`,含首字延迟、上游实际模型和原始错误;关闭窗口或页面即停止。下游只增加:同时最多 10 个、同一上游主机(base_url 主机,无则平台+类型)最多 3 个、每账号 90 秒上限、15 秒 SSE 保活;`model_id` 为空时由服务端逐账号选模型——账号支持平台默认测试模型时用它,否则取模型列表或映射中第一个文本对话模型(排除图像、音频、嵌入、实时、语音和 `codex-auto-review`),单账号测试弹窗的默认模型用同一规则。结果只保存在页面和浏览器本地快照;重试即重新提交失败账号。

成功后恢复可恢复的错误、限流和临时不可调度状态,保留手动停用。恢复失败单独提示,连接成功状态不回退,也不会因重试而再次发出已成功的模型请求。关闭窗口表示收起;停止后只可重试已失败且资料仍有效的项,已取消和未执行项不会自动重放。
测试成功后走上游 `RecoverAccountState`:清除 error 状态及可恢复的限流和临时不可调度,不改手动停用和调度开关。

## 界面与验证边界

Expand Down
28 changes: 21 additions & 7 deletions .downstream/native-domains.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Native domains

Seven first-party domains run inside the host: Codex runtime, model policy,
prompt/skills, account tools, Cindy, image tools and observability. Native pages
retain the flat theme, MiSans, account fields and persisted task interactions.
Six first-party domains run inside the host: Codex runtime, model policy,
system prompts, account tools, image tools and observability. Native pages
retain the console theme (flat_theme_enabled), account fields and persisted task interactions.
The official third-party plugin framework and its own configuration UI remain.

## Settings and operations
Expand All @@ -13,8 +13,7 @@ authentication and the existing step-up policy.
| Interface | Contract |
| --- | --- |
| `GET/PUT /admin/settings/codex-runtime` | Original Codex configuration JSON, without an additional response envelope; `Cache-Control: no-store`. The source is encrypted at rest. |
| `GET/PUT /admin/settings/cindy-provider` | Balance, catalog and search switches; the catalog is available at the `/catalog` suffix. |
| `GET/PUT /admin/settings/image-tools` | Image Studio and Responses image bridge switches. |
| `GET/PUT /admin/settings/image-tools` | Image Studio switch (`studio_enabled`; a missing key is off). |
| `GET/PUT /admin/settings/observability` | Telemetry and native theme switches. |
| `POST /admin/accounts/:id/codex-tickets/stop-job` | Persisted single-account stop operation; the batch endpoint is `/admin/accounts/codex-tickets/batch-stop`. Both return HTTP 202 and retain per-account/model retry. |

Expand Down Expand Up @@ -55,8 +54,9 @@ disabled installation rows stay unchanged; no generic metadata endpoint is added
Before loading native settings or starting either runtime, one transaction:

1. Validates the saved first-party capability scopes and decrypts configuration.
2. Imports the effective image, observability and Cindy switches only when their
native settings keys are absent. Existing keys are never overwritten.
2. Imports the effective image and observability switches only when their native
settings keys are absent. Existing keys are never overwritten. The retired
Cindy provider installation is disabled without importing its switches.
3. Saves original installation/binding/bootstrap intent under
`deplugin_retired_plugins`, disables the seven installations and their bindings,
and marks their bootstrap records removed.
Expand Down Expand Up @@ -107,3 +107,17 @@ Normal required PR checks validate the native domain packages, account scope,
configuration/lease/ledger compatibility and frontend behavior. The release
reuses that source validation. Health endpoints establish availability only;
actual model-quality diagnostics remain separately budgeted and coordinated.

## Console theme

`observability.theme_enabled` (public `flat_theme_enabled`, default on) toggles
`html.flat-theme`; switching it off restores the upstream look. The console look
lives only in the central layer: `frontend/src/styles/flat-theme.css` (tokens and
Geist/Geist Mono Latin subsets; CJK uses system fonts), `frontend/tailwind.config.js`
(every palette, radius, shadow and gradient resolves through a CSS variable whose
fallback is the upstream value; hue families fold into danger/warning/info/success/
purple; `primary` is ink), `frontend/src/style.css` (upstream recipes plus a
`:where(.flat-theme)` console block) and the shared components and layout. Page
files keep upstream class strings; after upstream merges, re-run the ops-repo
de-sweep (`artifacts/tmp/admin-rework/ui/desweep/desweep.py`) instead of restyling
pages.
13 changes: 0 additions & 13 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,6 @@ backend/migrations/*.sql text eol=lf
# Go 源代码文件
*.go text eol=lf

# Embedded system prompt seed must retain the exact LF byte sequence used for
# its published SHA-256 and UTF-8 byte-length invariants.
backend/internal/promptskills/registry/prompts/*.txt text eol=lf
backend/internal/promptskills/source/prompts/*.md text eol=lf
backend/internal/service/testdata/codexrip_reverse_skill_system_prompt_legacy_dual_marker.txt text eol=lf

# The approved ModelGang seed is UTF-8 text, including extensionless and
# Unicode-named files. Keep every embedded byte sequence stable cross-platform.
backend/internal/promptskills/registry/seed/manifest.json text eol=lf -whitespace
backend/internal/promptskills/registry/seed/tree/** text eol=lf -whitespace
backend/internal/promptskills/registry/seed/pinned/** text eol=lf -whitespace

# 前端 源代码文件
*.ts text eol=lf
*.tsx text eol=lf
Expand All @@ -25,7 +13,6 @@ backend/internal/promptskills/registry/seed/pinned/** text eol=lf -whitespace

# Shell 脚本
*.sh text eol=lf
tools/sync_modelgang_remote_skill_seed.ps1 text eol=lf

# YAML/YML 配置文件
*.yaml text eol=lf
Expand Down
4 changes: 2 additions & 2 deletions .github/scripts/test_native_domains.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ cd "$repo_root"
# The same domain policies now compile into the host. Lifecycle concurrency is
# selected once by the workflow's dedicated race step; no package/signing process.
go -C backend test -p=1 -tags unit \
./internal/accounttools/... ./internal/cindyprovider/... \
./internal/codexruntime/... ./internal/promptskills/... \
./internal/accounttools/... \
./internal/codexruntime/... \
-skip '^TestNativeModuleLifecycleStartsOnceAndDrains$' -count=1

# Preserve configuration/ledger/storage boundaries without starting real IO.
Expand Down
Loading
Loading