---
name: declaration-contract-design
description: Use when the user asks to design or refactor a declaration contract, such as a function signature, type shape, schema, or generic parameter list, and wants guidance on grouping, named vs positional elements, and stable ordering.
---

# Declaration Contract Design

Design or refactor declaration contracts using a Name plus Shape view so meaning stays explicit and the shape remains stable at use sites.

## Response Contract

- Deliverable: return the revised declaration contract.
- Chat output: no additional output beyond the deliverable.

## Skill Model

Definitions used to reason about declaration shape decisions.

### Grouping

Grouping is how a declaration organizes elements into conceptual blocks. A shape reflects the grouping decisions that were made.

### Addressing Modes

A declaration’s shape is addressed in one of two modes.

- **Named shape**
  Elements are addressed by name.

- **Positional shape**
  Elements are addressed by position.

## Standards

Each standard is defined once here and referenced elsewhere by its ID.

- **name.meaning — Name states meaning**
  Choose names that communicate domain meaning rather than implementation detail.

- **contract.core.explicit — Core meaning is explicit**
  Keep meaning-defining elements explicit in the declaration shape. Do not hide them inside unmodeled containers or convenience wrappers.

### Grouping

- **grouping.modeled_only — Grouping is a modeled concept**
  Introduce a group only when the group itself is a nameable concept with a stable semantic boundary.

- **grouping.no_catch_all — No catch-all groups**
  Do not use groups whose purpose is only to absorb leftovers or unrelated concerns.

### Positional shape

- **positional.role.anchor — Anchor role**
  Identifies the primary subject, such as a target, id, path, key.

- **positional.role.core — Core role**
  Required information that defines the primary semantic variation.

- **positional.role.policy — Policy role**
  Optional strategy and tuning that changes behavior without changing the subject.

- **positional.role.observability — Observability role**
  Diagnostics and tracing concerns.

- **positional.order.gradient — Order follows stability gradient**
  In positional shape, order elements by role: Anchor, Core, Policy, Observability.

- **positional.prefix.stable — Stable prefix discipline**
  Treat Anchor and Core as a stable prefix. After publication, do not reorder the stable prefix. Only append new positional elements at the tail.

### Callable declarations

- **callable.split — Split by role**
  When a callable uses both modes and the language supports named arguments, keep Anchor and Core in the positional segment and express Policy and Observability through named mechanisms.

- **callable.options.modeled — Options are modeled**
  If a callable introduces an options or config argument, it must be a modeled concept under `grouping.modeled_only` and must not become a catch-all under `grouping.no_catch_all`.

### Parameterized declarations

- **generics.semantic_order — Order by semantic priority**
  Order generic or type parameters by meaning: meaning-defining parameters first, constrained or defaulted parameters later, defaults at the end.

### Cross-cutting

- **conflicts.priority — Priority rule**
  When standards trade off, apply this priority order:

  1. `contract.core.explicit`
  2. `grouping.modeled_only`, `grouping.no_catch_all`
  3. `positional.order.gradient`, `positional.prefix.stable`
  4. Kind-specific standards for the declaration kind
  5. `name.meaning`

## Workflow

1. Identify the declaration kind and the meaning the contract must communicate. Apply `name.meaning` and `contract.core.explicit`.
2. Decide grouping boundaries if any. Apply `grouping.modeled_only` and `grouping.no_catch_all`.
3. Choose addressing mode for the shape or for shape segments.
4. If any segment is positional, assign roles and order by the stability gradient. Apply `positional.role.*`, `positional.order.gradient`, `positional.prefix.stable`.
5. Apply kind-specific standards.

   - Data-shape: no additional family beyond the base standards already applied.
   - Callable: apply `callable.*`.
   - Parameterized: apply `generics.*`.
6. Run acceptance checks.

## Acceptance Criteria

A revision is complete only if all checks pass.

- **Response**: Output satisfies the Response Contract.
- **Standards satisfied**:

  - Data-shape: `name.meaning`, `contract.core.explicit`, plus `grouping.*` when grouping is introduced, and `positional.*` when positional shape is used.
  - Callable: `name.meaning`, `contract.core.explicit`, `callable.*`, plus `grouping.*` when grouping is introduced, and `positional.*` when positional shape is used.
  - Parameterized: `contract.core.explicit`, `generics.*`, plus `positional.*` when positional shape is used.
  - Tradeoffs resolved by `conflicts.priority`.
