From go-linter-driven-development
FORWARD view over rules/ — domain type design and architectural planning for Go code BEFORE it exists. Use when planning new features, designing self-validating types, preventing primitive obsession, or when refactoring reveals need for new types. Dispatches into the Design guidance sections of rules/R1-R8 and R10-R12.
How this skill is triggered — by the user, by Claude, or both
Slash command
/go-linter-driven-development:code-designingThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<objective>
Backward counterpart (fixing code that already fails lint/review): @refactoring.
<skill_invocation> CRITICAL: When this skill says "Use @skill-name", you MUST invoke it with the Skill tool — do not just mention it.
| Notation | Skill Tool Call |
|---|---|
| @testing | Skill(go-linter-driven-development:testing) |
| </skill_invocation> |
<when_to_use>
argument-limit (>4 params) → design an options struct (grouping data that travels together — score it per ../../rules/R1-primitive-obsession.md)function-result-limit (>3 returns) / confusing-results → design a named result type (same R1 scoring)file-length-limit (>450 lines) → split juicy types into their own files (juiciness per R1; file-per-type per ../../rules/R5-vertical-slice.md); a single god type routes to @refactoring's god-object decomposition procedure first<package_decomposition>)<architecture_scan> and the user-OK step (acceptance was inherited when the
findings were accepted); design only the one concept the cluster names — its
type or dispatch shape (R11), constructor (R2), mutation surface (R12), and
placement (R4) — so every member finding resolves as a consequence of that one
design. Return the mini DESIGN PLAN to the caller; @refactoring implements it.
</when_to_use><architecture_scan priority="FIRST_STEP">
Default: vertical slice architecture — ../../rules/R5-vertical-slice.md.
Scan the codebase structure: vertical (internal/feature/{handler,service}.go) vs
horizontal (internal/{handlers,services}/feature.go)?
internal/<new-feature>/.docs/architecture/vertical-slice-migration.md, continue as a slice.Architecture advises, it doesn't veto (R5's advisory posture). Ask the user: Option A — vertical slice (recommended); Option B — match the existing pattern (time pressure and team conventions are valid reasons). </architecture_scan>
<understand_domain> What is the problem domain? The main concepts/entities? The invariants and rules? How does this fit the existing architecture? </understand_domain>
<maxim_interrogation>
Design happens before a diff exists — no detection command can run yet, so questions
are the tool. Interrogate the plan with ../../maxims.md (the questions live there,
once; ask them, don't restate them):
Answers shape the plan; they are never findings. Maxims propose, evidence disposes —
the review phases convict only via rules (maxims.md, contract section).
</maxim_interrogation>
<rule_dispatch> For each concept in the design, open the rule that owns the question and apply its Design guidance section:
| Rule | When designing, apply... |
|---|---|
../../rules/R1-primitive-obsession.md | Which primitives become types — score every candidate with R1's juiciness scorecard; reject ceremony wrappers (over-abstraction trap). |
../../rules/R2-self-validating-types.md | Constructor-only entry, validation ownership, trusting composed values, nil is not a value, no defensive checks in methods. |
../../rules/R3-storifying.md | Plan orchestration functions as 3–5 named steps at one conceptual level; honest names for mutators. |
../../rules/R4-helper-placement.md | WHERE each helper/type lands — the placement ladder (unexported → feature sub-package → shared domain package). |
../../rules/R5-vertical-slice.md | Package structure and naming: feature slices with roles inside, flatcase domain vocabulary, migration template. |
../../rules/R6-test-only-interfaces.md | Default dependencies to concrete types; an interface must be earned by a second production implementation or a grep-verified import cycle. |
../../rules/R7-test-placement.md | The test plan per type: leaf types 100% unit coverage via public constructors; orchestrators integration-tested over real collaborators. |
../../rules/R8-no-globals.md | Dependencies injected via constructors, ctx threaded from callers, globals only at entry points. |
../../rules/R10-concurrency-safety.md | Every planned goroutine gets an owner (stop + wait) and an exit path at construction time; shared state designed with its guard on one type — or designed away via handoff/confinement. |
../../rules/R11-conditional-dispatch.md | How each kind/variant family dispatches: behavior-heavy or open set → interface chosen once at the boundary; single-behavior variance → strategy map; single-site closed enum → one exhaustive switch (named enum per R1). |
../../rules/R12-mutation-discipline.md | Each type's mutation surface: constructors copy slice/map arguments; queries return copies or iterators, never internal references; no setters around validating constructors; query and modifier as separate methods. |
| </rule_dispatch> |
<design_checklist> Before presenting the plan, verify against the rules (cite, don't restate):
../../rules/R4-helper-placement.md)../../rules/R6-test-only-interfaces.md); otherwise depend on the concrete type<package_decomposition>)<output_format>
DESIGN PLAN
Feature: [Feature Name]
Core Domain Types (leaf):
- [Type] ([underlying]) — invariant it owns; juiciness verdict (R1)
Orchestrating Types:
- [Type] — dependencies (concrete unless R6-justified), methods
Package Structure:
[feature]/
├── [type].go # each juicy type in its own file
├── service.go
└── handler.go
Placement Decisions (R4):
- [helper/type] → rung 1/2/3 and why
Design Decisions:
- [decision] — rationale, citing the owning rule
Integration Points:
- Consumed by / depends on / events
Next Steps:
1. Create types with validating constructors
2. Write unit tests for each leaf type → use @testing skill
3. Implement orchestrators; integration tests over real collaborators
</output_format>
<success_criteria> Design phase is complete when ALL are true:
npx claudepluginhub buzzdan/ai-coding-rules --plugin go-linter-driven-developmentCreates, edits, and verifies skills using a test-driven development approach with pressure scenarios and subagents.