ハッシュタグ必須と書いても止まらない — 規定を投稿コマンドに移した

公開: 2026-11-09
開発日記AIエージェント検証TypeScript

Xとnoteへの発信には、ハッシュタグを必ず付けると決めています。 その決まりを、Claude Codeが読む手順書(スキル)と、秘書室のルールの2か所に書いていました。

今日は「必ず付けて」と改めて指示を出し、決まりを文章の外、投稿コマンドの中へ移しました。

「必須」と書いてあったのに、止める仕組みが無かった

手順書には、Xはタグ3〜4個、noteは3〜5個と書いてあります。 一方、投稿コマンドが投稿の前に見ていたのは、本文が空でないことと、文字数が上限に収まっていることの2つだけでした。

調べて分かったことは3つです。

どちらも、「必須」は文章の上にしかありませんでした。

直したのは3か所

Xは、投稿文の検証関数(validatePost)に「タグ2個未満は拒否」を足しました。 投稿が通る入口は、コマンド・管理画面・MCPサーバの3つあり、どれもこの関数を通ります。 入口ごとに検査を書くと1つ抜けるので、全部が通る場所に1回だけ置きました。

Xの投稿が通る経路コマンド(post x)管理画面(UI)MCPサーバvalidatePost空文を拒否文字数の上限(280)超えを拒否Xのタグ2個未満を拒否今回の追加通過アダプタ投稿を実行拒否して投稿しないnoteの経路post note --tags3〜5個を必須にした下書き保存公開はしないタグを出力結果の最後の行に追加手で付ける公開時に入力(未自動)
Xは3つの入口が検証関数に集まる。noteは本文にタグを書けないので、コマンドの引数で個数を縛る。朱色が今回足した部分。

下限を2個にしたのは、手順書の指定がそろっていないからです。 開発の発信の手順書は3〜4個、短いつぶやきの手順書は2〜3個。両方を満たす下限が2個でした。狙いの3〜4個は、これまでどおり手順書に残しています。

noteは、タグを本文に書けません。 そこで post note に --tags を足し、3〜5個が無いと拒否するようにしました。 タグ欄そのものはまだ自動で入力できないので、送信に成功したあと、公開設定で付けるタグを結果の最後の行に出します。

タグは文字数にも数えられます。11月3日に出したX投稿2本で測ると、タグ4個の重みは42と33でした。上限280の1割強です。

投稿済みのX投稿2本の文字数の内訳(上限280)上限2801本目日記へ1882342272本目WIKIへ200233324本文と改行URL(一律23)タグ4個上限までの余り
数字は、Xの数え方での重み。タグは全体の1割強を使う。
項目規定の文章以前の検査今回の検査Xスキルと秘書室ルールに3〜4個・2〜3個と記載なし長さと空文だけを検査2個未満は拒否3つの入口すべてでnoteスキルと秘書室ルールに3〜5個と記載なし管理メモに書いて手で付ける--tags 3〜5個が必須タグ欄の入力は手のまま
文章の規定は変えていない。変えたのは、規定を守らせる側。

数え方で一度つまずいた

タグの数え方は、最初「行頭か空白の直後にある #」としました。 ところが、自分で書いたテストの 使った(#Nextjs)。#AI。 が、空の結果を返しました。

日本語の文は、句点や括弧のすぐ後ろにタグを続けて書きます。「空白の直後」では足りませんでした。 直前の文字が、文字・数字・_・& でなければタグにする、という条件に直しました。a#b や 日本語#タグ は数えず、。#AI は数えます。

直したあとで、もう一つ気づきました。 コードのコメントに「Xの規則に合わせた」と書いていましたが、Xの規則を確かめていませんでした。

GitHubで公開されている twitter-text の定義を、原文で開きました。 直前の文字で区切る考え方は同じでしたが、同じではない点が2つありました。

X本体の今の挙動も確かめていません。コメントは、ここまでの事実に書き直しました。

既存のテストが全部対象になる

共通の関数に検査を足したので、タグの無い本文を使っていた既存のテストがすべて対象になります。 管理画面のサーバのテストでは、Xの本文8本にタグを足しました。

足し方で一点気をつけました。 予約日時が不正なケースのテストは、返ってきたHTTPステータスが400であることだけを見ています。検証関数は日時の確認より前に動くので、タグが無いままだと「タグ不足の400」で通ってしまい、日時の検査が壊れても気づけません。 本文にタグを足して、元の理由で400になる状態を保ちました。

直す前: タグの無い本文予約日時が不正本文にタグ無し検証関数タグ不足で拒否400を返す理由はタグ不足テスト合格400だけ見る日時の確認が壊れても、合格のまま直した後: タグを足した本文予約日時が不正本文にタグ有り検証関数通過400を返す理由は日時の不正テスト合格400だけ見る日時の確認が壊れたら、不合格になる
どちらも400で合格する。違うのは、400になった理由。

確かめたことと、確かめていないこと

確かめたこと:

確かめていないこと:

教訓

「必須」と書くなら、書いた場所の外に、止める仕組みを置く。

手順書は、読んだ側が従うことに頼っています。守られていたかどうかは、あとから記録を数えてみるまで分かりませんでした。 送る時点で止まる形にすれば、守られたかを数えなくて済みます。

関連する記事です。