From f7c6809bd716671599f52cc020f41cf63e17195c Mon Sep 17 00:00:00 2001 From: ethereal49 Date: Thu, 15 Oct 2026 01:27:33 -1000 Subject: [PATCH] fix(commands): address Santa Loop review feedback (cherry picked from commit 3a0e3313d579188aaac22a04195eb46b24726266) --- docs/ja-JP/commands/santa-loop.md | 4 ++-- docs/zh-CN/commands/santa-loop.md | 4 ++-- tests/commands/santa-loop.test.js | 15 ++++++++++----- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/ja-JP/commands/santa-loop.md b/docs/ja-JP/commands/santa-loop.md index f875e1dad..58a1a1e0c 100644 --- a/docs/ja-JP/commands/santa-loop.md +++ b/docs/ja-JP/commands/santa-loop.md @@ -169,8 +169,8 @@ Result: [PUSHED / ESCALATED TO USER] ## 注意事項 - レビュアー A(Claude Opus)は常に実行されます — ツール環境に関係なく、少なくとも1つの強力なレビュアーが保証されます。 -- レビュアー Bの目標はモデル多様性です。GPT-5.4またはGemini 2.5 Proは真の独立性を提供します — 異なる学習データ、異なるバイアス、異なる死角。Claudeのみのフォールバックでもコンテキスト分離による価値はありますが、モデル多様性は失われます。 -- 利用可能な最も強力なモデルが使用されます:レビュアー AにはOpus、レビュアー BにはGPT-5.4またはGemini 2.5 Pro。 +- レビュアー Bの目標はモデル多様性です。選択したバックエンドが報告する実際のモデルとプロバイダーを記録してください。Claudeのみのフォールバックはコンテキストを分離しますが、モデル多様性は失われます。 +- レビュアー AにはOpusを使用します。レビュアー BのCodexは設定されたモデル、またはCLIのデフォルトを使用します。 - 外部レビュアーはレビュー中のリポジトリ変更を防ぐため、`--sandbox read-only`(Codex)で実行されます。 - 各ラウンドで新しいレビュアーを使用することで、以前の発見に対するアンカリングバイアスを防ぎます。 - ルーブリックは最も重要な入力です。レビュアーがゴム印承認をしたり、主観的なスタイルの問題をフラグに立てる場合は、ルーブリックを厳格化してください。 diff --git a/docs/zh-CN/commands/santa-loop.md b/docs/zh-CN/commands/santa-loop.md index ce7262f2a..14e176587 100644 --- a/docs/zh-CN/commands/santa-loop.md +++ b/docs/zh-CN/commands/santa-loop.md @@ -173,8 +173,8 @@ Result: [PUSHED / ESCALATED TO USER] ## 备注 * 评审者 A(Claude Opus)始终运行——无论工具如何,保证至少有一个强大的评审者。 -* 模型多样性是评审者 B 的目标。GPT-5.4 或 Gemini 2.5 Pro 提供真正的独立性——不同的训练数据、不同的偏见、不同的盲点。仅 Claude 的回退通过上下文隔离仍然提供价值,但失去了模型多样性。 -* 使用最强可用模型:Opus 用于评审者 A,GPT-5.4 或 Gemini 2.5 Pro 用于评审者 B。 +* 模型多样性是评审者 B 的目标。记录所选 backend 报告的实际模型和 provider。仅 Claude 的回退仍提供上下文隔离,但失去了模型多样性。 +* 评审者 A 使用 Opus;评审者 B 的 Codex 使用已配置的模型或 CLI 默认值。 * 外部评审者使用 `--sandbox read-only`(Codex)运行,以防止审查期间仓库发生变异。 * 每轮使用全新的评审者可以防止先前发现导致的锚定偏差。 * 评分标准是最重要的输入。如果评审者盖章通过或标记主观风格问题,请收紧评分标准。 diff --git a/tests/commands/santa-loop.test.js b/tests/commands/santa-loop.test.js index 1a56db5da..a1ae5a2d2 100644 --- a/tests/commands/santa-loop.test.js +++ b/tests/commands/santa-loop.test.js @@ -40,8 +40,7 @@ function runCodexExample(commandPath, configuredModel) { try { const promptFile = path.join(tempRoot, 'prompt.md'); fs.writeFileSync(promptFile, 'Independent review only.'); - fs.writeFileSync(path.join(tempRoot, 'codex'), `#!${process.execPath} -const fs = require('fs'); + fs.writeFileSync(path.join(tempRoot, 'codex.js'), `const fs = require('fs'); const args = process.argv.slice(2); const modelFlag = args.findIndex(arg => arg === '-m' || arg === '--model'); const model = modelFlag < 0 ? process.env.ECC_TEST_CONFIGURED_MODEL : args[modelFlag + 1]; @@ -50,11 +49,13 @@ if (model !== process.env.ECC_TEST_CONFIGURED_MODEL) { process.exit(1); } console.log(JSON.stringify({ args, model, prompt: fs.readFileSync(0, 'utf8') })); -`, { mode: 0o755 }); - const result = spawnSync('bash', ['-c', invocation[0]], { +`); + fs.writeFileSync(path.join(tempRoot, 'codex'), '#!/bin/sh\nexec "$ECC_TEST_NODE" "$0.js" "$@"\n', { mode: 0o755 }); + // Ignore exported functions and startup scripts so CLI dispatch stays inside the fixture. + const result = spawnSync('bash', ['-p', '-c', invocation[0]], { cwd: tempRoot, env: { ...process.env, PATH: `${tempRoot}${path.delimiter}${process.env.PATH}`, - PROMPT_FILE: promptFile, ECC_TEST_CONFIGURED_MODEL: configuredModel }, + PROMPT_FILE: promptFile, ECC_TEST_CONFIGURED_MODEL: configuredModel, ECC_TEST_NODE: process.execPath }, encoding: 'utf8', timeout: 10000, }); assert.strictEqual(result.status, 0, result.stderr); @@ -67,6 +68,10 @@ console.log(JSON.stringify({ args, model, prompt: fs.readFileSync(0, 'utf8') })) console.log('\n=== Testing Santa Loop Codex model selection (stub CLI) ===\n'); for (const commandPath of commands) { + test(`${commandPath} has no obsolete fixed-model promise`, () => { + const source = fs.readFileSync(path.join(repoRoot, commandPath), 'utf8'); + assert.ok(!/gpt-5\.4/i.test(source), 'Codex model selection must agree throughout the command'); + }); for (const model of ['account-default', 'configured-review-model']) { test(`${commandPath} respects ${model} and preserves review inputs`, () => { const result = runCodexExample(commandPath, model);