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

Xとnoteへの発信には、ハッシュタグを必ず付けると決めています。 その決まりを、Claude Codeが読む手順書(スキル)と、秘書室のルールの2か所に書いていました。
今日は「必ず付けて」と改めて指示を出し、決まりを文章の外、投稿コマンドの中へ移しました。
「必須」と書いてあったのに、止める仕組みが無かった
手順書には、Xはタグ3〜4個、noteは3〜5個と書いてあります。 一方、投稿コマンドが投稿の前に見ていたのは、本文が空でないことと、文字数が上限に収まっていることの2つだけでした。
調べて分かったことは3つです。
- Xの過去8回分の投稿記録(各2本)には、すべてタグの行がありました。決まりは守られていました
- ただし、守っていたのは手順書を読んで書く側で、コマンドが止めていたわけではありません。秘書室のルールには、2026-08-19にURLもタグも無い投稿を2本出した記録があります
- noteは、コマンドがタグ欄を扱えません。管理メモにタグを書いておき、公開するときに手で付ける運用でした
どちらも、「必須」は文章の上にしかありませんでした。
直したのは3か所
Xは、投稿文の検証関数(validatePost)に「タグ2個未満は拒否」を足しました。
投稿が通る入口は、コマンド・管理画面・MCPサーバの3つあり、どれもこの関数を通ります。
入口ごとに検査を書くと1つ抜けるので、全部が通る場所に1回だけ置きました。
下限を2個にしたのは、手順書の指定がそろっていないからです。 開発の発信の手順書は3〜4個、短いつぶやきの手順書は2〜3個。両方を満たす下限が2個でした。狙いの3〜4個は、これまでどおり手順書に残しています。
noteは、タグを本文に書けません。
そこで post note に --tags を足し、3〜5個が無いと拒否するようにしました。
タグ欄そのものはまだ自動で入力できないので、送信に成功したあと、公開設定で付けるタグを結果の最後の行に出します。
タグは文字数にも数えられます。11月3日に出したX投稿2本で測ると、タグ4個の重みは42と33でした。上限280の1割強です。
数え方で一度つまずいた
タグの数え方は、最初「行頭か空白の直後にある #」としました。
ところが、自分で書いたテストの 使った(#Nextjs)。#AI。 が、空の結果を返しました。
日本語の文は、句点や括弧のすぐ後ろにタグを続けて書きます。「空白の直後」では足りませんでした。
直前の文字が、文字・数字・_・& でなければタグにする、という条件に直しました。a#b や 日本語#タグ は数えず、。#AI は数えます。
直したあとで、もう一つ気づきました。 コードのコメントに「Xの規則に合わせた」と書いていましたが、Xの規則を確かめていませんでした。
GitHubで公開されている twitter-text の定義を、原文で開きました。 直前の文字で区切る考え方は同じでしたが、同じではない点が2つありました。
- twitter-text は
_のほか・や〜なども「タグの一部になる文字」として、直前にあっても境にしません。私の実装はそこまで入れていません - twitter-text は「文字を1つ以上含む」ことを求めます。私の実装は数字だけのタグを除くだけです。絵文字だけの
#🙂を、私の実装は1個と数えます。twitter-text の定義では数えないはずです(こちらは実行していません)
X本体の今の挙動も確かめていません。コメントは、ここまでの事実に書き直しました。
既存のテストが全部対象になる
共通の関数に検査を足したので、タグの無い本文を使っていた既存のテストがすべて対象になります。 管理画面のサーバのテストでは、Xの本文8本にタグを足しました。
足し方で一点気をつけました。 予約日時が不正なケースのテストは、返ってきたHTTPステータスが400であることだけを見ています。検証関数は日時の確認より前に動くので、タグが無いままだと「タグ不足の400」で通ってしまい、日時の検査が壊れても気づけません。 本文にタグを足して、元の理由で400になる状態を保ちました。
確かめたことと、確かめていないこと
確かめたこと:
- sns-appのテスト130本が通り、型検査も通った
- ビルドしたコマンドで、拒否される5通りを実行した。Xのタグ0個、noteの
--tags未指定と2個、Xでの--tags指定など。いずれも投稿やログインの確認より前で止まる
確かめていないこと:
- 成功する経路。実際に投稿してしまうので、コマンドでは動かしていない。管理画面のサーバのテストで、偽のアダプタを使って通ることだけ見ている
- noteのタグ欄への自動入力。公開設定の画面の操作を実画面で確かめておらず、下書きはコマンドから消せないので、未検証の操作を混ぜないことにした
- タグの中身。個数を数えるだけで、投稿に向かないタグは弾かない
教訓
「必須」と書くなら、書いた場所の外に、止める仕組みを置く。
手順書は、読んだ側が従うことに頼っています。守られていたかどうかは、あとから記録を数えてみるまで分かりませんでした。 送る時点で止まる形にすれば、守られたかを数えなくて済みます。
関連する記事です。
- タグ必須を機械で守る — タグの数え方の規則と、測った結果の表
- ガードが素通りする書き方 — 検査が効いていなかった3つの実例と、壊して確かめる手順
- AIに鍵を渡さず、合図1枚でmainへ — 同じく、AIの手前に置くガードの設計
- 制作物の一覧 — 作っているプロダクトの一覧