j5ik2o/okite-ai/domain-primitives-and-always-valid
Claude Code and agent skill by j5ik2o/okite-ai
- community
Checking that the SKILL.md file is still in the repository.
Domain PrimitivesとAlways-Valid Domain Modelの設計原則に基づき、ドメインモデルの型安全性と不変条件を 保証する設計・実装を支援する。プリミティブ型の濫用を防ぎ、構築時検証・不変性・自己完結性を備えた ドメイン固有の型を設計する。コードレビュー、新規実装、リファクタリング時に使用。 対象言語: Rust, TypeScript, Java。他の言語(Kotlin, Scala, Go, Python等)にも応用可能。 トリガー:「ドメインプリミティブを作りたい」「Always-Validなモデルを設計」「プリミティブ型をラップしたい」 「構築時に検証したい」「無効な状態を型で防ぎたい」「Smart Constructorパターン」等のリクエストで起動。
Install
npx vskill@latest install j5ik2o/okite-ai/domain-primitives-and-always-validSKILL.md
Domain Primitives & Always-Valid Domain Model
プリミティブ型を信頼せず、ドメイン固有の型で不変条件を強制する。
核心原則
Domain Primitives(Secure by Design)
プリミティブ型をそのまま使わず、ドメイン固有の最小単位の型でラップする。
| 特性 | 説明 | |
|---|---|---|
| 構築時検証 | 無効な値でインスタンスを作成できない | |
| 不変(Immutable) | 一度作成されたら変更できない | |
| 自己完結 | 他のエンティティへの参照を持たない | |
| ドメイン操作の集約 | その型に関連する操作をカプセル化 | |
| 引数の取り違え防止 | 同じプリミティブ型でも異なるドメイン型として区別 |
Always-Valid Domain Model
ドメインモデルは常に有効な状態にあることを型システムで保証する。
プリミティブ型の危険性
プリミティブ型をそのまま使うと、本番環境で初めて発覚するバグを生む。
1. 無効な値がシステムを汚染する
2. 引数の取り違えがテストをすり抜ける
3. セキュリティホールを生む
4. 異なる単位の混同
なぜテストで発見できないのか
| 問題 | テストの限界 | |
|---|---|---|
| 負の金額 | 正常系テストでは正の値しか使わない | |
| 引数の順序 | 両方とも文字列なので型エラーにならない | |
| 境界値 | 全ての組み合わせをテストすることは不可能 | |
| 単位の混同 | 両方とも数値なので計算は「正しく」動く |
型で制約すれば、これらはすべてコンパイル時に検出できる。
アンチパターン検出
以下のパターンを見つけたらDomain Primitiveへの変換を検討:
引数取り違えの危険性
同じプリミティブ型の引数が複数並ぶと、コンパイラがバグを検出できない:
設計パターン
1. Smart Constructor
2. 複合値のカプセル化
3. 範囲制約型
4. NonEmpty型
判断フロー
言語別実装パターン
Rust
TypeScript
Java
レビュー観点
コードレビュー時の確認ポイント:
- プリミティブ型の露出:
String,int,f64などがドメインの概念を表現していないか - 構築時検証: コンストラクタ/ファクトリで不変条件を検証しているか
- 不変性: フィールドは
privateかつfinal/readonly/不変か - カプセル化: 内部状態へのアクセスは制限されているか(
breachEncapsulationOf命名) - ドメイン操作: 関連する操作は型に集約されているか
適用指針
推奨
- ID型(UserId, OrderId, ProductId等)
- 連絡先情報(Email, PhoneNumber, Address等)
- 金融情報(Money, Currency, Percentage等)
- 測定値(Temperature, Distance, Weight等)
- 非空コレクション(NonEmpty<T>)
過剰適用を避ける
- 一時的なローカル変数
- プライベートな内部実装の詳細
- 外部ライブラリとの境界(ただし変換層で型を適用)
プリミティブ型への変換が許容される場面
ドメイン境界を越える際は、プリミティブ型への変換が必要かつ正当である。
| 場面 | 理由 | 例 | |
|---|---|---|---|
| JSON/XMLシリアライズ | 標準フォーマットはプリミティブ型のみ | {"quantity": 5} | |
| データベース永続化 | RDBのカラム型はプリミティブ | INSERT INTO orders (quantity) VALUES (5) | |
| 外部API連携 | 外部システムはドメイン型を知らない | REST APIのリクエスト/レスポンス | |
| ログ出力 | 人間が読める形式が必要 | log::info!("注文数: {}", qty.value()) |
原則: ドメイン層内ではドメイン固有型を徹底し、境界を越える瞬間だけ変換する。
関連スキルとの使い分け
| スキル | フォーカス | 使うタイミング | |
|---|---|---|---|
| 本スキル | 型の設計と構築時検証 | 新しいドメイン型を設計するとき | |
| parse-dont-validate | 検証結果の型への変換 | validate→parse変換をレビューするとき | |
| domain-building-blocks | DDD戦術パターン全般 | エンティティ/集約/サービスの設計時 |
参考文献
- Dan Bergh Johnsson et al. "Secure by Design" - Domain Primitivesの原典
- Alexis King "Parse, don't validate" - Always-Valid原則の理論的背景
- Scott Wlaschin "Domain Modeling Made Functional" - 型駆動設計の実践
- Einar Landre "Prefer Domain-Specific Types to Primitive Types" in "97 Things Every Programmer Should Know" - コンパイラにバグを見つけさせる
関連スキル(併読推奨)
このスキルを使用する際は、以下のスキルも併せて参照すること:
parse-dont-validate: 型レベルで不変式を保証する設計哲学when-to-wrap-primitives: プリミティブ型をラップすべきかの判断基準domain-building-blocks: ドメインプリミティブが構成する値オブジェクトの設計
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/domain-primitives-and-always-valid/SKILL.md
Popularity
- Repository stars
- 74
- Repository forks
- 2
- 7-day trend score
- 22
Stars and forks are for the whole GitHub repository, not this skill alone. Refreshed 27 Mar 2026, 7 months ago.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/j5ik2o/okite-ai/domain-primitives-and-always-valid)