Skip to content

[finding] 共享 re-exec 守卫名互相压制:一个继承来的 OS_HALF_STATES_PROXY_REARMED=1 让兄弟工具静默不走代理并回 401 —— 评论 5715705458 记的那次「凭据死了」1 小时事故,可被一个变量机械复现 #18939

Description

@os-steve

Filed by the domain:spec execution seat 4(座位贴 #18917,session_01AmH9bKvGoLjiY86Q4Z3og2)—— 出自 #18314 / PR #18935 那一轮 dev 的 out_of_scope_findings。dev 不立卡,由席位立。⛔ 填 bare:finding only。

本卡的读数是本席自己 A/B 复现的,⛔ 不是转述;与递过来那份不一致的两处我也照实写在下面。

Dedupe words: proxyRearmPlan cross-suppression · OS_HALF_STATES_PROXY_REARMED inherited · PROXY_REARM_GUARD shared name · credential died false story · re-exec guard sibling leak

缺什么

proxyRearmPlan 只读一个守卫变量名,而各 pm 工具各自声明了自己的名字 —— 于是任何一个兄弟工具为它自己的子进程设的那个名字,一旦被继承,就会静默关掉别人的 re-exec。关掉之后的表现不是「没走代理」,而是 401 Bad credentials —— 也就是「凭据死了」。

⏱️ 2026-09-18T06:44Z 本席同盒、同凭据、同一分钟 A/B(--dry-run,⛔ 无任何写入):

控制:  node scripts/pm/label-write.mjs --repo … --issue 18932 --add finding --dry-run
       ℹ️  re-exec with --use-env-proxy: HTTPS_PROXY is set (http://127.0.0.1:41733) …
       ① 取现集 — …#18932 (open) carries 1 label(s) …
       exit 0        ← banner 命中 1 次

探针:  OS_HALF_STATES_PROXY_REARMED=1 node scripts/pm/label-write.mjs  (其余逐字相同)
       ① read — COULD NOT READ: GET /repos/…/issues/18932 -> HTTP 401 (Bad credentials)
       PREREQUISITE NOT MET … ⛔ NOT MEASURED
       exit 3        ← banner 命中 0 次

一个继承来的环境变量,把一条活着的通道变成了一条看起来死掉的通道。

为什么这值一张卡 —— 它是一次有记录的事故的机械成因

#18314 的评论 5715705458 记了一次真实代价:某席位的每一个探针(/rate_limit)统一回 401,而「统一的 401」读起来是一个自洽的故事 —— 凭据死了 —— 那个席位据此花了约 1 小时把一条活通道当成死通道,并把「中断」当作既成事实报给了维护者。

本卡主张的是:那个故事可以由一个变量机械地造出来,而且造出来的时候连 banner 都不打印 ⇒ 现场没有任何线索指向真实原因。⛔ 这不是「用错了工具」,是仪器之间互相污染。

机制(读数)

  • scripts/pm/check-half-states.mjs:19559:export const PROXY_REARM_GUARD = 'OS_HALF_STATES_PROXY_REARMED';
  • 同文件 :19597:if (env[PROXY_REARM_GUARD] === '1') return { rearm: false, … reason: 'already re-armed once this run' };
  • ⇒ 计划只认这一个名字。而 post-stamped.mjs / board-snapshot.mjs / label-write.mjs 各自声明了 OS_POST_STAMPED_PROXY_REARMED / OS_BOARD_SNAPSHOT_PROXY_REARMED / OS_LABEL_WRITE_PROXY_REARMED —— 本席读到这三个名字没有被任何地方读取,它们是装饰性的。
  • PR fix(scripts): route check:single-claim-paths through the session proxy so a seat can run it #18935 已经在它自己那个文件里避开了这个坑:它用一个纯函数 proxyPlanEnv() 把自己的守卫名映射到计划真正读的那个名字上,而不是把 process.env 原样递进去。⇒ 正确形态已有现成范本,承接者不必发明。

⛔ 两处本席与递过来那份不一致 —— 照实写出

  1. 报告说四个 donor「各自声明一个没人读的本地守卫名」。本席只在 post-stamped.mjsboard-snapshot.mjslabel-write.mjs 三个里读到;check-clause2-carriers.mjs 里本席读到 0 个。⇒ 承接者请以自己的读数为准。
  2. 报告说四者都把 env: process.env 原样递给计划。本席的 grep 对这一条返回 0 命中,而本席没有点亮控制 ⇒ 按纪律这个零作废,本席把这一半记为 NOT MEASURED,⛔ 不主张它真或假。上面的 A/B 只证明了后果存在,没有证明每个文件的传参写法。

⛔ 没量的部分

  • ⛔ 没量这个变量在真实会话里实际会不会被继承到兄弟进程(A/B 是手工注入的)。⚠️ 这是承接者第一件要答的事:如果实际继承路径不存在,本卡就从「活违反」降为「潜伏陷阱」,定级应随之变。
  • ⛔ 没量除 pm 之外还有多少 proxyRearmPlan 的消费者受同一影响(本席读到共 13 个 importer,其中 scripts/check-issue-citations.mjsscripts/pm/ 之外)。

近邻,⛔ 不折叠

为什么不是本条
#18314(本卡出处,已 ACCEPT / PR #18935) 修的是一个文件缺 re-exec;本条是共享守卫名互相压制
#18376(open) 同样落在 check-clause2-carriers.mjs,但讲的是处方里硬编码的评论 id,⛔ 与代理无关

domain:spec 执行席 4 · 座位贴 #18917 · A/B 读数为本席 2026-09-18T06:44Z 自取,--dry-run 无写入


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions