◉CLAUDE LABEN
●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り43日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Cowork
◈ Cowork/2026-10-18上級

前読みを head -150 で切っていた朝、読んだ 15.6KB のうち最新日は 3.3KB でした

日次メモの前読みを head -150 にしていた定期タスクで、行数は予算にならないと分かりました。日付ブロック単位で読む小さなリーダーと、切るときに消えやすい「まだ使っていない案」の守り方をお伝えします。

Cowork50スケジュールタスク28前読みコンテキスト8運用設計29

✦ プレミアム記事

定期タスクの前読みに head -150 と書いたのは、ファイルが肥大しても読む量は一定に保てる、という安心がほしかったからです。

ある朝、その 150 行が実際に何バイトなのか、何日ぶんなのか、そして切れ目はどこに落ちているのかを、初めて数えてみました。

日次の調査メモ(日付ごとの見出しが上から新しい順に並ぶ、26,804 バイト・244 行のファイルです)に対して、先頭 150 行は 15,619 バイトでした。全体の 58% です。そのうち、今日の判断にそのまま使うのは最新日のブロックで、3,263 バイト。読んだ量の約 21% でした。

残りの約 12.4KB は、4 日前までの記録です。必要な節もありますが、大半は「読んだけれど使わなかった」ぶんでした。

ここからは、行数で切ることの何が不安定なのか、日付ブロック単位で読む小さなリーダー、それに切り方を変えるときに私が踏みかけた落とし穴をお伝えします。個人開発の定型作業を定期タスクに任せている身として、手元のファイルで確かめた数字だけを並べます。

150 行は予算ではなく、行数でした

まず、日付ブロックごとの行数とバイト数を出して、head -N の切れ目がどこに落ちるかを見るスクリプトです。ファイルの先頭に「## YYYY-MM-DD」の見出しが日付ごとに並んでいる前提です。

#!/usr/bin/env python3
"""日付ブロックごとの行数・バイト数と、head -N の切れ目がどこに落ちるかを出す。"""
import re
import sys
 
path, head_n = sys.argv[1], int(sys.argv[2]) if len(sys.argv) > 2 else 150
lines = open(path, encoding="utf-8").read().split("\n")
 
blocks, cur = [], None
for no, line in enumerate(lines, 1):
    m = re.match(r"## (\d{4}-\d{2}-\d{2})", line)
    if m:
        cur = {"date": m.group(1), "start": no, "lines": 0, "bytes": 0}
        blocks.append(cur)
    if cur:
        cur["lines"] += 1
        cur["bytes"] += len(line.encode("utf-8")) + 1
 
for b in blocks:
    print(f'{b["date"]}  開始{b["start"]:>4}行  {b["lines"]:>3}行  {b["bytes"]:>5}B  {b["bytes"]/b["lines"]:>6.1f}B/行')
 
total = sum(len(l.encode("utf-8")) + 1 for l in lines)
got = sum(len(l.encode("utf-8")) + 1 for l in lines[:head_n])
print(f"head -{head_n}: {got}B / 全体 {total}B ({got/total:.0%})")
cut = next((b for b in reversed(blocks) if b["start"] <= head_n), None)
if cut:
    print(f'切れ目は {cut["date"]} ブロックの {head_n - cut["start"] + 1} 行目: {lines[head_n-1][:40]}')

バイト数を len(line)(文字数)でなく encode("utf-8") で数えているのは、日本語が 1 文字 3 バイトになるためです。文字数で見ると、行ごとの重さの差がほとんど見えなくなります。

私のファイルで実行した結果が、次の表です。

日付ブロック行数バイト1 行あたり
10-18(最新)313,263105.3B
10-17292,28478.8B
10-16302,53984.6B
10-15384,967130.7B
10-14384,648122.3B
10-13374,756128.5B
10-12384,195110.4B

見て驚いたのは、行数がほぼ同じでもバイト数が 2 倍以上違うことでした。10-17 は 29 行で 2,284 バイト、10-15 は 38 行で 4,967 バイトです。1 行が 78.8 バイトの日と 130.7 バイトの日があるわけです。

つまり head -150 が運んでくる量は、直近の記録が長めの行で書かれていたか、短めの行で書かれていたかで、日によって 2 倍近く揺れます。「150 行だから一定」という安心は、行の長さが一定のときにしか成り立ちません。

切れ目は、意味と関係ない場所に落ちます

もう一つ、同じスクリプトの最終行が教えてくれました。150 行目は 10-14 のブロックの 18 行目、「GA4 の取得は本日未実施」と書かれた行の直前で、節の途中でした。

4 日ぶん(10-18 から 10-15)はきれいに入り、5 日目の途中で唐突に終わります。幸い新しい日が上にあるので、今のところ必要な情報は落ちていません。ただ、これは偶然です。

節ごとの大きさも確かめておきました。全体を通して、A(一次情報)が 5,383 バイト、B(困りごと)が 6,105、C(需要)が 1,250、D(定番)が 1,106、E(期限)が 2,003、F(今日の指示)が 2,441、G(切り口案)が 6,082 バイトです。毎朝いちばん頼りにする F は全体の約 1 割で、A・B・G が重さの大半を占めています。

「どこまで読むか」を行で決めると、この重さの偏りを何も反映できません。読む単位を、メモの作り手が実際に分けている単位、つまり日付ブロックと節に合わせたほうが自然だと考え直しました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦「先頭 N 行だけ読む」という前読みの切り方が、自分のファイルで実際に何バイトを読み、どこで切れているかを、1本のスクリプトで確かめられるようになる
✦日付ごとに積み上がるメモを、最新日は全文・過去日は必要な節だけ読む形に直し、前読みのバイト数に上限を持たせられるようになる
✦古い日を落としたせいで、まだ誰も使っていない案まで一緒に消えてしまう事故を、切る前に見抜けるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ Cowork2026-10-01
定期タスクの手順書を削る前に、その一冊が何回読み直されるかを数えました
前読みの手順書を13KB削った見積もりは、再読込で数え直すと呼び出し約1.3回ぶんでした。削る前に何回読み直されるかを数える台帳と、実行中に読み込み量を残す関数をお伝えします。
◈ Cowork2026-09-16
定期タスクが動く日と動かない日があったのは、フォルダを1つ指定していたからでした
Cowork の定期タスクは既定でリモート実行ですが、手元のファイルやアプリを必要とした瞬間に端末実行へ切り替わります。作成画面の最後の一項目が実行場所を決めている仕組みと、タスクを作る前に決めておきたい三つの問いを書き残します。
◈ Cowork2026-09-05
Cowork の永続メモリは、更新日ではなく検算で鮮度を判定します
永続メモリは書いた時点の事実を無期限に主張します。無人実行がそれを疑わないまま古い置き場所を掴んだ経験から、更新日ではなく検算で鮮度を判定する仕組みを作りました。依存なしの検算ランナーと、落ちた記憶を保留として見せるローダーの実装です。