From hatch3r
Verifies 8 enhancability gates before commit or release: feature-flag adoption, config externalization, semver-versioned APIs, forward-compat headers, extension-point definition, startup config validation, ambiguity detection, and fan-out discipline.
How this skill is triggered — by the user, by Claude, or both
Slash command
/hatch3r:hatch3r-enhancability-verifyThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill defines what "done" means for any feature shipping user-visible behavior, public API changes, config schema changes, or extension-point interfaces. Run before declaring a feature complete. The 8 gates below mix automated checks (machine-checkable on every PR) with one release-cadence gate (semver bump + deprecation headers at release-cut). Skipping any gate = the feature is not done....
This skill defines what "done" means for any feature shipping user-visible behavior, public API changes, config schema changes, or extension-point interfaces. Run before declaring a feature complete. The 8 gates below mix automated checks (machine-checkable on every PR) with one release-cadence gate (semver bump + deprecation headers at release-cut). Skipping any gate = the feature is not done. Reviewer approval and passing tests alone do not satisfy this bar — a behavior change shipped without a flag commits the whole user base to the new path; a breaking change without a major bump breaks consumers silently.
Inputs the skill expects:
src/ source modules + a feature-flag client wired (OpenFeature, LaunchDarkly, Unleash, Flagsmith, Split, flagd).src/config/, Joi, Pydantic BaseSettings, envalid)..env.development, .env.staging, .env.production).openapi.yaml, openapi.json, asyncapi.yaml, GraphQL SDL) with info.version declared.flags.yaml or registry-of-record).Outputs the skill produces: an 8-line verdict block written to the PR conversation, plus a JSON artifact at .audit-workspace/enhancability-verify-<sha>.json for downstream consumption by hatch3r-release.
Before any work, scan the invocation for unresolved questions in scope, intent, acceptance criteria, target environment, or irreversibility. If any are found, ask the user via the platform-native question tool per agents/shared/user-question-protocol.md. Default path, not exception. Triggers for THIS skill: behavior change classification (new user-visible behavior vs modified API surface vs config-driven threshold change vs extension-point addition), gate selection (flag-adoption vs config-externalization vs API-versioning vs forward-compat vs full), target client audience (every consumer vs N-2 majors vs single internal caller), and irreversible-action scope (retiring a flag, dropping an endpoint, un-externalizing a previously externalized value).
Fan-out scales with task size; token cost never justifies serializing independent work (rules/hatch3r-fan-out-discipline.md P8 B2; agents/shared/efficiency-patterns.md). Emit sub_agents_spawned: { count, rationale } in your output.
This skill is the verification HARNESS — it declares HOW each enhancability gate is checked. The DISPATCHER that decides WHEN to run it is the CQ specialist agent:
agents/hatch3r-enhancability.md — invokes this skill as the closing enhancability gate (CQ9) on PRs modifying behavior, API surfaces, config schema, or extension-point interfaces. The agent contributes the review trigger and Phase-4 dispatch; this skill contributes the 8-gate procedure.No duplication: the agent decides WHEN, this skill defines HOW.
targetingKey, plus user / org / region attributes), and rollout plan attached to the PR description.grep -rnE "OpenFeature|getBooleanValue|getStringValue|getNumberValue|getObjectValue" <src> matched against the PR's behavior-change diff.flagd --offline or offlineMode: true.flags.yaml with owner, rollout schedule, retirement date.src/ paths.BaseSettings / envalid) and overrideable via env var or config file.grep -rnE "https?://|setTimeout\([0-9]{4,}|MAX_RETRIES = [0-9]+|BATCH_SIZE = [0-9]+" <src> against the externalization allow-list..env.development, .env.staging, .env.production) with parity in declared keys.rules/hatch3r-secrets-management.md).info.version in OpenAPI, version: in AsyncAPI, schema version directive in GraphQL SDL).team tier, 18 months for scaleup / enterprise per 2026 industry guidance.npx oasdiff breaking <prev-spec> <curr-spec> (REST), buf breaking --against (Protobuf), graphql-inspector diff (GraphQL); breaking change on a stable endpoint blocks merge.Deprecation header in @<unix-time> or IMF-fixdate form per RFC 9745 §2 AND a Sunset header in IMF-fixdate GMT form per RFC 8594 §3 where Sunset > Deprecation.Link: <…>; rel="deprecation" and Link: <…>; rel="sunset" reference migration docs at a stable URL.curl -sI <endpoint> | grep -iE "deprecation|sunset|link".AuthProvider, TelemetryExporter, StorageBackend, NotificationChannel).registry.register(name, impl) or DI-container binding) wires concrete implementations to the interface.## Stability block stating stable | experimental | deprecated plus the semver version at which the interface stabilized.rules/hatch3r-plugin-architecture.md), the implementation ships:
register() + resolve() methods),@Component scanning, tsyringe containers, Apache PF4J),onInit, onShutdown, optionally onConfigChange, onHealthCheck) documented in README or spec.loadConfig() throws on Zod parse error, Pydantic BaseSettings() raises ValidationError, Joi validateSync returns error, envalid cleanEnv exits process).node -e "require('./dist/config').loadConfig()" with an invalid env var injected — process must exit non-zero with a human-readable error message naming the offending field and the expected shape.pact-broker can-i-deploy --pacticipant <svc> --version <sha> exit 0) run in CI.oasdiff breaking / buf breaking / graphql-inspector diff --rule no-breaking-changes) blocks merge on breaking changes against the stable surface.x-stability: experimental in OpenAPI, @experimental directive in GraphQL SDL) and exempt; a ## Stability block in the spec declares the path to stable.All 8 gates pass = the feature is "done". Anything less = not done.
src/.info.version aligned to release tag; deprecation policy 12-18 months declared.Sunset > Deprecation ordering on retiring endpoints.The orchestrator running this skill emits a single-line verdict per gate (GATE_N: PASS|FAIL <evidence-path>) and aggregates them. One FAIL on a required gate blocks the merge regardless of reviewer approval status.
Failure escalation per agents/hatch3r-enhancability.md status mapping: Gate 1 fail (behavior change without flag) → CRITICAL; Gate 2 credential hardcoded → CRITICAL; Gate 3 semver violation → CRITICAL; Gate 4 breaking change on stable surface → CRITICAL; Gate 7 silent fallback → CRITICAL; Gate 8 missing CI gate → CRITICAL; Gates 5/6 on optional surfaces → FINDINGS.
gh pr merge on protected branches touching public API or behavior-toggle surface.D14 or D22 cycle, or whenever the maturity tier increases.rules/hatch3r-feature-flags.md — OpenFeature client wiring + flag-key inventory.rules/hatch3r-api-versioning.md — semver bumps + deprecation timeline + Sunset header policy.rules/hatch3r-api-design.md — RFC 9457 error format + spec-first mandate.rules/hatch3r-secrets-management.md — hardcoded credential ban.agents/shared/quality-charter.md §API quality + §AI feature backend.semver.org/www.rfc-editor.org/rfc/rfc9745.htmldatatracker.ietf.org/doc/html/rfc8594openfeature.dev/specification/zuplo.com/learning-center/semantic-api-versioningzuplo.com/learning-center/http-deprecation-headeroasdiff.comdocs.pact.io/npx claudepluginhub hatch3r/hatch3r --plugin hatch3rVerifies maintainability before commit/release via 8 gates: duplication index, cyclomatic complexity, expand-contract migrations, API breaking changes, ADR presence.
Pre-commit quality gate validating logic correctness, error handling, regressions, and completeness in code changes. Auto-fires before commit via cook or on large diffs.
Runs quality gates for linting, type checking, unit tests with coverage, spec compliance, and smoke checks at local/CI/deploy levels.