用途:soak 管理仓库的供应链浸泡窗口(SOAK_DAYS)。规则是:一个发布必须至少存在 SOAK_DAYS 天,本仓库才会采用它,以留出时间让生态发现恶意或被撤回的发布。窗口只在 scripts/soak/constants.mts 中定义一次,其他位置不得硬编码。
主要能力:各配置面从该值派生或与之做一致性校验,包括 .cargo/config.toml 的 global-min-publish-age(天)、tools/pnpm-workspace.yaml 的 minimumReleaseAge(分钟)、.npmrc 的 min-release-age(天)、tools/taze.config.mts 的 maturityPeriod(导入 SOAK_DAYS)、external-tools.json 的 soakBypass 注解(天)、.github/renovate.json 的 minimumReleaseAge(需显式,extends 预设不算)。
使用方式:命令位于 package.json scripts,代码在 scripts/soak/。pnpm run soak 做一致性校验(CI 在 docs-links 中门禁);pnpm run soak:fix 重写漂移窗口并清理过期排除;pnpm run deps:update 通过窗口升级 npm(taze)与 cargo 依赖;pnpm run tools:check / tools:fix / tools:install 校验、清理过期豁免、安装 SRI 固定的外部工具;pnpm run test:scripts 运行脚本自身单元测试。门禁对无效状态(缺失、格式错误或算术错误的注解)失败关闭,对过期项仅警告。定时 soak-autofix 工作流每天运行 soak:fix + tools:fix 并以机器人 PR 提交清理。完成标准是 pnpm run soak 与 pnpm run test:scripts 均退出 0。
修改窗口:编辑 scripts/soak/constants.mts 中的 SOAK_DAYS,运行 pnpm run soak:fix,再运行上述两条命令;已有排除注解编码旧窗口会被标记,需重新标注日期或移除。完全退出:设 SOAK_DAYS = 0 并执行同样两步,cargo、pnpm/nub、npm、taze 均将 0 视为禁用;没有环境变量绕过,退出必须是可提交、可审查的变更。
单包跳过:在 tools/pnpm-workspace.yaml 的 minimumReleaseAgeExclude 中,于条目上一行添加注解(仅块列表,行内 [..] 会被拒绝):# published: YYYY-MM-DD | removable: YYYY-MM-DD,下一行 - 'name@1.2.3'。removable = published + SOAK_DAYS,published 必须是真实注册表发布日期。removable 过后 soak 会警告直到该固定被清理。裸名称 / @scope/* 通配属于长期信任,无需注解。外部工具通过 external-tools.json 的 soakBypass 对象使用相同形式。
限制:cargo 浸泡需要 nightly,min-publish-age 是 [unstable] 特性,稳定版 cargo 会静默忽略;仓库刻意不提供 rust-toolchain.toml,nightly 仅在 scripts/soak/update-deps.mts 中按调用请求 cargo +nightly update。nightly 过旧会静默禁用窗口,deps:update 会检测该警告并失败,提示 rustup update nightly。scripts/soak/ 是权威,本文件仅作说明,冲突时以脚本为准。