- name
- tag-maintenance
- description
- タグの親子オントロジー(source/_data/tag_ontology.yml)の整合性チェック・増分追記と、タグの名寄せ・統合の手順。タグ整理、名寄せ、タグ統合、オントロジー更新を頼まれたときに使う。
# タグメンテナンス
## 前提となる運用方針 (#2292)
- **執筆者は具体タグだけ付ける。** daisyUI の記事に CSS / UI/UX を、S3 の記事に AWS を、
React の記事に JavaScript を付けるかの判断は執筆者に求めない
(筆者がそのタグでの直接検索に引っかかりたい場合を除く)
- 抽象への接続は `source/_data/tag_ontology.yml` の `broader` が肩代わりし、
`scripts/related_posts.js` が展開して関連記事を計算する
- **バージョンタグは語幹と同義**。`Go1.27` を書けば `Go` も書いたのと同じ扱いに
なる(`scripts/version_tags.js` がデータ層で語幹タグを注入。タグページ・件数・
関連記事すべてに効く)。語幹を併記してもしなくてもよい
- **辺を書く基準**: 「A の記事に B タグを打つのは冗長で打ちたくない」と筆者が感じる
自明な包含だけ書く(TypeScript 記事に JavaScript を打ちたくない、の肩代わり)。
Swift と iOS のような文脈次第の関係は書かず、筆者が直接タグで表明する。
迷ったら書かない
- 共起・名前の形(Go1.26/Go1.27 の兄弟)から機械的に導出できる関係は
`scripts/related_tags.js` が担うので書き写さない
## データ形式
```yaml
DynamoDB:
broader: [AWS, NoSQL] # 複数可
Go:
broader: [] # 検討済みの根は [] で明示(未登録=未検討と区別)
```
- 値は実在するタグでなくてもよい(`イベント` / `OS` など照合にだけ使う概念で可)。
ただし broader に書いた名前は必ず同ファイルにノードとして登録する
- 関係タイプ(is-a / part-of)は区別しない。「より広い」だけを表す
## バージョン同義(broader とは別の意味論)
`broader` は弱い接続(関連記事で減衰あり)、バージョン同義は等価(両方書いたのと同じ)。
3層で決まる:
1. **名前規則(自動)**: 「既存タグ名 + 末尾数字(ドット付き or 2桁以上)」は語幹と同義
(`Go1.27` → `Go`、`インターン2026` → `インターン`)。1桁の数字は `Web3` のような
「数字込みで別概念の名前」と区別できないため対象外(`Python3` は語幹を直接書く)
2. **versionOf(手動追加)**: 表記が語幹と一致しないものを明示する
```yaml
Vue3:
versionOf: Vue.js # broader は書かない(同義先に吸収される)
```
3. **notVersion(手動除外)**: 名前規則に誤爆する名前が現れたら `notVersion: true` を付ける
check.mjs が導出中の全ペアを `[INFO] バージョン同義:` として列挙するので、
新しいタグを増やしたら誤爆が無いか目視する。
## 整合性チェック
```sh
node .claude/skills/tag-maintenance/check.mjs
```
- `[ERROR]`(exit 1): broader 先の未登録、循環。**push 前に必ず解消する**
- `[INFO]`: 未使用ノード、10記事以上で未登録のタグ(増分追記の候補)、
統合候補(記事集合がほぼ重複するタグのペア。オントロジーに登録済みの親子は除外済み)
補助情報として `/doctor/` ページ(ローカルビルドで生成)にもタグ・カテゴリの
機械判定一覧がある。
## 増分追記の手順
チェックの「未登録」や新しいタグを見つけたら:
1. そのタグの記事を数本読み、より広い既存概念があるか判断する
2. あれば `broader: [親]`、独立した概念なら `broader: []` で追記する
3. 迷ったら書かない([] にする)。誤った親は関連記事を汚すが、無い親は何も壊さない
4. `node .claude/skills/tag-maintenance/check.mjs` でエラーが無いことを確認する
## 名寄せ・統合の手順
チェックの「統合候補」やタグの表記ゆれ(例: 入門 / 初心者向け)を統合するとき:
1. **本当に同義か確認する。** 片方がもう片方の狭い概念なら、統合ではなく
`tag_ontology.yml` に親子として登録する(Go1.27 ⊆ Go は統合しない)
2. 同義なら残す側の表記を決め、消す側のタグを持つ全記事の frontmatter を書き換える
3. 消したタグのURLが外部から参照されている可能性があるため、`_config.yml` の
`alias:` に旧タグページ → 新タグページの転送を追記する(IaC の前例 #2291)
4. `tag_ontology.yml` に旧タグのノードが残っていれば消し、broader で参照していた
箇所を新タグに付け替える
5. 書き換えた記事は `node_modules/.bin/textlint --fix <path>` を通す
GitHubで見る