Repository navigation
chore: upstream/dev の 49 commit を取り込み、harness の発火検証を追加する - #328
Conversation
Co-authored-by: rekram1-node <[email protected]> Co-authored-by: Andreas Holt <[email protected]>
…eplay fixes (anomalyco#45520) Co-authored-by: Aiden Cline <[email protected]>
…nomalyco#46820) Co-authored-by: Aiden Cline <[email protected]>
upstream 取り込み (49 commit / 137 files) の動作検証で、既存の harness テストが
**発火経路を 1 度も通っていない**ことが分かった。
model-whitelist.test.ts と team-permission.test.ts が見ているのは宣言の一致
(3 コピーの whitelist が揃っているか、権限表が矛盾していないか)であって、
gate() が実際に止めるかではない。宣言が揃っていても gate が素通りすれば
ガードは無いのと同じである。
## 追加した検査
F1 発火 preview / whitelist の各経路で gate() が理由文字列を返す
F2 統制 正当なモデルは通る(全部拒否する壊れた gate ではない)
providerID 無しは早期 return する
F3 変異 preview() / free() の結論に gate が追随していることを直接照合
client は Proxy stub にした。gate() が触ったら例外で落ちるので、
「触らない」前提を型ではなく挙動で担保している。
## 反証
guardrail-context.ts から denyPreview の判定を外すと rc=1 になり、
preview に関する 3 アサーションだけが落ちる。統制として
model-whitelist.test.ts は 25 pass のまま無傷(変異は局所的)。
復元で 6 pass に戻る。
## 実測
local:check-offline rc=0 / 36 pass 0 fail / typecheck 30/30
lint 5131 warnings 1 error(merge 直後と同一。本テストは警告を増やさない)
Agent-Lane: claude-code
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01Et1J3J3Zi3V6zEzAod8QPD
|
Thanks for your contribution! This PR doesn't have a linked issue. All PRs must reference an existing issue. Please:
See CONTRIBUTING.md for details. |
|
This PR doesn't fully meet our contributing guidelines and PR template. What needs to be fixed:
Please edit this PR description to address the above within 2 hours, or it will be automatically closed. If you believe this was flagged incorrectly, please let a maintainer know. |
80dcff8「chore(ci): forkのCI/CD実行を最適化」が duplicate-issues.yml には repository guard を入れたが、pr-management.yml は漏れていた。 この job は非 team member の PR に対して opencode をインストールし、 LLM に重複 PR を判定させる upstream 専用の triage 自動化である。 fork の作者は .github/TEAM_MEMBERS に居ないので毎 PR で全経路が走る。 2026-09-04 に PR #328 で実測してタイムアウトした(TimeoutError / 2m36s 消費)。 merge の正しさとは無関係な失敗であり、fork では走らせる意味がない。 同じ理由なので同じ guard を入れる。workflow 本体は残す。 add-contributor-label は外部呼び出しが無く 3 秒で終わるのでそのまま。 なお pull_request_target: [opened] は push で再実行されないため、 PR #328 の当該 check は赤のまま残る。次の PR から効く。 Agent-Lane: claude-code Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01Et1J3J3Zi3V6zEzAod8QPD
訂正(2026-09-05)— 本 PR の「発火・動作検証」は過大だった本 PR 本文と
是正(#329、merged
|
upstream
anomalyco/opencodeの 49 commit を取り込み、fork の harness と統合して発火検証まで行った。衝突ゼロ
packages/guardrails(fork 独自 95 ファイル)は upstream に存在しないので衝突しない。今回 upstream からの変更も 0 件だった。
接触面は 2 つだけで、どちらも安全だった。
packages/opencode/src/util/background(harness が直接 import)@opencode-ai/pluginmerge 前後の実測(ベースラインを先に取った)
前回の取り込み(
2026-09-01-opencode-upstream-merge-checkpoint.md)が「merge 前の lint ベースラインを取っていない」を未検証の限界として記録していたので、
今回は着手前に取得した。
5f6ce5e8dc1606a42e6b5bun installlinttypecheckerror は 1 のまま増えていない。 残る 1 件は
packages/session-ui/src/v2/components/prompt-input/index.tsxの Tailwindarbitrary value
content-['\200B']を oxlint が JS の非推奨 8 進エスケープと誤読するもので、merge 由来ではない(前回の取り込みで同定済み)。
warnings は +12(upstream の新規 5 ファイル由来)。本 PR の追加テストは 警告を増やしていない。
動作検証で穴が 1 つ見つかった — 既存 harness は発火を検査していなかった
merge 後に harness テストは 30 pass だった。しかしその 30 本は 1 度も
gate の発火経路を通っていない。
model-whitelist.test.ts— 3 コピーの whitelist が揃っているか(宣言の一致)team-permission.test.ts— 権限表が矛盾していないか(宣言の一致)宣言が揃っていても
gate()が素通りすればガードは無いのと同じである。gate-fires.test.tsを追加したgate()が理由文字列を返すundefined(全部拒否する壊れた gate ではない)/providerID無しは早期 returnpreview()/free()の結論にgateが追随していることを直接照合clientは Proxy stub。gate()が触ったら例外で落ちるので、「触らない」前提を型ではなく挙動で担保している。
反証(この検査が結論を作っていることの実測)
統制を先に確認している。 変異版で全部落ちたなら「変異が効いた」ではなく
「変異版が動いていない」なので、そこを区別した。
正式チェック
範囲外(明示)
必要なら別 issue にする(前回の契約 欄9 と同じ方針)
packages/web/console/tuiの upstream 変更は取り込むだけで、fork 固有の検証は行っていない(fork が使うのは主に
opencode/core/guardrails)CI —
check-duplicatesの失敗と、その是正初回 CI で
check-duplicatesが TimeoutError(2m36s 消費)で落ちた。merge の正しさとは無関係である。pr-management.ymlの当該 job は、非 team member の PR に対して opencode をインストールし LLM に重複 PR を判定させる upstream 専用の triage 自動化で、
外部サービス呼び出しがタイムアウトした。fork の作者は
.github/TEAM_MEMBERSに居ないので毎 PR で全経路が走る。
80dcff8a87「chore(ci): forkのCI/CD実行を最適化」がduplicate-issues.ymlにはrepository guard を入れていたが、
pr-management.ymlは漏れていた。同じ理由なので同じ guard(
if: github.repository == 'anomalyco/opencode')を入れた。workflow 本体は残す。
add-contributor-labelは外部呼び出しが無く 3 秒で終わるのでそのまま。pull_request_target: [opened]は push で再実行されないため、本 PR の当該 check は赤のまま残る。次の PR から効く。 緑に見せるために再実行はしていない。
範囲外(追加)
.github/TEAM_MEMBERSに fork の作者を足す案は採らなかった。upstream 由来のファイルであり、次の取り込みで衝突する。repository guard のほうが fork の作法に合う
H5-guard: yes
H5-NEGATIVE:
packages/guardrails/profile/plugins/guardrail-context.tsからdenyPreviewの判定行を削った変異版でbun test profile/plugins/gate-fires.test.tsが rc=1、preview に関する 3 アサーションだけが落ちる。統制としてmodel-whitelist.test.tsは 25 pass のまま無傷(変異が局所的であることの確認 = 「変異が効いた」と「変異版が動いていない」の区別)。復元で 6 pass 0 fail。変異はassert s.count(old) == 1で対象の実在を先に検査してから適用している。H5-LEDGER: 本 PR の CI 変更は upstream 専用 job の no-op 化であり、発火を減らす側なので新たな台帳配線は無い。guardrail 本体の発火は
guardrail.tsのchat.paramsからctx.mark({last_block: "chat.params", ...})を経て.opencode/guardrails/events.jsonlとstate.jsonに記録される既存経路のままで、本 PR は変更していない。gate-fires.test.tsはこの経路に触れずgate()の戻り値だけを検査する(テストが実台帳を汚さない)。H5-RETIRE:
check-duplicatesの guard は、fork が.github/TEAM_MEMBERS相当の自前名簿を持つか、upstream が本 job を team 限定に変えた時点で不要になるので、その時点で撤去を再審する。gate-fires.test.tsは、gate()の拒否理由が 2 四半期にわたり 1 度も実運用で発火せず、かつ whitelist/preview 判定が別機構へ移った場合に退役 issue を起票する。H5-SUBTRACTION: N/A
H5-PAIR:
packages/guardrails/profile/opencode.jsonのplugin宣言(./plugins/guardrail.ts)↔guardrail-context.tsのgate()実装; mutation=denyPreviewの判定行を削ると同じ入力がundefinedを返すようになり、gate-fires.test.tsの preview 3 アサーションが red(統制 25 pass は無傷、復元で green)。H5-E2E: bun run local:check-offline
H5-E2E-OUT:
36 pass, 0 fail (63 expect calls, 3 files)/ok whitelist covers the catalog snapshot in all three copies/ rc=0。加えて CI でe2e (linux)unit (linux-smoke)typechecknix-evalstorybook buildが pass。Evidence:
bun install --frozen-lockfile/bun run lint/bun turbo typecheck/bun run local:check-offline/ 変異による反証 | baseline 5119warn+1err → merge 5131warn+1err → 本PR 5131warn+1err、typecheck 30/30 実走、harness 30→36 pass 0 fail、変異で rc=1(統制 25 pass 無傷)・復元で 6 pass、upstream/dev...HEAD behind=0 ahead=239| 2026-09-04 JST