Laravel のメインブランチの中に存在している "wip" コミットを洗い出してみた

# 背景

Laravel には，

**「コミットメッセージ書くのめんどくせぇ！全部 `wip` でいいわ」**

という信仰に従って（？），メインブランチにも堂々と `wip` とだけ書かれたコミットがプッシュされています。これを揶揄するかのようにファングッズまで作られる状態です。下記に関しては Taylor 氏公認の模様。<del>お行儀よくコミットメッセージを書いている古くからのオープンソースプロジェクト参加者が発狂しそうな実態ですね</del>

https://laravelelite.gumroad.com/l/wipcrack

https://twitter.com/taylorotwell/status/1256635202262220800


ところで，フォロワーの過去の呟きを今更ながら掘り返してしまいました。せっかくなので，いったいどれだけの `wip` が存在するのか，統計をとって調べてみました。

https://twitter.com/fagai/status/1495953236896931843

# 調査1: `laravel/framework`

## コミット数統計

最終コミットはこの状態です。

```
commit 76b407eafb16dfd4a553f3c437fbbc6d8268e3a1 (HEAD -> 9.x, origin/HEAD, origin/9.x)
Author: Samuel Mwangi <samuel@samuelmwangi.co.ke>
Date:   Sat Jul 16 22:38:10 2022 +0300

    [9.x] Fix factory typos (#43223)
    
    * Fix Typos
    
    Fix typos in Factory docblock
    
    * Missed typo
```

### 全体に占める割合

```scala
// 総コミット数
$ git log --oneline | wc -l
33933

// メッセージが "wip" または "WIP" のみからなるコミット数
$ git log --oneline --grep='^wip$' -i | wc -l
84

// メッセージに "wip" または "WIP" が含まれているコミット数
$ git log --oneline --grep='\bwip\b' -i | wc -l
145
```

歴史全体の中では，完全一致が 0.25%，部分一致が 0.43% となりました。あれ，意外とレア…？

### 期間別の統計

「おかしい！もっとよく見るはずなのに！」

そう感じた私は，半期ごとに調べてみることにしました。 

```bash
oldest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
        --reverse \
    | head -1
)
newest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
    | head -1
)

since_date=$oldest_date
until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

printf "区間\t"
printf "全体\t"
printf "完全一致\t"
printf "部分一致\n"

while true; do
    printf "$since_date - $until_date\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" | wc -l)\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='^wip$' -i | wc -l)\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='\bwip\b' -i | wc -l)\n"

    since_date=$(gdate --date "$until_date 1 day" +%Y-%m-%d)
    until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

    if [[ "$since_date" > "$newest_date" ]]; then
        break
    fi
done
```

`date` コマンドは GNU 版の `gdate` を利用しています。ネタ系記事だけど一応このへんは技術要素あるから大丈夫（？）

結果は以下のようになりました。

```
区間	全体	完全一致	部分一致
2013-01-10 - 2013-07-10	    1866	       0	       0
2013-07-11 - 2014-01-11	    1400	       0	       0
2014-01-12 - 2014-07-12	    1547	       0	       0
2014-07-13 - 2015-01-13	    2356	       0	       0
2015-01-14 - 2015-07-14	    2237	       0	       0
2015-07-15 - 2016-01-15	    2389	       3	       3
2016-01-16 - 2016-07-16	    2325	       0	       1
2016-07-17 - 2017-01-17	    2723	       0	       1
2017-01-18 - 2017-07-18	    1762	       0	       2
2017-07-19 - 2018-01-19	    1726	       1	       2
2018-01-20 - 2018-07-20	    1274	       2	       2
2018-07-21 - 2019-01-21	    1659	      15	      16
2019-01-22 - 2019-07-22	    1847	       2	       2
2019-07-23 - 2020-01-23	    1527	       1	       2
2020-01-24 - 2020-07-24	    2172	      19	      21
2020-07-25 - 2021-01-25	    1636	       3	       6
2021-01-26 - 2021-07-26	    1076	      11	      16
2021-07-27 - 2022-01-27	    1200	      19	      45
2022-01-28 - 2022-07-28	    1001	       8	      25
```

2019 年がちょうど Laravel 6 の開発・リリースの時期と一致します。あの頃から良くも悪くも **"""勢いづいて"""** きた記憶があるので感覚的にも腑に落ちますね。

## 変更内容の個別精査 （完全一致）

かなりのコミット数があるので，ここでは完全一致に絞ってみます。

```bash
check() {
    local i=0;
    for commit in $(git log --pretty=%H --since="$1" --until="$2" --grep='^wip$' -i --reverse); do
        ((i++))
        if [[ $(( i % 10 )) -eq 0 ]]; then
            echo "Press enter to continue\n"
            read
        fi
        open https://github.com/laravel/framework/commit/"$commit"
    done
}
```

ここから１個１個虱潰しにしていき，興味深いものに絞り込んで紹介します。但し，プルリクエストの中の１コミットであったものは目視で除外し，あくまで直接プッシュされたものに絞り込みます。

