最終更新: 2026-08-12 現状: v1.8.170 / 依存の既知脆弱性 22 件を解消し CI を緑に復帰 / 471 tests・カバレッジ 93%
2026-08-12(v1.8.167)— 依存関係のセキュリティ更新。
2026-05-30 を最後に約 2ヶ月半コミットが無く、その間 CI も走っていなかった。コードは
変わっていないが上流 advisory データのほうが動いた結果、pip-audit が
22 件(出力 27 行)/ 8 パッケージを検出して CI が赤になっていた。
uv.lockの更新のみで 22 件すべてを閉鎖(依存宣言は無変更・すべて下限のみのため)。 pyjwt 2.13.0 / cryptography 50.0.0 / starlette 1.6.0 / mcp 1.29.0 / python-multipart 0.0.32 / msgpack 1.2.1 / pydantic-settings 2.15.0 / pip 26.2.1- 新規の
--ignore-vulnはゼロ(既存のPYSEC-2025-1831 件のみ据え置き) mcpは 1.x 系最新の 1.29.0 で停止。2.0.0 はmcp.server.fastmcpを削除しており 移行は別タスク(下記「明日以降の優先タスク」参照)。advisory 要求の 1.28.1 は 1.29.0 で充足- Python 3.12 / 3.14 の両方で pytest・mypy・ruff・pip-audit を確認
- 再発の根: 定期再検査の装置が無いこと。コード凍結中でも advisory は増える
2026-08-12(v1.8.170)— 依存の下限引き上げと mcp の 1.x 固定。
uv.lock はこのリポの CI と開発環境しか守らないため、利用者へ伝播させるべく宣言側を上げた。
⚠️ 公開メタデータ(requires-dist)が変わる:mcp>=1.28.1/python-multipart>=0.0.31/pydantic-settings>=2.14.2。これより古い版に固定している利用者は解決に失敗する(その構成は脆弱)[tool.uv] constraint-dependencies = ["mcp<2"]で mcp を 1.x 系に固定。requires-distには漏れないため利用者の解決に上限は伝播しない(実測確認済み)- 🔴
pyjwt/cryptography/starletteは親の下限では塞げないことが実測で判明 (下記「明日以降の優先タスク」の判断待ち行)
2026-08-12(v1.8.168)— 記録の整備。 上記セッションの実測を 日報 2026-08-12 に記録した。 とくに §2 は mcp 2.0 移行の設計ノート(依存の実体・2.0 での変更点・落ちた 4 本が 守っていた保証・移行方針 4 案と推し・再現手順)で、移行ボール着手時の一次資料になる。 あわせて mcp 2.0 移行規模の過大見積もりを訂正した(下記「明日以降の優先タスク」参照)。 リポジトリ整理(マージ済みブランチ 24 本・locked worktree 4 本の削除)も同日実施。
直前の対応: #747(実DB統合テスト・v1.8.164)。「sqlite/mysql/pgsql 対応」という未検証の約束を実測で検証し、
潜んでいたマルチDBバグを修正した:
- 発見・修正:
SqlAlchemyQueryExecutor.write()の INSERT 採番がresult.lastrowid依存で、psycopg2(PostgreSQL)は lastrowid 非対応のためrowcount(=1) にフォールバック。save()が常にid=1を返す重大バグだった → PostgreSQL ではlastval()フォールバックに修正 - 実DB統合テスト
tests/integration/(PostgreSQL/MySQL、各9ケース)を追加。環境変数 未設定ならskip(デフォルトuv run pytestは SQLite のまま高速:466 passed, 9 skipped) - CI に
integration-dbジョブ(postgres:16 / mysql:8 service container)追加 pymysqlを dev 依存に追加(mysql+pymysql://ドライバが未導入だった)- how-to
run-integration-tests.md(EN/JA)追加 - ついでに #541 のリリース how-to の「未公開・メンテナ待ち」誤記(EN/JA)を訂正
直前の対応: #541(PyPI 公開フロー解消・v1.8.163 を PyPI 公開)、#540(FT ループ目的・ 終着点明文化・v1.8.162)、#539(response_model 統一・ v1.8.161)、#553(#578 で実装済みを確認し close)、ハウスキーピング(サンドボックス 5.1G→79M 整理・orphan ブランチ 8 本削除)。フレームワーク本体 466 tests 据え置き。 オープン Issue ゼロ。
- #767
chore/nanoid-ghsa-2v37— npm lockfile の nanoid 3.3.12 → 3.3.18(GHSA-2v37-7h3g-55p8)。 内容は正しいが、上記の pip-audit 既存赤に阻まれて 2026-08-12 までマージできずにいた。 本件(v1.8.167)で赤が解消するため、rebase して CI 緑を確認のうえマージする。
なし(#539 / #540 / #541 / #553 はすべて 2026-05-29 に解消・close)。 提案 PR #545(nene-style governance)のみ未マージで残置。
| バージョン | 主な内容 |
|---|---|
| v1.8.165 | docs/test: 差別化(MCP×HTTP)可視化(#751)— 同一ストアでの HTTP↔MCP パリティテスト + explanation「one UseCase, two surfaces」(EN/JA)。共有する物(UseCase+永続化)/しない物(薄いHTTP層)を明記 |
| v1.8.164 | feat: 実DB統合テスト(#747)— PostgreSQL/MySQL を CI service container で検証。psycopg2 lastrowid 非対応による INSERT 採番バグ(save() が常に id=1)を発見・修正。pymysql 追加 |
| v1.8.163 | feat: PyPI 公開フロー検証(#541)— ビルド検証・CI package-build ジョブ・CHANGELOG 連携・リリース how-to |
| v1.8.162 | docs: FT ループの目的・終着点を明文化(#540)— field-trial-methodology.md(EN/JA) |
| v1.8.161 | fix: handler の response_model 統一(#539)— Note/Tag/Comment に Response モデル定義・OpenAPI スキーマ出力 |
| v1.8.160 | FT282: platform — システム情報を露出しない(セキュリティ診断合格・情報漏洩防止) |
| v1.8.159 | FT281: math — isclose / gcd / factorial(巨大整数 DoS ガード) |
| v1.8.158 | FT280: re — ReDoS 対策(クラッカーペンテスト合格) |
| v1.8.157 | FT279: plistlib — plist 解析(セキュリティ診断合格・XXE 耐性) |
| v1.8.156 | FT278: string — capwords / 定数(ASCII 文字種判定) |
| v1.8.155 | FT277: keyword — iskeyword / issoftkeyword(安全な識別子検証) |
| v1.8.154 | FT276: subprocess — 安全なコマンド実行(診断+ペンテスト合格) |
| v1.8.153 | FT275: cmath — 複素数演算 / 極座標(isfinite ガード・real/imag 分離) |
| v1.8.152 | FT274: colorsys — RGB / HSV 変換(0-1 正規化・範囲検証) |
| v1.8.151 | FT273: marshal — 信頼できないデータに使わない(セキュリティ診断合格・json 代替) |
| v1.8.150 | FT272: tarfile — tar slip / tar bomb / symlink 対策(クラッカーペンテスト合格) |
| v1.8.149 | FT271: stat — モードビット解釈(world-writable/setuid 検出) |
| v1.8.148 | FT270: ssl — create_default_context(セキュリティ診断合格・TLS 検証既定) |
| v1.8.147 | FT269: contextvars — ContextVar(コンテキストローカル状態・Token reset) |
| v1.8.146 | FT268: lzma — compress / decompress(クラッカーペンテスト合格・解凍爆弾対策) |
| v1.8.145 | FT267: glob — パターンマッチ(セキュリティ診断合格・パストラバーサル防御) |
| v1.8.144 | FT266: types — MappingProxyType(読み取り専用ビュー・ライブビュー) |
| v1.8.143 | FT265: zoneinfo — ZoneInfo(IANA タイムゾーン変換・DST 自動) |
| v1.8.142 | FT264: ast.literal_eval — eval の安全な代替(診断+ペンテスト合格) |
| v1.8.141 | FT263: tomllib — TOML 読み込み(読み取り専用・安全な設定パース) |
| v1.8.140 | FT262: graphlib — TopologicalSorter(トポロジカルソート・循環検出) |
| v1.8.139 | FT261: mimetypes — guess_type / アップロード検証(セキュリティ診断合格・Content-Type 非信頼) |
| v1.8.138 | FT260: zipfile — zip slip / zip bomb 対策(クラッカーペンテスト合格) |
| v1.8.137 | FT259: weakref — WeakValueDictionary(弱参照キャッシュの自動退避) |
| v1.8.136 | FT258: random — 非暗号性の実証(セキュリティ診断合格・secrets 推奨) |
| v1.8.135 | FT257: array — typecode / tobytes(typecode 許可リスト・オーバーフロー処理) |
| v1.8.134 | FT256: email.message — ヘッダーインジェクション対策(クラッカーペンテスト合格) |
| v1.8.133 | FT255: sqlite3 — パラメータ化クエリ(セキュリティ診断合格・SQL インジェクション防御) |
| v1.8.132 | FT254: queue — Queue / LifoQueue / PriorityQueue(安定化タプル) |
| v1.8.131 | FT253: copy — copy / deepcopy(浅い/深いコピーの共有参照) |
| v1.8.130 | FT252: json — loads/dumps の堅牢化(診断+ペンテスト合格) |
| v1.8.129 | FT251: fractions — Fraction / limit_denominator(厳密有理数・用途別分母制限) |
| v1.8.128 | FT250: decimal — Decimal / quantize / 丸めモード(金額計算・文字列受け) |
| v1.8.127 | FT249: hmac — new / compare_digest(セキュリティ診断合格・署名検証) |
| v1.8.126 | FT248: string.Formatter — format string 攻撃の防御(クラッカーペンテスト合格) |
| v1.8.125 | FT247: operator — itemgetter / 演算子関数(許可リストディスパッチ) |
| v1.8.124 | FT246: unicodedata — NFKC / category(セキュリティ診断・条件付き合格・homoglyph 限界明示) |
| v1.8.123 | FT245: reprlib — Repr(多軸上限・ログ肥大化防止) |
| v1.8.122 | FT244: html.parser — HTMLParser(クラッカーペンテスト合格・script 除外) |
| v1.8.121 | FT243: uuid — uuid4 / uuid1 / uuid5(セキュリティ診断合格・予測可能性) |
| v1.8.120 | FT242: heapq — heappush / heappop / nlargest / merge(min-heap・merge ソート前提) |
| v1.8.119 | FT241: bisect — bisect_left / insort / 範囲検索(ソート前提検証・left/right) |
| v1.8.118 | FT240: 安全なデシリアライズ — pickle 不使用 / json + Pydantic 検証(診断+ペンテスト合格) |
| v1.8.117 | FT239: statistics — mean / median / stdev / quantiles(StatisticsError 処理・点数上限) |
| v1.8.116 | FT238: calendar — monthrange / weekday / isleap(0=月曜・うるう年規則) |
| v1.8.115 | FT237: http.cookies — SimpleCookie / Morsel(セキュリティ診断合格・セキュア既定) |
| v1.8.114 | FT236: string.Template — substitute / safe_substitute(クラッカーペンテスト合格・SSTI 安全) |
| v1.8.113 | FT235: pprint — pformat / pp(width/depth 制限・JsonValue 型安全) |
| v1.8.112 | FT234: ipaddress — ip_address / ip_network / is_global(セキュリティ診断合格・IP ベース SSRF) |
| v1.8.111 | FT233: textwrap — wrap / fill / shorten / indent(width 制限・長語分割) |
| v1.8.110 | FT232: fnmatch — fnmatch / filter / translate(クラッカーペンテスト合格) |
| v1.8.109 | FT231: shlex — split / quote / join(セキュリティ診断合格・シェルインジェクション中和) |
| v1.8.108 | FT230: difflib — unified_diff / SequenceMatcher / get_close_matches(O(n^2) 入力制限) |
| v1.8.107 | FT229: html — escape / unescape(quote=True 属性コンテキスト安全) |
| v1.8.106 | FT228: urllib.parse — urlparse / urlencode / quote(診断+ペンテスト合格・SSRF 対策) |
| v1.8.105 | FT227: shutil — copy / move / rmtree(resolve + is_relative_to 封じ込め) |
| v1.8.104 | FT226: gzip — compress / decompress / GzipFile(mtime=0・解凍上限) |
| v1.8.103 | FT225: zlib — compress / decompress / crc32(セキュリティ診断合格・解凍爆弾対策) |
| v1.8.102 | FT224: binascii — hexlify / unhexlify / crc32(クラッカーペンテスト合格) |
| v1.8.101 | FT223: base64 — b64encode / urlsafe_b64encode / b64decode(厳格デコード) |
| v1.8.100 | FT222: hashlib — sha256 / pbkdf2_hmac / blake2 / compare_digest(セキュリティ診断合格) |
| v1.8.99 | FT221: tempfile — NamedTemporaryFile / mkstemp / TemporaryDirectory(affix 検証・0o600) |
| v1.8.98 | FT220: logging — Logger / Handler / Formatter / Filter(クラッカーペンテスト合格) |
| v1.8.97 | docs: README / roadmap / reference を v1.8.96 現状に同期、starlette CVE 解消反映 |
| v1.8.96 | FT219: argparse — ArgumentParser / add_argument / parse_args / subcommands(セキュリティ診断合格) |
| v1.8.95 | FT218: configparser — read / write / sections / interpolation |
| v1.8.94 | FT217: csv — reader / writer / DictReader / DictWriter / Sniffer |
| v1.8.93 | FT216: codecs — encode / decode / lookup / IncrementalEncoder(セキュリティ診断・クラッカーペンテスト合格) |
| v1.8.92 | FT215: struct — pack / unpack / calcsize / Struct(フォーマット文字列ホワイトリスト検証・unpack 型変換) |
| v1.8.91 | FT214: io — StringIO / BytesIO / TextIOWrapper / BufferedReader |
| v1.8.90 | FT213: abc — ABC / abstractmethod / register / subclasshook(セキュリティ診断) |
| v1.8.89 | FT212: dataclasses — field / asdict / astuple / replace / post_init |
| v1.8.88 | FT211: typing — TypedDict / Protocol / get_type_hints / Literal |
| v1.8.87 | FT210: contextlib — contextmanager / suppress / ExitStack / nullcontext |
| v1.8.86 | FT209: functools — partial / lru_cache / reduce / wraps |
| v1.8.85 | FT208: itertools — chain / islice / groupby / product / combinations(クラッカーペンテスト) |
| v1.8.84 | FT207: collections — namedtuple / defaultdict / Counter / deque(セキュリティ診断) |
| v1.8.83 | FT206: pathlib — Pure パス解析・パストラバーサル防御 |
| v1.8.82 | FT205: enum — StrEnum・IntEnum・IntFlag・Flag |
| v1.8.81 | FT204: datetime — ISO 8601 パース・タイムゾーン変換(診断+ペンテスト) |
| v1.8.80 | FT203: secrets — セキュア乱数・トークン生成・OTP |
| v1.8.79 | #560/#561: query ヘルパー関数群・RequestScopedContext[T] |
| v1.8.78 | #559: LocalTokenIssuer / LocalTokenIssuerVerifier |
| v1.8.77 | #558: RateLimitStorageProtocol / InMemoryRateLimitStorage |
| v1.8.76 | #557: CompositeAuthMiddleware |
| v1.8.75 | #555/#556: check_not_modified / check_precondition |
| v1.8.74–66 | FT194–202 + deps: starlette 1.0.1(#611, PYSEC-2026-161) |
実施済み: FT1〜FT282(全 282 件)
索引: docs/field-trials/INDEX.md
次のアクション:
- FT283 を開始(283 % 3 = 1 → セキュリティ診断なし、283 % 4 = 3 → クラッカーペンテストなし)
- テーマ候補:
gettextモジュール(メッセージカタログ・i18n)
| 優先度 | Issue | タスク | 種別 |
|---|---|---|---|
| — | — | FT は保守 + オンデマンド(4 トリガー時のみ。方法論) | FT |
| — | — | リリース時は v* タグ push → publish.yml が自動公開(手順) |
infra |
| 低 | — | PyJWT 推移的 CVE(PYSEC-2025-183)— mcp 修正待ち | 保留 |
| 🧊 塩漬け | — | mcp 2.0 系への移行(2026-08-12 調査済み・v1.8.170 で 1.x 固定)— 2.0.0 で mcp.server.fastmcp が mcp.server.mcpserver に改名。実測の移行規模は概算 11 行(src/nene2/mcp/server.py の 1 行が唯一の依存点・src/example/mcp.py は LocalMcpServer 越しで変更不要)。実質的な破壊点は call_tool() の戻り値が CallToolResult になったことのみ。[tool.uv] constraint-dependencies = ["mcp<2"] で固定済みなので急がない(advisory は 1.29.0 で全て閉じている)。解除条件=(a) 上流の 1.x サポート終了 (b) 2.0 固有機能が必要になったとき。調査と移行方針は 日報 2026-08-12 §2 が設計ノートで、解除時にそのまま着手できる状態で凍結してある。🔴 訂正: 当初「 src/nene2/mcp/ と src/example/mcp.py の全面書き換えが必要」と記載していたが過大評価だった。根拠が「テストが 4 本落ちた」だけで依存の実体を測っていなかった(grep で server.py の 1 行のみと判明)。着手判断には訂正後の数字を使うこと |
保守 |
| 判断待ち | — | 🔴 推移的依存に床を作るか(2026-08-12 実測)— pyjwt / cryptography / starlette は最新の親でさえ下限が足りず、親の版を上げる手段では安全版に到達できない(fastapi 0.136.1 の宣言は starlette>=0.46.0・必要版 1.3.1/mcp 1.29.0 の宣言は pyjwt[crypto]>=2.10.1・必要版 2.13.0)。塞ぐには使っていない依存を床のためだけに直接宣言するしかない。ライブラリとしての是非を含めて要判断。日報 2026-08-12 §5-3 |
判断 |
| — | infra | ||
| — | — | ✅ 2026-08-12 解消(v1.8.169) — ci.yml に週次 schedule(月曜 09:30 JST)+ workflow_dispatch + concurrency(github.event_name 込み)を追加。日報 2026-08-12 §4 |
infra |
| 中 | — | 🔴 週次 schedule 自体の生存監視(2026-08-12 判明)— public リポの scheduled workflow は活動が 60 日無いと GitHub が自動無効化する。本リポの空白は 74 日で 14 日超過しており、装置が自身の検知対象によって止められうる。外部からの workflow_dispatch 発火など、リポジトリ単体では解決できない |
infra |
| 中 | — | 🔴 失敗通知の経路設計(2026-08-12 実測)— 通知の配信は機能しているが、未読 1,828 件(うち ci_activity 634 件・最古 2026-05-11) で飽和している。週次の失敗を 1 件足しても 1,829 件目になるだけで検知装置として機能しない |
infra |
| 課題 | 優先度 | Issue | 備考 |
|---|---|---|---|
| — | #539 | ✅ 2026-05-29 解消(v1.8.161)。Note/Tag/Comment 全ハンドラーに XxxResponse/XxxListResponse を定義し response_model 明示。OpenAPI に 6 レスポンススキーマが出力されることを確認。466 tests 据え置き |
|
| — | #540 | ✅ 2026-05-29 解消(v1.8.162)。explanation/field-trial-methodology.md(EN/JA)に目的・3 フェーズ・終着点(網羅スイープ完了→保守+オンデマンド)を明文化。INDEX/roadmap からリンク | |
| — | #541 | ✅ 2026-05-29 解消(v1.8.163)。公開フローは既に稼働中で v1.8.163 を PyPI へ公開(pip install で取得可能)。CI package-build ジョブ・CHANGELOG 連携・how-to 整備 | |
| — | #747 | ✅ 2026-05-29 解消(v1.8.164)。実DB統合テスト(PostgreSQL/MySQL・CI service container)を追加。psycopg2 lastrowid 非対応で save() が常に id=1 を返す重大バグを発見・修正(lastval フォールバック)。pymysql 追加・how-to(EN/JA) |
|
| — | — | ✅ 2026-05-29 整理(5.1G→79M)。ft-status.sh --clean-sandbox を追加(.venv/キャッシュ削除・ソース保持・uv sync で再生可)。--clean は dist/ のみで誤記だった |
|
| — | — | ✅ 2026-05-29 削除(merged 8 本)。未マージの提案 PR #545 のブランチのみ残置 | |
| ログ秘匿 Filter は形式依存の best-effort | 低 | — | FT220 D3。主防御は SecretStr。how-to に「秘匿は多層防御の保険」を明記予定 |
| http.server Content-Length 上限なし | 低 | — | FT198 診断。デモスコープでは許容 |
| http.client DNS リバインディング未防御 | 中 | — | FT196。本番化時の追加実装 |
| parse_qs vs parse_qsl how-to | 低 | — | FT197。クエリ文字列 how-to に追記予定 |
| PostgreSQL / MySQL 実 DB 統合テスト | 中〜高 | — | CI Docker service ジョブ |
| PyJWT 推移的 CVE(PYSEC-2025-183) | 低 | — | mcp 側の修正を待ち(CI ignore 済み) |
| — | — | ✅ 解消済み(#611, starlette 1.0.1) | |
| — | — | ✅ 2026-05-23 docs 同期 PR で更新 |