Skip to content

Latest commit

 

History

History
220 lines (190 loc) · 21 KB

File metadata and controls

220 lines (190 loc) · 21 KB

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-audit22 件(出力 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)
  • CIintegration-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.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.fastmcpmcp.server.mcpserver に改名。実測の移行規模は概算 11 行src/nene2/mcp/server.py の 1 行が唯一の依存点・src/example/mcp.pyLocalMcpServer 越しで変更不要)。実質的な破壊点は 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 本落ちた」だけで依存の実体を測っていなかった(grepserver.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_dispatchconcurrencygithub.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 備考
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 で更新