更新通知の 16 KiB 応答上限が最新リリース JSON を拒否し、通知とキャッシュ更新が失敗する
- Dominant language
- Rust
- Stars
- 26
- Forks
- 6
- Avg merge
- 1h 13m
- Merged PRs (30d)
- 384
Description
## 問題
起動時の更新通知は GitHub release API の応答を **16,384 bytes** に制限しています。しかし、現在の最新安定版 `v0.0.81` の release JSON は **38,958 bytes / assets 22 件** あり、正常な応答がサイズ超過として拒否されます。
古いバージョンの利用者が新しいリリースを知るための通知経路が機能しません。キャッシュが未作成または期限切れの場合、失敗時にはチェック時刻も保存されないため、対象コマンドの起動ごとに再試行し得ます。
確認対象: `main` / `31c515a7cfe6de6e7909c3c7a420385079d85050`(Pentect `0.0.81`)。release metadata は 2026-09-08 に取得。
## 再現と実測
公開 API の response body を取得しました。
```sh
gh api repos/EdamAme-x/pentect/releases/latest > release.json
wc -c < release.json
```
```text
38958
```
`update.rs` の現行 `get_response()` をそのまま取り出した一時 Rust harness を使い、この response body を localhost HTTP server から返して検証しました。認証情報は使用していません。
```text
release="v0.0.81" bytes=38958 assets=22
limit=16384 result=Err("GitHub release response is too large")
limit=65536 result=Ok("OK")
```
呼び出しはそれぞれ `get_response::(&client, &local_url, 16384)` と同 `65536` です。実際のコードと公開 release JSON の組み合わせで、サイズ制限による拒否を確認しています。
## 原因
- [refresh_update_check()](https://github.com/EdamAme-x/pentect/blob/31c515a7cfe6de6e7909c3c7a420385079d85050/crates/pentect-cli/src/update.rs#L105) は `MAX_CHECKSUM_BYTES * 4`、つまり 16 KiB を release metadata の上限として渡します。
- [get_response()](https://github.com/EdamAme-x/pentect/blob/31c515a7cfe6de6e7909c3c7a420385079d85050/crates/pentect-cli/src/update.rs#L517) は JSON の必要フィールドを読む前に、response 全体の Content-Length または読み取り量をチェックします。`UpdateCheckRelease` が少数のフィールドだけを deserialize することでは応答サイズは小さくなりません。
- サイズエラーで `write_update_check_cache()` に到達せず、[起動側](https://github.com/EdamAme-x/pentect/blob/31c515a7cfe6de6e7909c3c7a420385079d85050/crates/pentect-cli/src/update.rs#L82) には `update-check / request-failed` として記録されます。
手動の `pentect update` は別の 64 KiB 上限を使うため、今回の約 39 KB の fixture はサイズ判定を通ります。この issue は起動時の更新通知経路についてのものです。
## 修正案・完了条件
- checksum 用の上限を流用せず、実際の release asset metadata を扱える、有限の release-response 上限を設ける。
- 最新 release と同程度の asset 数・JSON サイズで更新通知用の取得とキャッシュ書き込みが成功することを検証する。
- 上限超過を拒否するテストは維持する。
- 失敗時にも適切な再試行間隔を設け、毎回の起動で同じ失敗を繰り返さないようにする。
SDK / runtime 全体をビルドして通知を画面表示させる E2E は実行していません。ここで確認したのは、現行 HTTP 読み取り関数が正常な最新 release 応答を拒否することです。
Contributor guide
Research direction
Start in crates/pentect-cli/src/update.rs at refresh_update_check() and get_response(), then trace write_update_check_cache() and the startup handling. Use the recorded 38,958-byte, 22-asset latest-release response to exercise the update-check path and its size-limit test. Done means successful notification and cache update, retained rejection for oversized responses, and a retry interval after failure.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- github, rust
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100