01
開発状況
- 韓国の公文書を読めます。.hwpと.hwpxは以前からアップロード許可リストにありましたが、どの抽出器のリストにもなく、受け付けるだけで本文を読めない状態でした。純粋JSパーサーのkordocでHWP 3.x/5.x・HWPX・HWPMLを抽出し、.hmlのアップロードを開き、Agent Taskのサンドボックスイメージにkordocをビルド時に組み込んで公文書の生成やテンプレート記入までできるようにしました(1.36.0)。デプロイ直後に二層の不具合が現れました。コンポーザーの原本送信リストにhwp系が抜けていたため363KBの文書が壊れたテキストとして上がりコンテキストを超え、その失敗が「外部LLMプロバイダーの一時的な障害」と案内されて再試行しても同じ結果でした。送信リストをバックエンドの抽出リストと対にし、コンテキスト超過はCONTEXT_TOO_LARGEとして分離して7ロケールで添付を減らすよう案内し、再試行は勧めないようにしました。
- トークン推定の盲点を実測で確認し、狭めました。文字ベースの推定は韓国語の散文やコードには保守的ですが、JSONログは61%、base64は36%、hexは30%まで過小推定し、context-fitの安全網をそのまま通していました。重み調整では覆えないことを確認した上で、推定値が有効コンテキストの半分を超える要求だけvLLMの/tokenizeで正確に再計算し、補正係数を切り詰めにも同じく適用します。通常の会話はしきい値に届かないため追加呼び出しはありません。ターン予算の判定でHWP拡張子が抜けていた潜在不具合も同じ点検で取り除きました。
- ローカルの既定モデルがqwen3.6-35b-a3bからqwen3.8-27bへ変わりました(1.38.0)。DGXがモデルを入れ替えた後もアプリは古い名前に縛られ、UI・カタログ・capabilityが実体とずれていました。静的カタログの1行が一覧の唯一の出処だったためです。今は起動時と周期プローブがLiteLLMの/model/infoを読んでローカルモデルを発見し、静的リストはゲートウェイに届かないときのフォールバックとしてだけ残ります。新モデル点検の後続として、サンプリングを指定しないローカル呼び出しにthinking ON/OFF別の公式推奨値を入れ、ディープリサーチの下位呼び出し・討論参加者・構造化回答などメタ呼び出し10か所にthink:falseを明示し、推論レベル未指定時のフォールバックを最大推論からmediumへ下げました。ツールループではassistantのreasoning_contentを次ターンへ保持し、ツール呼び出し5ターンの間、毎ラウンド直前の推論を失って考え直していた無駄をなくしました。vLLMが発行したtool_call idを合成値で上書きせず、要求あたりのプロンプト画像総量をvLLMの上限8枚に合わせて9枚目で400が返る経路を塞ぎました。
- 外部モデルを実際に使えるようにしました。Open AI Service Hub(hasa)とB.AIをBYOKプロバイダーとして追加し、B.AIは45モデルを残高0のキーで全て呼び出して無料の5種だけカタログに載せました(1.38.0・1.39.0)。討論とディープリサーチで明示的に選んだ外部モデルが実行不能なとき静かにローカルへフォールバックしていたのをエラーとして表面化し、外部モデルを無視するという誤ったフロントの案内を訂正しました。ところが専門家5人の並列呼び出しはB.AI無料キーで5/5、hasa開発キーで3/5が429で終わりました。外部実行クライアントをProxyで包み、プロバイダー別セマフォとRetry-Afterを尊重する429指数バックオフを置き、ディープリサーチのfan-out同時実行数とタイムアウトをプロバイダーのヒントに合わせ、SDKの盲目的な再試行を0にしてタイムアウトに倍率を適用しました(1.40.0)。入力欄の推論の強さ3段階はこれまでローカルとChatGPT OAuthでしか有効でなかったところ、OpenAI互換の外部プロバイダーにもreasoning_effortとして送られ、推論トークンが実測264から61へ減りました。ヒューリスティックで推定したcapabilityキャッシュがconfigの実測値を隠してvision・thinkingを拒否していた問題と、mediumを400で拒否するglm-5.3の強さマップも訂正しました。
- 9月2日のapps/apiセキュリティレビューの結果を2日で閉じました(1.39.0・1.40.0)。high 3件は、認証済みなら誰でもシステムスキルを上書きできた保存型プロンプトインジェクション、自分のスキルを共有産業エージェントへ割り当てられた経路、他人のuserIdでpush購読を登録して通知の写しを受け取れた問題でした。push所有者をreq.userに固定する際、Web pushが実は一度も配信されていなかった不具合も併せて閉じました。続いて、バンドルidさえ分かれば他人のprivateバンドルを導入できたIDOR、露出時点にしか掛かっていなかった高リスクMCPツールのロールゲートを実行経路にも強制、CSV数式インジェクション、他人のMCPサーバー状態照会のオラクル、所有権検査の空値通過、初回セットアップの管理者競合を処理しました。多層防御として{{env.KEY}}の位置引数の秘密をargvに埋め込まずsh変数参照で渡し、同一ホストの別アカウントがpsで読めないようにし、REST画像の上限、pushエンドポイントのホスト許可リスト、ユーザーサンドボックスのrealpathに基づくシンボリックリンク脱出の遮断を加えました。
- サンドボックスとMCPの運用姿勢を固めました。外部アーキテクチャレビューが指摘したsecure-by-defaultは、コードの既定値を変えずに起動時の姿勢点検と初回セットアップでの自動有効化で達成しました。dockerのないデプロイで外部MCPが原因表示なく全滅しないためです。readonly rootfsへの切り替え本番でuvxベースのサーバー2種だけが全滅した原因をツールvenvの経路に見つけてキャッシュボリュームへ移し、アプリ再起動3回を生き延びた孤児コンテナにはrole・pid・serverIdのラベルを付けて、起動時に所有プロセスが死んだものだけを回収します(1.37.0)。再開用に生きているべきタスクサンドボックスはラベルのスコープで触れません。v2移行を終えたMCP v1 SDKは、デプロイ済みdistに参照がないことを確認して削除しました。
- 評価がゲートになりました。ゴールデンセットを50件から150件へ広げ、運用60日の分布を匿名化して反映するとルーティング精度は93.3%から77.5%へ下がり、これがルーター改善のバックログでした。失敗27件を語彙不足17件とトピックブースト誤発動10件に診断し、24エージェントにキーワード70個を補強し、「짜줘」がプログラミングへ流れていたパターンを狭めて100%へ引き上げ、しきい値を0.5から0.9までratchetしました(1.37.1)。nightlyの実モデル評価を運用Macに載せると、正常な拒否文が禁止語に掛かり、韓国語の拒否が英語の標識を外すラベル不具合が現れて修正し、偽のクリンゴン語で応じるモデルの失敗は品質シグナルとして残しました(1.37.2)。ルーティング・TTFTの日次集計はログ経路の移転後に毎日空のレポートだけ積んでいたのをOMK_LOG_DIRで復旧し、CIゲート16段階が全て成功しながら25分で取り消されていたjob上限を35分へ上げ、リリースノートから抜けた項目を手で補正してその教訓をCLAUDE.mdに残しました。ツールループの推論保持とローカルプロバイダーのresponseFormat転送は1.40.1に含まれました。その後、ローカルモデルプローブのdemoteが再起動まで固定される問題と外部モデルキャッシュでcapabilitiesInferredが失われる問題も直しました(#729)。
- OpenMake Benchがchatの隣に立ちました。別リポジトリopenmake_benchで9月4日の一日にコミット4つで作られています。同じプロンプトを複数のモデルと3経路(直接・ゲートウェイ・OpenMake)にtemperature 0、seed固定、3回反復で逐次実行し、ルール・judge採点とTTFT・tpsを一つのレポートにまとめる計測ツールの上に、Bradley-Terryのブラインドリーダーボード、自分の機器で動くモデルのFit Score推薦、選んだモデルをOpenMakeのロール設定に適用する意思決定エンジンを載せました。午前にOpenMake CompareからBenchへ改名し、午後にbench.openmake.ccへ運用配備しました。ログインはOpenMakeへのリダイレクトSSOで、ログイン時にユーザーのJWTでbenchという名前のAPIキーを発行してAES-GCMで保管し、カタログとランをそのユーザーのアカウント(BYOK含む)で呼び出します。そのためopenmake_llm側には、SSO_CLIENTSに登録したクライアントへ一回限りの交換コードを渡すauthorizeエンドポイント、期限切れ時にプロバイダーをライブ照会する/api/v1/modelsキャッシュ、エージェントルーター・ペルソナ・ツール・要約・ローカルフォールバックなしで要求モデルだけを呼ぶX-OpenMake-Rawモードが入りました(#732)。BenchのOpenMake経路はこのrawモードが既定なのでusageが正確で、パイプラインのオーバーヘッドはオプションで別に測ります。実行は容量ドメインごとに同時1つで、ローカルエンジンは全て直列、外部プロバイダーはプロバイダー別に並列です。夕方にはchatと同じ色・書体・ファビコンのデザインを当て、chatのサイドバーのアカウントメニューとログイン画面にbenchリンクを付けたので、ログイン済みユーザーはSSO経路でログイン状態のまま移動できます。
- 同じ日、B.AI glm-5.3-flashがツールループ2ターン目で400を返す原因を追って、運用上の不具合を2層見つけました。原因はreasoning_effort: mediumで(B.AI再現: mediumだけ5回中2回400、high・未指定は0回)、アプリはこのモデルのmediumをhighへ上げる設定でしたが、LLM_REASONING_EFFORTS_JSONがコードの既定値を丸ごと置き換えるため、pm2が保持していた古い値がその項目を消していました。envは既定値の上に項目単位でmergeするようにしました。そして.envの編集が再起動に反映されていませんでした。PM2は最初のstart時のenvスナップショットを注入し、--update-envはシェルenvしか見ず、deployシェルは.envをsourceしていなかったためです。deployが.envを行単位で解析してexportしてから再起動するようにし(#731)、その修正の初回配備でexportがスクリプトのreadonly定数COMPOSE_FILEと衝突し、set -eが再起動直前にdeployを静かに終えていた問題まで直しました(#733)。#729からこの午後のコミットまでは、このスナップショットではまだ未リリースです。
- ディープリサーチの整合性の不具合6件を一度に閉じました(1.41.0)。depthの表が二か所に別々にあって食い違っていたのを一つにまとめ、needsMoreの判定がハードコード値ではなくconfigを見るようにし、RESTのキャンセルが実際の実行につながっていなかった配線をつなぎ、CAPACITYの表記を訂正し、configure_researchがユーザー分離を守るようにし、schemaの誤ったdefaultを取り除きました。同じ流れで、分解プロンプトに現在の日付を注入し、検索演算子の使用を禁止しました。モデルが今日の日付を知らないまま「最新」を問うと検索語が過去に固まり、演算子を混ぜると検索エンジンが結果を0件で返すためです。有効なサブトピックの採用は寛容にして、分解の失敗で全体が止まる場合を減らしました(#739・#740)。翌日未明には#740の残余デッドコードを取り除き、デプロイがビルド前にタグをfetchするようにして、build-infoのgitTagが実際のタグと食い違っていたのを合わせました(#742)。
- 韓国語で尋ねたのに英語で答えるドリフトを二方向で捉えました。一つはツール結果が英語で返った後にモデルがその言語に引きずられる場合で、ツール結果の後に回答言語のリマインダーを付け、回答言語ガードを観測可能にしました(#743)。もう一つは検知そのものの問題でした。質問にコード識別子が混ざるとラテン文字の比率が上がり、韓国語の質問が英語と誤判定されていました。言語検知の前処理でコード識別子を先に取り除くよう直しました(#745)。
- MCPカタログにTavily(112)とContext7(114)をシードしました。どちらのサーバーもstdioでバージョンを固定して登録し、{{env.KEY}}の形の位置引数の秘密はargvに埋め込まずsh変数参照で渡す既存の方式をそのまま使います(#737・#741)。
- 外部プロバイダー側のエラー分類を二度手当てしました。B.AIのdeepseek 2種を無料で開き、残高不足の応答をINSUFFICIENT_CREDITとして分類し(#735)、プロバイダー方針による403をMODEL_ACCESS_RESTRICTEDに分け、フォールバックバッジで理由キーが空だったのを埋めました(#736)。金曜にはNVIDIA NIMのfallbackModelsを現在サービング中のモデルへ入れ替えました。既存の4つのうち3つがEOLで410を返すか一覧から消えた状態でした(1.43.1)。
- web・iOS・Benchの3か所にInstrumentデザインシステムを敷きました。コバルトをプライマリ、シアンを補助に置き、書体を統一したトークンセットです(1.42.0・#753)。同じ日にモバイル対応も併せて入りました。入力欄のフォントを16pxへ上げてiOSでフォーカス時に画面が拡大されるのを防ぎ、タッチポインターでアイコンボタンのヒット領域を36pxへ広げました(#748)。Bench側では、カードが内容の最小幅のために画面外へはみ出していたグリッドをminmax(0,1fr)へ変え、タブターゲット40pxとsafe-areaを適用しました。
- タブを移したりアプリがバックグラウンドへ回るとソケットが切れ、進行中の応答を失っていた問題を直しました。ストリームをdetachし、再接続時にresumeする方式なので、切れている間に生成された分も戻ります(1.44.0・#754)。Agent Task側では、ローカル実行時にユーザーが明示した承認ポリシーが'all'で上書きされていた不具合を直しました(#751)。承認の境界を狭く設定していたのが静かに広がる類の不具合です。
- プロンプトを削る作業で、デプロイの初回実測が二度続けて設計を巻き戻しました。一次では、参照されないMCPサーバーをプロンプトに露出せず、低頻度のツールを意図ベースでゲーティングし、スキル注入に上限を置きました(#755)。デプロイして測り直すと、大きなmanifestスキル一つが上限を食い尽くしてsystemスキルを押しのけていました。スキル1つあたりの注入上限を8000文字に定め(#757)、それでも合計上限で押し出される場合が残ったため、systemスキルを先に注入するよう順序を変えました(#758)。デプロイ前の推定とデプロイ後の実測が食い違った事例です。
- サイトに簡体中国語ロケールを載せました。アプリUIはすでに4言語でしたが、サイトは韓国語・英語・日本語だけで、中国側から開くページがありませんでした。ページコピー9種とリリースノート16件、ヘッダー・フッター・メタデータを翻訳し、ルーティング・hreflang・サイトマップをつなぎました。開発日誌は韓国語・英語・日本語でのみ書くため、/zh/blogは目次だけ中国語で、本文は英語の原文をそのまま見せます。同じ日にリポジトリにも中国語READMEを載せ、公開リポジトリのテストフィクスチャに残っていた個人アドレスと未使用ドメインをopenmake.ccの3アドレスへ統一しました。
- 最終日の朝はメモリから始まりました。外部レビューが指摘したP0の4件を、ソースと運用DBに突き合わせて確定し、閉じました(1.45.0)。設定でメモリ学習をオフにしても3経路のうち2つがトグルを見ておらず、注入と自動保存が続いていた問題は、サーバー側の設定を唯一の権威とすることで塞ぎました。クライアントのフラグはさらに絞ることだけができ、オンにはできません。ユーザーが消した文が次の発話でよみがえる問題は、重複判定が無効化された行まで見るtombstoneで防ぎ、explicitとcandidateが逆転していた出所ラベルを定義どおりに戻し、作成・削除を監査ログに残しました。運用テーブルは0行だったため、いずれも潜在状態のまま取り除いた不具合です。続いて、そもそもメモリがなぜ生成されないのかを実測で絞り込みました。90日のユーザーメッセージ615件にヒューリスティックのパターン一致が0でしたが、これはパターンの不備ではなくそうした発話自体が無かったためで、LLM抽出の候補11件のうち8件はユーザーの質問に対する回答でした。分析対象のテキストを、自分に向けられた質問として受け取っていたのです。プロンプトに境界タグと形式の要求を入れ、決定的な行フィルターをかけて、同じ18セッションの再生で漏れを12行から0にしました。観測用のレポートを日次集計に足し、自動検出やバックフィルで入った行には設定画面で出所バッジを付け、ユーザーが見て消せばそのままtombstoneになるようにしました。別途の承認キューを持たない軽量な解法です。
- 近接重複の判定は、デプロイの後に二度作り直しました。1.45.0のプロンプトでバックフィルを再生すると回答の漏れは0でしたが、語尾だけが違う同じ好みが二度候補に挙がりました。正規化した完全一致と部分包含しか見ていなかった規則に、助詞・語尾を落としたトークン集合のJaccard類似度を加えました(しきい値0.75)。文字バイグラムは、一文字だけ異なる対立ペアを0.87と判定して差し戻すため採りませんでした(#765)。デプロイしてライブで測り直すと、語尾を一度だけ落とす方式では同じ動詞の二つの活用形が同一の語幹にまとまらず、「すべて」のような修飾語が和集合を膨らませているだけでした。語尾の除去を最大3回繰り返し、程度・頻度の副詞をストップワードとして外して再キャリブレーションしました(#767・1.45.2)。二度とも、デプロイ後の実測が次の修正を指示した形です。
- NVIDIA NIMがリクエスト全体を400で拒否していた原因は、MCPツール名の::という名前空間でした。組み込みツール名はすべてOpenAIの規約を満たすため原因はそこだけでしたが、その400がアップストリームエラーとして分類されてローカルへフォールバックし、ユーザーが選んだモデルが黙って変わったうえ、バッジもそう誤って案内していました。Codex専用だったツール名コーデックをプロバイダー中立のモジュールへ移し、openai-compatの境界でのみエンコードして応答では元の名前に戻すようにし、ツール定義を拒否する400はNOT_SUPPORTEDに分類して黙ったフォールバックを塞ぎました。内部の::規約は、ロールゲートや並列判定が前提としているためそのままです(#769)。続いてセキュリティレビューの残り3件を閉じました(1.45.3)。グローバルregistryの接続経路が{{env.KEY}}のプレースホルダーをラップせずリテラルのままargvへ降りていたこと、RESTの履歴のimagesがスキーマに無く静かに削除され、RESTだけマルチターンのvisionが切れていたこと、そして対象の無いシンボリックリンクをrealpathの検査が「パスが無い」と区別できずに通していた隙間を、リンク自体を見てfail-closedにすることで塞ぎました。
- エージェント作業のコーディング能力を、30日の運用実測の上で手当てしました(1.46.0)。作業70件・ツール呼び出し1,647件をまず数えて着手の根拠を作りました。完了した作業の平均は43.5万トークンでしたが、ステップ本文の総量はその18分の1で、ボトルネックは結果の切り詰めではなく毎ターンの全文再送でした。bash 444件のうち34%がgrep・find・ls・catの探索で、ファイルを編集した作業55件のうちテストを走らせたのは2件でした。直近4ターンより古い長いツール結果は先頭240文字のスタブへ畳み(原文はステップの記録に残るため証拠画面はそのまま)、探索専用のgrep_code・repo_mapを入れ、完了の関門でリポジトリに既にあるランナーを検出して一度走らせ、失敗出力を修正ターンへ注入するテストゲートを置きました。ランナーが無ければ何もしないので、レポート型の作業には影響がありません。一方で編集の失敗率とツールの繰り返し呼び出しは、実測が根拠に届かず着手を見送りました。
- ところが新しい探索ツールは、ローカルブリッジではexecとして出ていくため、読み取り専用にもかかわらず毎回の呼び出しで承認ダイアログが出ました。探索のたびに承認が要るなら実用になりません。診断ツールと同じ趣旨でcode_nav専用のkindを作り、外部の実行ファイルもシェルも使わずデバイス上で直接動かすようにし、承認ゲートが無い分は上限で縛りました(ファイル4000・マッチ400・15秒)。未実装のものや古いバージョンのデバイスはすべてnullを返し、従来のシェル経路へフォールバックします(1.47.0)。承認ダイアログが再び出る回帰は、実際のWebSocketを使うヘルパーのハーネスが捕まえます。デプロイ直後のライブでrepo_mapが.gitをファイルとして並べたのは、worktreeが効いているフォルダーの.gitがディレクトリではなくポインターファイルだったためで、ディレクトリにだけ掛けていた除外規則を、シェルのフォールバックが既に使っていた名前基準へ統一しました(#776)。
02
週次記録の再構成方法
この期間に一致するローカルClaude Codeプロジェクトセッションは見つかりませんでした。そのためGit履歴が証明できる内容だけを記載します。
確認できるClaude Codeのメインセッション、明示的に連結された子セッション、リポジトリのGit履歴を全件確認しました。セッションは意図と調査を説明し、実際に反映されたコードはGitを最終根拠としました。
根拠資料
根拠
OPENMAKE · MIT OPEN SOURCE
OpenMake