Skip to content

docs: record decision to keep gateguard fact-forcing gate disabled (#282)#285

Merged
kryota-dev merged 2 commits into
mainfrom
docs/282-gateguard-fact-force-moot
Jul 9, 2026
Merged

docs: record decision to keep gateguard fact-forcing gate disabled (#282)#285
kryota-dev merged 2 commits into
mainfrom
docs/282-gateguard-fact-force-moot

Conversation

@kryota-dev

Copy link
Copy Markdown
Owner

Summary

Records the decision that the pre:edit-write:gateguard-fact-force gate stays disabled and that the long-session frictions catalogued in #282 are not escalated upstream — the "documented decision / moot" branch of that issue's acceptance criteria. No behavior changes; docs only.

Closes #282 (refs #280, #281)

Background

#282 catalogued four frictions with the fact-forcing gate from a long-lived (~2 day) session and asked for either an upstream issue/PR or a documented decision that the gate stays disabled locally. Investigation against upstream affaan-m/ECC (current main, 2026-07-08) found:

Friction Upstream status
30-min inactivity TTL degrades "once per session" to "once per burst" Unfixed (SESSION_TIMEOUT_MS = 30 * 60 * 1000 on main)
Gate fires on targets where the demanded facts are meaningless FixedGATEGUARD_EXEMPT_GLOBS (affaan-m/ECC#2432, merged 2026-07-04, after the v2.0.0 pin)
Stacking with read-before-edit validation (up to 3 round trips/file) Unfixed
Deny message hides the mechanism (deny == arm; any retry passes) Unfixed (message text unchanged on main; affaan-m/ECC#2227 only condenses repeats)

The gate is disabled by default via env.ECC_DISABLED_HOOKS (#280) and re-enabling requires a claude --settings overlay rather than env (#281). Nothing currently re-enables it, so the remaining frictions have no local impact; filing an upstream issue would create a tracking obligation with no local benefit. Decision: keep the gate disabled, close #282 as moot, and re-evaluate against the post-2.0.0 upstream knobs (GATEGUARD_EXEMPT_GLOBS, GATEGUARD_FACT_FORCE_FULL_DENIALS) if a future ECC pin bump re-opens the question.

Changes

  • docs/explanation/design-rationale.md / .ja.md — new section "The fact-forcing gate stays disabled": the decision, the four observed frictions, the upstream fixes that postdate the v2.0.0 pin, and the re-evaluation trigger.
  • docs/agents/claude-code.md / .ja.md — the PreToolUse hook-table row for pre:edit-write:gateguard-fact-force now cross-links the decision.

Verification

  • make test — 155 tests pass (docs-only change; tests/docs_facts.bats unaffected — no FACT markers added, upstream-churn values are described as "as of the v2.0.0 pin" narrative per docs conventions).

Process note

pr-workflow classified this as small tier (docs-only). The small-tier subagent delegation was skipped because the change is a content-authored decision record whose substance came from the upstream verification above; an intent gate (AskUserQuestion) selected the "document as moot" path over filing an upstream issue.

…cing gate disabled (#282)

- Add a design-rationale section documenting that the
  pre:edit-write:gateguard-fact-force gate stays disabled by default
  (env.ECC_DISABLED_HOOKS, #280) and that the long-session frictions
  catalogued in #282 are not escalated upstream (closed as moot)
- Note the upstream fixes that landed after the v2.0.0 pin
  (condensed denials in affaan-m/ECC#2227, GATEGUARD_EXEMPT_GLOBS in
  affaan-m/ECC#2432) and the knobs to re-evaluate on a future pin bump
- Cross-link the decision from the PreToolUse hook table in
  docs/agents/claude-code.md
- Mirror all changes in the Japanese docs
@kryota-dev kryota-dev self-assigned this Jul 8, 2026
@kryota-dev kryota-dev marked this pull request as ready for review July 8, 2026 07:43

@kryota-dev kryota-dev left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Multi-Review 統合レビュー結果(PR #285

3 ツール(cc-code-review / cc-security-review / codex CLI)の並列レビューを統合。docs-only 変更(4 ファイル、+30/−2)。

総合評価

カテゴリ cc-code-review cc-security-review codex
MUST 0 0 0
SHOULD 0 1 0
NITS 3 1 0
GOOD 4 3 3

セキュリティ

  • 総合リスクレベル: Low
  • 検出された脆弱性数: 0 件(Critical/High/Medium/Low すべて 0、Info のみ)
  • 公開 repo への機密情報・固有名の混入なし。無効化を文書化した gate(pre:edit-write:gateguard-fact-force)は LLM 品質ガードレールであり、セキュリティ上重要な destructive Bash gate(pre:bash:dispatcher)とは別物で有効のまま — 誤読を招く書き方になっていないことを両ツールが確認。

[MUST] 修正必須

なし。

[NITS] 軽微な提案(インラインコメント 3 件)

  • docs/explanation/design-rationale.md:57 — upstream 現状の主張に調査時点(as of 2026-07)を添えると decision record として自己完結する
  • docs/explanation/design-rationale.md:55 — deny==arm というバイパス挙動の記述は upstream gate の挙動公開にあたる(実害はほぼなし: OSS でソース公開済み・品質ガードレールでありアクセス制御ではない。認識の記録として指摘)
  • docs/explanation/design-rationale.md:61 — 直前の ECC セクションと「See claude-code.md」ポインタが連続する(実害なし、任意)

対応不要と判定した指摘(棄却ログ)

  • [SHOULD] upstream issue 番号・env 変数名の実在が未確認(cc-security-review、確信度 low): 親セッションで一次ソース検証済みのため既充足。affaan-m/ECC#2227(merged 2026-06-11、condensed denials)・#2432(merged 2026-07-04、GATEGUARD_EXEMPT_GLOBS)は gh pr view で、GATEGUARD_FACT_FORCE_FULL_DENIALS / GATEGUARD_EXEMPT_GLOBS は upstream maingateguard-fact-force.js 実体 grep で確認。cc-code-review も独立に同結論。指摘の但し書き(「確認済みなら対応不要」)の条件を満たす。
  • codex の「(未確認)」注記#2227/#2432 の内容、moot クローズの事実): sandbox の外部接続不可によるもので、上記のとおり親側で裏取り済み。

[GOOD] 良い実装(統合)

  • upstream への技術的主張(PR 番号、env ノブ名、修正内容、v2.0.0 ピンとの時系列)がすべて一次ソースと一致(cc-code-review が gh api / gh search code で独立検証)
  • ローカル配線の記述(ECC_DISABLED_HOOKS デフォルト無効、再有効化は claude --settings オーバーレイ、#280/#281)が settings.json 実体と一致
  • 英日ミラーが同一位置・同一構成で挿入され、双方向の相対リンクと GitHub アンカー slug が正しい(bats tests/docs_facts.bats 全 8 テスト pass)
  • design-rationale の既存フォーマット(Decision/Why/参照リンク)に準拠し、ECC 採用セクションの直後という配置も文脈上自然

既存レビュー指摘との重複チェック

既存レビュー・コメントは 0 件のため重複なし(全指摘が新規)。

スコープ外の follow-up 候補

  • docs/explanation/design-rationale.ja.md:43 — EN 側の「The tradeoff is a Node version floor, guarded by the mise pin …」に対応する文が ja ミラーに欠落(本 PR 以前からの既存ドリフト。別途修正候補)

Comment thread docs/explanation/design-rationale.md Outdated
Comment thread docs/explanation/design-rationale.md
Comment thread docs/explanation/design-rationale.md
- Add "(status as of 2026-07)" to the upstream-fixes paragraph of the
  fact-forcing-gate decision record so its freshness is traceable on a
  future ECC pin bump (review follow-up on #285)
- Restore the missing Node-version-floor tradeoff sentence in the ja
  mirror of the ECC-external section (pre-existing drift)
@kryota-dev

Copy link
Copy Markdown
Owner Author

統合レビューへの対応が完了しました( 70479d2

  • [NITS] design-rationale.md:57(調査時点の日付)→ 対応済み: "(status as of 2026-07)" を en/ja 両方に追記
  • [NITS] :55(deny==arm 挙動の公開)→ 対応不要: 意識的トレードオフとして維持(根拠はスレッド返信参照)
  • [NITS] :61(ポインタ連続)→ 対応不要: 指す側面が異なるため維持(根拠はスレッド返信参照)
  • スコープ外 follow-up 候補(design-rationale.ja.md:43 の既存ミラー欠落)→ 同一ファイルのため本 PR で修正済み( 70479d2

@kryota-dev kryota-dev merged commit 1cce6aa into main Jul 9, 2026
6 checks passed
@kryota-dev kryota-dev deleted the docs/282-gateguard-fact-force-moot branch July 9, 2026 02:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reduce GateGuard fact-forcing friction in long-lived multi-file sessions (upstream improvements)

1 participant