From xonovex-skill-orthogonal-pattern
Use when deciding how to DECOMPOSE a system into modules/packages along orthogonal axes (variation points), and where each concern's boundary goes. Triggers on factoring concerns into independent axes and variants, shared-core plus per-variant leaves, package-by-feature vs package-by-layer, mirroring directory structure to the domain, naming parallel modules/siblings symmetrically, keeping two consumers (e.g. a CLI export command and a scheduled export service) symmetric, cross-cutting concerns (logging/policy/telemetry that aren't axes), aligning boundaries to domain seams, false modularity, or a tree that feels like spaghetti — even when the user doesn't say 'orthogonal'.
How this skill is triggered — by the user, by Claude, or both
Slash command
/xonovex-skill-orthogonal-pattern:orthogonal-pattern-guideThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Decompose a system into **variation points** — orthogonal **axes**, each a design decision likely to change — then realize each as interchangeable **variants** (leaves) behind a port, wired by a registry: the **microkernel (plug-in) architecture**. The directory tree and the code are two views of one model. Factoring into axes serves separation of concerns — but not every concern is an axis; so...
SOURCES.mdeval-queries.jsonevals.jsonreferences/applying-the-layout.mdreferences/boundary-alignment.mdreferences/commonality-variability.mdreferences/cross-cutting-concerns.mdreferences/finding-axes.mdreferences/modular-code.mdreferences/naming-symmetry.mdreferences/structure-isomorphism.mdreferences/variation-point-bridges.mdDecompose a system into variation points — orthogonal axes, each a design decision likely to change — then realize each as interchangeable variants (leaves) behind a port, wired by a registry: the microkernel (plug-in) architecture. The directory tree and the code are two views of one model. Factoring into axes serves separation of concerns — but not every concern is an axis; some cut across all of them.
sink/s3, not export/s3uploader), see references/naming-symmetry.mdshared-core → shared-lib → {consumer A, consumer B}, each consumer adding only its realization; keep two consumers symmetric where they share function, see references/applying-the-layout.mds3uploader, exportutil) instead of its axis is the smell — the axis is the noun, the variant is the leaf.utils/, helpers/, types/ at the root) hides the axes; package by axis and let each axis own its own types/utils/shared.BAD internal/export/s3uploader/ # s3 sink misfiled under export, tool-named leaf
internal/exportutil/ # axis utils homeless, sibling to the axis instead of inside it
internal/export/{json,s3,gzip} # 'export' names a mechanism, not the axis; mixes format + sink + compression
GOOD internal/sink/{shared,file,s3,stdout}/ # axis = sink; bare variant leaves; utils in shared/
internal/format/{shared,json,csv,parquet}/ # format is its own sibling axis
internal/compression/{shared,none,...}/ # sibling axis, sibling grammar
internal/format/parquet/zstd.go # cross-axis glue localized at the bridge that needs it
// port: the axis contract — the only thing the core depends on
type Sink interface {
Write([]byte) error
Encrypted() bool // each plugin self-declares its guarantees
}
// composition root: the ONLY place that names concrete variants
reg := Registry{Sink: map[string]Sink{
"file": file.New(), "s3": s3.New(), "stdout": stdout.New(),
}}
// adding a variant = one new leaf package + one line here; core code never changes
// cross-cutting concerns (the encryption-policy gate, telemetry, logging) are WOVEN here at
// the root over every variant — never added as a sibling axis
Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Resolves in-progress git merge or rebase conflicts by analyzing history, understanding intent, and preserving both changes where possible. Runs automated checks after resolution.
npx claudepluginhub xonovex/platform --plugin xonovex-skill-orthogonal-pattern