Skip to content

TODO — current ​

最終更新: 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-183 1 件のみ据え置き)
  • 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 ゼロ。


オープン PR ​

  • #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 緑を確認のうえマージする。

オープン Issue ​

なし(#539 / #540 / #541 / #553 はすべて 2026-05-29 に解消・close)。 提案 PR #545(nene-style governance)のみ未マージで残置。


直近の完了マイルストーン ​

バージョン主な内容
v1.8.165docs/test: 差別化(MCP×HTTP)可視化(#751)— 同一ストアでの HTTP↔MCP パリティテスト + explanation「one UseCase, two surfaces」(EN/JA)。共有する物(UseCase+永続化)/しない物(薄いHTTP層)を明記
v1.8.164feat: 実DB統合テスト(#747)— PostgreSQL/MySQL を CI service container で検証。psycopg2 lastrowid 非対応による INSERT 採番バグ(save() が常に id=1)を発見・修正。pymysql 追加
v1.8.163feat: PyPI 公開フロー検証(#541)— ビルド検証・CI package-build ジョブ・CHANGELOG 連携・リリース how-to
v1.8.162docs: FT ループの目的・終着点を明文化(#540)— field-trial-methodology.md(EN/JA)
v1.8.161fix: handler の response_model 統一(#539)— Note/Tag/Comment に Response モデル定義・OpenAPI スキーマ出力
v1.8.160FT282: platform — システム情報を露出しない(セキュリティ診断合格・情報漏洩防止)
v1.8.159FT281: math — isclose / gcd / factorial(巨大整数 DoS ガード)
v1.8.158FT280: re — ReDoS 対策(クラッカーペンテスト合格)
v1.8.157FT279: plistlib — plist 解析(セキュリティ診断合格・XXE 耐性)
v1.8.156FT278: string — capwords / 定数(ASCII 文字種判定)
v1.8.155FT277: keyword — iskeyword / issoftkeyword(安全な識別子検証)
v1.8.154FT276: subprocess — 安全なコマンド実行(診断+ペンテスト合格)
v1.8.153FT275: cmath — 複素数演算 / 極座標(isfinite ガード・real/imag 分離)
v1.8.152FT274: colorsys — RGB / HSV 変換(0-1 正規化・範囲検証)
v1.8.151FT273: marshal — 信頼できないデータに使わない(セキュリティ診断合格・json 代替)
v1.8.150FT272: tarfile — tar slip / tar bomb / symlink 対策(クラッカーペンテスト合格)
v1.8.149FT271: stat — モードビット解釈(world-writable/setuid 検出)
v1.8.148FT270: ssl — create_default_context(セキュリティ診断合格・TLS 検証既定)
v1.8.147FT269: contextvars — ContextVar(コンテキストローカル状態・Token reset)
v1.8.146FT268: lzma — compress / decompress(クラッカーペンテスト合格・解凍爆弾対策)
v1.8.145FT267: glob — パターンマッチ(セキュリティ診断合格・パストラバーサル防御)
v1.8.144FT266: types — MappingProxyType(読み取り専用ビュー・ライブビュー)
v1.8.143FT265: zoneinfo — ZoneInfo(IANA タイムゾーン変換・DST 自動)
v1.8.142FT264: ast.literal_eval — eval の安全な代替(診断+ペンテスト合格)
v1.8.141FT263: tomllib — TOML 読み込み(読み取り専用・安全な設定パース)
v1.8.140FT262: graphlib — TopologicalSorter(トポロジカルソート・循環検出)
v1.8.139FT261: mimetypes — guess_type / アップロード検証(セキュリティ診断合格・Content-Type 非信頼)
v1.8.138FT260: zipfile — zip slip / zip bomb 対策(クラッカーペンテスト合格)
v1.8.137FT259: weakref — WeakValueDictionary(弱参照キャッシュの自動退避)
v1.8.136FT258: random — 非暗号性の実証(セキュリティ診断合格・secrets 推奨)
v1.8.135FT257: array — typecode / tobytes(typecode 許可リスト・オーバーフロー処理)
v1.8.134FT256: email.message — ヘッダーインジェクション対策(クラッカーペンテスト合格)
v1.8.133FT255: sqlite3 — パラメータ化クエリ(セキュリティ診断合格・SQL インジェクション防御)
v1.8.132FT254: queue — Queue / LifoQueue / PriorityQueue(安定化タプル)
v1.8.131FT253: copy — copy / deepcopy(浅い/深いコピーの共有参照)
v1.8.130FT252: json — loads/dumps の堅牢化(診断+ペンテスト合格)
v1.8.129FT251: fractions — Fraction / limit_denominator(厳密有理数・用途別分母制限)
v1.8.128FT250: decimal — Decimal / quantize / 丸めモード(金額計算・文字列受け)
v1.8.127FT249: hmac — new / compare_digest(セキュリティ診断合格・署名検証)
v1.8.126FT248: string.Formatter — format string 攻撃の防御(クラッカーペンテスト合格)
v1.8.125FT247: operator — itemgetter / 演算子関数(許可リストディスパッチ)
v1.8.124FT246: unicodedata — NFKC / category(セキュリティ診断・条件付き合格・homoglyph 限界明示)
v1.8.123FT245: reprlib — Repr(多軸上限・ログ肥大化防止)
v1.8.122FT244: html.parser — HTMLParser(クラッカーペンテスト合格・script 除外)
v1.8.121FT243: uuid — uuid4 / uuid1 / uuid5(セキュリティ診断合格・予測可能性)
v1.8.120FT242: heapq — heappush / heappop / nlargest / merge(min-heap・merge ソート前提)
v1.8.119FT241: bisect — bisect_left / insort / 範囲検索(ソート前提検証・left/right)
v1.8.118FT240: 安全なデシリアライズ — pickle 不使用 / json + Pydantic 検証(診断+ペンテスト合格)
v1.8.117FT239: statistics — mean / median / stdev / quantiles(StatisticsError 処理・点数上限)
v1.8.116FT238: calendar — monthrange / weekday / isleap(0=月曜・うるう年規則)
v1.8.115FT237: http.cookies — SimpleCookie / Morsel(セキュリティ診断合格・セキュア既定)
v1.8.114FT236: string.Template — substitute / safe_substitute(クラッカーペンテスト合格・SSTI 安全)
v1.8.113FT235: pprint — pformat / pp(width/depth 制限・JsonValue 型安全)
v1.8.112FT234: ipaddress — ip_address / ip_network / is_global(セキュリティ診断合格・IP ベース SSRF)
v1.8.111FT233: textwrap — wrap / fill / shorten / indent(width 制限・長語分割)
v1.8.110FT232: fnmatch — fnmatch / filter / translate(クラッカーペンテスト合格)
v1.8.109FT231: shlex — split / quote / join(セキュリティ診断合格・シェルインジェクション中和)
v1.8.108FT230: difflib — unified_diff / SequenceMatcher / get_close_matches(O(n^2) 入力制限)
v1.8.107FT229: html — escape / unescape(quote=True 属性コンテキスト安全)
v1.8.106FT228: urllib.parse — urlparse / urlencode / quote(診断+ペンテスト合格・SSRF 対策)
v1.8.105FT227: shutil — copy / move / rmtree(resolve + is_relative_to 封じ込め)
v1.8.104FT226: gzip — compress / decompress / GzipFile(mtime=0・解凍上限)
v1.8.103FT225: zlib — compress / decompress / crc32(セキュリティ診断合格・解凍爆弾対策)
v1.8.102FT224: binascii — hexlify / unhexlify / crc32(クラッカーペンテスト合格)
v1.8.101FT223: base64 — b64encode / urlsafe_b64encode / b64decode(厳格デコード)
v1.8.100FT222: hashlib — sha256 / pbkdf2_hmac / blake2 / compare_digest(セキュリティ診断合格)
v1.8.99FT221: tempfile — NamedTemporaryFile / mkstemp / TemporaryDirectory(affix 検証・0o600)
v1.8.98FT220: logging — Logger / Handler / Formatter / Filter(クラッカーペンテスト合格)
v1.8.97docs: README / roadmap / reference を v1.8.96 現状に同期、starlette CVE 解消反映
v1.8.96FT219: argparse — ArgumentParser / add_argument / parse_args / subcommands(セキュリティ診断合格)
v1.8.95FT218: configparser — read / write / sections / interpolation
v1.8.94FT217: csv — reader / writer / DictReader / DictWriter / Sniffer
v1.8.93FT216: codecs — encode / decode / lookup / IncrementalEncoder(セキュリティ診断・クラッカーペンテスト合格)
v1.8.92FT215: struct — pack / unpack / calcsize / Struct(フォーマット文字列ホワイトリスト検証・unpack 型変換)
v1.8.91FT214: io — StringIO / BytesIO / TextIOWrapper / BufferedReader
v1.8.90FT213: abc — ABC / abstractmethod / register / subclasshook(セキュリティ診断)
v1.8.89FT212: dataclasses — field / asdict / astuple / replace / post_init
v1.8.88FT211: typing — TypedDict / Protocol / get_type_hints / Literal
v1.8.87FT210: contextlib — contextmanager / suppress / ExitStack / nullcontext
v1.8.86FT209: functools — partial / lru_cache / reduce / wraps
v1.8.85FT208: itertools — chain / islice / groupby / product / combinations(クラッカーペンテスト)
v1.8.84FT207: collections — namedtuple / defaultdict / Counter / deque(セキュリティ診断)
v1.8.83FT206: pathlib — Pure パス解析・パストラバーサル防御
v1.8.82FT205: enum — StrEnum・IntEnum・IntFlag・Flag
v1.8.81FT204: datetime — ISO 8601 パース・タイムゾーン変換(診断+ペンテスト)
v1.8.80FT203: 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–66FT194–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 §4infra
中—🔴 週次 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備考
handler response_model 未使用—#539✅ 2026-05-29 解消(v1.8.161)。Note/Tag/Comment 全ハンドラーに XxxResponse/XxxListResponse を定義し response_model 明示。OpenAPI に 6 レスポンススキーマが出力されることを確認。466 tests 据え置き
FT ループ目的の明文化—#540✅ 2026-05-29 解消(v1.8.162)。explanation/field-trial-methodology.md(EN/JA)に目的・3 フェーズ・終着点(網羅スイープ完了→保守+オンデマンド)を明文化。INDEX/roadmap からリンク
PyPI 公開フロー検証—#541✅ 2026-05-29 解消(v1.8.163)。公開フローは既に稼働中で v1.8.163 を PyPI へ公開(pip install で取得可能)。CI package-build ジョブ・CHANGELOG 連携・how-to 整備
マルチDB対応が未検証—#747✅ 2026-05-29 解消(v1.8.164)。実DB統合テスト(PostgreSQL/MySQL・CI service container)を追加。psycopg2 lastrowid 非対応で save() が常に id=1 を返す重大バグを発見・修正(lastval フォールバック)。pymysql 追加・how-to(EN/JA)
古い FT サンドボックス肥大化——✅ 2026-05-29 整理(5.1G→79M)。ft-status.sh --clean-sandbox を追加(.venv/キャッシュ削除・ソース保持・uv sync で再生可)。--clean は dist/ のみで誤記だった
マージ済み orphan リモートブランチ——✅ 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 済み)
starlette PYSEC-2026-161——✅ 解消済み(#611, starlette 1.0.1)
roadmap / README 陳腐化——✅ 2026-05-23 docs 同期 PR で更新

Released under the MIT License.