（ここも自動化できるといいんだけどな…）

### 〜 2018-07-20

```bash
check 2013-01-10 2018-07-20
```

- [wip · laravel/framework@faf2e22](https://github.com/laravel/framework/commit/faf2e22d34cd8ba927b7be2f731598d237f38d5e)
  - **`AuthManager` が，汎用的な `Manager` 継承をやめて全て固有実装に差し替え**
    - 初っ端からなかなかぶっ込んできますね…安易な継承をやめること自体は正しいとは思いますが
- [wip · laravel/framework@1aa9577](https://github.com/laravel/framework/commit/1aa9577caf43fbcd769050d4c49f4af880991ef2)
  - <font color="darkorange">**`Guard` をクラスからコントラクトに変更して，これまで `Guard` だったものが `SessionGuard` として実装の１つに**</font>
    - むしろ今まで伝統的セッション管理にしか対応してなかったんかい！でもこの変更のおかげで今の治安があると思えばなかなかいい仕事 

### 2018-07-21 〜 2020-01-23

- [wip · laravel/framework@b298de2](https://github.com/laravel/framework/commit/b298de2cf10a9828162d502a1f6b92089aadee18)
  - <font color="darkorange">**Eloquent Event Dispatcher のイベント発火用メソッドが `fire` から `dispatch` に変更**</font>
    - ありましたね〜 昔はイベントは基本 `fire` でしたけどいつの間にか `dispatch` に入れ替わってきてますね。まだ一部フレームワーク内に旧称が残っている場所はあった気がしますが
- [wip · laravel/framework@7248f29](https://github.com/laravel/framework/commit/7248f29b01030041e22558343eb3fd414f710e78)
  - `'Sorry, you may not access this page.'` → `'Sorry, you are not authorized to access this page.'`
    - 自然な英語を感じる…これがネイティブの拘り… `may not <V>` ってちょっと堅苦しい感じするよね
- [wip · laravel/framework@359bd06](https://github.com/laravel/framework/commit/359bd06d97a114cb150522aa1fcfb042a16cc667)<br>[wip · laravel/framework@e9fe34c](https://github.com/laravel/framework/commit/e9fe34ca6a2e33731e07011a209d5753fd37ed27) 
  - リリースバージョンを 5.7 から 5.8 に変更<br>リリースバージョンを 5.7 から 5.5 に変更
    - え？って思ったけど， CI で自動デプロイするためにリリース用のスクリプトに変更いちいちコミットして突っ込んでいるのね。LTS の 5.5 をサポートするためにわざわざ対応しているのは偉い。（もう少し良い仕組みありそうな気はするけど…）
    - 以降では省略しますが，類似のコミットが非常に多かったです。

### 2020-01-24 〜 2022-07-28

- [wip · laravel/framework@63f7658](https://github.com/laravel/framework/commit/63f7658047c0574722b4a5e574f7f9535f2b356f)
  - **`Collection::mode()` で `new self` → `new static` に変更**
    - 遅延静的束縛！コレクションは基本こっちに寄せてくれると嬉しい 
- [wip · laravel/framework@ddfa71e](https://github.com/laravel/framework/commit/ddfa71ee9f101394b4ff682471bc31a7ba6de5cf)
  - <font color="red">**Query Builder の `limit` に渡される値を明示的に `(int)` キャスト**</font>
    - 一見地味な変更だけど重要な意味を持つもの。**セットする側のメソッドの引数で `int` による型宣言がついていないため，信用できない入力を渡されたときに文字列のまま持ってしまうリスクがあった。**
    - SQL インジェクションの脆弱性自体は Laravel 5.0.30 の [Cast to integer on limit and offset. · laravel/framework@fcf5cb3](https://github.com/laravel/framework/commit/fcf5cb382f459c84a5b9aef3fa2a9a70f3f55e47) で修正されているため，この段階での影響があったわけではない模様。よかった…2021年に残っていなくて…
- [wip · laravel/framework@1d6380d](https://github.com/laravel/framework/commit/1d6380da6e5e5b135b5e55f86ba70869de5caac1)<br>[wip · laravel/framework@9c88e7c](https://github.com/laravel/framework/commit/9c88e7cfa39bde1a278d44cc792878a5239d79ff)<br>[wip · laravel/framework@580df99](https://github.com/laravel/framework/commit/580df99c842eb264b62672b442f007082a9d20fa)<br>[wip · laravel/framework@6c10534](https://github.com/laravel/framework/commit/6c105348d007be7bfa847114af7bbb082ef08e42)
  - コンフリクト解消ミス修正
    - 差分マーカーそのままコミットしがち
- [wip · laravel/framework@4a57b48](https://github.com/laravel/framework/commit/4a57b48f10fb99f58593fdd54e051cf8d9bda1f8)
  - インテグレーションテストでのメソッド呼び出し回数期待値変更
    - これだけ見てもさっぱり元の変更がわからん…
- [wip · laravel/framework@c51ad0f](https://github.com/laravel/framework/commit/c51ad0f0527105b3b3cf8612fcdaadec4eb4fe10)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/a8a3ecf7-7d02-8ca5-4acd-5b42d3d59817.png)<br>これは草
- [wip · laravel/framework@f42aaa5](https://github.com/laravel/framework/commit/f42aaa5c50f487e22895dec0bbcef30fbe203167)
  - <font color="darkorange">**Query Builder の全文検索機能に Eloquent Builder も対応させる**</font>
    - これはプルリク出してちゃんと変更ログ残そうぜ…
- [wip · laravel/framework@609351c](https://github.com/laravel/framework/commit/609351ca3021b97746ba2be51e248585b626e276)
  - <font color="darkorange">**`strtr` と `str_replace` の比較実験を行った結果 `str_replace` の実装を削除**</font>
    - [use strtr · laravel/framework@220f4ac](https://github.com/laravel/framework/commit/220f4ac11d462b4ee9ff2cb9b48b93d6f560223a) に続いて消してるコミット。 PHPer，最初は `str_replace()` しか使わないけど `strtr()` の存在を知ったとき感動するのありがち。[真面目に実装するとかなりしんどい](https://qiita.com/mpyw/items/cdeacef88301e424809b)やつ。

やはり近年は劇的に増えてますね…

:::note success
実はこの後部分一致でも調べましたが，特にこちらは問題ありませんでした
```bash
check() {
    local i=0;
    local x=$(git log --pretty=%H --since="$1" --until="$2" --grep='\bwip\b' -i --reverse)
    local y=$(git log --pretty=%H --since="$1" --until="$2" --grep='^wip$\|\(#[0-9]\+\)\|merge pull request' -i --reverse)
    diff=$(diff <(echo "$x") <(echo "$y") | grep '< ' | cut -d' ' -f 2)
    for commit in $(echo $diff); do
        ((i++))
        if [[ $(( i % 10 )) -eq 0 ]]; then
            echo "Press enter to continue\n"
            read
        fi
        open https://github.com/laravel/framework/commit/"$commit"
    done
}
```
:::

## おまけ: `version` っぽいコミットの調査

`version` っぽいコミット（typo 含む）のうち，通常のバージョン番号変更以外のことをやっているコミットを探してみます。

```bash
oldest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
        --reverse \
    | head -1
)
newest_date=$(
    git log \
        --oneline \
        --pretty=format:'%cd' --date=format:'%Y-%m-%d' \
    | head -1
)

since_date=$oldest_date
until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

printf "区間\n"
printf "version っぽいコミット\t"

while true; do
    printf "$since_date - $until_date\t"
    printf "$(git log --oneline --since "$since_date" --until "$until_date" --grep='^vers' -i | wc -l)\n"

    since_date=$(gdate --date "$until_date 1 day" +%Y-%m-%d)
    until_date=$(gdate --date "$since_date 6 month" +%Y-%m-%d)

    if [[ "$since_date" > "$newest_date" ]]; then
        break
    fi
done
```

```
version っぽいコミット	2013-01-10 - 2013-07-10	       0
2013-07-11 - 2014-01-11	       2
2014-01-12 - 2014-07-12	       0
2014-07-13 - 2015-01-13	       0
2015-01-14 - 2015-07-14	       2
2015-07-15 - 2016-01-15	       0
2016-01-16 - 2016-07-16	      14
2016-07-17 - 2017-01-17	      23
2017-01-18 - 2017-07-18	      21
2017-07-19 - 2018-01-19	      40
2018-01-20 - 2018-07-20	      36
2018-07-21 - 2019-01-21	      34
2019-01-22 - 2019-07-22	      36
2019-07-23 - 2020-01-23	      36
2020-01-24 - 2020-07-24	      37
2020-07-25 - 2021-01-25	      63
2021-01-26 - 2021-07-26	      27
2021-07-27 - 2022-01-27	      32
2022-01-28 - 2022-07-28	      37
```

統計自体はすべてのバージョンコミットを含んでいます。ここから `const VERSION='...';` の書き換えをしたもの以外に絞り込むと…

```bash
check() {
    local i=0;
    local x=$(git log --pretty=%H --since="$1" --until="$2" --grep='^vers' -i --reverse)
    local y=$(git log --pretty=%H --since="$1" --until="$2" --grep='\(#[0-9]\+\)\|merge pull request' -i --reverse)
    diff=$(diff <(echo "$x") <(echo "$y") | grep '< ' | cut -d' ' -f 2)
    for commit in $(echo $diff); do
        if $(git show "$commit" | grep '^[+-]' | grep -v 'const VERSION\|^\(+++\|---\)' >/dev/null 2>&2); then
            ((i++))
            if [[ $(( i % 10 )) -eq 0 ]]; then
                echo "Press enter to continue\n"
                read
            fi
            open https://github.com/laravel/framework/commit/"$commit"
        fi
    done
}
```

### 〜 2018-07-20<br>2018-07-21 〜 2020-01-23

特に無し

### 2020-01-24 〜 2022-07-28

ありました！

- [versino · laravel/framework@5371296](https://github.com/laravel/framework/commit/5371296aef2073ae5a5aafc94a5b8f19ab80d36b)
  - エクステンションの phpredis 版のキャッシュ機能テスト
  - Redis を使った排他制御機能のトレイト分割によるリファクタリング
  - コンフリクト解決ミス修正
  - <font color="darkorange">**Eloquent 属性の Enum 対応**</font>
    - えぇ…
  - <font color="darkorange">**`Collection::sortKeysUsing()` メソッドの追加**<br>**`Stringable::scan()` メソッドの追加**</font><br>`Stringable::whenEmpty()` `Stringable::whenNotEmpty()` の引数変更
    - えぇ… 
- [version · laravel/framework@2748457](https://github.com/laravel/framework/commit/2748457f90570c85c7ac17a6646aabc352f5be26)

# 調査2: `laravel/docs`

ドキュメンテーションに悪名高い有名コミットがぶちこまれていた記憶があるので，こちらも掘り起こしてみます。

## 期間別の統計

```
区間	全体	完全一致	部分一致
2013-01-10 - 2013-07-10	     555	       0	       0
2013-07-11 - 2014-01-11	     350	       0	       0
2014-01-12 - 2014-07-12	     357	       0	       0
2014-07-13 - 2015-01-13	     264	       0	       0
2015-01-14 - 2015-07-14	    1482	       0	       0
2015-07-15 - 2016-01-15	     821	       0	       0
2016-01-16 - 2016-07-16	     677	       7	       7
2016-07-17 - 2017-01-17	    1006	       2	       2
2017-01-18 - 2017-07-18	     698	       1	       1
2017-07-19 - 2018-01-19	     781	       0	       0
2018-01-20 - 2018-07-20	     616	       0	       0
2018-07-21 - 2019-01-21	     887	       9	       9
2019-01-22 - 2019-07-22	     691	       1	       1
2019-07-23 - 2020-01-23	     851	       2	       2
2020-01-24 - 2020-07-24	    1068	      47	      47
2020-07-25 - 2021-01-25	     930	      16	      16
2021-01-26 - 2021-07-26	     488	      22	      22
2021-07-27 - 2022-01-27	     464	      46	      49
2022-01-28 - 2022-07-28	     371	      40	      44
```

やはり後半に不穏なニオイが…
何かを諦めたような爆発的増加が見える見える…

## 変更内容の個別精査 （完全一致または部分一致）

### 〜 2018-07-20

特に無し。

### 2018-07-21 〜 2020-01-23

- [wip · laravel/docs@b3bfc4d](https://github.com/laravel/docs/commit/b3bfc4da21bff6b92feeaa122a543ada4c2afd80)
  - <font color="darkorange">**Blade ディレクティブの命名規約の撤廃**</font>
    - どこで変わったんでしょうね…  
- [wip · laravel/docs@139d1c5](https://github.com/laravel/docs/commit/139d1c54484d491012472e86c7a984be42743d99)
  - **Laravel Dusk: `dusk:fails` の追加**
    - [add fails command · laravel/dusk@9810f86](https://github.com/laravel/dusk/commit/9810f8609c8b53d9a3bac7d38c56530e0d77a6bb) で追加されていました。これも直プッシュです 
- [wip · laravel/docs@3d58481](https://github.com/laravel/docs/commit/3d58481e34483a0a017637bf4666f6e7b0582f19)
  - アップグレードガイド: `Removed` → `Flattended`
    - 全く意味が違うけど，アセットディレクトリが完全に消えることは無さそうなので単なるミスの修正でしょうか 
- [wip · laravel/docs@ec81e0d](https://github.com/laravel/docs/commit/ec81e0db1427970a8fa5c767a4e7e31d088141ea)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/ffdd2a40-ac1a-0a4e-ad27-48218545cf12.png)<br>ワロタ
  - **破壊的変更だと思ったものが破壊的変更じゃなかった件**
    - コメント欄の有志が元となったプルリク [[6.x] Remove upgrade guide section on RegisterController by bakerkretzmar · Pull Request #5447 · laravel/docs](https://github.com/laravel/docs/pull/5447/files) を拾ってくれています。 …が，これを見てもどうしてこの変更になったのかさっぱり分からない…

### 2020-01-24 〜 2022-07-28

- [wip · laravel/docs@b75ae3a](https://github.com/laravel/docs/commit/b75ae3a509764c29259caa845f62bf5c7708bf94)
  - **Laravel 本体に `phpunit` を呼び出せる `artisan test` コマンドを追加**
    - そういえばそんなのありましたねぇ…（使わないので忘れてた）  
- [wip · laravel/docs@9c8cf6b](https://github.com/laravel/docs/commit/9c8cf6bb8d02814687936b612fbd4fc19a922652)
  - **Laravel Airlock の追加**
    - 商標権騒動で Sanctum に変わったやつだ！懐かしい名前
- [wip · laravel/docs@c6f6308](https://github.com/laravel/docs/commit/c6f630803e420d5cf7d169ddda0797f0b1e6d889)
  - Airlock の使い方がっつり解説
- [wip · laravel/docs@92a76c9](https://github.com/laravel/docs/commit/92a76c952be01181b02a1bab7f3340a186c972ce)
  - Blade タグコンポーネントのディレクトリネスト表現: `foo:bar` → `foo.bar`
    - [Laravel 7.xの新コンポーネント機能！実例 – console dot log](https://blog.capilano-fw.com/?p=5993) で紹介されているように， 7.x から使えるようになった Blade Component の新記法。これも使わないから忘れていた…
    - ネスト表現が`:` だったのは単なるミスだろうか？
- [wip · laravel/docs@66f0947](https://github.com/laravel/docs/commit/66f09472883d9faf7ea3c84fe8a11a27de4fe60a)
  - `Response::header()` `Response::headers()` の追加
    - 多分これはずっと前からあった気がするのでドキュメンテーション漏れ
- [wip · laravel/docs@7441d8e](https://github.com/laravel/docs/commit/7441d8e89e46946cd1942d2ec5c49f2eb1b046e6)
  - _Markdown mail template improvements were contributed by [Taylor Otwell](https://twitter.com/taylorotwell)_.
    - はい
- [wip · laravel/docs@1551c57](https://github.com/laravel/docs/commit/1551c57dccce8dca6fafd0155e204b10b5fb6331)
  - <font color="darkorange">**`Stringable::replace()` メソッドの追加**</font>
    - この手のヘルパー使わないからほぼ追ってません…
- [wip · laravel/docs@06d0e2a](https://github.com/laravel/docs/commit/06d0e2a895f8e978f896c96f948d10c4ce7f2a52)
  - <font color="darkorange">**バックグラウンドジョブでの例外発生時のリトライ機能の追加: `$maxExceptions`**</font>
    - これは結構大きな機能追加で嬉しいやつ！
- [wip · laravel/docs@d67c3a3](https://github.com/laravel/docs/commit/d67c3a3099e75b9794c886d515127daefd727bb5)
  - `retryUtil()` → `$tries` に変更
    - これはずっと前からあった気がするので，「よりありがちなユースケース」に揃えて例を変更しただけだと思われる
- [wip · laravel/docs@64a6c6e](https://github.com/laravel/docs/commit/64a6c6e799531cc8177a18e5c0111167055a5b6d)<br>[wip · laravel/docs@4c39fec](https://github.com/laravel/docs/commit/4c39fecc81b35d1579a14d913fcc7ab0cd3777d4)
  - **HTTP クライアントにリトライ機能追加: `retries()`**
  - **HTTP クライアントに URL パスに依存しないモックレスポンスをセットする機能追加: `fakeSequence()`**
    - これも Laravel の HTTP クライアント機能使わない派だから分からん…
- [wip · laravel/docs@a323bcd](https://github.com/laravel/docs/commit/a323bcdadad8d07a82e9cdd1d2131b7f5d58c132)
  - **Laravel Cashier が Stripe に加えて Mollie にも対応**
    - Stripe しか知らなかった。なにこれ？と思ったが 2004 年からある老舗ではあるんですね 
- [wip · laravel/docs@42ecebe](https://github.com/laravel/docs/commit/42ecebefe1680465c7d1d39f093577e243fe139f)
  - <font color="red">**Blade Component で暗黙的に変数でメソッド実行結果を参照できるように**</font>
    - そもそも Blade ビュー側からコンポーネントのパブリックメソッドを `$method()` スタイルで呼べるの知らなかった。この時点で識別性下がりすぎてるのでやりすぎだと思う
    - それに加えてクロージャを実行せずとも文字列化できるようになった模様。やめてくれ…
    - リフレクションで `public` メソッド抽出して `__invoke()` `__toString()` を両方実装したオブジェクトでも返してるのかな？
    - 検索したら [その通り](https://github.com/laravel/framework/blob/b9203fca96960ef9cd8860cb4ec99d1279353a8d/src/Illuminate/View/InvokableComponentVariable.php) でした
- [wip · laravel/docs@b21e1b7](https://github.com/laravel/docs/commit/b21e1b7d056799f001b2c8b2e31aefaff86b0603)
  - **Tailwind インテグレーションの追加**
    - Tailwind 嫌いなので使いません…
- [wip · laravel/docs@846903c](https://github.com/laravel/docs/commit/846903c99185c869450aec216a68e662a88acc00)
  - <font color="red">**デバッグで隠蔽する変数を指定するディレクティブが `debug_blacklist` から `debug_hide` に変更**</font>
    - **BLM 運動**のやつじゃん！ Laravel にあったの気づかなかったよ… 
- [wip · laravel/docs@b11b600](https://github.com/laravel/docs/commit/b11b60090f4a7092627a6511bf4f2671cfb300af)
  - Database Factory 機能の具体例に登場する `delinquent` を `suspended` に変更
    - `delinquent` っていう英単語初めて知った。「滞納中」という意味らしい。
    - 「凍結中」のほうがわかりやすいよねそりゃ
- [wip · laravel/docs@461736c](https://github.com/laravel/docs/commit/461736c199d99ad066dbf3f30c6d8bfd4d374ff0) 
  - <font color="darkorange">**Cookie を破棄する `Cookie::queue(Cookie::forget('name'))` が `Cookie::expire('name')` で書けるようになった**</font>
    - [[8.x] Add `Cookie::queueForget()` method by dmitry-ivanov · Pull Request #37072 · laravel/framework](https://github.com/laravel/framework/pull/37072) で追加されたものが [rename method to expire · laravel/framework@fa3a14f](https://github.com/laravel/framework/commit/fa3a14f4da763a9a95162dc4092d5ab7356e0cb8) で `expire()` に変更されてる！
    - Taylor 先生のこういう単語チョイスは好きだよ
- [wip · laravel/docs@bd580f0](https://github.com/laravel/docs/commit/bd580f08f864a8327fbd237265531d10bb6b58c6)
  - **HTTP Client Watcher の追加**
    - Laravel アプリケーションから外に飛んでいくリクエストロギングを簡単にできるらしい。
    - 個別に作ったクライアントに `LoggerInterface` を注入して対応すべきな気がするけど，まぁ Easy に寄せるならナシではないか…
- [wip · laravel/docs@7696c5b](https://github.com/laravel/docs/commit/7696c5bd5938f87bbe9ba35fb1ad021f5bd08522)
  - <font color="darkorange">**Eloquent の日付キャストにイミュータブル版を追加**</font>
    - かなり嬉しい機能 
- [wip · laravel/docs@62e603d](https://github.com/laravel/docs/commit/62e603d0e391ca4667860585893f876d0ddff81e)
  - <font color="red">**デフォルトの暗号方式を `AES-256-CBC` から `AES-256-GCM` に変更**</font>
    - 安全なほうに倒しているのでこれ自体はよい変更。アナウンスあったっけ？と思ったけど `laravel/laravel` の設定が変わっただけっぽいから破壊的変更ではないのか
    - 機能追加は [[8.x] Added support for GCM encryption by nickakitch · Pull Request #38190 · laravel/framework](https://github.com/laravel/framework/pull/38190)
    - デフォルトに変更されたのは [[8.x] Use new stronger AES-256-GCM encryption by default by driesvints · Pull Request #5674 · laravel/laravel](https://github.com/laravel/laravel/pull/5674)
    - しかし **[wip · laravel/laravel@52de5d8](https://github.com/laravel/laravel/commit/52de5d84f6c309e93910e0d250b8c42fd656931b)** でもとに戻される！これも `wip` かよ
    - OpenSSL のバグが原因で紆余曲折あった模様。<br>[[8.x] Use lowercase OpenSSL cipher names by Krisell · Pull Request #38594 · laravel/framework](https://github.com/laravel/framework/pull/38594)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/363bac53-fc6b-be90-0fec-15a1e801af17.png)
    - [Update default encryption mode to GCM by Krisell · Pull Request #5749 · laravel/laravel](https://github.com/laravel/laravel/pull/5749) では復活せず， Laravel 9 のタイミングにするとのこと。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/d887d093-a8b5-2fe8-ac2a-422e80cc703d.png)
    - **現時点での [最新コミット](https://github.com/laravel/laravel/blob/b331e10aca58d771511cd3f03e762ca4dea9183e/config/app.php#L126) みたら約束守られてなくて草<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/713a466d-eea4-f1a9-4e3b-f1cb4e531382.png)**
- [wip · laravel/docs@c0bcbe6](https://github.com/laravel/docs/commit/c0bcbe6b58ff0127631266697214c8e95eb3bb02) 
  - <font color="darkorange">**Eloquent の Polymorphic Relation で使われる明示的モデル名マッピングのメソッドに関し，従来の `morphMap` に加えて `enforceMorphMap` を追加**</font>
    - [[8.x] Add support for disallowing class morphs by olivernybroe · Pull Request #38656 · laravel/framework](https://github.com/laravel/framework/pull/38656/files) で追加された変更。登録忘れがあったときにエラーにしてくれるのはめちゃくちゃ嬉しい！
- [wip · laravel/docs@2560175](https://github.com/laravel/docs/commit/2560175376adf414bb65f88ca2e4964991a161d3)
  - `assertModelExists()` `assertModelMissing()` の追加
- [wip · laravel/docs@a263b46](https://github.com/laravel/docs/commit/a263b465f0458020a03c68192f4d780206957c5f)
  - `compnoents` → `components` 
    - めっちゃよくある Typo で分かりすぎてしまった
- [wip · laravel/docs@ac66830](https://github.com/laravel/docs/commit/ac66830b3c3fc6508ee8098eb3284626cc6b9884)
  - <font color="darkorange">**`RefreshDatabase` 遅延実行版の `LazilyRefreshDatabase` を追加**</font>
    - 必要なときだけデータベースリフレッシュ実行してくれる便利なやつ。お世話になってます
- [wip · laravel/docs@5c75585](https://github.com/laravel/docs/commit/5c75585e4f6d8dccbaaf4c136e4338a4faf8e0fe)
  - **`Builder::whereBelongsTo()`** の追加
    - [[8.x] Add `whereBelongsTo()` Eloquent builder method by danharrin · Pull Request #38927 · laravel/framework](https://github.com/laravel/framework/pull/38927) 見たとき便利だなーって思ったけど，最近 Eloquent Model をほとんど生で触ることがなくてだいたい Entity 化してるので，使うところが見つからないｗ
- [wip · laravel/docs@5592292](https://github.com/laravel/docs/commit/5592292b8aa49d8fef0f2146c49d035d04518276)
  - **`Collection::reduce()` のマルチパラメータ版 `Collection::reduceMany()` の追加**
    - これに関しては many の意味が分かりづらかった… 
    - `reduceVariadic()` とかのほうがわかり易くない？
    - [[8.x] Deprecate `reduceMany` in favor of `reduceSpread` by JosephSilber · Pull Request #39201 · laravel/framework](https://github.com/laravel/framework/pull/39201) で名前変えられてた
- [wip · laravel/docs@e43872a](https://github.com/laravel/docs/commit/e43872aea860e0b98692c0b87e63d26585516a81)
  - **`Notification::shouldSend()`** で予約された通知送信をキャンセルできるように
    - Laravel 組込みの通知機能自体がかなりお粗末なことを知ってから使う気が失せたので追ってません…
- [wip · laravel/docs@27f40c5](https://github.com/laravel/docs/commit/27f40c5112e353b973b8ba833fbf9f14585df666)
  - <font color="darkorange">**`Str::headline()` の追加**</font>
    - ヘッドラインだから見出しか。管理画面作るときとか便利そう
- [wip · laravel/docs@06e2e42](https://github.com/laravel/docs/commit/06e2e4218b26b3182fd25deb1a0b6a27d02c9a86)
  - <font color="green">予約済みドメイン `.test` を使うように変更</font>
    - [予約済みドメイン (.example, .localhost, .test) について | blog.jxck.io](https://blog.jxck.io/entries/2017-09-27/example-local-test-domains.html)
    - 地味だけど大事な修正！
- [wip · laravel/docs@7c30a88](https://github.com/laravel/docs/commit/7c30a883a6b5193964bcb09f64e464de547ff9e6)
  - `unique:` バリデーションルールの末尾の引数 `except`, `idColumn` を削除
    - なんで消えたんだろう？って思ったけど `Rule::unique()->ignore()` で書くほうが推奨されているからっぽい。内部的にはまだ存在してる
- [wip · laravel/docs@1899490](https://github.com/laravel/docs/commit/18994907a5ba964cbce10b41bb353d8f2eac3167)
  - **Eloquent Model のフィールドをダイレクトに `Stringable` にキャストするための機能を追加**
    - これ嫌い。さすがにやりすぎ
- [wip · laravel/docs@1a11d1f](https://github.com/laravel/docs/commit/1a11d1f773c3bdb284866c7029be0d361d44bdcc)
  - <font color="darkorange">**`Str::mask()` の追加**</font>
    - これは普通に便利そう。ネーミングから意図がわかりやすいので，普通にヘルパーとして存在していていいと思う
- [wip · laravel/docs@8f0031b](https://github.com/laravel/docs/commit/8f0031b4ea65784d5786507f76fbf9843c0ea388)
  - `assertExitCode()` の追加
- [wip · laravel/docs@e8f1c93](https://github.com/laravel/docs/commit/e8f1c93cd8766fd951bae76d42978bd7a78a08a1)
  - <font color="darkorange">**Enum バリデーションルールの追加**</font>
    - 便利！ [framework/Enum.php at 9.x · laravel/framework](https://github.com/laravel/framework/blob/9.x/src/Illuminate/Validation/Rules/Enum.php)
    - `__toString()` されない組込みバリデーションルールはこれが初めて…？互換性的に問題なければ本当は全部こっちに寄せたいんだろうなというのはある
- [wip · laravel/docs@0dfe237](https://github.com/laravel/docs/commit/0dfe2377733d1bdb6535cc6cfb8797c83c1c0284)
  - <font color="red">**Octane を使うための `pecl install` のサジェストを `openswoole` から `swoole` に変更**</font>
    - え？逆じゃないの？
    - **[[8.x] Change to openswoole by mohprilaksono · Pull Request #7449 · laravel/docs](https://github.com/laravel/docs/pull/7449) で `openswoole` に変更された翌日にもとに戻されてる…これはひどい…**
- [wip · laravel/docs@f2c95a5](https://github.com/laravel/docs/commit/f2c95a5bf03b5bd4acc8245f83021922a3cb6aa8)
  - **セッションのシリアライズ方式 `serialize()` から `session_encode()` に変更して PHP 標準と同じ形に… <ins>の変更を削除</ins>**
    - 探してみたけどこれ以外の痕跡が見つからなくてよく分からなかった
- [wip · laravel/docs@f8eec0a](https://github.com/laravel/docs/commit/f8eec0aa795d4fc21706d92e03dbaf0d6a3f4f30)
  - `Notification` の `Slack` インテグレーションが削除
    - [Notifications - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/9.x/notifications#slack-prerequisites) で外出しされた影響かな？ 
- [wip · laravel/docs@1249422](https://github.com/laravel/docs/commit/1249422c2ea59f9bc8eac468b0ffe108658214fe)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25060/e632bdfa-9263-50ce-e2e7-5c68f3a237f3.png)
  - **<font color=red>LTS の廃止</font>**
    - はい， `laravel/docs` を調査する一番の動機となった変更です。めっちゃコメント付いてますね。
    - 要約すると **「短期サポート → 短期サポート → 長期サポート」** のサイクルを全て **「中期サポート」** に変更しちゃう感じですね。 Symfony の LTS ではないバージョンを LTS に組み込んでしまったのがきっかけと言われていますが，それにしてももう少し議論しても良かったんじゃないでしょうか…ｗ
- [wip · laravel/docs@1dec3bb](https://github.com/laravel/docs/commit/1dec3bb6c068b816288d445fa179b960bc0513b9)
  - <font color="darkorange">**Eloquent Model の `$casts` に `BackedEnum` を直接書けるように**</font>
    - これはめちゃくちゃ便利で使ってます。 `Stringable` はやりすぎだけどこっちは許されると思う
- [wip · laravel/docs@2d4ec79](https://github.com/laravel/docs/commit/2d4ec798de59ddd06f8e77d59e9e65ebd21aa2fa)
  - **ストレージ抽象化機構のファイル操作機能強化**
- [wip · laravel/docs@3de884e](https://github.com/laravel/docs/commit/3de884e6a28a230525c0315561fc3cf1f1efac9a)
  - **`assertSimilarJson()` の削除**
    - 機能としては [最新コミット](https://github.com/laravel/framework/blob/b587974d3f3fd470906894682184c81bce4ebeca/src/Illuminate/Testing/TestResponse.php#L767-L772) でも残ってますね…あんまり使ってほしくはないのかな
- [wip · laravel/docs@cf86b38](https://github.com/laravel/docs/commit/cf86b38c352d093e660fe9326f3cd833b009a2fd)
  - **Laravel Sanctum の有効期限切れトークン削除機能**
- [wip · laravel/docs@5cae163](https://github.com/laravel/docs/commit/5cae1636d29df8dc734617f1108129403b96d92e)
  - <font color="darkorange">**`Str::squish()` の追加**</font>
    - 「ぐちゃぐちゃと潰す」の意味らしい。内側も含めたトリミングってそれで伝わるのか…？
    - [[9.x] Add String::squish() helper by dwightwatson · Pull Request #41791 · laravel/framework](https://github.com/laravel/framework/pull/41791) によると Rails 由来らしい。まぁ Rails の機能パクってるフレームワークなのでそれは入るか
- [wip · laravel/docs@56f3abf](https://github.com/laravel/docs/commit/56f3abfc75a01cbf9eaf137c8aad4fbbf6c3f5f2)
  - **`Collection::value()`** の追加
    - それ本当にコレクション上に追加する必要あった？　
    - `$collection->first()['price'] ?? null` `$collection->first()?->price` とかでええやん
- [wip · laravel/docs@a67705a](https://github.com/laravel/docs/commit/a67705a0da7af2a77aaea944c870de9d214ac0c1)
  - <font color="darkorange">**論理削除モデルを対象としてデフォルトでファクトリに `trashed()` ステートを用意**</font>
    - 知らなかった。便利そう。<del>最近論理削除使わんけど</del>
- [wip · laravel/docs@7ad23cc](https://github.com/laravel/docs/commit/7ad23cc63157669548c4dea18058629ef0165a7a)
  - <font color="darkorange">**テーブルコメント機能の追加**</font>
    - いつの間にかカラムだけじゃなくテーブルにもコメント生やす機能ついてました！
    - 今までは `DB::statement()` で無理やり書いてたやつ
- [wip · laravel/docs@049814c](https://github.com/laravel/docs/commit/049814cbacbfcadd875a7ef327df042fc9b763b4)
  - <font color="darkorange">**条件付きの `required` 属性出し分け機能 `@required()`**</font>
    - めちゃくちゃ便利。ほぼ Blade 書かなくなったけど，このへん毎回苦労してた気がするので素晴らしい

# 感想

力尽きました。ドキュメントのほう `wip` 多すぎ…
（たかがドキュメントだし，でそうしたくなる気持ちは分かるけど）

しかし思ったよりめちゃくちゃな `wip` は少なかったのがまだ救いか。