skills/domain-model/SKILL.md
Grill against the existing domain model. Stress-test a plan's terminology against `CONTEXT.md` and ADRs; update both inline as decisions crystallise. Trigger when user proposes a feature/refactor that touches business concepts and the project has documented domain language to honor — or when domain language is missing and needs capture.
npx skillsauth add outlinedriven/odin-codex-plugin domain-modelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Adversarial interview against the documented domain. Walk every branch of the design; resolve dependencies one decision at a time; recommend an answer per question. Ask one question per turn — wait for response before continuing.
When a question is answerable from the codebase, dispatch an Explore agent (fd-first discovery, git grep/ast-grep content search) instead of asking. The user is the source of intent; the codebase is the source of fact.
Modality vs adjacent skills: This is adversarial-relentless interview against documented domain language. Clarifying-question protocol is VS-shaped (hypothesis sampling + clarifying questions). General adversarial interview is general-purpose without domain-language anchor. Pick this skill when the project has (or needs) CONTEXT.md / ADRs as the artifact under stress-test.
Single-context repo:
/
├── CONTEXT.md
├── docs/adr/
│ ├── 0001-<decision>.md
│ └── 0002-<decision>.md
└── <source dirs>
Multi-context repo (if CONTEXT-MAP.md at root):
/
├── CONTEXT-MAP.md
├── docs/adr/ ← system-wide decisions
├── <ctx-1>/
│ ├── CONTEXT.md
│ └── docs/adr/ ← context-local decisions
└── <ctx-2>/
├── CONTEXT.md
└── docs/adr/
Create lazily — only when there is something to write. No CONTEXT.md yet? Create on first resolved term. No docs/adr/? Create on first qualified ADR (see below).
When the user uses a term that conflicts with CONTEXT.md, surface immediately:
"The glossary defines
cancellationas <X>; the current usage implies <Y>. Which is canonical?"
When a term is overloaded or vague, propose a canonical term:
"
accountis overloaded —Customer(billing entity) orUser(auth subject)? Different aggregates."
Why: vague language leaks into code as ambiguous types and misnamed modules; the cost compounds.
When domain relationships are being discussed, invent edge-case scenarios that force boundary precision. Adapt examples to the project's domain (orders / billing / scheduling / inventory etc.), not generic "users/items".
When the user states a behavior, dispatch Explore to check the code. Surface contradictions:
"The plan says partial cancellation is supported; the
Order::cancelimplementation only handles the whole-order path. Reconcile before continuing."
When a term resolves, write the entry into CONTEXT.md immediately — capture-as-it-happens, not batch-at-end. Why: batched glossary updates lose the resolution context (who said what, in response to which scenario). See references/CONTEXT-FORMAT.md.
Constraint: CONTEXT.md excludes implementation detail. Only domain-meaningful terms — no class names, no field names, no DB columns.
Open an ADR only when all three apply:
Any one missing → skip the ADR. ADR format: references/ADR-FORMAT.md.
references/ADR-FORMAT.md — ADR template, language-agnosticreferences/CONTEXT-FORMAT.md — glossary entry format, language-agnostictesting
ODIN's compress-operations dispatcher under the Compressor/Extender role. Invoke on "tidy", "clean up", "tidy this file/memory/workspace/git/docs", or when active context (current file, diff, stack, memory directory) has structural rot to resolve before touching behavior. Detects target domain from context and routes to the sibling skill. Requires explicit target or clear active-context signal — do not invoke speculatively.
development
Cross-domain taste skill — apply distinctive judgment to any artifact (prose, code, design, decisions) instead of converging to AI defaults. Two modes — `audit` (judge work against the two-sided charter and portable anchors) and `anchor` (load register before producing). Auto-detects by phrasing; override via `/taste audit | anchor`. Trigger on "is this slop?", "overkill?", "elegant?", "taste-test this".
tools
One-shot bootstrap of strict-mode tooling per ecosystem plus per-task GOALS.md scaffolding so an agentic loop can self-verify. Writes typechecker/linter/schema-validator config for TS (strict + noUncheckedIndexedAccess + exactOptionalPropertyTypes), Python (Pyright strict, Ruff strict), Rust (Clippy deny-correctness), Go (golangci-lint with staticcheck), OCaml (dune --release); establishes `.agent-tasks/<id>/GOALS.md` per-task convention distinct from project-stable AGENTS.md. C++/Java/Kotlin and framework specifics (Spring Boot, Nest, React-strict) are out of scope. Trigger on new project bootstrap, agentic-task setup, "make this self-verifying", "set the loop's goal", "scaffold goals for this issue". Pairs with `llm-self-loop` runtime.
tools
Install git pre-commit hooks via the project's hook tool — Husky+lint-staged (JS), pre-commit (Python/OCaml), lefthook (Go), cargo-husky (Rust). Use when the user wants commit-time formatting, linting, type-checking, or test gates. Detects ecosystem first.