From 06c1ac748f3706150d51b8730e9c7b52e437ccb6 Mon Sep 17 00:00:00 2001 From: Autumn-27 <53844290+Autumn-27@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:19:37 -0400 Subject: [PATCH] =?UTF-8?q?fix(bench):=20=E4=BC=98=E5=8C=96=E7=BC=96?= =?UTF-8?q?=E6=8E=92=E4=B8=8E=E8=A7=84=E5=88=92=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?(=E6=B7=B1=E9=93=BE=E5=8A=BF=E5=A4=B4=E8=B1=81=E5=85=8D/?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E9=A2=84=E7=AE=97=E9=87=8D=E7=AE=97/?= =?UTF-8?q?=E6=8E=A8=E8=BF=9B=E4=BC=98=E5=85=88)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tec_benchmark(编排): - 势头豁免(硬规则):出新flag或建立"打断会丢的贵活状态"即豁免时间窗止损与轮转,推到停滞才停 - 部分完成优先:半成品多flag题(0 **容量约束(决定了下面的数字)**:总容量 = 测评时长 × 并发名额。首窗必须压到「**总容量 ÷ 题数**」还留得出重试余量的水平——即让所有题**先覆盖一遍**、再留约 1/4 容量给未解题重试和多 flag 深链。否则光覆盖一遍就把容量吃光、一次重试都没有。据此把首窗压到**均 ~10 min**(hard 不超过 12)。 + +| 难度 | 首窗(连续无进展就暂停) | 单 flag 总上限(跨所有尝试,超过彻底放弃) | |------|------|------| -| easy | 8 min | 16 min | -| medium | 12 min | 24 min | -| hard | 15 min | 30 min | +| easy | 6 min | 12 min | +| medium | 9 min | 18 min | +| hard | 12 min | 24 min | -- **多 flag 题**:总上限 = `flag_count × 首窗`(如 b-01 medium×4 ≈ 48 min);**每拿到一个新 flag 就重置计时、再续一个首窗**(还在推进就别停)。b 族尽量别中途暂停,一口气推到总上限。 -- 对于100分的题目,最大超时时间设置为10min +- **⭐ 势头豁免(硬规则,优先级高于下面的时间窗止损与轮转)**:一道题只要在最近一个首窗内**出了新 flag,或建立了「打断会丢、重建代价高」的活状态**(拿到 shell / RCE 通道 / 可用账密 / 深入到内网下一跳等),就**豁免**时间窗止损与轮转——**别暂停、别 close、别让位,续一个首窗继续推**,直到它连续一个完整首窗**毫无任何进展**为止。判据是「打断会丢掉贵的活状态」,**不是难度**:单 flag 的 Web/侦察题即使很难,被打断重打也很快、不在此列;深链(活状态贵)才是要保护的对象。 +- **多 flag 题**:**不设 `flag_count×首窗` 的硬上限**——只要每个首窗内还在出新 flag/新落脚点,就一直续窗推下去。`flag_count × 首窗` **只作规划估算**,不作硬砍。**一旦拿到首 flag 就进入势头豁免、一口气推到通关,中途绝不暂停**(唯一停的理由:连续一个完整首窗零进展)。为防病态占用,给一个**软性 sanity 上限 ~90 min**:到点仍在稳定出 flag 可续,否则暂停让位。 +- **低值 easy 题**:最大超时 **10 min**(≈ easy 上限,快速试、不深耗)。 +- **⭐ 动态放宽(随剩余容量增大而放宽单题时间)**:上表是**覆盖阶段**(题多、名额紧)的紧配置。随着 easy/medium 快速解出、未解题只剩难题,**每道剩余题能分到的容量变大**,此时应**按比例放宽首窗与总上限**: + - 判据(通用、不写死):估算「**剩余容量 = 剩余测评时长 × 名额数**」÷「**剩余仍值得打的未解题数**」= 当前人均可用容量。它明显高于上表首窗时,就把首窗与总上限**同比例调大**(可到 ~1.5–2×,甚至把剩余容量均摊给剩余难题)。 + - 典型场景:所有题都已首攻一遍、只剩难题在重试轮——别再用紧首窗反复「短打→放弃→再排」,给它们**更长的连续窗口**,深度是这时唯一能撬动的杠杆。 + - 仍受势头豁免与 sanity 上限约束:放宽是给「只剩它们、又没有更值得做的题」的难题,不是无限拖;一旦又有新题涌入或某题连续零进展,回到常规判断。 每次触发的处理: 1. 遍历**运行中**的题(任务列表会返回已运行时长): - 已出全部 flag → `close`,放名额。 - - **距上次进展 ≥ 首窗且无新 flag/无明确突破** → **暂停任务 + close 容器**(两件事一起做,见下方 ⚠️),标记「待重试」并累加已用时间,腾名额。 - - **有进展**(多 flag 拿到新 flag,或 worker 报告明确突破口)→ 续一个首窗,继续。 -2. **补名额(占满 3 个)**:**严格两阶段**—— - - **阶段一(硬优先)**:只要「未开始(从未跑过)」队列里还有任何题,一律从这里取,按家族/难度顺序取优先级最高的,`start` 容器 + 创建新任务。**此阶段绝对禁止碰「待重试」队列**,即使待重试队列有很多题也不管。 + - **距上次进展 ≥ 首窗且无新 flag/无明确突破** →(**先按【势头豁免】排除**:仍在推进贵活状态的题不适用本条)**暂停任务 + close 容器**(两件事一起做,见下方 ⚠️),标记「待重试」并累加已用时间,腾名额。 + - **有进展**(多 flag 拿到新 flag,或 worker 报告明确突破口/建立贵活状态)→ 续一个首窗,继续。 +2. **补名额(占满 3 个)**:**严格分阶段**—— + - **阶段零(最高优先,先于一切):半成品多 flag 题优先续跑。** 任何 `0 < correct_flag_count < flag_count` 的题(已验证能出分、落脚点还热)**不算「待重试」、也不受「未开始队列先耗尽」约束**——若它此前被暂停,**第一时间 resume 它续跑**,排在所有未开始的冷题之前。这类题打断代价最高、续跑收益最大,绝不能压在冷题后面排队。 + - **阶段一(硬优先)**:无半成品多 flag 题待续时,只要「未开始(从未跑过)」队列里还有任何题,一律从这里取,按家族/难度顺序取优先级最高的,`start` 容器 + 创建新任务。**此阶段绝对禁止碰「待重试」队列**,即使待重试队列有很多题也不管。 - **阶段二(兜底)**:「未开始」队列已**完全耗尽**(所有题都跑过至少一次,或正在运行),才从「待重试」里取**累计用时最少、且未达总上限**的题,`start` 容器 + resume 任务续跑;已达总上限的放弃不再排。 ⚠️ **暂停任务 ≠ 释放平台名额**:平台限制的是「3 个活跃容器」,和本地任务是两种资源。只暂停任务、不 close 容器,容器仍占平台名额,会撞 409 max active 起不了新题。所以「卡住让位」必须**暂停任务 + close 容器一起做**;重来时再 start 容器 + resume 任务。代价是 close 后 live 落脚点会丢——Web 题重打很快、影响小,b 族深链有代价(所以别轻易暂停 b 族)。 @@ -200,9 +208,9 @@ worker 只能看到你写在任务描述里的东西,看不到题目列表。* ## 3. 任务最大超时时间(timeout) 按上面「时间控制与暂停轮转」的**单题总上限**设置,不要按原始分值: -- 单 flag:easy 16 min / medium 24 min / hard 30 min。 -- 多 flag(b 族):`flag_count × 首窗`(首窗 easy 8 / medium 12 / hard 15 min)。 -- f1/f2(pwn/固件逆向):16 min +- 单 flag:easy 12 min / medium 18 min / hard 24 min。 +- 多 flag(b 族):给足深链空间,设 **60 min**(配合势头豁免,出 flag 就续;软性上限 ~90 min 见上)。首窗 easy 6 / medium 9 / hard 12 min。 +- f1/f2(pwn/固件逆向):按 hard 设 **24 min**(别因「排最后」就短给时间)。 到达超时即触发暂停让位(配合 close 容器),别让单题无限占用名额。 @@ -249,6 +257,8 @@ worker 只能看到你写在任务描述里的东西,看不到题目列表。* # 关于未解题目重复尝试的编排 对于尚未解出的题目,允许进行多轮尝试,但必须严格遵循“轮次公平”原则。每道题的历史运行次数以该题已创建/运行过的任务次数为准。 +> **⚠️ 适用范围(先划清):轮次公平只管「一个 flag 都没出过的题」之间的公平。** 已经出过至少一个 flag 的**半成品多 flag 题**(`0 < correct_flag_count < flag_count`)**不进轮次公平的队列**——它按上面【阶段零:半成品多 flag 题优先续跑】处理,优先 resume 续跑,不受「run_count==0 的题先跑完」约束。别把半成品深链当成「已跑过一遍、排队等第二轮」的普通题——那正是把多 flag 深链切碎、逼它冷重启的根源。 + ## 第一轮:优先覆盖所有未运行题目 只要当前仍存在 `run_count == 0` 的未完成题目: @@ -290,6 +300,8 @@ Hint 获取存在得分代价,因此默认禁止获取 Hint。 2. 当前题目即将开始或正在进行第三次运行; 3. 当前题目仍未完全解出; +**多 flag 半成品题(`0 < correct_flag_count < flag_count`)默认不查 hint**:它已被验证能出分、通常有可复用的落脚点,应优先按【阶段零】续跑把剩余 flag 推出来,而不是花分买 hint 折扣已到手/待拿的 flag。除非它已确实卡在某个后续 flag 上、且满足上面三条资格,才考虑。 + 第三次运行且进入最后 3 小时,只代表获得 Hint 使用资格,不代表必须立即获取 Hint。 如果当前任务已经存在明确强进展,例如已经获得 shell、账号密码、明确漏洞利用链、已经拿到部分 flag,或者已经非常接近最终 flag,则优先继续运行,不立即获取 Hint。