# Provisions

## Intent

Use this generated page to resolve a provision ID to its heading, owning page, scope, conformance level, strength, and verification mark, and to read the checked share of rules for each page.

Run `litespec-maintain provisions` after any provision change. The repository validator fails when this page and the active standards disagree.

The active release states 1566 provisions in 4 groups across 6 areas.

## Checked Share by Page

| Page | Rules | Checked | Checked Share |
|:---|:---|:---|:---|
| [backend/api](https://litespec.dev/4.0.0/backend/api.md) | 28 | 1 | 4% |
| [backend/application](https://litespec.dev/4.0.0/backend/application.md) | 37 | 10 | 27% |
| [backend/architecture](https://litespec.dev/4.0.0/backend/architecture.md) | 14 | 0 | 0% |
| [backend/domain](https://litespec.dev/4.0.0/backend/domain.md) | 26 | 6 | 23% |
| [backend/dotnet/api](https://litespec.dev/4.0.0/backend/dotnet/api.md) | 5 | 1 | 20% |
| [backend/dotnet/application](https://litespec.dev/4.0.0/backend/dotnet/application.md) | 7 | 1 | 14% |
| [backend/dotnet/architecture](https://litespec.dev/4.0.0/backend/dotnet/architecture.md) | 9 | 5 | 56% |
| [backend/dotnet/config](https://litespec.dev/4.0.0/backend/dotnet/config.md) | 4 | 0 | 0% |
| [backend/dotnet/domain](https://litespec.dev/4.0.0/backend/dotnet/domain.md) | 15 | 8 | 53% |
| [backend/dotnet/ext/bdd](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md) | 11 | 0 | 0% |
| [backend/dotnet/ext/layer-projects](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md) | 7 | 0 | 0% |
| [backend/dotnet/naming](https://litespec.dev/4.0.0/backend/dotnet/naming.md) | 2 | 2 | 100% |
| [backend/dotnet/packages](https://litespec.dev/4.0.0/backend/dotnet/packages.md) | 0 | 0 | - |
| [backend/dotnet/persistence](https://litespec.dev/4.0.0/backend/dotnet/persistence.md) | 8 | 1 | 12% |
| [backend/dotnet/stack](https://litespec.dev/4.0.0/backend/dotnet/stack.md) | 10 | 8 | 80% |
| [backend/dotnet/workspace](https://litespec.dev/4.0.0/backend/dotnet/workspace.md) | 2 | 0 | 0% |
| [backend/identifiers](https://litespec.dev/4.0.0/backend/identifiers.md) | 6 | 5 | 83% |
| [backend/persistence](https://litespec.dev/4.0.0/backend/persistence.md) | 20 | 3 | 15% |
| [backend/testing](https://litespec.dev/4.0.0/backend/testing.md) | 11 | 0 | 0% |
| [core/access](https://litespec.dev/4.0.0/core/access.md) | 23 | 16 | 70% |
| [core/agent](https://litespec.dev/4.0.0/core/agent.md) | 17 | 0 | 0% |
| [core/authoring](https://litespec.dev/4.0.0/core/authoring.md) | 57 | 28 | 49% |
| [core/automation](https://litespec.dev/4.0.0/core/automation.md) | 12 | 9 | 75% |
| [core/behavior](https://litespec.dev/4.0.0/core/behavior.md) | 1 | 0 | 0% |
| [core/domain-model](https://litespec.dev/4.0.0/core/domain-model.md) | 21 | 13 | 62% |
| [core/edges](https://litespec.dev/4.0.0/core/edges.md) | 17 | 14 | 82% |
| [core/intent](https://litespec.dev/4.0.0/core/intent.md) | 39 | 29 | 74% |
| [core/language](https://litespec.dev/4.0.0/core/language.md) | 12 | 1 | 8% |
| [core/layers](https://litespec.dev/4.0.0/core/layers.md) | 10 | 4 | 40% |
| [core/maintaining](https://litespec.dev/4.0.0/core/maintaining.md) | 7 | 5 | 71% |
| [core/model](https://litespec.dev/4.0.0/core/model.md) | 44 | 33 | 75% |
| [core/principles](https://litespec.dev/4.0.0/core/principles.md) | 29 | 6 | 21% |
| [core/privacy](https://litespec.dev/4.0.0/core/privacy.md) | 15 | 2 | 13% |
| [core/release](https://litespec.dev/4.0.0/core/release.md) | 19 | 1 | 5% |
| [core/scope](https://litespec.dev/4.0.0/core/scope.md) | 12 | 6 | 50% |
| [core/scopes](https://litespec.dev/4.0.0/core/scopes.md) | 7 | 5 | 71% |
| [core/stacks](https://litespec.dev/4.0.0/core/stacks.md) | 3 | 0 | 0% |
| [core/system](https://litespec.dev/4.0.0/core/system.md) | 7 | 3 | 43% |
| [core/use-cases](https://litespec.dev/4.0.0/core/use-cases.md) | 40 | 24 | 60% |
| [core/writing](https://litespec.dev/4.0.0/core/writing.md) | 16 | 0 | 0% |
| [ext/ai](https://litespec.dev/4.0.0/ext/ai.md) | 6 | 0 | 0% |
| [ext/audit](https://litespec.dev/4.0.0/ext/audit.md) | 39 | 0 | 0% |
| [ext/automation](https://litespec.dev/4.0.0/ext/automation.md) | 7 | 0 | 0% |
| [ext/cache](https://litespec.dev/4.0.0/ext/cache.md) | 12 | 0 | 0% |
| [ext/compat](https://litespec.dev/4.0.0/ext/compat.md) | 27 | 0 | 0% |
| [ext/concurrency](https://litespec.dev/4.0.0/ext/concurrency.md) | 27 | 0 | 0% |
| [ext/delegation](https://litespec.dev/4.0.0/ext/delegation.md) | 5 | 1 | 20% |
| [ext/delivery](https://litespec.dev/4.0.0/ext/delivery.md) | 51 | 4 | 8% |
| [ext/devices](https://litespec.dev/4.0.0/ext/devices.md) | 6 | 0 | 0% |
| [ext/integrations](https://litespec.dev/4.0.0/ext/integrations.md) | 17 | 0 | 0% |
| [ext/jobs](https://litespec.dev/4.0.0/ext/jobs.md) | 63 | 3 | 5% |
| [ext/lifecycle](https://litespec.dev/4.0.0/ext/lifecycle.md) | 19 | 0 | 0% |
| [ext/locale](https://litespec.dev/4.0.0/ext/locale.md) | 14 | 0 | 0% |
| [ext/mcp](https://litespec.dev/4.0.0/ext/mcp.md) | 7 | 0 | 0% |
| [ext/outbox](https://litespec.dev/4.0.0/ext/outbox.md) | 49 | 0 | 0% |
| [ext/plans](https://litespec.dev/4.0.0/ext/plans.md) | 6 | 0 | 0% |
| [ext/stage](https://litespec.dev/4.0.0/ext/stage.md) | 3 | 2 | 67% |
| [ext/tenancy](https://litespec.dev/4.0.0/ext/tenancy.md) | 19 | 0 | 0% |
| [frontend/components](https://litespec.dev/4.0.0/frontend/components.md) | 14 | 1 | 7% |
| [frontend/data](https://litespec.dev/4.0.0/frontend/data.md) | 19 | 0 | 0% |
| [frontend/mobile/data](https://litespec.dev/4.0.0/frontend/mobile/data.md) | 5 | 0 | 0% |
| [frontend/mobile/device](https://litespec.dev/4.0.0/frontend/mobile/device.md) | 5 | 0 | 0% |
| [frontend/mobile/screens](https://litespec.dev/4.0.0/frontend/mobile/screens.md) | 8 | 0 | 0% |
| [frontend/mobile/structure](https://litespec.dev/4.0.0/frontend/mobile/structure.md) | 4 | 0 | 0% |
| [frontend/mobile/testing](https://litespec.dev/4.0.0/frontend/mobile/testing.md) | 3 | 0 | 0% |
| [frontend/patterns](https://litespec.dev/4.0.0/frontend/patterns.md) | 8 | 5 | 62% |
| [frontend/patterns/admin-screens](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md) | 2 | 0 | 0% |
| [frontend/patterns/create-edit-remove](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md) | 2 | 0 | 0% |
| [frontend/patterns/dialogs-and-overlays](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md) | 2 | 0 | 0% |
| [frontend/patterns/feedback-and-states](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md) | 2 | 0 | 0% |
| [frontend/patterns/forms-and-fields](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md) | 2 | 0 | 0% |
| [frontend/patterns/lists-and-tables](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md) | 2 | 0 | 0% |
| [frontend/patterns/money-time-density](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md) | 2 | 0 | 0% |
| [frontend/patterns/navigation](https://litespec.dev/4.0.0/frontend/patterns/navigation.md) | 2 | 0 | 0% |
| [frontend/patterns/page-frames](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md) | 2 | 0 | 0% |
| [frontend/patterns/record-detail](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md) | 3 | 1 | 33% |
| [frontend/rendering](https://litespec.dev/4.0.0/frontend/rendering.md) | 9 | 0 | 0% |
| [frontend/structure](https://litespec.dev/4.0.0/frontend/structure.md) | 11 | 1 | 9% |
| [frontend/testing](https://litespec.dev/4.0.0/frontend/testing.md) | 12 | 4 | 33% |
| [frontend/ui](https://litespec.dev/4.0.0/frontend/ui.md) | 20 | 3 | 15% |
| [frontend/web/components](https://litespec.dev/4.0.0/frontend/web/components.md) | 2 | 2 | 100% |
| [frontend/web/rendering](https://litespec.dev/4.0.0/frontend/web/rendering.md) | 1 | 0 | 0% |
| [frontend/web/structure](https://litespec.dev/4.0.0/frontend/web/structure.md) | 5 | 2 | 40% |
| [frontend/web/svelte/components](https://litespec.dev/4.0.0/frontend/web/svelte/components.md) | 1 | 1 | 100% |
| [frontend/web/testing](https://litespec.dev/4.0.0/frontend/web/testing.md) | 1 | 1 | 100% |
| [frontend/web/ui](https://litespec.dev/4.0.0/frontend/web/ui.md) | 4 | 4 | 100% |
| [quality/ci](https://litespec.dev/4.0.0/quality/ci.md) | 5 | 2 | 40% |
| [quality/operations](https://litespec.dev/4.0.0/quality/operations.md) | 14 | 4 | 29% |
| [quality/security](https://litespec.dev/4.0.0/quality/security.md) | 24 | 0 | 0% |
| [workspace/config](https://litespec.dev/4.0.0/workspace/config.md) | 6 | 0 | 0% |
| [workspace/dependencies](https://litespec.dev/4.0.0/workspace/dependencies.md) | 8 | 1 | 12% |
| [workspace/naming](https://litespec.dev/4.0.0/workspace/naming.md) | 8 | 4 | 50% |
| [workspace/structure](https://litespec.dev/4.0.0/workspace/structure.md) | 8 | 0 | 0% |

## Standard

### backend

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/backend/api#apply-only-coarse-policies-at-the-endpoint | [Apply Only Coarse Policies at the Endpoint](https://litespec.dev/4.0.0/backend/api.md#apply-only-coarse-policies-at-the-endpoint) | rule | any | web-api | endpoint | full | rule | guidance | Which endpoint policies decide target authorization instead of coarse authentication, role, or scope? Look at the endpoint policies beside the application guard. |
| litespec/backend/api#apply-patch-to-a-partial-update | [Apply PATCH to a Partial Update](https://litespec.dev/4.0.0/backend/api.md#apply-patch-to-a-partial-update) | rule | any | web-api | endpoint | full | rule | guidance | Which partial updates arrive outside PATCH with the merge-patch media type? Look at the partial update requests. |
| litespec/backend/api#authorize-every-file-download-through-its-owning-use-case | [Authorize Every File Download Through Its Owning Use Case](https://litespec.dev/4.0.0/backend/api.md#authorize-every-file-download-through-its-owning-use-case) | rule | any | web-api | endpoint | full | rule | guidance | Which stored files are reachable outside a download use case and its declared access? Look at the download endpoints and the storage addresses beside each owning use case. |
| litespec/backend/api#avoid-noise-words-in-field-names | [Avoid Noise Words in Field Names](https://litespec.dev/4.0.0/backend/api.md#avoid-noise-words-in-field-names) | convention | any | web-api | endpoint | full | default | guidance | Which field names in contract schemas carry a type prefix or noise word? Look at the field names. |
| litespec/backend/api#bound-collection-queries | [Bound Collection Queries](https://litespec.dev/4.0.0/backend/api.md#bound-collection-queries) | rule | any | web-api | endpoint | full | rule | guidance | Which collection responses lack deterministic order, or exceed the declared default or maximum limit? Look at the collection responses beside their records. |
| litespec/backend/api#bound-every-file-upload | [Bound Every File Upload](https://litespec.dev/4.0.0/backend/api.md#bound-every-file-upload) | rule | any | web-api | endpoint | full | rule | guidance | Which upload operations lack a declared size or media-type bound, or accept a file outside either bound? Look at each upload endpoint beside its use-case record. |
| litespec/backend/api#commit-the-generated-contract-its-consumers-read | [Commit the Generated Contract Its Consumers Read](https://litespec.dev/4.0.0/backend/api.md#commit-the-generated-contract-its-consumers-read) | rule | any | web-api | any | full | rule | guidance | Which frontends or external consumers read an uncommitted or stale OpenAPI artifact? Look at the committed artifact beside its consumers. |
| litespec/backend/api#declare-a-smaller-collection-maximum | [Declare a Smaller Collection Maximum](https://litespec.dev/4.0.0/backend/api.md#declare-a-smaller-collection-maximum) | convention | any | web-api | record:use-case | full | default | guidance | Which lowered collection maxima miss their value and reason on the use-case record? Look at each lowered maximum. |
| litespec/backend/api#declare-stable-operation-metadata-in-the-contract | [Declare Stable Operation Metadata in the Contract](https://litespec.dev/4.0.0/backend/api.md#declare-stable-operation-metadata-in-the-contract) | rule | any | web-api | endpoint | full | rule | guidance | Which operations in the generated contract miss operationId, authorization, request, success, failure, or summary entries? Look at the operations in the generated contract. |
| litespec/backend/api#defer-error-mapping-to-the-global-handler | [Defer Error Mapping to the Global Handler](https://litespec.dev/4.0.0/backend/api.md#defer-error-mapping-to-the-global-handler) | rule | any | web-api | endpoint | full | rule | guidance | Which endpoint bodies catch a use-case, domain, or validation failure? Look at the endpoint bodies beside the global handler. |
| litespec/backend/api#expose-development-tooling-in-development-only | [Expose Development Tooling in Development Only](https://litespec.dev/4.0.0/backend/api.md#expose-development-tooling-in-development-only) | rule | any | web-api | any | full | rule | guidance | Which hosted environments serve exploration tooling, or which Development hosts hide it? Look at the mapped endpoints in each environment. |
| litespec/backend/api#generate-the-contract-without-hosted-dependencies | [Generate the Contract Without Hosted Dependencies](https://litespec.dev/4.0.0/backend/api.md#generate-the-contract-without-hosted-dependencies) | convention | any | web-api | any | full | default | guidance | Which generation runs contact a hosted dependency, or lack a recorded answer? Look at the generation runs beside the project record. |
| litespec/backend/api#keep-endpoint-dependencies-transport-focused | [Keep Endpoint Dependencies Transport-Focused](https://litespec.dev/4.0.0/backend/api.md#keep-endpoint-dependencies-transport-focused) | rule | any | web-api | endpoint | full | rule | guidance | Which endpoint constructors take more than mediators and HTTP-boundary services? Look at the endpoint constructors in the use case folders. |
| litespec/backend/api#keep-numeric-transport-types-precise | [Keep Numeric Transport Types Precise](https://litespec.dev/4.0.0/backend/api.md#keep-numeric-transport-types-precise) | convention | any | web-api | endpoint | full | default | guidance | Which numeric fields publish outside plain schemas, or reserve the int64 union wrongly? Look at the numeric fields in the contract. |
| litespec/backend/api#keep-one-name-for-a-use-case-across-layers | [Keep One Name for a Use Case Across Layers](https://litespec.dev/4.0.0/backend/api.md#keep-one-name-for-a-use-case-across-layers) | rule | any | web-api | endpoint, use-case | full | rule | guidance | Which message types, operation ids, or audit actions carry a different name than their use case? Look at each use case's message type, operation id, and audit action. |
| litespec/backend/api#keep-routes-resource-oriented | [Keep Routes Resource-Oriented](https://litespec.dev/4.0.0/backend/api.md#keep-routes-resource-oriented) | rule | any | web-api | endpoint | full | rule | guidance | Which routes break the plural segments, kebab-case subresources, identity parameters, filter queries, or body command data? Look at the route table entries. |
| litespec/backend/api#map-one-operation-per-endpoint | [Map One Operation per Endpoint](https://litespec.dev/4.0.0/backend/api.md#map-one-operation-per-endpoint) | rule | any | web-api | endpoint | full | rule | guidance | Which mapped routes resolve outside one endpoint type with one mediator dispatch? Look at the route table beside the use case folders. |
| litespec/backend/api#mark-polymorphic-models-with-discriminators | [Mark Polymorphic Models with Discriminators](https://litespec.dev/4.0.0/backend/api.md#mark-polymorphic-models-with-discriminators) | rule | any | web-api | endpoint | full | rule | guidance | Which data-bearing sets escape the oneOf model with a required string discriminator? Look at the data-bearing sets in the contract. |
| litespec/backend/api#mirror-a-domain-closed-set-as-a-transport-model-of-the-same-shape | [Mirror a Domain Closed Set as a Transport Model of the Same Shape](https://litespec.dev/4.0.0/backend/api.md#mirror-a-domain-closed-set-as-a-transport-model-of-the-same-shape) | rule | any | web-api | endpoint | full | rule | guidance | Which transport models drop a case or its data from their Domain set? Look at each transport model beside its Domain set. |
| litespec/backend/api#model-a-monetary-value-as-one-object | [Model a Monetary Value as One Object](https://litespec.dev/4.0.0/backend/api.md#model-a-monetary-value-as-one-object) | convention | any | web-api | endpoint | full | default | guidance | Which monetary values travel outside one Money object, or carry currency where the caller has no choice? Look at the monetary fields in the contract. |
| litespec/backend/api#name-boolean-fields-as-conditions | [Name Boolean Fields as Conditions](https://litespec.dev/4.0.0/backend/api.md#name-boolean-fields-as-conditions) | convention | any | web-api | endpoint | full | default | guidance | Which boolean fields break the camel-case condition names of their code names? Look at the boolean fields in the contract. |
| litespec/backend/api#name-failure-pairs-code-and-reason | [Name Failure Pairs Code and Reason](https://litespec.dev/4.0.0/backend/api.md#name-failure-pairs-code-and-reason) | convention | any | web-api | endpoint | full | default | guidance | Which request bodies name failures outside code and reason? Look at the failure pairs in request bodies. |
| litespec/backend/api#name-path-parameters-per-resource | [Name Path Parameters per Resource](https://litespec.dev/4.0.0/backend/api.md#name-path-parameters-per-resource) | convention | any | web-api | endpoint | full | default | guidance | Which path parameters miss their own resource identity? Look at the path parameters. |
| litespec/backend/api#name-routes-from-resources | [Name Routes from Resources](https://litespec.dev/4.0.0/backend/api.md#name-routes-from-resources) | convention | any | web-api | endpoint | full | default | guidance | Which routes derive outside their resource and subresource, or carry an action segment where either fits? Look at the route table. |
| litespec/backend/api#name-the-use-case-on-every-published-operation | [Name the Use Case on Every Published Operation](https://litespec.dev/4.0.0/backend/api.md#name-the-use-case-on-every-published-operation) | rule | any | web-api | endpoint | full | rule | checkable | `litespec model check` reports `operation-use-case-drift` (level S) for an operation in the committed contract whose `x-litespec-use-case` is missing or differs from the use case its endpoint's mark names. |
| litespec/backend/api#name-time-fields-with-at | [Name Time Fields with At](https://litespec.dev/4.0.0/backend/api.md#name-time-fields-with-at) | convention | any | web-api | endpoint | full | default | guidance | Which time fields in contract schemas end outside At? Look at the time fields. |
| litespec/backend/api#name-transport-types-by-their-boundary-role | [Name Transport Types by Their Boundary Role](https://litespec.dev/4.0.0/backend/api.md#name-transport-types-by-their-boundary-role) | convention | any | web-api | endpoint | full | default | guidance | Which transport type names miss the suffix their boundary role assigns? Look at the transport type names. |
| litespec/backend/api#prove-every-upload-type-from-its-content | [Prove Every Upload Type from Its Content](https://litespec.dev/4.0.0/backend/api.md#prove-every-upload-type-from-its-content) | rule | any | web-api | endpoint | full | rule | guidance | Which upload operations trust a claimed media type or file name over the file bytes? Look at the type check of each upload endpoint beside the declared media types. |
| litespec/backend/api#publish-label-only-sets-as-string-enums | [Publish Label-Only Sets as String Enums](https://litespec.dev/4.0.0/backend/api.md#publish-label-only-sets-as-string-enums) | rule | any | web-api | endpoint | full | rule | guidance | Which label-only sets escape the string enum in the contract? Look at the label-only sets in the contract. |
| litespec/backend/api#publish-precise-complete-schemas | [Publish Precise, Complete Schemas](https://litespec.dev/4.0.0/backend/api.md#publish-precise-complete-schemas) | rule | any | web-api | endpoint | full | rule | guidance | Which contract schemas miss value sets, bounds, formats, or required control headers for a field? Look at the schemas in the generated contract. |
| litespec/backend/api#reflect-enforced-authentication-in-the-contract | [Reflect Enforced Authentication in the Contract](https://litespec.dev/4.0.0/backend/api.md#reflect-enforced-authentication-in-the-contract) | rule | any | web-api | any | full | rule | guidance | Which authenticated operations miss their security schemes and requirements in the generated contract? Look at the operations in the generated contract. |
| litespec/backend/api#reject-a-collapsed-or-borrowed-wire-contract | [Reject a Collapsed or Borrowed Wire Contract](https://litespec.dev/4.0.0/backend/api.md#reject-a-collapsed-or-borrowed-wire-contract) | rule | any | web-api | endpoint | full | rule | guidance | Which wire contracts collapse a data-bearing set into an enum or reuse a Domain or Application type? Look at each wire contract. |
| litespec/backend/api#require-the-marker-header-on-cookie-authenticated-writes | [Require the Marker Header on Cookie-Authenticated Writes](https://litespec.dev/4.0.0/backend/api.md#require-the-marker-header-on-cookie-authenticated-writes) | rule | any | web-api | any | full | rule | guidance | Which cookie-authenticated writes without the marker header escape the 401 answer? Look at the write requests with cookie authentication. |
| litespec/backend/api#return-stable-problem-details | [Return Stable Problem Details](https://litespec.dev/4.0.0/backend/api.md#return-stable-problem-details) | rule | any | web-api | any | full | rule | guidance | Which error responses miss the stable code, the traceId, or one errors entry per field failure? Look at the error responses at the API boundary. |
| litespec/backend/api#shape-command-routes-from-the-aggregate-and-the-verb | [Shape Command Routes from the Aggregate and the Verb](https://litespec.dev/4.0.0/backend/api.md#shape-command-routes-from-the-aggregate-and-the-verb) | convention | any | web-api | endpoint | full | default | guidance | Which command routes end outside their verb or carry no aggregate plural? Look at the command routes. |
| litespec/backend/api#store-every-upload-through-infrastructure | [Store Every Upload Through Infrastructure](https://litespec.dev/4.0.0/backend/api.md#store-every-upload-through-infrastructure) | rule | any | web-api | command-handler, endpoint | full | rule | guidance | Which endpoints or handlers write file bytes to a storage provider directly? Look at the upload endpoints and handlers beside the Infrastructure storage code. |
| litespec/backend/api#treat-openapi-as-a-generated-contract | [Treat OpenAPI as a Generated Contract](https://litespec.dev/4.0.0/backend/api.md#treat-openapi-as-a-generated-contract) | rule | any | web-api | any | full | rule | guidance | Which Release builds skip regenerating the OpenAPI artifact, or which contract gates pass on a changed tree? Look at the Release build output and the contract gate. |
| litespec/backend/api#use-consistent-status-codes | [Use Consistent Status Codes](https://litespec.dev/4.0.0/backend/api.md#use-consistent-status-codes) | rule | any | web-api | endpoint | full | rule | guidance | Which operation responses return a status outside the outcome table? Look at each response beside the outcome table. |
| litespec/backend/api#use-offsets-for-proven-bounded-datasets | [Use Offsets for Proven Bounded Datasets](https://litespec.dev/4.0.0/backend/api.md#use-offsets-for-proven-bounded-datasets) | convention | any | web-api | record:use-case | full | default | guidance | Which offset paging lacks the bound making it safe on the use-case record? Look at each offset-paged collection. |
| litespec/backend/api#use-opaque-cursors-for-collection-paging | [Use Opaque Cursors for Collection Paging](https://litespec.dev/4.0.0/backend/api.md#use-opaque-cursors-for-collection-paging) | rule | any | web-api | endpoint | full | rule | guidance | Which malformed cursors escape the 400 answer with code invalid-cursor? Look at the collection endpoints. |
| litespec/backend/api#use-standard-field-vocabulary | [Use Standard Field Vocabulary](https://litespec.dev/4.0.0/backend/api.md#use-standard-field-vocabulary) | convention | any | web-api | endpoint | full | default | guidance | Which fields use placed, locale, or keyName over the standard vocabulary? Look at the field names in the contract. |
| litespec/backend/api#use-this-endpoint-layout | [Use This Endpoint Layout](https://litespec.dev/4.0.0/backend/api.md#use-this-endpoint-layout) | convention | any | web-api | endpoint | full | default | guidance | Which endpoints sit outside their use case folder or the host, or which shared transport types sit outside the node `WebApi/` folders? Look at the endpoints beside the use case folders. |
| litespec/backend/api#version-cursors-with-stable-sort-values | [Version Cursors with Stable Sort Values](https://litespec.dev/4.0.0/backend/api.md#version-cursors-with-stable-sort-values) | rule | any | web-api | endpoint | full | rule | guidance | Which cursor payloads miss a version, the last sort values, or a unique tie-breaker, or leak a readable secret? Look at the cursor payloads. |
| litespec/backend/application#build-collaborators-through-the-container | [Build Collaborators Through the Container](https://litespec.dev/4.0.0/backend/application.md#build-collaborators-through-the-container) | rule | any | application | command-handler, job, query-handler, reaction | full | rule | guidance | Which handlers, jobs, or step classes hide collaborators behind `new` or take more than ten constructor dependencies? Look at each constructor the change adds. |
| litespec/backend/application#call-external-systems-through-their-ports | [Call External Systems Through Their Ports](https://litespec.dev/4.0.0/backend/application.md#call-external-systems-through-their-ports) | rule | any | application | command-handler, job, reaction | full | rule | guidance | Which `calls` effects run outside an event handler or job, bypass their port, or run before the commit? Look at each provider call beside its record's `calls` entry. |
| litespec/backend/application#declare-a-port-where-its-consumers-meet | [Declare a Port Where Its Consumers Meet](https://litespec.dev/4.0.0/backend/application.md#declare-a-port-where-its-consumers-meet) | rule | any | application | port | full | rule | guidance | Which ports sit above the lowest folder holding every consumer that names them? Look at each port beside its consumers. |
| litespec/backend/application#declare-audit-values-beside-the-message | [Declare Audit Values Beside the Message](https://litespec.dev/4.0.0/backend/application.md#declare-audit-values-beside-the-message) | rule | any | application | use-case | full | rule | checkable | `dotnet build` reports `LS2013` for a `WithTarget` or `WithReason` call on `IAuditScope` inside a command handler whose argument reads only the message. |
| litespec/backend/application#declare-every-pipeline-position-beside-the-message | [Declare Every Pipeline Position Beside the Message](https://litespec.dev/4.0.0/backend/application.md#declare-every-pipeline-position-beside-the-message) | rule | any | application | use-case | full | rule | guidance | Which messages miss a value or an exemption for a required pipeline position? Look at each message beside the baseline and selected extensions. |
| litespec/backend/application#declare-exclusive-holds-beside-the-message | [Declare Exclusive Holds Beside the Message](https://litespec.dev/4.0.0/backend/application.md#declare-exclusive-holds-beside-the-message) | rule | any | application | use-case | full | rule | guidance | Which commands needing exclusive access miss their hold key and patience beside the message? Look at each such command message. |
| litespec/backend/application#define-narrow-external-ports | [Define Narrow External Ports](https://litespec.dev/4.0.0/backend/application.md#define-narrow-external-ports) | rule | any | application | port | full | rule | guidance | Which external ports escape the public interface with a noun or verb name, one method or one purpose, and project-owned types? Look at each port declaration. |
| litespec/backend/application#dispatch-commands-and-queries-through-separate-entry-points | [Dispatch Commands and Queries Through Separate Entry Points](https://litespec.dev/4.0.0/backend/application.md#dispatch-commands-and-queries-through-separate-entry-points) | rule | any | application | command-handler, endpoint, job, reaction | full | rule | guidance | Which dispatch sites call a unified bus instead of the command or query entry point? Look at each dispatch site. |
| litespec/backend/application#dispatch-only-declared-effect-edges | [Dispatch Only Declared Effect Edges](https://litespec.dev/4.0.0/backend/application.md#dispatch-only-declared-effect-edges) | rule | any | application | command-handler, job, reaction | full | rule | checkable | `litespec model check` reports `effect-undeclared` (level S) for a dispatch a handler, event handler, or job takes that its record declares no edge for; a declared `runs`, `sends`, or `calls` edge runs after the commit, and an `emits` edge leaves as a domain event staged in the outbox. |
| litespec/backend/application#emit-declared-integration-events-after-commit | [Emit Declared Integration Events After Commit](https://litespec.dev/4.0.0/backend/application.md#emit-declared-integration-events-after-commit) | rule | any | application | aggregate | full | rule | guidance | Which `emits` effects leave outside a staged domain event in the outbox? Look at each emit beside its record's `emits` entry. |
| litespec/backend/application#enforce-target-authorization-in-the-pipeline | [Enforce Target Authorization in the Pipeline](https://litespec.dev/4.0.0/backend/application.md#enforce-target-authorization-in-the-pipeline) | rule | any | application | any | full | rule | checkable | `dotnet build` reports `LS2012` for a handler that throws a forbidden refusal or that takes the authorization guard; the guard authorizes every message from its record's `access`. |
| litespec/backend/application#expose-store-state-through-ports | [Expose Store State Through Ports](https://litespec.dev/4.0.0/backend/application.md#expose-store-state-through-ports) | rule | any | application | port | full | rule | guidance | Which `store` aggregates grow an aggregate root or bypass their owner-naming port? Look at each store aggregate's code path. |
| litespec/backend/application#implement-one-outcome-path-per-command | [Implement One Outcome Path per Command](https://litespec.dev/4.0.0/backend/application.md#implement-one-outcome-path-per-command) | rule | any | application | command-handler | full | rule | checkable | `dotnet build` reports `LS2014` for a command handler that calls a `Find` repository method and then creates the found type in the same method. |
| litespec/backend/application#issue-per-record-work-from-a-job | [Issue Per-Record Work from a Job](https://litespec.dev/4.0.0/backend/application.md#issue-per-record-work-from-a-job) | rule | any | application | job | full | rule | checkable | `dotnet build` reports `LS2015` for a command handler with a repository `Store`, `Add`, `Update` or `Delete` call inside a loop body. |
| litespec/backend/application#keep-command-handlers-to-load-call-and-stage | [Keep Command Handlers to Load, Call and Stage](https://litespec.dev/4.0.0/backend/application.md#keep-command-handlers-to-load-call-and-stage) | rule | any | application | command-handler | full | rule | guidance | Which command handlers do more than load or create one aggregate, call one method, stage it, and return? Look at each command handler body. |
| litespec/backend/application#keep-mappings-at-the-owning-boundary | [Keep Mappings at the Owning Boundary](https://litespec.dev/4.0.0/backend/application.md#keep-mappings-at-the-owning-boundary) | convention | any | application | any | full | default | guidance | Which conversions live outside the layer owning their output shape? Look at each conversion beside its output. |
| litespec/backend/application#keep-messages-immutable | [Keep Messages Immutable](https://litespec.dev/4.0.0/backend/application.md#keep-messages-immutable) | convention | any | application | use-case | full | default | guidance | Which commands, queries, results, or validation errors mutate? Look at each message declaration. |
| litespec/backend/application#keep-query-handlers-free-of-writes | [Keep Query Handlers Free of Writes](https://litespec.dev/4.0.0/backend/application.md#keep-query-handlers-free-of-writes) | rule | any | application | query-handler | full | rule | guidance | Which query handlers stage, store, delete, or dispatch? Look at each query handler body. |
| litespec/backend/application#keep-reaction-implementations-explicit | [Keep Reaction Implementations Explicit](https://litespec.dev/4.0.0/backend/application.md#keep-reaction-implementations-explicit) | rule | any | application | reaction | full | rule | guidance | Which event handlers answer outside one class with one mark in their `UseCases/On{Fact}` folder? Look at each event handler class and its mark. |
| litespec/backend/application#load-a-required-record-or-refuse-it | [Load a Required Record or Refuse It](https://litespec.dev/4.0.0/backend/application.md#load-a-required-record-or-refuse-it) | rule | any | application | command-handler, query-handler | full | rule | guidance | Which required records load through the finder, or which optional lookups throw? Look at each load call in the handlers. |
| litespec/backend/application#mirror-a-domain-closed-set-in-the-result | [Mirror a Domain Closed Set in the Result](https://litespec.dev/4.0.0/backend/application.md#mirror-a-domain-closed-set-in-the-result) | rule | any | application | use-case | full | rule | guidance | Which results carrying a Domain closed set flatten its shape or drop a case? Look at each such result beside its Domain set. |
| litespec/backend/application#model-expected-use-case-refusals-explicitly | [Model Expected Use-Case Refusals Explicitly](https://litespec.dev/4.0.0/backend/application.md#model-expected-use-case-refusals-explicitly) | rule | any | application | use-case | full | rule | guidance | Which expected refusals miss their result code or caller-safe message, or leak transport status? Look at each refusal. |
| litespec/backend/application#organize-application-by-use-case | [Organize Application by Use Case](https://litespec.dev/4.0.0/backend/application.md#organize-application-by-use-case) | rule | any | application | any | full | rule | guidance | Which commands or queries lack one use case folder inside the `UseCases/` folder of their module and aggregate with message, result, validator, handler, mapping, and pipeline-read values? Look at the folders under each module. |
| litespec/backend/application#parse-input-in-the-validator | [Parse Input in the Validator](https://litespec.dev/4.0.0/backend/application.md#parse-input-in-the-validator) | rule | any | application | validator | full | rule | guidance | Which validators leave a value object unparsed for the handler? Look at each validator beside its input. |
| litespec/backend/application#project-queries-directly | [Project Queries Directly](https://litespec.dev/4.0.0/backend/application.md#project-queries-directly) | rule | any | application | query-handler | full | rule | checkable | `dotnet build` reports `LS2011` for a query handler taking a repository; each query handler projects directly without loading an aggregate. |
| litespec/backend/application#read-no-repository-inside-a-loop | [Read No Repository Inside a Loop](https://litespec.dev/4.0.0/backend/application.md#read-no-repository-inside-a-loop) | rule | any | application | command-handler, job, query-handler | full | rule | checkable | `litespec model check` reports `repository-read-invalid` (level A) for a repository read inside a loop body. |
| litespec/backend/application#read-settings-through-typed-options | [Read Settings Through Typed Options](https://litespec.dev/4.0.0/backend/application.md#read-settings-through-typed-options) | rule | any | application | command-handler, query-handler | full | rule | guidance | Which handlers read a setting through a raw lookup instead of a typed options value or stored tenant data? Look at each setting read in the handlers. |
| litespec/backend/application#record-a-decision-for-closed-set-narrowing | [Record a Decision for Closed-Set Narrowing](https://litespec.dev/4.0.0/backend/application.md#record-a-decision-for-closed-set-narrowing) | rule | any | application | endpoint, use-case | full | rule | guidance | Which narrowed closed sets lack a recorded decision and updated specification? Look at each narrowed set beside the decision records. |
| litespec/backend/application#refuse-a-lost-race-as-a-conflict | [Refuse a Lost Race as a Conflict](https://litespec.dev/4.0.0/backend/application.md#refuse-a-lost-race-as-a-conflict) | rule | any | application | command-handler | full | rule | guidance | Which commands losing a race at commit end outside their use case conflict refusal? Look at the race outcomes beside the use case refusals. |
| litespec/backend/application#report-input-problems-as-validity-findings | [Report Input Problems as Validity Findings](https://litespec.dev/4.0.0/backend/application.md#report-input-problems-as-validity-findings) | rule | any | application | validator | full | rule | guidance | Which validators report outside validity findings, or skip member, code, or message, or leak transport status? Look at the findings each validator reports. |
| litespec/backend/application#return-only-declared-results-and-refusals | [Return Only Declared Results and Refusals](https://litespec.dev/4.0.0/backend/application.md#return-only-declared-results-and-refusals) | rule | any | application | command-handler, query-handler | full | rule | checkable | `litespec model check` reports `result-undeclared` (level S) for a code a handler produces that no declared result names; a handler returns only the results and codes its record lists. |
| litespec/backend/application#return-use-case-results | [Return Use-Case Results](https://litespec.dev/4.0.0/backend/application.md#return-use-case-results) | convention | any | application | use-case | full | default | guidance | Which Application results return more than the caller needs? Look at each result beside its caller. |
| litespec/backend/application#run-each-job-within-its-declared-selection | [Run Each Job Within Its Declared Selection](https://litespec.dev/4.0.0/backend/application.md#run-each-job-within-its-declared-selection) | rule | any | application | job | full | rule | guidance | Which scheduled or manual jobs run outside their selection, batch size, lease, or cursor? Look at each job run beside its record. |
| litespec/backend/application#run-heavy-work-as-a-request-then-a-build | [Run Heavy Work as a Request Then a Build](https://litespec.dev/4.0.0/backend/application.md#run-heavy-work-as-a-request-then-a-build) | convention | any | application | command-handler, job | full | default | guidance | Which commands assembling a large artifact skip the recorded request and building job? Look at each heavy command. |
| litespec/backend/application#send-messages-after-commit | [Send Messages After Commit](https://litespec.dev/4.0.0/backend/application.md#send-messages-after-commit) | rule | any | application | command-handler, reaction | full | rule | checkable | `litespec model check` reports `effect-timing-invalid` (level S) for a command use case declaring a `sends` or `calls` effect with `inline` timing. |
| litespec/backend/application#send-notifications-through-the-messenger-port | [Send Notifications Through the Messenger Port](https://litespec.dev/4.0.0/backend/application.md#send-notifications-through-the-messenger-port) | rule | any | application | command-handler, reaction | full | rule | guidance | Which `sends` effects run outside an event handler, bypass the messenger port, or run before the commit? Look at each send beside its record's `sends` entry. |
| litespec/backend/application#separate-input-validation-from-invariants | [Separate Input Validation from Invariants](https://litespec.dev/4.0.0/backend/application.md#separate-input-validation-from-invariants) | rule | any | application | validator | full | rule | guidance | Which validators check aggregate state instead of structural input only? Look at each validator body. |
| litespec/backend/application#shape-query-results-from-declared-output | [Shape Query Results from Declared Output](https://litespec.dev/4.0.0/backend/application.md#shape-query-results-from-declared-output) | rule | any | application | query-handler | full | rule | guidance | Which query result types miss a declared `include` group, field, freshness, or visibility? Look at each result type beside its record's `output`. |
| litespec/backend/application#take-one-timestamp-per-message | [Take One Timestamp per Message](https://litespec.dev/4.0.0/backend/application.md#take-one-timestamp-per-message) | rule | any | application | command-handler, query-handler | full | rule | guidance | Which handlers read time outside the scoped clock stamped once per message? Look at the clock reads in each handler. |
| litespec/backend/application#take-repositories-from-declared-changes-and-reads | [Take Repositories from Declared Changes and Reads](https://litespec.dev/4.0.0/backend/application.md#take-repositories-from-declared-changes-and-reads) | rule | any | application | command-handler | full | rule | checkable | `litespec model check` reports `write-undeclared` (level S) for a handler that takes a repository whose aggregate sits outside the aggregates its record names in `changes` and `reads`; one domain repository serves each named aggregate. |
| litespec/backend/application#use-this-use-case-layout | [Use This Use-Case Layout](https://litespec.dev/4.0.0/backend/application.md#use-this-use-case-layout) | convention | any | application | any | full | default | guidance | Which use-case paths, event handler folders, or result part names break the layout? Look at each path under the modules. |
| litespec/backend/application#validate-query-input | [Validate Query Input](https://litespec.dev/4.0.0/backend/application.md#validate-query-input) | rule | any | application | use-case | full | rule | guidance | Which queries with paging, filters, or ranges lack a query validator? Look at each such query beside the pipeline validators. |
| litespec/backend/architecture#compose-each-process-explicitly | [Compose Each Process Explicitly](https://litespec.dev/4.0.0/backend/architecture.md#compose-each-process-explicitly) | rule | any | application | any | full | rule | guidance | Which host entry points build a second provider or skip the Infrastructure entry point? Look at each host entry point. |
| litespec/backend/architecture#create-a-worker-project-when-background-work-needs-its-own-process | [Create a Worker Project When Background Work Needs Its Own Process](https://litespec.dev/4.0.0/backend/architecture.md#create-a-worker-project-when-background-work-needs-its-own-process) | rule | any | application | any | full | rule | guidance | Which background work needing its own process runs outside a Worker project? Look at the execution-host decision beside the solution project list. |
| litespec/backend/architecture#declare-the-execution-host-for-work-that-outlives-a-request | [Declare the Execution Host for Work That Outlives a Request](https://litespec.dev/4.0.0/backend/architecture.md#declare-the-execution-host-for-work-that-outlives-a-request) | rule | any | application | record:decision | full | rule | guidance | Which execution host runs durable dispatch, queue consumption, or scheduled work without a naming decision? Look for the decision record under `.litespec/intent/decisions/`. |
| litespec/backend/architecture#keep-business-invariants-in-domain | [Keep Business Invariants in Domain](https://litespec.dev/4.0.0/backend/architecture.md#keep-business-invariants-in-domain) | rule | any | application | aggregate, command-handler, job, query-handler, reaction, value-object | full | rule | guidance | Which state transitions or invariants run outside their aggregate or value object, or repeat in a handler? Look at the handlers beside the aggregates they call. |
| litespec/backend/architecture#keep-implementation-types-hidden | [Keep Implementation Types Hidden](https://litespec.dev/4.0.0/backend/architecture.md#keep-implementation-types-hidden) | rule | any | application | command-handler, endpoint, query-handler, reaction, repository, validator | full | rule | guidance | Which handlers, validators, definitions, persistence implementations, or endpoint implementations escape their own layer or stay open to extension? Look at the implementations in each layer. |
| litespec/backend/architecture#keep-service-registration-in-hosts | [Keep Service Registration in Hosts](https://litespec.dev/4.0.0/backend/architecture.md#keep-service-registration-in-hosts) | convention | any | application | any | full | default | guidance | Which service registration calls sit outside host entry points and host registration modules? Look at the registration calls in each layer. |
| litespec/backend/architecture#organize-code-by-module-aggregate-and-use-case | [Organize Code by Module, Aggregate and Use Case](https://litespec.dev/4.0.0/backend/architecture.md#organize-code-by-module-aggregate-and-use-case) | rule | any | application | any | full | rule | guidance | Which module, aggregate, or use case folders resolve to no declared record, use a folder name their level forbids, or carry a technical-grouping name? Look at the folder paths in each module. |
| litespec/backend/architecture#own-each-layers-contract-types | [Own Each Layer's Contract Types](https://litespec.dev/4.0.0/backend/architecture.md#own-each-layers-contract-types) | rule | any | application | any | full | rule | guidance | Which outward contracts reuse an inner layer's type outside shared-kernel values and aggregate typed identifiers? Look at the contracts in each layer's folders. |
| litespec/backend/architecture#place-a-type-at-the-lowest-folder-that-holds-its-consumers | [Place a Type at the Lowest Folder That Holds Its Consumers](https://litespec.dev/4.0.0/backend/architecture.md#place-a-type-at-the-lowest-folder-that-holds-its-consumers) | rule | any | application | any | full | rule | guidance | Which types sit above the lowest folder holding every consumer that names them? Look at each type beside its consumers, watching for Shared, Common, Util, Helpers, Core, or Misc folders. |
| litespec/backend/architecture#point-dependencies-inward | [Point Dependencies Inward](https://litespec.dev/4.0.0/backend/architecture.md#point-dependencies-inward) | rule | any | application | any | full | rule | guidance | Which references point outward, away from Domain? Look at the reference graph in the code. |
| litespec/backend/architecture#read-another-module-only-through-its-contracts | [Read Another Module Only Through Its Contracts](https://litespec.dev/4.0.0/backend/architecture.md#read-another-module-only-through-its-contracts) | rule | any | application | command-handler, port, query-handler | full | rule | guidance | Which cross-module reads bypass the owner's `Contracts/Ports/` read port or load another module's aggregate or repository? Look at the cross-module reads beside the `Contracts/` folders. |
| litespec/backend/architecture#restrict-commands-to-their-own-module-aggregates | [Restrict Commands to Their Own Module Aggregates](https://litespec.dev/4.0.0/backend/architecture.md#restrict-commands-to-their-own-module-aggregates) | rule | any | application | command-handler | full | rule | guidance | Which commands change an aggregate outside their own module instead of dispatching that module's use case? Look at each command handler beside its module. |
| litespec/backend/architecture#separate-command-and-query-behavior | [Separate Command and Query Behavior](https://litespec.dev/4.0.0/backend/architecture.md#separate-command-and-query-behavior) | rule | any | application | command-handler, query-handler | full | rule | guidance | Which commands mutate outside one aggregate or skip the domain repository, or which queries load an aggregate or write? Look at the command and query handlers in Application. |
| litespec/backend/architecture#subscribe-across-modules-only-to-integration-events | [Subscribe Across Modules Only to Integration Events](https://litespec.dev/4.0.0/backend/architecture.md#subscribe-across-modules-only-to-integration-events) | rule | any | application | reaction | full | rule | guidance | Which reactions subscribe to another module's domain event instead of its published integration event? Look at each reaction trigger beside the integration events. |
| litespec/backend/architecture#test-structural-boundaries | [Test Structural Boundaries](https://litespec.dev/4.0.0/backend/architecture.md#test-structural-boundaries) | rule | any | application | test | full | rule | guidance | Which structural boundaries have no LiteSpec analyzer or `model check` finding in the table and no architecture test, or which architecture tests repeat a boundary the table covers? Look at the architecture tests beside the analyzer and `model check` runs. |
| litespec/backend/domain#align-id-representations-at-every-boundary | [Align ID Representations at Every Boundary](https://litespec.dev/4.0.0/backend/domain.md#align-id-representations-at-every-boundary) | convention | any | domain | aggregate, state-record, value-object, domain-event | full | default | guidance | Which identifiers read as different values across Domain, persistence, transport, or generated clients? Look at one identifier in each boundary form. |
| litespec/backend/domain#call-the-marked-act-from-each-command-handler | [Call the Marked Act from Each Command Handler](https://litespec.dev/4.0.0/backend/domain.md#call-the-marked-act-from-each-command-handler) | rule | any | domain | command-handler | full | rule | checkable | `litespec model check` reports `use-case-act-missing` (level S) for a command handler changing an entity or saga aggregate that calls no root method marked with its use case. The check runs in the CLI only, with no analyzer rule: the handler and the root method sit in different projects, and one compilation sees one project. |
| litespec/backend/domain#create-valid-aggregates-through-named-factories | [Create Valid Aggregates Through Named Factories](https://litespec.dev/4.0.0/backend/domain.md#create-valid-aggregates-through-named-factories) | rule | any | domain | aggregate | full | rule | guidance | Which aggregate roots create instances outside a factory named for their business action? Look at the creation paths of each root. |
| litespec/backend/domain#declare-cross-record-keys-on-the-aggregate | [Declare Cross-Record Keys on the Aggregate](https://litespec.dev/4.0.0/backend/domain.md#declare-cross-record-keys-on-the-aggregate) | rule | any | domain | aggregate | full | rule | guidance | Which aggregates with a cross-record uniqueness rule miss `UniquenessKeys`, or carry other uniqueness code in Domain? Look at each such aggregate. |
| litespec/backend/domain#define-collection-value-semantics-explicitly | [Define Collection Value Semantics Explicitly](https://litespec.dev/4.0.0/backend/domain.md#define-collection-value-semantics-explicitly) | rule | any | domain | value-object | full | rule | guidance | Which collection values lack content equality with a matching hash under their declared ordering rule? Look at each collection value beside the module terms. |
| litespec/backend/domain#describe-every-public-domain-contract-in-documentation | [Describe Every Public Domain Contract in Documentation](https://litespec.dev/4.0.0/backend/domain.md#describe-every-public-domain-contract-in-documentation) | rule | any | domain | any | full | rule | guidance | Which public Domain types or members lack documentation of their business constraint, result, or refusal? Look at the documentation on each public member. |
| litespec/backend/domain#expose-repositories-for-one-aggregate-only | [Expose Repositories for One Aggregate Only](https://litespec.dev/4.0.0/backend/domain.md#expose-repositories-for-one-aggregate-only) | rule | any | domain | repository | full | rule | guidance | Which domain repositories serve more than one aggregate, expose non-Domain types, or offer a composable query, session, or generic CRUD surface? Look at each repository interface. |
| litespec/backend/domain#express-transitions-through-business-methods | [Express Transitions Through Business Methods](https://litespec.dev/4.0.0/backend/domain.md#express-transitions-through-business-methods) | rule | any | domain | aggregate | full | rule | guidance | Which public mutations skip the state check or the invariant, or which lifecycle moves skip replacement or the transition event? Look at the public mutation methods of each aggregate. |
| litespec/backend/domain#give-each-use-case-its-own-act | [Give Each Use Case Its Own Act](https://litespec.dev/4.0.0/backend/domain.md#give-each-use-case-its-own-act) | rule | any | domain | aggregate | full | rule | checkable | `litespec model check` reports `mark-count-invalid` (level S), and `dotnet build` reports `LS5003`, for a root method carrying more than one use-case mark; `mark-unknown` and `LS5002` report a mark on a method that changes no state. |
| litespec/backend/domain#identify-aggregates-with-strongly-typed-version-7-values | [Identify Aggregates with Strongly Typed Version 7 Values](https://litespec.dev/4.0.0/backend/domain.md#identify-aggregates-with-strongly-typed-version-7-values) | rule | any | domain | aggregate, value-object | full | rule | guidance | Which aggregate identities escape the dedicated version 7 type, or which conversions, aliases, or creation paths bypass its validation? Look at each identity type and its creation paths. |
| litespec/backend/domain#keep-binary-floating-point-out-of-exact-quantities | [Keep Binary Floating Point Out of Exact Quantities](https://litespec.dev/4.0.0/backend/domain.md#keep-binary-floating-point-out-of-exact-quantities) | rule | any | domain | value-object | full | rule | checkable | `dotnet build` reports `LS1008` for a `double` or `float` type in Domain. |
| litespec/backend/domain#keep-child-entities-inside-the-aggregate-boundary | [Keep Child Entities Inside the Aggregate Boundary](https://litespec.dev/4.0.0/backend/domain.md#keep-child-entities-inside-the-aggregate-boundary) | rule | any | domain | aggregate | full | rule | guidance | Which child entities expose mutable state outside their root? Look at the child entities beside their root, including collection views. |
| litespec/backend/domain#keep-domain-independent-of-outer-layers | [Keep Domain Independent of Outer Layers](https://litespec.dev/4.0.0/backend/domain.md#keep-domain-independent-of-outer-layers) | rule | any | domain | any | full | rule | guidance | Which Domain references reach beyond the language standard library and project-owned Domain types? Look at the references in the Domain code. |
| litespec/backend/domain#model-every-aggregate-lifecycle-with-state-types | [Model Every Aggregate Lifecycle with State Types](https://litespec.dev/4.0.0/backend/domain.md#model-every-aggregate-lifecycle-with-state-types) | rule | any | domain | state-record | full | rule | guidance | Which aggregates expose their lifecycle outside one state property and one closed hierarchy of per-state types? Look at the lifecycle declarations in each aggregate. |
| litespec/backend/domain#model-every-closed-set-of-domain-values-as-a-closed-type-hierarchy | [Model Every Closed Set of Domain Values as a Closed Type Hierarchy](https://litespec.dev/4.0.0/backend/domain.md#model-every-closed-set-of-domain-values-as-a-closed-type-hierarchy) | rule | any | domain | value-object | full | rule | guidance | Which closed sets escape one type hierarchy with named label lookups? Look at each closed set and its boundary lookups. |
| litespec/backend/domain#model-money-with-exact-decimal-values | [Model Money with Exact Decimal Values](https://litespec.dev/4.0.0/backend/domain.md#model-money-with-exact-decimal-values) | rule | any | domain | value-object | full | rule | guidance | Which monetary amounts escape the shared `Money` value with its currency and JSON shape? Look at each monetary amount in Domain. |
| litespec/backend/domain#organize-a-module-by-aggregate-and-concept | [Organize a Module by Aggregate and Concept](https://litespec.dev/4.0.0/backend/domain.md#organize-a-module-by-aggregate-and-concept) | convention | any | domain | any | full | default | checkable | `litespec model check` reports `code-placement-drift` (level S) for a domain event outside its aggregate's `Events` folder. |
| litespec/backend/domain#pass-nondeterministic-values-into-domain | [Pass Nondeterministic Values into Domain](https://litespec.dev/4.0.0/backend/domain.md#pass-nondeterministic-values-into-domain) | rule | any | domain | any | full | rule | checkable | `dotnet build` reports `LS1009` for a clock, randomness, or identifier read in Domain. |
| litespec/backend/domain#place-every-constituent-type-in-its-aggregates-folder | [Place Every Constituent Type in Its Aggregate's Folder](https://litespec.dev/4.0.0/backend/domain.md#place-every-constituent-type-in-its-aggregates-folder) | rule | any | domain | any | full | rule | checkable | `litespec model check` reports `constituent-parent-missing` (level A) for an unmarked Domain type whose folder holds no aggregate root and is not the product `Domain/` folder, and the model output lists each constituent under its aggregate. |
| litespec/backend/domain#raise-immutable-facts-as-domain-events | [Raise Immutable Facts as Domain Events](https://litespec.dev/4.0.0/backend/domain.md#raise-immutable-facts-as-domain-events) | rule | any | domain | domain-event | full | rule | guidance | Which domain events mutate, misname their aggregate or fact, or carry more than business data? Look at each domain event. |
| litespec/backend/domain#raise-the-declared-events-from-the-marked-act | [Raise the Declared Events from the Marked Act](https://litespec.dev/4.0.0/backend/domain.md#raise-the-declared-events-from-the-marked-act) | rule | any | domain | aggregate | full | rule | checkable | `litespec model check` reports `act-event-undeclared` (level S) for a marked method raising an event its use case does not list, and `act-event-unimplemented` (level S) for a listed event no marked method raises. |
| litespec/backend/domain#reference-other-aggregates-by-id | [Reference Other Aggregates by ID](https://litespec.dev/4.0.0/backend/domain.md#reference-other-aggregates-by-id) | rule | any | domain | aggregate | full | rule | guidance | Which aggregates store another aggregate as an object reference instead of a typed identifier? Look at the fields of each aggregate. |
| litespec/backend/domain#reject-business-violations-with-dedicated-refusals | [Reject Business Violations with Dedicated Refusals](https://litespec.dev/4.0.0/backend/domain.md#reject-business-violations-with-dedicated-refusals) | rule | any | domain | aggregate, value-object | full | rule | guidance | Which rejected business rules end outside a dedicated refusal with its stable code, or leak transport status? Look at each rejection beside its refusal. |
| litespec/backend/domain#reuse-the-shared-domain-contracts-across-modules | [Reuse the Shared Domain Contracts Across Modules](https://litespec.dev/4.0.0/backend/domain.md#reuse-the-shared-domain-contracts-across-modules) | convention | any | domain | any | full | default | guidance | Which shared Domain contracts repeat their declaration across modules? Look at the root, event, identity, and refusal contracts in each module. |
| litespec/backend/domain#take-identity-and-events-from-the-project-root-contract | [Take Identity and Events from the Project Root Contract](https://litespec.dev/4.0.0/backend/domain.md#take-identity-and-events-from-the-project-root-contract) | rule | any | domain | aggregate | full | rule | guidance | Which aggregate roots take identity or event mechanics outside the project-owned root contract? Look at each aggregate root declaration. |
| litespec/backend/domain#treat-aggregates-as-consistency-boundaries | [Treat Aggregates as Consistency Boundaries](https://litespec.dev/4.0.0/backend/domain.md#treat-aggregates-as-consistency-boundaries) | rule | any | domain | aggregate | full | rule | guidance | Which invariants admit a public mutation outside their aggregate root? Look at the public mutation entry points of each aggregate. |
| litespec/backend/domain#use-immutable-value-objects-for-domain-concepts | [Use Immutable Value Objects for Domain Concepts](https://litespec.dev/4.0.0/backend/domain.md#use-immutable-value-objects-for-domain-concepts) | rule | any | domain | value-object | full | rule | guidance | Which value objects mutate, compare by less than their complete value, or skip validation at creation? Look at each value object and its creation paths. |
| litespec/backend/domain#use-one-ubiquitous-language | [Use One Ubiquitous Language](https://litespec.dev/4.0.0/backend/domain.md#use-one-ubiquitous-language) | rule | any | domain | any | full | rule | guidance | Which Domain names match no term in the project glossary? Look at the Domain names beside `glossary.yaml`. |
| litespec/backend/domain#use-stateless-domain-services-for-ownerless-rules | [Use Stateless Domain Services for Ownerless Rules](https://litespec.dev/4.0.0/backend/domain.md#use-stateless-domain-services-for-ownerless-rules) | rule | any | domain | value-object | full | rule | guidance | Which domain services hold state, take non-Domain values, or reach persistence, messaging, logging, clock, authorization, or a provider? Look at each domain service and its calls. |
| litespec/backend/domain#use-these-domain-names | [Use These Domain Names](https://litespec.dev/4.0.0/backend/domain.md#use-these-domain-names) | convention | any | domain | any | full | default | guidance | Which Domain names break the cited workspace naming provisions, or which state cases break the one kept form? Look at each Domain name. |
| litespec/backend/dotnet/api#declare-operation-metadata-in-the-contract | [Declare Operation Metadata in the Contract](https://litespec.dev/4.0.0/backend/dotnet/api.md#declare-operation-metadata-in-the-contract) | rule | dotnet | web-api | endpoint | full | rule | guidance | Which operations miss a stable `operationId`, authorization, request, success, or Problem Details metadata, typed results or `Produces` entries, or a summary? Look at each operation. |
| litespec/backend/dotnet/api#derive-http-statuses-from-refusal-codes | [Derive HTTP Statuses from Refusal Codes](https://litespec.dev/4.0.0/backend/dotnet/api.md#derive-http-statuses-from-refusal-codes) | rule | dotnet | web-api | any | full | rule | guidance | Which refusal codes escape the one `IExceptionHandler`, or map outside their outcome-table status? Look at the WebApi global handler. |
| litespec/backend/dotnet/api#exclude-mvc-controllers-from-the-stack | [Exclude MVC Controllers from the Stack](https://litespec.dev/4.0.0/backend/dotnet/api.md#exclude-mvc-controllers-from-the-stack) | rule | dotnet | web-api | any | full | rule | checkable | `dotnet build` reports `LS2003` for a WebApi class deriving from `ControllerBase` or carrying `ApiController`. |
| litespec/backend/dotnet/api#keep-programcs-as-composition | [Keep Program.cs as Composition](https://litespec.dev/4.0.0/backend/dotnet/api.md#keep-programcs-as-composition) | convention | dotnet | web-api | any | full | default | guidance | Which `Program.cs` files break the recorded composition order or miss a step? Look at `Program.cs`. |
| litespec/backend/dotnet/api#mark-polymorphic-transport-models-with-discriminators | [Mark Polymorphic Transport Models with Discriminators](https://litespec.dev/4.0.0/backend/dotnet/api.md#mark-polymorphic-transport-models-with-discriminators) | rule | dotnet | web-api | endpoint | full | rule | guidance | Which data-bearing sets escape the abstract base record with one sealed record per case and the `oneOf` string discriminator? Look at each data-bearing set. |
| litespec/backend/dotnet/api#place-endpoints-in-their-use-case-folders | [Place Endpoints in Their Use Case Folders](https://litespec.dev/4.0.0/backend/dotnet/api.md#place-endpoints-in-their-use-case-folders) | convention | dotnet | web-api | endpoint | full | default | guidance | Which use case folders miss the endpoint, request and response models, or mappings named for the use case? Look at each use case folder. |
| litespec/backend/dotnet/api#use-one-endpoint-per-operation | [Use One Endpoint per Operation](https://litespec.dev/4.0.0/backend/dotnet/api.md#use-one-endpoint-per-operation) | rule | dotnet | web-api | endpoint | full | rule | guidance | Which mapped routes escape one `IEndpoint` type converting input, dispatching, and mapping the result? Look at the endpoints in the use case folders. |
| litespec/backend/dotnet/application#bind-the-pipeline-to-the-pinned-litebus-apis | [Bind the Pipeline to the Pinned LiteBus APIs](https://litespec.dev/4.0.0/backend/dotnet/application.md#bind-the-pipeline-to-the-pinned-litebus-apis) | rule | dotnet | application | any | full | rule | guidance | Which pipeline positions lack their pinned LiteBus API? Look at the command pipeline composition. |
| litespec/backend/dotnet/application#dispatch-declared-effects-through-their-entry-points | [Dispatch Declared Effects Through Their Entry Points](https://litespec.dev/4.0.0/backend/dotnet/application.md#dispatch-declared-effects-through-their-entry-points) | rule | dotnet | application | reaction, job | full | rule | checkable | `litespec model check` reports `effect-undeclared` for a dispatch no record declares; each event handler dispatches sends through the messenger port, calls through its external-system port, and runs through `ICommandMediator`, after the commit. |
| litespec/backend/dotnet/application#keep-command-handlers-to-load-call-and-stage | [Keep Command Handlers to Load, Call and Stage](https://litespec.dev/4.0.0/backend/dotnet/application.md#keep-command-handlers-to-load-call-and-stage) | rule | dotnet | application | command-handler | full | rule | guidance | Which command handlers do more than load or create one aggregate, call one domain method, stage it, and return? Look at each command handler body; `dotnet build` reports find-or-create as LS2014 and looped stores as LS2015. |
| litespec/backend/dotnet/application#keep-query-handlers-free-of-writes | [Keep Query Handlers Free of Writes](https://litespec.dev/4.0.0/backend/dotnet/application.md#keep-query-handlers-free-of-writes) | rule | dotnet | application | query-handler | full | rule | guidance | Which query handlers take a repository, skip `IQuerySession`, or stage, store, delete, or dispatch? Look at each query handler; `dotnet build` reports a repository in a query handler as LS2011. |
| litespec/backend/dotnet/application#report-input-problems-as-validity | [Report Input Problems as Validity](https://litespec.dev/4.0.0/backend/dotnet/application.md#report-input-problems-as-validity) | rule | dotnet | application | validator | full | rule | guidance | Which validators report outside `Validity`, or skip member, code, or message, or leak HTTP status? Look at each validator. |
| litespec/backend/dotnet/application#run-reactions-in-dedicated-handlers | [Run Reactions in Dedicated Handlers](https://litespec.dev/4.0.0/backend/dotnet/application.md#run-reactions-in-dedicated-handlers) | rule | dotnet | application | reaction | full | rule | guidance | Which reactions escape one handler class with their record's mark in the module `UseCases/On{Fact}` folder? Look at each reaction in its module `UseCases/` folder. |
| litespec/backend/dotnet/application#run-scheduled-jobs-as-hosted-operations | [Run Scheduled Jobs as Hosted Operations](https://litespec.dev/4.0.0/backend/dotnet/application.md#run-scheduled-jobs-as-hosted-operations) | rule | dotnet | application | job | full | rule | guidance | Which scheduled or manual jobs escape one marked hosted operation honoring selection, batch size, lease, and cursor? Look at each such job. |
| litespec/backend/dotnet/application#use-the-pinned-mediator-entry-points | [Use the Pinned Mediator Entry Points](https://litespec.dev/4.0.0/backend/dotnet/application.md#use-the-pinned-mediator-entry-points) | convention | dotnet | application | reaction, endpoint, job | full | default | guidance | Which dispatch sites bypass `ICommandMediator.SendAsync` or `IQueryMediator.QueryAsync`, or use an unpinned LiteBus version? Look at each dispatch site. |
| litespec/backend/dotnet/application#use-the-use-case-folder-layout | [Use the Use Case Folder Layout](https://litespec.dev/4.0.0/backend/dotnet/application.md#use-the-use-case-folder-layout) | convention | dotnet | application | any | full | default | guidance | Which use case folders miss message, result, validator, or handler files named for the use case, or which event handlers escape their module `UseCases/On{Fact}` folder? Look at each use case folder. |
| litespec/backend/dotnet/architecture#follow-declared-module-dependencies | [Follow Declared Module Dependencies](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#follow-declared-module-dependencies) | rule | dotnet | application | any | full | rule | guidance | Which module references name a module outside their owner dependsOn, or close a dependency cycle? Look at the cross-module references beside the module records. |
| litespec/backend/dotnet/architecture#follow-layer-direction-in-every-file | [Follow Layer Direction in Every File](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#follow-layer-direction-in-every-file) | rule | dotnet | application | any | full | rule | checkable | `dotnet build` reports `LS1001` for a Domain type naming an outer-layer type and `LS2018` for an Application or WebApi type naming a type outside its layer. |
| litespec/backend/dotnet/architecture#keep-application-types-in-their-layer-folders | [Keep Application Types in Their Layer Folders](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-application-types-in-their-layer-folders) | rule | dotnet | application | any | full | rule | guidance | Which commands queries results handlers validators or ports sit outside their Application folder or their Contracts kind folder? Look at the Application and Contracts folders beside the use case folders. |
| litespec/backend/dotnet/architecture#keep-closed-folder-sets-at-every-level | [Keep Closed Folder Sets at Every Level](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-closed-folder-sets-at-every-level) | rule | dotnet | application | any | full | rule | checkable | `litespec model check` reports `mark-folder-drift` for a folder outside its closed set or naming no declared record. |
| litespec/backend/dotnet/architecture#keep-composition-in-hosts | [Keep Composition in Hosts](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-composition-in-hosts) | convention | dotnet | application | any | full | default | guidance | Which service registration calls sit outside `Program.cs` and the host registration modules? Look at the registration calls. |
| litespec/backend/dotnet/architecture#keep-host-endpoints-in-hosts | [Keep Host Endpoints in Hosts](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-host-endpoints-in-hosts) | rule | dotnet | application | endpoint | full | rule | guidance | Which host endpoints without a handler sit outside their host project, or lack their mark? Look at the host endpoints beside the use case folders. |
| litespec/backend/dotnet/architecture#keep-implementation-types-internal | [Keep Implementation Types Internal](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-implementation-types-internal) | rule | dotnet | application | command-handler, query-handler, validator, reaction, repository, endpoint | full | rule | checkable | `dotnet build` reports `LS2001` for an implementation type that is not `internal sealed`. |
| litespec/backend/dotnet/architecture#keep-use-case-folders-isolated | [Keep Use Case Folders Isolated](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#keep-use-case-folders-isolated) | rule | dotnet | application | use-case, command-handler, query-handler, validator, endpoint, reaction | full | rule | checkable | `dotnet build` reports `LS2019` for a use case folder naming a type in another use case folder, other than one whose outermost type ends in `Command`, `Query`, `CommandResult` or `QueryResult`. |
| litespec/backend/dotnet/architecture#mirror-modules-aggregates-and-use-cases-in-one-namespace-tree | [Mirror Modules Aggregates and Use Cases in One Namespace Tree](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#mirror-modules-aggregates-and-use-cases-in-one-namespace-tree) | rule | dotnet | application | any | full | rule | guidance | Which types miss the product module aggregate use case namespace or name one outside its folder? Look at the namespaces beside the folders in the shared kernel and modules projects. |
| litespec/backend/dotnet/architecture#reach-another-module-only-through-contracts | [Reach Another Module Only Through Contracts](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#reach-another-module-only-through-contracts) | rule | dotnet | application | any | full | rule | checkable | `dotnet build` reports `LS2020` for a module reference naming another module type outside its Contracts folder. |
| litespec/backend/dotnet/architecture#separate-the-shared-kernel-from-the-modules | [Separate the Shared Kernel from the Modules](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#separate-the-shared-kernel-from-the-modules) | convention | dotnet | application | any | full | default | guidance | Which projects sit outside the shared kernel, the modules project and their hosts, and does the shared kernel reference the modules project? Look at the solution file and the project references. |
| litespec/backend/dotnet/architecture#use-one-public-assembly-marker | [Use One Public Assembly Marker](https://litespec.dev/4.0.0/backend/dotnet/architecture.md#use-one-public-assembly-marker) | convention | dotnet | application | any | full | default | guidance | Does the modules project expose one public static assembly marker, and does any other project expose one it needs not? Look at each project for its marker. |
| litespec/backend/dotnet/config#centralize-net-build-settings | [Centralize .NET Build Settings](https://litespec.dev/4.0.0/backend/dotnet/config.md#centralize-net-build-settings) | rule | dotnet | workspace | - | full | rule | guidance | Does `apps/api/Directory.Build.props` set the manifest target framework with nullable types, implicit usings, and warnings as errors? Look at that file. |
| litespec/backend/dotnet/config#centralize-nuget-versions | [Centralize NuGet Versions](https://litespec.dev/4.0.0/backend/dotnet/config.md#centralize-nuget-versions) | rule | dotnet | workspace | - | full | rule | guidance | Does `apps/api/Directory.Packages.props` enable central management with the manifest pins, and which project files carry versions? Look at the central file beside the project files. |
| litespec/backend/dotnet/config#commit-the-tool-manifest | [Commit the Tool Manifest](https://litespec.dev/4.0.0/backend/dotnet/config.md#commit-the-tool-manifest) | rule | dotnet | workspace | - | full | rule | guidance | Which local tools that a documented command invokes escape the root `.config/dotnet-tools.json` pin, including the Stryker.NET runner? Look at the tool manifest. |
| litespec/backend/dotnet/config#set-the-sdk-floor-at-the-workspace-root | [Set the SDK Floor at the Workspace Root](https://litespec.dev/4.0.0/backend/dotnet/config.md#set-the-sdk-floor-at-the-workspace-root) | rule | dotnet | workspace | - | full | rule | guidance | Does the root `global.json` set the manifest major release's first feature band with `latestFeature` roll-forward? Look at the root `global.json`. |
| litespec/backend/dotnet/domain#define-the-shared-domain-contracts-once | [Define the Shared Domain Contracts Once](https://litespec.dev/4.0.0/backend/dotnet/domain.md#define-the-shared-domain-contracts-once) | convention | dotnet | domain | any | full | default | guidance | Which shared Domain contracts repeat, or which `DomainException` or `AggregateRoot<TId>` break their declared shape? Look at the shared contracts. |
| litespec/backend/dotnet/domain#document-every-public-domain-contract | [Document Every Public Domain Contract](https://litespec.dev/4.0.0/backend/dotnet/domain.md#document-every-public-domain-contract) | rule | dotnet | domain | any | full | rule | checkable | `dotnet build` reports `LS1011` for a public Domain type or member without XML documentation. |
| litespec/backend/dotnet/domain#expose-cross-record-keys-from-the-aggregate | [Expose Cross-Record Keys from the Aggregate](https://litespec.dev/4.0.0/backend/dotnet/domain.md#expose-cross-record-keys-from-the-aggregate) | rule | dotnet | domain | aggregate | full | rule | guidance | Which aggregates with a cross-record uniqueness rule miss `UniquenessKeys`, or carry other uniqueness code in Domain? Look at each such aggregate. |
| litespec/backend/dotnet/domain#implement-domain-services-as-stateless-classes | [Implement Domain Services as Stateless Classes](https://litespec.dev/4.0.0/backend/dotnet/domain.md#implement-domain-services-as-stateless-classes) | rule | dotnet | domain | value-object | full | rule | guidance | Which domain services hold state, take non-Domain parameters, or call a provider? Look at each domain service. |
| litespec/backend/dotnet/domain#keep-domain-free-of-outer-layer-concerns | [Keep Domain Free of Outer-Layer Concerns](https://litespec.dev/4.0.0/backend/dotnet/domain.md#keep-domain-free-of-outer-layer-concerns) | rule | dotnet | domain | any | full | rule | checkable | `dotnet build` reports `LS1001` for Domain code naming an outer-layer type. |
| litespec/backend/dotnet/domain#keep-id-representations-aligned-at-every-boundary | [Keep ID Representations Aligned at Every Boundary](https://litespec.dev/4.0.0/backend/dotnet/domain.md#keep-id-representations-aligned-at-every-boundary) | convention | dotnet | domain | aggregate, state-record, value-object, domain-event | full | default | guidance | Which identifiers break the same UUID text form across Domain, persistence, transport, and client boundaries? Look at one identifier in each boundary form. |
| litespec/backend/dotnet/domain#keep-repository-interfaces-in-domain | [Keep Repository Interfaces in Domain](https://litespec.dev/4.0.0/backend/dotnet/domain.md#keep-repository-interfaces-in-domain) | rule | dotnet | domain | repository | full | rule | checkable | `dotnet build` reports `LS1010` for a repository interface exposing a query surface. |
| litespec/backend/dotnet/domain#make-money-and-decimal-rules-explicit | [Make Money and Decimal Rules Explicit](https://litespec.dev/4.0.0/backend/dotnet/domain.md#make-money-and-decimal-rules-explicit) | rule | dotnet | domain | value-object | full | rule | guidance | Which monetary amounts escape the `decimal` inside the shared `Money` object with amount and currency? Look at each monetary amount. |
| litespec/backend/dotnet/domain#model-child-entities-as-sealed-classes | [Model Child Entities as Sealed Classes](https://litespec.dev/4.0.0/backend/dotnet/domain.md#model-child-entities-as-sealed-classes) | rule | dotnet | domain | aggregate, value-object | full | rule | guidance | Which child entity declarations escape the sealed class deriving from `Entity<TId>` or creation through root methods? Look at each child entity. |
| litespec/backend/dotnet/domain#model-every-aggregate-lifecycle-with-state-records | [Model Every Aggregate Lifecycle with State Records](https://litespec.dev/4.0.0/backend/dotnet/domain.md#model-every-aggregate-lifecycle-with-state-records) | rule | dotnet | domain | state-record | full | rule | checkable | `dotnet build` reports `LS1003` for an aggregate with no `State` property, `LS1004` for a state case left unsealed, and `LS1013` for a switch that leaves a sealed state case to its discard arm. |
| litespec/backend/dotnet/domain#model-every-closed-set-of-domain-values-without-enums | [Model Every Closed Set of Domain Values Without Enums](https://litespec.dev/4.0.0/backend/dotnet/domain.md#model-every-closed-set-of-domain-values-without-enums) | rule | dotnet | domain | value-object | full | rule | checkable | `dotnet build` reports `LS1002` for an enum declared in Domain and `LS1013` for a switch that leaves a sealed case to its discard arm. |
| litespec/backend/dotnet/domain#model-value-objects-as-records | [Model Value Objects as Records](https://litespec.dev/4.0.0/backend/dotnet/domain.md#model-value-objects-as-records) | rule | dotnet | domain | value-object | full | rule | guidance | Which value objects escape the immutable record with static creation and no base type? Look at each value object. |
| litespec/backend/dotnet/domain#raise-immutable-domain-facts | [Raise Immutable Domain Facts](https://litespec.dev/4.0.0/backend/dotnet/domain.md#raise-immutable-domain-facts) | rule | dotnet | domain | domain-event | full | rule | checkable | `dotnet build` reports `LS1007` for a domain event that is not an immutable record. |
| litespec/backend/dotnet/domain#raise-the-past-tense-of-a-methods-own-verb | [Raise the Past Tense of a Method's Own Verb](https://litespec.dev/4.0.0/backend/dotnet/domain.md#raise-the-past-tense-of-a-methods-own-verb) | rule | dotnet | domain | aggregate | full | rule | guidance | Which state-changing aggregate methods raise an event named for another verb? Look at the events each changed aggregate method raises. |
| litespec/backend/dotnet/domain#reject-business-violations-with-domain-exceptions | [Reject Business Violations with Domain Exceptions](https://litespec.dev/4.0.0/backend/dotnet/domain.md#reject-business-violations-with-domain-exceptions) | rule | dotnet | domain | aggregate, value-object | full | rule | checkable | `dotnet build` reports `LS1005` for a throw outside a `DomainException` subclass and `LS1006` for a domain exception that is misnamed or open. |
| litespec/backend/dotnet/domain#use-strongly-typed-version-7-identifiers | [Use Strongly Typed Version 7 Identifiers](https://litespec.dev/4.0.0/backend/dotnet/domain.md#use-strongly-typed-version-7-identifiers) | rule | dotnet | domain | aggregate, value-object | full | rule | checkable | `dotnet build` reports `LS1012` for an `Id` struct outside the strongly typed form, or a raw `Guid` as an aggregate identity. |
| litespec/backend/dotnet/domain#use-the-domain-layer-folder-layout | [Use the Domain Layer Folder Layout](https://litespec.dev/4.0.0/backend/dotnet/domain.md#use-the-domain-layer-folder-layout) | convention | dotnet | domain | any | full | default | guidance | Which aggregate Domain folders break the states events exceptions and concepts layout, or hold a typed identifier another module names? Look at each Domain folder beside its Contracts folder. |
| litespec/backend/dotnet/domain#use-the-project-aggregate-root-contract | [Use the Project Aggregate Root Contract](https://litespec.dev/4.0.0/backend/dotnet/domain.md#use-the-project-aggregate-root-contract) | rule | dotnet | domain | aggregate | full | rule | guidance | Which aggregate root declarations escape the sealed class deriving from the project-owned `AggregateRoot<TId>`? Look at each root declaration. |
| litespec/backend/dotnet/ext/bdd#assert-observable-outcomes | [Assert Observable Outcomes](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#assert-observable-outcomes) | rule | dotnet | tests | - | full | rule | guidance | Which BDD scenarios assert no response, read, event, record, or other observable outcome? Look at each BDD scenario in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#avoid-routine-scenario-duplication | [Avoid Routine Scenario Duplication](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#avoid-routine-scenario-duplication) | rule | dotnet | tests | - | full | rule | guidance | Which unit or validation tests repeat as a duplicate BDD scenario? Look at the narrower suites beside the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#drive-public-behavior | [Drive Public Behavior](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#drive-public-behavior) | rule | dotnet | tests | - | full | rule | guidance | Which step definitions call outside the HTTP API and the declared public boundaries? Look at each step definition in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#exclude-production-internals | [Exclude Production Internals](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#exclude-production-internals) | rule | dotnet | tests | - | full | rule | guidance | Which step definitions resolve a repository, handler, session, or the production service provider? Look at each step definition in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#group-feature-files-by-module | [Group Feature Files by Module](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#group-feature-files-by-module) | convention | dotnet | tests | - | full | default | guidance | Which feature files or feature classes sit outside module folders without a documented grouping? Look at `Acceptance.Tests` beside the project documentation. |
| litespec/backend/dotnet/ext/bdd#isolate-scenario-execution | [Isolate Scenario Execution](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#isolate-scenario-execution) | rule | dotnet | tests | - | full | rule | guidance | Which scenarios fail alone or in another order, or which runs skip the state reset? Look at the acceptance suite runs. |
| litespec/backend/dotnet/ext/bdd#keep-steps-vocabulary-scoped | [Keep Steps Vocabulary-Scoped](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#keep-steps-vocabulary-scoped) | convention | dotnet | tests | - | full | default | guidance | Which reusable step sets serve more than one business vocabulary without a documented scope? Look at each reusable step set beside the project documentation. |
| litespec/backend/dotnet/ext/bdd#limit-database-assertions | [Limit Database Assertions](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#limit-database-assertions) | rule | dotnet | tests | - | full | rule | guidance | Which direct database assertions name no documented durable boundary? Look at each direct database assertion in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#limit-scenario-context | [Limit Scenario Context](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#limit-scenario-context) | convention | dotnet | tests | - | full | default | guidance | Which scenario context objects hold more than scenario state without a documented use? Look at the scenario context beside the project documentation. |
| litespec/backend/dotnet/ext/bdd#mark-pull-request-scenarios | [Mark Pull-Request Scenarios](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#mark-pull-request-scenarios) | convention | dotnet | tests | - | full | default | guidance | Which pull-request subsets grow beyond their stated bound or lose their owner? Look at the marked subset beside the proves claims. |
| litespec/backend/dotnet/ext/bdd#own-scenario-data | [Own Scenario Data](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#own-scenario-data) | rule | dotnet | tests | - | full | rule | guidance | Which BDD scenarios borrow identifiers, actor context, requests, responses, or expected state? Look at each BDD scenario in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#preserve-scenario-failures | [Preserve Scenario Failures](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#preserve-scenario-failures) | rule | dotnet | tests | - | full | rule | guidance | Which hooks skip awaiting setup or cleanup, or replace the original scenario failure? Look at each hook in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#prove-a-scenario-from-every-bdd-scenario | [Prove a Scenario from Every BDD Scenario](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#prove-a-scenario-from-every-bdd-scenario) | rule | dotnet | tests | - | full | rule | guidance | Which BDD scenarios lack one `proves` claim naming their scenario? Look at each BDD scenario in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#select-shared-critical-examples | [Select Shared Critical Examples](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#select-shared-critical-examples) | rule | dotnet | tests | - | full | rule | guidance | Which BDD scenarios trace to no cross-layer example the team discusses in business language? Look at each BDD scenario in the acceptance suite. |
| litespec/backend/dotnet/ext/bdd#translate-business-phrases | [Translate Business Phrases](https://litespec.dev/4.0.0/backend/dotnet/ext/bdd.md#translate-business-phrases) | rule | dotnet | tests | - | full | rule | guidance | Which step definitions skip the typed test-driver call? Look at each step definition in the acceptance suite. |
| litespec/backend/dotnet/ext/layer-projects#keep-application-dependencies-narrow | [Keep Application Dependencies Narrow](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#keep-application-dependencies-narrow) | rule | dotnet | application | - | full | rule | guidance | Which Application project files reference beyond the permitted abstractions and the one read boundary? Look at the Application project file. |
| litespec/backend/dotnet/ext/layer-projects#keep-domain-package-free | [Keep Domain Package-Free](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#keep-domain-package-free) | rule | dotnet | application | - | full | rule | guidance | Which Domain project files reference a package beyond the base class library? Look at the Domain project file. |
| litespec/backend/dotnet/ext/layer-projects#keep-net-production-and-test-projects-separate | [Keep .NET Production and Test Projects Separate](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#keep-net-production-and-test-projects-separate) | rule | dotnet | application | - | full | rule | guidance | Which production or test project files, or solution files, sit outside their fixed address? Look at `apps/api/`. |
| litespec/backend/dotnet/ext/layer-projects#keep-one-application-assembly | [Keep One Application Assembly](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#keep-one-application-assembly) | rule | dotnet | application | - | full | rule | guidance | Which command, query, result, validator, handler, or event handler files escape the Application project, or which cross-module contracts escape Application.Abstractions and the merged Application? Look at the Application project files beside the shared contracts. |
| litespec/backend/dotnet/ext/layer-projects#keep-the-test-projects-the-size-requires | [Keep the Test Projects the Size Requires](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#keep-the-test-projects-the-size-requires) | rule | dotnet | application | - | full | rule | guidance | Which solution trees miss Architecture or Integration test projects, or add Acceptance outside size large? Look at `apps/api/tests/` beside the declared size. |
| litespec/backend/dotnet/ext/layer-projects#mirror-modules-in-folders-and-namespaces | [Mirror Modules in Folders and Namespaces](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#mirror-modules-in-folders-and-namespaces) | rule | dotnet | application | - | full | rule | guidance | Which projects miss one folder and namespace per module, or name one outside its module? Look at the module folders and namespaces in every project. |
| litespec/backend/dotnet/ext/layer-projects#run-litespecanalyzers-in-every-application-project | [Run LiteSpec.Analyzers in Every Application Project](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#run-litespecanalyzers-in-every-application-project) | convention | dotnet | application | - | full | default | guidance | Which layer project files miss `LiteSpec.Analyzers` at the manifest pin with `PrivateAssets="all"`? Look at each layer project file. |
| litespec/backend/dotnet/ext/layer-projects#use-five-application-projects | [Use Five Application Projects](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-five-application-projects) | convention | dotnet | application | - | full | default | guidance | Which projects sit outside the five baseline projects, the merged small layout, or the allowed hosts and Worker? Look at the solution file beside the declared project size. |
| litespec/backend/dotnet/ext/layer-projects#use-the-domain-module-layout | [Use the Domain Module Layout](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-the-domain-module-layout) | convention | dotnet | application | - | full | default | guidance | Which Domain module folders break the one plural folder per aggregate with states, events, exceptions, and concepts? Look at each module folder. |
| litespec/backend/dotnet/ext/layer-projects#use-the-endpoint-folder-layout | [Use the Endpoint Folder Layout](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-the-endpoint-folder-layout) | convention | dotnet | application | - | full | default | guidance | Which endpoint folders miss the endpoint, request and response models, or mappings named for the use case? Look at each endpoint folder. |
| litespec/backend/dotnet/ext/layer-projects#use-the-operation-folder-layout | [Use the Operation Folder Layout](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-the-operation-folder-layout) | convention | dotnet | application | - | full | default | guidance | Which operation folders miss message, result, validator, or handler files named for the use case, or which event handlers escape their `On{Fact}` folder? Look at each operation folder. |
| litespec/backend/dotnet/ext/layer-projects#use-the-project-reference-graph | [Use the Project Reference Graph](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-the-project-reference-graph) | rule | dotnet | application | - | full | rule | guidance | Which project files add a reference outside the permitted edges of the graph table? Look at each project file beside the graph table. |
| litespec/backend/dotnet/ext/layer-projects#use-this-baseline-package-ownership | [Use This Baseline Package Ownership](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-this-baseline-package-ownership) | convention | dotnet | application | - | full | default | guidance | Which baseline package references sit outside the project the ownership table assigns? Look at each package reference beside the ownership table. |
| litespec/backend/dotnet/ext/layer-projects#use-this-infrastructure-layout | [Use This Infrastructure Layout](https://litespec.dev/4.0.0/backend/dotnet/ext/layer-projects.md#use-this-infrastructure-layout) | convention | dotnet | application | - | full | default | guidance | Which Marten configuration, repository, commit, or serialization files sit outside the one Infrastructure persistence folder? Look at the persistence files. |
| litespec/backend/dotnet/naming#keep-implementation-style-consistent | [Keep Implementation Style Consistent](https://litespec.dev/4.0.0/backend/dotnet/naming.md#keep-implementation-style-consistent) | rule | dotnet | workspace | - | full | rule | checkable | `dotnet build` reports `LS3004` for a concrete class with no derived type that is not sealed. |
| litespec/backend/dotnet/naming#match-c-files-and-primary-types | [Match C# Files and Primary Types](https://litespec.dev/4.0.0/backend/dotnet/naming.md#match-c-files-and-primary-types) | rule | dotnet | workspace | - | full | rule | checkable | `dotnet build` reports `SA1649` for a C# file whose name differs from its primary type. |
| litespec/backend/dotnet/naming#name-no-folder-or-type-for-the-absence-of-a-reason | [Name No Folder or Type for the Absence of a Reason](https://litespec.dev/4.0.0/backend/dotnet/naming.md#name-no-folder-or-type-for-the-absence-of-a-reason) | convention | dotnet | workspace | - | full | default | checkable | `litespec model check` reports `name-reason-missing` (level S) for a folder or type named for the absence of a reason outside the declared shared kernel. |
| litespec/backend/dotnet/packages#raise-the-litebus-handler-analyzers-to-errors | [Raise the LiteBus Handler Analyzers to Errors](https://litespec.dev/4.0.0/backend/dotnet/packages.md#raise-the-litebus-handler-analyzers-to-errors) | convention | dotnet | workspace | - | full | default | guidance | Does `.editorconfig` set `LB1023` and `LB1024` to error and list `litebus.LB1024.forbidden_types`? Look at `.editorconfig`. |
| litespec/backend/dotnet/packages#reference-only-the-litebus-module-required | [Reference Only the LiteBus Module Required](https://litespec.dev/4.0.0/backend/dotnet/packages.md#reference-only-the-litebus-module-required) | convention | dotnet | workspace | - | full | default | guidance | Which project files reference a LiteBus module their code never dispatches? Look at each project file. |
| litespec/backend/dotnet/packages#run-litespec-analyzers-in-the-business-projects-and-hosts | [Run LiteSpec Analyzers in the Business Projects and Hosts](https://litespec.dev/4.0.0/backend/dotnet/packages.md#run-litespec-analyzers-in-the-business-projects-and-hosts) | convention | dotnet | workspace | - | full | default | guidance | Which shared kernel, modules, or host project files miss `LiteSpec.Analyzers` at the manifest pin with `PrivateAssets="all"`? Look at each business and host project file. |
| litespec/backend/dotnet/persistence#apply-optimistic-concurrency-to-every-aggregate-document | [Apply Optimistic Concurrency to Every Aggregate Document](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#apply-optimistic-concurrency-to-every-aggregate-document) | rule | dotnet | infrastructure | aggregate | full | rule | guidance | Which Marten aggregate document types skip optimistic concurrency? Look at each document type and the document policy. |
| litespec/backend/dotnet/persistence#claim-cross-record-keys-with-a-claims-document | [Claim Cross-Record Keys with a Claims Document](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#claim-cross-record-keys-with-a-claims-document) | rule | dotnet | infrastructure | repository | full | rule | guidance | Which cross-record keys bypass the claims document with `session.Insert`, or use `Store` on the claims type? Look at each key claim. |
| litespec/backend/dotnet/persistence#commit-once-in-the-command-pipeline | [Commit Once in the Command Pipeline](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#commit-once-in-the-command-pipeline) | rule | dotnet | infrastructure | any | full | rule | guidance | Which pipelines commit outside one post-handler file calling `SaveChangesAsync`? Look at the `SaveChangesAsync` calls in each pipeline. |
| litespec/backend/dotnet/persistence#enforce-uniqueness-with-marten-unique-indexes | [Enforce Uniqueness with Marten Unique Indexes](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#enforce-uniqueness-with-marten-unique-indexes) | rule | dotnet | infrastructure | aggregate | full | rule | guidance | Which Marten aggregate documents with a uniqueness rule lack a unique index or an owner-derived identity? Look at the store configuration. |
| litespec/backend/dotnet/persistence#map-constraint-violations-with-the-postgresql-refusal-classifier | [Map Constraint Violations with the PostgreSQL Refusal Classifier](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#map-constraint-violations-with-the-postgresql-refusal-classifier) | rule | dotnet | infrastructure | any | full | rule | guidance | Which unique index names lack a conflict refusal code in the PostgreSQL refusal classifier? Look at the service registration. |
| litespec/backend/dotnet/persistence#map-marten-concurrency-faults-to-conflict-refusals | [Map Marten Concurrency Faults to Conflict Refusals](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#map-marten-concurrency-faults-to-conflict-refusals) | rule | dotnet | infrastructure | any | full | rule | guidance | Which `ConcurrencyException` paths at commit escape the use case conflict refusal? Look at the registered classifier. |
| litespec/backend/dotnet/persistence#query-through-iquerysession | [Query Through IQuerySession](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#query-through-iquerysession) | rule | dotnet | infrastructure | query-handler | full | rule | guidance | Which query handlers project outside `IQuerySession`, or apply filter, scope, ordering, or limit after materialization? Look at each query handler file. |
| litespec/backend/dotnet/persistence#register-one-scoped-session | [Register One Scoped Session](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#register-one-scoped-session) | convention | dotnet | infrastructure | any | full | default | guidance | Does the service registration wire `IDocumentSession` once per WebApi request or Worker operation scope? Look at the service registration. |
| litespec/backend/dotnet/persistence#stage-aggregate-writes-through-repositories | [Stage Aggregate Writes Through Repositories](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#stage-aggregate-writes-through-repositories) | rule | dotnet | infrastructure | command-handler | full | rule | checkable | `dotnet build` reports `LS2004` for a command handler writing through a document session or database context. |
| litespec/backend/dotnet/persistence#use-the-persistence-layer-folder-layout | [Use the Persistence Layer Folder Layout](https://litespec.dev/4.0.0/backend/dotnet/persistence.md#use-the-persistence-layer-folder-layout) | convention | dotnet | infrastructure | any | full | default | guidance | Which Marten configuration, repository, commit, or serialization files sit outside their shared kernel or module Infrastructure folder? Look at the persistence files. |
| litespec/backend/dotnet/stack#declare-dotnet-as-the-backend-stack | [Declare `dotnet` as the Backend Stack](../backend/dotnet/stack.md#declare-dotnet-as-the-backend-stack) | rule | dotnet | records | - | full | rule | guidance | Does the `stacks` array in `.litespec/project.json` list `dotnet` when the backend runs on .NET? Look at `.litespec/project.json`. |
| litespec/backend/dotnet/stack#declare-marked-events-and-exceptions-as-partial-types | [Declare Marked Events and Exceptions as Partial Types](https://litespec.dev/4.0.0/backend/dotnet/stack.md#declare-marked-events-and-exceptions-as-partial-types) | rule | dotnet | records | - | full | rule | checkable | `dotnet build` reports `LS5006` for a marked domain event or rule exception that is not `partial`, in every project that references the analyzer package. |
| litespec/backend/dotnet/stack#generate-runtime-values-from-the-records | [Generate Runtime Values from the Records](https://litespec.dev/4.0.0/backend/dotnet/stack.md#generate-runtime-values-from-the-records) | rule | dotnet | records | - | full | rule | checkable | `litespec model check` reports `runtime-value-drift` (level S) for a hand-written value that differs from its record, and `dotnet build` reports `LS5005` for the same value. |
| litespec/backend/dotnet/stack#generate-the-registry-permissions-and-roles-from-the-records | [Generate the Registry, Permissions, and Roles from the Records](https://litespec.dev/4.0.0/backend/dotnet/stack.md#generate-the-registry-permissions-and-roles-from-the-records) | rule | dotnet | records | - | full | rule | checkable | `dotnet build` reports `LS5009` for two records generating one constant name, `LS5011` for a message two marked handlers serve with different use cases, and `LS5012` for a role allowing a permission no record declares. |
| litespec/backend/dotnet/stack#identify-an-aggregate-root-by-its-mark-and-state-record-at-traced | [Identify an Aggregate Root by Its Mark and State Record at Traced](https://litespec.dev/4.0.0/backend/dotnet/stack.md#identify-an-aggregate-root-by-its-mark-and-state-record-at-traced) | rule | dotnet | records | - | traced | rule | checkable | `litespec model check` reports `aggregate-unimplemented` (level S) for an aggregate record that no type with its mark and its state record, and no type deriving the aggregate root base, implements. |
| litespec/backend/dotnet/stack#read-every-declared-web-and-worker-host | [Read Every Declared Web and Worker Host](https://litespec.dev/4.0.0/backend/dotnet/stack.md#read-every-declared-web-and-worker-host) | rule | dotnet | records | - | full | rule | checkable | `litespec model check` reports `reader-missing` (level S) for a named host folder that does not exist, and reads the handlers, endpoints and jobs of each named host that does. |
| litespec/backend/dotnet/stack#read-net-code-through-the-stack-reader | [Read .NET Code Through the Stack Reader](https://litespec.dev/4.0.0/backend/dotnet/stack.md#read-net-code-through-the-stack-reader) | rule | dotnet | records | - | full | rule | checkable | `litespec model check` reports its level beside each level S finding read from C# code and test results. |
| litespec/backend/dotnet/stack#report-a-stack-root-that-matches-no-folder | [Report a Stack Root That Matches No Folder](https://litespec.dev/4.0.0/backend/dotnet/stack.md#report-a-stack-root-that-matches-no-folder) | rule | dotnet | records | - | full | rule | checkable | `litespec model check` reports `reader-missing` (level S) naming the field, the written pattern and the resolved folder that does not exist. |
| litespec/backend/dotnet/stack#write-each-mark-in-the-declared-style | [Write Each Mark in the Declared Style](https://litespec.dev/4.0.0/backend/dotnet/stack.md#write-each-mark-in-the-declared-style) | rule | dotnet | records | - | full | rule | checkable | `litespec model check` reports `mark-style-invalid` (level S), and `dotnet build` reports `LS5004`, for a mark written in the style the project did not declare. |
| litespec/backend/dotnet/stack#write-test-results-the-model-builder-reads | [Write Test Results the Model Builder Reads](https://litespec.dev/4.0.0/backend/dotnet/stack.md#write-test-results-the-model-builder-reads) | rule | dotnet | records | - | full | rule | guidance | Which test runs write a result outside TRX or JUnit XML, or outside `paths.testResults`? Look at the test run output beside `paths.testResults` in `.litespec/project.json`. |
| litespec/backend/dotnet/workspace#keep-one-workspace-solution-beside-the-api-solution | [Keep One Workspace Solution Beside the API Solution](https://litespec.dev/4.0.0/backend/dotnet/workspace.md#keep-one-workspace-solution-beside-the-api-solution) | rule | dotnet | workspace | - | full | rule | guidance | Which root solution files list a single deployable, or which builds, test runs, or configuration name outside the API solution? Look at the solution files beside the build configuration. |
| litespec/backend/dotnet/workspace#place-a-workspace-apphost-beside-the-applications-it-runs | [Place a Workspace AppHost Beside the Applications It Runs](https://litespec.dev/4.0.0/backend/dotnet/workspace.md#place-a-workspace-apphost-beside-the-applications-it-runs) | rule | dotnet | workspace | - | full | rule | guidance | Which AppHosts sit outside their placed home for what they run? Look at each AppHost path beside the applications it runs. |
| litespec/backend/identifiers#cite-shared-provisions-in-their-published-form | [Cite Shared Provisions in Their Published Form](https://litespec.dev/4.0.0/backend/identifiers.md#cite-shared-provisions-in-their-published-form) | rule | any | records | - | full | rule | checkable | `litespec-maintain validate` emits no `ID_UNKNOWN_REFERENCE` diagnostic. |
| litespec/backend/identifiers#follow-the-identifier-form-of-each-record-type | [Follow the Identifier Form of Each Record Type](https://litespec.dev/4.0.0/backend/identifiers.md#follow-the-identifier-form-of-each-record-type) | rule | any | records | - | full | rule | checkable | `litespec model check` reports `identifier-invalid` for an identifier outside the form its type uses. |
| litespec/backend/identifiers#keep-wire-codes-stable | [Keep Wire Codes Stable](https://litespec.dev/4.0.0/backend/identifiers.md#keep-wire-codes-stable) | rule | any | records | - | full | rule | guidance | Which wire codes in the contract break the values deployed clients branch on? Look at the wire codes beside the deployed clients. |
| litespec/backend/identifiers#name-records-with-one-to-six-words | [Name Records with One to Six Words](https://litespec.dev/4.0.0/backend/identifiers.md#name-records-with-one-to-six-words) | rule | any | records | - | full | rule | checkable | `litespec model check` reports `identifier-invalid` for a name outside one to six lowercase hyphenated words. |
| litespec/backend/identifiers#resolve-every-identifier-citation | [Resolve Every Identifier Citation](https://litespec.dev/4.0.0/backend/identifiers.md#resolve-every-identifier-citation) | rule | any | records | - | full | rule | checkable | `litespec model check` reports `reference-unknown` for a citation naming no written record. |
| litespec/backend/identifiers#use-every-identifier-once | [Use Every Identifier Once](https://litespec.dev/4.0.0/backend/identifiers.md#use-every-identifier-once) | rule | any | records | - | full | rule | checkable | `litespec model check` reports `identifier-duplicate` for an identifier used twice. |
| litespec/backend/persistence#add-read-documents-for-query-shaped-data | [Add Read Documents for Query-Shaped Data](https://litespec.dev/4.0.0/backend/persistence.md#add-read-documents-for-query-shaped-data) | convention | any | infrastructure | any | full | default | guidance | Which read documents lack recorded consistency and rebuild behavior beside their owning use case? Look at each read document. |
| litespec/backend/persistence#assign-document-numbers-from-a-sequence | [Assign Document Numbers from a Sequence](https://litespec.dev/4.0.0/backend/persistence.md#assign-document-numbers-from-a-sequence) | rule | any | infrastructure | command-handler, repository | full | rule | guidance | Which legal document numbers allocate outside a per-owner sequence taken in the command transaction? Look at each number allocation. |
| litespec/backend/persistence#bound-aggregate-document-growth | [Bound Aggregate Document Growth](https://litespec.dev/4.0.0/backend/persistence.md#bound-aggregate-document-growth) | rule | any | infrastructure | aggregate | full | rule | guidance | Which aggregate documents embed a collection with no accepted business bound? Look at the embedded collections in each document. |
| litespec/backend/persistence#claim-a-cross-record-key-at-commit | [Claim a Cross-Record Key at Commit](https://litespec.dev/4.0.0/backend/persistence.md#claim-a-cross-record-key-at-commit) | rule | any | infrastructure | repository | full | rule | guidance | Which cross-record uniqueness rules miss declared keys, or claim and release them outside the committing transaction? Look at each such rule beside its commit. |
| litespec/backend/persistence#collect-events-without-a-public-unit-of-work | [Collect Events Without a Public Unit of Work](https://litespec.dev/4.0.0/backend/persistence.md#collect-events-without-a-public-unit-of-work) | rule | any | infrastructure | repository | full | rule | guidance | Which repositories skip the internal event buffer, or which event mechanics escape into a public type? Look at the repository staging calls beside the post-handler. |
| litespec/backend/persistence#commit-each-command-pipeline-once | [Commit Each Command Pipeline Once](https://litespec.dev/4.0.0/backend/persistence.md#commit-each-command-pipeline-once) | rule | any | infrastructure | any | full | rule | guidance | Which pipelines commit outside one command post-handler, or which handlers, repositories, validators, reactions, jobs, or endpoints commit? Look at the commit calls in each pipeline. |
| litespec/backend/persistence#control-production-schema-changes | [Control Production Schema Changes](https://litespec.dev/4.0.0/backend/persistence.md#control-production-schema-changes) | rule | any | infrastructure | migration | full | rule | guidance | Which hosted schema changes run outside a reviewed step before traffic shifts? Look at the deployment steps beside the startup paths. |
| litespec/backend/persistence#enforce-uniqueness-in-the-store | [Enforce Uniqueness in the Store](https://litespec.dev/4.0.0/backend/persistence.md#enforce-uniqueness-in-the-store) | rule | any | infrastructure | aggregate | full | rule | guidance | Which uniqueness rules lack a store unique index or an owner-derived identity, or index a denormalized field? Look at the store configuration for each rule. |
| litespec/backend/persistence#evolve-stored-document-contracts-explicitly | [Evolve Stored Document Contracts Explicitly](https://litespec.dev/4.0.0/backend/persistence.md#evolve-stored-document-contracts-explicitly) | rule | any | infrastructure | aggregate | full | rule | guidance | Which renames, removals, type changes, member moves, or discriminator changes lack a reviewed transformation or an expand-and-contract rollout? Look at each stored-contract change. |
| litespec/backend/persistence#honor-the-declared-consistency-mode | [Honor the Declared Consistency Mode](https://litespec.dev/4.0.0/backend/persistence.md#honor-the-declared-consistency-mode) | rule | any | infrastructure | any | full | rule | guidance | Which commands commit outside their record's `consistency` mode? Look at each commit beside the record's mode. |
| litespec/backend/persistence#keep-mappings-and-aliases-explicit | [Keep Mappings and Aliases Explicit](https://litespec.dev/4.0.0/backend/persistence.md#keep-mappings-and-aliases-explicit) | rule | any | infrastructure | aggregate | full | rule | guidance | Which stored aggregates lack a stable document alias, typed-identifier mapping, or index list? Look at the store configuration for each aggregate. |
| litespec/backend/persistence#keep-serialization-behavior-out-of-domain | [Keep Serialization Behavior Out of Domain](https://litespec.dev/4.0.0/backend/persistence.md#keep-serialization-behavior-out-of-domain) | rule | any | infrastructure | aggregate | full | rule | guidance | Which Domain types carry serialization metadata, or which stored JSON contracts escape Infrastructure? Look at the Domain types beside the Infrastructure JSON contract. |
| litespec/backend/persistence#keep-uniqueness-out-of-handlers | [Keep Uniqueness Out of Handlers](https://litespec.dev/4.0.0/backend/persistence.md#keep-uniqueness-out-of-handlers) | rule | any | infrastructure | command-handler | full | rule | checkable | `dotnet build` reports `LS2016` for a handler whose constructor takes a pipeline-owned type. |
| litespec/backend/persistence#map-a-constraint-violation-to-its-refusal | [Map a Constraint Violation to Its Refusal](https://litespec.dev/4.0.0/backend/persistence.md#map-a-constraint-violation-to-its-refusal) | rule | any | infrastructure | any | full | rule | guidance | Which unique constraints lack a conflict refusal mapping for their violating use cases? Look at the fault classification map. |
| litespec/backend/persistence#model-a-once-only-rule-as-aggregate-state | [Model a Once-Only Rule as Aggregate State](https://litespec.dev/4.0.0/backend/persistence.md#model-a-once-only-rule-as-aggregate-state) | rule | any | infrastructure | aggregate | full | rule | guidance | Which at-most-once rules live outside their aggregate's state, or which repeats escape the refusal? Look at each such rule beside its aggregate. |
| litespec/backend/persistence#persist-one-explicit-state-object | [Persist One Explicit State Object](https://litespec.dev/4.0.0/backend/persistence.md#persist-one-explicit-state-object) | convention | any | infrastructure | state-record | full | default | guidance | Which aggregate documents flatten their state object, or which states fail to round-trip through the serializer? Look at each stored state in the integration tests. |
| litespec/backend/persistence#query-through-the-read-session | [Query Through the Read Session](https://litespec.dev/4.0.0/backend/persistence.md#query-through-the-read-session) | rule | any | infrastructure | query-handler | full | rule | guidance | Which query handlers project outside the read session, or apply filter, scope, ordering, or limit after materialization? Look at each query handler body. |
| litespec/backend/persistence#read-collection-queries-in-the-store-with-paging-and-filters | [Read Collection Queries in the Store with Paging and Filters](https://litespec.dev/4.0.0/backend/persistence.md#read-collection-queries-in-the-store-with-paging-and-filters) | rule | any | infrastructure | query-handler | full | rule | checkable | `litespec model check` reports `query-filter-invalid` (level A) for a query handler filtering a repository list in memory. |
| litespec/backend/persistence#review-query-plans-for-new-indexes | [Review Query Plans for New Indexes](https://litespec.dev/4.0.0/backend/persistence.md#review-query-plans-for-new-indexes) | convention | any | infrastructure | any | full | advice | guidance | Which new indexes lack an accepted query and a justifying plan? Look at each new index beside its query. |
| litespec/backend/persistence#stage-aggregate-writes-through-domain-repositories | [Stage Aggregate Writes Through Domain Repositories](https://litespec.dev/4.0.0/backend/persistence.md#stage-aggregate-writes-through-domain-repositories) | rule | any | infrastructure | command-handler | full | rule | checkable | `litespec model check` reports `repository-unimplemented` (level S) for an aggregate a use case changes that has no Infrastructure repository implementing its domain repository. |
| litespec/backend/persistence#test-persistence-against-postgresql | [Test Persistence Against PostgreSQL](https://litespec.dev/4.0.0/backend/persistence.md#test-persistence-against-postgresql) | rule | any | infrastructure | test | full | rule | guidance | Which persistence tests run outside the pinned PostgreSQL, or against an in-memory substitute? Look at the persistence test fixtures. |
| litespec/backend/persistence#use-database-naming-conventions | [Use Database Naming Conventions](https://litespec.dev/4.0.0/backend/persistence.md#use-database-naming-conventions) | rule | any | infrastructure | any | full | rule | guidance | Which generated database identifiers break `snake_case`? Look at the schemas, tables, columns, and indexes. |
| litespec/backend/persistence#use-one-persistence-folder | [Use One Persistence Folder](https://litespec.dev/4.0.0/backend/persistence.md#use-one-persistence-folder) | convention | any | infrastructure | any | full | default | guidance | Which store setup, repository, or commit files sit outside the product or module `Infrastructure/` folders? Look at the persistence files beside the module tree. |
| litespec/backend/persistence#use-one-session-per-command | [Use One Session per Command](https://litespec.dev/4.0.0/backend/persistence.md#use-one-session-per-command) | convention | any | infrastructure | any | full | default | guidance | Which commands resolve more than one session across their repositories and commit handler? Look at the session wiring in each command. |
| litespec/backend/persistence#version-every-aggregate | [Version Every Aggregate](https://litespec.dev/4.0.0/backend/persistence.md#version-every-aggregate) | rule | any | infrastructure | aggregate | full | rule | guidance | Which stored aggregates lack a compared version at commit, or which stale writes escape the use case conflict refusal? Look at each stored aggregate beside its commit. |
| litespec/backend/testing#derive-expected-values-from-the-scenario | [Derive Expected Values from the Scenario](https://litespec.dev/4.0.0/backend/testing.md#derive-expected-values-from-the-scenario) | rule | any | tests | - | full | rule | guidance | Which test assertions repeat values outside the Then of their scenarios? Look at each assertion beside its scenario text. |
| litespec/backend/testing#isolate-integration-state | [Isolate Integration State](https://litespec.dev/4.0.0/backend/testing.md#isolate-integration-state) | rule | any | tests | - | full | rule | guidance | Which integration tests share mutable business state across runs, or which reset strategies stay undocumented? Look at the tests beside the testing documentation. |
| litespec/backend/testing#keep-assertions-focused | [Keep Assertions Focused](https://litespec.dev/4.0.0/backend/testing.md#keep-assertions-focused) | convention | any | tests | - | full | advice | guidance | Which test bodies assert outside their named outcome, or snapshot whole objects? Look at each test body. |
| litespec/backend/testing#keep-the-test-suites-the-size-requires | [Keep the Test Suites the Size Requires](https://litespec.dev/4.0.0/backend/testing.md#keep-the-test-suites-the-size-requires) | rule | any | tests | - | full | rule | guidance | Which test folders miss a required suite, or hold an extra unnamed one? Look at the test folders beside the declared project size. |
| litespec/backend/testing#mark-the-test-that-proves-each-scenario | [Mark the Test That Proves Each Scenario](https://litespec.dev/4.0.0/backend/testing.md#mark-the-test-that-proves-each-scenario) | rule | any | tests | - | full | rule | guidance | Which scenarios lack a proving test with its mark, boundary call, and passing run? Look at the book beside the test bodies. |
| litespec/backend/testing#match-tests-by-fully-qualified-name | [Match Tests by Fully Qualified Name](https://litespec.dev/4.0.0/backend/testing.md#match-tests-by-fully-qualified-name) | rule | any | tests | - | full | rule | guidance | Which test results match outside fully qualified names, or carry data-row arguments? Look at the test result files. |
| litespec/backend/testing#mirror-production-module-names | [Mirror Production Module Names](https://litespec.dev/4.0.0/backend/testing.md#mirror-production-module-names) | convention | any | tests | - | full | default | guidance | Which test trees break the production module folders outside the exempt harness files and adapter tests? Look at each test tree beside production. |
| litespec/backend/testing#name-tests-by-observable-behavior | [Name Tests by Observable Behavior](https://litespec.dev/4.0.0/backend/testing.md#name-tests-by-observable-behavior) | convention | any | tests | - | full | advice | guidance | Which test names miss operation, condition, or expected result, or which classes miss their production type? Look at the test names. |
| litespec/backend/testing#prove-each-rule-through-its-scenarios | [Prove Each Rule Through Its Scenarios](https://litespec.dev/4.0.0/backend/testing.md#prove-each-rule-through-its-scenarios) | rule | any | tests | - | full | rule | guidance | Which rule claims stand without a proved scenario claim on the same test? Look at each rule claim. |
| litespec/backend/testing#prove-every-aggregate-with-a-model-based-test | [Prove Every Aggregate with a Model-Based Test](https://litespec.dev/4.0.0/backend/testing.md#prove-every-aggregate-with-a-model-based-test) | convention | any | tests | - | full | default | guidance | Which aggregates at size large lack a model-based test walking their declared transitions? Look at the aggregates beside their model-based test files and the declared project size. |
| litespec/backend/testing#prove-every-calculation-with-property-tests | [Prove Every Calculation with Property Tests](https://litespec.dev/4.0.0/backend/testing.md#prove-every-calculation-with-property-tests) | convention | any | tests | - | full | default | guidance | Which calculation rules at size large lack property tests seeded from their scenario examples? Look at the calculation rules beside their property test files and the declared project size. |
| litespec/backend/testing#refuse-surviving-mutants-on-changed-lines | [Refuse Surviving Mutants on Changed Lines](https://litespec.dev/4.0.0/backend/testing.md#refuse-surviving-mutants-on-changed-lines) | convention | any | tests | - | full | default | guidance | Which changes landed with survivors above the recorded threshold and no covering exception? Look at the mutation report beside the exception records. |
| litespec/backend/testing#share-one-production-faithful-integration-harness | [Share One Production-Faithful Integration Harness](https://litespec.dev/4.0.0/backend/testing.md#share-one-production-faithful-integration-harness) | rule | any | tests | - | full | rule | guidance | Which integration suites miss the one container fixture, host factory, or isolation helper, or hold a second of one? Look at the integration suite. |
| litespec/backend/testing#test-application-coordination | [Test Application Coordination](https://litespec.dev/4.0.0/backend/testing.md#test-application-coordination) | rule | any | tests | - | full | rule | guidance | Which Application tests skip a substitute, or miss a coordination assertion? Look at each Application test file. |
| litespec/backend/testing#test-domain-in-isolation | [Test Domain in Isolation](https://litespec.dev/4.0.0/backend/testing.md#test-domain-in-isolation) | rule | any | tests | - | full | rule | guidance | Which Domain tests take more than explicit inputs? Look at the Domain test files for database, host, container, clock, or mock use. |
| litespec/backend/testing#test-http-integration-through-the-real-application-host | [Test HTTP Integration Through the Real Application Host](https://litespec.dev/4.0.0/backend/testing.md#test-http-integration-through-the-real-application-host) | rule | any | tests | - | full | rule | guidance | Which HTTP integration tests bypass the real host factory or production configuration, or skip Problem Details, authentication, or authorization? Look at the HTTP integration tests. |
| litespec/backend/testing#use-builders-for-valid-defaults | [Use Builders for Valid Defaults](https://litespec.dev/4.0.0/backend/testing.md#use-builders-for-valid-defaults) | convention | any | tests | - | full | advice | guidance | Which test data builders start outside valid state, or customize without business names? Look at each builder. |
| litespec/backend/testing#use-evidence-rather-than-one-coverage-target | [Use Evidence Rather Than One Coverage Target](https://litespec.dev/4.0.0/backend/testing.md#use-evidence-rather-than-one-coverage-target) | rule | any | tests | - | full | rule | guidance | Which build gates name a coverage percentage as sufficient? Look at the build gates beside the coverage numbers. |

### core

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/core/access#authenticate-every-caller-through-a-declared-auth-kind | [Authenticate Every Caller Through a Declared Auth Kind](https://litespec.dev/4.0.0/core/access.md#authenticate-every-caller-through-a-declared-auth-kind) | rule | any | records | record:entry-point | records | rule | checkable | `litespec model check` reports `field-invalid` for an `auth` kind outside session, token, device, link, app, and none. |
| litespec/core/access#cite-the-setting-or-plan-behind-every-entitlement | [Cite the Setting or Plan Behind Every Entitlement](https://litespec.dev/4.0.0/core/access.md#cite-the-setting-or-plan-behind-every-entitlement) | rule | any | records | record:use-case | records | rule | guidance | Which entitlement grants lack a cited setting or plan? Look at the grant beside the settings each use case cites. |
| litespec/core/access#declare-access-on-every-use-case | [Declare Access on Every Use Case](https://litespec.dev/4.0.0/core/access.md#declare-access-on-every-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a use case without `access`, `grant`, or `tenant`. |
| litespec/core/access#declare-erasure-for-every-external-system | [Declare Erasure for Every External System](https://litespec.dev/4.0.0/core/access.md#declare-erasure-for-every-external-system) | rule | any | records | record:external-system | records | rule | checkable | `litespec model check` reports `record-invalid` for an external system without `erasure` and `reference-unknown` for an impossible erasure without an Intent decision. |
| litespec/core/access#declare-every-operation-on-every-external-system | [Declare Every Operation on Every External System](https://litespec.dev/4.0.0/core/access.md#declare-every-operation-on-every-external-system) | rule | any | records | record:external-system | records | rule | checkable | `litespec model check` reports `record-invalid` for an external system without `operations` and `reference-unknown` for a `calls` edge naming no declared operation. |
| litespec/core/access#describe-every-served-content-entry-point-with-its-serving-fields | [Describe Every Served Content Entry Point with Its Serving Fields](https://litespec.dev/4.0.0/core/access.md#describe-every-served-content-entry-point-with-its-serving-fields) | rule | any | records | record:entry-point | records | rule | checkable | `litespec model check` reports `record-invalid` for a served content entry point without path, contentType, cacheControl, versioning, or fulfills. |
| litespec/core/access#grant-across-tenants-only-through-declared-delegation | [Grant Across Tenants Only Through Declared Delegation](https://litespec.dev/4.0.0/core/access.md#grant-across-tenants-only-through-declared-delegation) | rule | any | records | any | records | rule | guidance | Which cross tenant delegation grants lack a declared grant on both sides? Look at the delegation grants the tenancy extension declares. |
| litespec/core/access#grant-every-use-case-through-a-declared-grant | [Grant Every Use Case Through a Declared Grant](https://litespec.dev/4.0.0/core/access.md#grant-every-use-case-through-a-declared-grant) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `field-invalid` for a grant outside permission, self, anonymous, and system, and `reference-unknown` for a permission no record defines. |
| litespec/core/access#grant-permissions-through-roles | [Grant Permissions Through Roles](https://litespec.dev/4.0.0/core/access.md#grant-permissions-through-roles) | rule | any | records | record:role | records | rule | checkable | `litespec model check` reports `record-invalid` for a role with no `allows` entry, and `permission-orphan` for a permission allowed by no role. |
| litespec/core/access#keep-access-records-in-their-homes | [Keep Access Records in Their Homes](https://litespec.dev/4.0.0/core/access.md#keep-access-records-in-their-homes) | rule | any | records | record:actor, record:role, record:permission, record:entry-point, record:external-system | records | rule | guidance | Which access records sit outside the homes their type names? Look at the actor, role, permission, entry point, and external system homes. |
| litespec/core/access#keep-permission-lists-to-entries | [Keep Permission Lists to Entries](https://litespec.dev/4.0.0/core/access.md#keep-permission-lists-to-entries) | rule | any | records | record:permission-list | records | rule | guidance | Which module permissions files carry an explanation file? Look beside each permissions file for a `.md` file with its name. |
| litespec/core/access#name-every-actor-with-its-kind | [Name Every Actor with Its Kind](https://litespec.dev/4.0.0/core/access.md#name-every-actor-with-its-kind) | rule | any | records | record:actor | records | rule | checkable | `litespec model check` reports `record-invalid` for an actor without `kind` and `field-invalid` for a kind outside person and organization. |
| litespec/core/access#name-every-entry-point-with-its-kind | [Name Every Entry Point with Its Kind](https://litespec.dev/4.0.0/core/access.md#name-every-entry-point-with-its-kind) | rule | any | records | record:entry-point | records | rule | checkable | `litespec model check` reports `record-invalid` for an entry point without `kind` and `field-invalid` for a kind outside browser, api, webhook, device, cli, mcp, and served-content. |
| litespec/core/access#prove-hierarchies-derived-trust-and-delegation-with-scenarios | [Prove Hierarchies Derived Trust and Delegation with Scenarios](https://litespec.dev/4.0.0/core/access.md#prove-hierarchies-derived-trust-and-delegation-with-scenarios) | rule | any | records | record:use-case | records | rule | guidance | Which hierarchy, trust, or delegation patterns lack an allowed and a refused scenario? Look at the scenarios on the use cases that carry the pattern. |
| litespec/core/access#record-a-delegated-grant-inside-one-tenant-as-a-role-assignment | [Record a Delegated Grant Inside One Tenant as a Role Assignment](https://litespec.dev/4.0.0/core/access.md#record-a-delegated-grant-inside-one-tenant-as-a-role-assignment) | rule | any | records | record:use-case, record:aggregate | records | rule | guidance | Which delegated or temporary grants inside one tenant lack a role assignment with `validFrom` and `validUntil` on an aggregate the access model reads, or lack their own granting and revoking use cases? Look at the assignments beside the actor holds and the use cases that act under them. |
| litespec/core/access#record-every-role-hold-with-its-scope | [Record Every Role Hold with Its Scope](https://litespec.dev/4.0.0/core/access.md#record-every-role-hold-with-its-scope) | rule | any | records | record:actor | records | rule | checkable | `litespec model check` reports `role-orphan` for a role held by no actor. |
| litespec/core/access#remove-a-target-that-must-be-the-caller | [Remove a Target That Must Be the Caller](https://litespec.dev/4.0.0/core/access.md#remove-a-target-that-must-be-the-caller) | rule | any | records | record:use-case | records | rule | guidance | Which use cases with a self grant name a caller-owned target in their inputs without a self declaration the guard enforces, or compare the caller with a target in a handler? Look at the inputs and handlers beside the self grants. |
| litespec/core/access#scope-every-grant-to-its-tenant-reach | [Scope Every Grant to Its Tenant Reach](https://litespec.dev/4.0.0/core/access.md#scope-every-grant-to-its-tenant-reach) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `field-invalid` for a tenant scope outside own, cross, public, and none. |
| litespec/core/access#scope-every-role | [Scope Every Role](https://litespec.dev/4.0.0/core/access.md#scope-every-role) | rule | any | records | record:role | records | rule | checkable | `litespec model check` reports `record-invalid` for a role without `scope` and `field-invalid` for a scope outside kebab-case form. |
| litespec/core/access#state-every-permission-with-its-meaning | [State Every Permission with Its Meaning](https://litespec.dev/4.0.0/core/access.md#state-every-permission-with-its-meaning) | rule | any | records | record:permission | records | rule | checkable | `litespec model check` reports `record-invalid` for a permission without `meaning`. |
| litespec/core/access#state-the-scope-of-every-permission | [State the Scope of Every Permission](https://litespec.dev/4.0.0/core/access.md#state-the-scope-of-every-permission) | rule | any | records | record:permission | records | rule | checkable | `litespec model check` fails a permission entry without `scope`. |
| litespec/core/access#use-three-conventional-scope-levels | [Use Three Conventional Scope Levels](https://litespec.dev/4.0.0/core/access.md#use-three-conventional-scope-levels) | convention | any | records | record:role | records | default | guidance | Which role scopes fall outside platform, tenant, and self without a recorded project convention? Look at `scope` on each role page. |
| litespec/core/access#write-a-summary-on-every-actor-and-role-page | [Write a Summary on Every Actor and Role Page](https://litespec.dev/4.0.0/core/access.md#write-a-summary-on-every-actor-and-role-page) | rule | any | records | record:actor, record:role | records | rule | checkable | `litespec model check` fails an actor or role page without `summary`. |
| litespec/core/access#write-a-summary-on-every-external-system-page | [Write a Summary on Every External System Page](https://litespec.dev/4.0.0/core/access.md#write-a-summary-on-every-external-system-page) | rule | any | records | record:external-system | records | rule | checkable | `litespec model check` fails an external system page without `summary`. |
| litespec/core/agent#advise-without-gating | [Advise Without Gating](https://litespec.dev/4.0.0/core/agent.md#advise-without-gating) | rule | any | workspace | any | records | rule | guidance | The agent output records findings as advice with evidence, with decisions left to the owner. |
| litespec/core/agent#apply-guidance-precedence | [Apply Guidance Precedence](https://litespec.dev/4.0.0/core/agent.md#apply-guidance-precedence) | rule | any | workspace | any | records | rule | guidance | The design applies the project exception, the extension, the deeper page, and the shallower page in that order. |
| litespec/core/agent#escalate-decisions-that-specify-forbids | [Escalate Decisions That Specify Forbids](https://litespec.dev/4.0.0/core/agent.md#escalate-decisions-that-specify-forbids) | rule | any | workspace | any | records | rule | guidance | Each figure the owner sets that the change needs sits in an owner question or a backlog item, not in an agent-written decision. |
| litespec/core/agent#follow-the-local-pattern-before-the-model-query | [Follow the Local Pattern Before the Model Query](https://litespec.dev/4.0.0/core/agent.md#follow-the-local-pattern-before-the-model-query) | rule | any | workspace | any | records | rule | guidance | The change touches no permission carrying `risk` and names the local pattern it followed. |
| litespec/core/agent#inspect-existing-work-before-editing | [Inspect Existing Work Before Editing](https://litespec.dev/4.0.0/core/agent.md#inspect-existing-work-before-editing) | rule | any | workspace | any | records | rule | guidance | `git status` output precedes the edits, with user changes, untracked files, and unrelated generated output untouched. |
| litespec/core/agent#inspect-local-examples-after-standards | [Inspect Local Examples After Standards](https://litespec.dev/4.0.0/core/agent.md#inspect-local-examples-after-standards) | convention | any | workspace | any | records | default | guidance | The change names the neighboring files that shaped it after the standards. |
| litespec/core/agent#keep-agent-working-files-under-agents | [Keep Agent Working Files Under Agents](https://litespec.dev/4.0.0/core/agent.md#keep-agent-working-files-under-agents) | convention | any | workspace | any | records | default | guidance | Every agent working file sits under `.agents/` or the path the working-files convention names. |
| litespec/core/agent#load-applicable-extensions | [Load Applicable Extensions](https://litespec.dev/4.0.0/core/agent.md#load-applicable-extensions) | rule | any | workspace | any | records | rule | guidance | The change names each extension loaded before editing inside its boundary. |
| litespec/core/agent#load-applicable-provisions-before-editing | [Load Applicable Provisions Before Editing](https://litespec.dev/4.0.0/core/agent.md#load-applicable-provisions-before-editing) | rule | any | workspace | any | records | rule | guidance | Which provisions the rules query returned lack a judged answer in the completion report? Compare the rules output with the report. |
| litespec/core/agent#make-coherent-scoped-changes | [Make Coherent Scoped Changes](https://litespec.dev/4.0.0/core/agent.md#make-coherent-scoped-changes) | rule | any | workspace | any | records | rule | guidance | Every changed artifact traces to the authorized request. |
| litespec/core/agent#name-judged-provisions-in-the-completion-report | [Name Judged Provisions in the Completion Report](https://litespec.dev/4.0.0/core/agent.md#name-judged-provisions-in-the-completion-report) | rule | any | workspace | any | records | rule | guidance | Which judged provisions lack a how in the completion report? Look at the provisions beside the report. |
| litespec/core/agent#raise-open-figures-to-the-owner | [Raise Open Figures to the Owner](https://litespec.dev/4.0.0/core/agent.md#raise-open-figures-to-the-owner) | rule | any | workspace | any | records | rule | guidance | Which open figures lack an owner question with a recommendation or a backlog item? Look at the owner questions and the backlog board beside the change. |
| litespec/core/agent#read-the-full-record-before-changing-a-boundary | [Read the Full Record Before Changing a Boundary](https://litespec.dev/4.0.0/core/agent.md#read-the-full-record-before-changing-a-boundary) | convention | any | workspace | any | records | default | guidance | Each file generation or boundary change cites the full record it matched. |
| litespec/core/agent#replace-only-declared-conventions | [Replace Only Declared Conventions](https://litespec.dev/4.0.0/core/agent.md#replace-only-declared-conventions) | rule | any | workspace | any | records | rule | guidance | Each convention replacement resolves to a recorded local convention in the project documentation. |
| litespec/core/agent#restrict-unapproved-side-effects | [Restrict Unapproved Side Effects](https://litespec.dev/4.0.0/core/agent.md#restrict-unapproved-side-effects) | rule | any | workspace | any | records | rule | guidance | An approval covers each package, migration, authentication, public API, production data, release, spending, or state-changing outside call the change makes. |
| litespec/core/agent#select-task-context | [Select Task Context](https://litespec.dev/4.0.0/core/agent.md#select-task-context) | rule | any | workspace | any | records | rule | guidance | The completion report names the model query that selected the cited records. |
| litespec/core/agent#stop-on-unresolved-conflict | [Stop on Unresolved Conflict](https://litespec.dev/4.0.0/core/agent.md#stop-on-unresolved-conflict) | rule | any | workspace | any | records | rule | guidance | The stopped work quotes the conflict with both provision IDs and paths. |
| litespec/core/agent#take-expected-values-from-the-scenario | [Take Expected Values from the Scenario](https://litespec.dev/4.0.0/core/agent.md#take-expected-values-from-the-scenario) | rule | any | workspace | test | records | rule | guidance | Each test's expected values match the scenario's Then, with none taken from a code run. |
| litespec/core/agent#verify-refusals-and-calculations-against-held-back-examples | [Verify Refusals and Calculations Against Held-Back Examples](https://litespec.dev/4.0.0/core/agent.md#verify-refusals-and-calculations-against-held-back-examples) | rule | any | workspace | any | records | rule | guidance | The check log shows refusal and calculation example rows withheld during implementation and run after. |
| litespec/core/agent#write-pages-below-decided-intent | [Write Pages Below Decided Intent](https://litespec.dev/4.0.0/core/agent.md#write-pages-below-decided-intent) | rule | any | workspace | any | records | rule | guidance | Each written page traces to a decided Intent record, with no invented promise. |
| litespec/core/authoring#attach-examples-to-their-provisions | [Attach Examples to Their Provisions](https://litespec.dev/4.0.0/core/authoring.md#attach-examples-to-their-provisions) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `STANDARD_EXAMPLE_LABEL`, `PAGE_UNKNOWN_SECTION`, or `REFERENCE_EXAMPLE_DECLARATION` diagnostic. |
| litespec/core/authoring#cite-owned-content-instead-of-copying-it | [Cite Owned Content Instead of Copying It](https://litespec.dev/4.0.0/core/authoring.md#cite-owned-content-instead-of-copying-it) | rule | any | workspace | - | records | rule | guidance | Which passages restate content another page owns? Compare repeated passages with the owning page. |
| litespec/core/authoring#classify-every-specification-file | [Classify Every Specification File](https://litespec.dev/4.0.0/core/authoring.md#classify-every-specification-file) | rule | any | workspace | - | records | rule | checkable | `litespec model check` reports no `explanation-orphaned` finding, and fails a `.yaml` file with no record type outside a declared unstructured path. |
| litespec/core/authoring#declare-structured-specification-metadata | [Declare Structured Specification Metadata](https://litespec.dev/4.0.0/core/authoring.md#declare-structured-specification-metadata) | rule | any | workspace | - | records | rule | checkable | `litespec model check` validates each record file and each document frontmatter block against the record schema. |
| litespec/core/authoring#define-each-glossary-term-under-its-heading | [Define Each Glossary Term Under Its Heading](https://litespec.dev/4.0.0/core/authoring.md#define-each-glossary-term-under-its-heading) | rule | any | workspace | - | records | rule | guidance | Which glossary entries open with something other than the definition, or carry a Term line? Look in `docs/reference/glossary.md`. |
| litespec/core/authoring#derive-a-computed-fact-instead-of-restating-it | [Derive a Computed Fact Instead of Restating It](https://litespec.dev/4.0.0/core/authoring.md#derive-a-computed-fact-instead-of-restating-it) | rule | any | workspace | - | records | rule | guidance | Which counts, censuses, or membership lists lack a source or command? Look at the numbers the change adds. |
| litespec/core/authoring#exclude-a-sequence-number-from-the-identifier | [Exclude a Sequence Number from the Identifier](https://litespec.dev/4.0.0/core/authoring.md#exclude-a-sequence-number-from-the-identifier) | rule | any | workspace | - | records | rule | guidance | Which identifiers carry a sequence number? Look at the provision IDs the change adds. |
| litespec/core/authoring#exclude-cross-release-compatibility-work | [Exclude Cross-Release Compatibility Work](https://litespec.dev/4.0.0/core/authoring.md#exclude-cross-release-compatibility-work) | rule | any | workspace | - | records | rule | guidance | Which pages promise migration, mapping, or alias between releases? Look at the release material the change adds. |
| litespec/core/authoring#exclude-declared-content-paths-from-the-ascii-check | [Exclude Declared Content Paths from the ASCII Check](https://litespec.dev/4.0.0/core/authoring.md#exclude-declared-content-paths-from-the-ascii-check) | rule | any | workspace | - | records | rule | guidance | Which non-ASCII prose sits outside the paths the project record declares? Look at the content files beside the declaration. |
| litespec/core/authoring#exclude-generated-regions-from-prose-checks | [Exclude Generated Regions from Prose Checks](https://litespec.dev/4.0.0/core/authoring.md#exclude-generated-regions-from-prose-checks) | rule | any | workspace | - | records | rule | guidance | Which findings point inside generated-region fences? Look at the findings the checks report. |
| litespec/core/authoring#exclude-historical-transition-material | [Exclude Historical Transition Material](https://litespec.dev/4.0.0/core/authoring.md#exclude-historical-transition-material) | rule | any | workspace | - | records | rule | guidance | Which active files carry history-specific paths, aliases, or migration material? Look at the files the change adds. |
| litespec/core/authoring#exclude-the-compound-that-names-another-concept | [Exclude the Compound That Names Another Concept](https://litespec.dev/4.0.0/core/authoring.md#exclude-the-compound-that-names-another-concept) | rule | any | workspace | - | records | rule | guidance | Which compounds use a rejected word to name another concept without being listed in the rejection's `except`? |
| litespec/core/authoring#generate-the-provision-diff-for-each-release | [Generate the Provision Diff for Each Release](https://litespec.dev/4.0.0/core/authoring.md#generate-the-provision-diff-for-each-release) | rule | any | workspace | - | records | rule | guidance | Which changelog identifiers were typed by hand, or name an identifier that a comparison of the provision index at the previous tag with the provision index of the release does not produce? Look at the changelog entry beside the two provision indexes. |
| litespec/core/authoring#give-one-observable-fact-one-mark-across-pages | [Give One Observable Fact One Mark Across Pages](https://litespec.dev/4.0.0/core/authoring.md#give-one-observable-fact-one-mark-across-pages) | rule | any | workspace | - | records | rule | guidance | Which shared facts carry different labels? Compare the verification lines that name one check, using the provision index. |
| litespec/core/authoring#identify-actionable-conventions | [Identify Actionable Conventions](https://litespec.dev/4.0.0/core/authoring.md#identify-actionable-conventions) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `CONVENTION_MISSING_DEFAULT`, `CONVENTION_MISSING_REPLACEMENT`, `CONVENTION_DEFAULT_SENTENCE`, `CONVENTION_REPLACEMENT_SENTENCE`, `CONVENTION_REPLACEMENT_DEVIATION`, or `PROVISION_RESTATES_HEADING` diagnostic. |
| litespec/core/authoring#keep-a-pinned-release-for-as-long-as-it-serves | [Keep a Pinned Release for as Long as It Serves](https://litespec.dev/4.0.0/core/authoring.md#keep-a-pinned-release-for-as-long-as-it-serves) | rule | any | workspace | - | records | rule | guidance | Which provisions oblige a move to a later release? Look at the Statements the change adds. |
| litespec/core/authoring#keep-authored-prose-ascii-safe | [Keep Authored Prose ASCII-Safe](https://litespec.dev/4.0.0/core/authoring.md#keep-authored-prose-ascii-safe) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PROSE_NON_ASCII` diagnostic. |
| litespec/core/authoring#keep-code-out-of-intent-and-behavior-fields | [Keep Code Out of Intent and Behavior Fields](https://litespec.dev/4.0.0/core/authoring.md#keep-code-out-of-intent-and-behavior-fields) | rule | any | workspace | - | records | rule | guidance | Which Intent or Behavior fields copy values from code? Look at the fields the change fills, beside the implementation. |
| litespec/core/authoring#keep-identifiers-out-of-provision-headings | [Keep Identifiers Out of Provision Headings](https://litespec.dev/4.0.0/core/authoring.md#keep-identifiers-out-of-provision-headings) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `ID_IN_HEADING` diagnostic. |
| litespec/core/authoring#keep-principle-pages-free-of-stack-detail | [Keep Principle Pages Free of Stack Detail](https://litespec.dev/4.0.0/core/authoring.md#keep-principle-pages-free-of-stack-detail) | rule | any | workspace | - | records | rule | guidance | Which principle pages name stack detail? Look for framework, package, and language names in principle pages. |
| litespec/core/authoring#limit-each-intent-to-three-sentences | [Limit Each Intent to Three Sentences](https://litespec.dev/4.0.0/core/authoring.md#limit-each-intent-to-three-sentences) | rule | any | workspace | - | records | rule | guidance | Which Intent sections run past three sentences? Look at the Intent section of each page the change touches. |
| litespec/core/authoring#map-provisions-to-evidence | [Map Provisions to Evidence](https://litespec.dev/4.0.0/core/authoring.md#map-provisions-to-evidence) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `VERIFY_MISSING_ID`, `VERIFY_DUPLICATE_ID`, `VERIFY_ORDER`, or `VERIFY_HEADER` diagnostic. |
| litespec/core/authoring#mark-every-provision-checkable-or-guidance | [Mark Every Provision Checkable or Guidance](https://litespec.dev/4.0.0/core/authoring.md#mark-every-provision-checkable-or-guidance) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` reports `VERIFY_MISSING_ID` for a provision whose verification line opens with any other label. |
| litespec/core/authoring#name-observable-evidence-in-verification-lines | [Name Observable Evidence in Verification Lines](https://litespec.dev/4.0.0/core/authoring.md#name-observable-evidence-in-verification-lines) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `VERIFY_GENERIC_EVIDENCE`, `VERIFY_TEMPLATED_EVIDENCE`, `VERIFY_DUPLICATE_EVIDENCE`, `VERIFY_COMMAND`, or `CHECKED_BY_UNKNOWN` diagnostic. |
| litespec/core/authoring#name-the-escape-from-every-abstraction | [Name the Escape from Every Abstraction](https://litespec.dev/4.0.0/core/authoring.md#name-the-escape-from-every-abstraction) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PAGE_MISSING_SECTION` diagnostic for a command page. |
| litespec/core/authoring#name-the-owning-page-in-the-identifier | [Name the Owning Page in the Identifier](https://litespec.dev/4.0.0/core/authoring.md#name-the-owning-page-in-the-identifier) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `ID_PAGE_FILENAME` or `ID_DUPLICATE` diagnostic. |
| litespec/core/authoring#name-the-tool-rather-than-the-mechanism | [Name the Tool Rather Than the Mechanism](https://litespec.dev/4.0.0/core/authoring.md#name-the-tool-rather-than-the-mechanism) | rule | any | workspace | - | records | rule | guidance | Which procedure steps lack a repository command? Look at the steps the change adds. |
| litespec/core/authoring#order-glossary-groups-alphabetically | [Order Glossary Groups Alphabetically](https://litespec.dev/4.0.0/core/authoring.md#order-glossary-groups-alphabetically) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `GLOSSARY_ORDER` or `GLOSSARY_DEFINITION` diagnostic. |
| litespec/core/authoring#place-each-stack-binding-on-its-stack-page | [Place Each Stack Binding on Its Stack Page](https://litespec.dev/4.0.0/core/authoring.md#place-each-stack-binding-on-its-stack-page) | rule | any | workspace | - | records | rule | guidance | Which shared pages carry stack-specific sections? Look for stack sections outside stack pages. |
| litespec/core/authoring#place-the-id-under-every-provision-heading | [Place the ID Under Every Provision Heading](https://litespec.dev/4.0.0/core/authoring.md#place-the-id-under-every-provision-heading) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `ID_LINE_MISSING` or `ID_LINE_MISMATCH` diagnostic. |
| litespec/core/authoring#prefer-direct-action-headings | [Prefer Direct Action Headings](https://litespec.dev/4.0.0/core/authoring.md#prefer-direct-action-headings) | convention | any | workspace | - | records | default | checkable | `litespec-maintain validate` emits no `HEADING_ACTION` diagnostic. |
| litespec/core/authoring#publish-each-release-as-a-complete-contract | [Publish Each Release as a Complete Contract](https://litespec.dev/4.0.0/core/authoring.md#publish-each-release-as-a-complete-contract) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` checks every page of the release in one run, and the manifest names one version for the whole contract. |
| litespec/core/authoring#record-a-setting-as-reference | [Record a Setting as Reference](https://litespec.dev/4.0.0/core/authoring.md#record-a-setting-as-reference) | rule | any | workspace | - | records | rule | guidance | Which procedure-named settings lack a configuration page row? Look at the settings the change adds, beside the configuration pages. |
| litespec/core/authoring#record-the-project-vocabulary-as-data | [Record the Project Vocabulary as Data](https://litespec.dev/4.0.0/core/authoring.md#record-the-project-vocabulary-as-data) | rule | any | workspace | - | records | rule | checkable | `litespec model check` validates the project glossary against the glossary schema. |
| litespec/core/authoring#record-the-reviewed-litespec-release | [Record the Reviewed LiteSpec Release](https://litespec.dev/4.0.0/core/authoring.md#record-the-reviewed-litespec-release) | rule | any | workspace | - | records | rule | checkable | `litespec model check` fails when `reviewedLiteSpecVersion` differs from the pinned release. |
| litespec/core/authoring#regenerate-the-provision-index | [Regenerate the Provision Index](https://litespec.dev/4.0.0/core/authoring.md#regenerate-the-provision-index) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain provisions --check` exits zero. |
| litespec/core/authoring#reject-a-recorded-synonym-inside-its-scope | [Reject a Recorded Synonym Inside Its Scope](https://litespec.dev/4.0.0/core/authoring.md#reject-a-recorded-synonym-inside-its-scope) | rule | any | workspace | - | records | rule | guidance | Which words on the page are synonyms the project glossary rejects for the scope the page sits in? |
| litespec/core/authoring#restrict-normative-language-to-standards-and-conventions | [Restrict Normative Language to Standards and Conventions](https://litespec.dev/4.0.0/core/authoring.md#restrict-normative-language-to-standards-and-conventions) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PROSE_NORMATIVE_LOCATION` or `STANDARD_INFORMATIVE_NORMATIVE` diagnostic. |
| litespec/core/authoring#review-each-term-for-its-lookalikes | [Review Each Term for Its Lookalikes](https://litespec.dev/4.0.0/core/authoring.md#review-each-term-for-its-lookalikes) | rule | any | workspace | - | records | rule | guidance | Which terms differ from another term only in hyphenation, spelling, plurality, or a compound split? Look at the terms the change adds, beside the glossary. |
| litespec/core/authoring#rewrite-every-link-on-a-rename | [Rewrite Every Link on a Rename](https://litespec.dev/4.0.0/core/authoring.md#rewrite-every-link-on-a-rename) | rule | any | workspace | - | records | rule | checkable | `litespec rename` leaves no citation of the old identifier, and `litespec-maintain validate` emits no `ID_UNKNOWN_REFERENCE` diagnostic. |
| litespec/core/authoring#route-the-reader-before-listing-pages | [Route the Reader Before Listing Pages](https://litespec.dev/4.0.0/core/authoring.md#route-the-reader-before-listing-pages) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `INDEX_MISSING_ROUTING` diagnostic. |
| litespec/core/authoring#run-repeatable-authoring-checks | [Run Repeatable Authoring Checks](https://litespec.dev/4.0.0/core/authoring.md#run-repeatable-authoring-checks) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate`, `dotnet test --solution LiteSpec.slnx` and `git diff --check` exit zero. |
| litespec/core/authoring#scaffold-pages-and-reserve-identifiers | [Scaffold Pages and Reserve Identifiers](https://litespec.dev/4.0.0/core/authoring.md#scaffold-pages-and-reserve-identifiers) | rule | any | workspace | - | records | rule | guidance | Which new pages lack a reserved identifier? Look for pages created without `litespec new`. |
| litespec/core/authoring#split-extension-dependencies-into-three-labeled-lines | [Split Extension Dependencies into Three Labeled Lines](https://litespec.dev/4.0.0/core/authoring.md#split-extension-dependencies-into-three-labeled-lines) | rule | any | workspace | - | records | rule | guidance | Which Dependencies sections lack a labeled line? Look in each page under an `ext/` folder. |
| litespec/core/authoring#start-each-explanation-file-with-its-title | [Start Each Explanation File with Its Title](https://litespec.dev/4.0.0/core/authoring.md#start-each-explanation-file-with-its-title) | rule | any | workspace | - | records | rule | guidance | Which explanation files miss their H1 title or section content outside H2? Look at the explanation files beside the changed record files. |
| litespec/core/authoring#state-mannered-terms-literally | [State Mannered Terms Literally](https://litespec.dev/4.0.0/core/authoring.md#state-mannered-terms-literally) | rule | any | workspace | - | records | rule | guidance | Which mannered terms on the page stand where the glossary asks for the literal word? |
| litespec/core/authoring#state-one-layer-per-page | [State One Layer per Page](https://litespec.dev/4.0.0/core/authoring.md#state-one-layer-per-page) | rule | any | workspace | - | records | rule | guidance | Which command pages mix mechanism into other sections? Look outside the Underneath section of each command page the change touches. |
| litespec/core/authoring#state-what-happens-in-every-behavior-statement | [State What Happens in Every Behavior Statement](https://litespec.dev/4.0.0/core/authoring.md#state-what-happens-in-every-behavior-statement) | rule | any | workspace | - | records | advice | guidance | Which rule statements, scenario steps, or result meanings hide their behavior behind a vague word? Look at the statements the change adds. |
| litespec/core/authoring#use-controlled-capitalization | [Use Controlled Capitalization](https://litespec.dev/4.0.0/core/authoring.md#use-controlled-capitalization) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PAGE_TITLE_CASE` or `PAGE_HEADING_CASE` diagnostic. |
| litespec/core/authoring#use-one-metadata-carrier | [Use One Metadata Carrier](https://litespec.dev/4.0.0/core/authoring.md#use-one-metadata-carrier) | rule | any | workspace | - | records | rule | guidance | Which pages carry field values outside the record file? Look at the explanation files beside the changed record files. |
| litespec/core/authoring#use-one-normative-vocabulary | [Use One Normative Vocabulary](https://litespec.dev/4.0.0/core/authoring.md#use-one-normative-vocabulary) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `STANDARD_MODAL_COUNT` or `STANDARD_MODAL_VOCABULARY` diagnostic. |
| litespec/core/authoring#use-one-term-for-one-concept | [Use One Term for One Concept](https://litespec.dev/4.0.0/core/authoring.md#use-one-term-for-one-concept) | rule | any | workspace | - | records | rule | guidance | Which concepts appear under more than one name? Look at the terms the change adds, beside the glossary. |
| litespec/core/authoring#use-the-declared-identifier-grammar | [Use the Declared Identifier Grammar](https://litespec.dev/4.0.0/core/authoring.md#use-the-declared-identifier-grammar) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `ID_UNKNOWN_REFERENCE` or `ID_DUPLICATE` diagnostic. |
| litespec/core/authoring#use-the-declared-page-contract | [Use the Declared Page Contract](https://litespec.dev/4.0.0/core/authoring.md#use-the-declared-page-contract) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PAGE_MISSING_SECTION`, `PAGE_SECTION_ORDER` or `PAGE_UNKNOWN_SECTION` diagnostic. |
| litespec/core/authoring#use-the-declared-record-identifier-grammar | [Use the Declared Record Identifier Grammar](https://litespec.dev/4.0.0/core/authoring.md#use-the-declared-record-identifier-grammar) | rule | any | workspace | - | records | rule | checkable | `litespec model check` fails a record identifier outside the declared grammar. |
| litespec/core/authoring#validate-a-single-page-before-committing | [Validate a Single Page Before Committing](https://litespec.dev/4.0.0/core/authoring.md#validate-a-single-page-before-committing) | rule | any | workspace | - | records | rule | guidance | The change report shows each touched page passing single-page validation before commit. |
| litespec/core/authoring#validate-current-standards-material | [Validate Current Standards Material](https://litespec.dev/4.0.0/core/authoring.md#validate-current-standards-material) | rule | any | workspace | - | records | rule | guidance | Which validator inputs come from outside the working tree? Look at the paths the validator reads. |
| litespec/core/authoring#write-atomic-standards-provisions | [Write Atomic Standards Provisions](https://litespec.dev/4.0.0/core/authoring.md#write-atomic-standards-provisions) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `STANDARD_LABEL_INVALID`, `STANDARD_LABEL_ORDER`, `STANDARD_LABEL_DUPLICATE`, `STANDARD_SENTENCE_COUNT`, `STANDARD_MODAL_COUNT`, `STANDARD_MODAL_VOCABULARY`, `STANDARD_MISSING_DEVIATION`, `STANDARD_UNEXPECTED_DEVIATION`, `STANDARD_DEVIATION_NORMATIVE`, `STANDARD_DEVIATION_SENTENCE`, `STANDARD_MISSING_REQUIREMENT`, `STANDARD_REQUIREMENT_COUNT`, `STANDARD_UNLABELED_CONTENT`, or `PROVISION_RESTATES_HEADING` diagnostic. |
| litespec/core/authoring#write-none-in-an-empty-required-section | [Write None in an Empty Required Section](https://litespec.dev/4.0.0/core/authoring.md#write-none-in-an-empty-required-section) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `PAGE_EMPTY_SECTION` or `PAGE_EMPTY_SECTION_TEXT` diagnostic. |
| litespec/core/automation#declare-every-reaction-and-job-edge-in-effects | [Declare Every Reaction and Job Edge in Effects](https://litespec.dev/4.0.0/core/automation.md#declare-every-reaction-and-job-edge-in-effects) | rule | any | application | record:reaction, record:job | records | rule | checkable | `litespec model check` reports `record-invalid` for a reaction or job with no `effects` or with a top-level effect verb. |
| litespec/core/automation#file-every-reaction-and-job-with-the-module-it-changes | [File Every Reaction and Job with the Module It Changes](https://litespec.dev/4.0.0/core/automation.md#file-every-reaction-and-job-with-the-module-it-changes) | rule | any | application | record:reaction, record:job | records | rule | guidance | Which reaction or job pages sit outside the module they change? Look at the reactions and jobs beside the modules whose records they change. |
| litespec/core/automation#guard-every-manual-job | [Guard Every Manual Job](https://litespec.dev/4.0.0/core/automation.md#guard-every-manual-job) | rule | any | application | job | records | rule | checkable | `litespec model check` reports `job-guard-missing` (level G) for a manual job without `guard`. |
| litespec/core/automation#keep-job-fields-off-reactions | [Keep Job Fields off Reactions](https://litespec.dev/4.0.0/core/automation.md#keep-job-fields-off-reactions) | rule | any | application | record:reaction | records | rule | checkable | `litespec model check` fails a reaction carrying `kind`, `schedule`, `runbook`, `runsWhere`, `guard`, `cursor`, `selection`, `lease`, `batchSize`, `serviceLevel`, or `evidence`. |
| litespec/core/automation#name-each-job-for-the-use-case-it-runs | [Name Each Job for the Use Case It Runs](https://litespec.dev/4.0.0/core/automation.md#name-each-job-for-the-use-case-it-runs) | rule | any | application | job | records | rule | checkable | `litespec model check` reports `job-name-invalid` (level G) for a job outside `<verb>-<what>` with the verb of a use case it runs. |
| litespec/core/automation#name-each-reaction-for-its-act-and-its-trigger | [Name Each Reaction for Its Act and Its Trigger](https://litespec.dev/4.0.0/core/automation.md#name-each-reaction-for-its-act-and-its-trigger) | rule | any | application | record:reaction | records | rule | guidance | Which reaction names hide their act or their trigger? Look at the reaction names beside their triggering events. |
| litespec/core/automation#point-reaction-and-job-scenarios-at-the-run-result | [Point Reaction and Job Scenarios at the Run Result](https://litespec.dev/4.0.0/core/automation.md#point-reaction-and-job-scenarios-at-the-run-result) | rule | any | application | record:reaction, record:job | records | rule | checkable | `litespec model check` reports `scenario-result-unknown` for a reaction or job scenario ending outside the run use case results. |
| litespec/core/automation#run-every-job-from-its-declared-kind | [Run Every Job from Its Declared Kind](https://litespec.dev/4.0.0/core/automation.md#run-every-job-from-its-declared-kind) | rule | any | application | job | records | rule | checkable | `litespec model check` reports `schedule-invalid` (level G) for a schedule neither an `every` duration, a `cron` expression, nor `at: startup`, and fails a job without its `kind` or a scheduled job without `schedule`. |
| litespec/core/automation#state-the-failure-handling-of-every-reaction-and-job | [State the Failure Handling of Every Reaction and Job](https://litespec.dev/4.0.0/core/automation.md#state-the-failure-handling-of-every-reaction-and-job) | rule | any | application | record:reaction, record:job | records | rule | checkable | `litespec model check` fails a reaction or job with `onFailure` outside the one failure shape, and reports `record-invalid` for prose handling, a missing or malformed retry, and a malformed duration. |
| litespec/core/automation#trigger-every-reaction-from-its-declared-events | [Trigger Every Reaction from Its Declared Events](https://litespec.dev/4.0.0/core/automation.md#trigger-every-reaction-from-its-declared-events) | rule | any | application | record:reaction | records | rule | checkable | `litespec model check` reports `reaction-trigger-unknown` (level G) for a trigger naming an unknown event, and fails a reaction without a `triggeredBy` list. |
| litespec/core/automation#write-every-runbook-to-run-or-recover | [Write Every Runbook to Run or Recover](https://litespec.dev/4.0.0/core/automation.md#write-every-runbook-to-run-or-recover) | rule | any | application | record:runbook | records | rule | checkable | `litespec model check` fails a runbook page without `impact`, `prerequisites`, `procedure`, `verification`, `recovery`, or `escalation`. |
| litespec/core/automation#write-no-aggregate-directly-from-a-reaction-or-job | [Write No Aggregate Directly from a Reaction or Job](https://litespec.dev/4.0.0/core/automation.md#write-no-aggregate-directly-from-a-reaction-or-job) | rule | any | application | record:reaction, record:job | records | rule | guidance | Which reactions or jobs write an aggregate outside the use case they run? Look at the reaction and job effects beside the use cases. |
| litespec/core/behavior#group-cross-aggregate-rules-by-theme | [Group Cross-Aggregate Rules by Theme](https://litespec.dev/4.0.0/core/behavior.md#group-cross-aggregate-rules-by-theme) | convention | any | records | record:rule-set | records | default | guidance | Which rule sets state no theme in `summary` without a recorded project convention? Look at the `summary` of each rule-set record file. |
| litespec/core/behavior#illustrate-pages-with-examples-from-the-cast | [Illustrate Pages with Examples from the Cast](https://litespec.dev/4.0.0/core/behavior.md#illustrate-pages-with-examples-from-the-cast) | convention | any | records | record:use-case, record:module, record:aggregate | records | default | guidance | Which module, aggregate, and use-case explanation files lack an Example section from the cast where a walk would add to the records, without a recorded project convention? Look at the Example sections beside the module, aggregate, and use-case record files. |
| litespec/core/behavior#keep-design-choices-out-of-the-records | [Keep Design Choices Out of the Records](https://litespec.dev/4.0.0/core/behavior.md#keep-design-choices-out-of-the-records) | rule | any | records | aggregate, value-object, record:term | records | rule | guidance | Which record pages declare a child entity or value object as a record type? Look at the record types beside the aggregate pages. |
| litespec/core/domain-model#bind-every-atomic-write-group-in-its-rule | [Bind Every Atomic Write Group in Its Rule](https://litespec.dev/4.0.0/core/domain-model.md#bind-every-atomic-write-group-in-its-rule) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` reports `atomic-group-drift` (level G) for an atomic use case whose `changes` differs from its rule's `binds`, and `atomic-group-invalid` (level A) for a group binding more than 4 aggregates. |
| litespec/core/domain-model#compute-shared-values-from-one-calculation-rule | [Compute Shared Values from One Calculation Rule](https://litespec.dev/4.0.0/core/domain-model.md#compute-shared-values-from-one-calculation-rule) | rule | any | domain | record:use-case | records | rule | guidance | Which queries and commands computing one value cite different rules in `computedBy`? Look at the use cases beside the calculation rule. |
| litespec/core/domain-model#connect-every-state-through-transitions | [Connect Every State Through Transitions](https://litespec.dev/4.0.0/core/domain-model.md#connect-every-state-through-transitions) | rule | any | domain | aggregate | records | rule | checkable | `litespec model check` reports `state-unreached` (level G) for a state reached by no transition, a creation included, and `transition-unknown` (level G) for a transition naming a missing state or use case. |
| litespec/core/domain-model#declare-the-kind-of-every-aggregate | [Declare the Kind of Every Aggregate](https://litespec.dev/4.0.0/core/domain-model.md#declare-the-kind-of-every-aggregate) | rule | any | domain | aggregate | records | rule | checkable | `litespec model check` fails an aggregate page without `kind` or with an unknown kind. |
| litespec/core/domain-model#define-every-behavior-term-in-the-glossary | [Define Every Behavior Term in the Glossary](https://litespec.dev/4.0.0/core/domain-model.md#define-every-behavior-term-in-the-glossary) | rule | any | domain | record:term | records | rule | guidance | Which terms do the Behavior records name without a glossary entry stating their meaning? Look at the records beside the project glossary. |
| litespec/core/domain-model#freeze-every-commercial-data-value | [Freeze Every Commercial Data Value](https://litespec.dev/4.0.0/core/domain-model.md#freeze-every-commercial-data-value) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` fails a commercial-data rule without `frozenWhen` or `retainedIn`. |
| litespec/core/domain-model#keep-cross-aggregate-rules-on-a-rule-page | [Keep Cross-Aggregate Rules on a Rule Page](https://litespec.dev/4.0.0/core/domain-model.md#keep-cross-aggregate-rules-on-a-rule-page) | rule | any | domain | record:rule | records | rule | guidance | Which cross-aggregate rules sit outside a rule page? Look at the rule entries beside their aggregate pages. |
| litespec/core/domain-model#keep-model-invariants-in-rules | [Keep Model Invariants in Rules](https://litespec.dev/4.0.0/core/domain-model.md#keep-model-invariants-in-rules) | rule | any | domain | record:rule | records | rule | guidance | Which setting pages hold a model invariant? Look at the settings beside the rules. |
| litespec/core/domain-model#keep-the-negation-word-in-the-rule-name | [Keep the Negation Word in the Rule Name](https://litespec.dev/4.0.0/core/domain-model.md#keep-the-negation-word-in-the-rule-name) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` reports `rule-name-invalid` for a rule whose statement says `not`, `no`, `never`, or `cannot` while its name keeps no restricting word or uniqueness. |
| litespec/core/domain-model#leave-states-off-every-store | [Leave States off Every Store](https://litespec.dev/4.0.0/core/domain-model.md#leave-states-off-every-store) | rule | any | domain | aggregate | records | rule | checkable | `litespec model check` fails a store aggregate carrying `states`. |
| litespec/core/domain-model#mark-each-term-with-its-layer | [Mark Each Term with Its Layer](https://litespec.dev/4.0.0/core/domain-model.md#mark-each-term-with-its-layer) | rule | any | domain | record:term | records | rule | checkable | `litespec model check` fails a glossary term without `layer`, and each behavior term lists the synonyms its readers know in `aliases`. |
| litespec/core/domain-model#model-each-aggregate-lifecycle-with-states | [Model Each Aggregate Lifecycle with States](https://litespec.dev/4.0.0/core/domain-model.md#model-each-aggregate-lifecycle-with-states) | rule | any | domain | aggregate | records | rule | checkable | `litespec model check` fails an entity or saga page without `states` entries carrying a name and a meaning. |
| litespec/core/domain-model#name-each-module-after-its-capability | [Name Each Module After Its Capability](https://litespec.dev/4.0.0/core/domain-model.md#name-each-module-after-its-capability) | convention | any | domain | record:module | records | default | guidance | Does every aggregate in this module serve the capability the module name states? Look at the aggregates beside the module name. |
| litespec/core/domain-model#name-every-event-in-the-past-tense | [Name Every Event in the Past Tense](https://litespec.dev/4.0.0/core/domain-model.md#name-every-event-in-the-past-tense) | rule | any | domain | domain-event | records | rule | guidance | Which event names read as an order rather than a completed fact? Look at the event entries beside their raising acts. |
| litespec/core/domain-model#name-the-owner-of-every-store | [Name the Owner of Every Store](https://litespec.dev/4.0.0/core/domain-model.md#name-the-owner-of-every-store) | rule | any | domain | aggregate | records | rule | checkable | `litespec model check` fails a store aggregate page without `owner`. |
| litespec/core/domain-model#name-the-refusal-a-broken-rule-produces | [Name the Refusal a Broken Rule Produces](https://litespec.dev/4.0.0/core/domain-model.md#name-the-refusal-a-broken-rule-produces) | rule | any | domain | record:rule | records | rule | guidance | Which guarded rules name no refusal in `refusal`? Look at the rule entries beside the results they refuse. |
| litespec/core/domain-model#raise-every-event-through-its-aggregate-root | [Raise Every Event Through Its Aggregate Root](https://litespec.dev/4.0.0/core/domain-model.md#raise-every-event-through-its-aggregate-root) | rule | any | domain | domain-event | records | rule | guidance | Which events leave from outside the root of their aggregate? Look at the aggregate code beside the event entries. |
| litespec/core/domain-model#release-every-reservation-by-a-named-use-case | [Release Every Reservation by a Named Use Case](https://litespec.dev/4.0.0/core/domain-model.md#release-every-reservation-by-a-named-use-case) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` reports `reservation-release-missing` for a reservation rule whose `releasedBy` names neither a use case nor `{ "mode": "never", "reason": "..." }` with its cost. |
| litespec/core/domain-model#state-each-event-with-meaning-and-carries | [State Each Event with Meaning and Carries](https://litespec.dev/4.0.0/core/domain-model.md#state-each-event-with-meaning-and-carries) | rule | any | domain | domain-event | records | rule | checkable | `litespec model check` fails an event entry without `meaning` or `carries`. |
| litespec/core/domain-model#state-each-rule-with-its-kind | [State Each Rule with Its Kind](https://litespec.dev/4.0.0/core/domain-model.md#state-each-rule-with-its-kind) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` fails a rule entry without `kind` or `statement`. |
| litespec/core/domain-model#state-every-module-dependency | [State Every Module Dependency](https://litespec.dev/4.0.0/core/domain-model.md#state-every-module-dependency) | rule | any | domain | record:module | records | rule | guidance | Which modules rely on a module that `dependsOn` does not name? Look at the module pages beside the modules they rely on. |
| litespec/core/domain-model#tabulate-every-calculation-with-examples | [Tabulate Every Calculation with Examples](https://litespec.dev/4.0.0/core/domain-model.md#tabulate-every-calculation-with-examples) | rule | any | domain | record:rule | records | rule | checkable | `litespec model check` reports `calculation-table-missing` for a calculation rule with no scenario examples table. |
| litespec/core/edges#claim-every-notification-promise-from-a-requirement | [Claim Every Notification Promise from a Requirement](https://litespec.dev/4.0.0/core/edges.md#claim-every-notification-promise-from-a-requirement) | rule | any | records | record:notification | records | rule | guidance | Which notification claims lack a cited requirement? Look at the claims beside each notification. |
| litespec/core/edges#describe-every-external-system-operation | [Describe Every External System Operation](https://litespec.dev/4.0.0/core/edges.md#describe-every-external-system-operation) | rule | any | records | record:external-system | records | rule | checkable | `litespec model check` fails an external system operation without direction, timeout, timeout handling, response, or cache. |
| litespec/core/edges#describe-every-integration-event-for-its-direction | [Describe Every Integration Event for Its Direction](https://litespec.dev/4.0.0/core/edges.md#describe-every-integration-event-for-its-direction) | rule | any | records | record:integration-event | records | rule | checkable | `litespec model check` fails an integration event without direction, CloudEvents identity, typed payload, or trust. |
| litespec/core/edges#describe-every-notification-with-audience-channel-and-consent | [Describe Every Notification with Audience Channel and Consent](https://litespec.dev/4.0.0/core/edges.md#describe-every-notification-with-audience-channel-and-consent) | rule | any | records | record:notification | records | rule | checkable | `litespec model check` reports `notification-sender-missing` for a notification no use case, reaction, or job sends, and fails a notification without its declared fields. |
| litespec/core/edges#give-each-entry-point-a-kind | [Give Each Entry Point a Kind](https://litespec.dev/4.0.0/core/edges.md#give-each-entry-point-a-kind) | rule | any | records | record:entry-point | records | rule | checkable | `litespec model check` fails an entry point without `kind` or `auth`. |
| litespec/core/edges#give-every-browser-step-a-screen | [Give Every Browser Step a Screen](https://litespec.dev/4.0.0/core/edges.md#give-every-browser-step-a-screen) | rule | any | records | record:screen | records | rule | checkable | `litespec model check` reports `step-screen-missing` (level G) for a step a browser or device use case serves that no screen serves. |
| litespec/core/edges#give-every-page-its-screen-record | [Give Every Page Its Screen Record](https://litespec.dev/4.0.0/core/edges.md#give-every-page-its-screen-record) | rule | any | records | route, record:screen | traced | rule | checkable | `litespec model check` reports `screen-unimplemented` (level S) for a screen no route marks, and `behavior-unrecorded` (level S) for a route with no mark or a mark naming no screen. |
| litespec/core/edges#give-every-screen-an-address-or-a-host | [Give Every Screen an Address or a Host](https://litespec.dev/4.0.0/core/edges.md#give-every-screen-an-address-or-a-host) | rule | any | records | record:screen | records | rule | checkable | `litespec model check` fails a screen without exactly one of `address` and `host`. |
| litespec/core/edges#keep-notification-templates-and-the-template-store-one-set | [Keep Notification Templates and the Template Store One Set](https://litespec.dev/4.0.0/core/edges.md#keep-notification-templates-and-the-template-store-one-set) | rule | any | records | record:notification | records | rule | checkable | `litespec model check` reports `template-unimplemented` (level S) for a declared key the store the stack page names lacks, and `template-unrecorded` (level S) for a stored key no notification declares, in a project whose stack configuration names a template store. |
| litespec/core/edges#match-a-screens-offers-to-its-calls | [Match a Screen's Offers to Its Calls](https://litespec.dev/4.0.0/core/edges.md#match-a-screens-offers-to-its-calls) | rule | any | records | record:screen | records | rule | checkable | `litespec model check` reports `screen-offers-drift` (level S) for a screen whose `offers` and computed calls differ, naming each use case on one side only. |
| litespec/core/edges#name-each-template-for-its-subject-event-and-audience | [Name Each Template for Its Subject, Event and Audience](https://litespec.dev/4.0.0/core/edges.md#name-each-template-for-its-subject-event-and-audience) | rule | any | records | record:notification | records | rule | checkable | `litespec model check` reports `template-key-invalid` (level A) for a template key ending in no name the notification declares in `addresses`. |
| litespec/core/edges#name-published-events-in-the-domains-words | [Name Published Events in the Domain's Words](https://litespec.dev/4.0.0/core/edges.md#name-published-events-in-the-domains-words) | rule | any | records | record:integration-event | records | advice | checkable | `litespec model check` reports `integration-event-name-invalid` (level G) for an outbound event named with an internal word. |
| litespec/core/edges#publish-every-outbound-integration-event-from-effects | [Publish Every Outbound Integration Event from Effects](https://litespec.dev/4.0.0/core/edges.md#publish-every-outbound-integration-event-from-effects) | rule | any | records | record:use-case, record:reaction, record:job | records | rule | checkable | `litespec model check` reports `effect-undeclared` for an emitted integration event no record declares in effects. |
| litespec/core/edges#reach-every-inbound-integration-event-through-a-webhook | [Reach Every Inbound Integration Event Through a Webhook](https://litespec.dev/4.0.0/core/edges.md#reach-every-inbound-integration-event-through-a-webhook) | rule | any | records | record:integration-event | records | rule | guidance | Which inbound integration events lack a webhook entry point as their door? Look at the inbound events beside the entry points. |
| litespec/core/edges#serve-only-the-steps-a-screens-use-cases-serve | [Serve Only the Steps a Screen's Use Cases Serve](https://litespec.dev/4.0.0/core/edges.md#serve-only-the-steps-a-screens-use-cases-serve) | rule | any | records | record:screen | records | rule | checkable | `litespec model check` reports `screen-serves-drift` (level G) for a served step no offered use case serves. |
| litespec/core/edges#serve-static-content-through-served-content | [Serve Static Content Through Served Content](https://litespec.dev/4.0.0/core/edges.md#serve-static-content-through-served-content) | rule | any | records | record:entry-point | records | rule | guidance | Which static scripts or legal texts sit outside served content, or lack path, content type, cache control, or versioning? Look at the static files beside the served-content entries. |
| litespec/core/edges#show-every-refusal-a-screen-can-reach | [Show Every Refusal a Screen Can Reach](https://litespec.dev/4.0.0/core/edges.md#show-every-refusal-a-screen-can-reach) | rule | any | records | record:screen, test | traced | rule | checkable | `litespec model check` reports `refusal-sentence-missing` (level A) for a refusal a screen can reach with neither a sentence in its frontend's `refusalDictionary` nor a browser test asserting its code. |
| litespec/core/edges#use-every-declared-template-parameter | [Use Every Declared Template Parameter](https://litespec.dev/4.0.0/core/edges.md#use-every-declared-template-parameter) | rule | any | records | record:notification | records | rule | checkable | `litespec model check` reports `template-param-drift` (level S) for a declared parameter whose placeholder, in the case the stack page states, appears in none of its template's texts. |
| litespec/core/intent#admit-only-outside-pains-as-problems | [Admit Only Outside Pains as Problems](https://litespec.dev/4.0.0/core/intent.md#admit-only-outside-pains-as-problems) | rule | any | records | record:problem | records | rule | checkable | `litespec model check` reports `problem-sufferer-invalid` for a problem whose primary sufferer is no person or organization outside the team; `litespec model check` reports `record-invalid` for a problem record file missing `affects`, `summary` or `statement`. |
| litespec/core/intent#answer-every-constraint | [Answer Every Constraint](https://litespec.dev/4.0.0/core/intent.md#answer-every-constraint) | rule | any | records | record:constraint | records | rule | checkable | `litespec model check` reports `record-invalid` for a constraint record file missing a required field; the builder generates What It Requires from citing requirements. |
| litespec/core/intent#cite-each-applying-constraint-from-a-requirement | [Cite Each Applying Constraint from a Requirement](https://litespec.dev/4.0.0/core/intent.md#cite-each-applying-constraint-from-a-requirement) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `constraint-unreached` for a constraint with `applies: true` that no requirement cites. |
| litespec/core/intent#cite-the-reasons-of-every-requirement | [Cite the Reasons of Every Requirement](https://litespec.dev/4.0.0/core/intent.md#cite-the-reasons-of-every-requirement) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `requirement-cites-missing` for a requirement entry naming no reason in `cites`. |
| litespec/core/intent#define-each-recurring-capitalized-phrase | [Define Each Recurring Capitalized Phrase](https://litespec.dev/4.0.0/core/intent.md#define-each-recurring-capitalized-phrase) | rule | any | records | record:term | records | rule | checkable | `litespec model check` reports `term-missing` for a capitalized phrase of two to four words named in three or more records that no glossary term defines. |
| litespec/core/intent#describe-every-journey | [Describe Every Journey](https://litespec.dev/4.0.0/core/intent.md#describe-every-journey) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `record-invalid` for a journey record file missing `summary`. |
| litespec/core/intent#explain-each-requirement-in-one-line | [Explain Each Requirement in One Line](https://litespec.dev/4.0.0/core/intent.md#explain-each-requirement-in-one-line) | rule | any | records | record:requirement | records | rule | guidance | The one-line `rationale` on each requirement entry. |
| litespec/core/intent#explain-every-problem-in-four-sections | [Explain Every Problem in Four Sections](https://litespec.dev/4.0.0/core/intent.md#explain-every-problem-in-four-sections) | rule | any | records | record:problem | records | rule | guidance | The four sections, in order, in each problem explanation file. |
| litespec/core/intent#grade-problem-evidence-by-kind | [Grade Problem Evidence by Kind](https://litespec.dev/4.0.0/core/intent.md#grade-problem-evidence-by-kind) | rule | any | records | record:problem | records | rule | checkable | `litespec model check` reports `problem-evidence-missing` for a problem with only assumed evidence or none. The builder writes `evidenceStrength` on each problem in the model. |
| litespec/core/intent#group-product-records-by-module | [Group Product Records by Module](https://litespec.dev/4.0.0/core/intent.md#group-product-records-by-module) | convention | any | records | record:product, record:goal, record:problem, record:constraint, record:decision, record:research, record:actor, record:role, record:journey, record:module, record:feature | records | default | guidance | The `.litespec/intent/` layout beside the project's recorded layout. |
| litespec/core/intent#identify-every-requirement | [Identify Every Requirement](https://litespec.dev/4.0.0/core/intent.md#identify-every-requirement) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `record-invalid` for a requirement entry without identifier; `litespec model check` reports `identifier-invalid` for a feature segment differing from its feature. |
| litespec/core/intent#keep-actors-to-people-and-organizations | [Keep Actors to People and Organizations](https://litespec.dev/4.0.0/core/intent.md#keep-actors-to-people-and-organizations) | rule | any | records | record:actor | records | rule | checkable | `litespec model check` reports `record-invalid` for an actor record file with a kind outside person and organization, or with no `belongsToTeam`; `litespec model check` reports `field-invalid` for such a kind. |
| litespec/core/intent#keep-behavior-out-of-intent | [Keep Behavior Out of Intent](https://litespec.dev/4.0.0/core/intent.md#keep-behavior-out-of-intent) | rule | any | records | any | records | rule | guidance | Intent records under `.litespec/intent/` free of the detail the Statement names. |
| litespec/core/intent#keep-company-operation-out-of-intent | [Keep Company Operation Out of Intent](https://litespec.dev/4.0.0/core/intent.md#keep-company-operation-out-of-intent) | rule | any | records | any | records | rule | guidance | Intent and Behavior records stating company operation beside the constraints and research that carry the binding facts. |
| litespec/core/intent#keep-intent-in-its-homes | [Keep Intent in Its Homes](https://litespec.dev/4.0.0/core/intent.md#keep-intent-in-its-homes) | rule | any | records | record:product, record:goal, record:problem, record:constraint, record:decision, record:research, record:actor, record:role, record:journey, record:module, record:feature | records | rule | checkable | `litespec model check` reports a blocking finding for a record outside its home, a folder under `intent/modules/` naming no declared module, a module folder without its module, a record type outside its allowed levels, and a link from another module to a module-local record. |
| litespec/core/intent#move-every-goal-with-a-journey-or-a-quality-requirement | [Move Every Goal with a Journey or a Quality Requirement](https://litespec.dev/4.0.0/core/intent.md#move-every-goal-with-a-journey-or-a-quality-requirement) | rule | any | records | record:goal | records | rule | checkable | `litespec model check` reports `goal-mover-missing` for a goal moved by no journey and no quality requirement. |
| litespec/core/intent#name-each-sibling-problem-or-merge-it | [Name Each Sibling Problem or Merge It](https://litespec.dev/4.0.0/core/intent.md#name-each-sibling-problem-or-merge-it) | rule | any | records | record:problem | records | rule | guidance | Which problems share a sufferer and a feature yet name neither each other nor a merge? Look at the problems cited from each feature. |
| litespec/core/intent#name-every-actor-from-a-journey-a-problem-or-an-access-position | [Name Every Actor from a Journey, a Problem or an Access Position](https://litespec.dev/4.0.0/core/intent.md#name-every-actor-from-a-journey-a-problem-or-an-access-position) | rule | any | records | record:actor | records | rule | checkable | `litespec model check` reports `actor-unused` for an actor named by no journey, problem or access position. |
| litespec/core/intent#name-no-solution-in-a-problem-statement | [Name No Solution in a Problem Statement](https://litespec.dev/4.0.0/core/intent.md#name-no-solution-in-a-problem-statement) | rule | any | records | record:problem | records | rule | guidance | Which problem statements name a product, a feature, or a solution? Look at the problem statements beside their sufferers. |
| litespec/core/intent#name-product-decisions-in-one-numbered-sequence | [Name Product Decisions in One Numbered Sequence](https://litespec.dev/4.0.0/core/intent.md#name-product-decisions-in-one-numbered-sequence) | convention | any | records | record:decision | records | default | guidance | Each decision file named `<number>-<name>.yaml` beside its matching identifier. |
| litespec/core/intent#order-each-journey-toward-one-goal | [Order Each Journey Toward One Goal](https://litespec.dev/4.0.0/core/intent.md#order-each-journey-toward-one-goal) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `record-invalid` for a journey record file missing its `actor`, `serves`, `summary`, `finishedWhen`, `steps`, or `betweenSteps`. |
| litespec/core/intent#perform-each-journey-step-with-an-actor-or-a-system | [Perform Each Journey Step with an Actor or a System](https://litespec.dev/4.0.0/core/intent.md#perform-each-journey-step-with-an-actor-or-a-system) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `record-invalid` for a journey step carrying both `actor` and `system`; `litespec model check` reports `field-invalid` for such a step or for a `system` naming no external system, job or reaction. |
| litespec/core/intent#reach-every-intent-record-with-behavior | [Reach Every Intent Record with Behavior](https://litespec.dev/4.0.0/core/intent.md#reach-every-intent-record-with-behavior) | rule | any | records | any | records | rule | checkable | `litespec model check` reports a blocking finding for a record that reaches no Behavior. |
| litespec/core/intent#record-each-decision-option-with-pros-and-cons | [Record Each Decision Option with Pros and Cons](https://litespec.dev/4.0.0/core/intent.md#record-each-decision-option-with-pros-and-cons) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `record-invalid` for a decision option missing `pros` or `cons`. |
| litespec/core/intent#record-research-with-read-sources | [Record Research with Read Sources](https://litespec.dev/4.0.0/core/intent.md#record-research-with-read-sources) | rule | any | records | record:research | records | rule | checkable | `litespec model check` reports `record-invalid` for a research record file without `question`, `conclusion`, or `sources`; `litespec model check` reports `explanation-missing` for a research record without Answer in its explanation file, `source-link-bare` for a bare URL, `source-key-unknown` for an unknown key, and `source-unused` for an unused source. |
| litespec/core/intent#restrict-requirement-fulfillment-to-behavior | [Restrict Requirement Fulfillment to Behavior](https://litespec.dev/4.0.0/core/intent.md#restrict-requirement-fulfillment-to-behavior) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `requirement-fulfillment-missing` for a requirement no Behavior record fulfills. |
| litespec/core/intent#shape-each-decision-page | [Shape Each Decision Page](https://litespec.dev/4.0.0/core/intent.md#shape-each-decision-page) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `record-invalid` for a decision record file missing a required field; `litespec model check` reports `explanation-missing` for a decision without Context in its explanation file. |
| litespec/core/intent#shape-each-module-page | [Shape Each Module Page](https://litespec.dev/4.0.0/core/intent.md#shape-each-module-page) | rule | any | records | record:module | records | rule | checkable | `litespec model check` reports `record-invalid` for a module record file missing a required field. |
| litespec/core/intent#state-each-exception-with-its-fallback | [State Each Exception with Its Fallback](https://litespec.dev/4.0.0/core/intent.md#state-each-exception-with-its-fallback) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports no `except-fallback-missing` finding. |
| litespec/core/intent#state-each-feature-with-its-offering | [State Each Feature with Its Offering](https://litespec.dev/4.0.0/core/intent.md#state-each-feature-with-its-offering) | rule | any | records | record:feature | records | rule | guidance | Which features miss their offering, their solved problems, or their moved goals? Look at each feature record beside its problems and goals. |
| litespec/core/intent#state-each-goal-with-its-measure | [State Each Goal with Its Measure](https://litespec.dev/4.0.0/core/intent.md#state-each-goal-with-its-measure) | rule | any | records | record:goal | records | rule | checkable | `litespec model check` reports `record-invalid` for a goal record file missing a required field. |
| litespec/core/intent#state-each-problem-with-its-evidence | [State Each Problem with Its Evidence](https://litespec.dev/4.0.0/core/intent.md#state-each-problem-with-its-evidence) | rule | any | records | record:problem | records | rule | checkable | `litespec model check` reports `record-invalid` for a problem record file missing its `summary` or `statement`. |
| litespec/core/intent#state-each-quality-requirement-as-a-scenario | [State Each Quality Requirement as a Scenario](https://litespec.dev/4.0.0/core/intent.md#state-each-quality-requirement-as-a-scenario) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `record-invalid` for a quality requirement missing `stimulus`, `environment`, `response`, `measure`, or `check`. |
| litespec/core/intent#state-one-product | [State One Product](https://litespec.dev/4.0.0/core/intent.md#state-one-product) | rule | any | records | record:product | records | rule | checkable | `litespec model check` reports no `product-count-invalid` finding, and `litespec model check` reports `record-invalid` for product fields outside the record schema. |
| litespec/core/intent#state-requirement-kind-and-statement | [State Requirement Kind and Statement](https://litespec.dev/4.0.0/core/intent.md#state-requirement-kind-and-statement) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `record-invalid` for a requirement entry without `kind` or `statement`, or a policy requirement without dated values. |
| litespec/core/intent#state-the-cost-and-workaround-of-every-problem | [State the Cost and Workaround of Every Problem](https://litespec.dev/4.0.0/core/intent.md#state-the-cost-and-workaround-of-every-problem) | rule | any | records | record:problem | records | rule | guidance | The cost and the workaround, each in the sufferer's own units or the word `unknown`, in Who Has It and What They Do Today of each problem explanation file. |
| litespec/core/intent#state-the-measure-on-a-counted-requirement | [State the Measure on a Counted Requirement](https://litespec.dev/4.0.0/core/intent.md#state-the-measure-on-a-counted-requirement) | rule | any | records | record:requirement | records | rule | checkable | `litespec model check` reports `requirement-measure-missing` for a requirement carrying `measure` without `check` or a passing run, and for a statement naming a number with no `measure`. |
| litespec/core/intent#state-when-each-journey-finishes | [State When Each Journey Finishes](https://litespec.dev/4.0.0/core/intent.md#state-when-each-journey-finishes) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `record-invalid` for a journey record file missing `finishedWhen`. |
| litespec/core/intent#treat-generated-research-as-source-material | [Treat Generated Research as Source Material](https://litespec.dev/4.0.0/core/intent.md#treat-generated-research-as-source-material) | rule | any | records | any | records | rule | guidance | A research record or a decision behind each position built from generated records. |
| litespec/core/intent#treat-tenant-set-values-as-data | [Treat Tenant-Set Values as Data](https://litespec.dev/4.0.0/core/intent.md#treat-tenant-set-values-as-data) | rule | any | records | record:requirement | records | rule | guidance | Each `setBy: tenant` value stored as tenant data. |
| litespec/core/intent#write-journey-steps-as-sentences-with-ids | [Write Journey Steps as Sentences with Ids](https://litespec.dev/4.0.0/core/intent.md#write-journey-steps-as-sentences-with-ids) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `record-invalid` for a journey step missing `id` or `statement`, or naming a use case. |
| litespec/core/language#keep-names-an-outside-standard-fixes | [Keep Names an Outside Standard Fixes](https://litespec.dev/4.0.0/core/language.md#keep-names-an-outside-standard-fixes) | rule | any | records | - | records | rule | guidance | Which fixed names were renamed to fit the grammar? Look at the Gherkin fields and CloudEvents attributes the change touches. |
| litespec/core/language#name-a-boolean-as-a-predicate | [Name a Boolean as a Predicate](https://litespec.dev/4.0.0/core/language.md#name-a-boolean-as-a-predicate) | rule | any | records | - | records | rule | guidance | Which boolean fields read as something other than a predicate, or carry an `is` or `has` prefix? Look at the boolean fields the change adds. |
| litespec/core/language#name-commands-as-verbs-and-flags-by-what-they-set | [Name Commands as Verbs and Flags by What They Set](https://litespec.dev/4.0.0/core/language.md#name-commands-as-verbs-and-flags-by-what-they-set) | rule | any | records | - | records | rule | guidance | Which subcommands read as nouns, or which flags name something other than their mode or value? Look at the commands and flags the change adds. |
| litespec/core/language#name-each-date-by-what-it-marks | [Name Each Date by What It Marks](https://litespec.dev/4.0.0/core/language.md#name-each-date-by-what-it-marks) | rule | any | records | - | records | rule | checkable | `litespec-maintain validate` emits no `FIELD_NAME_SHAPE` diagnostic for a date field. |
| litespec/core/language#name-each-field-by-its-word-class | [Name Each Field by Its Word Class](https://litespec.dev/4.0.0/core/language.md#name-each-field-by-its-word-class) | rule | any | records | - | records | rule | guidance | Which fields break their word class? Look at the field names the change adds, beside the word-class table. |
| litespec/core/language#name-each-finding-code-by-subject-and-problem | [Name Each Finding Code by Subject and Problem](https://litespec.dev/4.0.0/core/language.md#name-each-finding-code-by-subject-and-problem) | rule | any | records | - | records | rule | guidance | Which finding codes miss the subject-problem form or use a problem word outside the fourteen? Look at the finding codes the change adds, beside the problem-word table. |
| litespec/core/language#name-each-record-by-its-types-name-form | [Name Each Record by Its Types Name Form](https://litespec.dev/4.0.0/core/language.md#name-each-record-by-its-types-name-form) | rule | any | records | - | records | rule | guidance | Which record names miss the name form of their type? Look at the identifiers the change adds, beside the record-name table. |
| litespec/core/language#write-each-finding-message-as-a-fact | [Write Each Finding Message as a Fact](https://litespec.dev/4.0.0/core/language.md#write-each-finding-message-as-a-fact) | rule | any | records | - | records | rule | guidance | Which finding messages instruct instead of stating a fact, or open without the subject and identifier? Look at the messages the change adds. |
| litespec/core/language#write-each-kind-of-text-in-its-form | [Write Each Kind of Text in Its Form](https://litespec.dev/4.0.0/core/language.md#write-each-kind-of-text-in-its-form) | rule | any | records | - | records | rule | guidance | Which texts miss the form of their kind? Look at the statements, steps, and meanings the change adds, beside the text-kind table. |
| litespec/core/language#write-each-value-in-the-value-style | [Write Each Value in the Value Style](https://litespec.dev/4.0.0/core/language.md#write-each-value-in-the-value-style) | rule | any | records | - | records | rule | guidance | Which statement, meaning, rationale, condition, failure, or title values miss the value style of their row? Look at the values the change adds, beside the value-style table. |
| litespec/core/language#write-in-american-english | [Write in American English](https://litespec.dev/4.0.0/core/language.md#write-in-american-english) | rule | any | records | - | records | rule | guidance | Which words use British spelling? Look at the field names, enum values, and prose the change adds. |
| litespec/core/language#write-quantities-in-standard-units | [Write Quantities in Standard Units](https://litespec.dev/4.0.0/core/language.md#write-quantities-in-standard-units) | rule | any | records | - | records | rule | guidance | Which quantities use free text or miss their unit? Look at the dates, durations, money values, and numbers the change adds. |
| litespec/core/layers#add-behavior-detail-when-specifying-intent | [Add Behavior Detail When Specifying Intent](https://litespec.dev/4.0.0/core/layers.md#add-behavior-detail-when-specifying-intent) | rule | any | records | any | records | rule | checkable | `litespec model check` emits no `requirement-fulfillment-missing`, `record-link-missing`, `step-use-case-missing`, `erasure-undeclared`, or `setting-requirement-missing` finding across Behavior records. |
| litespec/core/layers#build-ahead-of-a-regulation-only-under-its-constraint | [Build Ahead of a Regulation Only Under Its Constraint](https://litespec.dev/4.0.0/core/layers.md#build-ahead-of-a-regulation-only-under-its-constraint) | rule | any | records | record:constraint | records | rule | guidance | Which anticipatory behavior lacks a citing constraint, or blocks a release before the statutory date? Look at the regulation-driven Behavior records beside the constraint and its date. |
| litespec/core/layers#close-incident-exceptions-within-seven-days | [Close Incident Exceptions Within Seven Days](https://litespec.dev/4.0.0/core/layers.md#close-incident-exceptions-within-seven-days) | rule | any | records | record:exception | records | rule | guidance | Which incident fixes lack an exception, or carry an expired one? Look at the exception records beside each fix. |
| litespec/core/layers#enter-world-facts-as-cited-research-or-constraints | [Enter World Facts as Cited Research or Constraints](https://litespec.dev/4.0.0/core/layers.md#enter-world-facts-as-cited-research-or-constraints) | rule | any | records | record:research, record:constraint | records | rule | guidance | Which world facts entered without a cited and dated research or constraint record? Look at the provider, regulation, and incident facts the change relies on. |
| litespec/core/layers#implement-only-declared-behavior | [Implement Only Declared Behavior](https://litespec.dev/4.0.0/core/layers.md#implement-only-declared-behavior) | rule | any | records | record:use-case, record:reaction, record:job | traced | rule | checkable | `litespec model check` emits no `behavior-unrecorded`, `write-undeclared`, `result-undeclared`, `effect-undeclared`, or `refusal-unimplemented` finding across the implementation. |
| litespec/core/layers#prove-each-scenario-through-the-public-boundary | [Prove Each Scenario Through the Public Boundary](https://litespec.dev/4.0.0/core/layers.md#prove-each-scenario-through-the-public-boundary) | rule | any | records | record:scenario | records | rule | checkable | `litespec model check` emits no `use-case-scenario-missing` or `proves-unreached` finding across scenarios and tests. |
| litespec/core/layers#raise-open-needs-as-owner-questions-or-backlog-items | [Raise Open Needs as Owner Questions or Backlog Items](https://litespec.dev/4.0.0/core/layers.md#raise-open-needs-as-owner-questions-or-backlog-items) | rule | any | records | any | records | rule | guidance | Which unstated needs lack a question to the owner or a backlog item? Look at the added records from a lower record layer, beside the owner questions and the backlog. |
| litespec/core/layers#record-changed-provider-behavior-as-observed-research | [Record Changed Provider Behavior as Observed Research](https://litespec.dev/4.0.0/core/layers.md#record-changed-provider-behavior-as-observed-research) | rule | any | records | record:research, record:constraint | records | rule | guidance | Which provider changes lack observed research and a citing constraint? Look at the provider facts the change relies on, beside the research records. |
| litespec/core/layers#send-commercial-and-observable-figures-to-the-owner | [Send Commercial and Observable Figures to the Owner](https://litespec.dev/4.0.0/core/layers.md#send-commercial-and-observable-figures-to-the-owner) | rule | any | records | record:setting, record:rule | records | rule | guidance | Which figures the owner sets did Behavior fix without asking? Look at the settings and rules the change adds, beside the list of owner-set figures on the model page. |
| litespec/core/layers#write-each-layer-from-the-layer-above-it | [Write Each Layer from the Layer Above It](https://litespec.dev/4.0.0/core/layers.md#write-each-layer-from-the-layer-above-it) | rule | any | records | any | records | rule | checkable | `litespec model check` emits no `behavior-unrecorded` finding for a refusal literal, a screen call to no endpoint, or an engine step mapping to no use case, and reports `mark-missing` for a code element that carries no mark. |
| litespec/core/maintaining#keep-provision-identifiers-stable-within-a-major-version | [Keep Provision Identifiers Stable Within a Major Version](https://litespec.dev/4.0.0/core/maintaining.md#keep-provision-identifiers-stable-within-a-major-version) | rule | any | workspace | - | records | rule | guidance | Which provision identifiers did a minor release remove or rename? Compare the provision index at the previous tag with the provision index of the release, beside the changelog entry that lists the generated diff. |
| litespec/core/maintaining#list-every-stack-shape-and-extension-in-the-manifest | [List Every Stack Shape and Extension in the Manifest](https://litespec.dev/4.0.0/core/maintaining.md#list-every-stack-shape-and-extension-in-the-manifest) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` fails when a stack, shape, extension, or pin the release carries is missing from the manifest. |
| litespec/core/maintaining#mark-the-tools-with-the-provisions-they-follow | [Mark the Tools with the Provisions They Follow](https://litespec.dev/4.0.0/core/maintaining.md#mark-the-tools-with-the-provisions-they-follow) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits `MARK_MISSING` for a class with a method and no `follows` mark in a source project under `apps/`, and `MARK_UNRESOLVED` for a `follows` or `proves` mark in a .NET project under `apps/`, outside its `Fixtures` folders, that names no provision in `docs/reference/provisions.md`. |
| litespec/core/maintaining#publish-a-litespec-release-from-a-tag | [Publish a LiteSpec Release from a Tag](https://litespec.dev/4.0.0/core/maintaining.md#publish-a-litespec-release-from-a-tag) | rule | any | workspace | - | records | rule | checkable | `dotnet test --solution LiteSpec.slnx` fails `ReleaseVersionTests` when the changelog, the template, or either package version differs from the manifest version, and `.github/workflows/release.yml` refuses a tag that does not name the manifest version. |
| litespec/core/maintaining#record-the-reasoning-behind-each-release | [Record the Reasoning Behind Each Release](https://litespec.dev/4.0.0/core/maintaining.md#record-the-reasoning-behind-each-release) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `RECORD_SCHEMA`, `RECORD_ID_MISMATCH`, `RECORD_SOURCE`, `RECORD_UNKNOWN_REFERENCE`, or `RECORD_DECISION_UNCITED` diagnostic. |
| litespec/core/maintaining#replace-every-citation-on-a-rename | [Replace Every Citation on a Rename](https://litespec.dev/4.0.0/core/maintaining.md#replace-every-citation-on-a-rename) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `ID_UNKNOWN_REFERENCE` diagnostic. |
| litespec/core/maintaining#state-the-provision-lifecycle | [State the Provision Lifecycle](https://litespec.dev/4.0.0/core/maintaining.md#state-the-provision-lifecycle) | rule | any | workspace | - | records | rule | guidance | Each provision sits in exactly one lifecycle state, with retired identifiers cited nowhere. |
| litespec/core/model#add-a-missing-fact-to-litespec-before-the-book-shows-it | [Add a Missing Fact to LiteSpec Before the Book Shows It](https://litespec.dev/4.0.0/core/model.md#add-a-missing-fact-to-litespec-before-the-book-shows-it) | rule | any | records | any | records | rule | guidance | Which facts does the book show that no record field, computed status or check defines? Look at the book beside the model output and the finding codes. |
| litespec/core/model#author-one-slice-at-a-time | [Author One Slice at a Time](https://litespec.dev/4.0.0/core/model.md#author-one-slice-at-a-time) | rule | any | records | record:feature | records | rule | guidance | Behavior records show Intent above them through their `fulfills` and `decides` links. |
| litespec/core/model#compute-completion-in-the-builder | [Compute Completion in the Builder](https://litespec.dev/4.0.0/core/model.md#compute-completion-in-the-builder) | rule | any | records | record:use-case, record:requirement, record:journey, record:feature, record:goal | traced | rule | guidance | Which features read below `proven`, and which children hold each one back? Look at `completion` on each feature in the model. |
| litespec/core/model#compute-proof-statuses-in-the-builder | [Compute Proof Statuses in the Builder](https://litespec.dev/4.0.0/core/model.md#compute-proof-statuses-in-the-builder) | rule | any | records | any | traced | rule | checkable | `litespec model check` reports `use-case-unimplemented`, `proves-unreached`, and `refusal-unimplemented` for a use case whose handler, proof, or refusal code is missing, and `proof-invalid` (level A) for a test that both passed and failed within the runs read. |
| litespec/core/model#connect-across-modules-only-through-declared-dependencies | [Connect Across Modules Only Through Declared Dependencies](https://litespec.dev/4.0.0/core/model.md#connect-across-modules-only-through-declared-dependencies) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `link-locality-invalid` for a record under a module that is linked from another module with no declared dependency or integration event. |
| litespec/core/model#connect-every-behavior-record-to-intent | [Connect Every Behavior Record to Intent](https://litespec.dev/4.0.0/core/model.md#connect-every-behavior-record-to-intent) | rule | any | records | record:use-case, record:reaction, record:job, record:notification, record:setting | records | rule | checkable | `litespec model check` reports `record-link-missing` for a use case, reaction, job, notification, or setting with neither `serves` nor `fulfills`, and `use-case-journey-missing` (level G) at large size for a use case that no reaction, job or other use case runs and that serves no journey step. |
| litespec/core/model#declare-one-mark-style | [Declare One Mark Style](https://litespec.dev/4.0.0/core/model.md#declare-one-mark-style) | rule | any | records | any | traced | rule | checkable | `litespec model check` reports `mark-style-invalid` (level S) for a mark written in a form its language does not take. |
| litespec/core/model#declare-size-and-stacks | [Declare Size and Stacks](https://litespec.dev/4.0.0/core/model.md#declare-size-and-stacks) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `size-type-missing` and `record-invalid` for a project missing its declaration or a required type. |
| litespec/core/model#explain-each-record-beside-its-record-file | [Explain Each Record Beside Its Record File](https://litespec.dev/4.0.0/core/model.md#explain-each-record-beside-its-record-file) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `explanation-orphaned` for a Markdown file under a record root with no frontmatter and no record file beside it. |
| litespec/core/model#explain-the-book-from-litespec-definitions | [Explain the Book from LiteSpec Definitions](https://litespec.dev/4.0.0/core/model.md#explain-the-book-from-litespec-definitions) | rule | any | records | any | records | rule | guidance | Which explanations in the book are not a glossary definition or a record type question? Look at the book's explanations beside the glossary and the record type table. |
| litespec/core/model#follow-the-authority-order | [Follow the Authority Order](https://litespec.dev/4.0.0/core/model.md#follow-the-authority-order) | rule | any | records | any | records | rule | guidance | Conflict decisions under `.litespec/intent/decisions/` name the higher record that won, in the order this page states. |
| litespec/core/model#give-every-record-one-parent | [Give Every Record One Parent](https://litespec.dev/4.0.0/core/model.md#give-every-record-one-parent) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `record-parent-missing` (level G) for a record whose required parent is missing. |
| litespec/core/model#give-every-use-case-its-results | [Give Every Use Case Its Results](https://litespec.dev/4.0.0/core/model.md#give-every-use-case-its-results) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `use-case-success-missing` and `scenario-result-unknown` for a use case missing its success or a scenario naming no result. |
| litespec/core/model#hold-module-rules-in-rule-sets | [Hold Module Rules in Rule Sets](https://litespec.dev/4.0.0/core/model.md#hold-module-rules-in-rule-sets) | rule | any | records | record:rule | records | rule | checkable | `litespec model check` reports `record-placement-invalid` for a rule in `module.yaml`. |
| litespec/core/model#implement-each-mapped-behavior-record-behind-a-mark | [Implement Each Mapped Behavior Record Behind a Mark](https://litespec.dev/4.0.0/core/model.md#implement-each-mapped-behavior-record-behind-a-mark) | rule | any | records | record:aggregate, record:reaction, record:job, record:external-system, record:use-case | traced | rule | checkable | `litespec model check` reports `aggregate-unimplemented`, `reaction-unimplemented`, `job-unimplemented`, `external-system-unimplemented`, and `use-case-endpoint-missing` (level S) for a record no mark names, where `aggregate-unimplemented` fires only for an entity aggregate, and `use-case-unreached` (level A) for a browser use case no screen calls. |
| litespec/core/model#keep-each-name-unique-in-the-product | [Keep Each Name Unique in the Product](https://litespec.dev/4.0.0/core/model.md#keep-each-name-unique-in-the-product) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `name-duplicate` for a name segment that occurs twice in the product. |
| litespec/core/model#keep-module-dependencies-free-of-cycles | [Keep Module Dependencies Free of Cycles](https://litespec.dev/4.0.0/core/model.md#keep-module-dependencies-free-of-cycles) | rule | any | records | record:module | records | rule | checkable | `litespec model check` reports `module-dependency-invalid` for a module dependency cycle. |
| litespec/core/model#keep-rules-and-targets-out-of-technical-decisions | [Keep Rules and Targets Out of Technical Decisions](https://litespec.dev/4.0.0/core/model.md#keep-rules-and-targets-out-of-technical-decisions) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `decision-basis-missing` (level A) for a technical decision whose `basedOn` names nothing, and counts a quality requirement as fulfilled when a technical decision names it in `basedOn`. |
| litespec/core/model#mark-every-check-with-its-level | [Mark Every Check with Its Level](https://litespec.dev/4.0.0/core/model.md#mark-every-check-with-its-level) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `reader-missing` (level S) for a frontend whose reader is missing or failing, and prints the level beside each finding. |
| litespec/core/model#match-each-backend-mark-to-its-folder | [Match Each Backend Mark to Its Folder](https://litespec.dev/4.0.0/core/model.md#match-each-backend-mark-to-its-folder) | rule | any | records | command-handler, query-handler, endpoint, reaction, job, aggregate | full | rule | checkable | `litespec model check` reports `mark-folder-drift` (level S) for a handler, endpoint, event handler, job host or aggregate root whose mark names a record outside its module and folder, and `code-placement-drift` (level S) for a code element, test, or folder outside its record's qualified path. |
| litespec/core/model#move-each-identifier-with-its-module | [Move Each Identifier with Its Module](https://litespec.dev/4.0.0/core/model.md#move-each-identifier-with-its-module) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `identifier-folder-drift` for an identifier whose home segment disagrees with its folder. |
| litespec/core/model#name-book-labels-with-litespec-terms | [Name Book Labels with LiteSpec Terms](https://litespec.dev/4.0.0/core/model.md#name-book-labels-with-litespec-terms) | rule | any | records | any | records | rule | guidance | Which book labels are neither a record type, a field name, a computed state, a glossary term, nor the reads-as phrase the Links table states for a connection? Look at the book beside the glossary and the Links table. |
| litespec/core/model#name-the-lowest-record-each-test-proves | [Name the Lowest Record Each Test Proves](https://litespec.dev/4.0.0/core/model.md#name-the-lowest-record-each-test-proves) | rule | any | records | test | records | rule | checkable | `litespec model check` reports `mark-missing` and `mark-unknown` (level S) for a test that names no record or a record of a kind a test does not take. |
| litespec/core/model#name-what-every-decision-decides | [Name What Every Decision Decides](https://litespec.dev/4.0.0/core/model.md#name-what-every-decision-decides) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `decision-decides-missing` for a product decision with an empty `decides` field, and `decision-decides-duplicate` for two decisions deciding one record. |
| litespec/core/model#organize-the-book-by-the-record-layers | [Organize the Book by the Record Layers](https://litespec.dev/4.0.0/core/model.md#organize-the-book-by-the-record-layers) | rule | any | records | any | records | rule | guidance | Which book headings or groupings are not a record layer, a record type, or a record the identifier names? Look at the book's outline beside this page's record type table. |
| litespec/core/model#point-every-book-entry-to-its-source | [Point Every Book Entry to Its Source](https://litespec.dev/4.0.0/core/model.md#point-every-book-entry-to-its-source) | rule | any | records | any | records | rule | guidance | Which book entries lack a link to their file and line? Look at the book's record, code, test and finding entries. |
| litespec/core/model#publish-each-integration-event-from-one-module | [Publish Each Integration Event from One Module](https://litespec.dev/4.0.0/core/model.md#publish-each-integration-event-from-one-module) | rule | any | records | record:integration-event | records | rule | checkable | `litespec model check` reports `event-publisher-invalid` for an integration event with a second publishing module. |
| litespec/core/model#reach-behavior-from-every-intent-record | [Reach Behavior from Every Intent Record](https://litespec.dev/4.0.0/core/model.md#reach-behavior-from-every-intent-record) | rule | any | records | record:goal, record:problem, record:feature, record:requirement, record:constraint, record:research, record:decision | records | rule | checkable | `litespec model check` reports `intent-unreached` for a record that reaches no Behavior; a local run reports it and the pull-request check blocks on it. The planned-Intent findings `requirement-fulfillment-missing`, `step-use-case-missing`, `goal-mover-missing` and `constraint-unreached` take the same outcome. |
| litespec/core/model#record-a-project-wide-lowering-as-an-exception | [Record a Project-Wide Lowering as an Exception](https://litespec.dev/4.0.0/core/model.md#record-a-project-wide-lowering-as-an-exception) | rule | any | records | record:exception | records | rule | checkable | `litespec model check` reports `analyzer-lowering-unrecorded` (level S) for a project-wide lowering in `.editorconfig`, `.globalconfig`, `<NoWarn>`, `#pragma warning disable` or `[SuppressMessage]` that no live exception covers. |
| litespec/core/model#record-accepted-gaps-as-exceptions | [Record Accepted Gaps as Exceptions](https://litespec.dev/4.0.0/core/model.md#record-accepted-gaps-as-exceptions) | rule | any | records | record:exception | records | rule | checkable | `litespec model check` reports `record-invalid` for an exception missing its date, `exception-expired` (level G) past its `expiresOn` date, and `exception-finding-unknown` (level G) for an exception naming a finding code no check uses. |
| litespec/core/model#record-each-screens-captures-from-the-gallery | [Record Each Screen's Captures from the Gallery](https://litespec.dev/4.0.0/core/model.md#record-each-screens-captures-from-the-gallery) | rule | any | records | record:screen | records | rule | guidance | Which screens with a route have no capture? Look at `captureState` `route-not-captured` on screen records in the model. |
| litespec/core/model#record-each-technical-choice-as-a-decision | [Record Each Technical Choice as a Decision](https://litespec.dev/4.0.0/core/model.md#record-each-technical-choice-as-a-decision) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `decision-unimplemented` (level S) for a technical decision that no code element follows. The check runs in the CLI only, with no analyzer rule: whether any code follows a decision is known only across every project, and one compilation sees one project. |
| litespec/core/model#render-generated-regions-from-the-model | [Render Generated Regions from the Model](https://litespec.dev/4.0.0/core/model.md#render-generated-regions-from-the-model) | convention | any | records | any | records | default | guidance | Which generated regions render code-computed facts? Look inside the generated fences beside the book and the model output. |
| litespec/core/model#report-unverified-use-cases | [Report Unverified Use Cases](https://litespec.dev/4.0.0/core/model.md#report-unverified-use-cases) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `use-case-unverified` (level A) for a use case whose scenarios are not all proved, and `litespec model check --release` blocks on it. |
| litespec/core/model#require-an-explanation-file-for-article-types | [Require an Explanation File for Article Types](https://litespec.dev/4.0.0/core/model.md#require-an-explanation-file-for-article-types) | rule | any | records | record:research, record:decision | records | rule | checkable | `litespec model check` reports `explanation-missing` for an article type with no explanation file or with a required H2 section missing. |
| litespec/core/model#resolve-every-page-link | [Resolve Every Page Link](https://litespec.dev/4.0.0/core/model.md#resolve-every-page-link) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `link-unknown` for a link that resolves to no file and no written record identifier. |
| litespec/core/model#serve-every-journey-step | [Serve Every Journey Step](https://litespec.dev/4.0.0/core/model.md#serve-every-journey-step) | rule | any | records | record:journey | records | rule | checkable | `litespec model check` reports `step-use-case-missing` for a journey step with no serving use case, reaction, or job, beside `step-screen-missing` for a step a browser or device use case serves that no screen serves. |
| litespec/core/model#show-only-computed-judgements-in-the-book | [Show Only Computed Judgements in the Book](https://litespec.dev/4.0.0/core/model.md#show-only-computed-judgements-in-the-book) | rule | any | records | any | records | rule | guidance | Which statuses, counts, orders or findings in the book does no builder output or check produce? Look at the book beside the model output. |
| litespec/core/model#split-record-fields-from-explanation | [Split Record Fields from Explanation](https://litespec.dev/4.0.0/core/model.md#split-record-fields-from-explanation) | rule | any | records | any | records | rule | guidance | Which explanation files state a fact a check reads? Look at each explanation file beside its record file. |
| litespec/core/model#state-the-common-fields-on-every-record | [State the Common Fields on Every Record](https://litespec.dev/4.0.0/core/model.md#state-the-common-fields-on-every-record) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `record-invalid` for a record missing a common field. |
| litespec/core/model#take-decision-numbers-from-one-sequence | [Take Decision Numbers from One Sequence](https://litespec.dev/4.0.0/core/model.md#take-decision-numbers-from-one-sequence) | rule | any | records | record:decision | records | rule | checkable | `litespec model check` reports `decision-number-duplicate` for two decisions sharing one number. |
| litespec/core/model#write-every-record-file-in-canonical-form | [Write Every Record File in Canonical Form](https://litespec.dev/4.0.0/core/model.md#write-every-record-file-in-canonical-form) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `format-drift` for a record file whose text differs from its canonical form. |
| litespec/core/model#write-every-record-in-its-home | [Write Every Record in Its Home](https://litespec.dev/4.0.0/core/model.md#write-every-record-in-its-home) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `folder-invalid` for a folder outside the closed set of its layer and level, `module-undeclared` for a `modules` folder naming no declared module, and `record-placement-invalid` for a record outside its home. |
| litespec/core/model#write-every-record-in-its-record-file | [Write Every Record in Its Record File](https://litespec.dev/4.0.0/core/model.md#write-every-record-in-its-record-file) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `record-invalid` for a record file that does not parse or whose top level names no record type or container page style. |
| litespec/core/model#write-links-on-the-record-that-points | [Write Links on the Record That Points](https://litespec.dev/4.0.0/core/model.md#write-links-on-the-record-that-points) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `reference-unknown` for a link whose target no record carries. |
| litespec/core/principles#avoid-generic-boundary-names | [Avoid Generic Boundary Names](https://litespec.dev/4.0.0/core/principles.md#avoid-generic-boundary-names) | rule | any | records | any | records | rule | guidance | Each changed boundary name carries the narrowest accurate business name, with no bare `bus`, `manager`, `helper`, `processor`, or `service`. |
| litespec/core/principles#build-only-what-the-specification-states | [Build Only What the Specification States](https://litespec.dev/4.0.0/core/principles.md#build-only-what-the-specification-states) | rule | any | records | any | records | rule | guidance | Which code has no specification record behind it? Compare the changed code with the records it serves. |
| litespec/core/principles#complete-work-before-merging | [Complete Work Before Merging](https://litespec.dev/4.0.0/core/principles.md#complete-work-before-merging) | rule | any | records | any | records | rule | checkable | `litespec model check` reports unreached records locally and blocks on them in the pull-request check. |
| litespec/core/principles#compute-completion-from-code-and-tests | [Compute Completion from Code and Tests](https://litespec.dev/4.0.0/core/principles.md#compute-completion-from-code-and-tests) | rule | any | records | any | traced | rule | guidance | Which records state their own completion? Compare the record fields with the completion the model computes. |
| litespec/core/principles#compute-nothing-above-implementation-from-code | [Compute Nothing Above Implementation from Code](https://litespec.dev/4.0.0/core/principles.md#compute-nothing-above-implementation-from-code) | rule | any | records | any | records | rule | guidance | Which records above Implementation restate code instead of a decided promise? Compare each new record with the code beside it. |
| litespec/core/principles#confine-atomic-consistency-to-synchronous-edges | [Confine Atomic Consistency to Synchronous Edges](https://litespec.dev/4.0.0/core/principles.md#confine-atomic-consistency-to-synchronous-edges) | rule | any | records | record:use-case | records | rule | guidance | Which atomic use cases span an async edge? Look at the consistency and effects fields beside the changed use cases. |
| litespec/core/principles#cover-other-mechanisms-with-extensions | [Cover Other Mechanisms with Extensions](https://litespec.dev/4.0.0/core/principles.md#cover-other-mechanisms-with-extensions) | rule | any | records | any | records | rule | guidance | Which mechanisms outside the favored set lack an extension? Look at the selected extensions beside the changed records. |
| litespec/core/principles#declare-every-edge | [Declare Every Edge](https://litespec.dev/4.0.0/core/principles.md#declare-every-edge) | rule | any | records | any | records | rule | guidance | Which edges lack a declaration on their record? Look at the `effects` entries with `runs`, `sends`, `emits`, or `calls` beside the changed records. |
| litespec/core/principles#derive-records-only-from-records | [Derive Records Only from Records](https://litespec.dev/4.0.0/core/principles.md#derive-records-only-from-records) | rule | any | records | any | records | rule | guidance | Which derived values lack an authored source record? Trace each derived value to the record it cites. |
| litespec/core/principles#end-every-effect-cycle-in-a-domain-event | [End Every Effect Cycle in a Domain Event](https://litespec.dev/4.0.0/core/principles.md#end-every-effect-cycle-in-a-domain-event) | rule | any | records | any | records | rule | checkable | `litespec model check` reports no `effect-loop-invalid` finding on the changed records. |
| litespec/core/principles#enter-facts-from-the-world-as-research-or-constraints | [Enter Facts from the World as Research or Constraints](https://litespec.dev/4.0.0/core/principles.md#enter-facts-from-the-world-as-research-or-constraints) | rule | any | records | any | records | rule | guidance | Which outside facts lack a cited and dated source? Look at the research and constraint records beside the change. |
| litespec/core/principles#follow-intent-where-it-has-spoken | [Follow Intent Where It Has Spoken](https://litespec.dev/4.0.0/core/principles.md#follow-intent-where-it-has-spoken) | rule | any | records | any | records | rule | guidance | Which code disagrees with a stated promise? Compare the changed code with the Intent records it serves. |
| litespec/core/principles#keep-git-as-the-decision-record | [Keep Git as the Decision Record](https://litespec.dev/4.0.0/core/principles.md#keep-git-as-the-decision-record) | rule | any | records | any | records | rule | guidance | Which changed records bypass their pull request? Look at the pull request behind the change. |
| litespec/core/principles#keep-one-authored-source | [Keep One Authored Source](https://litespec.dev/4.0.0/core/principles.md#keep-one-authored-source) | rule | any | records | any | records | rule | guidance | Each fact on the changed pages traces to one authored record, with every other appearance derived from the model. |
| litespec/core/principles#keep-tools-small | [Keep Tools Small](https://litespec.dev/4.0.0/core/principles.md#keep-tools-small) | rule | any | records | any | records | rule | guidance | Which commands, checks, generated files, or packages lack an owner approval or a user? Look at the tooling the change adds beside its users. |
| litespec/core/principles#locate-package-versions-in-the-manifest | [Locate Package Versions in the Manifest](https://litespec.dev/4.0.0/core/principles.md#locate-package-versions-in-the-manifest) | rule | any | records | any | records | rule | checkable | `litespec model check` fails a project whose stack versions do not resolve from the manifest. |
| litespec/core/principles#map-each-engine-step-to-one-use-case | [Map Each Engine Step to One Use Case](https://litespec.dev/4.0.0/core/principles.md#map-each-engine-step-to-one-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports no `behavior-unrecorded` finding on engine steps without a use case. |
| litespec/core/principles#name-boundary-intent | [Name Boundary Intent](https://litespec.dev/4.0.0/core/principles.md#name-boundary-intent) | rule | any | records | any | records | rule | guidance | Each changed boundary name states its business action. |
| litespec/core/principles#prefer-direct-owned-dependencies | [Prefer Direct Owned Dependencies](https://litespec.dev/4.0.0/core/principles.md#prefer-direct-owned-dependencies) | convention | any | records | any | records | default | guidance | Each new abstraction names the boundary that justifies it, or the wrapping convention that permits it. |
| litespec/core/principles#prefer-local-code-until-reuse-is-real | [Prefer Local Code Until Reuse Is Real](https://litespec.dev/4.0.0/core/principles.md#prefer-local-code-until-reuse-is-real) | convention | any | records | any | records | default | guidance | Each new shared unit serves two real consumers under one accurate name, or the sharing convention permits it. |
| litespec/core/principles#prove-enforceable-boundaries-mechanically | [Prove Enforceable Boundaries Mechanically](https://litespec.dev/4.0.0/core/principles.md#prove-enforceable-boundaries-mechanically) | rule | any | records | any | traced | rule | guidance | Each changed enforceable boundary names a reference, test, or lint rule that proves it. |
| litespec/core/principles#prove-scenarios-with-tests | [Prove Scenarios with Tests](https://litespec.dev/4.0.0/core/principles.md#prove-scenarios-with-tests) | rule | any | records | test | records | rule | guidance | Each scenario in the model links a passing test that calls its use case and asserts its result. |
| litespec/core/principles#raise-what-a-lower-layer-needs-to-the-owner | [Raise What a Lower Layer Needs to the Owner](https://litespec.dev/4.0.0/core/principles.md#raise-what-a-lower-layer-needs-to-the-owner) | rule | any | records | any | records | rule | guidance | Which needs from a lower record layer lack an owner question or a backlog item? Look at the owner questions and the backlog board beside the records that need them. |
| litespec/core/principles#record-stricter-edge-rules-as-conventions | [Record Stricter Edge Rules as Conventions](https://litespec.dev/4.0.0/core/principles.md#record-stricter-edge-rules-as-conventions) | rule | any | records | any | records | rule | guidance | Which stricter edge rules lack a cited convention? Look at the project conventions beside the changed records. |
| litespec/core/principles#require-current-complexity-activation | [Require Current Complexity Activation](https://litespec.dev/4.0.0/core/principles.md#require-current-complexity-activation) | rule | any | records | any | records | rule | guidance | Each added package, project, wrapper, process, cache, queue, or pattern cites a current use case, decision, or requirement. |
| litespec/core/principles#state-the-strength-of-every-provision | [State the Strength of Every Provision](https://litespec.dev/4.0.0/core/principles.md#state-the-strength-of-every-provision) | rule | any | records | any | records | rule | guidance | Which provisions leave their strength or scope unstated? Look at the provisions the change adds. |
| litespec/core/principles#state-transaction-sharing-on-every-inline-edge | [State Transaction Sharing on Every Inline Edge](https://litespec.dev/4.0.0/core/principles.md#state-transaction-sharing-on-every-inline-edge) | rule | any | records | any | records | rule | checkable | `litespec model check` reports no `record-invalid` finding on the changed inline edges. |
| litespec/core/principles#take-every-name-from-the-intent-above-it | [Take Every Name from the Intent Above It](https://litespec.dev/4.0.0/core/principles.md#take-every-name-from-the-intent-above-it) | rule | any | records | any | records | rule | guidance | Which act carries a different name in its use case, method, event, permission, route or screen label than the record above it states? Compare the names of one act across its record, its handler, its endpoint and its screen. |
| litespec/core/principles#treat-code-beyond-silent-intent-as-evidence-for-an-owner-question | [Treat Code Beyond Silent Intent as Evidence for an Owner Question](https://litespec.dev/4.0.0/core/principles.md#treat-code-beyond-silent-intent-as-evidence-for-an-owner-question) | rule | any | records | any | records | rule | guidance | Which working code outside Intent lacks an owner question carrying it? Look at the owner questions beside the uncovered code. |
| litespec/core/principles#write-each-layer-from-the-layer-above | [Write Each Layer from the Layer Above](https://litespec.dev/4.0.0/core/principles.md#write-each-layer-from-the-layer-above) | rule | any | records | any | records | rule | checkable | `litespec model check` reports no `record-link-missing` finding on the changed records. |
| litespec/core/principles#write-every-record-about-the-software | [Write Every Record About the Software](https://litespec.dev/4.0.0/core/principles.md#write-every-record-about-the-software) | rule | any | records | any | records | rule | guidance | Which records state company business instead of the software? Compare each new record with the code, results, tests, or infrastructure it translates into. |
| litespec/core/privacy#accept-every-retained-personal-data-class-in-intent | [Accept Every Retained Personal Data Class in Intent](https://litespec.dev/4.0.0/core/privacy.md#accept-every-retained-personal-data-class-in-intent) | rule | any | records | record:retention-schedule | records | rule | guidance | Which pseudonymized, retained, or exempt personal or sensitive classes name no accepting requirement or decision? Look at `basedOn` on each data class. |
| litespec/core/privacy#classify-every-aggregate-data-field | [Classify Every Aggregate Data Field](https://litespec.dev/4.0.0/core/privacy.md#classify-every-aggregate-data-field) | rule | any | records | aggregate | records | rule | guidance | Which aggregate data fields lack a meaning, a classification, or a data class? Look at `data` on each aggregate page. |
| litespec/core/privacy#complete-the-subject-export-before-erasure | [Complete the Subject Export Before Erasure](https://litespec.dev/4.0.0/core/privacy.md#complete-the-subject-export-before-erasure) | rule | any | records | record:retention-schedule | records | rule | guidance | The export-first classes show a completed export before each erasure run in the run evidence. |
| litespec/core/privacy#declare-every-data-class-with-its-erasure-position | [Declare Every Data Class with Its Erasure Position](https://litespec.dev/4.0.0/core/privacy.md#declare-every-data-class-with-its-erasure-position) | rule | any | records | record:retention-schedule | records | rule | checkable | `litespec model check` reports `erasure-undeclared` for a personal or sensitive field with no declared position and `retention-enforcement-missing` for a class nothing enforces. |
| litespec/core/privacy#discard-rows-that-leave-no-trace | [Discard Rows That Leave No Trace](https://litespec.dev/4.0.0/core/privacy.md#discard-rows-that-leave-no-trace) | rule | any | records | record:retention-schedule | records | rule | guidance | The `onErasure` entries on the aggregate pages carry discard where no marker duty exists. |
| litespec/core/privacy#keep-a-tombstone-where-deletion-stays-visible | [Keep a Tombstone Where Deletion Stays Visible](https://litespec.dev/4.0.0/core/privacy.md#keep-a-tombstone-where-deletion-stays-visible) | rule | any | records | record:retention-schedule | records | rule | guidance | The aggregate pages mark referenced-after-erasure classes tombstone with the marker fields each keeps. |
| litespec/core/privacy#keep-tombstone-fields-minimal | [Keep Tombstone Fields Minimal](https://litespec.dev/4.0.0/core/privacy.md#keep-tombstone-fields-minimal) | convention | any | records | record:retention-schedule | records | default | guidance | The tombstone entries keep the row id and the erasure date, or the project lists wider fields with the rule behind each. |
| litespec/core/privacy#move-data-to-its-next-controller-instead-of-erasing | [Move Data to Its Next Controller Instead of Erasing](https://litespec.dev/4.0.0/core/privacy.md#move-data-to-its-next-controller-instead-of-erasing) | rule | any | records | record:retention-schedule | records | rule | guidance | The handed-over class entries name transferred with the receiver and the handover record. |
| litespec/core/privacy#purge-erased-data-from-restored-backups | [Purge Erased Data from Restored Backups](https://litespec.dev/4.0.0/core/privacy.md#purge-erased-data-from-restored-backups) | rule | any | records | record:runbook | records | rule | guidance | Which restore runbooks name no sweep job? Look at the restore runbooks. |
| litespec/core/privacy#record-which-duty-wins-each-conflict | [Record Which Duty Wins Each Conflict](https://litespec.dev/4.0.0/core/privacy.md#record-which-duty-wins-each-conflict) | rule | any | records | record:retention-schedule | records | rule | guidance | The retention schedule rows name the winning duty with its basis. |
| litespec/core/privacy#remove-child-rows-through-their-parent-only | [Remove Child Rows Through Their Parent Only](https://litespec.dev/4.0.0/core/privacy.md#remove-child-rows-through-their-parent-only) | rule | any | records | record:retention-schedule | records | rule | guidance | The child class entries name cascade-only with the parent class, and the parent erasure tests clear the children. |
| litespec/core/privacy#require-a-fresh-export-after-changes | [Require a Fresh Export After Changes](https://litespec.dev/4.0.0/core/privacy.md#require-a-fresh-export-after-changes) | rule | any | records | record:retention-schedule | records | rule | guidance | The erasure runs after mid-window edits show a fresh export completed first. |
| litespec/core/privacy#route-every-external-erasure-through-an-operation-or-event | [Route Every External Erasure Through an Operation or Event](https://litespec.dev/4.0.0/core/privacy.md#route-every-external-erasure-through-an-operation-or-event) | rule | any | records | record:external-system | records | rule | guidance | Which external systems declare no erasure call, forwarding event, or impossible reason with acceptance? Look at the external systems beside their erasure routes. |
| litespec/core/privacy#run-one-sweep-job-per-data-class | [Run One Sweep Job per Data Class](https://litespec.dev/4.0.0/core/privacy.md#run-one-sweep-job-per-data-class) | convention | any | records | job | records | default | guidance | Each sweep job page covers one data class, or the project names the classes each job covers. |
| litespec/core/privacy#schedule-every-data-class-for-retention | [Schedule Every Data Class for Retention](https://litespec.dev/4.0.0/core/privacy.md#schedule-every-data-class-for-retention) | rule | any | records | record:retention-schedule | records | rule | checkable | `litespec model check` reports `retention-enforcement-missing` for a data class nothing enforces. |
| litespec/core/privacy#scope-erasure-to-what-the-subject-requested | [Scope Erasure to What the Subject Requested](https://litespec.dev/4.0.0/core/privacy.md#scope-erasure-to-what-the-subject-requested) | rule | any | records | record:use-case | records | rule | guidance | The erasure use cases cite the request they answer and touch only the data it names. |
| litespec/core/privacy#state-the-erasure-sentence-in-intent | [State the Erasure Sentence in Intent](https://litespec.dev/4.0.0/core/privacy.md#state-the-erasure-sentence-in-intent) | rule | any | records | record:requirement | records | rule | guidance | The confirmation sentence in the Intent requirement stands before the release that shows it. |
| litespec/core/release#apply-release-access-controls | [Apply Release Access Controls](https://litespec.dev/4.0.0/core/release.md#apply-release-access-controls) | rule | any | operations | any | full | rule | guidance | Which restricted release paths lack authentication or authorization? Look at the guards on each restricted path. |
| litespec/core/release#identify-immutable-release-artifacts | [Identify Immutable Release Artifacts](https://litespec.dev/4.0.0/core/release.md#identify-immutable-release-artifacts) | rule | any | operations | any | records | rule | guidance | Which release records lack a source commit or artifact reference? Look at the record header beside each artifact. |
| litespec/core/release#keep-generated-contracts-stable | [Keep Generated Contracts Stable](https://litespec.dev/4.0.0/core/release.md#keep-generated-contracts-stable) | rule | any | operations | any | full | rule | guidance | Which contract diffs hold timestamps, machine paths, or unstable order? Look at the generated diff beside each contract. |
| litespec/core/release#keep-release-records-non-authoritative | [Keep Release Records Non-Authoritative](https://litespec.dev/4.0.0/core/release.md#keep-release-records-non-authoritative) | rule | any | operations | any | records | rule | guidance | Which release records restate a specification or copy a scenario? Look at the record beside the linked specifications. |
| litespec/core/release#list-included-release-behavior | [List Included Release Behavior](https://litespec.dev/4.0.0/core/release.md#list-included-release-behavior) | rule | any | operations | any | records | rule | guidance | Which records omit an included journey, use case, or extension? Look at the behavior list on each release record. |
| litespec/core/release#qualify-the-checker-with-known-good-and-known-bad-fixtures | [Qualify the Checker with Known Good and Known Bad Fixtures](https://litespec.dev/4.0.0/core/release.md#qualify-the-checker-with-known-good-and-known-bad-fixtures) | rule | any | operations | any | full | rule | guidance | Which gating S readers lack passing fixture runs? Look at the fixture results beside the stack reader. |
| litespec/core/release#record-accepted-debt-as-an-exception | [Record Accepted Debt as an Exception](https://litespec.dev/4.0.0/core/release.md#record-accepted-debt-as-an-exception) | rule | any | operations | record:exception | records | rule | guidance | Which accepted debts lack an exception of kind `gap` with an expiry date? Look at the exceptions beside each debt. |
| litespec/core/release#record-the-release-artifact | [Record the Release Artifact](https://litespec.dev/4.0.0/core/release.md#record-the-release-artifact) | rule | any | operations | any | records | rule | guidance | Which releases lack one record naming the immutable artifact? Look at the release records beside each artifact. |
| litespec/core/release#regenerate-application-contracts | [Regenerate Application Contracts](https://litespec.dev/4.0.0/core/release.md#regenerate-application-contracts) | rule | any | operations | any | full | rule | guidance | Which committed contracts differ from a fresh generation? Look at the contract diff beside the source change. |
| litespec/core/release#report-verification-exactly | [Report Verification Exactly](https://litespec.dev/4.0.0/core/release.md#report-verification-exactly) | rule | any | operations | any | records | rule | guidance | Which completion reports lack commands, outcomes, scope, omissions, differences, limits, or covered use cases? Look at the report beside the change. |
| litespec/core/release#resolve-release-blockers | [Resolve Release Blockers](https://litespec.dev/4.0.0/core/release.md#resolve-release-blockers) | rule | any | operations | any | records | rule | guidance | Which releases depend on an expired exception or an external claim without excluding the behavior? Look at the exceptions and claims beside the owning records. |
| litespec/core/release#run-backend-release-checks | [Run Backend Release Checks](https://litespec.dev/4.0.0/core/release.md#run-backend-release-checks) | rule | any | operations | any | full | rule | guidance | Which backend changes lack a passing release build or suite result? Look at the build and suite reports beside the change. |
| litespec/core/release#run-boundary-selected-checks | [Run Boundary-Selected Checks](https://litespec.dev/4.0.0/core/release.md#run-boundary-selected-checks) | rule | any | operations | any | records | rule | guidance | Which changes lack a passing result for a check their boundaries select? Look at the change report beside the boundary table. |
| litespec/core/release#run-consistency-checks | [Run Consistency Checks](https://litespec.dev/4.0.0/core/release.md#run-consistency-checks) | rule | any | operations | any | records | rule | checkable | `litespec model check` exits zero with no G finding. |
| litespec/core/release#run-extension-checks | [Run Extension Checks](https://litespec.dev/4.0.0/core/release.md#run-extension-checks) | rule | any | operations | any | records | rule | guidance | Which affected extensions lack their stated verification evidence? Look at the extension evidence beside the change. |
| litespec/core/release#run-frontend-release-checks | [Run Frontend Release Checks](https://litespec.dev/4.0.0/core/release.md#run-frontend-release-checks) | rule | any | operations | any | full | rule | guidance | Which frontend changes lack a passing install, lint, type, test, or build result? Look at the frontend reports beside the change. |
| litespec/core/release#run-journey-checks | [Run Journey Checks](https://litespec.dev/4.0.0/core/release.md#run-journey-checks) | rule | any | operations | record:journey | records | rule | guidance | Which journey changes lack passing journey tests? Look at the journey reports against the deployed boundary. |
| litespec/core/release#state-each-release-as-a-complete-record | [State Each Release as a Complete Record](https://litespec.dev/4.0.0/core/release.md#state-each-release-as-a-complete-record) | rule | any | operations | any | records | rule | guidance | Which release records depend on an earlier record to be judged? Look at the record alone beside its links. |
| litespec/core/release#store-release-records-together | [Store Release Records Together](https://litespec.dev/4.0.0/core/release.md#store-release-records-together) | convention | any | operations | any | records | default | guidance | Which release records sit outside `.litespec/releases/` without a recorded release path convention? Look at the release paths beside the convention. |
| litespec/core/release#verify-connected-journeys | [Verify Connected Journeys](https://litespec.dev/4.0.0/core/release.md#verify-connected-journeys) | rule | any | operations | record:journey | records | rule | guidance | Which completed journeys lack a passing test through the deployed boundary? Look at the journey tests beside each included journey. |
| litespec/core/scope#answer-the-constraints-question | [Answer the Constraints Question](https://litespec.dev/4.0.0/core/scope.md#answer-the-constraints-question) | rule | any | workspace | - | records | rule | guidance | `.litespec/project.json` states which outside constraints apply, or records an empty answer. |
| litespec/core/scope#claim-conformance-only-when-every-applicable-provision-holds | [Claim Conformance Only When Every Applicable Provision Holds](https://litespec.dev/4.0.0/core/scope.md#claim-conformance-only-when-every-applicable-provision-holds) | rule | any | workspace | - | records | rule | guidance | `.litespec/project.json` names the declared conformance level beside the selected size, shape, stacks, and extensions; each departure from a provision that applies at that level resolves to an exception record under `.litespec/governance/exceptions/`, and the checks that run at that level pass. |
| litespec/core/scope#declare-a-consumer-that-has-no-backend | [Declare a Consumer That Has No Backend](https://litespec.dev/4.0.0/core/scope.md#declare-a-consumer-that-has-no-backend) | rule | any | workspace | - | records | rule | checkable | `litespec model check` refuses a `client-only` project that names a backend stack. |
| litespec/core/scope#declare-the-conformance-level | [Declare the Conformance Level](https://litespec.dev/4.0.0/core/scope.md#declare-the-conformance-level) | rule | any | workspace | - | records | rule | checkable | `litespec model check` reports `project-invalid` for a project file that names no level or a value other than `records`, `traced` or `full`. |
| litespec/core/scope#keep-every-litespec-file-under-one-folder | [Keep Every LiteSpec File Under One Folder](https://litespec.dev/4.0.0/core/scope.md#keep-every-litespec-file-under-one-folder) | rule | any | workspace | - | records | rule | guidance | Which files created, read, or governed by LiteSpec sit outside `.litespec/`, or at the repository root? Look at the repository tree beside the project's `.litespec/` folder. |
| litespec/core/scope#keep-every-record-about-the-software | [Keep Every Record About the Software](https://litespec.dev/4.0.0/core/scope.md#keep-every-record-about-the-software) | rule | any | workspace | - | records | rule | checkable | `litespec model check` reports a blocking finding for a folder under `intent/modules/` naming no declared module and for a record reaching no Behavior. |
| litespec/core/scope#keep-one-bounded-context | [Keep One Bounded Context](https://litespec.dev/4.0.0/core/scope.md#keep-one-bounded-context) | rule | any | workspace | - | records | rule | guidance | Module pages and `.litespec/project.json` name one business language and one deployment boundary, with no second of either. |
| litespec/core/scope#measure-capacity-before-expansion | [Measure Capacity Before Expansion](https://litespec.dev/4.0.0/core/scope.md#measure-capacity-before-expansion) | convention | any | workspace | - | records | default | guidance | Each added cache, replica, queue, or partition follows recorded load, latency target, and observed constraint, or a capacity convention. |
| litespec/core/scope#point-behavior-docs-at-the-behavior-root | [Point Behavior Docs at the Behavior Root](https://litespec.dev/4.0.0/core/scope.md#point-behavior-docs-at-the-behavior-root) | rule | any | workspace | - | records | rule | checkable | `litespec model check` reports `project-invalid` for a project record without `paths.behaviorDocs`. |
| litespec/core/scope#record-selected-extensions | [Record Selected Extensions](https://litespec.dev/4.0.0/core/scope.md#record-selected-extensions) | rule | any | workspace | - | records | rule | checkable | `litespec model check` reports `project-invalid` for a selection without a criterion. |
| litespec/core/scope#record-unsupported-scope-decisions | [Record Unsupported Scope Decisions](https://litespec.dev/4.0.0/core/scope.md#record-unsupported-scope-decisions) | rule | any | workspace | - | records | rule | guidance | A project decision names each architecture outside the supported boundary the project adopts. |
| litespec/core/scope#select-a-size-a-shape-and-stacks | [Select a Size, a Shape and Stacks](https://litespec.dev/4.0.0/core/scope.md#select-a-size-a-shape-and-stacks) | rule | any | workspace | - | records | rule | checkable | `litespec model check` refuses, at `traced` and `full`, a shape whose backend stack count is wrong and a platform that names no frontend stack. |
| litespec/core/scope#select-conditional-extensions-explicitly | [Select Conditional Extensions Explicitly](https://litespec.dev/4.0.0/core/scope.md#select-conditional-extensions-explicitly) | rule | any | workspace | - | records | rule | guidance | Each entry in `selectedExtensions` carries a criterion that holds, and no applicable extension from the extension catalog stays unselected. |
| litespec/core/scope#start-with-one-api-and-database | [Start with One API and Database](https://litespec.dev/4.0.0/core/scope.md#start-with-one-api-and-database) | convention | any | workspace | - | records | default | guidance | The topology holds one API deployable and one database, or a topology convention records what runs instead. |
| litespec/core/scopes#declare-the-page-scope | [Declare the Page Scope](https://litespec.dev/4.0.0/core/scopes.md#declare-the-page-scope) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `SCOPE_BLOCK` diagnostic. |
| litespec/core/scopes#depart-from-a-rule-only-through-a-recorded-exception | [Depart from a Rule Only Through a Recorded Exception](https://litespec.dev/4.0.0/core/scopes.md#depart-from-a-rule-only-through-a-recorded-exception) | rule | any | workspace | - | records | rule | guidance | Each departure from a provision of Strength rule resolves to an exception record under `.litespec/governance/exceptions/` with the provision, a reason, and an expiry date. |
| litespec/core/scopes#give-every-provision-a-conformance-level | [Give Every Provision a Conformance Level](https://litespec.dev/4.0.0/core/scopes.md#give-every-provision-a-conformance-level) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `SCOPE_VALUE` diagnostic for a provision with no conformance level. |
| litespec/core/scopes#name-the-artifact-of-every-provision-on-a-page-that-names-one | [Name the Artifact of Every Provision on a Page That Names One](https://litespec.dev/4.0.0/core/scopes.md#name-the-artifact-of-every-provision-on-a-page-that-names-one) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `SCOPE_ARTIFACT` diagnostic. |
| litespec/core/scopes#record-each-replaced-default | [Record Each Replaced Default](https://litespec.dev/4.0.0/core/scopes.md#record-each-replaced-default) | rule | any | workspace | - | records | rule | guidance | Each choice against a provision of Strength default is recorded in the place its Replacement names. |
| litespec/core/scopes#state-applies-to-only-when-narrower | [State Applies to Only When Narrower](https://litespec.dev/4.0.0/core/scopes.md#state-applies-to-only-when-narrower) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `SCOPE_NARROW` diagnostic. |
| litespec/core/scopes#use-only-declared-scope-values | [Use Only Declared Scope Values](https://litespec.dev/4.0.0/core/scopes.md#use-only-declared-scope-values) | rule | any | workspace | - | records | rule | checkable | `litespec-maintain validate` emits no `SCOPE_VALUE` diagnostic. |
| litespec/core/stacks#apply-the-complete-stack | [Apply the Complete Stack](https://litespec.dev/4.0.0/core/stacks.md#apply-the-complete-stack) | rule | any | workspace | - | records | rule | guidance | The consumer file set covers every page in its stack folders, the folders above them, and their stackless subfolders. |
| litespec/core/stacks#declare-replacements | [Declare Replacements](https://litespec.dev/4.0.0/core/stacks.md#declare-replacements) | rule | any | workspace | - | records | rule | guidance | Each extension or departure names every baseline provision ID it replaces, with the rest staying active. |
| litespec/core/stacks#keep-the-stack-visible | [Keep the Stack Visible](https://litespec.dev/4.0.0/core/stacks.md#keep-the-stack-visible) | convention | any | workspace | - | records | default | guidance | `.litespec/project.json` names each selected stack, and the root `AGENTS.md` names the solution, applications, and commands. |
| litespec/core/stacks#use-manifest-version-pins | [Use Manifest Version Pins](https://litespec.dev/4.0.0/core/stacks.md#use-manifest-version-pins) | rule | any | workspace | - | records | rule | guidance | Each resolved SDK, framework, and package version matches its pin in `litespec.manifest.json`. |
| litespec/core/system#declare-every-edge-between-records | [Declare Every Edge Between Records](https://litespec.dev/4.0.0/core/system.md#declare-every-edge-between-records) | rule | any | records | any | records | rule | checkable | `litespec model check` emits no `effect-undeclared` or `effect-loop-invalid` finding across use cases, reactions, jobs, notifications, and integration events, and reports `effect-unimplemented` (check level A) for a declared edge no code takes. |
| litespec/core/system#deliver-one-complete-use-case | [Deliver One Complete Use Case](https://litespec.dev/4.0.0/core/system.md#deliver-one-complete-use-case) | rule | any | records | record:use-case | records | rule | guidance | The use case page with its behavior, persistence, entry points, tests, and operating records present. |
| litespec/core/system#drive-work-from-records | [Drive Work from Records](https://litespec.dev/4.0.0/core/system.md#drive-work-from-records) | rule | any | records | any | records | rule | guidance | The change report listing the Intent and Behavior records the work started from. |
| litespec/core/system#group-module-use-case-files-by-aggregate | [Group Module Use Case Files by Aggregate](https://litespec.dev/4.0.0/core/system.md#group-module-use-case-files-by-aggregate) | convention | any | records | record:use-case | records | default | guidance | Each use case file under its module directory or its aggregate subdirectory. |
| litespec/core/system#keep-decision-authority-with-accountable-people | [Keep Decision Authority with Accountable People](https://litespec.dev/4.0.0/core/system.md#keep-decision-authority-with-accountable-people) | rule | any | records | any | records | rule | guidance | The change report naming the unknown fact, the person asked, and the record carrying the answer. |
| litespec/core/system#keep-operational-and-security-references-under-operations | [Keep Operational and Security References Under Operations](https://litespec.dev/4.0.0/core/system.md#keep-operational-and-security-references-under-operations) | convention | any | records | any | records | default | guidance | Operating and security reference prose under `.litespec/implementation/operations/`, or the project documentation naming the replacement home. |
| litespec/core/system#point-code-and-tests-up-to-records | [Point Code and Tests up to Records](https://litespec.dev/4.0.0/core/system.md#point-code-and-tests-up-to-records) | rule | any | records | any | traced | rule | checkable | `litespec model check` reports `mark-missing`, `mark-unknown` and `mark-count-invalid` (check level S) for a code element with no mark, a mark naming no record of the type its element takes, or a handler marking other than one record. |
| litespec/core/system#point-every-technical-class-up-to-its-record-or-choice | [Point Every Technical Class up to Its Record or Choice](https://litespec.dev/4.0.0/core/system.md#point-every-technical-class-up-to-its-record-or-choice) | rule | any | records | any | traced | rule | checkable | `litespec model check` reports `mark-missing` and `mark-unknown` (check level S), and `dotnet build` reports `LS5001` and `LS5002`, for a technical class with no mark, an `implements` mark naming no Behavior record, or a `follows` mark naming no provision of the carried release, no decision or exception, or a provision on a page the project's stacks do not apply. |
| litespec/core/system#update-records-with-behavior | [Update Records with Behavior](https://litespec.dev/4.0.0/core/system.md#update-records-with-behavior) | rule | any | records | any | records | rule | guidance | The behavior change with its use case page, tests, product records, decision, journey, and operating records changed together. |
| litespec/core/system#use-established-technical-terms | [Use Established Technical Terms](https://litespec.dev/4.0.0/core/system.md#use-established-technical-terms) | convention | any | records | any | records | default | guidance | Prose using aggregate, command, query, reaction, job, repository, projection, outbox, idempotency, and transaction with their accepted meanings. |
| litespec/core/system#use-ordinary-capitalization-in-prose | [Use Ordinary Capitalization in Prose](https://litespec.dev/4.0.0/core/system.md#use-ordinary-capitalization-in-prose) | convention | any | records | any | records | default | guidance | Prose writing module, aggregate, use case, journey, rule, event, and decision in lowercase outside names and identifiers. |
| litespec/core/system#use-the-docs-layout-on-the-model-page | [Use the Docs Layout on the Model Page](https://litespec.dev/4.0.0/core/system.md#use-the-docs-layout-on-the-model-page) | convention | any | records | any | records | default | guidance | The `docs/` tree matching the layout the model page states, or the project documentation naming the replacement layout. |
| litespec/core/use-cases#bind-every-keyed-setting-in-one-marked-options-class | [Bind Every Keyed Setting in One Marked Options Class](https://litespec.dev/4.0.0/core/use-cases.md#bind-every-keyed-setting-in-one-marked-options-class) | rule | any | records | record:setting | records | rule | checkable | `litespec model check` reports `setting-unimplemented` (level S) for a keyed setting no options class marks, and `setting-key-drift` (level S) for a marked options class whose `SectionName` constant and property do not spell the setting's `key`. |
| litespec/core/use-cases#bound-every-caller-supplied-input-value | [Bound Every Caller-Supplied Input Value](https://litespec.dev/4.0.0/core/use-cases.md#bound-every-caller-supplied-input-value) | rule | any | records | record:use-case | records | rule | guidance | Which caller-supplied money or access inputs lack a cited bounding rule? Look beside each input with `origin: caller` on a money or access path. |
| litespec/core/use-cases#connect-each-use-case-to-intent | [Connect Each Use Case to Intent](https://litespec.dev/4.0.0/core/use-cases.md#connect-each-use-case-to-intent) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-link-missing` for a use case with neither `serves` nor `fulfills`. |
| litespec/core/use-cases#declare-every-effect-with-one-verb-and-its-timing | [Declare Every Effect with One Verb and Its Timing](https://litespec.dev/4.0.0/core/use-cases.md#declare-every-effect-with-one-verb-and-its-timing) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `effect-undeclared` for an edge the records never declared and `effect-timing-invalid` for a command `sends` or `calls` effect with `inline` timing; `litespec model check` reports `record-invalid` for an effect entry without exactly one verb or its timing. |
| litespec/core/use-cases#declare-every-query-output | [Declare Every Query Output](https://litespec.dev/4.0.0/core/use-cases.md#declare-every-query-output) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `query-output-missing` for a query with no declared output. |
| litespec/core/use-cases#declare-paging-on-every-collection-query | [Declare Paging on Every Collection Query](https://litespec.dev/4.0.0/core/use-cases.md#declare-paging-on-every-collection-query) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `paging-undeclared` for a collection query with no paging. |
| litespec/core/use-cases#derive-generic-refusals-instead-of-writing-them | [Derive Generic Refusals Instead of Writing Them](https://litespec.dev/4.0.0/core/use-cases.md#derive-generic-refusals-instead-of-writing-them) | rule | any | records | record:result | records | rule | guidance | Which use-case pages write a generic forbidden or invalid-input refusal as a record? Look at the results on each use-case page beside the derived names. |
| litespec/core/use-cases#describe-every-use-case-input-with-origin-and-classification | [Describe Every Use Case Input with Origin and Classification](https://litespec.dev/4.0.0/core/use-cases.md#describe-every-use-case-input-with-origin-and-classification) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a use-case input without name, meaning, or type, without `of` on an `id` or `choice` field, or with `of` on another type. |
| litespec/core/use-cases#end-every-use-case-in-named-results | [End Every Use Case in Named Results](https://litespec.dev/4.0.0/core/use-cases.md#end-every-use-case-in-named-results) | rule | any | records | record:result | records | rule | checkable | `litespec model check` reports `use-case-success-missing` for a use case with no success result; each refusal entry on the use-case page carries its code. |
| litespec/core/use-cases#exercise-rules-from-scenarios | [Exercise Rules from Scenarios](https://litespec.dev/4.0.0/core/use-cases.md#exercise-rules-from-scenarios) | rule | any | records | record:scenario | records | rule | guidance | Which scenarios show rules without naming them in `exercises`? Look at the scenarios beside the rules they walk. |
| litespec/core/use-cases#give-each-use-case-a-command-or-query-kind | [Give Each Use Case a Command or Query Kind](https://litespec.dev/4.0.0/core/use-cases.md#give-each-use-case-a-command-or-query-kind) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a use-case page without `kind` or with an unknown kind. |
| litespec/core/use-cases#grant-each-use-case-scoped-access | [Grant Each Use Case Scoped Access](https://litespec.dev/4.0.0/core/use-cases.md#grant-each-use-case-scoped-access) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a use-case page without `access` carrying grant and tenant scope. |
| litespec/core/use-cases#hold-every-setting-default-to-a-requirement | [Hold Every Setting Default to a Requirement](https://litespec.dev/4.0.0/core/use-cases.md#hold-every-setting-default-to-a-requirement) | rule | any | records | record:setting | records | rule | checkable | `litespec model check` reports `setting-requirement-missing` for a commercial, legal, or varying default with no cited requirement. |
| litespec/core/use-cases#justify-every-wider-visibility | [Justify Every Wider Visibility](https://litespec.dev/4.0.0/core/use-cases.md#justify-every-wider-visibility) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `widening-cites-missing` for a widened include group with no cited requirement. |
| litespec/core/use-cases#keep-one-kind-per-verb | [Keep One Kind per Verb](https://litespec.dev/4.0.0/core/use-cases.md#keep-one-kind-per-verb) | rule | any | records | record:use-case | records | rule | guidance | Which queries open with a changing verb, or which commands open with a reading verb? Look at the first word of each use-case name beside its kind. |
| litespec/core/use-cases#keep-the-effect-graph-free-of-cycles | [Keep the Effect Graph Free of Cycles](https://litespec.dev/4.0.0/core/use-cases.md#keep-the-effect-graph-free-of-cycles) | rule | any | records | any | records | rule | checkable | `litespec model check` reports `effect-loop-invalid` for a cycle with no stated end condition. |
| litespec/core/use-cases#list-recorded-outcomes-inside-success-codes | [List Recorded Outcomes Inside Success Codes](https://litespec.dev/4.0.0/core/use-cases.md#list-recorded-outcomes-inside-success-codes) | rule | any | records | record:result | records | rule | guidance | Which success results with recorded outcomes list no `codes`? Look at the success results beside their use-case pages. |
| litespec/core/use-cases#mark-every-lagging-query-as-built-asynchronously | [Mark Every Lagging Query as Built Asynchronously](https://litespec.dev/4.0.0/core/use-cases.md#mark-every-lagging-query-as-built-asynchronously) | rule | any | records | record:use-case | records | rule | guidance | Which lagging queries lack `builtAsynchronously` with a bounded or advisory freshness and a lag scenario? Look at the queries beside the aggregates they read. |
| litespec/core/use-cases#name-a-use-case-for-the-act-its-aggregate-performs | [Name a Use Case for the Act Its Aggregate Performs](https://litespec.dev/4.0.0/core/use-cases.md#name-a-use-case-for-the-act-its-aggregate-performs) | rule | any | records | record:use-case | records | rule | guidance | Which command handlers call aggregate methods starting with neither the use-case verb nor `Request`? Look at the methods each command handler calls. |
| litespec/core/use-cases#name-each-refusal-code-for-the-state-that-refuses | [Name Each Refusal Code for the State That Refuses](https://litespec.dev/4.0.0/core/use-cases.md#name-each-refusal-code-for-the-state-that-refuses) | rule | any | records | record:result | records | rule | guidance | Which refusal codes fall outside `<module>.<noun>-<state>` or hide their state behind a vague word? Look at the refusal codes on each use-case page. |
| litespec/core/use-cases#name-every-aggregate-a-use-case-changes-or-reads | [Name Every Aggregate a Use Case Changes or Reads](https://litespec.dev/4.0.0/core/use-cases.md#name-every-aggregate-a-use-case-changes-or-reads) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `write-undeclared` for a write outside `changes` and `reference-unknown` for an unknown aggregate. |
| litespec/core/use-cases#name-the-configuration-key-of-every-operator-setting | [Name the Configuration Key of Every Operator Setting](https://litespec.dev/4.0.0/core/use-cases.md#name-the-configuration-key-of-every-operator-setting) | rule | any | records | record:setting | records | rule | checkable | `litespec model check` reports `setting-key-missing` (level G) for a setting with `setBy: operator` and no `key`. |
| litespec/core/use-cases#name-the-entry-points-that-reach-each-use-case | [Name the Entry Points That Reach Each Use Case](https://litespec.dev/4.0.0/core/use-cases.md#name-the-entry-points-that-reach-each-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a live use case that names no entry point and that nothing runs, and `reference-unknown` for a `reachedThrough` entry naming no entry point. |
| litespec/core/use-cases#name-the-events-each-use-case-raises | [Name the Events Each Use Case Raises](https://litespec.dev/4.0.0/core/use-cases.md#name-the-events-each-use-case-raises) | rule | any | records | record:use-case | records | rule | guidance | Which use cases raise domain events that `raises` does not name? Look at `raises` beside each use-case page. |
| litespec/core/use-cases#name-the-idempotency-of-every-use-case | [Name the Idempotency of Every Use Case](https://litespec.dev/4.0.0/core/use-cases.md#name-the-idempotency-of-every-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a use case without an idempotency mode or without the key, scope, or reason its mode needs; `litespec model check` reports `record-invalid` for a key with no `{field}` placeholder, a placeholder naming no input field, or a scope outside `tenant`, `account`, `login`, and `global`. |
| litespec/core/use-cases#name-the-result-each-scenario-ends-in | [Name the Result Each Scenario Ends In](https://litespec.dev/4.0.0/core/use-cases.md#name-the-result-each-scenario-ends-in) | rule | any | records | record:scenario | records | rule | checkable | `litespec model check` reports `record-invalid` for a scenario entry without `result`, and `scenario-result-unknown` for a scenario ending in an unknown result. |
| litespec/core/use-cases#name-the-settings-each-use-case-reads | [Name the Settings Each Use Case Reads](https://litespec.dev/4.0.0/core/use-cases.md#name-the-settings-each-use-case-reads) | rule | any | records | record:use-case | records | rule | guidance | Which use cases read a setting that `reads` does not name? Look at the use cases beside the settings they read. |
| litespec/core/use-cases#name-what-a-use-case-acts-on-from-the-model | [Name What a Use Case Acts on from the Model](https://litespec.dev/4.0.0/core/use-cases.md#name-what-a-use-case-acts-on-from-the-model) | rule | any | records | record:use-case | records | rule | guidance | Which use-case names carry no aggregate, declared part, or glossary term after their verb? Look at the words after the verb in each use-case name. |
| litespec/core/use-cases#order-every-refusal-list-by-precedence | [Order Every Refusal List by Precedence](https://litespec.dev/4.0.0/core/use-cases.md#order-every-refusal-list-by-precedence) | rule | any | records | record:result | records | rule | guidance | Which refusal lists stand out of precedence order, or place a written refusal ahead of a derived one? Look at the refusal entries on each use-case page. |
| litespec/core/use-cases#prove-every-written-result-with-a-scenario | [Prove Every Written Result with a Scenario](https://litespec.dev/4.0.0/core/use-cases.md#prove-every-written-result-with-a-scenario) | rule | any | records | record:result | records | rule | checkable | `litespec model check` reports `result-scenario-missing`, level G for a success result and level A for a refusal. |
| litespec/core/use-cases#record-attempts-behind-recorded-refusals | [Record Attempts Behind Recorded Refusals](https://litespec.dev/4.0.0/core/use-cases.md#record-attempts-behind-recorded-refusals) | rule | any | records | record:result | records | rule | guidance | Which refusals carrying `recorded: true` store no attempt with its reason? Look at the recorded refusals beside their use-case pages. |
| litespec/core/use-cases#retire-refusal-codes-with-their-replacements | [Retire Refusal Codes with Their Replacements](https://litespec.dev/4.0.0/core/use-cases.md#retire-refusal-codes-with-their-replacements) | rule | any | records | record:result | records | rule | guidance | Which refusal codes in use were renamed or reused instead of retired with a named replacement? Look at the refusal codes beside their results. |
| litespec/core/use-cases#share-scenario-setup-in-background | [Share Scenario Setup in Background](https://litespec.dev/4.0.0/core/use-cases.md#share-scenario-setup-in-background) | rule | any | records | record:use-case | records | rule | guidance | Which use cases repeat shared setup across scenarios instead of holding it in `background`? Look at the givens beside each use-case page. |
| litespec/core/use-cases#start-every-use-case-with-a-declared-verb | [Start Every Use Case with a Declared Verb](https://litespec.dev/4.0.0/core/use-cases.md#start-every-use-case-with-a-declared-verb) | rule | any | records | record:use-case | records | rule | guidance | Which use-case names open outside the baseline vocabulary and the recorded project verbs? Look at the first word of each use-case name. |
| litespec/core/use-cases#state-the-audit-position-of-every-command | [State the Audit Position of Every Command](https://litespec.dev/4.0.0/core/use-cases.md#state-the-audit-position-of-every-command) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for a command without an audit level and target or an exemption with its justification. |
| litespec/core/use-cases#state-the-consistency-of-every-use-case | [State the Consistency of Every Use Case](https://litespec.dev/4.0.0/core/use-cases.md#state-the-consistency-of-every-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `consistency-cites-missing` for an atomic multi-aggregate write with no `cites`, `atomic-group-drift` for `changes` differing from the bound group, `atomic-group-invalid` (level A) for a group above 4 aggregates, and `atomic-group-duplicate` (level A) for a command saving more than one atomic write group. |
| litespec/core/use-cases#state-the-transaction-sharing-of-every-inline-call | [State the Transaction Sharing of Every Inline Call](https://litespec.dev/4.0.0/core/use-cases.md#state-the-transaction-sharing-of-every-inline-call) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `record-invalid` for an inline `runs` effect without `sharesTransaction`. |
| litespec/core/use-cases#state-the-unit-of-every-quantity-setting | [State the Unit of Every Quantity Setting](https://litespec.dev/4.0.0/core/use-cases.md#state-the-unit-of-every-quantity-setting) | rule | any | records | record:setting | records | rule | checkable | `litespec model check` reports `setting-unit-missing` (level A) for a numeric or duration setting declaring no `unit`. |
| litespec/core/use-cases#write-every-scenario-in-given-when-then | [Write Every Scenario in Given When Then](https://litespec.dev/4.0.0/core/use-cases.md#write-every-scenario-in-given-when-then) | rule | any | records | record:scenario | records | rule | checkable | `litespec model check` reports `record-invalid` for a scenario entry without `given`, `when`, or `then`. |
| litespec/core/use-cases#write-prose-on-every-use-case | [Write Prose on Every Use Case](https://litespec.dev/4.0.0/core/use-cases.md#write-prose-on-every-use-case) | rule | any | records | record:use-case | records | rule | checkable | `litespec model check` reports `prose-missing` for a use case without `summary`. |
| litespec/core/writing#apply-plain-mechanics | [Apply Plain Mechanics](https://litespec.dev/4.0.0/core/writing.md#apply-plain-mechanics) | rule | any | workspace | any | records | rule | guidance | Which pages use British spelling, drop the serial comma, spell out a measured quantity, shorten a prose date, or carry a contraction inside a record? Look at the prose the change adds. |
| litespec/core/writing#comment-on-why-not-what | [Comment on Why, Not What](https://litespec.dev/4.0.0/core/writing.md#comment-on-why-not-what) | rule | any | workspace | any | records | rule | guidance | Which comments restate the code, hold commented-out code, or recount how the code arrived? Look at the comments and API summaries the change adds. |
| litespec/core/writing#compare-real-options-in-each-decision-record | [Compare Real Options in Each Decision Record](https://litespec.dev/4.0.0/core/writing.md#compare-real-options-in-each-decision-record) | rule | any | workspace | record:decision | records | rule | guidance | Which decision records name no real alternative, compare options on different points, recount the discussion, or omit what would reopen the choice? Look at the decision records the change adds. |
| litespec/core/writing#give-each-explanation-file-its-fixed-sections | [Give Each Explanation File Its Fixed Sections](https://litespec.dev/4.0.0/core/writing.md#give-each-explanation-file-its-fixed-sections) | rule | any | workspace | any | records | rule | guidance | Which explanation files miss a fixed section, reorder the list, or open without their H1 title? Look at the explanation files beside the records the change adds, beside the explanation-section table. |
| litespec/core/writing#give-each-paragraph-one-idea | [Give Each Paragraph One Idea](https://litespec.dev/4.0.0/core/writing.md#give-each-paragraph-one-idea) | rule | any | workspace | any | records | rule | guidance | Which paragraphs carry two ideas, wrap across hard line breaks, or list items that are not parallel? Look at the explanation files and documents the change adds. |
| litespec/core/writing#keep-company-facts-out-of-intent-prose | [Keep Company Facts Out of Intent Prose](https://litespec.dev/4.0.0/core/writing.md#keep-company-facts-out-of-intent-prose) | rule | any | workspace | any | records | rule | guidance | Which Intent records carry a schedule, an effort estimate, a headcount, an offered price, a market fact or a launch date in prose? Look at the Intent records the change adds. |
| litespec/core/writing#keep-each-record-sentence-within-twenty-five-words | [Keep Each Record Sentence Within Twenty-Five Words](https://litespec.dev/4.0.0/core/writing.md#keep-each-record-sentence-within-twenty-five-words) | rule | any | workspace | any | records | rule | guidance | Which record statements or summaries carry a sentence past 25 words? Look at the statements and summaries the change adds. |
| litespec/core/writing#name-each-title-in-its-record-type-form | [Name Each Title in Its Record Type Form](https://litespec.dev/4.0.0/core/writing.md#name-each-title-in-its-record-type-form) | rule | any | workspace | any | records | rule | guidance | Which titles miss the form of their type, name no subject, or carry a code, date or metaphor? Look at the titles the change adds, beside the title-form table. |
| litespec/core/writing#open-each-summary-with-who-and-what-is-at-stake | [Open Each Summary with Who and What Is at Stake](https://litespec.dev/4.0.0/core/writing.md#open-each-summary-with-who-and-what-is-at-stake) | rule | any | workspace | any | records | rule | guidance | Which summaries open with a pointer, a field name or background instead of who and what is at stake? Look at the first sentence of each one the change adds. |
| litespec/core/writing#put-the-actor-first | [Put the Actor First](https://litespec.dev/4.0.0/core/writing.md#put-the-actor-first) | rule | any | workspace | any | records | rule | guidance | Which sentences open with a thing instead of an actor, use the passive voice, or promise in the future tense? Look at the statements and summaries the change adds. |
| litespec/core/writing#state-each-statement-without-modal-words | [State Each Statement Without Modal Words](https://litespec.dev/4.0.0/core/writing.md#state-each-statement-without-modal-words) | rule | any | workspace | any | records | rule | guidance | Which record statements carry a modal word or a second sentence? Look at the statements the change adds. |
| litespec/core/writing#use-literal-words | [Use Literal Words](https://litespec.dev/4.0.0/core/writing.md#use-literal-words) | rule | any | workspace | any | records | rule | guidance | Which titles or sentences use a metaphor, a stock phrase or an undefined term where a literal phrase exists? Look at the titles and first uses the change adds, beside the glossary. |
| litespec/core/writing#write-each-changelog-as-a-release-comparison | [Write Each Changelog as a Release Comparison](https://litespec.dev/4.0.0/core/writing.md#write-each-changelog-as-a-release-comparison) | rule | any | workspace | any | records | rule | guidance | Which entries inventory files or work, bury their condition or action, or describe a former behavior outside the changelog? Look at the entries the change adds. |
| litespec/core/writing#write-each-documentation-page-as-one-kind | [Write Each Documentation Page as One Kind](https://litespec.dev/4.0.0/core/writing.md#write-each-documentation-page-as-one-kind) | rule | any | workspace | any | records | rule | guidance | Which pages mix two jobs, open with background instead of their kind's opening, or state no reader and purpose in their first lines? Look at the opening lines of each documentation page the change adds, beside the documentation-kind table. |
| litespec/core/writing#write-every-record-title-in-title-case | [Write Every Record Title in Title Case](https://litespec.dev/4.0.0/core/writing.md#write-every-record-title-in-title-case) | rule | any | workspace | any | records | rule | guidance | Which record titles fall outside Title Case, end in a period, or run past eight words? Look at the titles the change adds. |
| litespec/core/writing#write-for-the-reader-who-arrives-cold | [Write for the Reader Who Arrives Cold](https://litespec.dev/4.0.0/core/writing.md#write-for-the-reader-who-arrives-cold) | rule | any | workspace | any | records | rule | guidance | Which records, sections and pages open with a pointer, a code or a field name instead of who and what is at stake? Look at the first sentence of each page the change adds. |

### ext

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/ext/ai#assert-structure-and-never-wording | [Assert Structure and Never Wording](https://litespec.dev/4.0.0/ext/ai.md#assert-structure-and-never-wording) | rule | any | application | record:use-case | full | rule | guidance | The mediated query scenarios assert fields, codes, and cited sources with no exact-word assertions. |
| litespec/ext/ai#bound-tool-calls-per-query | [Bound Tool Calls per Query](https://litespec.dev/4.0.0/ext/ai.md#bound-tool-calls-per-query) | rule | any | application | record:use-case | full | rule | guidance | The mediated queries state a per-run tool-call bound enforced in the run tests. |
| litespec/ext/ai#name-the-closed-tool-set | [Name the Closed Tool Set](https://litespec.dev/4.0.0/ext/ai.md#name-the-closed-tool-set) | rule | any | application | record:use-case | full | rule | guidance | The mediated queries list their closed tools with no call outside the list. |
| litespec/ext/ai#pin-a-deterministic-stub-in-proof | [Pin a Deterministic Stub in Proof](https://litespec.dev/4.0.0/ext/ai.md#pin-a-deterministic-stub-in-proof) | rule | any | application | test | full | rule | guidance | The mediated query tests run against the pinned stub version with no live model calls. |
| litespec/ext/ai#record-every-model-run | [Record Every Model Run](https://litespec.dev/4.0.0/ext/ai.md#record-every-model-run) | convention | any | application | query-handler | full | default | guidance | The run log holds prompt hash, tools called, and outcome per run, or the AI documentation names other evidence. |
| litespec/ext/ai#record-provenance-in-the-output | [Record Provenance in the Output](https://litespec.dev/4.0.0/ext/ai.md#record-provenance-in-the-output) | rule | any | application | record:use-case | full | rule | guidance | The mediated query answers carry model, tools called, and sources read. |
| litespec/ext/ai#refuse-unknown-tools | [Refuse Unknown Tools](https://litespec.dev/4.0.0/ext/ai.md#refuse-unknown-tools) | rule | any | application | record:use-case | full | rule | guidance | The mediated query tests refuse runs calling tools outside the closed set. |
| litespec/ext/audit#add-a-correcting-record | [Add a Correcting Record](https://litespec.dev/4.0.0/ext/audit.md#add-a-correcting-record) | rule | any | application | command-handler | full | rule | guidance | Which corrections edit history instead of adding a referencing record? Look at the correction records. |
| litespec/ext/audit#anchor-the-audit-chain-outside-its-own-store | [Anchor the Audit Chain Outside Its Own Store](https://litespec.dev/4.0.0/ext/audit.md#anchor-the-audit-chain-outside-its-own-store) | rule | any | application | job | full | advice | guidance | Which stores publish no checkpoint outside operator reach? Look at the checkpoint destination and the threat model. |
| litespec/ext/audit#audit-async-work-at-request-time | [Audit Async Work at Request Time](https://litespec.dev/4.0.0/ext/audit.md#audit-async-work-at-request-time) | rule | any | application | command-handler | full | rule | guidance | Which deferred runs write their audit record at run time instead of request time? Look at the audit rows beside the requesting calls. |
| litespec/ext/audit#audit-reads-of-the-trail | [Audit Reads of the Trail](https://litespec.dev/4.0.0/ext/audit.md#audit-reads-of-the-trail) | rule | any | application | query-handler | full | rule | guidance | Which completed trail reads produced no audit record? Look at the trail read path. |
| litespec/ext/audit#commit-a-success-record-with-its-business-change | [Commit a Success Record with Its Business Change](https://litespec.dev/4.0.0/ext/audit.md#commit-a-success-record-with-its-business-change) | rule | any | application | any | full | rule | guidance | Which succeeded records commit outside their business transaction? Look at the success write path. |
| litespec/ext/audit#cover-the-required-audit-categories | [Cover the Required Audit Categories](https://litespec.dev/4.0.0/ext/audit.md#cover-the-required-audit-categories) | rule | any | application | record:decision | full | rule | guidance | Which required categories have no selection entry? Look at the declared selection beside the eight listed categories. |
| litespec/ext/audit#declare-audit-selection-beside-the-command | [Declare Audit Selection Beside the Command](https://litespec.dev/4.0.0/ext/audit.md#declare-audit-selection-beside-the-command) | convention | any | application | command-handler | full | default | guidance | Which Commands lack the declaration attribute with its action, target kind, category, and reason selector, or the recorded local convention? Look at the Command types. |
| litespec/ext/audit#declare-audit-selection-on-every-command | [Declare Audit Selection on Every Command](https://litespec.dev/4.0.0/ext/audit.md#declare-audit-selection-on-every-command) | rule | any | application | record:use-case | full | rule | guidance | Which command use cases lack an audit position or an exemption with its justification in their `audit` field? Look at the use case pages. |
| litespec/ext/audit#emit-audit-records-at-the-mediation-boundary | [Emit Audit Records at the Mediation Boundary](https://litespec.dev/4.0.0/ext/audit.md#emit-audit-records-at-the-mediation-boundary) | rule | any | application | any | full | rule | guidance | Which audit writes run inside handlers instead of the mediation pipeline? Look at the producer stages and the handler code. |
| litespec/ext/audit#enforce-append-only-through-storage-privilege | [Enforce Append-Only Through Storage Privilege](https://litespec.dev/4.0.0/ext/audit.md#enforce-append-only-through-storage-privilege) | rule | any | application | any | full | rule | guidance | Which writing accounts hold update or delete on the audit store? Look at the granted store privileges. |
| litespec/ext/audit#exclude-derived-audit-trails | [Exclude Derived Audit Trails](https://litespec.dev/4.0.0/ext/audit.md#exclude-derived-audit-trails) | rule | any | application | any | full | rule | guidance | Which trail writes derive from events, triggers, or capture? Look at the producer source. |
| litespec/ext/audit#exclude-indiscriminate-auditing | [Exclude Indiscriminate Auditing](https://litespec.dev/4.0.0/ext/audit.md#exclude-indiscriminate-auditing) | rule | any | application | record:use-case | full | rule | guidance | Which audited categories lack a recorded selection reason? Look at the declared selection. |
| litespec/ext/audit#exclude-personal-data-beyond-actor-identity | [Exclude Personal Data Beyond Actor Identity](https://litespec.dev/4.0.0/ext/audit.md#exclude-personal-data-beyond-actor-identity) | rule | any | application | any | full | rule | guidance | Which records contain personal data beyond pseudonymous actor and target identifiers? Look at the stored audit rows. |
| litespec/ext/audit#exclude-secrets-and-payment-data | [Exclude Secrets and Payment Data](https://litespec.dev/4.0.0/ext/audit.md#exclude-secrets-and-payment-data) | rule | any | application | any | full | rule | guidance | Which records contain a credential, token, session identifier, key, or payment value? Look at the stored audit rows. |
| litespec/ext/audit#exclude-state-snapshots | [Exclude State Snapshots](https://litespec.dev/4.0.0/ext/audit.md#exclude-state-snapshots) | rule | any | application | any | full | rule | guidance | Which records contain before or after state copies? Look at the stored audit rows. |
| litespec/ext/audit#give-the-trail-a-read-path | [Give the Trail a Read Path](https://litespec.dev/4.0.0/ext/audit.md#give-the-trail-a-read-path) | rule | any | application | query-handler | full | rule | guidance | Which trail reads lack an access grant or a declared filter? Look at the trail read use case. |
| litespec/ext/audit#keep-audit-infrastructure-in-one-location | [Keep Audit Infrastructure in One Location](https://litespec.dev/4.0.0/ext/audit.md#keep-audit-infrastructure-in-one-location) | convention | any | application | any | full | default | guidance | Which audit parts live outside the documented location or the recorded local convention? Look under `Infrastructure/Auditing/`. |
| litespec/ext/audit#provide-tamper-evidence | [Provide Tamper Evidence](https://litespec.dev/4.0.0/ext/audit.md#provide-tamper-evidence) | rule | any | application | any | full | rule | guidance | Which records lack the chained SHA-256 hash over the canonical serialization? Look at the stored chain values. |
| litespec/ext/audit#publish-a-copy-to-the-security-platform | [Publish a Copy to the Security Platform](https://litespec.dev/4.0.0/ext/audit.md#publish-a-copy-to-the-security-platform) | convention | any | application | any | full | default | guidance | Which published copies leave the local store non-authoritative, or bypass the recorded local convention? Look at the delivery path. |
| litespec/ext/audit#publish-unsuccessful-write-failures | [Publish Unsuccessful Write Failures](https://litespec.dev/4.0.0/ext/audit.md#publish-unsuccessful-write-failures) | rule | any | application | any | full | rule | guidance | Which deployments publish no write failure count for the unsuccessful path? Look at the published metrics. |
| litespec/ext/audit#record-a-bulk-read-inside-its-own-boundary | [Record a Bulk Read Inside Its Own Boundary](https://litespec.dev/4.0.0/ext/audit.md#record-a-bulk-read-inside-its-own-boundary) | rule | any | application | query-handler | full | rule | guidance | Which above-threshold queries produced no record with the subject count? Look at the bulk query paths. |
| litespec/ext/audit#record-bulk-export | [Record Bulk Export](https://litespec.dev/4.0.0/ext/audit.md#record-bulk-export) | rule | any | application | query-handler | full | rule | guidance | Which exports produced no record naming the requested scope? Look at the export paths. |
| litespec/ext/audit#record-delegated-administrative-access | [Record Delegated Administrative Access](https://litespec.dev/4.0.0/ext/audit.md#record-delegated-administrative-access) | rule | any | application | any | full | rule | guidance | Which support-grant actions lack the grant marker? Look at the records of actions under administrative grants. |
| litespec/ext/audit#record-every-attempt-outcome | [Record Every Attempt Outcome](https://litespec.dev/4.0.0/ext/audit.md#record-every-attempt-outcome) | rule | any | application | any | full | rule | guidance | Which records lack a succeeded, denied, or failed outcome? Look at the outcome column. |
| litespec/ext/audit#record-failed-audited-attempts | [Record Failed Audited Attempts](https://litespec.dev/4.0.0/ext/audit.md#record-failed-audited-attempts) | rule | any | application | any | full | rule | guidance | Which permitted attempts that threw produced no failed record? Look at the error paths beside the trail. |
| litespec/ext/audit#record-personal-data-reads | [Record Personal-Data Reads](https://litespec.dev/4.0.0/ext/audit.md#record-personal-data-reads) | rule | any | application | query-handler | full | rule | guidance | Which cross-boundary personal-data queries produced no record? Look at the query paths beside the trail. |
| litespec/ext/audit#record-refused-authorization | [Record Refused Authorization](https://litespec.dev/4.0.0/ext/audit.md#record-refused-authorization) | rule | any | application | any | full | rule | guidance | Which refused authorizations produced no denied record? Look at the refusal paths beside the trail. |
| litespec/ext/audit#record-the-audit-adoption-decision | [Record the Audit Adoption Decision](https://litespec.dev/4.0.0/ext/audit.md#record-the-audit-adoption-decision) | rule | any | application | record:decision | full | rule | guidance | Which adoption decisions lack categories, threshold, access model, integrity method, or records entry? Look at the adoption decision behind the audited Commands. |
| litespec/ext/audit#record-the-operation-trace-identity | [Record the Operation Trace Identity](https://litespec.dev/4.0.0/ext/audit.md#record-the-operation-trace-identity) | rule | any | application | any | full | rule | guidance | Which records lack the trace identifier of their operation? Look at the stored audit rows. |
| litespec/ext/audit#record-the-refusal-code-on-an-unsuccessful-attempt | [Record the Refusal Code on an Unsuccessful Attempt](https://litespec.dev/4.0.0/ext/audit.md#record-the-refusal-code-on-an-unsuccessful-attempt) | rule | any | application | any | full | rule | guidance | Which denied or failed records lack the refusal code? Look at the unsuccessful audit rows. |
| litespec/ext/audit#record-the-request-origin | [Record the Request Origin](https://litespec.dev/4.0.0/ext/audit.md#record-the-request-origin) | rule | any | application | any | full | rule | guidance | Which request-produced records lack origin, client, or request identifier? Look at the inbound-request audit rows. |
| litespec/ext/audit#record-the-required-audit-fields | [Record the Required Audit Fields](https://litespec.dev/4.0.0/ext/audit.md#record-the-required-audit-fields) | rule | any | application | any | full | rule | guidance | Which records lack actor, action, target, outcome, business time, record time, or tenant? Look at the stored audit rows. |
| litespec/ext/audit#reject-an-undeclared-command | [Reject an Undeclared Command](https://litespec.dev/4.0.0/ext/audit.md#reject-an-undeclared-command) | rule | any | application | any | full | rule | guidance | Which Commands build or start with no audit position or exemption? Look at the build or startup gate. |
| litespec/ext/audit#remove-the-identity-mapping-on-erasure | [Remove the Identity Mapping on Erasure](https://litespec.dev/4.0.0/ext/audit.md#remove-the-identity-mapping-on-erasure) | rule | any | application | command-handler | full | rule | guidance | Which erasures leave the actor mapping or delete audit records? Look at the erasure handling and the retained rows. |
| litespec/ext/audit#restrict-handler-contribution-to-determined-values | [Restrict Handler Contribution to Determined Values](https://litespec.dev/4.0.0/ext/audit.md#restrict-handler-contribution-to-determined-values) | rule | any | application | command-handler | full | rule | guidance | Which handler contributions repeat the declared target or reason value, the actor, action code, or timestamp? Look at the handler audit calls. |
| litespec/ext/audit#retain-each-category-for-its-declared-period | [Retain Each Category for Its Declared Period](https://litespec.dev/4.0.0/ext/audit.md#retain-each-category-for-its-declared-period) | rule | any | application | job | full | rule | guidance | Which records outlive the declared retention of their category? Look at the stored rows beside the adoption decision. |
| litespec/ext/audit#scope-every-record-to-its-tenant | [Scope Every Record to Its Tenant](https://litespec.dev/4.0.0/ext/audit.md#scope-every-record-to-its-tenant) | rule | any | application | any | full | rule | guidance | Which records on tenant-owned data lack the tenant identity? Look at the tenant column. |
| litespec/ext/audit#stage-the-audit-write-before-the-business-commit | [Stage the Audit Write Before the Business Commit](https://litespec.dev/4.0.0/ext/audit.md#stage-the-audit-write-before-the-business-commit) | rule | any | application | any | full | rule | guidance | Which audit stages run after the business commit stage? Look at the pipeline stage order. |
| litespec/ext/audit#state-the-action-as-use-case-identity | [State the Action as Use-Case Identity](https://litespec.dev/4.0.0/ext/audit.md#state-the-action-as-use-case-identity) | rule | any | application | any | full | rule | guidance | Which action values name something other than the invoked use case? Look at the action column beside the use case pages. |
| litespec/ext/audit#store-the-trail-beside-the-business-data | [Store the Trail Beside the Business Data](https://litespec.dev/4.0.0/ext/audit.md#store-the-trail-beside-the-business-data) | convention | any | application | any | full | default | guidance | Which trails live outside the business database or the recorded local convention? Look at the audit store and its privileges. |
| litespec/ext/audit#use-a-closed-actor-set | [Use a Closed Actor Set](https://litespec.dev/4.0.0/ext/audit.md#use-a-closed-actor-set) | rule | any | application | any | full | rule | guidance | Which actor values fall outside the five actor kinds? Look at the actor column, with devices and processes mapped. |
| litespec/ext/audit#use-a-fixed-category-vocabulary | [Use a Fixed Category Vocabulary](https://litespec.dev/4.0.0/ext/audit.md#use-a-fixed-category-vocabulary) | convention | any | application | command-handler | full | default | guidance | Which category values fall outside the eight-value vocabulary or the recorded local convention? Look at the declared selection. |
| litespec/ext/audit#verify-the-integrity-chain-on-a-schedule | [Verify the Integrity Chain on a Schedule](https://litespec.dev/4.0.0/ext/audit.md#verify-the-integrity-chain-on-a-schedule) | rule | any | application | job | full | rule | guidance | Which deployments run no scheduled chain verification with an alert? Look at the integrity job and its alerts. |
| litespec/ext/audit#version-the-audit-record-shape | [Version the Audit Record Shape](https://litespec.dev/4.0.0/ext/audit.md#version-the-audit-record-shape) | rule | any | application | any | full | rule | guidance | Which records lack an explicit schema version? Look at the stored audit rows. |
| litespec/ext/audit#write-an-unsuccessful-record-outside-the-failed-transaction | [Write an Unsuccessful Record Outside the Failed Transaction](https://litespec.dev/4.0.0/ext/audit.md#write-an-unsuccessful-record-outside-the-failed-transaction) | rule | any | application | any | full | rule | guidance | Which denied or failed records roll back with their transaction? Look at the unsuccessful write path. |
| litespec/ext/automation#bound-tenant-rule-runs-per-period | [Bound Tenant Rule Runs per Period](https://litespec.dev/4.0.0/ext/automation.md#bound-tenant-rule-runs-per-period) | convention | any | application | - | full | default | guidance | Each stored instance carries a monthly run cap, or the automation documentation names the cap scheme. |
| litespec/ext/automation#isolate-hook-failures-from-the-trigger | [Isolate Hook Failures from the Trigger](https://litespec.dev/4.0.0/ext/automation.md#isolate-hook-failures-from-the-trigger) | rule | any | application | - | full | rule | guidance | The hook tests fail the endpoint while the trigger outcome stays unchanged. |
| litespec/ext/automation#record-the-automation-catalog | [Record the Automation Catalog](https://litespec.dev/4.0.0/ext/automation.md#record-the-automation-catalog) | rule | any | application | - | full | rule | guidance | Each catalog trigger, condition, and action is present as a record. |
| litespec/ext/automation#refuse-unknown-catalog-entries | [Refuse Unknown Catalog Entries](https://litespec.dev/4.0.0/ext/automation.md#refuse-unknown-catalog-entries) | rule | any | application | - | full | rule | guidance | The instance tests refuse entries outside the catalog with the current catalog in the refusal. |
| litespec/ext/automation#state-what-a-hook-may-not-assume | [State What a Hook May Not Assume](https://litespec.dev/4.0.0/ext/automation.md#state-what-a-hook-may-not-assume) | rule | any | application | - | full | rule | guidance | Each hook record lists the ordering, timing, and payload bounds its endpoint leaves unassumed. |
| litespec/ext/automation#state-what-a-hook-may-rely-on | [State What a Hook May Rely On](https://litespec.dev/4.0.0/ext/automation.md#state-what-a-hook-may-rely-on) | rule | any | application | - | full | rule | guidance | Each hook record lists payload, retries, timeout, and signature for its customer endpoint. |
| litespec/ext/automation#treat-tenant-rules-as-data | [Treat Tenant Rules as Data](https://litespec.dev/4.0.0/ext/automation.md#treat-tenant-rules-as-data) | rule | any | application | - | full | rule | guidance | Tenant instances live in tenant storage with none as a record. |
| litespec/ext/automation#version-catalog-entries | [Version Catalog Entries](https://litespec.dev/4.0.0/ext/automation.md#version-catalog-entries) | rule | any | application | - | full | rule | guidance | Each catalog entry carries a version, and the stored instances cite the version they run. |
| litespec/ext/cache#avoid-unbounded-key-locks | [Avoid Unbounded Key Locks](https://litespec.dev/4.0.0/ext/cache.md#avoid-unbounded-key-locks) | rule | any | infrastructure | any | full | rule | guidance | Which lock schemes grow one entry per key without bound? Look at the lock state under high-cardinality keys. |
| litespec/ext/cache#bound-cache-refresh-work | [Bound Cache Refresh Work](https://litespec.dev/4.0.0/ext/cache.md#bound-cache-refresh-work) | rule | any | infrastructure | any | full | rule | guidance | Which caches refresh without bound on concurrent misses? Look at the refresh path under concurrent load. |
| litespec/ext/cache#compose-cache-keys-from-result-inputs | [Compose Cache Keys from Result Inputs](https://litespec.dev/4.0.0/ext/cache.md#compose-cache-keys-from-result-inputs) | rule | any | infrastructure | any | full | rule | guidance | Which keys miss the data-shape version, a result-affecting input, or the tenant or actor partition? Look at the key construction. |
| litespec/ext/cache#define-cache-invalidation | [Define Cache Invalidation](https://litespec.dev/4.0.0/ext/cache.md#define-cache-invalidation) | rule | any | infrastructure | any | full | rule | guidance | Which cached values lack expiry, invalidating events, an owner, or failure behavior? Look at the invalidation contract of each cache. |
| litespec/ext/cache#define-cache-outage-behavior | [Define Cache Outage Behavior](https://litespec.dev/4.0.0/ext/cache.md#define-cache-outage-behavior) | rule | any | infrastructure | any | full | rule | guidance | Which caches lack a documented source fallback or degraded response? Look at the outage behavior of each cache. |
| litespec/ext/cache#emit-a-signal-for-each-degraded-cache-path | [Emit a Signal for Each Degraded Cache Path](https://litespec.dev/4.0.0/ext/cache.md#emit-a-signal-for-each-degraded-cache-path) | rule | any | infrastructure | any | full | rule | guidance | Which cache paths share one counter across miss, error, and degraded response? Look at the emitted metrics. |
| litespec/ext/cache#exclude-unsafe-cache-key-material | [Exclude Unsafe Cache Key Material](https://litespec.dev/4.0.0/ext/cache.md#exclude-unsafe-cache-key-material) | rule | any | infrastructure | any | full | rule | guidance | Which keys contain a secret, unbounded input, or unhashed personal data? Look at the key construction. |
| litespec/ext/cache#keep-source-data-authoritative | [Keep Source Data Authoritative](https://litespec.dev/4.0.0/ext/cache.md#keep-source-data-authoritative) | rule | any | infrastructure | any | full | rule | guidance | Which required business data lives authoritatively in the cache? Look at the source of record beside the cached copy. |
| litespec/ext/cache#place-cache-access-at-an-outer-boundary | [Place Cache Access at an Outer Boundary](https://litespec.dev/4.0.0/ext/cache.md#place-cache-access-at-an-outer-boundary) | convention | any | infrastructure | any | full | default | guidance | Which cache access lives inside Domain, or outside the recorded local convention? Look at the cache call sites. |
| litespec/ext/cache#prefer-bounded-staleness | [Prefer Bounded Staleness](https://litespec.dev/4.0.0/ext/cache.md#prefer-bounded-staleness) | rule | any | infrastructure | any | full | advice | guidance | Which long expiries lack a measured staleness and operating-cost decision? Look at the expiry beside the invalidation cost. |
| litespec/ext/cache#record-a-manual-cache-invalidation | [Record a Manual Cache Invalidation](https://litespec.dev/4.0.0/ext/cache.md#record-a-manual-cache-invalidation) | rule | any | infrastructure | any | full | rule | guidance | Which manual clears lack a record naming actor, invalidation scope, and reason? Look at the invalidation runs. |
| litespec/ext/cache#record-accepted-cache-staleness | [Record Accepted Cache Staleness](https://litespec.dev/4.0.0/ext/cache.md#record-accepted-cache-staleness) | rule | any | infrastructure | record:use-case | full | rule | guidance | Which cached queries lack a bounded freshness object with its duration on their output? Look at the served query beside each cache. |
| litespec/ext/cache#record-measured-cache-need | [Record Measured Cache Need](https://litespec.dev/4.0.0/ext/cache.md#record-measured-cache-need) | rule | any | infrastructure | any | full | rule | guidance | Which cache proposals lack observed query, load, latency, cost, or target? Look at the proposal behind each cache. |
| litespec/ext/cache#remove-unjustified-caches | [Remove Unjustified Caches](https://litespec.dev/4.0.0/ext/cache.md#remove-unjustified-caches) | rule | any | infrastructure | any | full | rule | guidance | Which caches stay past measurements that no longer justify their cost? Look at the owner reviews beside the operating cost. |
| litespec/ext/compat#assign-operation-ids | [Assign Operation IDs](https://litespec.dev/4.0.0/ext/compat.md#assign-operation-ids) | rule | any | web-api | endpoint | full | rule | guidance | Which independent-consumer operations lack a deliberate operationId? Look at the OpenAPI document. |
| litespec/ext/compat#assign-versioned-operation-ids | [Assign Versioned Operation IDs](https://litespec.dev/4.0.0/ext/compat.md#assign-versioned-operation-ids) | rule | any | web-api | endpoint | full | rule | guidance | Which new versions reuse the operation ID of a changed contract? Look at the versioned OpenAPI documents. |
| litespec/ext/compat#classify-breaking-contract-changes | [Classify Breaking Contract Changes](https://litespec.dev/4.0.0/ext/compat.md#classify-breaking-contract-changes) | rule | any | web-api | any | full | rule | guidance | Which removed, renamed, narrowed, retyped, or authentication changes lack a breaking verdict? Look at the change reviews. |
| litespec/ext/compat#classify-compatible-additions | [Classify Compatible Additions](https://litespec.dev/4.0.0/ext/compat.md#classify-compatible-additions) | rule | any | web-api | any | full | rule | guidance | Which optional additions lack a record of why existing behavior stays? Look at the change reviews. |
| litespec/ext/compat#classify-independent-consumer-changes | [Classify Independent-Consumer Changes](https://litespec.dev/4.0.0/ext/compat.md#classify-independent-consumer-changes) | rule | any | web-api | any | full | rule | guidance | Which independent-consumer contract changes lack a classification? Look at the change reviews. |
| litespec/ext/compat#classify-integration-event-changes | [Classify Integration Event Changes](https://litespec.dev/4.0.0/ext/compat.md#classify-integration-event-changes) | rule | any | web-api | any | full | rule | guidance | Which integration-event changes lack a breaking, compatible, or needs-review verdict? Look at the event reviews. |
| litespec/ext/compat#declare-published-facts-as-integration-events | [Declare Published Facts as Integration Events](https://litespec.dev/4.0.0/ext/compat.md#declare-published-facts-as-integration-events) | rule | any | web-api | record:integration-event | full | rule | guidance | Which outside-consumed facts lack an integration-event record with direction, payload, and trust? Look at the integration-event records beside the outside consumers. |
| litespec/ext/compat#diff-release-contracts | [Diff Release Contracts](https://litespec.dev/4.0.0/ext/compat.md#diff-release-contracts) | rule | any | web-api | any | full | rule | guidance | Which changes skipped the local or continuous integration diff against the baseline? Look at the local runs and the CI runs. |
| litespec/ext/compat#exercise-generated-consumers | [Exercise Generated Consumers](https://litespec.dev/4.0.0/ext/compat.md#exercise-generated-consumers) | rule | any | web-api | test | full | rule | guidance | Which first-party clients skip compiling or exercising the changed contract? Look at the client test runs. |
| litespec/ext/compat#gate-new-error-outcomes | [Gate New Error Outcomes](https://litespec.dev/4.0.0/ext/compat.md#gate-new-error-outcomes) | rule | any | web-api | any | full | rule | guidance | Which added error outcomes break existing consumers on unknown codes? Look at the consumer error handling. |
| litespec/ext/compat#keep-baseline-references-immutable | [Keep Baseline References Immutable](https://litespec.dev/4.0.0/ext/compat.md#keep-baseline-references-immutable) | convention | any | web-api | any | full | default | guidance | Which baselines move, or live outside the recorded local convention? Look at the baseline references. |
| litespec/ext/compat#keep-problem-details-codes-stable | [Keep Problem Details Codes Stable](https://litespec.dev/4.0.0/ext/compat.md#keep-problem-details-codes-stable) | convention | any | web-api | any | full | default | guidance | Which Problem Details codes changed across compatible versions, or outside the recorded local convention? Look at the versioned error surface. |
| litespec/ext/compat#preserve-stable-error-codes | [Preserve Stable Error Codes](https://litespec.dev/4.0.0/ext/compat.md#preserve-stable-error-codes) | rule | any | web-api | any | full | rule | guidance | Which removed or reassigned stable codes lack a breaking verdict? Look at the change reviews. |
| litespec/ext/compat#publish-deprecation-context | [Publish Deprecation Context](https://litespec.dev/4.0.0/ext/compat.md#publish-deprecation-context) | rule | any | web-api | any | full | rule | guidance | Which operations scheduled for removal are missing from the consumer changelog? Look at the consumer `CHANGELOG.md`. |
| litespec/ext/compat#record-breaking-behavior-changes-as-decisions | [Record Breaking Behavior Changes as Decisions](https://litespec.dev/4.0.0/ext/compat.md#record-breaking-behavior-changes-as-decisions) | rule | any | web-api | record:decision | full | rule | guidance | Which breaking Behavior changes past production lack a decision naming their consumer impact? Look at the decisions. |
| litespec/ext/compat#record-deprecation-conditions | [Record Deprecation Conditions](https://litespec.dev/4.0.0/ext/compat.md#record-deprecation-conditions) | rule | any | web-api | record:decision | full | rule | guidance | Which deprecations lack a sunset date, a replacement, or recording before removal? Look at the deprecation decisions. |
| litespec/ext/compat#record-version-retirement | [Record Version Retirement](https://litespec.dev/4.0.0/ext/compat.md#record-version-retirement) | rule | any | web-api | record:decision | full | rule | guidance | Which retirements lack affected consumers, a deadline, a removal condition, or recording before removal? Look at the versioning decisions. |
| litespec/ext/compat#reject-breaking-diffs-without-authorization | [Reject Breaking Diffs Without Authorization](https://litespec.dev/4.0.0/ext/compat.md#reject-breaking-diffs-without-authorization) | rule | any | web-api | any | full | rule | guidance | Which breaking diffs passed without a new version or a recorded decision? Look at the CI runs. |
| litespec/ext/compat#resolve-uncertain-classifications-safely | [Resolve Uncertain Classifications Safely](https://litespec.dev/4.0.0/ext/compat.md#resolve-uncertain-classifications-safely) | rule | any | web-api | any | full | rule | guidance | Which unclear changes shipped as compatible without consumer review? Look at the change reviews. |
| litespec/ext/compat#retain-compatible-operation-ids | [Retain Compatible Operation IDs](https://litespec.dev/4.0.0/ext/compat.md#retain-compatible-operation-ids) | rule | any | web-api | endpoint | full | rule | guidance | Which compatible changes renamed the operationId? Look at the OpenAPI diff. |
| litespec/ext/compat#retain-release-baselines | [Retain Release Baselines](https://litespec.dev/4.0.0/ext/compat.md#retain-release-baselines) | rule | any | web-api | any | full | rule | guidance | Which releases lack a retained OpenAPI baseline? Look at the release artifacts. |
| litespec/ext/compat#retain-supported-versions | [Retain Supported Versions](https://litespec.dev/4.0.0/ext/compat.md#retain-supported-versions) | rule | any | web-api | any | full | rule | guidance | Which previous versions left before their support window? Look at the deployed versions beside the declared window. |
| litespec/ext/compat#retire-integration-events-with-notice | [Retire Integration Events with Notice](https://litespec.dev/4.0.0/ext/compat.md#retire-integration-events-with-notice) | rule | any | web-api | any | full | rule | guidance | Which retired event versions left before their support window or without notice? Look at the retirement records beside the event consumers. |
| litespec/ext/compat#review-exhaustive-consumer-changes | [Review Exhaustive Consumer Changes](https://litespec.dev/4.0.0/ext/compat.md#review-exhaustive-consumer-changes) | rule | any | web-api | any | full | rule | guidance | Which added enum values or discriminator cases shipped without consumer review? Look at the consumer reviews. |
| litespec/ext/compat#signal-planned-public-removal | [Signal Planned Public Removal](https://litespec.dev/4.0.0/ext/compat.md#signal-planned-public-removal) | rule | any | web-api | endpoint | full | rule | guidance | Which operations scheduled for removal lack a deprecation signal? Look at the public operations. |
| litespec/ext/compat#store-current-openapi-source | [Store Current OpenAPI Source](https://litespec.dev/4.0.0/ext/compat.md#store-current-openapi-source) | convention | any | web-api | any | full | default | guidance | Which current OpenAPI artifacts live outside the documented path or the recorded local convention? Look at `apps/api/openapi/`. |
| litespec/ext/compat#treat-errors-as-contracts | [Treat Errors as Contracts](https://litespec.dev/4.0.0/ext/compat.md#treat-errors-as-contracts) | rule | any | web-api | any | full | rule | guidance | Which type, code, field-code, or status changes shipped outside versioning? Look at the versioned error surface. |
| litespec/ext/compat#treat-removed-behavior-fields-as-breaking | [Treat Removed Behavior Fields as Breaking](https://litespec.dev/4.0.0/ext/compat.md#treat-removed-behavior-fields-as-breaking) | rule | any | web-api | any | full | rule | guidance | Which removed output fields, refusal codes, or integration-event payload fields lack a breaking verdict? Look at the change reviews. |
| litespec/ext/compat#use-one-diff-tool | [Use One Diff Tool](https://litespec.dev/4.0.0/ext/compat.md#use-one-diff-tool) | convention | any | web-api | any | full | default | guidance | Which local runs or CI runs use a different diff tool than the recorded local convention? Look at the local runs and the CI runs. |
| litespec/ext/compat#version-breaking-contracts | [Version Breaking Contracts](https://litespec.dev/4.0.0/ext/compat.md#version-breaking-contracts) | rule | any | web-api | endpoint | full | rule | guidance | Which breaking contracts ship without a new route or media-type version? Look at the versioned API surface. |
| litespec/ext/compat#version-breaking-integration-events | [Version Breaking Integration Events](https://litespec.dev/4.0.0/ext/compat.md#version-breaking-integration-events) | rule | any | web-api | record:integration-event | full | rule | guidance | Which breaking event changes ship without a new version beside the retained one? Look at the integration event versions. |
| litespec/ext/concurrency#apply-http-version-preconditions | [Apply HTTP Version Preconditions](https://litespec.dev/4.0.0/ext/concurrency.md#apply-http-version-preconditions) | rule | any | application | endpoint | full | rule | guidance | Which versioned HTTP operations miss a strong persistence-derived ETag or an If-Match requirement on writes? Look at the versioned endpoints. |
| litespec/ext/concurrency#bound-expired-record-cleanup | [Bound Expired-Record Cleanup](https://litespec.dev/4.0.0/ext/concurrency.md#bound-expired-record-cleanup) | rule | any | application | job | full | rule | guidance | Which expired-record cleanup runs outside a bounded maintenance process? Look at the cleanup jobs. |
| litespec/ext/concurrency#canonicalize-request-fingerprints | [Canonicalize Request Fingerprints](https://litespec.dev/4.0.0/ext/concurrency.md#canonicalize-request-fingerprints) | rule | any | application | command-handler | full | rule | guidance | Which fingerprints miss canonical input, route identity, or actor identifier, or include credentials or the client key? Look at the fingerprint derivation. |
| litespec/ext/concurrency#compare-expected-aggregate-versions | [Compare Expected Aggregate Versions](https://litespec.dev/4.0.0/ext/concurrency.md#compare-expected-aggregate-versions) | rule | any | application | command-handler | full | rule | guidance | Which caller-version comparisons run outside the transaction carrying their change? Look at the conflicting-write paths. |
| litespec/ext/concurrency#declare-applicable-headers | [Declare Applicable Headers](https://litespec.dev/4.0.0/ext/concurrency.md#declare-applicable-headers) | convention | any | application | endpoint | full | default | guidance | Generated OpenAPI declares the idempotency header for every applicable operation, or the recorded header-declaration convention names how its contracts expose the header. |
| litespec/ext/concurrency#declare-replayed-transport-outcomes | [Declare Replayed Transport Outcomes](https://litespec.dev/4.0.0/ext/concurrency.md#declare-replayed-transport-outcomes) | rule | any | application | record:use-case | records | rule | guidance | Which idempotent use cases list no stored statuses and headers for replay? Look at the idempotent use case pages. |
| litespec/ext/concurrency#define-concurrent-retry-behavior | [Define Concurrent Retry Behavior](https://litespec.dev/4.0.0/ext/concurrency.md#define-concurrent-retry-behavior) | rule | any | application | record:use-case | records | rule | guidance | Which idempotent use cases leave concurrent-request behavior undefined? Look at the idempotent use case pages. |
| litespec/ext/concurrency#delay-irreversible-provider-calls | [Delay Irreversible Provider Calls](https://litespec.dev/4.0.0/ext/concurrency.md#delay-irreversible-provider-calls) | rule | any | application | command-handler | full | rule | guidance | Which irreversible provider calls run before their business transaction commits? Look at the idempotent operation paths. |
| litespec/ext/concurrency#discard-failed-replay-state | [Discard Failed Replay State](https://litespec.dev/4.0.0/ext/concurrency.md#discard-failed-replay-state) | rule | any | application | command-handler | full | rule | guidance | Which failed pre-commit requests leave a business change or a completed replay record? Look at the failure paths. |
| litespec/ext/concurrency#document-write-conflict-behavior | [Document Write Conflict Behavior](https://litespec.dev/4.0.0/ext/concurrency.md#document-write-conflict-behavior) | rule | any | application | record:use-case | records | rule | guidance | Which conflicting-write use cases lack conflicts, invalid state, winner behavior, or caller response? Look at the use case pages. |
| litespec/ext/concurrency#enforce-key-uniqueness | [Enforce Key Uniqueness](https://litespec.dev/4.0.0/ext/concurrency.md#enforce-key-uniqueness) | rule | any | application | repository | full | rule | guidance | Which idempotency stores lack the unique constraint on tenant, actor, operation, and client key? Look at the idempotency store schema. |
| litespec/ext/concurrency#exclude-unsafe-replay-outcomes | [Exclude Unsafe Replay Outcomes](https://litespec.dev/4.0.0/ext/concurrency.md#exclude-unsafe-replay-outcomes) | rule | any | application | command-handler | full | rule | guidance | Which replays return authentication failures, transient failures, cookies, hop-by-hop headers, tokens, or secrets? Look at the replayed responses. |
| litespec/ext/concurrency#hide-provider-version-values | [Hide Provider Version Values](https://litespec.dev/4.0.0/ext/concurrency.md#hide-provider-version-values) | rule | any | application | endpoint | full | rule | guidance | Which transport models expose a provider-specific version value outside the ETag? Look at the public transport models. |
| litespec/ext/concurrency#keep-idempotency-persistence-in-infrastructure | [Keep Idempotency Persistence in Infrastructure](https://litespec.dev/4.0.0/ext/concurrency.md#keep-idempotency-persistence-in-infrastructure) | convention | any | application | repository | full | default | guidance | Idempotency persistence and transaction handling live in Infrastructure, or the recorded idempotency-store convention names where its idempotency state lives. |
| litespec/ext/concurrency#limit-version-checks | [Limit Version Checks](https://litespec.dev/4.0.0/ext/concurrency.md#limit-version-checks) | rule | any | application | command-handler, endpoint | full | rule | guidance | Which caller-version requirements lack a documented conflicting-write case? Look at the versioned operations beside the conflicting-write documents. |
| litespec/ext/concurrency#map-failed-expected-versions | [Map Failed Expected Versions](https://litespec.dev/4.0.0/ext/concurrency.md#map-failed-expected-versions) | rule | any | application | endpoint | full | rule | guidance | Which failed expected versions miss the 409 Problem Details response or its stable code? Look at the conflict responses. |
| litespec/ext/concurrency#map-replay-responses-at-the-api-boundary | [Map Replay Responses at the API Boundary](https://litespec.dev/4.0.0/ext/concurrency.md#map-replay-responses-at-the-api-boundary) | convention | any | application | endpoint | full | default | guidance | Replay response mapping lives at the API boundary, or the recorded replay-mapping convention names where its replay mapping lives. |
| litespec/ext/concurrency#protect-fingerprint-source-data | [Protect Fingerprint Source Data](https://litespec.dev/4.0.0/ext/concurrency.md#protect-fingerprint-source-data) | rule | any | application | command-handler | full | rule | guidance | Which idempotency stores keep original sensitive request content that support never needs? Look at the fingerprint store. |
| litespec/ext/concurrency#reject-conflicting-key-reuse | [Reject Conflicting Key Reuse](https://litespec.dev/4.0.0/ext/concurrency.md#reject-conflicting-key-reuse) | rule | any | application | command-handler | full | rule | guidance | Which reused keys with a changed fingerprint miss the documented rejection? Look at the key-reuse paths. |
| litespec/ext/concurrency#reject-silent-overwrites | [Reject Silent Overwrites](https://litespec.dev/4.0.0/ext/concurrency.md#reject-silent-overwrites) | rule | any | application | command-handler | full | rule | guidance | Which conflicting accepted writes silently replace the winner? Look at the conflict outcomes. |
| litespec/ext/concurrency#reload-concurrent-winners | [Reload Concurrent Winners](https://litespec.dev/4.0.0/ext/concurrency.md#reload-concurrent-winners) | rule | any | application | command-handler | full | rule | guidance | Which losing concurrent requests with a matching fingerprint miss the reload and replay of the winner? Look at the concurrent retry paths. |
| litespec/ext/concurrency#replay-completed-results | [Replay Completed Results](https://litespec.dev/4.0.0/ext/concurrency.md#replay-completed-results) | rule | any | application | command-handler | full | rule | guidance | Which completed idempotent retries return other than the original response status and body? Look at the replay paths. |
| litespec/ext/concurrency#restrict-replay-data | [Restrict Replay Data](https://litespec.dev/4.0.0/ext/concurrency.md#restrict-replay-data) | rule | any | application | command-handler | full | rule | guidance | Which stored replay fields serve no accepted result callers reproduce? Look at the replay store. |
| litespec/ext/concurrency#retain-safe-retry-keys | [Retain Safe Retry Keys](https://litespec.dev/4.0.0/ext/concurrency.md#retain-safe-retry-keys) | rule | any | application | record:setting | records | rule | guidance | Which keys expire before the documented safe retry time? Look at the retention settings beside the idempotent use cases. |
| litespec/ext/concurrency#return-precondition-outcomes | [Return Precondition Outcomes](https://litespec.dev/4.0.0/ext/concurrency.md#return-precondition-outcomes) | rule | any | application | endpoint | full | rule | guidance | Which versioned operations return a wrong status or code for a missing If-Match or a stale version? Look at the precondition responses. |
| litespec/ext/concurrency#route-required-external-effects-durably | [Route Required External Effects Durably](https://litespec.dev/4.0.0/ext/concurrency.md#route-required-external-effects-durably) | rule | any | application | command-handler | full | rule | guidance | Which required external effects use neither the outbox nor a documented provider idempotency contract? Look at the idempotent operation paths. |
| litespec/ext/concurrency#run-idempotency-in-the-pipeline | [Run Idempotency in the Pipeline](https://litespec.dev/4.0.0/ext/concurrency.md#run-idempotency-in-the-pipeline) | rule | any | application | command-handler | full | rule | guidance | Which idempotent operations run idempotency outside a pipeline stage after authorization and validation, before the handler? Look at the pipeline stage order. |
| litespec/ext/concurrency#scope-client-keys | [Scope Client Keys](https://litespec.dev/4.0.0/ext/concurrency.md#scope-client-keys) | rule | any | application | command-handler | full | rule | guidance | Which idempotent operations scope their client key to less than tenant, authenticated actor, and operation? Look at the keyed operations. |
| litespec/ext/concurrency#set-key-retention | [Set Key Retention](https://litespec.dev/4.0.0/ext/concurrency.md#set-key-retention) | rule | any | application | record:setting | records | rule | guidance | Which key retentions miss the caller retry window or the business risk? Look at the setting record beside the idempotent use case. |
| litespec/ext/concurrency#store-idempotency-state-atomically | [Store Idempotency State Atomically](https://litespec.dev/4.0.0/ext/concurrency.md#store-idempotency-state-atomically) | rule | any | application | command-handler | full | rule | guidance | Which idempotent operations store fingerprint, state, response, or expiry outside the business transaction? Look at the keyed write paths. |
| litespec/ext/concurrency#use-the-standard-idempotency-header | [Use the Standard Idempotency Header](https://litespec.dev/4.0.0/ext/concurrency.md#use-the-standard-idempotency-header) | convention | any | application | endpoint | full | default | guidance | Applicable operations accept `Idempotency-Key` within its bounds, or the recorded client-key convention names the header and value bounds its commands accept. |
| litespec/ext/delegation#ask-only-unanswered-questions | [Ask Only Unanswered Questions](https://litespec.dev/4.0.0/ext/delegation.md#ask-only-unanswered-questions) | rule | any | workspace | - | full | rule | guidance | Which worker questions repeat answers the brief gives? Look at the worker questions beside the brief. |
| litespec/ext/delegation#hold-back-example-rows-from-the-implementing-worker | [Hold Back Example Rows from the Implementing Worker](https://litespec.dev/4.0.0/ext/delegation.md#hold-back-example-rows-from-the-implementing-worker) | rule | any | workspace | - | full | rule | guidance | Which delegated refusal or calculation implementations were checked only against rows the worker saw? Look at the held-back rows and the check runs. |
| litespec/ext/delegation#restrict-a-worker-to-its-paths | [Restrict a Worker to Its Paths](https://litespec.dev/4.0.0/ext/delegation.md#restrict-a-worker-to-its-paths) | rule | any | workspace | - | full | rule | checkable | `git diff --name-only` lists only the brief's named paths. The worker commits nothing. |
| litespec/ext/delegation#verify-before-accepting-worker-output | [Verify Before Accepting Worker Output](https://litespec.dev/4.0.0/ext/delegation.md#verify-before-accepting-worker-output) | rule | any | workspace | - | full | rule | guidance | Which accepted outputs lack a watched verification run? Look at the verification runs the delegating agent reports. |
| litespec/ext/delegation#write-a-brief-before-delegating | [Write a Brief Before Delegating](https://litespec.dev/4.0.0/ext/delegation.md#write-a-brief-before-delegating) | rule | any | workspace | - | full | rule | guidance | Which briefs lack goal, context, sources, or output? Look at the briefs the delegating agent wrote. |
| litespec/ext/delivery#accept-every-shipped-package-license-explicitly | [Accept Every Shipped Package License Explicitly](https://litespec.dev/4.0.0/ext/delivery.md#accept-every-shipped-package-license-explicitly) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `dependency-license-unknown` (level S) for a direct package whose license the project does not accept and no `admits` entry names. |
| litespec/ext/delivery#apply-oci-release-labels | [Apply OCI Release Labels](https://litespec.dev/4.0.0/ext/delivery.md#apply-oci-release-labels) | rule | any | operations | any | full | rule | guidance | Which release images miss OCI source, revision, version, or created-time labels? Look at the built images. |
| litespec/ext/delivery#apply-schema-work-before-traffic | [Apply Schema Work Before Traffic](https://litespec.dev/4.0.0/ext/delivery.md#apply-schema-work-before-traffic) | rule | any | operations | any | full | rule | guidance | Which releases shift traffic before the reviewed schema job runs? Look at the release job order. |
| litespec/ext/delivery#apply-the-documented-defaults | [Apply the Documented Defaults](https://litespec.dev/4.0.0/ext/delivery.md#apply-the-documented-defaults) | convention | any | operations | any | full | default | guidance | Each consumer workflow file matches one jobs-table job and name, or the workflow-layout convention names another arrangement. |
| litespec/ext/delivery#attach-dashboard-links-to-production-objectives | [Attach Dashboard Links to Production Objectives](https://litespec.dev/4.0.0/ext/delivery.md#attach-dashboard-links-to-production-objectives) | rule | any | operations | any | full | rule | guidance | Each production objective in the book links its dashboard. |
| litespec/ext/delivery#build-from-the-workspace-root | [Build from the Workspace Root](https://litespec.dev/4.0.0/ext/delivery.md#build-from-the-workspace-root) | convention | any | operations | any | full | default | guidance | Image builds needing shared inputs start from the workspace root, or the recorded build-context convention names the context its image builds use. |
| litespec/ext/delivery#build-release-images-in-stages | [Build Release Images in Stages](https://litespec.dev/4.0.0/ext/delivery.md#build-release-images-in-stages) | rule | any | operations | any | full | rule | guidance | Which release images miss multi-stage builds or pinned base-image digests? Look at the Dockerfiles. |
| litespec/ext/delivery#copy-only-runtime-files | [Copy Only Runtime Files](https://litespec.dev/4.0.0/ext/delivery.md#copy-only-runtime-files) | rule | any | operations | any | full | rule | guidance | Which runtime images carry files outside the declared runtime manifest? Look at the image file listing beside the declared runtime manifest. |
| litespec/ext/delivery#cover-the-baseline-alert-set | [Cover the Baseline Alert Set](https://litespec.dev/4.0.0/ext/delivery.md#cover-the-baseline-alert-set) | rule | any | operations | any | full | rule | guidance | The baseline alerts cover readiness failures, unexpected HTTP errors, release-flow latency, PostgreSQL outages, and failed deployments. |
| litespec/ext/delivery#declare-writable-paths-and-limits | [Declare Writable Paths and Limits](https://litespec.dev/4.0.0/ext/delivery.md#declare-writable-paths-and-limits) | rule | any | operations | any | full | rule | guidance | Which deployments miss declared writable paths or CPU and memory setting records? Look at the deployment manifests beside the setting records. |
| litespec/ext/delivery#define-actionable-baseline-alerts | [Define Actionable Baseline Alerts](https://litespec.dev/4.0.0/ext/delivery.md#define-actionable-baseline-alerts) | rule | any | operations | any | full | rule | guidance | Each baseline alert declares owner, threshold, window, severity, and runbook. |
| litespec/ext/delivery#define-backup-and-restore-behavior | [Define Backup and Restore Behavior](https://litespec.dev/4.0.0/ext/delivery.md#define-backup-and-restore-behavior) | rule | any | operations | any | full | rule | guidance | The release documentation states backup owner, schedule, retention, encryption, location, restore command, and recovery objectives. |
| litespec/ext/delivery#enforce-the-supply-chain-gate | [Enforce the Supply-Chain Gate](https://litespec.dev/4.0.0/ext/delivery.md#enforce-the-supply-chain-gate) | rule | any | operations | any | full | rule | guidance | The supply-chain report shows scan, pin, inventory, and license evidence with an exception for each unhandled high-severity advisory. |
| litespec/ext/delivery#exclude-build-material-from-runtime-images | [Exclude Build Material from Runtime Images](https://litespec.dev/4.0.0/ext/delivery.md#exclude-build-material-from-runtime-images) | rule | any | operations | any | full | rule | guidance | Which runtime images contain source, tests, package caches, or local configuration? Look at the runtime image contents. |
| litespec/ext/delivery#exclude-build-timestamps-from-contracts | [Exclude Build Timestamps from Contracts](https://litespec.dev/4.0.0/ext/delivery.md#exclude-build-timestamps-from-contracts) | rule | any | operations | any | full | rule | guidance | Which published OpenAPI documents or generated clients contain a build timestamp? Look at the generated contracts. |
| litespec/ext/delivery#exclude-environment-configuration-from-images | [Exclude Environment Configuration from Images](https://litespec.dev/4.0.0/ext/delivery.md#exclude-environment-configuration-from-images) | rule | any | operations | any | full | rule | guidance | Which release images contain environment-specific configuration? Look at the release image contents. |
| litespec/ext/delivery#exclude-insecure-frontend-secret-carriers | [Exclude Insecure Frontend Secret Carriers](https://litespec.dev/4.0.0/ext/delivery.md#exclude-insecure-frontend-secret-carriers) | rule | any | operations | any | full | rule | guidance | Which frontend image builds use `ARG`, copied environment files, or image layers for secrets? Look at the frontend image builds. |
| litespec/ext/delivery#exercise-a-restore-before-the-first-production-data | [Exercise a Restore Before the First Production Data](https://litespec.dev/4.0.0/ext/delivery.md#exercise-a-restore-before-the-first-production-data) | rule | any | operations | any | full | rule | guidance | The operations log holds a restore rehearsal on representative data before the first production data. |
| litespec/ext/delivery#exercise-every-runbook-before-release | [Exercise Every Runbook Before Release](https://litespec.dev/4.0.0/ext/delivery.md#exercise-every-runbook-before-release) | rule | any | operations | record:runbook | full | rule | guidance | Each required runbook carries a dated rehearsal in the operations log. |
| litespec/ext/delivery#keep-a-canonical-job-graph | [Keep a Canonical Job Graph](https://litespec.dev/4.0.0/ext/delivery.md#keep-a-canonical-job-graph) | rule | any | operations | any | full | rule | guidance | The consumer workflows use the job names and responsibilities the jobs table states. |
| litespec/ext/delivery#keep-a-first-release-readiness-record | [Keep a First-Release Readiness Record](https://litespec.dev/4.0.0/ext/delivery.md#keep-a-first-release-readiness-record) | rule | any | operations | any | full | rule | guidance | Which pre-release consumers lack dated rehearsals, green gates, or a rehearsal owner? Look at the readiness record beside the project. |
| litespec/ext/delivery#keep-deployment-descriptors-together | [Keep Deployment Descriptors Together](https://litespec.dev/4.0.0/ext/delivery.md#keep-deployment-descriptors-together) | convention | any | operations | any | full | default | guidance | The deployment descriptors sit under one `deploy/` tree, or the deployment-layout convention names another arrangement. |
| litespec/ext/delivery#keep-each-alert-threshold-to-its-requirements-measure | [Keep Each Alert Threshold to Its Requirement's Measure](https://litespec.dev/4.0.0/ext/delivery.md#keep-each-alert-threshold-to-its-requirements-measure) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `alert-threshold-drift` (level A) for an alert rule whose own text carries none of the decimal numbers its requirement's `measure` names. |
| litespec/ext/delivery#keep-mutable-data-external | [Keep Mutable Data External](https://litespec.dev/4.0.0/ext/delivery.md#keep-mutable-data-external) | rule | any | operations | any | full | rule | guidance | Which mutable data lives inside a container filesystem? Look at the application storage design. |
| litespec/ext/delivery#keep-rollback-executable | [Keep Rollback Executable](https://litespec.dev/4.0.0/ext/delivery.md#keep-rollback-executable) | rule | any | operations | record:runbook | full | rule | guidance | The rollback runbook states its artifact reference, command, compatibility, data condition, and expand-and-contract sequence, and the previous image digest for a container release. |
| litespec/ext/delivery#keep-schema-work-out-of-startup | [Keep Schema Work Out of Startup](https://litespec.dev/4.0.0/ext/delivery.md#keep-schema-work-out-of-startup) | rule | any | operations | any | full | rule | guidance | Which application replicas alter the production schema during startup? Look at the replica startup paths. |
| litespec/ext/delivery#keep-scripts-at-the-root | [Keep Scripts at the Root](https://litespec.dev/4.0.0/ext/delivery.md#keep-scripts-at-the-root) | convention | any | operations | any | full | default | guidance | Bootstrap, release, and CI helper scripts sit under root `scripts/`; where replaced, the project documentation names the project's own script layout. |
| litespec/ext/delivery#limit-container-privileges | [Limit Container Privileges](https://litespec.dev/4.0.0/ext/delivery.md#limit-container-privileges) | rule | any | operations | any | full | rule | guidance | Which deployments keep a writable filesystem or unnecessary capabilities where the application permits the limits? Look at the deployment manifests. |
| litespec/ext/delivery#match-every-shipped-package-to-its-pin | [Match Every Shipped Package to Its Pin](https://litespec.dev/4.0.0/ext/delivery.md#match-every-shipped-package-to-its-pin) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `dependency-version-drift` (level S) for a direct package whose version differs from its manifest pin. |
| litespec/ext/delivery#meet-release-readiness-gates | [Meet Release Readiness Gates](https://litespec.dev/4.0.0/ext/delivery.md#meet-release-readiness-gates) | rule | any | operations | any | full | rule | checkable | `litespec model check --release` blocks on `use-case-unverified`. |
| litespec/ext/delivery#place-dockerfiles-beside-deployables | [Place Dockerfiles Beside Deployables](https://litespec.dev/4.0.0/ext/delivery.md#place-dockerfiles-beside-deployables) | convention | any | operations | any | full | default | guidance | Each deployable application keeps its Dockerfile beside it, or the recorded dockerfile-layout convention names where its Dockerfiles live. |
| litespec/ext/delivery#promote-verified-artifacts | [Promote Verified Artifacts](https://litespec.dev/4.0.0/ext/delivery.md#promote-verified-artifacts) | rule | any | operations | any | full | rule | guidance | The staging and production deployments reference the one artifact the release job passed. |
| litespec/ext/delivery#protect-the-default-branch | [Protect the Default Branch](https://litespec.dev/4.0.0/ext/delivery.md#protect-the-default-branch) | rule | any | operations | any | full | rule | guidance | The default branch settings require the jobs-table entries, a reviewed pull request, and a clean merge state. |
| litespec/ext/delivery#provide-release-data-recovery | [Provide Release Data Recovery](https://litespec.dev/4.0.0/ext/delivery.md#provide-release-data-recovery) | rule | any | operations | any | full | rule | guidance | Which releases lack repeatable schema setup, backup instructions, or a tested restore? Look at the recovery evidence beside the release. |
| litespec/ext/delivery#provide-release-delivery-controls | [Provide Release Delivery Controls](https://litespec.dev/4.0.0/ext/delivery.md#provide-release-delivery-controls) | rule | any | operations | any | full | rule | guidance | Which releases lack current CI, deployment, rollback, limits, or runbooks? Look at the delivery evidence beside the release. |
| litespec/ext/delivery#provide-release-operating-visibility | [Provide Release Operating Visibility](https://litespec.dev/4.0.0/ext/delivery.md#provide-release-operating-visibility) | rule | any | operations | any | full | rule | guidance | Which releases lack health signals, trace diagnostics, or secrets outside source control? Look at the operating evidence beside the release. |
| litespec/ext/delivery#publish-a-book-preview-for-every-change | [Publish a Book Preview for Every Change](https://litespec.dev/4.0.0/ext/delivery.md#publish-a-book-preview-for-every-change) | rule | any | operations | any | full | rule | guidance | The pull request links a book preview built from the change. |
| litespec/ext/delivery#record-each-drill-run-as-a-check-result | [Record Each Drill Run as a Check Result](https://litespec.dev/4.0.0/ext/delivery.md#record-each-drill-run-as-a-check-result) | rule | any | operations | any | full | rule | guidance | Which drill or measuring harness runs lack a check result file naming the requirement's `check` under `paths.checkResults`? Look at the harness run records beside the files under `paths.checkResults`. |
| litespec/ext/delivery#record-every-branch-protection-bypass | [Record Every Branch Protection Bypass](https://litespec.dev/4.0.0/ext/delivery.md#record-every-branch-protection-bypass) | rule | any | operations | any | full | rule | guidance | Each bypass entry in the operations log or recovery decision names its actor, reason, and admitted change. |
| litespec/ext/delivery#record-image-digests | [Record Image Digests](https://litespec.dev/4.0.0/ext/delivery.md#record-image-digests) | rule | any | operations | any | full | rule | guidance | Which release records store only an image tag with no deployed digest? Look at the release records. |
| litespec/ext/delivery#record-operating-readiness | [Record Operating Readiness](https://litespec.dev/4.0.0/ext/delivery.md#record-operating-readiness) | rule | any | operations | any | full | rule | guidance | Which records lack limits, alerts, runbooks, conditions, or omissions? Look at the readiness list on each release record. |
| litespec/ext/delivery#record-release-evidence | [Record Release Evidence](https://litespec.dev/4.0.0/ext/delivery.md#record-release-evidence) | rule | any | operations | any | full | rule | guidance | Which records lack a result for a listed evidence kind? Look at the evidence list on each release record. |
| litespec/ext/delivery#report-liveness-from-every-recurring-job | [Report Liveness from Every Recurring Job](https://litespec.dev/4.0.0/ext/delivery.md#report-liveness-from-every-recurring-job) | rule | any | operations | job | full | rule | guidance | Each recurring job reports liveness that pages a person on silence. |
| litespec/ext/delivery#review-schema-artifacts | [Review Schema Artifacts](https://litespec.dev/4.0.0/ext/delivery.md#review-schema-artifacts) | rule | any | operations | migration | full | rule | guidance | Each persistence change carries a schema artifact with every destructive operation and its reason. |
| litespec/ext/delivery#route-each-severity-to-a-declared-destination | [Route Each Severity to a Declared Destination](https://litespec.dev/4.0.0/ext/delivery.md#route-each-severity-to-a-declared-destination) | rule | any | operations | any | full | rule | guidance | Each severity states its destination and expected response time on the limits page. |
| litespec/ext/delivery#run-images-as-non-root | [Run Images as Non-Root](https://litespec.dev/4.0.0/ext/delivery.md#run-images-as-non-root) | rule | any | operations | any | full | rule | guidance | Which release images run their application as root? Look at the Dockerfiles and image configuration. |
| litespec/ext/delivery#run-the-application-as-pid-1 | [Run the Application as PID 1](https://litespec.dev/4.0.0/ext/delivery.md#run-the-application-as-pid-1) | rule | any | operations | any | full | rule | guidance | Which containers run something other than the application as their entry process? Look at the image entrypoints. |
| litespec/ext/delivery#separate-frontend-configuration-classes | [Separate Frontend Configuration Classes](https://litespec.dev/4.0.0/ext/delivery.md#separate-frontend-configuration-classes) | rule | any | operations | any | full | rule | guidance | Which frontend builds mix public configuration with server-only secrets? Look at the frontend image build. |
| litespec/ext/delivery#set-sufficient-shutdown-time | [Set Sufficient Shutdown Time](https://litespec.dev/4.0.0/ext/delivery.md#set-sufficient-shutdown-time) | rule | any | operations | any | full | rule | guidance | Which deployments set a shutdown grace period no longer than measured request or Worker stop time? Look at the deployment manifests beside the measured stop times. |
| litespec/ext/delivery#state-availability-objectives-as-openslo-files | [State Availability Objectives as OpenSLO Files](https://litespec.dev/4.0.0/ext/delivery.md#state-availability-objectives-as-openslo-files) | rule | any | operations | any | full | rule | guidance | The OpenSLO files pass Sloth validation with their generated alerts loaded. |
| litespec/ext/delivery#supply-runtime-configuration-externally | [Supply Runtime Configuration Externally](https://litespec.dev/4.0.0/ext/delivery.md#supply-runtime-configuration-externally) | rule | any | operations | any | full | rule | guidance | Which connection strings, OIDC settings, exporter endpoints, or secrets live inside the image? Look at the deployment manifests. |
| litespec/ext/delivery#test-released-traffic | [Test Released Traffic](https://litespec.dev/4.0.0/ext/delivery.md#test-released-traffic) | rule | any | operations | any | full | rule | guidance | Which releases skip the recorded end-to-end suite after traffic shifts? Look at the release evidence. |
| litespec/ext/delivery#treat-check-warnings-as-failures | [Treat Check Warnings as Failures](https://litespec.dev/4.0.0/ext/delivery.md#treat-check-warnings-as-failures) | convention | any | operations | any | full | default | guidance | Which builds pass with unreviewed warnings outside recorded suppressions? Look at the build logs beside the warnings convention. |
| litespec/ext/delivery#use-a-repeatable-deployment | [Use a Repeatable Deployment](https://litespec.dev/4.0.0/ext/delivery.md#use-a-repeatable-deployment) | rule | any | operations | any | full | rule | guidance | Each deployment names versioned artifacts, declared configuration, a schema step, readiness checks, and a passing release job. |
| litespec/ext/delivery#use-protected-frontend-secret-delivery | [Use Protected Frontend Secret Delivery](https://litespec.dev/4.0.0/ext/delivery.md#use-protected-frontend-secret-delivery) | rule | any | operations | any | full | rule | guidance | Which frontend secrets travel outside mounts or runtime injection? Look at the frontend image build. |
| litespec/ext/delivery#use-stable-service-names | [Use Stable Service Names](https://litespec.dev/4.0.0/ext/delivery.md#use-stable-service-names) | convention | any | operations | any | full | default | guidance | Service, resource, meter, and trace-source names match across environments, or the service-naming convention names another arrangement. |
| litespec/ext/delivery#wait-for-replica-readiness | [Wait for Replica Readiness](https://litespec.dev/4.0.0/ext/delivery.md#wait-for-replica-readiness) | rule | any | operations | any | full | rule | guidance | Which deployments shift traffic before new replicas reach readiness? Look at the deployment controller behavior. |
| litespec/ext/delivery#write-runtime-logs-to-streams | [Write Runtime Logs to Streams](https://litespec.dev/4.0.0/ext/delivery.md#write-runtime-logs-to-streams) | rule | any | operations | any | full | rule | guidance | Which containerized applications write logs somewhere other than standard output or standard error? Look at the application logging configuration. |
| litespec/ext/devices#apply-forced-uploads-over-newer-state | [Apply Forced Uploads over Newer State](https://litespec.dev/4.0.0/ext/devices.md#apply-forced-uploads-over-newer-state) | rule | any | frontend-ui | command-handler | full | rule | guidance | Forced uploads in the device tests overwrite newer server values and leave overwrite records. |
| litespec/ext/devices#describe-device-messages-as-a-channel-fragment | [Describe Device Messages as a Channel Fragment](https://litespec.dev/4.0.0/ext/devices.md#describe-device-messages-as-a-channel-fragment) | rule | any | frontend-ui | record:entry-point | records | rule | guidance | The protocol blocks on the device entry points list named operations with payloads in the channel shape. |
| litespec/ext/devices#identify-retries-with-a-nonce | [Identify Retries with a Nonce](https://litespec.dev/4.0.0/ext/devices.md#identify-retries-with-a-nonce) | rule | any | frontend-ui | record:entry-point | records | rule | guidance | The mutating messages in the protocol blocks carry a client-generated nonce scoped to the device. |
| litespec/ext/devices#replay-uploads-in-queue-order | [Replay Uploads in Queue Order](https://litespec.dev/4.0.0/ext/devices.md#replay-uploads-in-queue-order) | convention | any | frontend-ui | command-handler | full | default | guidance | The server applies offline queues in device order in the upload tests, or the project names another order. |
| litespec/ext/devices#simulate-offline-uploads-before-applying | [Simulate Offline Uploads Before Applying](https://litespec.dev/4.0.0/ext/devices.md#simulate-offline-uploads-before-applying) | rule | any | frontend-ui | command-handler | full | rule | guidance | Simulated uploads in the device tests return outcomes with no writes behind them. |
| litespec/ext/devices#state-client-rules-with-scenarios | [State Client Rules with Scenarios](https://litespec.dev/4.0.0/ext/devices.md#state-client-rules-with-scenarios) | rule | any | frontend-ui | record:entry-point | records | rule | guidance | Each client rule in the protocol blocks points at scenarios that prove it. |
| litespec/ext/devices#version-protocols-by-date | [Version Protocols by Date](https://litespec.dev/4.0.0/ext/devices.md#version-protocols-by-date) | convention | any | frontend-ui | record:entry-point | records | default | guidance | Protocol versions read as calendar numbers, or the device documentation names the numbering scheme. |
| litespec/ext/devices#version-the-device-protocol | [Version the Device Protocol](https://litespec.dev/4.0.0/ext/devices.md#version-the-device-protocol) | rule | any | frontend-ui | record:entry-point | records | rule | guidance | The protocol blocks state numbering, overlap, and the upgrade path devices follow. |
| litespec/ext/integrations#bind-client-configuration | [Bind Client Configuration](https://litespec.dev/4.0.0/ext/integrations.md#bind-client-configuration) | rule | any | infrastructure | any | full | rule | guidance | Which external clients miss bound base address, credentials, timeout, or policy through validated options? Look at the client registrations. |
| litespec/ext/integrations#bound-transient-retries | [Bound Transient Retries](https://litespec.dev/4.0.0/ext/integrations.md#bound-transient-retries) | rule | any | infrastructure | any | full | rule | guidance | Which external clients retry transient failures without bounded attempts and jitter? Look at the retry policies. |
| litespec/ext/integrations#call-only-declared-operations | [Call Only Declared Operations](https://litespec.dev/4.0.0/ext/integrations.md#call-only-declared-operations) | rule | any | infrastructure | record:use-case | full | rule | guidance | Each calls effect names an operation the cited external system declares. |
| litespec/ext/integrations#cover-provider-failure-modes | [Cover Provider Failure Modes](https://litespec.dev/4.0.0/ext/integrations.md#cover-provider-failure-modes) | rule | any | infrastructure | test | full | rule | guidance | Which declared failure modes lack a test: timeout, connection failure, transient response, permanent response, malformed payload, rate limit, duplicate delivery, or unexpected response shape? Look at the integration test suite. |
| litespec/ext/integrations#define-business-action-ports | [Define Business-Action Ports](https://litespec.dev/4.0.0/ext/integrations.md#define-business-action-ports) | rule | any | infrastructure | port | full | rule | guidance | Each Application port names a business action with no provider in its name or signature. |
| litespec/ext/integrations#exclude-provider-internals | [Exclude Provider Internals](https://litespec.dev/4.0.0/ext/integrations.md#exclude-provider-internals) | rule | any | infrastructure | endpoint | full | rule | guidance | Which API responses expose provider bodies, credentials, headers, exception types, or internal account identifiers? Look at the API responses. |
| litespec/ext/integrations#group-provider-code | [Group Provider Code](https://litespec.dev/4.0.0/ext/integrations.md#group-provider-code) | convention | any | infrastructure | any | full | default | guidance | Each provider's code sits under `Infrastructure/Integrations/{Provider}/`, or the project names another root in its documentation. |
| litespec/ext/integrations#isolate-provider-implementations | [Isolate Provider Implementations](https://litespec.dev/4.0.0/ext/integrations.md#isolate-provider-implementations) | rule | any | infrastructure | any | full | rule | guidance | Which Application layer code references a provider SDK or transport type? Look at the Application layer folders. |
| litespec/ext/integrations#keep-ports-near-use-cases | [Keep Ports Near Use Cases](https://litespec.dev/4.0.0/ext/integrations.md#keep-ports-near-use-cases) | convention | any | infrastructure | port | full | default | guidance | Each business-action port sits with its Application use cases, or the project keeps its ports in one shared folder. |
| litespec/ext/integrations#keep-provider-components-together | [Keep Provider Components Together](https://litespec.dev/4.0.0/ext/integrations.md#keep-provider-components-together) | convention | any | infrastructure | any | full | default | guidance | Each provider folder holds its options, client, models, mappings, and registration, or the project names another grouping in its documentation. |
| litespec/ext/integrations#process-duplicate-messages-safely | [Process Duplicate Messages Safely](https://litespec.dev/4.0.0/ext/integrations.md#process-duplicate-messages-safely) | rule | any | infrastructure | endpoint | full | rule | guidance | Which inbound provider handlers leave more than one accepted effect for a duplicate event? Look at the duplicate-delivery paths. |
| litespec/ext/integrations#protect-non-idempotent-calls | [Protect Non-Idempotent Calls](https://litespec.dev/4.0.0/ext/integrations.md#protect-non-idempotent-calls) | rule | any | infrastructure | any | full | rule | guidance | Which non-idempotent provider calls retry without provider idempotency and documented replay behavior? Look at the retry paths. |
| litespec/ext/integrations#record-each-provider-as-an-external-system | [Record Each Provider as an External System](https://litespec.dev/4.0.0/ext/integrations.md#record-each-provider-as-an-external-system) | rule | any | infrastructure | record:external-system | full | rule | guidance | Each provider has an external system page in the Behavior systems home naming operations and erasure. |
| litespec/ext/integrations#reject-formula-leading-import-values | [Reject Formula-Leading Import Values](https://litespec.dev/4.0.0/ext/integrations.md#reject-formula-leading-import-values) | rule | any | infrastructure | any | full | rule | guidance | Which CSV or spreadsheet imports keep a formula-leading value without rejection or neutralization? Look at the import boundaries. |
| litespec/ext/integrations#reject-per-request-http-clients | [Reject Per-Request HTTP Clients](https://litespec.dev/4.0.0/ext/integrations.md#reject-per-request-http-clients) | rule | any | infrastructure | any | full | rule | guidance | Which HTTP integrations construct a new HTTP client per request? Look at the HTTP call sites. |
| litespec/ext/integrations#run-provider-calls-from-event-handlers-or-jobs | [Run Provider Calls from Event Handlers or Jobs](https://litespec.dev/4.0.0/ext/integrations.md#run-provider-calls-from-event-handlers-or-jobs) | rule | any | infrastructure | reaction, job | full | advice | guidance | Each provider call runs from an event handler or a job, and each inline call carries an exception naming its compensation. |
| litespec/ext/integrations#simulate-integration-boundaries | [Simulate Integration Boundaries](https://litespec.dev/4.0.0/ext/integrations.md#simulate-integration-boundaries) | rule | any | infrastructure | test | full | rule | guidance | Which integration tests call a live provider instead of WireMock.Net or a protocol-specific local endpoint? Look at the integration test suite. |
| litespec/ext/integrations#translate-provider-failure-outcomes | [Translate Provider Failure Outcomes](https://litespec.dev/4.0.0/ext/integrations.md#translate-provider-failure-outcomes) | rule | any | infrastructure | any | full | rule | guidance | Which provider errors miss their mapping to project-owned results and stable diagnostics? Look at the integration failure mappings. |
| litespec/ext/integrations#trust-inbound-integration-events-by-declared-trust | [Trust Inbound Integration Events by Declared Trust](https://litespec.dev/4.0.0/ext/integrations.md#trust-inbound-integration-events-by-declared-trust) | rule | any | infrastructure | record:integration-event | full | rule | guidance | Each inbound integration event declares trigger-only or payload trust with its correlation. |
| litespec/ext/integrations#use-managed-http-clients | [Use Managed HTTP Clients](https://litespec.dev/4.0.0/ext/integrations.md#use-managed-http-clients) | rule | any | infrastructure | any | full | rule | guidance | Which HTTP integrations skip `HttpClientFactory` or applicable service discovery? Look at the HTTP registrations. |
| litespec/ext/integrations#verify-inbound-provider-messages | [Verify Inbound Provider Messages](https://litespec.dev/4.0.0/ext/integrations.md#verify-inbound-provider-messages) | rule | any | infrastructure | endpoint | full | rule | guidance | Which inbound provider handlers skip signature, timestamp tolerance, replay protection, content type, size, schema, or event identity checks? Look at the inbound handlers. |
| litespec/ext/jobs#apply-item-read-authorization | [Apply Item-Read Authorization](https://litespec.dev/4.0.0/ext/jobs.md#apply-item-read-authorization) | rule | any | application | record:use-case | full | rule | guidance | Each report and export enforces the item-read rules in the authorization tests. |
| litespec/ext/jobs#audit-export-reads | [Audit Export Reads](https://litespec.dev/4.0.0/ext/jobs.md#audit-export-reads) | rule | any | application | record:use-case | full | rule | guidance | Which export queries lack a stated `audit` reason and target? Look at the export query beside the report. |
| litespec/ext/jobs#audit-manual-replay | [Audit Manual Replay](https://litespec.dev/4.0.0/ext/jobs.md#audit-manual-replay) | rule | any | application | job | full | rule | guidance | Each manual replay adds an audited attempt under its original occurrence identity. |
| litespec/ext/jobs#avoid-speculative-reporting-systems | [Avoid Speculative Reporting Systems](https://litespec.dev/4.0.0/ext/jobs.md#avoid-speculative-reporting-systems) | rule | any | application | record:use-case | full | rule | guidance | Each reporting system traces to an accepted current query or export. |
| litespec/ext/jobs#bound-job-duration | [Bound Job Duration](https://litespec.dev/4.0.0/ext/jobs.md#bound-job-duration) | rule | any | application | job | full | rule | guidance | Each job handler carries a duration bound, and the occurrence store shows completions inside it. |
| litespec/ext/jobs#bound-job-retries | [Bound Job Retries](https://litespec.dev/4.0.0/ext/jobs.md#bound-job-retries) | rule | any | application | job | full | rule | guidance | Each schedule declares bounded attempts with cancellation-aware backoff and a poison state. |
| litespec/ext/jobs#bound-the-ingest-buffer | [Bound the Ingest Buffer](https://litespec.dev/4.0.0/ext/jobs.md#bound-the-ingest-buffer) | rule | any | application | job | full | rule | guidance | The ingest job records state buffer capacity with the overflow behavior past it. |
| litespec/ext/jobs#carry-the-schedule-on-the-job-record | [Carry the Schedule on the Job Record](https://litespec.dev/4.0.0/ext/jobs.md#carry-the-schedule-on-the-job-record) | rule | any | application | job | full | rule | checkable | `litespec model check` reports `schedule-invalid` (level G) for a job schedule that is neither an `every` duration nor a `cron` expression; each scheduled job record states its timezone. |
| litespec/ext/jobs#confirm-bulk-money-actions-out-of-band | [Confirm Bulk Money Actions Out of Band](https://litespec.dev/4.0.0/ext/jobs.md#confirm-bulk-money-actions-out-of-band) | rule | any | application | record:use-case | full | rule | guidance | The bulk money commands ask for the out-of-band code before moving money. |
| litespec/ext/jobs#declare-export-paging | [Declare Export Paging](https://litespec.dev/4.0.0/ext/jobs.md#declare-export-paging) | rule | any | application | record:use-case | full | rule | guidance | Which export queries lack paging with mode pages or mode none with its reason? Look at the export query beside the report. |
| litespec/ext/jobs#declare-ingest-steps-in-order | [Declare Ingest Steps in Order](https://litespec.dev/4.0.0/ext/jobs.md#declare-ingest-steps-in-order) | rule | any | application | job | full | rule | guidance | The ingest job records list steps in run order with each marked drop or enrich. |
| litespec/ext/jobs#declare-the-engine-carrier | [Declare the Engine Carrier](https://litespec.dev/4.0.0/ext/jobs.md#declare-the-engine-carrier) | rule | any | application | aggregate | full | rule | guidance | The engine-carried aggregates set carriedBy workflow on their aggregate records. |
| litespec/ext/jobs#define-business-local-clock-behavior | [Define Business-Local Clock Behavior](https://litespec.dev/4.0.0/ext/jobs.md#define-business-local-clock-behavior) | rule | any | application | job | full | rule | guidance | Each business-local schedule records its IANA zone with skipped and repeated local-time behavior. |
| litespec/ext/jobs#define-export-encoding-and-columns | [Define Export Encoding and Columns](https://litespec.dev/4.0.0/ext/jobs.md#define-export-encoding-and-columns) | rule | any | application | record:use-case | full | rule | guidance | Each export states its character encoding and stable columns in its format record. |
| litespec/ext/jobs#define-misfire-recovery | [Define Misfire Recovery](https://litespec.dev/4.0.0/ext/jobs.md#define-misfire-recovery) | rule | any | application | job | full | rule | guidance | Each schedule states skipped, once-replayed, or interval-replayed behavior for missed occurrences. |
| litespec/ext/jobs#define-report-limits | [Define Report Limits](https://litespec.dev/4.0.0/ext/jobs.md#define-report-limits) | rule | any | application | record:use-case | full | rule | guidance | Each report bound lives as a setting record beside the report. |
| litespec/ext/jobs#define-the-closed-drop-reason-set | [Define the Closed Drop Reason Set](https://litespec.dev/4.0.0/ext/jobs.md#define-the-closed-drop-reason-set) | rule | any | application | job | full | rule | guidance | The ingest job records name the closed drop reasons with no drop outside them. |
| litespec/ext/jobs#derive-stable-occurrence-identity | [Derive Stable Occurrence Identity](https://litespec.dev/4.0.0/ext/jobs.md#derive-stable-occurrence-identity) | rule | any | application | job | full | rule | guidance | Occurrence identities in the store combine schedule ID with scheduled instant. |
| litespec/ext/jobs#discard-poison-records-after-three-attempts | [Discard Poison Records After Three Attempts](https://litespec.dev/4.0.0/ext/jobs.md#discard-poison-records-after-three-attempts) | convention | any | application | job | full | default | guidance | Unparsable rows drop as poison after three attempts, or the pipeline documentation names another threshold. |
| litespec/ext/jobs#dispatch-application-behavior | [Dispatch Application Behavior](https://litespec.dev/4.0.0/ext/jobs.md#dispatch-application-behavior) | rule | any | application | job | full | rule | guidance | Each job handler calls an Application Command or a declared Application port. |
| litespec/ext/jobs#escape-formula-leading-export-values | [Escape Formula-Leading Export Values](https://litespec.dev/4.0.0/ext/jobs.md#escape-formula-leading-export-values) | rule | any | application | record:use-case | full | rule | guidance | Exported values starting a formula are escaped, except in formula fields the team fills intentionally. |
| litespec/ext/jobs#exclude-direct-storage-and-http-execution | [Exclude Direct Storage and HTTP Execution](https://litespec.dev/4.0.0/ext/jobs.md#exclude-direct-storage-and-http-execution) | rule | any | application | job | full | rule | guidance | Job sources mutate no Marten session or DbContext and call no WebApi endpoint. |
| litespec/ext/jobs#exclude-machine-local-time | [Exclude Machine-Local Time](https://litespec.dev/4.0.0/ext/jobs.md#exclude-machine-local-time) | rule | any | application | job | full | rule | guidance | Production job sources read no machine-local clock. |
| litespec/ext/jobs#expose-drop-counts-per-reason | [Expose Drop Counts per Reason](https://litespec.dev/4.0.0/ext/jobs.md#expose-drop-counts-per-reason) | rule | any | application | job | full | rule | guidance | The pipeline dashboards show dropped-record counts split by reason. |
| litespec/ext/jobs#generate-monotonic-fencing-values | [Generate Monotonic Fencing Values](https://litespec.dev/4.0.0/ext/jobs.md#generate-monotonic-fencing-values) | rule | any | application | job | full | rule | guidance | Fencing values in the store rise per occurrence, and a stale value refuses completion. |
| litespec/ext/jobs#keep-engine-retry-configuration-in-implementation | [Keep Engine Retry Configuration in Implementation](https://litespec.dev/4.0.0/ext/jobs.md#keep-engine-retry-configuration-in-implementation) | rule | any | application | aggregate | full | rule | guidance | Retry counts, backoff curves, and step timeouts live in worker code with none in the records. |
| litespec/ext/jobs#keep-raw-sql-in-infrastructure | [Keep Raw SQL in Infrastructure](https://litespec.dev/4.0.0/ext/jobs.md#keep-raw-sql-in-infrastructure) | rule | any | application | record:use-case | full | rule | guidance | Raw report SQL and connection handling sit in Infrastructure code. |
| litespec/ext/jobs#keep-report-definitions-in-application | [Keep Report Definitions in Application](https://litespec.dev/4.0.0/ext/jobs.md#keep-report-definitions-in-application) | convention | any | application | record:use-case | full | default | guidance | Report definitions sit in their module, or the report-definition convention names where they live. |
| litespec/ext/jobs#keep-report-providers-in-infrastructure | [Keep Report Providers in Infrastructure](https://litespec.dev/4.0.0/ext/jobs.md#keep-report-providers-in-infrastructure) | convention | any | application | record:use-case | full | default | guidance | SQL and storage code sit in Infrastructure, or the report-provider convention names where they live. |
| litespec/ext/jobs#map-each-engine-step-to-one-use-case | [Map Each Engine Step to One Use Case](https://litespec.dev/4.0.0/ext/jobs.md#map-each-engine-step-to-one-use-case) | rule | any | application | aggregate | full | rule | guidance | The engine definition lists one use case beside each step with no step sharing or missing. |
| litespec/ext/jobs#name-engine-steps-after-use-cases | [Name Engine Steps After Use Cases](https://litespec.dev/4.0.0/ext/jobs.md#name-engine-steps-after-use-cases) | convention | any | application | aggregate | full | default | guidance | Engine steps carry their use-case ids, or the workflow documentation records the naming convention. |
| litespec/ext/jobs#observe-job-cancellation | [Observe Job Cancellation](https://litespec.dev/4.0.0/ext/jobs.md#observe-job-cancellation) | rule | any | application | job | full | rule | guidance | Each job handler threads cancellation into its waits and stops its current step when cancellation fires. |
| litespec/ext/jobs#order-queue-items-by-score | [Order Queue Items by Score](https://litespec.dev/4.0.0/ext/jobs.md#order-queue-items-by-score) | rule | any | application | record:use-case | full | rule | guidance | The queue listings sort by a score citing the calculation rule behind it. |
| litespec/ext/jobs#order-unscored-queues-by-age | [Order Unscored Queues by Age](https://litespec.dev/4.0.0/ext/jobs.md#order-unscored-queues-by-age) | convention | any | application | record:use-case | full | default | guidance | Queues without a score list oldest first, or the queue documentation names another fallback order. |
| litespec/ext/jobs#parameterize-report-sql | [Parameterize Report SQL](https://litespec.dev/4.0.0/ext/jobs.md#parameterize-report-sql) | rule | any | application | record:use-case | full | rule | guidance | Each report query binds actor, tenant, filter, range, sort, and pagination values as parameters in code. |
| litespec/ext/jobs#persist-occurrence-recovery-points | [Persist Occurrence Recovery Points](https://litespec.dev/4.0.0/ext/jobs.md#persist-occurrence-recovery-points) | rule | any | application | job | full | rule | guidance | Each occurrence row carries last scheduled, started, and completed times. |
| litespec/ext/jobs#persist-occurrence-state | [Persist Occurrence State](https://litespec.dev/4.0.0/ext/jobs.md#persist-occurrence-state) | rule | any | application | job | full | rule | guidance | Each occurrence row carries scheduled, processing, completed, or dead-letter state with safe execution details. |
| litespec/ext/jobs#place-handlers-with-owned-behavior | [Place Handlers with Owned Behavior](https://litespec.dev/4.0.0/ext/jobs.md#place-handlers-with-owned-behavior) | convention | any | application | job | full | default | guidance | Each job handler sits under the module that owns its behavior, or the project keeps its handlers in one shared jobs folder. |
| litespec/ext/jobs#prefer-utc-schedules | [Prefer UTC Schedules](https://litespec.dev/4.0.0/ext/jobs.md#prefer-utc-schedules) | rule | any | application | job | full | rule | guidance | Each schedule states UTC or names a business-local time requirement with its IANA time zone. |
| litespec/ext/jobs#prevent-duplicate-completion | [Prevent Duplicate Completion](https://litespec.dev/4.0.0/ext/jobs.md#prevent-duplicate-completion) | rule | any | application | job | full | rule | guidance | The lease admits one completion per occurrence across overlapping replicas. |
| litespec/ext/jobs#protect-export-output | [Protect Export Output](https://litespec.dev/4.0.0/ext/jobs.md#protect-export-output) | rule | any | application | record:use-case | full | rule | guidance | Export output sits in approved object storage with a named contact, an expiry, and a short-lived authorized download. |
| litespec/ext/jobs#provide-operational-recovery-procedures | [Provide Operational Recovery Procedures](https://litespec.dev/4.0.0/ext/jobs.md#provide-operational-recovery-procedures) | rule | any | application | job | full | rule | guidance | Runbook records cover inspection, manual replay, and disable for each schedule. |
| litespec/ext/jobs#read-enrichment-data-from-declared-sources | [Read Enrichment Data from Declared Sources](https://litespec.dev/4.0.0/ext/jobs.md#read-enrichment-data-from-declared-sources) | rule | any | application | job | full | rule | guidance | The enrich steps read only the sources named on their job records. |
| litespec/ext/jobs#record-one-drop-reason-per-dropped-record | [Record One Drop Reason per Dropped Record](https://litespec.dev/4.0.0/ext/jobs.md#record-one-drop-reason-per-dropped-record) | rule | any | application | job | full | rule | guidance | The dropped records each carry one reason from the job's closed set. |
| litespec/ext/jobs#record-reporting-need | [Record Reporting Need](https://litespec.dev/4.0.0/ext/jobs.md#record-reporting-need) | rule | any | application | record:use-case | full | rule | guidance | The use case page holds the report, volume, plan, target, maximum, and operator. |
| litespec/ext/jobs#reject-unmapped-engine-steps | [Reject Unmapped Engine Steps](https://litespec.dev/4.0.0/ext/jobs.md#reject-unmapped-engine-steps) | rule | any | application | aggregate | full | rule | checkable | `litespec model check` reports `behavior-unrecorded` for an engine step that maps to no use case. |
| litespec/ext/jobs#release-claims-past-their-lease | [Release Claims Past Their Lease](https://litespec.dev/4.0.0/ext/jobs.md#release-claims-past-their-lease) | rule | any | application | record:use-case | full | rule | guidance | The claim tests show untouched items returning after their lease expires. |
| litespec/ext/jobs#remove-occurrences-past-retention | [Remove Occurrences Past Retention](https://litespec.dev/4.0.0/ext/jobs.md#remove-occurrences-past-retention) | rule | any | application | job | full | rule | guidance | The store holds no occurrence older than its schedule's retention setting record. |
| litespec/ext/jobs#renew-only-owned-leases | [Renew Only Owned Leases](https://litespec.dev/4.0.0/ext/jobs.md#renew-only-owned-leases) | rule | any | application | job | full | rule | guidance | Replica logs show no renewal after a failed renewal, and the loser stops its occurrence. |
| litespec/ext/jobs#restrict-completion-by-fencing-value | [Restrict Completion by Fencing Value](https://litespec.dev/4.0.0/ext/jobs.md#restrict-completion-by-fencing-value) | rule | any | application | job | full | rule | guidance | Completion writes fail on a stale fencing value in the store. |
| litespec/ext/jobs#resume-driven-work-through-the-cursor | [Resume Driven Work Through the Cursor](https://litespec.dev/4.0.0/ext/jobs.md#resume-driven-work-through-the-cursor) | rule | any | application | job | full | rule | guidance | Each job driving a saga names its resume position in its cursor, with a scenario covering the remainder after a halfway failure. |
| litespec/ext/jobs#review-report-plans | [Review Report Plans](https://litespec.dev/4.0.0/ext/jobs.md#review-report-plans) | rule | any | application | record:use-case | full | advice | guidance | The review record shows query plans and indexes checked against representative data. |
| litespec/ext/jobs#run-budget-exceeding-exports-in-worker | [Run Budget-Exceeding Exports in Worker](https://litespec.dev/4.0.0/ext/jobs.md#run-budget-exceeding-exports-in-worker) | rule | any | application | record:use-case | full | rule | guidance | Each export past its request budget runs through a Worker, with the budget in its setting record. |
| litespec/ext/jobs#run-manual-jobs-under-their-guard | [Run Manual Jobs Under Their Guard](https://litespec.dev/4.0.0/ext/jobs.md#run-manual-jobs-under-their-guard) | rule | any | application | job | full | rule | checkable | `litespec model check` reports `job-guard-missing` (level G) for a manual job with no `guard`; each manual run stays inside its `runsWhere`. |
| litespec/ext/jobs#run-one-command-per-item-in-selection | [Run One Command per Item in Selection](https://litespec.dev/4.0.0/ext/jobs.md#run-one-command-per-item-in-selection) | rule | any | application | job | full | rule | guidance | Each job run runs one command per item in its selection within its batch size, each in its own unit of work. |
| litespec/ext/jobs#run-scheduled-jobs-in-worker | [Run Scheduled Jobs in Worker](https://litespec.dev/4.0.0/ext/jobs.md#run-scheduled-jobs-in-worker) | rule | any | application | job | full | rule | guidance | Worker sources hold every scheduled job, and WebApi request handling holds none. |
| litespec/ext/jobs#scope-command-idempotency-by-occurrence | [Scope Command Idempotency by Occurrence](https://litespec.dev/4.0.0/ext/jobs.md#scope-command-idempotency-by-occurrence) | rule | any | application | job | full | rule | guidance | Retries of one occurrence share the idempotency scope of its occurrence identity. |
| litespec/ext/jobs#scope-export-output-to-the-tenant | [Scope Export Output to the Tenant](https://litespec.dev/4.0.0/ext/jobs.md#scope-export-output-to-the-tenant) | rule | any | application | record:use-case | full | rule | guidance | Each export stores its output under a tenant-scoped path in object storage. |
| litespec/ext/jobs#scope-occurrences-and-leases-by-tenant | [Scope Occurrences and Leases by Tenant](https://litespec.dev/4.0.0/ext/jobs.md#scope-occurrences-and-leases-by-tenant) | rule | any | application | job | full | rule | guidance | Occurrence and lease rows carry tenant scope in products that isolate tenants. |
| litespec/ext/jobs#separate-schedule-definitions | [Separate Schedule Definitions](https://litespec.dev/4.0.0/ext/jobs.md#separate-schedule-definitions) | convention | any | application | job | full | default | guidance | Schedule definitions sit apart from Command behavior, or the project keeps them beside it. |
| litespec/ext/jobs#separate-worker-orchestration | [Separate Worker Orchestration](https://litespec.dev/4.0.0/ext/jobs.md#separate-worker-orchestration) | convention | any | application | record:use-case | full | default | guidance | Worker orchestration sits apart from report rules, or the report-orchestration convention names where it lives. |
| litespec/ext/jobs#show-a-preview-before-bulk-money-actions | [Show a Preview Before Bulk Money Actions](https://litespec.dev/4.0.0/ext/jobs.md#show-a-preview-before-bulk-money-actions) | rule | any | application | record:use-case | full | rule | guidance | The bulk money commands render every affected item with its amount before acting. |
| litespec/ext/jobs#show-the-score-beside-each-item | [Show the Score Beside Each Item](https://litespec.dev/4.0.0/ext/jobs.md#show-the-score-beside-each-item) | rule | any | application | record:use-case | full | rule | guidance | The queue rows display each score with the inputs that set it. |
| litespec/ext/jobs#state-each-step-compensation | [State Each Step Compensation](https://litespec.dev/4.0.0/ext/jobs.md#state-each-step-compensation) | rule | any | application | aggregate | full | rule | guidance | Which mapped steps lack a compensation object naming its use case or its reason? Look at the map beside the process. |
| litespec/ext/jobs#state-the-claim-mode | [State the Claim Mode](https://litespec.dev/4.0.0/ext/jobs.md#state-the-claim-mode) | rule | any | application | record:use-case | full | rule | guidance | The queue use cases state disabled, optional, or required on their claim field. |
| litespec/ext/jobs#state-the-freshness-consequence | [State the Freshness Consequence](https://litespec.dev/4.0.0/ext/jobs.md#state-the-freshness-consequence) | rule | any | application | job | full | rule | guidance | The queries over ingested data state the freshness their readers observe. |
| litespec/ext/jobs#stop-jobs-during-graceful-shutdown | [Stop Jobs During Graceful Shutdown](https://litespec.dev/4.0.0/ext/jobs.md#stop-jobs-during-graceful-shutdown) | rule | any | application | job | full | rule | guidance | The Worker shutdown path stops schedule polling before it drains running occurrences. |
| litespec/ext/jobs#store-execution-leases | [Store Execution Leases](https://litespec.dev/4.0.0/ext/jobs.md#store-execution-leases) | rule | any | application | job | full | rule | guidance | The lease rows in PostgreSQL carry owner, expiry, and fencing value for each occurrence. |
| litespec/ext/jobs#support-report-cancellation | [Support Report Cancellation](https://litespec.dev/4.0.0/ext/jobs.md#support-report-cancellation) | rule | any | application | record:use-case | full | rule | guidance | Report work cancels on request and expired output clears in the cancellation tests. |
| litespec/ext/jobs#test-time-transitions | [Test Time Transitions](https://litespec.dev/4.0.0/ext/jobs.md#test-time-transitions) | rule | any | application | job | full | rule | guidance | Job tests inject the clock and cover representative time-zone transitions. |
| litespec/ext/jobs#tolerate-duplicate-execution | [Tolerate Duplicate Execution](https://litespec.dev/4.0.0/ext/jobs.md#tolerate-duplicate-execution) | rule | any | application | job | full | rule | guidance | Job Commands and side effects show one accepted effect after a replayed occurrence. |
| litespec/ext/jobs#treat-unavailable-schedule-stores-as-outages | [Treat Unavailable Schedule Stores as Outages](https://litespec.dev/4.0.0/ext/jobs.md#treat-unavailable-schedule-stores-as-outages) | rule | any | application | job | full | rule | guidance | Worker logs during a store outage show backed-off, rate-limited entries and no poisoned occurrences. |
| litespec/ext/jobs#use-execution-scopes | [Use Execution Scopes](https://litespec.dev/4.0.0/ext/jobs.md#use-execution-scopes) | convention | any | application | job | full | default | guidance | Each occurrence resolves scoped dependencies in one disposed execution scope, or the project names another scope boundary in its documentation. |
| litespec/ext/lifecycle#align-backup-deletion-behavior | [Align Backup Deletion Behavior](https://litespec.dev/4.0.0/ext/lifecycle.md#align-backup-deletion-behavior) | rule | any | application | any | full | rule | guidance | Backup and replica operations follow the documented deletion guarantee. |
| litespec/ext/lifecycle#audit-lifecycle-changes | [Audit Lifecycle Changes](https://litespec.dev/4.0.0/ext/lifecycle.md#audit-lifecycle-changes) | rule | any | application | command-handler, job | full | rule | guidance | Each lifecycle operation writes an audit record, or a standalone record where audit is not selected. |
| litespec/ext/lifecycle#authorize-lifecycle-access-paths | [Authorize Lifecycle Access Paths](https://litespec.dev/4.0.0/ext/lifecycle.md#authorize-lifecycle-access-paths) | rule | any | application | query-handler | full | rule | guidance | Administrative and restore queries run through named paths with explicit authorization. |
| litespec/ext/lifecycle#authorize-lifecycle-changes | [Authorize Lifecycle Changes](https://litespec.dev/4.0.0/ext/lifecycle.md#authorize-lifecycle-changes) | rule | any | application | command-handler, job | full | rule | guidance | Each lifecycle operation checks its documented authorization before changing the record. |
| litespec/ext/lifecycle#bound-purge-and-archive-work | [Bound Purge and Archive Work](https://litespec.dev/4.0.0/ext/lifecycle.md#bound-purge-and-archive-work) | rule | any | application | job | full | rule | guidance | Purge and archive work resumes after interruption within declared bounds, with visible progress. |
| litespec/ext/lifecycle#default-to-hard-delete | [Default to Hard Delete](https://litespec.dev/4.0.0/ext/lifecycle.md#default-to-hard-delete) | rule | any | application | any | full | rule | guidance | Deletions with no retention or restore requirement remove the row in the delete transaction. |
| litespec/ext/lifecycle#define-post-deletion-references | [Define Post-Deletion References](https://litespec.dev/4.0.0/ext/lifecycle.md#define-post-deletion-references) | rule | any | application | record:rule | full | rule | guidance | The specification states post-deletion behavior for references, exports, and unique constraints. |
| litespec/ext/lifecycle#define-relational-lifecycle-behavior | [Define Relational Lifecycle Behavior](https://litespec.dev/4.0.0/ext/lifecycle.md#define-relational-lifecycle-behavior) | rule | any | application | migration, repository | full | rule | guidance | The relational implementation states columns, query filters, partial indexes, migrations, and named filter behavior. |
| litespec/ext/lifecycle#define-storage-lifecycle-behavior | [Define Storage Lifecycle Behavior](https://litespec.dev/4.0.0/ext/lifecycle.md#define-storage-lifecycle-behavior) | rule | any | application | repository | full | rule | guidance | The document implementation states document state, filtered queries, indexes, purge transformations, and contract evolution. |
| litespec/ext/lifecycle#exclude-inactive-records-from-normal-reads | [Exclude Inactive Records from Normal Reads](https://litespec.dev/4.0.0/ext/lifecycle.md#exclude-inactive-records-from-normal-reads) | rule | any | application | query-handler | full | rule | guidance | Normal queries read only the active state, with deleted and archived records absent. |
| litespec/ext/lifecycle#exclude-persistence-only-lifecycle-behavior | [Exclude Persistence-Only Lifecycle Behavior](https://litespec.dev/4.0.0/ext/lifecycle.md#exclude-persistence-only-lifecycle-behavior) | rule | any | application | any | full | rule | guidance | No lifecycle transition runs through persistence filters or property setters alone. |
| litespec/ext/lifecycle#keep-archive-records-module-owned | [Keep Archive Records Module-Owned](https://litespec.dev/4.0.0/ext/lifecycle.md#keep-archive-records-module-owned) | convention | any | application | any | full | default | guidance | Archive records sit under their owning module, or the project keeps them in one shared archive area. |
| litespec/ext/lifecycle#model-lifecycle-operations-in-domain | [Model Lifecycle Operations in Domain](https://litespec.dev/4.0.0/ext/lifecycle.md#model-lifecycle-operations-in-domain) | rule | any | application | aggregate | full | rule | guidance | Each aggregate exposes delete, archive, and restore methods where those operations apply. |
| litespec/ext/lifecycle#model-retained-lifecycle-states | [Model Retained Lifecycle States](https://litespec.dev/4.0.0/ext/lifecycle.md#model-retained-lifecycle-states) | rule | any | application | state-record | full | rule | guidance | Each retained record carries a business reason with a named state transition. |
| litespec/ext/lifecycle#name-soft-delete-timestamps | [Name Soft-Delete Timestamps](https://litespec.dev/4.0.0/ext/lifecycle.md#name-soft-delete-timestamps) | convention | any | application | any | full | default | guidance | Soft-delete timestamps use `deleted_at_utc`, or the project names another column in its documentation. |
| litespec/ext/lifecycle#preserve-legal-hold-data | [Preserve Legal-Hold Data](https://litespec.dev/4.0.0/ext/lifecycle.md#preserve-legal-hold-data) | rule | any | application | job | full | rule | guidance | Retention runs leave held data in place past its retention date. |
| litespec/ext/lifecycle#record-lifecycle-scope | [Record Lifecycle Scope](https://litespec.dev/4.0.0/ext/lifecycle.md#record-lifecycle-scope) | rule | any | application | record:rule | full | rule | guidance | Each lifecycle record names classification, retention, deletion trigger, hold, export, restore, and backup. |
| litespec/ext/lifecycle#record-retention-progress | [Record Retention Progress](https://litespec.dev/4.0.0/ext/lifecycle.md#record-retention-progress) | rule | any | application | job | full | rule | guidance | Retention runs persist progress that the next run resumes from. |
| litespec/ext/lifecycle#record-the-release-of-a-legal-hold | [Record the Release of a Legal Hold](https://litespec.dev/4.0.0/ext/lifecycle.md#record-the-release-of-a-legal-hold) | rule | any | application | command-handler | full | rule | guidance | Each legal-hold release records actor, data covered, reason, and resumed retention. |
| litespec/ext/lifecycle#reject-hidden-lifecycle-flags | [Reject Hidden Lifecycle Flags](https://litespec.dev/4.0.0/ext/lifecycle.md#reject-hidden-lifecycle-flags) | rule | any | application | any | full | rule | guidance | Each lifecycle transition runs through explicit behavior rather than a storage-only flag. |
| litespec/ext/lifecycle#separate-query-shaped-history | [Separate Query-Shaped History](https://litespec.dev/4.0.0/ext/lifecycle.md#separate-query-shaped-history) | convention | any | application | any | full | default | guidance | Query-shaped history lives in a read model, or the project keeps it on the aggregate. |
| litespec/ext/lifecycle#test-provider-lifecycle-paths | [Test Provider Lifecycle Paths](https://litespec.dev/4.0.0/ext/lifecycle.md#test-provider-lifecycle-paths) | rule | any | application | test | full | rule | guidance | Tests read through normal and lifecycle query paths on the selected provider. |
| litespec/ext/locale#avoid-catalog-only-locale-claims | [Avoid Catalog-Only Locale Claims](https://litespec.dev/4.0.0/ext/locale.md#avoid-catalog-only-locale-claims) | rule | any | frontend-ui | any | full | rule | guidance | Shipped locales come from the locale decision, with catalog files as translations only. |
| litespec/ext/locale#avoid-duplicate-localized-urls | [Avoid Duplicate Localized URLs](https://litespec.dev/4.0.0/ext/locale.md#avoid-duplicate-localized-urls) | rule | any | frontend-ui | route | full | rule | guidance | Each localized content item serves from one indexable URL. |
| litespec/ext/locale#complete-or-fall-back-catalog-values | [Complete or Fall Back Catalog Values](https://litespec.dev/4.0.0/ext/locale.md#complete-or-fall-back-catalog-values) | rule | any | frontend-ui | any | full | rule | guidance | Each locale holds its required keys or resolves them through its declared fallback. |
| litespec/ext/locale#define-one-locale-route-shape | [Define One Locale Route Shape](https://litespec.dev/4.0.0/ext/locale.md#define-one-locale-route-shape) | rule | any | frontend-ui | route | full | rule | guidance | The application routes every locale through one documented route shape. |
| litespec/ext/locale#follow-the-validation-message-grammar | [Follow the Validation Message Grammar](https://litespec.dev/4.0.0/ext/locale.md#follow-the-validation-message-grammar) | rule | any | frontend-ui | any | full | rule | guidance | Each validation message states field label, fault, and accepted input without technical wording. |
| litespec/ext/locale#format-values-with-active-locale | [Format Values with Active Locale](https://litespec.dev/4.0.0/ext/locale.md#format-values-with-active-locale) | rule | any | frontend-ui | component, route | full | rule | guidance | Dates, numbers, currency, plurals, lists, and relative time render through active-locale formatters. |
| litespec/ext/locale#handle-unavailable-locale-segments | [Handle Unavailable Locale Segments](https://litespec.dev/4.0.0/ext/locale.md#handle-unavailable-locale-segments) | rule | any | frontend-ui | route | full | rule | guidance | Unsupported or missing locale segments redirect under the documented product policy. |
| litespec/ext/locale#keep-locale-selection-explicit | [Keep Locale Selection Explicit](https://litespec.dev/4.0.0/ext/locale.md#keep-locale-selection-explicit) | convention | any | frontend-ui | route | full | default | guidance | The URL or a documented session preference carries the locale, or the project keeps it in ambient request state. |
| litespec/ext/locale#keep-stable-error-codes-locale-neutral | [Keep Stable Error Codes Locale-Neutral](https://litespec.dev/4.0.0/ext/locale.md#keep-stable-error-codes-locale-neutral) | rule | any | frontend-ui | use-case, endpoint | full | rule | guidance | Each stable API error code stays identical across locales. |
| litespec/ext/locale#localize-public-presentation-content | [Localize Public Presentation Content](https://litespec.dev/4.0.0/ext/locale.md#localize-public-presentation-content) | rule | any | frontend-ui | component, route, form | full | rule | guidance | Public metadata, form labels, validation messages, and user-safe errors render in the active locale. |
| litespec/ext/locale#name-messages-by-meaning | [Name Messages by Meaning](https://litespec.dev/4.0.0/ext/locale.md#name-messages-by-meaning) | rule | any | frontend-ui | any | full | rule | guidance | Catalog keys use semantic names citing glossary terms, with no source-language sentences as keys. |
| litespec/ext/locale#preserve-locale-neutral-business-data | [Preserve Locale-Neutral Business Data](https://litespec.dev/4.0.0/ext/locale.md#preserve-locale-neutral-business-data) | rule | any | frontend-ui | value-object, endpoint | full | rule | guidance | Domain values and API contracts stay locale-neutral outside explicitly localized exchanges. |
| litespec/ext/locale#record-supported-locale-behavior | [Record Supported Locale Behavior](https://litespec.dev/4.0.0/ext/locale.md#record-supported-locale-behavior) | rule | any | frontend-ui | record:decision | full | rule | guidance | The locale decision lists supported locales, default locale, fallback chain, user selection, and browser detection. |
| litespec/ext/locale#resolve-every-shown-identifier | [Resolve Every Shown Identifier](https://litespec.dev/4.0.0/ext/locale.md#resolve-every-shown-identifier) | rule | any | frontend-ui | record:screen | full | rule | guidance | Shown codes render glossary labels, with raw codes absent except user-facing reference numbers. |
| litespec/ext/locale#split-catalogs-by-module-when-needed | [Split Catalogs by Module When Needed](https://litespec.dev/4.0.0/ext/locale.md#split-catalogs-by-module-when-needed) | convention | any | frontend-ui | any | full | default | guidance | Catalogs stay whole per locale until measured size moves them to module splits, or the project splits by feature from the start. |
| litespec/ext/locale#store-user-facing-copy-in-catalogs | [Store User-Facing Copy in Catalogs](https://litespec.dev/4.0.0/ext/locale.md#store-user-facing-copy-in-catalogs) | rule | any | frontend-ui | component, route | full | rule | guidance | User-facing copy sits in the locale catalogs rather than in source code. |
| litespec/ext/locale#use-bcp-47-identifiers | [Use BCP 47 Identifiers](https://litespec.dev/4.0.0/ext/locale.md#use-bcp-47-identifiers) | convention | any | frontend-ui | any | full | default | guidance | Locale identifiers follow BCP 47, or the project names another identifier form in its documentation. |
| litespec/ext/locale#use-one-catalog-root | [Use One Catalog Root](https://litespec.dev/4.0.0/ext/locale.md#use-one-catalog-root) | convention | any | frontend-ui | any | full | default | guidance | Catalogs sit under one application-owned root, or the project names another root in its documentation. |
| litespec/ext/mcp#confirm-every-writing-tool | [Confirm Every Writing Tool](https://litespec.dev/4.0.0/ext/mcp.md#confirm-every-writing-tool) | rule | any | web-api | any | full | rule | guidance | Each writing tool refuses until the person confirms the write. |
| litespec/ext/mcp#exclude-secrets-and-personal-data | [Exclude Secrets and Personal Data](https://litespec.dev/4.0.0/ext/mcp.md#exclude-secrets-and-personal-data) | rule | any | web-api | any | full | rule | guidance | Tool descriptions and logs carry field names with no secret or personal values. |
| litespec/ext/mcp#pass-server-instructions-at-initialize | [Pass Server Instructions at Initialize](https://litespec.dev/4.0.0/ext/mcp.md#pass-server-instructions-at-initialize) | rule | any | web-api | any | full | rule | guidance | The initialize response carries a non-empty `instructions` value stating transport, audience, write surface, and refusal behavior. |
| litespec/ext/mcp#record-the-server-as-an-entry-point | [Record the Server as an Entry Point](https://litespec.dev/4.0.0/ext/mcp.md#record-the-server-as-an-entry-point) | rule | any | web-api | record:entry-point | full | rule | guidance | The entry point list names an `mcp` entry titled for the shipped MCP server. |
| litespec/ext/mcp#scope-each-tool-to-named-use-cases | [Scope Each Tool to Named Use Cases](https://litespec.dev/4.0.0/ext/mcp.md#scope-each-tool-to-named-use-cases) | rule | any | web-api | any | full | rule | guidance | Each tool description names the use cases and permissions the tool reaches. |
| litespec/ext/mcp#state-the-distribution-and-update-path | [State the Distribution and Update Path](https://litespec.dev/4.0.0/ext/mcp.md#state-the-distribution-and-update-path) | rule | any | web-api | any | full | rule | guidance | The server documentation states install and update steps. |
| litespec/ext/mcp#state-the-refusing-side-on-each-refusal | [State the Refusing Side on Each Refusal](https://litespec.dev/4.0.0/ext/mcp.md#state-the-refusing-side-on-each-refusal) | convention | any | web-api | any | full | default | guidance | Refusals carry the `Needs:`, `Needs confirmation:`, and `Refused:` prefixes, or the project names another refusal vocabulary in its documentation. |
| litespec/ext/mcp#write-one-tool-description-for-one-decision | [Write One Tool Description for One Decision](https://litespec.dev/4.0.0/ext/mcp.md#write-one-tool-description-for-one-decision) | rule | any | web-api | any | full | rule | guidance | The declared tools directory shows imperative titles, declarative behavior, positive parameter polarity, and stated side effects. |
| litespec/ext/outbox#accept-repeated-delivery | [Accept Repeated Delivery](https://litespec.dev/4.0.0/ext/outbox.md#accept-repeated-delivery) | rule | any | infrastructure | reaction | full | rule | guidance | Each event handler keeps correct state when the same message arrives twice. |
| litespec/ext/outbox#audit-outbox-replay | [Audit Outbox Replay](https://litespec.dev/4.0.0/ext/outbox.md#audit-outbox-replay) | rule | any | infrastructure | any | full | rule | guidance | Each replay records actor, reason, time, and failure without editing the payload. |
| litespec/ext/outbox#authenticate-and-authorize-subscriptions | [Authenticate and Authorize Subscriptions](https://litespec.dev/4.0.0/ext/outbox.md#authenticate-and-authorize-subscriptions) | rule | any | infrastructure | record:notification | full | rule | guidance | The connection tests show authenticated connections only, with each scoped subscription authorized. |
| litespec/ext/outbox#avoid-automatic-durable-bus-adoption | [Avoid Automatic Durable-Bus Adoption](https://litespec.dev/4.0.0/ext/outbox.md#avoid-automatic-durable-bus-adoption) | convention | any | infrastructure | any | full | default | guidance | Dispatch runs on project-owned Marten records, or the project names a pinned durable bus package as its transport in its documentation. |
| litespec/ext/outbox#await-target-acceptance | [Await Target Acceptance](https://litespec.dev/4.0.0/ext/outbox.md#await-target-acceptance) | rule | any | infrastructure | any | full | rule | guidance | Completion records follow target acceptance, with no early completion. |
| litespec/ext/outbox#back-off-unavailable-store-polling | [Back off Unavailable-Store Polling](https://litespec.dev/4.0.0/ext/outbox.md#back-off-unavailable-store-polling) | rule | any | infrastructure | any | full | rule | guidance | Polling during a store outage backs off with rate-limited logging. |
| litespec/ext/outbox#bound-delivery-retries | [Bound Delivery Retries](https://litespec.dev/4.0.0/ext/outbox.md#bound-delivery-retries) | rule | any | infrastructure | any | full | rule | guidance | Retries run bounded exponential backoff with jitter. |
| litespec/ext/outbox#bound-realtime-resources | [Bound Realtime Resources](https://litespec.dev/4.0.0/ext/outbox.md#bound-realtime-resources) | rule | any | infrastructure | record:notification | full | rule | guidance | The four deployment bounds live as setting records with their values beside the deployment. |
| litespec/ext/outbox#classify-message-kinds | [Classify Message Kinds](https://litespec.dev/4.0.0/ext/outbox.md#classify-message-kinds) | rule | any | infrastructure | record:integration-event | full | rule | guidance | Each outbox record names integration event, journey-step command, or provider side effect, with integration events citing their integration-event record. |
| litespec/ext/outbox#classify-permanent-delivery-failure | [Classify Permanent Delivery Failure](https://litespec.dev/4.0.0/ext/outbox.md#classify-permanent-delivery-failure) | rule | any | infrastructure | any | full | rule | guidance | Permanent failures stop at the retry bound with safe investigation and replay data retained. |
| litespec/ext/outbox#declare-published-facts-as-integration-events | [Declare Published Facts as Integration Events](https://litespec.dev/4.0.0/ext/outbox.md#declare-published-facts-as-integration-events) | rule | any | infrastructure | record:integration-event | full | rule | guidance | Each emits effect names an integration-event record carrying direction, payload, and trust. |
| litespec/ext/outbox#declare-realtime-freshness | [Declare Realtime Freshness](https://litespec.dev/4.0.0/ext/outbox.md#declare-realtime-freshness) | rule | any | infrastructure | record:notification | full | rule | guidance | Which realtime-served queries lack an immediate or advisory freshness object on their output? Look at the served query beside the realtime use case. |
| litespec/ext/outbox#define-claim-ownership | [Define Claim Ownership](https://litespec.dev/4.0.0/ext/outbox.md#define-claim-ownership) | rule | any | infrastructure | any | full | rule | guidance | Each claim takes owner, expiry, and fencing value in a short transaction. |
| litespec/ext/outbox#deliver-each-event-to-each-handler-separately | [Deliver Each Event to Each Handler Separately](https://litespec.dev/4.0.0/ext/outbox.md#deliver-each-event-to-each-handler-separately) | rule | any | infrastructure | any | full | rule | guidance | Each event reaches each of its handlers as a separate delivery with its own retries and dead letter. |
| litespec/ext/outbox#deploy-readers-before-writers | [Deploy Readers Before Writers](https://litespec.dev/4.0.0/ext/outbox.md#deploy-readers-before-writers) | rule | any | infrastructure | any | full | rule | guidance | Releases deploy compatible readers before additive writers. |
| litespec/ext/outbox#dispatch-claimed-records-in-worker | [Dispatch Claimed Records in Worker](https://litespec.dev/4.0.0/ext/outbox.md#dispatch-claimed-records-in-worker) | rule | any | infrastructure | any | full | rule | guidance | The Worker claims pending records, dispatches bounded batches, and records each outcome. |
| litespec/ext/outbox#dispatch-journey-step-commands-in-a-new-scope | [Dispatch Journey-Step Commands in a New Scope](https://litespec.dev/4.0.0/ext/outbox.md#dispatch-journey-step-commands-in-a-new-scope) | convention | any | infrastructure | any | full | default | guidance | Journey-step commands run through `ICommandMediator` in a fresh Worker scope, or the project runs them inline in the dispatcher scope. |
| litespec/ext/outbox#distinguish-dependency-outage | [Distinguish Dependency Outage](https://litespec.dev/4.0.0/ext/outbox.md#distinguish-dependency-outage) | rule | any | infrastructure | any | full | rule | guidance | Store availability reads as a gauge while claimed-message outcomes read as a counter. |
| litespec/ext/outbox#emit-excluded-reactions-and-jobs-after-commit | [Emit Excluded Reactions and Jobs After Commit](https://litespec.dev/4.0.0/ext/outbox.md#emit-excluded-reactions-and-jobs-after-commit) | rule | any | infrastructure | reaction, job | full | rule | guidance | Excluded reactions and jobs emit after commit success with no staged outbox record. |
| litespec/ext/outbox#exclude-manually-repeatable-reactions-and-jobs | [Exclude Manually Repeatable Reactions and Jobs](https://litespec.dev/4.0.0/ext/outbox.md#exclude-manually-repeatable-reactions-and-jobs) | rule | any | infrastructure | reaction, job | full | rule | guidance | Reactions and jobs whose loss the operators accept and can repeat manually carry no outbox records. |
| litespec/ext/outbox#exclude-request-transaction-dispatch | [Exclude Request-Transaction Dispatch](https://litespec.dev/4.0.0/ext/outbox.md#exclude-request-transaction-dispatch) | rule | any | infrastructure | endpoint | full | rule | guidance | Request paths commit eligibility only, with dispatch living in the Worker. |
| litespec/ext/outbox#gate-dispatch-on-readiness | [Gate Dispatch on Readiness](https://litespec.dev/4.0.0/ext/outbox.md#gate-dispatch-on-readiness) | rule | any | infrastructure | any | full | rule | guidance | Unready hosts stop dispatch and dead-store polling. |
| litespec/ext/outbox#group-outbox-infrastructure | [Group Outbox Infrastructure](https://litespec.dev/4.0.0/ext/outbox.md#group-outbox-infrastructure) | convention | any | infrastructure | any | full | default | guidance | Outbox infrastructure sits under `Infrastructure/Messaging/Outbox/`, or the project names another home in its documentation. |
| litespec/ext/outbox#identify-repeated-delivery | [Identify Repeated Delivery](https://litespec.dev/4.0.0/ext/outbox.md#identify-repeated-delivery) | rule | any | infrastructure | reaction | full | rule | guidance | Each event handler checks message ID or business key at its Command or side-effect boundary. |
| litespec/ext/outbox#isolate-the-worker-host | [Isolate the Worker Host](https://litespec.dev/4.0.0/ext/outbox.md#isolate-the-worker-host) | convention | any | infrastructure | any | full | default | guidance | The outbox Worker host lives in its own project, or the project hosts dispatch inside its request host. |
| litespec/ext/outbox#keep-provider-mapping-with-integration | [Keep Provider Mapping with Integration](https://litespec.dev/4.0.0/ext/outbox.md#keep-provider-mapping-with-integration) | convention | any | infrastructure | any | full | default | guidance | Provider mapping sits in the owning integration, or the project keeps it in the shared dispatch path. |
| litespec/ext/outbox#model-outbox-lifecycle-states | [Model Outbox Lifecycle States](https://litespec.dev/4.0.0/ext/outbox.md#model-outbox-lifecycle-states) | rule | any | infrastructure | state-record | full | rule | guidance | Outbox lifecycle states form sealed records over an abstract base with documented transitions. |
| litespec/ext/outbox#place-realtime-code-at-outer-boundaries | [Place Realtime Code at Outer Boundaries](https://litespec.dev/4.0.0/ext/outbox.md#place-realtime-code-at-outer-boundaries) | convention | any | infrastructure | record:notification | full | default | guidance | Realtime transport code sits at the documented boundaries, or the realtime-placement convention names where it lives. |
| litespec/ext/outbox#plan-undispatched-rollback-records | [Plan Undispatched Rollback Records](https://litespec.dev/4.0.0/ext/outbox.md#plan-undispatched-rollback-records) | rule | any | infrastructure | record:runbook | full | rule | guidance | The rollback Runbook covers records the new writer staged but nobody dispatched. |
| litespec/ext/outbox#preserve-message-identity-during-retry | [Preserve Message Identity During Retry](https://litespec.dev/4.0.0/ext/outbox.md#preserve-message-identity-during-retry) | rule | any | infrastructure | any | full | rule | guidance | Message ID stays identical across retry and replay. |
| litespec/ext/outbox#protect-active-worker-compatibility | [Protect Active Worker Compatibility](https://litespec.dev/4.0.0/ext/outbox.md#protect-active-worker-compatibility) | rule | any | infrastructure | endpoint | full | rule | guidance | Every active Worker reads the type and schema version of new messages. |
| litespec/ext/outbox#publish-backlog-indicators | [Publish Backlog Indicators](https://litespec.dev/4.0.0/ext/outbox.md#publish-backlog-indicators) | rule | any | infrastructure | any | full | rule | guidance | The deployment publishes pending count, failed count, oldest pending age, attempts, dispatch duration, and success rate. |
| litespec/ext/outbox#reconnect-and-refresh-authoritative-state | [Reconnect and Refresh Authoritative State](https://litespec.dev/4.0.0/ext/outbox.md#reconnect-and-refresh-authoritative-state) | rule | any | infrastructure | record:notification | full | rule | guidance | The client reconnects with bounded backoff and refreshes authoritative state after a gap in the recovery tests. |
| litespec/ext/outbox#record-durable-delivery-behavior | [Record Durable Delivery Behavior](https://litespec.dev/4.0.0/ext/outbox.md#record-durable-delivery-behavior) | rule | any | infrastructure | any | full | rule | guidance | Each delivery specification documents guarantee, downstream boundary, duplicate behavior, retry horizon, and recovery runbook. |
| litespec/ext/outbox#record-realtime-need | [Record Realtime Need](https://litespec.dev/4.0.0/ext/outbox.md#record-realtime-need) | rule | any | infrastructure | record:notification | full | rule | guidance | The use case page holds the polling record, measured cost, update target, expected connections, and recovery behavior. |
| litespec/ext/outbox#record-transport-support | [Record Transport Support](https://litespec.dev/4.0.0/ext/outbox.md#record-transport-support) | rule | any | infrastructure | record:notification | full | rule | guidance | The use case page names its transport choice with the expected hosted-platform support. |
| litespec/ext/outbox#reject-cosmetic-realtime-adoption | [Reject Cosmetic Realtime Adoption](https://litespec.dev/4.0.0/ext/outbox.md#reject-cosmetic-realtime-adoption) | rule | any | infrastructure | record:notification | full | rule | guidance | The realtime decision cites a measured update requirement. |
| litespec/ext/outbox#reject-independent-outbox-commits | [Reject Independent Outbox Commits](https://litespec.dev/4.0.0/ext/outbox.md#reject-independent-outbox-commits) | rule | any | infrastructure | any | full | rule | guidance | Writer sources stage through the business session with no separate connection or commit. |
| litespec/ext/outbox#reject-unbounded-slow-client-buffering | [Reject Unbounded Slow-Client Buffering](https://litespec.dev/4.0.0/ext/outbox.md#reject-unbounded-slow-client-buffering) | rule | any | infrastructure | record:notification | full | rule | guidance | Slow-client buffering in the server code is bounded with backpressure. |
| litespec/ext/outbox#release-claim-transactions-before-calls | [Release Claim Transactions Before Calls](https://litespec.dev/4.0.0/ext/outbox.md#release-claim-transactions-before-calls) | rule | any | infrastructure | any | full | rule | guidance | Claim transactions close before the Worker makes network calls. |
| litespec/ext/outbox#requeue-expired-claims | [Requeue Expired Claims](https://litespec.dev/4.0.0/ext/outbox.md#requeue-expired-claims) | rule | any | infrastructure | any | full | rule | guidance | Expired claims return to eligible work for a live Worker. |
| litespec/ext/outbox#restrict-completion-to-current-lease-owners | [Restrict Completion to Current Lease Owners](https://litespec.dev/4.0.0/ext/outbox.md#restrict-completion-to-current-lease-owners) | rule | any | infrastructure | any | full | rule | guidance | Record updates succeed only under the current lease and fencing value. |
| litespec/ext/outbox#restrict-message-retry-to-claimed-records | [Restrict Message Retry to Claimed Records](https://litespec.dev/4.0.0/ext/outbox.md#restrict-message-retry-to-claimed-records) | rule | any | infrastructure | any | full | rule | guidance | Retry and poison handling touch claimed records only. |
| litespec/ext/outbox#revalidate-long-lived-access | [Revalidate Long-Lived Access](https://litespec.dev/4.0.0/ext/outbox.md#revalidate-long-lived-access) | rule | any | infrastructure | record:notification | full | rule | guidance | A connection whose token or session expired loses access in the revalidation tests. |
| litespec/ext/outbox#serialize-durable-messages | [Serialize Durable Messages](https://litespec.dev/4.0.0/ext/outbox.md#serialize-durable-messages) | rule | any | infrastructure | any | full | rule | guidance | Each pending durable message lands serialized in an outbox record. |
| litespec/ext/outbox#set-delivery-alerts | [Set Delivery Alerts](https://litespec.dev/4.0.0/ext/outbox.md#set-delivery-alerts) | rule | any | infrastructure | record:setting | full | rule | guidance | Alert thresholds sit in setting records derived from each use-case delivery target. |
| litespec/ext/outbox#stage-after-commit-effects-in-the-outbox | [Stage After-Commit Effects in the Outbox](https://litespec.dev/4.0.0/ext/outbox.md#stage-after-commit-effects-in-the-outbox) | rule | any | infrastructure | command-handler | full | rule | guidance | Each after-commit emits and runs effect stages in the outbox in the same transaction as its changes, with each domain event staged in the same commit as its aggregate. |
| litespec/ext/outbox#stage-messages-with-business-work | [Stage Messages with Business Work](https://litespec.dev/4.0.0/ext/outbox.md#stage-messages-with-business-work) | rule | any | infrastructure | any | full | rule | guidance | Pending durable messages stage in the same scoped session as their aggregate changes. |
| litespec/ext/outbox#store-failure-and-completion-evidence | [Store Failure and Completion Evidence](https://litespec.dev/4.0.0/ext/outbox.md#store-failure-and-completion-evidence) | rule | any | infrastructure | any | full | rule | guidance | Each outbox record retains its last error summary and completion time. |
| litespec/ext/outbox#store-required-message-fields | [Store Required Message Fields](https://litespec.dev/4.0.0/ext/outbox.md#store-required-message-fields) | rule | any | infrastructure | any | full | rule | guidance | Each outbox record carries identity, kind, type, schema version, time, payload, tenant, state, attempt, and next-attempt data. |
| litespec/ext/outbox#subscribe-through-narrow-functions | [Subscribe Through Narrow Functions](https://litespec.dev/4.0.0/ext/outbox.md#subscribe-through-narrow-functions) | convention | any | infrastructure | record:notification | full | default | guidance | Features subscribe through use-case-specific functions, or the realtime-subscription convention names how they subscribe. |
| litespec/ext/outbox#support-coexisting-message-producers | [Support Coexisting Message Producers](https://litespec.dev/4.0.0/ext/outbox.md#support-coexisting-message-producers) | rule | any | infrastructure | any | full | rule | guidance | The dispatcher reads records from every coexisting application version. |
| litespec/ext/outbox#tolerate-notification-ordering-differences | [Tolerate Notification Ordering Differences](https://litespec.dev/4.0.0/ext/outbox.md#tolerate-notification-ordering-differences) | rule | any | infrastructure | record:notification | full | rule | guidance | Duplicate and reordered notifications leave client state correct in the client tests. |
| litespec/ext/outbox#use-server-sent-events-for-notifications | [Use Server-Sent Events for Notifications](https://litespec.dev/4.0.0/ext/outbox.md#use-server-sent-events-for-notifications) | rule | any | infrastructure | record:notification | full | rule | guidance | Each one-way notification travels over the server-sent events boundary in code. |
| litespec/ext/outbox#use-signalr-for-interactive-messaging | [Use SignalR for Interactive Messaging](https://litespec.dev/4.0.0/ext/outbox.md#use-signalr-for-interactive-messaging) | rule | any | infrastructure | record:notification | full | rule | guidance | Each bidirectional use case runs on SignalR groups, messages, or fallback in code. |
| litespec/ext/outbox#version-message-types | [Version Message Types](https://litespec.dev/4.0.0/ext/outbox.md#version-message-types) | rule | any | infrastructure | any | full | rule | guidance | Each message carries a stable type name with an explicit schema version. |
| litespec/ext/plans#bound-plan-amounts-in-settings | [Bound Plan Amounts in Settings](https://litespec.dev/4.0.0/ext/plans.md#bound-plan-amounts-in-settings) | rule | any | application | record:setting-set | full | rule | guidance | Each plan allowance lives as a setting the gated use case cites. |
| litespec/ext/plans#gate-behavior-through-permissions | [Gate Behavior Through Permissions](https://litespec.dev/4.0.0/ext/plans.md#gate-behavior-through-permissions) | rule | any | application | record:use-case | full | rule | guidance | Each gated use case declares a permission in its grant that only an entitled plan grants. |
| litespec/ext/plans#hide-unentitled-actions-on-screens | [Hide Unentitled Actions on Screens](https://litespec.dev/4.0.0/ext/plans.md#hide-unentitled-actions-on-screens) | rule | any | application | record:screen | full | rule | guidance | Each screen shows only actions the acting plan entitles. |
| litespec/ext/plans#record-each-plan-once | [Record Each Plan Once](https://litespec.dev/4.0.0/ext/plans.md#record-each-plan-once) | rule | any | application | record:requirement | full | rule | guidance | The requirement pages under `.litespec/intent/` hold one record per plan with its entitlements. |
| litespec/ext/plans#refuse-runs-beyond-entitlement | [Refuse Runs Beyond Entitlement](https://litespec.dev/4.0.0/ext/plans.md#refuse-runs-beyond-entitlement) | rule | any | application | record:use-case | full | rule | guidance | A run past its plan ends in the named refusal result in the use case tests. |
| litespec/ext/plans#resolve-the-acting-plan-from-trusted-context | [Resolve the Acting Plan from Trusted Context](https://litespec.dev/4.0.0/ext/plans.md#resolve-the-acting-plan-from-trusted-context) | rule | any | application | any | full | rule | guidance | The acting plan resolves from verified subscription state, with no plan taken from caller input in code. |
| litespec/ext/plans#resolve-the-acting-plan-in-the-authorization-pipeline | [Resolve the Acting Plan in the Authorization Pipeline](https://litespec.dev/4.0.0/ext/plans.md#resolve-the-acting-plan-in-the-authorization-pipeline) | convention | any | application | any | full | default | guidance | The authorization pipeline resolves the acting plan, or the plan-resolution convention names where use cases find it. |
| litespec/ext/stage#declare-the-release-stage | [Declare the Release Stage](https://litespec.dev/4.0.0/ext/stage.md#declare-the-release-stage) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `project-invalid` for a `stage` selection with a missing or unknown `releaseStage`. |
| litespec/ext/stage#defer-named-provisions-until-promotion | [Defer Named Provisions Until Promotion](https://litespec.dev/4.0.0/ext/stage.md#defer-named-provisions-until-promotion) | rule | any | operations | record:exception | full | rule | checkable | `litespec model check` refuses a deferral exception naming an unknown provision, and any deferral in `production`; `litespec model check` reports `exception-expired` for an exception past its `expiresOn`. |
| litespec/ext/stage#promote-through-a-recorded-decision | [Promote Through a Recorded Decision](https://litespec.dev/4.0.0/ext/stage.md#promote-through-a-recorded-decision) | rule | any | operations | record:decision | full | rule | guidance | The promotion decision under `.litespec/intent/decisions/` stands before the first deployment holds customer data and ends every deferred provision. |
| litespec/ext/tenancy#apply-cross-tenant-disclosure-policy | [Apply Cross-Tenant Disclosure Policy](https://litespec.dev/4.0.0/ext/tenancy.md#apply-cross-tenant-disclosure-policy) | rule | any | application | command-handler, query-handler | full | rule | guidance | Each cross-tenant response follows the documented not-found or forbidden policy, shown in the API tests. |
| litespec/ext/tenancy#audit-actions-taken-under-delegation | [Audit Actions Taken Under Delegation](https://litespec.dev/4.0.0/ext/tenancy.md#audit-actions-taken-under-delegation) | rule | any | application | command-handler, query-handler | full | rule | guidance | Each action under delegation records the delegation grant used. |
| litespec/ext/tenancy#avoid-unplanned-isolation-models | [Avoid Unplanned Isolation Models](https://litespec.dev/4.0.0/ext/tenancy.md#avoid-unplanned-isolation-models) | rule | any | application | any | full | rule | guidance | Each mixed isolation model traces to a decision with a data evolution plan. |
| litespec/ext/tenancy#bound-every-delegation-in-time | [Bound Every Delegation in Time](https://litespec.dev/4.0.0/ext/tenancy.md#bound-every-delegation-in-time) | rule | any | application | record:role | full | rule | guidance | Each delegation carries an expiry or a revocation path. |
| litespec/ext/tenancy#declare-delegation-grants-on-both-sides | [Declare Delegation Grants on Both Sides](https://litespec.dev/4.0.0/ext/tenancy.md#declare-delegation-grants-on-both-sides) | rule | any | application | record:role | full | rule | guidance | Each delegation declares a delegator grant naming who may be acted for and an acting grant naming who may act. |
| litespec/ext/tenancy#define-tenant-isolation | [Define Tenant Isolation](https://litespec.dev/4.0.0/ext/tenancy.md#define-tenant-isolation) | rule | any | application | record:decision | full | rule | guidance | The adoption decision names shared-table, schema, or database isolation with its guarantee and operating trade-off. |
| litespec/ext/tenancy#isolate-administrative-cross-tenant-access | [Isolate Administrative Cross-Tenant Access](https://litespec.dev/4.0.0/ext/tenancy.md#isolate-administrative-cross-tenant-access) | rule | any | application | command-handler, query-handler | full | rule | guidance | Each administrative cross-tenant use case names a platform-scope permission, and the audit trail holds a record for every cross-tenant run. |
| litespec/ext/tenancy#pass-tenant-scope-explicitly | [Pass Tenant Scope Explicitly](https://litespec.dev/4.0.0/ext/tenancy.md#pass-tenant-scope-explicitly) | convention | any | application | use-case, port | full | default | guidance | Domain code reads no ambient tenant state, or the tenant-scope convention names how the Domain receives scope. |
| litespec/ext/tenancy#protect-tenant-diagnostics | [Protect Tenant Diagnostics](https://litespec.dev/4.0.0/ext/tenancy.md#protect-tenant-diagnostics) | rule | any | application | any | full | rule | guidance | The error, log, metric, and trace outputs hold no other tenant's identifiers or data. |
| litespec/ext/tenancy#prove-delegated-calls-with-scenarios | [Prove Delegated Calls with Scenarios](https://litespec.dev/4.0.0/ext/tenancy.md#prove-delegated-calls-with-scenarios) | rule | any | application | record:scenario | full | rule | guidance | Each delegation proves an allowed call and a refused call with scenarios. |
| litespec/ext/tenancy#record-an-all-tenant-operation | [Record an All-Tenant Operation](https://litespec.dev/4.0.0/ext/tenancy.md#record-an-all-tenant-operation) | rule | any | application | command-handler, job | full | rule | guidance | The record of each all-tenant run names actor, operation, reason, tenant count, and reached tenant identifiers up to the adoption bound. |
| litespec/ext/tenancy#record-delegation-grants-with-roles | [Record Delegation Grants with Roles](https://litespec.dev/4.0.0/ext/tenancy.md#record-delegation-grants-with-roles) | convention | any | application | record:role | full | default | guidance | Each delegation grant sits on its role page, or the delegation-records convention names where grants live. |
| litespec/ext/tenancy#record-the-tenant-adoption-decision | [Record the Tenant Adoption Decision](https://litespec.dev/4.0.0/ext/tenancy.md#record-the-tenant-adoption-decision) | rule | any | application | record:decision | full | rule | guidance | The tenant adoption decision under `.litespec/intent/decisions/` names source, storage model, isolation guarantee, administrative access, evolution path, and enumeration bound. |
| litespec/ext/tenancy#reject-unrestricted-tenant-input | [Reject Unrestricted Tenant Input](https://litespec.dev/4.0.0/ext/tenancy.md#reject-unrestricted-tenant-input) | rule | any | application | any | full | rule | guidance | The tenant resolver code accepts a tenant identifier only from an authenticated source, never from request data. |
| litespec/ext/tenancy#resolve-tenant-identity-from-trusted-context | [Resolve Tenant Identity from Trusted Context](https://litespec.dev/4.0.0/ext/tenancy.md#resolve-tenant-identity-from-trusted-context) | rule | any | application | any | full | rule | guidance | Each trusted host boundary resolves the tenant from verified claims, host mapping, or another authenticated source. |
| litespec/ext/tenancy#scope-delegated-grants-to-named-permissions | [Scope Delegated Grants to Named Permissions](https://litespec.dev/4.0.0/ext/tenancy.md#scope-delegated-grants-to-named-permissions) | rule | any | application | record:role | full | rule | guidance | Each delegation names its delegated permissions, with none open to all permissions. |
| litespec/ext/tenancy#scope-every-use-case-to-its-tenant-reach | [Scope Every Use Case to Its Tenant Reach](https://litespec.dev/4.0.0/ext/tenancy.md#scope-every-use-case-to-its-tenant-reach) | rule | any | application | record:use-case | full | rule | guidance | Each use case declares own, cross, public, or none in its access tenant scope. |
| litespec/ext/tenancy#scope-tenant-operations | [Scope Tenant Operations](https://litespec.dev/4.0.0/ext/tenancy.md#scope-tenant-operations) | rule | any | application | record:runbook | full | rule | guidance | The backup, restore, replay, deletion, export, support, and investigation procedures each state one-tenant or all-tenant scope. |
| litespec/ext/tenancy#scope-tenant-owned-records | [Scope Tenant-Owned Records](https://litespec.dev/4.0.0/ext/tenancy.md#scope-tenant-owned-records) | rule | any | application | any | full | rule | guidance | The documents, queries, constraints, cache keys, outbox records, reactions, jobs, exports, and storage paths in code each carry tenant scope. |
| litespec/ext/tenancy#use-one-tenant-accessor | [Use One Tenant Accessor](https://litespec.dev/4.0.0/ext/tenancy.md#use-one-tenant-accessor) | convention | any | application | any | full | default | guidance | One current-tenant accessor serves the trusted host boundary, or the tenant-access convention names where readers find the tenant. |
| litespec/ext/tenancy#use-selected-tenant-storage-support | [Use Selected Tenant Storage Support](https://litespec.dev/4.0.0/ext/tenancy.md#use-selected-tenant-storage-support) | rule | any | application | any | full | rule | guidance | The session-creation code of each provider resolves the tenant through that provider's tenancy support. |
| litespec/ext/tenancy#use-typed-tenant-identities | [Use Typed Tenant Identities](https://litespec.dev/4.0.0/ext/tenancy.md#use-typed-tenant-identities) | convention | any | application | any | full | default | guidance | Tenant references carry the `TenantId` type, or the tenant-identity convention names another type. |
| litespec/ext/tenancy#verify-actor-and-target-tenancy | [Verify Actor and Target Tenancy](https://litespec.dev/4.0.0/ext/tenancy.md#verify-actor-and-target-tenancy) | rule | any | application | command-handler, query-handler | full | rule | guidance | The authorization tests fail a protected operation whose actor and target tenants mismatch. |

### frontend

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/frontend/components#add-a-missing-composite-to-the-shared-package | [Add a Missing Composite to the Shared Package](https://litespec.dev/4.0.0/frontend/components.md#add-a-missing-composite-to-the-shared-package) | rule | any | frontend-ui | component | full | rule | guidance | Which layout, control, or surface drawn by two pages is missing from the shared package exports? Look in the shared package exports and the drawing pages. |
| litespec/frontend/components#compose-composites-in-page-code | [Compose Composites in Page Code](https://litespec.dev/4.0.0/frontend/components.md#compose-composites-in-page-code) | rule | any | frontend-ui | component | full | rule | checkable | `litespec model check` reports `[litespec/frontend/components#compose-composites-in-page-code]` with the file and the refused import. Run it at the consumer root. |
| litespec/frontend/components#expose-card-and-section-titles-as-headings | [Expose Card and Section Titles as Headings](https://litespec.dev/4.0.0/frontend/components.md#expose-card-and-section-titles-as-headings) | convention | any | frontend-ui | component | full | default | guidance | Which visible card, panel, or section titles render as non-heading elements? Look in the route suite output, which resolves each as a heading. |
| litespec/frontend/components#keep-component-inputs-narrow | [Keep Component Inputs Narrow](https://litespec.dev/4.0.0/frontend/components.md#keep-component-inputs-narrow) | rule | any | frontend-ui | component | full | rule | guidance | Which composite inputs name a client, a store, or an aggregate instead of values and callbacks? Look in the shared package component signatures. |
| litespec/frontend/components#keep-domain-values-typed-until-display | [Keep Domain Values Typed Until Display](https://litespec.dev/4.0.0/frontend/components.md#keep-domain-values-typed-until-display) | convention | any | frontend-ui | component | full | default | guidance | Which display strings are produced before the presentation boundary, or without an explicit locale and zone? Look in the presentation boundary and the components feeding it. |
| litespec/frontend/components#keep-error-boundaries-scoped | [Keep Error Boundaries Scoped](https://litespec.dev/4.0.0/frontend/components.md#keep-error-boundaries-scoped) | convention | any | frontend-ui | component, route | full | default | guidance | Which route failures render outside the route error surface, and which component boundaries leave their surroundings unusable? Look in the route error surfaces and the boundary components. |
| litespec/frontend/components#keep-shared-ui-in-one-package | [Keep Shared UI in One Package](https://litespec.dev/4.0.0/frontend/components.md#keep-shared-ui-in-one-package) | rule | any | frontend-ui | any | full | rule | guidance | Which shared primitives or composites live outside the shared package? Look in the workspace packages and the application sources. |
| litespec/frontend/components#name-components-for-their-role | [Name Components for Their Role](https://litespec.dev/4.0.0/frontend/components.md#name-components-for-their-role) | convention | any | frontend-ui | component | full | default | guidance | Which component names hide the role they play? Look in the shared package and module sources. |
| litespec/frontend/components#place-a-drawing-no-composite-makes-in-an-exception-file | [Place a Drawing No Composite Makes in an Exception File](https://litespec.dev/4.0.0/frontend/components.md#place-a-drawing-no-composite-makes-in-an-exception-file) | rule | any | frontend-ui | component | full | rule | guidance | Which custom styling sits outside the files whose names mark drawings outside the composites, or uses values other than semantic theme tokens? Look in the exception files each stack page names. |
| litespec/frontend/components#prefer-a-composite-over-a-primitive | [Prefer a Composite over a Primitive](https://litespec.dev/4.0.0/frontend/components.md#prefer-a-composite-over-a-primitive) | rule | any | frontend-ui | component | full | rule | guidance | Which page sources import a primitive where the shared package provides a composite? Look in route and module imports. |
| litespec/frontend/components#render-control-states | [Render Control States](https://litespec.dev/4.0.0/frontend/components.md#render-control-states) | rule | any | frontend-ui | component | full | rule | guidance | Which controls miss a disabled or pending state, allow a second submission while one is in flight, or leave recovery unusable? Look in the shared package components. |
| litespec/frontend/components#render-data-states | [Render Data States](https://litespec.dev/4.0.0/frontend/components.md#render-data-states) | rule | any | frontend-ui | component | full | rule | guidance | Which data components miss a loading, empty, error, forbidden, or ready state, or name a state outside the glossary? Look in the shared package components and the glossary. |
| litespec/frontend/components#sanitize-untrusted-rich-content | [Sanitize Untrusted Rich Content](https://litespec.dev/4.0.0/frontend/components.md#sanitize-untrusted-rich-content) | rule | any | frontend-ui | component | full | rule | guidance | Which untrusted rich content renders without a recorded decision naming the sanitizer, the allowed elements and attributes, the link policy, and the test cases? Look in the decision records and the rendering components. |
| litespec/frontend/components#support-keyboard-focus-labels-and-announcements | [Support Keyboard, Focus, Labels, and Announcements](https://litespec.dev/4.0.0/frontend/components.md#support-keyboard-focus-labels-and-announcements) | rule | any | frontend-ui | component, route | full | rule | guidance | Which interactive UI lacks keyboard operation, visible focus, semantic elements, programmatic labels, or status announcements? Look in the route suite output. |
| litespec/frontend/components#use-a-composite-for-a-content-image | [Use a Composite for a Content Image](https://litespec.dev/4.0.0/frontend/components.md#use-a-composite-for-a-content-image) | rule | any | frontend-ui | component | full | rule | guidance | Which content images render outside the shared image component or against the text policy for their kind? Look in page sources for unwrapped images. |
| litespec/frontend/components#use-composites-for-layout-and-interaction-in-page-code | [Use Composites for Layout and Interaction in Page Code](https://litespec.dev/4.0.0/frontend/components.md#use-composites-for-layout-and-interaction-in-page-code) | rule | any | frontend-ui | component | full | rule | guidance | Which layout or interactive elements appear in route and module sources? Look in route and module sources; each stack page names the refused elements and the composite each refusal names. |
| litespec/frontend/components#use-declared-visual-variants | [Use Declared Visual Variants](https://litespec.dev/4.0.0/frontend/components.md#use-declared-visual-variants) | rule | any | frontend-ui | component | full | rule | guidance | Which repeated variants bypass the shared variant helper or carry literal values in composites? Look in the shared package components. |
| litespec/frontend/components#write-no-class-name-in-page-code | [Write No Class Name in Page Code](https://litespec.dev/4.0.0/frontend/components.md#write-no-class-name-in-page-code) | rule | any | frontend-ui | component | full | rule | guidance | Which class or style bindings appear in route and module sources? Look in route and module sources; each stack page names the bindings its lint refuses. |
| litespec/frontend/data#announce-the-outcome-of-an-optimistic-update | [Announce the Outcome of an Optimistic Update](https://litespec.dev/4.0.0/frontend/data.md#announce-the-outcome-of-an-optimistic-update) | rule | any | frontend-data | component, route | full | rule | guidance | Which reconciled outcomes differing from the shown value announce through no live region? Look in the route tests asserting the announcement. |
| litespec/frontend/data#assign-state-to-the-narrowest-owner | [Assign State to the Narrowest Owner](https://litespec.dev/4.0.0/frontend/data.md#assign-state-to-the-narrowest-owner) | rule | any | frontend-data | component, route, form | full | rule | guidance | Which values live above their narrowest owner instead of the query cache, the address, form state, or component state? Look in the state declarations. |
| litespec/frontend/data#build-a-form-on-the-shared-form-library | [Build a Form on the Shared Form Library](https://litespec.dev/4.0.0/frontend/data.md#build-a-form-on-the-shared-form-library) | convention | any | frontend-data | form | full | default | guidance | Which forms bypass the shared package form entry point or its registered field components? Look in the form sources and the shared package form entry point. |
| litespec/frontend/data#classify-state | [Classify State](https://litespec.dev/4.0.0/frontend/data.md#classify-state) | rule | any | frontend-data | aggregate | full | rule | guidance | Which aggregates introducing state name no durable, device-local, or derived classification on their page? Look on the aggregate pages. |
| litespec/frontend/data#generate-the-client-from-the-published-contract | [Generate the Client from the Published Contract](https://litespec.dev/4.0.0/frontend/data.md#generate-the-client-from-the-published-contract) | rule | any | frontend-data | any | full | rule | guidance | Which client, type, schema, or operation option is handwritten instead of generated from the published OpenAPI document? Look in the generated client directory and the contract it names. |
| litespec/frontend/data#keep-schemas-use-case-specific | [Keep Schemas Use-Case Specific](https://litespec.dev/4.0.0/frontend/data.md#keep-schemas-use-case-specific) | convention | any | frontend-data | any | full | default | guidance | Which form schemas or view models sit in a shared location with only one use case reading them? Look in the use-case folders and the shared schema locations. |
| litespec/frontend/data#keep-secrets-out-of-browser-storage | [Keep Secrets Out of Browser Storage](https://litespec.dev/4.0.0/frontend/data.md#keep-secrets-out-of-browser-storage) | rule | any | frontend-data | any | full | rule | guidance | Which refresh tokens, provider secrets, or privileged credentials sit in browser storage or browser-visible variables? Look in the storage writes and the public variables. |
| litespec/frontend/data#keep-the-client-boundary-in-the-frame | [Keep the Client Boundary in the Frame](https://litespec.dev/4.0.0/frontend/data.md#keep-the-client-boundary-in-the-frame) | convention | any | frontend-data | any | full | default | guidance | Which client configuration, problem mapping, or download helpers sit in a use-case folder instead of the frame root? Look in the frame root and the use-case folders. |
| litespec/frontend/data#keep-the-session-in-an-api-owned-cookie | [Keep the Session in an API Owned Cookie](https://litespec.dev/4.0.0/frontend/data.md#keep-the-session-in-an-api-owned-cookie) | rule | any | frontend-data | any | full | rule | guidance | Which tokens sit in frontend sources instead of the API-owned HTTP-only cookie? Look in the API session handling and the frontend sources. |
| litespec/frontend/data#localize-copy-through-locale-dictionaries | [Localize Copy Through Locale Dictionaries](https://litespec.dev/4.0.0/frontend/data.md#localize-copy-through-locale-dictionaries) | rule | any | frontend-data | component, route, form | full | rule | guidance | Which copy bypasses the locale dictionaries, or misses fill, plural, chunking, typed keys, or a declared fallback? Look in the locale dictionaries and the copy call sites. |
| litespec/frontend/data#make-optimistic-behavior-recoverable | [Make Optimistic Behavior Recoverable](https://litespec.dev/4.0.0/frontend/data.md#make-optimistic-behavior-recoverable) | rule | any | frontend-data | component, route | full | rule | guidance | Which optimistic updates lack a declared client identity, conflict behavior, rollback, or reconciliation path, and which money, irreversible, or uncertainly authorized actions run optimistically instead of waiting for the server? Look in the optimistic update definitions. |
| litespec/frontend/data#map-every-failure-to-one-problem-type | [Map Every Failure to One Problem Type](https://litespec.dev/4.0.0/frontend/data.md#map-every-failure-to-one-problem-type) | rule | any | frontend-data | component, route | full | rule | guidance | Which failures render outside the one problem type, or hide the trace identifier from the detail? Look in the frame problem mapping and the error surfaces. |
| litespec/frontend/data#name-the-zone-for-every-timestamp | [Name the Zone for Every Timestamp](https://litespec.dev/4.0.0/frontend/data.md#name-the-zone-for-every-timestamp) | rule | any | frontend-data | component, route | full | rule | guidance | Which timestamp formatters run without an explicit IANA zone resolved from the shown record? Look in the formatter call sites. |
| litespec/frontend/data#place-a-field-refusal-on-its-field | [Place a Field Refusal on Its Field](https://litespec.dev/4.0.0/frontend/data.md#place-a-field-refusal-on-its-field) | rule | any | frontend-data | form | full | rule | guidance | Which field problems miss their fields, bypass the frame helper, or close the form? Look in the forms and the frame helper. |
| litespec/frontend/data#place-a-refusal-beside-what-was-refused | [Place a Refusal Beside What Was Refused](https://litespec.dev/4.0.0/frontend/data.md#place-a-refusal-beside-what-was-refused) | rule | any | frontend-data | component, route | full | rule | guidance | Which refusals render away from the refused record or control, or without the application's sentence and code in the markup? Look in the screen's page files beside the refusing controls. |
| litespec/frontend/data#read-a-permission-from-the-session | [Read a Permission from the Session](https://litespec.dev/4.0.0/frontend/data.md#read-a-permission-from-the-session) | rule | any | frontend-data | route | full | rule | guidance | Which offered commands exceed the permissions the session actor holds at the record scope? Look in the page command guards and the session shape. |
| litespec/frontend/data#regenerate-the-client-rather-than-editing-it | [Regenerate the Client Rather Than Editing It](https://litespec.dev/4.0.0/frontend/data.md#regenerate-the-client-rather-than-editing-it) | convention | any | frontend-data | any | full | default | guidance | Which hand edits sit below the generated directory, making the committed client differ from fresh generation output? Look in the generated directory and the generator command. |
| litespec/frontend/data#route-a-personal-value-in-a-header | [Route a Personal Value in a Header](https://litespec.dev/4.0.0/frontend/data.md#route-a-personal-value-in-a-header) | rule | any | frontend-data | component, route | full | rule | guidance | Which person-naming values travel in the query string instead of contract-declared headers? Look in the contract headers and the call sites. |
| litespec/frontend/data#route-use-cases-through-application | [Route Use Cases Through Application](https://litespec.dev/4.0.0/frontend/data.md#route-use-cases-through-application) | rule | any | frontend-data | component, route | full | rule | guidance | Which screens or components compose Domain calls or write storage instead of invoking an Application handler carrying a `Command` or `Query` role suffix? Look in the screen and component sources. |
| litespec/frontend/data#set-the-write-marker-on-every-request | [Set the Write Marker on Every Request](https://litespec.dev/4.0.0/frontend/data.md#set-the-write-marker-on-every-request) | rule | any | frontend-data | component, route | full | rule | guidance | Which writes lack the configured marker header of the form `X-<Project>-Request`? Look in the client configuration and the API write acceptance. |
| litespec/frontend/data#update-the-cache-a-command-changed | [Update the Cache a Command Changed](https://litespec.dev/4.0.0/frontend/data.md#update-the-cache-a-command-changed) | rule | any | frontend-data | component, route | full | rule | guidance | Which successful commands leave a changed query cached, or invalidate a query their answers left unchanged? Look in the command call sites and the cache keys. |
| litespec/frontend/data#use-one-configured-client-per-application | [Use One Configured Client per Application](https://litespec.dev/4.0.0/frontend/data.md#use-one-configured-client-per-application) | rule | any | frontend-data | component, route | full | rule | guidance | Which reads or writes bypass the one configured client? Look in the frame client configuration and the call sites. |
| litespec/frontend/data#validate-a-form-with-the-generated-schema | [Validate a Form with the Generated Schema](https://litespec.dev/4.0.0/frontend/data.md#validate-a-form-with-the-generated-schema) | rule | any | frontend-data | form | full | rule | guidance | Which forms validate against a handwritten restatement instead of the generated request schema extended with application rules? Look in the form sources and the generated schemas. |
| litespec/frontend/mobile/data#call-the-server-only-through-the-generated-client | [Call the Server Only Through the Generated Client](https://litespec.dev/4.0.0/frontend/mobile/data.md#call-the-server-only-through-the-generated-client) | rule | any | frontend-data | - | full | rule | guidance | Which backend calls in a `server` app bypass the generated client in `{ProjectName}.Client`? Look in the backend call sites. |
| litespec/frontend/mobile/data#copy-picked-media-into-the-app | [Copy Picked Media into the App](https://litespec.dev/4.0.0/frontend/mobile/data.md#copy-picked-media-into-the-app) | rule | any | frontend-data | - | full | rule | guidance | Which imported media keeps a stored picker URI instead of a copy in app-private storage? Look in the media imports. |
| litespec/frontend/mobile/data#keep-persisted-state-in-app-private-storage | [Keep Persisted State in App-Private Storage](https://litespec.dev/4.0.0/frontend/mobile/data.md#keep-persisted-state-in-app-private-storage) | rule | any | frontend-data | - | full | rule | guidance | Which persisted state or user-added media lives outside app-private storage, or writes without a temporary file? Look in the storage writes. |
| litespec/frontend/mobile/data#load-persisted-state-once | [Load Persisted State Once](https://litespec.dev/4.0.0/frontend/mobile/data.md#load-persisted-state-once) | rule | any | frontend-data | - | full | rule | guidance | Which persisted state loads outside startup, or renders a screen before the typed store is ready? Look in the startup sequence and the screen loading states. |
| litespec/frontend/mobile/data#make-refusals-explicit | [Make Refusals Explicit](https://litespec.dev/4.0.0/frontend/mobile/data.md#make-refusals-explicit) | rule | any | frontend-data | - | full | rule | guidance | Which handler unions miss success or a named refusal, and which screens leave a refusal unmapped to a message? Look in the handler result types and the screens. |
| litespec/frontend/mobile/data#refuse-commands-while-offline | [Refuse Commands While Offline](https://litespec.dev/4.0.0/frontend/mobile/data.md#refuse-commands-while-offline) | convention | any | frontend-data | - | full | default | guidance | Which screens queue a command while offline without a recorded departure naming the queued commands and their replay order, and which offline screens show no failure state? Look in the command call sites and the offline screens. |
| litespec/frontend/mobile/device#declare-only-used-permissions | [Declare Only Used Permissions](https://litespec.dev/4.0.0/frontend/mobile/device.md#declare-only-used-permissions) | rule | any | frontend-ui | - | full | rule | guidance | Which app manifest permissions do no current features use? Look in the app manifest beside the features. |
| litespec/frontend/mobile/device#hold-audio-focus-while-playing-sound | [Hold Audio Focus While Playing Sound](https://litespec.dev/4.0.0/frontend/mobile/device.md#hold-audio-focus-while-playing-sound) | rule | any | frontend-ui | - | full | rule | guidance | Which audible playback skips audio focus or keeps playing on focus loss? Look in the playback code. |
| litespec/frontend/mobile/device#keep-device-work-in-the-foreground | [Keep Device Work in the Foreground](https://litespec.dev/4.0.0/frontend/mobile/device.md#keep-device-work-in-the-foreground) | convention | any | frontend-ui | - | full | default | guidance | Which background services, scheduled jobs, or push handlers run without a project decision naming them? Look in the background work beside the decision records. |
| litespec/frontend/mobile/device#pause-media-in-the-background | [Pause Media in the Background](https://litespec.dev/4.0.0/frontend/mobile/device.md#pause-media-in-the-background) | rule | any | frontend-ui | - | full | rule | guidance | Which sound or video keeps playing out of the foreground, or resumes before return? Look in the lifecycle handling. |
| litespec/frontend/mobile/device#prefer-permissionless-system-pickers | [Prefer Permissionless System Pickers](https://litespec.dev/4.0.0/frontend/mobile/device.md#prefer-permissionless-system-pickers) | rule | any | frontend-ui | - | full | rule | guidance | Which photo or file picking bypasses the permissionless system picker where the platform offers one? Look in the picking call sites. |
| litespec/frontend/mobile/device#request-a-permission-at-the-point-of-use | [Request a Permission at the Point of Use](https://litespec.dev/4.0.0/frontend/mobile/device.md#request-a-permission-at-the-point-of-use) | rule | any | frontend-ui | - | full | rule | guidance | Which runtime permission requests fire at launch instead of from the action needing them? Look in the permission requests. |
| litespec/frontend/mobile/screens#draw-edge-to-edge-with-insets | [Draw Edge to Edge with Insets](https://litespec.dev/4.0.0/frontend/mobile/screens.md#draw-edge-to-edge-with-insets) | rule | any | frontend-ui | - | full | rule | guidance | Which screens clip controls or text under the system bars without applying the insets? Look in the screen layouts. |
| litespec/frontend/mobile/screens#follow-the-system-back-gesture | [Follow the System Back Gesture](https://litespec.dev/4.0.0/frontend/mobile/screens.md#follow-the-system-back-gesture) | rule | any | frontend-ui | - | full | rule | guidance | Which back gestures skip the overlay, jump more than one screen, or leave the app from a deeper screen? Look in the back handling. |
| litespec/frontend/mobile/screens#honor-reduced-motion | [Honor Reduced Motion](https://litespec.dev/4.0.0/frontend/mobile/screens.md#honor-reduced-motion) | rule | any | frontend-ui | - | full | rule | guidance | Which screens keep looping motion or video with animations off instead of showing a still state? Look in the screens with animations off. |
| litespec/frontend/mobile/screens#meet-touch-and-text-accessibility | [Meet Touch and Text Accessibility](https://litespec.dev/4.0.0/frontend/mobile/screens.md#meet-touch-and-text-accessibility) | rule | any | frontend-ui | - | full | rule | guidance | Which interactive views lack a content description or the platform-minimum touch target, and which text ignores the system font scale? Look in the views, the text styles, and the accessibility device tests the Mobile Testing page names. |
| litespec/frontend/mobile/screens#own-navigation-in-one-controller | [Own Navigation in One Controller](https://litespec.dev/4.0.0/frontend/mobile/screens.md#own-navigation-in-one-controller) | rule | any | frontend-ui | - | full | rule | guidance | Which navigation state lives outside the one controller, and which screens navigate instead of raising events? Look in the controller and the screens. |
| litespec/frontend/mobile/screens#release-media-with-its-screen | [Release Media with Its Screen](https://litespec.dev/4.0.0/frontend/mobile/screens.md#release-media-with-its-screen) | rule | any | frontend-ui | - | full | rule | guidance | Which players, animators, or decoded images survive their view leaving the window? Look in the view teardown. |
| litespec/frontend/mobile/screens#render-with-the-platforms-own-views | [Render with the Platform's Own Views](https://litespec.dev/4.0.0/frontend/mobile/screens.md#render-with-the-platforms-own-views) | rule | any | frontend-ui | - | full | rule | guidance | Which product screens render in a WebView or a cross-platform UI layer instead of the platform's native UI toolkit? Look in the screen implementations. |
| litespec/frontend/mobile/screens#restore-the-visitors-place | [Restore the Visitor's Place](https://litespec.dev/4.0.0/frontend/mobile/screens.md#restore-the-visitors-place) | convention | any | frontend-ui | - | full | default | guidance | Which process recreations drop the visitor outside the screen the saved navigation state names? Look in the saved-state handling. |
| litespec/frontend/mobile/screens#route-app-links-to-journey-entry-screens | [Route App Links to Journey Entry Screens](https://litespec.dev/4.0.0/frontend/mobile/screens.md#route-app-links-to-journey-entry-screens) | rule | any | frontend-ui | - | full | rule | guidance | Which journey entry screens open the first screen instead of the screen and record their app link names, and which links resolve outside the one controller? Look in the app link handling and the controller. |
| litespec/frontend/mobile/structure#hold-the-domain-in-the-app-only-without-a-server | [Hold the Domain in the App Only Without a Server](https://litespec.dev/4.0.0/frontend/mobile/structure.md#hold-the-domain-in-the-app-only-without-a-server) | rule | any | frontend-ui | - | full | rule | guidance | Which `client-only` solutions miss a Domain, Application, or Infrastructure project, and which `server` solutions miss the Client project or hold a Domain copy? Look in the solution tree. |
| litespec/frontend/mobile/structure#keep-core-projects-platform-free | [Keep Core Projects Platform-Free](https://litespec.dev/4.0.0/frontend/mobile/structure.md#keep-core-projects-platform-free) | rule | any | frontend-ui | - | full | rule | guidance | Which core projects target a platform SDK or reference a platform SDK type? Look in the core project files and sources. |
| litespec/frontend/mobile/structure#organize-screens-by-module | [Organize Screens by Module](https://litespec.dev/4.0.0/frontend/mobile/structure.md#organize-screens-by-module) | rule | any | frontend-ui | - | full | rule | guidance | Which screens sit outside `Screens/`, or outside their module folder in a multi-module product? Look in the platform project tree. |
| litespec/frontend/mobile/structure#place-platform-adapters-in-the-platform-project | [Place Platform Adapters in the Platform Project](https://litespec.dev/4.0.0/frontend/mobile/structure.md#place-platform-adapters-in-the-platform-project) | convention | any | frontend-ui | - | full | default | guidance | Which platform API surfaces lack one adapter type in the platform project behind an interface Application owns? Look in the platform project adapters. |
| litespec/frontend/mobile/structure#use-the-mobile-solution-tree | [Use the Mobile Solution Tree](https://litespec.dev/4.0.0/frontend/mobile/structure.md#use-the-mobile-solution-tree) | rule | any | frontend-ui | - | full | rule | guidance | Which mobile apps sit outside the one solution at `apps/mobile/`, or miss the core projects under `src/` or the `{ProjectName}.{Platform}` app project? Look in the `apps/mobile/` tree. |
| litespec/frontend/mobile/testing#prove-screens-on-a-device-or-emulator | [Prove Screens on a Device or Emulator](https://litespec.dev/4.0.0/frontend/mobile/testing.md#prove-screens-on-a-device-or-emulator) | rule | any | tests | - | full | rule | guidance | Which screens a use case reaches lack a device test driving them on an emulator or device? Look in the device tests beside the screens. |
| litespec/frontend/mobile/testing#prove-touch-and-text-accessibility-on-a-device | [Prove Touch and Text Accessibility on a Device](https://litespec.dev/4.0.0/frontend/mobile/testing.md#prove-touch-and-text-accessibility-on-a-device) | rule | any | tests | - | full | rule | guidance | Which screens lack a device test checking content descriptions, platform-minimum touch targets, and text scaling with the system font scale? Look in the device tests beside the screens. |
| litespec/frontend/mobile/testing#run-the-release-build-before-a-release | [Run the Release Build Before a Release](https://litespec.dev/4.0.0/frontend/mobile/testing.md#run-the-release-build-before-a-release) | convention | any | tests | - | full | default | guidance | Which releases publish without a record naming one physical device per platform and the walk result? Look in the release records. |
| litespec/frontend/mobile/testing#test-the-core-as-plain-net | [Test the Core as Plain .NET](https://litespec.dev/4.0.0/frontend/mobile/testing.md#test-the-core-as-plain-net) | rule | any | tests | - | full | rule | guidance | Which core test projects need an emulator instead of running on the plain .NET runner? Look in the core test projects. |
| litespec/frontend/patterns#declare-the-compact-behavior | [Declare the Compact Behavior](https://litespec.dev/4.0.0/frontend/patterns.md#declare-the-compact-behavior) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `[litespec/frontend/patterns#declare-the-compact-behavior]` for a breakpoint outside the breakpoints map or a compact option naming no recorded option. Run it at the consumer root. |
| litespec/frontend/patterns#implement-a-chosen-pattern-once | [Implement a Chosen Pattern Once](https://litespec.dev/4.0.0/frontend/patterns.md#implement-a-chosen-pattern-once) | rule | any | frontend-ui | component | full | rule | checkable | `litespec model check` reports `[litespec/frontend/patterns#implement-a-chosen-pattern-once]` for a named component path that does not exist or an adopted status with no components. Run it at the consumer root. |
| litespec/frontend/patterns#keep-a-visual-registry | [Keep a Visual Registry](https://litespec.dev/4.0.0/frontend/patterns.md#keep-a-visual-registry) | convention | any | frontend-ui | any | full | default | guidance | Which product-added options miss the registry at compact or full widths? Look at the registry command or path the catalog names. |
| litespec/frontend/patterns#keep-one-pattern-catalog | [Keep One Pattern Catalog](https://litespec.dev/4.0.0/frontend/patterns.md#keep-one-pattern-catalog) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `[litespec/frontend/patterns#keep-one-pattern-catalog]` for a missing catalog, a duplicate id, an unknown group, an unknown library pattern, or a renamed option. Run it at the consumer root. |
| litespec/frontend/patterns#keep-the-catalog-platform-neutral | [Keep the Catalog Platform Neutral](https://litespec.dev/4.0.0/frontend/patterns.md#keep-the-catalog-platform-neutral) | rule | any | frontend-ui | any | full | rule | guidance | Which patterns name a component library outside their implementations? Look in the catalog entries outside implementations. |
| litespec/frontend/patterns#promote-pattern-improvements | [Promote Pattern Improvements](https://litespec.dev/4.0.0/frontend/patterns.md#promote-pattern-improvements) | convention | any | frontend-ui | any | full | default | guidance | Which accepted product-neutral proposals never reached the LiteSpec pattern page as new or refined options? Look in the LiteSpec pattern pages and the accepted proposals. |
| litespec/frontend/patterns#record-every-option-considered | [Record Every Option Considered](https://litespec.dev/4.0.0/frontend/patterns.md#record-every-option-considered) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `[litespec/frontend/patterns#record-every-option-considered]` for a choice or extension naming no recorded option, and the catalog schema requires at least two options with rationale and cost. Run it at the consumer root. |
| litespec/frontend/patterns#record-who-chose | [Record Who Chose](https://litespec.dev/4.0.0/frontend/patterns.md#record-who-chose) | rule | any | frontend-ui | any | full | rule | guidance | Which decisions lack `owner` or `recommended`, pose an agent proposal as an owner choice, or change the choice without naming their record? Look in the catalog decisions. |
| litespec/frontend/patterns#report-pattern-feedback-after-the-work | [Report Pattern Feedback After the Work](https://litespec.dev/4.0.0/frontend/patterns.md#report-pattern-feedback-after-the-work) | convention | any | frontend-ui | any | full | default | guidance | Which completion reports carry a pattern proposal without its pattern id, change, reason, or affected option? Look in the completion reports. |
| litespec/frontend/patterns#start-from-a-litespec-pattern | [Start from a LiteSpec Pattern](https://litespec.dev/4.0.0/frontend/patterns.md#start-from-a-litespec-pattern) | convention | any | frontend-ui | any | full | default | guidance | Which entries lack `library` without recording why no pattern fits, or rename the pattern option ids and names? Look in the catalog entries. |
| litespec/frontend/patterns#state-the-implementation-status | [State the Implementation Status](https://litespec.dev/4.0.0/frontend/patterns.md#state-the-implementation-status) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `[litespec/frontend/patterns#state-the-implementation-status]` for a partial or pending entry with no gap. Run it at the consumer root. |
| litespec/frontend/patterns#update-the-catalog-with-the-code | [Update the Catalog with the Code](https://litespec.dev/4.0.0/frontend/patterns.md#update-the-catalog-with-the-code) | rule | any | frontend-ui | any | full | rule | guidance | Which option switches, added options, or extensions land without their implementation, and which single-route departures name no decision record? Look in the change diffs and the catalog entries. |
| litespec/frontend/patterns/admin-screens#api-keys-and-webhooks | [API Keys and Webhooks](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#api-keys-and-webhooks) | pattern | any | frontend-ui | - | full | default | guidance | Which built credential or delivery list breaks from the chosen wireframe? Open the built keys screen, with grants in line, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/admin-screens#bringing-data-from-spreadsheets | [Bringing Data from Spreadsheets](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#bringing-data-from-spreadsheets) | pattern | any | frontend-ui | - | full | default | guidance | Which built column match or refused row breaks from the chosen wireframe? Open the built import flow beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/admin-screens#budget-codes-and-advances | [Budget Codes and Advances](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#budget-codes-and-advances) | pattern | any | frontend-ui | - | full | default | guidance | Which built code table or claims list breaks from the chosen wireframe? Open the built budget screens beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/admin-screens#connecting-the-payment-account | [Connecting the Payment Account](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#connecting-the-payment-account) | pattern | any | frontend-ui | - | full | default | guidance | Which built connection step or method list breaks from the chosen wireframe? Open the built payment setup beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/admin-screens#show-a-new-secret-once | [Show a New Secret Once](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#show-a-new-secret-once) | rule | any | frontend-ui | - | full | rule | guidance | Which newly created credential stays readable after its creation dialog closes? Open the creation flow for keys and secrets on a built settings screen. |
| litespec/frontend/patterns/admin-screens#show-what-a-role-allows-before-granting-it | [Show What a Role Allows Before Granting It](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#show-what-a-role-allows-before-granting-it) | rule | any | frontend-ui | - | full | rule | guidance | Which invitation or role change goes out without listing the chosen capabilities? Open the invite and role-change flows on a built team screen. |
| litespec/frontend/patterns/admin-screens#supplier-invoice | [Supplier Invoice](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#supplier-invoice) | pattern | any | frontend-ui | - | full | default | guidance | Which built invoice sheet or usage line breaks from the chosen wireframe? Open the built billing screens beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/admin-screens#team-members-and-their-roles | [Team Members and Their Roles](https://litespec.dev/4.0.0/frontend/patterns/admin-screens.md#team-members-and-their-roles) | pattern | any | frontend-ui | - | full | default | guidance | Which built staff list or invitation breaks from the chosen wireframe? Open the built team screen, with its invitations, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#changing-a-record-that-already-exists | [Changing a Record That Already Exists](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#changing-a-record-that-already-exists) | pattern | any | frontend-ui | - | full | default | guidance | Which built edit flow differs from the wireframe its catalog entry chose? Open the built save, autosave, and blocked edits beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#changing-something-that-has-already-happened | [Changing Something That Has Already Happened](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#changing-something-that-has-already-happened) | pattern | any | frontend-ui | - | full | default | guidance | Which built correction flow differs from the wireframe its catalog entry chose? Open the built past-change edits, reverses, and version histories beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#confirm-or-undo-every-removal | [Confirm or Undo Every Removal](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#confirm-or-undo-every-removal) | rule | any | frontend-ui | - | full | rule | guidance | Which built removal runs without asking and offers no way back? Open the archive, delete, void, and suspend flows on built screens. |
| litespec/frontend/patterns/create-edit-remove#creating-a-record-and-then-filling-it-in | [Creating a Record and Then Filling It In](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#creating-a-record-and-then-filling-it-in) | pattern | any | frontend-ui | - | full | default | guidance | Which built draft-first flow differs from the wireframe its catalog entry chose? Open the built name-first creates and setup guides beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#creating-one-record | [Creating One Record](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#creating-one-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built creation form differs from the wireframe its catalog entry chose? Open the built dialog, page, and inline starts beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#duplicating-a-record | [Duplicating a Record](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#duplicating-a-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built copy flow differs from the wireframe its catalog entry chose? Open the built duplicate dialogs and row-menu copies beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#inviting-a-team-member | [Inviting a Team Member](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#inviting-a-team-member) | pattern | any | frontend-ui | - | full | default | guidance | Which built join flow differs from the wireframe its catalog entry chose? Open the built email invites, links, and pending lists beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#publishing-and-unpublishing-a-policy | [Publishing and Unpublishing a Policy](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#publishing-and-unpublishing-a-policy) | pattern | any | frontend-ui | - | full | default | guidance | Which built policy-state flow differs from the wireframe its catalog entry chose? Open the built publish, pause, and per-channel controls beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#putting-a-list-in-order-by-hand | [Putting a List in Order by Hand](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#putting-a-list-in-order-by-hand) | pattern | any | frontend-ui | - | full | default | guidance | Which built manual ordering differs from the wireframe its catalog entry chose? Open the built drag handles, move commands, and pinned rows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#removing-several-at-once | [Removing Several at Once](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#removing-several-at-once) | pattern | any | frontend-ui | - | full | default | guidance | Which built bulk removal differs from the wireframe its catalog entry chose? Open the built count-and-money dialogs and background jobs beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#removing-something | [Removing Something](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#removing-something) | pattern | any | frontend-ui | - | full | default | guidance | Which built single removal differs from the wireframe its catalog entry chose? Open the built archive, delete, and trash flows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#restoring-an-archived-record | [Restoring an Archived Record](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#restoring-an-archived-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built restore flow differs from the wireframe its catalog entry chose? Open the built archived views and undo toasts beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#scheduling-a-change-for-later | [Scheduling a Change for Later](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#scheduling-a-change-for-later) | pattern | any | frontend-ui | - | full | default | guidance | Which built dated change differs from the wireframe its catalog entry chose? Open the built live windows and scheduled codes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/create-edit-remove#show-the-created-record | [Show the Created Record](https://litespec.dev/4.0.0/frontend/patterns/create-edit-remove.md#show-the-created-record) | rule | any | frontend-ui | - | full | rule | guidance | Which built create flow ends away from its new record? Open the create dialogs, pages, and bulk flows on built screens. |
| litespec/frontend/patterns/dialogs-and-overlays#bar-that-stays-while-the-reader-works | [Bar That Stays While the Reader Works](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#bar-that-stays-while-the-reader-works) | pattern | any | frontend-ui | - | full | default | guidance | Which built persistent band departs from the wireframe its catalog entry chose? Open the built unsaved-work, deadline, and read-only bars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#bottom-sheet-on-a-phone | [Bottom Sheet on a Phone](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#bottom-sheet-on-a-phone) | pattern | any | frontend-ui | - | full | default | guidance | Which built thumb-reach sheet departs from the wireframe its catalog entry chose? Open the built half, full, and filter sheets beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#confirming-a-command-that-cannot-be-taken-back | [Confirming a Command That Cannot Be Taken Back](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#confirming-a-command-that-cannot-be-taken-back) | pattern | any | frontend-ui | - | full | default | guidance | Which built irreversible step departs from the wireframe its catalog entry chose? Open the built typed confirms and undo offers beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#context-menu-where-the-pointer-is | [Context Menu Where the Pointer Is](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#context-menu-where-the-pointer-is) | pattern | any | frontend-ui | - | full | default | guidance | Which built right-click menu departs from the wireframe its catalog entry chose? Open the built row, bulk, and empty-space menus beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#dialog-with-a-long-body-and-a-sticky-footer | [Dialog with a Long Body and a Sticky Footer](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#dialog-with-a-long-body-and-a-sticky-footer) | pattern | any | frontend-ui | - | full | default | guidance | Which built scrolling dialog departs from the wireframe its catalog entry chose? Open the built pinned footers and collapsed sections beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#drawer-beside-the-list | [Drawer Beside the List](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#drawer-beside-the-list) | pattern | any | frontend-ui | - | full | default | guidance | Which built side preview departs from the wireframe its catalog entry chose? Open the built drawer variants over and next to the list, with the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#keyboard-shortcut-help-overlay | [Keyboard Shortcut Help Overlay](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#keyboard-shortcut-help-overlay) | pattern | any | frontend-ui | - | full | default | guidance | Which built shortcut list departs from the wireframe its catalog entry chose? Open the built grouped grids and palette shortcut views beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#menu-of-a-rows-commands | [Menu of a Row's Commands](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#menu-of-a-rows-commands) | pattern | any | frontend-ui | - | full | default | guidance | Which built row menu departs from the wireframe its catalog entry chose? Open the built grouped menus, split buttons, and search fields beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#name-the-command-on-a-confirm-action | [Name the Command on a Confirm Action](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#name-the-command-on-a-confirm-action) | rule | any | frontend-ui | - | full | rule | guidance | Which built confirmation labels its commit button with a bare Yes or OK? Open the confirm dialogs on built screens. |
| litespec/frontend/patterns/dialogs-and-overlays#return-focus-when-an-overlay-closes | [Return Focus When an Overlay Closes](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#return-focus-when-an-overlay-closes) | rule | any | frontend-ui | - | full | rule | guidance | Which built overlay leaves focus lost after it closes? Open and dismiss each dialog, drawer, popover, menu, and toast on built screens with a keyboard. |
| litespec/frontend/patterns/dialogs-and-overlays#short-panel-that-opens-beside-a-control | [Short Panel That Opens Beside a Control](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#short-panel-that-opens-beside-a-control) | pattern | any | frontend-ui | - | full | default | guidance | Which built hover card or hint departs from the wireframe its catalog entry chose? Open the built popovers, previews, and coach marks beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#short-task-in-a-dialog | [Short Task in a Dialog](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#short-task-in-a-dialog) | pattern | any | frontend-ui | - | full | default | guidance | Which built two-input task departs from the wireframe its catalog entry chose? Open the built small dialogs and palette runs beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/dialogs-and-overlays#toast-at-the-edge-of-the-screen | [Toast at the Edge of the Screen](https://litespec.dev/4.0.0/frontend/patterns/dialogs-and-overlays.md#toast-at-the-edge-of-the-screen) | pattern | any | frontend-ui | - | full | default | guidance | Which built edge notice departs from the wireframe its catalog entry chose? Open the built confirmations, undos, and refusal slots beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#back-office-is-down-for-a-short-while | [Back Office Is Down for a Short While](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#back-office-is-down-for-a-short-while) | pattern | any | frontend-ui | - | full | default | guidance | Which built maintenance screen departs from the wireframe its catalog entry chose? Open the built countdowns and read-only windows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#command-that-worked | [Command That Worked](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#command-that-worked) | pattern | any | frontend-ui | - | full | default | guidance | Which built success notice departs from the wireframe its catalog entry chose? Open the built confirmations, toasts, and quiet saves beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#command-the-api-refused | [Command the API Refused](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#command-the-api-refused) | pattern | any | frontend-ui | - | full | default | guidance | Which built refusal notice departs from the wireframe its catalog entry chose? Open the built refused commands, with codes and fixes, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#connection-is-gone | [Connection Is Gone](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#connection-is-gone) | pattern | any | frontend-ui | - | full | default | guidance | Which built offline screen departs from the wireframe its catalog entry chose? Open the built stale banners and queued commands beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#fact-somebody-has-to-read-before-acting | [Fact Somebody Has to Read Before Acting](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#fact-somebody-has-to-read-before-acting) | pattern | any | frontend-ui | - | full | default | guidance | Which built must-read notice departs from the wireframe its catalog entry chose? Open the built callouts, hints, and banners beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#keep-the-readers-input-through-a-failure | [Keep the Reader's Input Through a Failure](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#keep-the-readers-input-through-a-failure) | rule | any | frontend-ui | - | full | rule | guidance | Which built form drops typed values after a refused save? Open the failed submits on built forms and check every field. |
| litespec/frontend/patterns/feedback-and-states#loading | [Loading](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#loading) | pattern | any | frontend-ui | - | full | default | guidance | Which built waiting state departs from the wireframe its catalog entry chose? Open the built skeletons, spinners, and progress bars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#nothing-has-ever-existed | [Nothing Has Ever Existed](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#nothing-has-ever-existed) | pattern | any | frontend-ui | - | full | default | guidance | Which built first-run screen departs from the wireframe its catalog entry chose? Open the built empty lists and setup guides beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#nothing-matches-what-was-asked-for | [Nothing Matches What Was Asked For](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#nothing-matches-what-was-asked-for) | pattern | any | frontend-ui | - | full | default | guidance | Which built no-results screen departs from the wireframe its catalog entry chose? Open the built filtered empties and suggestion rows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#reader-may-not-do-this | [Reader May Not Do This](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#reader-may-not-do-this) | pattern | any | frontend-ui | - | full | default | guidance | Which built forbidden view departs from the wireframe its catalog entry chose? Open the built refused pages, absent tabs, and read-only sections beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#sign-in-ran-out | [Sign-In Ran Out](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#sign-in-ran-out) | pattern | any | frontend-ui | - | full | default | guidance | Which built expired session departs from the wireframe its catalog entry chose? Open the built sign-out pages and re-auth dialogs beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#somebody-else-saved-first | [Somebody Else Saved First](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#somebody-else-saved-first) | pattern | any | frontend-ui | - | full | default | guidance | Which built conflict screen departs from the wireframe its catalog entry chose? Open the built field-by-field merges and presence cues beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#something-went-wrong-on-our-side | [Something Went Wrong on Our Side](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#something-went-wrong-on-our-side) | pattern | any | frontend-ui | - | full | default | guidance | Which built server-failure screen departs from the wireframe its catalog entry chose? Open the built outage pages and retrying bars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#state-what-failed-and-the-next-step | [State What Failed and the Next Step](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#state-what-failed-and-the-next-step) | rule | any | frontend-ui | - | full | rule | guidance | Which built failure message omits the cause or the way forward? Open the refused commands and failed reads on built screens. |
| litespec/frontend/patterns/feedback-and-states#this-record-does-not-exist | [This Record Does Not Exist](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#this-record-does-not-exist) | pattern | any | frontend-ui | - | full | default | guidance | Which built missing-record screen departs from the wireframe its catalog entry chose? Open the built not-found and gone states beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#too-many-tries | [Too Many Tries](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#too-many-tries) | pattern | any | frontend-ui | - | full | default | guidance | Which built rate-limit screen departs from the wireframe its catalog entry chose? Open the built waits, queues, and 429 pages beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/feedback-and-states#work-that-runs-without-you | [Work That Runs Without You](https://litespec.dev/4.0.0/frontend/patterns/feedback-and-states.md#work-that-runs-without-you) | pattern | any | frontend-ui | - | full | default | guidance | Which built background job departs from the wireframe its catalog entry chose? Open the built trays, job sections, and progress rows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#address-field | [Address Field](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#address-field) | pattern | any | frontend-ui | - | full | default | guidance | Which built location input breaks from the wireframe its catalog entry chose? Open the built lookups, country shapes, and map pins beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#capacity-field | [Capacity Field](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#capacity-field) | pattern | any | frontend-ui | - | full | default | guidance | Which built ceiling input breaks from the wireframe its catalog entry chose? Open the built splits, steppers, and overage messages beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#choosing-a-record | [Choosing a Record](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#choosing-a-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built record picker breaks from the wireframe its catalog entry chose? Open the built searchable pickers and recent lists beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#choosing-one-of-a-few-options | [Choosing One of a Few Options](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#choosing-one-of-a-few-options) | pattern | any | frontend-ui | - | full | default | guidance | Which built single-choice control breaks from the wireframe its catalog entry chose? Open the built radios, segments, and plan cards beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#color-field-for-the-mail-accent | [Color Field for the Mail Accent](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#color-field-for-the-mail-accent) | pattern | any | frontend-ui | - | full | default | guidance | Which built accent picker breaks from the wireframe its catalog entry chose? Open the built swatches, wells, and contrast readouts beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#date-and-time-field | [Date and Time Field](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#date-and-time-field) | pattern | any | frontend-ui | - | full | default | guidance | Which built calendar input breaks from the wireframe its catalog entry chose? Open the built date, duration, and range fields beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#email-body-editor | [Email Body Editor](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#email-body-editor) | pattern | any | frontend-ui | - | full | default | guidance | Which built message composer breaks from the wireframe its catalog entry chose? Open the built subject-plus-body forms and variable chips beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#keep-entered-values-after-a-refused-submit | [Keep Entered Values After a Refused Submit](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#keep-entered-values-after-a-refused-submit) | rule | any | frontend-ui | - | full | rule | guidance | Which built form drops typed values after a refused submit? Open the refused submits on built forms and check every field. |
| litespec/frontend/patterns/forms-and-fields#money-field | [Money Field](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#money-field) | pattern | any | frontend-ui | - | full | default | guidance | Which built amount input breaks from the wireframe its catalog entry chose? Open the built amount, currency, and total fields beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#name-every-field-with-a-visible-label | [Name Every Field with a Visible Label](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#name-every-field-with-a-visible-label) | rule | any | frontend-ui | - | full | rule | guidance | Which built input lacks a shown label naming its value? Open every form on built screens and read each field's label. |
| litespec/frontend/patterns/forms-and-fields#picking-a-period | [Picking a Period](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#picking-a-period) | pattern | any | frontend-ui | - | full | default | guidance | Which built range picker breaks from the wireframe its catalog entry chose? Open the built presets, month pickers, and painted calendars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#repeatable-group-for-budget-codes | [Repeatable Group for Budget Codes](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#repeatable-group-for-budget-codes) | pattern | any | frontend-ui | - | full | default | guidance | Which built code group breaks from the wireframe its catalog entry chose? Open the built stacked cards and inline tables beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#reporting-a-refused-submit | [Reporting a Refused Submit](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#reporting-a-refused-submit) | pattern | any | frontend-ui | - | full | default | guidance | Which built submit-error report breaks from the wireframe its catalog entry chose? Open the built summaries and per-field messages beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#slug-or-url-field-with-a-preview | [Slug or URL Field with a Preview](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#slug-or-url-field-with-a-preview) | pattern | any | frontend-ui | - | full | default | guidance | Which built address input breaks from the wireframe its catalog entry chose? Open the built slugs, transliterations, and availability checks beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#switch-or-a-checkbox | [Switch or a Checkbox](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#switch-or-a-checkbox) | pattern | any | frontend-ui | - | full | default | guidance | Which built toggle breaks from the wireframe its catalog entry chose? Open the built switches, checkboxes, and instant applies beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#tag-input | [Tag Input](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#tag-input) | pattern | any | frontend-ui | - | full | default | guidance | Which built label chip breaks from the wireframe its catalog entry chose? Open the built chips, popover lists, and inherited tags beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#text-field-and-its-states | [Text Field and Its States](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#text-field-and-its-states) | pattern | any | frontend-ui | - | full | default | guidance | Which built text input breaks from the wireframe its catalog entry chose? Open the built labels, counts, and growing areas beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#upload-field | [Upload Field](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#upload-field) | pattern | any | frontend-ui | - | full | default | guidance | Which built file input breaks from the wireframe its catalog entry chose? Open the built drop zones, CSV reads, and progress rows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/forms-and-fields#work-that-is-not-saved | [Work That Is Not Saved](https://litespec.dev/4.0.0/frontend/patterns/forms-and-fields.md#work-that-is-not-saved) | pattern | any | frontend-ui | - | full | default | guidance | Which built unsaved marker breaks from the wireframe its catalog entry chose? Open the built dirty flags, drafts, and save bars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#align-money-to-the-right-with-its-currency | [Align Money to the Right with Its Currency](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#align-money-to-the-right-with-its-currency) | rule | any | frontend-ui | - | full | rule | guidance | Which built money column centers its figures or hides a currency? Open the money columns on built tables. |
| litespec/frontend/patterns/lists-and-tables#bulk-action-bar | [Bulk Action Bar](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#bulk-action-bar) | pattern | any | frontend-ui | - | full | default | guidance | Which built selection bar breaks from the wireframe its catalog entry chose? Open the built count bars, pills, and dropdowns beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#choosing-the-columns | [Choosing the Columns](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#choosing-the-columns) | pattern | any | frontend-ui | - | full | default | guidance | Which built column set breaks from the wireframe its catalog entry chose? Open the built choosers and saved views beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#exporting-the-list | [Exporting the List](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#exporting-the-list) | pattern | any | frontend-ui | - | full | default | guidance | Which built download flow breaks from the wireframe its catalog entry chose? Open the built CSV buttons, dialogs, and histories beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#filters | [Filters](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#filters) | pattern | any | frontend-ui | - | full | default | guidance | Which built filter control breaks from the wireframe its catalog entry chose? Open the built chips, panels, and facet buttons beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#grouped-rows | [Grouped Rows](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#grouped-rows) | pattern | any | frontend-ui | - | full | default | guidance | Which built group header breaks from the wireframe its catalog entry chose? Open the built day, trip, and state groups beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#inline-row-expansion | [Inline Row Expansion](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#inline-row-expansion) | pattern | any | frontend-ui | - | full | default | guidance | Which built expandable row breaks from the wireframe its catalog entry chose? Open the built expense lines, timelines, and expand-all controls beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#keep-a-lists-view-in-its-address | [Keep a List's View in Its Address](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#keep-a-lists-view-in-its-address) | rule | any | frontend-ui | - | full | rule | guidance | Which built list loses its filters, sort, or page on refresh? Open built lists, change the view, and reload the address. |
| litespec/frontend/patterns/lists-and-tables#list-on-a-phone | [List on a Phone](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#list-on-a-phone) | pattern | any | frontend-ui | - | full | default | guidance | Which built narrow list breaks from the wireframe its catalog entry chose? Open the built two-line rows, cards, and sticky columns at 390 pixels beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#money-column | [Money Column](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#money-column) | pattern | any | frontend-ui | - | full | default | guidance | Which built amount column breaks from the wireframe its catalog entry chose? Open the built aligned figures, shares, and totals footers beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#pagination | [Pagination](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#pagination) | pattern | any | frontend-ui | - | full | default | guidance | Which built page control breaks from the wireframe its catalog entry chose? Open the built chevrons, load-more buttons, and compact pagers beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#pinned-and-resizing-columns | [Pinned and Resizing Columns](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#pinned-and-resizing-columns) | pattern | any | frontend-ui | - | full | default | guidance | Which built fixed column breaks from the wireframe its catalog entry chose? Open the built frozen first columns and resize handles beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#row-actions | [Row Actions](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#row-actions) | pattern | any | frontend-ui | - | full | default | guidance | Which built row command breaks from the wireframe its catalog entry chose? Open the built inline actions and row menus beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#row-density | [Row Density](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#row-density) | pattern | any | frontend-ui | - | full | default | guidance | Which built row height breaks from the wireframe its catalog entry chose? Open the built 24, 32, 40, and 48 pixel rows beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#searching-with-highlighted-matches | [Searching with Highlighted Matches](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#searching-with-highlighted-matches) | pattern | any | frontend-ui | - | full | default | guidance | Which built list search breaks from the wireframe its catalog entry chose? Open the built highlighted cells and match columns beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#sorting | [Sorting](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#sorting) | pattern | any | frontend-ui | - | full | default | guidance | Which built sort control breaks from the wireframe its catalog entry chose? Open the built arrows, stacks, and phone sort controls beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#status-in-a-column | [Status in a Column](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#status-in-a-column) | pattern | any | frontend-ui | - | full | default | guidance | Which built state badge breaks from the wireframe its catalog entry chose? Open the built tones, dots, and progress steps beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#tables-own-states | [Table's Own States](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#tables-own-states) | pattern | any | frontend-ui | - | full | default | guidance | Which built table state breaks from the wireframe its catalog entry chose? Open the built no-data, failed-read, and slow-read states beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/lists-and-tables#trips-as-a-grid | [Trips as a Grid](https://litespec.dev/4.0.0/frontend/patterns/lists-and-tables.md#trips-as-a-grid) | pattern | any | frontend-ui | - | full | default | guidance | Which built trip overview breaks from the wireframe its catalog entry chose? Open the built cards, calendars, and table-grid toggles beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#choosing-a-period | [Choosing a Period](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#choosing-a-period) | pattern | any | frontend-ui | - | full | default | guidance | Which built period control differs from the wireframe its catalog entry chose? Open the built chevrons, tabs, and painted calendars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#counting-things | [Counting Things](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#counting-things) | pattern | any | frontend-ui | - | full | default | guidance | Which built tally differs from the wireframe its catalog entry chose? Open the built sidebar counts, tiles, and dated claims beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#figure-against-an-earlier-period | [Figure Against an Earlier Period](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#figure-against-an-earlier-period) | pattern | any | frontend-ui | - | full | default | guidance | Which built comparison tile differs from the wireframe its catalog entry chose? Open the built deltas, sparklines, and KPI tables beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#how-much-fits-before-it-breaks | [How Much Fits Before It Breaks](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#how-much-fits-before-it-breaks) | pattern | any | frontend-ui | - | full | default | guidance | Which built dense table differs from the wireframe its catalog entry chose? Open the built 390-pixel lists and pinned first columns beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#numbers-at-phone-width | [Numbers at Phone Width](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#numbers-at-phone-width) | pattern | any | frontend-ui | - | full | default | guidance | Which built narrow figure differs from the wireframe its catalog entry chose? Open the built pairs, per-row figures, and halved charts at 390 pixels beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#show-the-currency-of-every-amount | [Show the Currency of Every Amount](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#show-the-currency-of-every-amount) | rule | any | frontend-ui | - | full | rule | guidance | Which built figure hides its currency? Open the amounts on built tables, statements, and charts. |
| litespec/frontend/patterns/money-time-density#showing-an-identifier | [Showing an Identifier](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#showing-an-identifier) | pattern | any | frontend-ui | - | full | default | guidance | Which built code display differs from the wireframe its catalog entry chose? Open the built monospaced, labeled, and copyable codes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#spend-against-the-budget | [Spend Against the Budget](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#spend-against-the-budget) | pattern | any | frontend-ui | - | full | default | guidance | Which built fill-rate view differs from the wireframe its catalog entry chose? Open the built bars, countdowns, and capacity tables beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#spending-by-expense-kind | [Spending by Expense Kind](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#spending-by-expense-kind) | pattern | any | frontend-ui | - | full | default | guidance | Which built mix chart differs from the wireframe its catalog entry chose? Open the built bars, tiles, and donuts beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#spending-over-time | [Spending over Time](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#spending-over-time) | pattern | any | frontend-ui | - | full | default | guidance | Which built trend chart differs from the wireframe its catalog entry chose? Open the built columns, areas, and sparklines beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#state-the-time-zone-of-a-shared-moment | [State the Time Zone of a Shared Moment](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#state-the-time-zone-of-a-shared-moment) | rule | any | frontend-ui | - | full | rule | guidance | Which built shared moment omits its zone? Open the dates and times on built screens read across zones. |
| litespec/frontend/patterns/money-time-density#statement-that-adds-up | [Statement That Adds Up](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#statement-that-adds-up) | pattern | any | frontend-ui | - | full | default | guidance | Which built totals page differs from the wireframe its catalog entry chose? Open the built groups, subtotals, and payout endings beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#two-vat-rates-on-one-page | [Two VAT Rates on One Page](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#two-vat-rates-on-one-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built mixed-rate view differs from the wireframe its catalog entry chose? Open the built splits, badges, and per-rate summaries beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#vendors-invoice-to-the-company | [Vendor's Invoice to the Company](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#vendors-invoice-to-the-company) | pattern | any | frontend-ui | - | full | default | guidance | Which built supplier bill differs from the wireframe its catalog entry chose? Open the built documents, states, and usage lines beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#when-the-money-arrives | [When the Money Arrives](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#when-the-money-arrives) | pattern | any | frontend-ui | - | full | default | guidance | Which built payout view differs from the wireframe its catalog entry chose? Open the built upcoming, weekly, and journey views beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#writing-a-moment | [Writing a Moment](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#writing-a-moment) | pattern | any | frontend-ui | - | full | default | guidance | Which built date text differs from the wireframe its catalog entry chose? Open the built absolute, relative, and weekday forms beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/money-time-density#writing-an-amount | [Writing an Amount](https://litespec.dev/4.0.0/frontend/patterns/money-time-density.md#writing-an-amount) | pattern | any | frontend-ui | - | full | default | guidance | Which built money text differs from the wireframe its catalog entry chose? Open the built codes, symbols, and red negatives beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#account-menu | [Account Menu](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#account-menu) | pattern | any | frontend-ui | - | full | default | guidance | Which built sign-in menu differs from the wireframe its catalog entry chose? Open the built account controls, in the sidebar foot or header, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#breadcrumb | [Breadcrumb](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#breadcrumb) | pattern | any | frontend-ui | - | full | default | guidance | Which built parent chain differs from the wireframe its catalog entry chose? Open a built four-level trail, with its truncation and parent links, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#command-palette | [Command Palette](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#command-palette) | pattern | any | frontend-ui | - | full | default | guidance | Which built jump-to dialog breaks from the wireframe its catalog entry chose? Open the built palette, with its grouped results and recent items, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#give-every-page-its-own-address | [Give Every Page Its Own Address](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#give-every-page-its-own-address) | rule | any | frontend-ui | - | full | rule | guidance | Which built screen cannot be opened directly from its copied link? Paste three copied addresses into a fresh tab. |
| litespec/frontend/patterns/navigation#header-bar | [Header Bar](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#header-bar) | pattern | any | frontend-ui | - | full | default | guidance | Which built top band breaks from the wireframe its catalog entry chose? Open the built trip header, with its company name and deployment identity, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#help-and-support | [Help and Support](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#help-and-support) | pattern | any | frontend-ui | - | full | default | guidance | Which built guidance entry differs from the wireframe its catalog entry chose? Open the built help surfaces, from sidebar entry to contextual hints, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#icons-in-the-frame | [Icons in the Frame](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#icons-in-the-frame) | pattern | any | frontend-ui | - | full | default | guidance | Which built label or action carries an icon outside the recorded set? Open the built frame, with its labeled actions and marked current item, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#language-and-theme | [Language and Theme](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#language-and-theme) | pattern | any | frontend-ui | - | full | default | guidance | Which built switch differs from the wireframe its catalog entry chose? Open the built locale and appearance controls, in the header and account menu, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#mark-the-current-section | [Mark the Current Section](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#mark-the-current-section) | rule | any | frontend-ui | - | full | rule | guidance | Which built screen fails to highlight the area holding its open page? Open three built screens reached by link, notification, and search. |
| litespec/frontend/patterns/navigation#notification-inbox | [Notification Inbox](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#notification-inbox) | pattern | any | frontend-ui | - | full | default | guidance | Which built attention list breaks from the wireframe its catalog entry chose? Open the built inbox and bell, with triage and unread states, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#phone-navigation | [Phone Navigation](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#phone-navigation) | pattern | any | frontend-ui | - | full | default | guidance | Which built narrow-screen frame differs from the wireframe its catalog entry chose? Open the built phone layout, with its bottom bar or sheet, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#sidebar | [Sidebar](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#sidebar) | pattern | any | frontend-ui | - | full | default | guidance | Which built area list breaks from the wireframe its catalog entry chose? Open the built console frame, with its grouped areas and marked item, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#tabs-within-a-page | [Tabs Within a Page](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#tabs-within-a-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built tab row differs from the wireframe its catalog entry chose? Open the built in-page tabs, with the active tab in the URL, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/navigation#workspace-switcher | [Workspace Switcher](https://litespec.dev/4.0.0/frontend/patterns/navigation.md#workspace-switcher) | pattern | any | frontend-ui | - | full | default | guidance | Which built cost centre picker breaks from the wireframe its catalog entry chose? Open the built switcher, with recent workspaces first, beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#calendar-or-schedule-page | [Calendar or Schedule Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#calendar-or-schedule-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built date view breaks from the wireframe its catalog entry chose? Open the built month grids, agendas, and week lanes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#editor-page | [Editor Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#editor-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built preview screen breaks from the wireframe its catalog entry chose? Open the built form-plus-preview splits and device frames beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#error-or-not-found-page | [Error or Not-Found Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#error-or-not-found-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built dead end breaks from the wireframe its catalog entry chose? Open the built not-found, outage, and refused views beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#form-page | [Form Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#form-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built input screen breaks from the wireframe its catalog entry chose? Open the built sections, steppers, and save bars beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#home-page | [Home Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#home-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built start screen breaks from the wireframe its catalog entry chose? Open the built queues, tiles, and next actions beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#list-page | [List Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#list-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built collection screen breaks from the wireframe its catalog entry chose? Open the built searches, views, and play modes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#live-operations-page | [Live Operations Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#live-operations-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built wall display breaks from the wireframe its catalog entry chose? Open the built counts, cost centres, and exception views beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#name-the-page-in-one-heading | [Name the Page in One Heading](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#name-the-page-in-one-heading) | rule | any | frontend-ui | - | full | rule | guidance | Which built screen splits its title across headings or omits it? Open every built page and read its top-level heading. |
| litespec/frontend/patterns/page-frames#onboarding-or-setup-page | [Onboarding or Setup Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#onboarding-or-setup-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built first-run guide breaks from the wireframe its catalog entry chose? Open the built checklists, wizards, and templates beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#outcome-page | [Outcome Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#outcome-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built result screen breaks from the wireframe its catalog entry chose? Open the built statements, references, and refusal outcomes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#queue | [Queue](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#queue) | pattern | any | frontend-ui | - | full | default | guidance | Which built batch-selection screen breaks from the wireframe its catalog entry chose? Open the built select-all banners and play modes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#record-drawer | [Record Drawer](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#record-drawer) | pattern | any | frontend-ui | - | full | default | guidance | Which built side record breaks from the wireframe its catalog entry chose? Open the built read-only, edit, and timeline drawers beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#record-page | [Record Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#record-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built single-record screen breaks from the wireframe its catalog entry chose? Open the built summaries, tabs, and asides beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#report-page | [Report Page](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#report-page) | pattern | any | frontend-ui | - | full | default | guidance | Which built figures screen breaks from the wireframe its catalog entry chose? Open the built period pickers and breakdown tabs beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#settings-home | [Settings Home](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#settings-home) | pattern | any | frontend-ui | - | full | default | guidance | Which built setup index breaks from the wireframe its catalog entry chose? Open the built grouped links, cards, and checklists beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/page-frames#show-one-primary-action-in-a-page-frame | [Show One Primary Action in a Page Frame](https://litespec.dev/4.0.0/frontend/patterns/page-frames.md#show-one-primary-action-in-a-page-frame) | rule | any | frontend-ui | - | full | rule | guidance | Which built frame carries two primary actions outside rows and overlays? Open every built page frame and count the primary actions. |
| litespec/frontend/patterns/record-detail#expense-record | [Expense Record](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#expense-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built worked expense differs from the wireframe its catalog entry chose? Open the built summary, tabs, and phone expense screens beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#hold-built-record-headers-to-one-primary-action | [Hold Built Record Headers to One Primary Action](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#hold-built-record-headers-to-one-primary-action) | rule | any | frontend-ui | - | full | rule | guidance | Which built record header holds more than one primary action? Open the built record screens and count the primary actions. |
| litespec/frontend/patterns/record-detail#keep-destructive-commands-out-of-the-primary-place | [Keep Destructive Commands Out of the Primary Place](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#keep-destructive-commands-out-of-the-primary-place) | rule | any | frontend-ui | - | full | rule | guidance | Which built record header hands a destructive command the primary style? Open the headers on built record screens and read each command's tone. |
| litespec/frontend/patterns/record-detail#previous-and-next-record | [Previous and Next Record](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#previous-and-next-record) | pattern | any | frontend-ui | - | full | default | guidance | Which built neighbor step differs from the wireframe its catalog entry chose? Open the built chevrons, drawers, and jump searches beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#property-list-with-copy | [Property List with Copy](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#property-list-with-copy) | pattern | any | frontend-ui | - | full | default | guidance | Which built copyable fact differs from the wireframe its catalog entry chose? Open the built identifiers, hovers, and truncations beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-aside | [Record Aside](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-aside) | pattern | any | frontend-ui | - | full | default | guidance | Which built side column differs from the wireframe its catalog entry chose? Open the built history, decisions, and related asides beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-attachments | [Record Attachments](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-attachments) | pattern | any | frontend-ui | - | full | default | guidance | Which built file section differs from the wireframe its catalog entry chose? Open the built lists, thumbnails, and drop zones beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-change-history | [Record Change History](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-change-history) | pattern | any | frontend-ui | - | full | default | guidance | Which built audit trail differs from the wireframe its catalog entry chose? Open the built tabs, panels, and per-field histories beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-header | [Record Header](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-header) | pattern | any | frontend-ui | - | full | default | guidance | Which built title row differs from the wireframe its catalog entry chose? Open the built states, facts, and overflow menus beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-header-on-a-phone | [Record Header on a Phone](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-header-on-a-phone) | pattern | any | frontend-ui | - | full | default | guidance | Which built narrow title row differs from the wireframe its catalog entry chose? Open the built stacked headers and foot action bars at 390 pixels beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-notes | [Record Notes](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-notes) | pattern | any | frontend-ui | - | full | default | guidance | Which built annotation feed differs from the wireframe its catalog entry chose? Open the built composers, mixes, and resolved piles beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-summary | [Record Summary](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-summary) | pattern | any | frontend-ui | - | full | default | guidance | Which built fact block differs from the wireframe its catalog entry chose? Open the built key values, figures, and tiles beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-tabs | [Record Tabs](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-tabs) | pattern | any | frontend-ui | - | full | default | guidance | Which built facet row differs from the wireframe its catalog entry chose? Open the built counts, icons, and phone selects beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-the-reader-may-not-change | [Record the Reader May Not Change](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-the-reader-may-not-change) | pattern | any | frontend-ui | - | full | default | guidance | Which built locked record differs from the wireframe its catalog entry chose? Open the built refused commands, banners, and withheld fields beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#record-timeline | [Record Timeline](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#record-timeline) | pattern | any | frontend-ui | - | full | default | guidance | Which built event feed differs from the wireframe its catalog entry chose? Open the built day groups, diffs, and note mixes beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#related-records | [Related Records](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#related-records) | pattern | any | frontend-ui | - | full | default | guidance | Which built relation link differs from the wireframe its catalog entry chose? Open the built chains, cards, and counts beside the catalog entry recording the chosen option and its reason. |
| litespec/frontend/patterns/record-detail#show-one-primary-action-in-a-record-header | [Show One Primary Action in a Record Header](https://litespec.dev/4.0.0/frontend/patterns/record-detail.md#show-one-primary-action-in-a-record-header) | rule | any | frontend-ui | - | full | rule | checkable | `litespec-maintain validate` emits `PATTERN_INVALID` for a wireframe header holding two primary actions. |
| litespec/frontend/rendering#build-the-server-data-cache-per-request | [Build the Server Data Cache per Request](https://litespec.dev/4.0.0/frontend/rendering.md#build-the-server-data-cache-per-request) | rule | any | frontend-ui | any | full | rule | guidance | Which server rendering reuses a data cache across requests instead of constructing it inside each request? Look in the server request setup. |
| litespec/frontend/rendering#keep-address-parameters-validated-by-a-schema | [Keep Address Parameters Validated by a Schema](https://litespec.dev/4.0.0/frontend/rendering.md#keep-address-parameters-validated-by-a-schema) | rule | any | frontend-ui | route | full | rule | guidance | Which routes leave address parameters, filters, or page outside a validated schema? Look in the route parameter schemas. |
| litespec/frontend/rendering#keep-authenticated-caching-explicit | [Keep Authenticated Caching Explicit](https://litespec.dev/4.0.0/frontend/rendering.md#keep-authenticated-caching-explicit) | rule | any | frontend-ui | component, route | full | rule | guidance | Which cached actor-specific reads lack a declared cache key, partition, invalidation owner, or security review beside the read definition? Look in the read definitions setting cache keys. |
| litespec/frontend/rendering#keep-layouts-stable | [Keep Layouts Stable](https://litespec.dev/4.0.0/frontend/rendering.md#keep-layouts-stable) | convention | any | frontend-ui | route | full | default | guidance | Which layouts carry a provider that some child route never needs? Look in the layout definitions. |
| litespec/frontend/rendering#keep-proxy-behavior-at-the-edge | [Keep Proxy Behavior at the Edge](https://litespec.dev/4.0.0/frontend/rendering.md#keep-proxy-behavior-at-the-edge) | rule | any | frontend-ui | any | full | rule | guidance | Which proxy rules decide identity or authorization instead of routing only? Look in the proxy rules. |
| litespec/frontend/rendering#keep-server-only-code-identifiable | [Keep Server-Only Code Identifiable](https://litespec.dev/4.0.0/frontend/rendering.md#keep-server-only-code-identifiable) | convention | any | frontend-ui | any | full | default | guidance | Which modules reading request headers, cookies, or server secrets sit in files unnamed or unplaced for the server? Look in the server file names and places. |
| litespec/frontend/rendering#load-each-route-and-each-language-separately | [Load Each Route and Each Language Separately](https://litespec.dev/4.0.0/frontend/rendering.md#load-each-route-and-each-language-separately) | rule | any | frontend-ui | route | full | rule | guidance | Which routes or languages ship in a shared download, or load an icon set or language whole? Look in the route bundles and the dictionary loader. |
| litespec/frontend/rendering#load-route-data-before-rendering | [Load Route Data Before Rendering](https://litespec.dev/4.0.0/frontend/rendering.md#load-route-data-before-rendering) | rule | any | frontend-ui | route | full | rule | guidance | Which routes render before their reads load through the one shared cache? Look in the route loaders and the cache definitions. |
| litespec/frontend/rendering#prefetch-a-route-on-intent | [Prefetch a Route on Intent](https://litespec.dev/4.0.0/frontend/rendering.md#prefetch-a-route-on-intent) | rule | any | frontend-ui | route | full | rule | guidance | Which route prefetches land outside the shared cache, or feed a second router cache? Look in the router prefetch wiring. |
| litespec/frontend/rendering#read-route-data-from-the-route-cache | [Read Route Data from the Route Cache](https://litespec.dev/4.0.0/frontend/rendering.md#read-route-data-from-the-route-cache) | rule | any | frontend-ui | route | full | rule | guidance | Which views read under another key than the cache entry their route filled, or handle a failed read outside the route error boundary? Look in the view data reads and the route loaders. |
| litespec/frontend/rendering#represent-route-states | [Represent Route States](https://litespec.dev/4.0.0/frontend/rendering.md#represent-route-states) | rule | any | frontend-ui | route | full | rule | guidance | Which data-driven routes miss a loading, empty, error, forbidden, not-found, or ready behavior, or leave an absent address outside the shared outcome page? Look in the route state definitions. |
| litespec/frontend/rendering#use-a-shared-layout-for-a-shell | [Use a Shared Layout for a Shell](https://litespec.dev/4.0.0/frontend/rendering.md#use-a-shared-layout-for-a-shell) | convention | any | frontend-ui | route | full | default | guidance | Which shells sit outside a shared layout, or add an address segment? Look in the layout definitions. |
| litespec/frontend/structure#keep-a-route-entry-thin | [Keep a Route Entry Thin](https://litespec.dev/4.0.0/frontend/structure.md#keep-a-route-entry-thin) | rule | any | frontend-ui | route | full | rule | guidance | Which route entries hold reusable logic or reference another route entry? Look in the route entries. |
| litespec/frontend/structure#keep-a-use-case-folder-flat | [Keep a Use Case Folder Flat](https://litespec.dev/4.0.0/frontend/structure.md#keep-a-use-case-folder-flat) | rule | any | frontend-ui | any | full | rule | guidance | Which use-case folders hold a subfolder? Look in the module tree. |
| litespec/frontend/structure#keep-applications-independent | [Keep Applications Independent](https://litespec.dev/4.0.0/frontend/structure.md#keep-applications-independent) | rule | any | frontend-ui | any | full | rule | guidance | Which frontends import source from another frontend? Look in the import statements. |
| litespec/frontend/structure#keep-shared-packages-non-application-specific | [Keep Shared Packages Non Application Specific](https://litespec.dev/4.0.0/frontend/structure.md#keep-shared-packages-non-application-specific) | rule | any | frontend-ui | any | full | rule | guidance | Which shared packages hold page composition, feature state, authentication policy, or application components? Look in the shared package sources. |
| litespec/frontend/structure#locate-cross-route-values-in-the-frame | [Locate Cross-Route Values in the Frame](https://litespec.dev/4.0.0/frontend/structure.md#locate-cross-route-values-in-the-frame) | rule | any | frontend-ui | any | full | rule | guidance | Which client configuration, session read, language choice, permissions, formatting, shell data, or browser uses sit outside the frame? Look in the frame. |
| litespec/frontend/structure#mark-each-route-with-its-screen | [Mark Each Route with Its Screen](https://litespec.dev/4.0.0/frontend/structure.md#mark-each-route-with-its-screen) | rule | any | frontend-ui | route | full | rule | checkable | `litespec model check` reports `mark-missing` (level S) for a route entry with no mark, `mark-count-invalid` (level S) for one with more than one, and `mark-unknown` (level S) for a mark naming no screen of the route's entry point. |
| litespec/frontend/structure#mirror-the-backend-use-case-path-in-kebab-case | [Mirror the Backend Use Case Path in Kebab Case](https://litespec.dev/4.0.0/frontend/structure.md#mirror-the-backend-use-case-path-in-kebab-case) | rule | any | frontend-ui | any | full | rule | guidance | Which use-case folders sit outside `{module}/{aggregate}/{use-case}/` in kebab case, or resolve to no backend folder of the same names? Look in the module tree and the structure test proving the mirror. |
| litespec/frontend/structure#order-imports-from-routes-to-shared-packages | [Order Imports from Routes to Shared Packages](https://litespec.dev/4.0.0/frontend/structure.md#order-imports-from-routes-to-shared-packages) | rule | any | frontend-ui | any | full | rule | guidance | Which imports point against the route to module to frame to shared package direction? Look in the import statements. |
| litespec/frontend/structure#organize-a-frontend-into-frame-routes-and-modules | [Organize a Frontend into Frame, Routes, and Modules](https://litespec.dev/4.0.0/frontend/structure.md#organize-a-frontend-into-frame-routes-and-modules) | rule | any | frontend-ui | any | full | rule | guidance | Which frontend files sit outside the frame, routes, and use-case modules split? Look in the frontend folder roots. |
| litespec/frontend/structure#place-a-shared-file-in-the-folder-that-owns-it | [Place a Shared File in the Folder That Owns It](https://litespec.dev/4.0.0/frontend/structure.md#place-a-shared-file-in-the-folder-that-owns-it) | rule | any | frontend-ui | any | full | rule | guidance | Which files read by several use cases sit outside the narrowest folder holding every reader? Look in the aggregate and module folders. |
| litespec/frontend/structure#place-tests-at-their-ownership-boundary | [Place Tests at Their Ownership Boundary](https://litespec.dev/4.0.0/frontend/structure.md#place-tests-at-their-ownership-boundary) | convention | any | frontend-ui | test | full | default | guidance | Which logic tests sit outside their module, and which browser suites sit outside the one tests root per frontend? Look in the module folders and the tests roots. |
| litespec/frontend/structure#reject-a-folder-name-that-owns-nothing | [Reject a Folder Name That Owns Nothing](https://litespec.dev/4.0.0/frontend/structure.md#reject-a-folder-name-that-owns-nothing) | rule | any | frontend-ui | any | full | rule | guidance | Which folders under an application's `src` carry a refused name? Look in the application folder tree. |
| litespec/frontend/structure#use-explicit-public-entry-points-for-shared-packages | [Use Explicit Public Entry Points for Shared Packages](https://litespec.dev/4.0.0/frontend/structure.md#use-explicit-public-entry-points-for-shared-packages) | convention | any | frontend-ui | any | full | default | guidance | Which application imports reach past the documented public entry points of shared packages? Look in the application imports and the package manifests. |
| litespec/frontend/testing#assert-each-declared-refusal-by-its-code | [Assert Each Declared Refusal by Its Code](https://litespec.dev/4.0.0/frontend/testing.md#assert-each-declared-refusal-by-its-code) | rule | any | tests | - | full | rule | guidance | Which declared refusals do no evidence specifications reach and assert by result code? Look in the evidence specifications. |
| litespec/frontend/testing#assert-the-result-a-scenario-ends-in | [Assert the Result a Scenario Ends In](https://litespec.dev/4.0.0/frontend/testing.md#assert-the-result-a-scenario-ends-in) | rule | any | tests | - | full | rule | checkable | `litespec model check` reports `proves-unreached` (level S) for a browser test reaching the screen whose assertions in the same test hold neither the refusal code nor the success result's declared text or code. |
| litespec/frontend/testing#isolate-browser-tests | [Isolate Browser Tests](https://litespec.dev/4.0.0/frontend/testing.md#isolate-browser-tests) | rule | any | tests | - | full | rule | guidance | Which browser tests depend on another test's data, authentication context, or expected state? Look in the browser specifications. |
| litespec/frontend/testing#keep-mocks-at-owned-boundaries | [Keep Mocks at Owned Boundaries](https://litespec.dev/4.0.0/frontend/testing.md#keep-mocks-at-owned-boundaries) | rule | any | tests | - | full | rule | guidance | Which mocks replace generated contract types, private functions, or stack-named libraries? Look in the test doubles. |
| litespec/frontend/testing#keep-test-support-narrow | [Keep Test Support Narrow](https://litespec.dev/4.0.0/frontend/testing.md#keep-test-support-narrow) | convention | any | tests | - | full | default | guidance | Which test support files hold more than render helpers, one shared API helper, and locator helpers? Look in the test support files. |
| litespec/frontend/testing#mark-the-scenario-a-browser-test-proves | [Mark the Scenario a Browser Test Proves](https://litespec.dev/4.0.0/frontend/testing.md#mark-the-scenario-a-browser-test-proves) | rule | any | tests | - | full | rule | checkable | `litespec model check` reports `mark-unknown` (level S) for a `proves` annotation naming no record a test may prove, or naming a journey. |
| litespec/frontend/testing#match-test-level-to-risk | [Match Test Level to Risk](https://litespec.dev/4.0.0/frontend/testing.md#match-test-level-to-risk) | rule | any | tests | - | full | rule | guidance | Which pure logic lacks a logic test, which navigation or integration lacks a browser specification, and which address lacks the route contract? Look in the test files beside the modules and under the tests roots. |
| litespec/frontend/testing#name-the-journey-a-journey-test-walks | [Name the Journey a Journey Test Walks](https://litespec.dev/4.0.0/frontend/testing.md#name-the-journey-a-journey-test-walks) | rule | any | tests | - | full | rule | guidance | Which browser tests that walk several screens carry a `journey` annotation naming the journey and a `proves` mark for each scenario they drive and assert? Look in the browser tests and their annotations. |
| litespec/frontend/testing#prove-each-scenario-at-one-boundary | [Prove Each Scenario at One Boundary](https://litespec.dev/4.0.0/frontend/testing.md#prove-each-scenario-at-one-boundary) | rule | any | tests | - | full | rule | checkable | `litespec model check` reports `proves-duplicate` (level A) for a scenario with `proves` marks on more than one test. |
| litespec/frontend/testing#prove-the-module-mirror-in-a-structure-test | [Prove the Module Mirror in a Structure Test](https://litespec.dev/4.0.0/frontend/testing.md#prove-the-module-mirror-in-a-structure-test) | rule | any | tests | - | full | rule | guidance | Which module folders does the structure test fail to resolve to backend use-case folders, and which refused folders does it name? Look in the structure test. |
| litespec/frontend/testing#reach-a-screen-that-offers-the-scenarios-use-case | [Reach a Screen That Offers the Scenario's Use Case](https://litespec.dev/4.0.0/frontend/testing.md#reach-a-screen-that-offers-the-scenarios-use-case) | rule | any | tests | - | full | rule | checkable | `litespec model check` reports `proves-unreached` (level S) for a browser test whose `page.goto` targets match no screen offering the claimed scenario's use case. |
| litespec/frontend/testing#read-the-deployment-for-its-identifiers | [Read the Deployment for Its Identifiers](https://litespec.dev/4.0.0/frontend/testing.md#read-the-deployment-for-its-identifiers) | convention | any | tests | - | full | default | guidance | Which browser tests hard-code a record identifier instead of reading it from the running deployment? Look in the browser specifications. |
| litespec/frontend/testing#run-browser-checks-through-the-command-line | [Run Browser Checks Through the Command Line](https://litespec.dev/4.0.0/frontend/testing.md#run-browser-checks-through-the-command-line) | rule | any | tests | - | full | rule | guidance | Which browser suites run outside the command line, or without per-route and per-file addressing? Look in the suite runner and the CI invocation. |
| litespec/frontend/testing#test-observable-states | [Test Observable States](https://litespec.dev/4.0.0/frontend/testing.md#test-observable-states) | rule | any | tests | - | full | advice | guidance | Which tests assert internal state instead of observable behavior in the states their situation reaches? Look in the test assertions. |
| litespec/frontend/testing#use-network-mocks-for-component-tests | [Use Network Mocks for Component Tests](https://litespec.dev/4.0.0/frontend/testing.md#use-network-mocks-for-component-tests) | rule | any | tests | - | full | rule | guidance | Which component or logic tests needing HTTP answer without contract-generated network mocks, or with the generated client out of the path? Look in the component tests and the mock generation. |
| litespec/frontend/ui#check-every-route | [Check Every Route](https://litespec.dev/4.0.0/frontend/ui.md#check-every-route) | rule | any | frontend-ui | route | full | rule | guidance | Which discovered routes fail a route suite check? Look in the suite output and the CI job logs. |
| litespec/frontend/ui#compose-each-route-from-one-floorplan | [Compose Each Route from One Floorplan](https://litespec.dev/4.0.0/frontend/ui.md#compose-each-route-from-one-floorplan) | rule | any | frontend-ui | route | full | rule | guidance | Which routes render zero or several floorplans without recording a freestyle decision? Look in the route sources and the suite output reading the floorplan name from each frame. |
| litespec/frontend/ui#declare-a-closed-floorplan-set | [Declare a Closed Floorplan Set](https://litespec.dev/4.0.0/frontend/ui.md#declare-a-closed-floorplan-set) | rule | any | frontend-ui | any | full | rule | guidance | Which floorplans miss the design contract Patterns section or their when-to-use rule? Look in the design contract. |
| litespec/frontend/ui#derive-each-page-type-from-a-named-reference | [Derive Each Page Type from a Named Reference](https://litespec.dev/4.0.0/frontend/ui.md#derive-each-page-type-from-a-named-reference) | rule | any | frontend-ui | route | full | rule | guidance | Which routes name neither their page type reference nor, for a freestyle route, their decision record? Look in the route sources. |
| litespec/frontend/ui#govern-behavior-packages | [Govern Behavior Packages](https://litespec.dev/4.0.0/frontend/ui.md#govern-behavior-packages) | rule | any | frontend-ui | any | full | rule | guidance | Which behavior packages name no decision record justifying them, or render outside baseline components and tokens? Look in the package declarations and the decision records. |
| litespec/frontend/ui#hold-the-declared-base-color | [Hold the Declared Base Color](https://litespec.dev/4.0.0/frontend/ui.md#hold-the-declared-base-color) | rule | any | frontend-ui | any | full | rule | guidance | Which token values sit outside the declared baseline without a recorded exception? Look in the token definitions and the exception records. |
| litespec/frontend/ui#keep-a-blocked-command-visible-with-its-reason | [Keep a Blocked Command Visible with Its Reason](https://litespec.dev/4.0.0/frontend/ui.md#keep-a-blocked-command-visible-with-its-reason) | convention | any | frontend-ui | component, route | full | default | guidance | Which commands blocked only by state or role vanish instead of staying visible and disabled with the reason beside them? Look in the command surfaces. |
| litespec/frontend/ui#keep-layout-inside-floorplans | [Keep Layout Inside Floorplans](https://litespec.dev/4.0.0/frontend/ui.md#keep-layout-inside-floorplans) | rule | any | frontend-ui | route | full | rule | guidance | Which route files declare layout outside floorplan and display composites? Look in the route sources. |
| litespec/frontend/ui#keep-separators-at-the-subtle-step | [Keep Separators at the Subtle Step](https://litespec.dev/4.0.0/frontend/ui.md#keep-separators-at-the-subtle-step) | rule | any | frontend-ui | any | full | rule | guidance | Which structural separators or input borders run darker than the published border step? Look in the token definitions and the rendered separators. |
| litespec/frontend/ui#keep-tokens-in-one-definition | [Keep Tokens in One Definition](https://litespec.dev/4.0.0/frontend/ui.md#keep-tokens-in-one-definition) | rule | any | frontend-ui | any | full | rule | guidance | Which applications declare their own token value, and which shipped definitions carry a literal color? Look in the application and shared token definitions. |
| litespec/frontend/ui#pin-the-baseline-in-the-shared-package | [Pin the Baseline in the Shared Package](https://litespec.dev/4.0.0/frontend/ui.md#pin-the-baseline-in-the-shared-package) | rule | any | frontend-ui | any | full | rule | guidance | Which pinned manifest baselines install outside the shared UI package, or install more than once? Look in the shared package manifest and lock, and the application manifests. |
| litespec/frontend/ui#prove-every-result-a-route-calls | [Prove Every Result a Route Calls](https://litespec.dev/4.0.0/frontend/ui.md#prove-every-result-a-route-calls) | rule | any | frontend-ui | route | full | rule | checkable | `litespec model check` reports `refusal-sentence-missing` (level A) for a refusal reachable through a screen's computed `calls` with neither a dictionary sentence nor a browser test asserting its code. |
| litespec/frontend/ui#prove-ui-behavior-and-appearance | [Prove UI Behavior and Appearance](https://litespec.dev/4.0.0/frontend/ui.md#prove-ui-behavior-and-appearance) | rule | any | frontend-ui | any | full | rule | guidance | Which changes name no evidence the matrix assigns to their class? Look in the change descriptions and the named evidence. |
| litespec/frontend/ui#publish-a-design-contract | [Publish a Design Contract](https://litespec.dev/4.0.0/frontend/ui.md#publish-a-design-contract) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `[litespec/frontend/ui#publish-a-design-contract]` for a missing contract, a missing metadata block, a package mismatch, or a missing required section. Run it at the consumer root. |
| litespec/frontend/ui#record-a-freestyle-route | [Record a Freestyle Route](https://litespec.dev/4.0.0/frontend/ui.md#record-a-freestyle-route) | rule | any | frontend-ui | route | full | rule | guidance | Which freestyle routes name no decision record justifying their layout? Look in the freestyle routes and the decision records. |
| litespec/frontend/ui#record-a-frontend-outside-the-controlled-contract | [Record a Frontend Outside the Controlled Contract](https://litespec.dev/4.0.0/frontend/ui.md#record-a-frontend-outside-the-controlled-contract) | rule | any | frontend-ui | record:entry-point | full | rule | guidance | Which frontends outside the controlled platforms declare no entry point record naming their platform and replacement boundaries? Look in the entry point records. |
| litespec/frontend/ui#restrict-styling-to-semantic-tokens | [Restrict Styling to Semantic Tokens](https://litespec.dev/4.0.0/frontend/ui.md#restrict-styling-to-semantic-tokens) | rule | any | frontend-ui | any | full | rule | guidance | Which styles use raw values instead of semantic tokens? Look in the stylesheets and the shared package definition. |
| litespec/frontend/ui#select-a-command-surface-by-size | [Select a Command Surface by Size](https://litespec.dev/4.0.0/frontend/ui.md#select-a-command-surface-by-size) | rule | any | frontend-ui | component, route | full | rule | guidance | Which commands use a surface other than the one the Concepts table assigns to their input? Look in the command surfaces. |
| litespec/frontend/ui#select-a-tone-from-the-closed-set | [Select a Tone from the Closed Set](https://litespec.dev/4.0.0/frontend/ui.md#select-a-tone-from-the-closed-set) | rule | any | frontend-ui | component, route | full | rule | guidance | Which applications lack a state-to-tone mapping, or map a state outside the exhaustive table of glossary terms? Look in the application state mapping. |
| litespec/frontend/ui#select-one-visual-authority | [Select One Visual Authority](https://litespec.dev/4.0.0/frontend/ui.md#select-one-visual-authority) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports controlled frontends with no `paths.uiPackage` in `.litespec/project.json`, and `[litespec/frontend/ui#select-one-visual-authority]` for a second general-purpose visual dependency. Run it at the consumer root. |
| litespec/frontend/ui#show-the-trace-id-in-error-detail | [Show the Trace ID in Error Detail](https://litespec.dev/4.0.0/frontend/ui.md#show-the-trace-id-in-error-detail) | rule | any | frontend-ui | component, route | full | rule | guidance | Which visible errors hide the trace identifier from copyable detail? Look in the error surfaces. |
| litespec/frontend/ui#use-the-product-profiles | [Use the Product Profiles](https://litespec.dev/4.0.0/frontend/ui.md#use-the-product-profiles) | convention | any | frontend-ui | any | full | default | checkable | `litespec model check` reports a controlled frontend with no `ui` block declaring its density profile or a profile outside `public-light`, `application-balanced`, `admin-dense`. Run it at the consumer root. |
| litespec/frontend/web/components#keep-component-boundaries-typed | [Keep Component Boundaries Typed](https://litespec.dev/4.0.0/frontend/web/components.md#keep-component-boundaries-typed) | rule | any | frontend-ui | component | full | rule | checkable | `svelte-check` fails on an untyped Svelte prop, event, or snippet, and `pnpm type-check` fails on an untyped React prop or event. |
| litespec/frontend/web/components#refuse-page-code-violations-with-eslint | [Refuse Page Code Violations with ESLint](https://litespec.dev/4.0.0/frontend/web/components.md#refuse-page-code-violations-with-eslint) | rule | any | frontend-ui | component | full | rule | checkable | `pnpm eslint` reports no refused element, binding, or layout utility outside visual files in route and module code. |
| litespec/frontend/web/rendering#define-route-metadata-deliberately | [Define Route Metadata Deliberately](https://litespec.dev/4.0.0/frontend/web/rendering.md#define-route-metadata-deliberately) | rule | any | frontend-ui | route | full | rule | guidance | Which public routes miss a title, description, canonical address, or indexing policy, and which private routes miss a `noindex` marker? Look in the route metadata. |
| litespec/frontend/web/structure#generate-the-records-file-into-the-frame | [Generate the Records File into the Frame](https://litespec.dev/4.0.0/frontend/web/structure.md#generate-the-records-file-into-the-frame) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model render` writes each frontend's file into its frame from its own entry points, and `litespec model check` reports `mark-unknown` (level S) for a mark naming a use case or screen outside its frontend's entry points. |
| litespec/frontend/web/structure#locate-the-frame-in-the-app-folder | [Locate the Frame in the App Folder](https://litespec.dev/4.0.0/frontend/web/structure.md#locate-the-frame-in-the-app-folder) | rule | any | frontend-ui | any | full | rule | guidance | Which cross-route values or browser uses sit outside the frame folder their stack page names? Look in the frame folder and the route and module sources. |
| litespec/frontend/web/structure#mark-each-use-case-module-with-its-use-case | [Mark Each Use-Case Module with Its Use Case](https://litespec.dev/4.0.0/frontend/web/structure.md#mark-each-use-case-module-with-its-use-case) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` reports `mark-missing` (level S) for a use-case folder exporting no `litespec` constant, and `mark-unknown` (level S) for one naming a use case its path does not mirror; for a folder at `{module}/use-cases/{use-case}/` the mirrored use case is the one its module and use-case segments name, with no aggregate segment. |
| litespec/frontend/web/structure#refuse-stack-specific-folder-names | [Refuse Stack-Specific Folder Names](https://litespec.dev/4.0.0/frontend/web/structure.md#refuse-stack-specific-folder-names) | rule | any | frontend-ui | any | full | rule | guidance | Which React folders take the name `lib`, and which Svelte folders under `src/lib` take the name `stores`? Look in the frontend tree. |
| litespec/frontend/web/structure#use-the-frontend-application-tree | [Use the Frontend Application Tree](https://litespec.dev/4.0.0/frontend/web/structure.md#use-the-frontend-application-tree) | rule | any | frontend-ui | any | full | rule | guidance | Which frontend trees break from the frame, routes, and modules layout their stack page states? Look in the frontend tree. |
| litespec/frontend/web/structure#use-the-generated-route-tree | [Use the Generated Route Tree](https://litespec.dev/4.0.0/frontend/web/structure.md#use-the-generated-route-tree) | convention | any | frontend-ui | route | full | default | guidance | Which build or type-check scripts skip the router's generate command, and which generated artifacts stay tracked? Look in the package scripts and the version control status. |
| litespec/frontend/web/svelte/components#write-components-in-runes-mode | [Write Components in Runes Mode](https://litespec.dev/4.0.0/frontend/web/svelte/components.md#write-components-in-runes-mode) | rule | svelte | frontend-ui | component | full | rule | checkable | `svelte-check` fails on a legacy reactive statement or an untyped `$props` call. |
| litespec/frontend/web/testing#refuse-a-test-without-an-assertion | [Refuse a Test Without an Assertion](https://litespec.dev/4.0.0/frontend/web/testing.md#refuse-a-test-without-an-assertion) | rule | any | tests | - | full | rule | checkable | `pnpm eslint` reports `vitest/expect-expect` for each test that contains no assertion. |
| litespec/frontend/web/ui#mark-the-route-suite-and-goldens-with-what-they-prove | [Mark the Route Suite and Goldens with What They Prove](https://litespec.dev/4.0.0/frontend/web/ui.md#mark-the-route-suite-and-goldens-with-what-they-prove) | rule | any | frontend-ui | test | full | rule | checkable | `litespec model check` reports `mark-missing` (level S) for a test in a frontend's `routeSuite` or `visualGoldens` with no `proves` annotation, and `mark-unknown` (level S) for one naming a scenario. |
| litespec/frontend/web/ui#publish-one-registry-item-per-floorplan | [Publish One Registry Item per Floorplan](https://litespec.dev/4.0.0/frontend/web/ui.md#publish-one-registry-item-per-floorplan) | rule | any | frontend-ui | any | full | rule | checkable | `shadcn build` on React or `shadcn-svelte build` on Svelte exits zero, and `registry.json` lists one item per declared floorplan. |
| litespec/frontend/web/ui#restrict-css-decisions | [Restrict CSS Decisions](https://litespec.dev/4.0.0/frontend/web/ui.md#restrict-css-decisions) | rule | any | frontend-ui | component, route | full | rule | checkable | `litespec model check` reports each arbitrary value, raw palette value, important modifier, and inline style with its file. |
| litespec/frontend/web/ui#track-source-changes | [Track Source Changes](https://litespec.dev/4.0.0/frontend/web/ui.md#track-source-changes) | rule | any | frontend-ui | any | full | rule | checkable | `litespec model check` recomputes each digest and reports changed primitive source. |
| litespec/frontend/web/ui#use-the-source-update-procedure | [Use the Source Update Procedure](https://litespec.dev/4.0.0/frontend/web/ui.md#use-the-source-update-procedure) | convention | any | frontend-ui | any | full | default | guidance | Which update branches miss the pinned CLI, the dry-run output, or the separate review of regenerated files and local composites? Look in the update branches. |

### quality

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/quality/ci#check-documentation-on-every-pull-request | [Check Documentation on Every Pull Request](https://litespec.dev/4.0.0/quality/ci.md#check-documentation-on-every-pull-request) | rule | any | operations | - | full | rule | checkable | `litespec model check` fails on a page that breaks the page contract, configuration, language, or prose rules. |
| litespec/quality/ci#keep-generated-contracts-fresh | [Keep Generated Contracts Fresh](https://litespec.dev/4.0.0/quality/ci.md#keep-generated-contracts-fresh) | rule | any | operations | - | full | rule | guidance | Regenerating OpenAPI and API types from source on the pull request produces no diff. |
| litespec/quality/ci#refuse-backend-calls-outside-the-generated-client | [Refuse Backend Calls Outside the Generated Client](https://litespec.dev/4.0.0/quality/ci.md#refuse-backend-calls-outside-the-generated-client) | rule | any | operations | - | full | rule | guidance | The contract job report shows a clean regeneration and a lint report with no backend call outside the generated client. |
| litespec/quality/ci#run-applicable-gates-on-every-pull-request | [Run Applicable Gates on Every Pull Request](https://litespec.dev/4.0.0/quality/ci.md#run-applicable-gates-on-every-pull-request) | rule | any | operations | - | full | rule | guidance | The pull request checks list shows each selected job passing, with skipped jobs recorded with their reason. |
| litespec/quality/ci#run-measured-checks-on-every-pull-request | [Run Measured Checks on Every Pull Request](https://litespec.dev/4.0.0/quality/ci.md#run-measured-checks-on-every-pull-request) | rule | any | operations | - | full | rule | checkable | `litespec model check` reports `requirement-measure-missing` for a measured requirement with no check or no passing run. |
| litespec/quality/operations#apply-schema-changes-outside-request-startup | [Apply Schema Changes Outside Request Startup](https://litespec.dev/4.0.0/quality/operations.md#apply-schema-changes-outside-request-startup) | rule | any | operations | migration | full | rule | guidance | The schema step runs before traffic shifts, with no schema work at replica startup. |
| litespec/quality/operations#bound-external-calls | [Bound External Calls](https://litespec.dev/4.0.0/quality/operations.md#bound-external-calls) | rule | any | operations | any | full | rule | guidance | Each network call declares a timeout, a cancellation path, and bounded retries for idempotent operations only. |
| litespec/quality/operations#cover-every-quality-requirement-with-an-alert-or-a-check | [Cover Every Quality Requirement with an Alert or a Check](https://litespec.dev/4.0.0/quality/operations.md#cover-every-quality-requirement-with-an-alert-or-a-check) | rule | any | operations | record:requirement | full | rule | checkable | `litespec model check` reports `quality-alert-missing` (level G) for a quality requirement that no alert rule names in its `requirement` label, whose `check` matches no measured-check or check result the model read, and that no gap exception covering `quality-alert-missing` lists in its `subject`. |
| litespec/quality/operations#emit-correlated-diagnostics | [Emit Correlated Diagnostics](https://litespec.dev/4.0.0/quality/operations.md#emit-correlated-diagnostics) | rule | any | operations | any | full | rule | guidance | Logs and traces carry correlation identifiers, and metrics carry service labels. |
| litespec/quality/operations#keep-production-secrets-out-of-the-repository | [Keep Production Secrets Out of the Repository](https://litespec.dev/4.0.0/quality/operations.md#keep-production-secrets-out-of-the-repository) | rule | any | operations | any | full | rule | guidance | Production values live on the host, with only placeholders in the repository example file. |
| litespec/quality/operations#keep-runbooks-near-project-documentation | [Keep Runbooks Near Project Documentation](https://litespec.dev/4.0.0/quality/operations.md#keep-runbooks-near-project-documentation) | convention | any | operations | record:runbook | full | default | guidance | Each runbook sits under `.litespec/implementation/runbooks/` or its module's runbooks folder with its fields, or the runbook-layout convention names another arrangement. |
| litespec/quality/operations#list-every-sub-processor | [List Every Sub-Processor](https://litespec.dev/4.0.0/quality/operations.md#list-every-sub-processor) | rule | any | operations | record:actor | full | rule | guidance | Each provider the release calls appears on the generated sub-processor list. |
| litespec/quality/operations#name-every-runbook-from-an-alert-job-reaction-or-failure-policy | [Name Every Runbook from an Alert, Job, Reaction or Failure Policy](https://litespec.dev/4.0.0/quality/operations.md#name-every-runbook-from-an-alert-job-reaction-or-failure-policy) | rule | any | operations | record:runbook | full | rule | checkable | `litespec model check` reports `runbook-unused` (level A) for a runbook record that no alert label, job, reaction or failure policy names. |
| litespec/quality/operations#name-the-requirement-and-runbook-on-every-alert | [Name the Requirement and Runbook on Every Alert](https://litespec.dev/4.0.0/quality/operations.md#name-the-requirement-and-runbook-on-every-alert) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `alert-link-missing` (level S) for an alert rule in the files `paths.alerts` names whose `requirement` label is missing or names no quality requirement, or whose `runbook` label is missing or names no runbook. |
| litespec/quality/operations#operate-background-work-independently | [Operate Background Work Independently](https://litespec.dev/4.0.0/quality/operations.md#operate-background-work-independently) | rule | any | operations | any | full | rule | guidance | The Worker publishes its own health, rates, counts, oldest pending age, and shutdown behavior. |
| litespec/quality/operations#pass-trace-context-in-the-w3c-format | [Pass Trace Context in the W3C Format](https://litespec.dev/4.0.0/quality/operations.md#pass-trace-context-in-the-w3c-format) | rule | any | operations | any | full | rule | guidance | One propagator reads and writes W3C trace context on every host. |
| litespec/quality/operations#point-each-operations-file-at-its-decision | [Point Each Operations File at Its Decision](https://litespec.dev/4.0.0/quality/operations.md#point-each-operations-file-at-its-decision) | rule | any | operations | any | full | rule | checkable | `litespec model check` reports `mark-missing` (level S) for a file in `paths.operations` with no `follows` mark and `mark-unknown` (level S) for a mark naming no decision, exception, or provision, and counts the file toward `decision-unimplemented`. |
| litespec/quality/operations#point-every-runtime-record-at-its-use-case | [Point Every Runtime Record at Its Use Case](https://litespec.dev/4.0.0/quality/operations.md#point-every-runtime-record-at-its-use-case) | rule | any | operations | any | full | rule | guidance | Which pipeline stage reads the registry and stamps `litespec.use_case` on the span, the log scope, and the error report of each mediated message? Look at the mediator pipeline and one error report per host. |
| litespec/quality/operations#separate-liveness-and-readiness | [Separate Liveness and Readiness](https://litespec.dev/4.0.0/quality/operations.md#separate-liveness-and-readiness) | rule | any | operations | any | full | rule | guidance | Liveness answers without dependency checks while readiness includes the critical ones. |
| litespec/quality/operations#start-the-stack-with-one-local-command | [Start the Stack with One Local Command](https://litespec.dev/4.0.0/quality/operations.md#start-the-stack-with-one-local-command) | rule | any | operations | any | full | rule | guidance | One command named in the consumer `AGENTS.md` starts WebApi, PostgreSQL, the frontends, and the Worker. |
| litespec/quality/security#apply-erasure-and-export-to-every-store | [Apply Erasure and Export to Every Store](https://litespec.dev/4.0.0/quality/security.md#apply-erasure-and-export-to-every-store) | rule | any | application | use-case | full | rule | guidance | Erasure and export reach every store on the inventory, with backups expiring inside their bound. |
| litespec/quality/security#authorize-each-target-resource | [Authorize Each Target Resource](https://litespec.dev/4.0.0/quality/security.md#authorize-each-target-resource) | rule | any | application | use-case, command-handler, query-handler | full | rule | guidance | Each protected operation passes the application guard from its use case's declared permissions. |
| litespec/quality/security#bound-abuse-at-exposed-endpoints | [Bound Abuse at Exposed Endpoints](https://litespec.dev/4.0.0/quality/security.md#bound-abuse-at-exposed-endpoints) | rule | any | application | endpoint | full | rule | guidance | Each public, authentication, webhook, search, and upload endpoint declares its setting with key and rejection response. |
| litespec/quality/security#derive-the-actor-from-claims | [Derive the Actor from Claims](https://litespec.dev/4.0.0/quality/security.md#derive-the-actor-from-claims) | rule | any | application | command-handler, query-handler, endpoint | full | rule | guidance | Actor resolution in WebApi maps verified claims through the one current-actor accessor. |
| litespec/quality/security#keep-a-personal-data-inventory-per-store | [Keep a Personal-Data Inventory per Store](https://litespec.dev/4.0.0/quality/security.md#keep-a-personal-data-inventory-per-store) | rule | any | application | any | full | rule | guidance | The inventory names the fields, purposes, and retention of each store holding personal data. |
| litespec/quality/security#keep-backend-authentication-provider-neutral | [Keep Backend Authentication Provider-Neutral](https://litespec.dev/4.0.0/quality/security.md#keep-backend-authentication-provider-neutral) | rule | any | application | any | full | rule | guidance | The backend authentication setup validates issuer, audience, signature, lifetime, and required claims, with no identity header accepted. |
| litespec/quality/security#keep-one-limit-store-across-replicas | [Keep One Limit Store Across Replicas](https://litespec.dev/4.0.0/quality/security.md#keep-one-limit-store-across-replicas) | rule | any | application | any | full | rule | guidance | The deployment reads rate and concurrency counters from one store on every replica. |
| litespec/quality/security#keep-personal-data-out-of-logs | [Keep Personal Data Out of Logs](https://litespec.dev/4.0.0/quality/security.md#keep-personal-data-out-of-logs) | rule | any | application | any | full | rule | guidance | Logs, traces, and diagnostic records carry no personal data in clear. |
| litespec/quality/security#keep-secrets-out-of-tracked-and-observable-data | [Keep Secrets Out of Tracked and Observable Data](https://litespec.dev/4.0.0/quality/security.md#keep-secrets-out-of-tracked-and-observable-data) | rule | any | application | any | full | rule | guidance | Source, logs, traces, messages, files, URLs, snapshots, layers, and browser storage hold no secret. |
| litespec/quality/security#keep-secure-headers-in-host-configuration | [Keep Secure Headers in Host Configuration](https://litespec.dev/4.0.0/quality/security.md#keep-secure-headers-in-host-configuration) | convention | any | application | any | full | default | guidance | The secure headers sit in one host location, or the secure-headers convention names another arrangement. |
| litespec/quality/security#limit-public-error-detail | [Limit Public Error Detail](https://litespec.dev/4.0.0/quality/security.md#limit-public-error-detail) | rule | any | application | endpoint | full | rule | guidance | Each public error carries the HTTP API error contract shape. |
| litespec/quality/security#minimize-sensitive-data | [Minimize Sensitive Data](https://litespec.dev/4.0.0/quality/security.md#minimize-sensitive-data) | rule | any | application | use-case, command-handler, query-handler | full | rule | guidance | Each use case collects, returns, logs, exports, and retains only its declared fields. |
| litespec/quality/security#parameterize-database-input | [Parameterize Database Input](https://litespec.dev/4.0.0/quality/security.md#parameterize-database-input) | rule | any | application | repository | full | rule | guidance | Each external value reaches the database through a query API call or a SQL parameter. |
| litespec/quality/security#protect-browser-boundaries | [Protect Browser Boundaries](https://litespec.dev/4.0.0/quality/security.md#protect-browser-boundaries) | rule | any | application | component, route, form | full | rule | guidance | Each frontend ships framework escaping, a Content Security Policy, secure headers, redirect validation, forgery protection, and rich-content sanitization. |
| litespec/quality/security#protect-live-data-at-rest | [Protect Live Data at Rest](https://litespec.dev/4.0.0/quality/security.md#protect-live-data-at-rest) | rule | any | application | any | full | rule | guidance | Each live store carries encryption, or an exception record covers this provision. |
| litespec/quality/security#record-security-audit-events | [Record Security Audit Events](https://litespec.dev/4.0.0/quality/security.md#record-security-audit-events) | rule | any | application | any | full | rule | guidance | Each security audit event records actor, action, target, outcome, timestamp, trace identifier, and reason. |
| litespec/quality/security#report-a-breach-within-its-deadline | [Report a Breach Within Its Deadline](https://litespec.dev/4.0.0/quality/security.md#report-a-breach-within-its-deadline) | rule | any | application | any | full | rule | guidance | The breach procedure names the person who acts, a backup person, and the deadline the constraint record states. |
| litespec/quality/security#restrict-a-protected-collection-in-the-database | [Restrict a Protected Collection in the Database](https://litespec.dev/4.0.0/quality/security.md#restrict-a-protected-collection-in-the-database) | rule | any | application | query-handler | full | rule | guidance | Each protected collection query carries its authorization scope as a database predicate before paging. |
| litespec/quality/security#restrict-cross-origin-access | [Restrict Cross-Origin Access](https://litespec.dev/4.0.0/quality/security.md#restrict-cross-origin-access) | rule | any | application | any | full | rule | guidance | The cross-origin policy lists origins, methods, headers, and credential mode with no wildcard origin. |
| litespec/quality/security#rotate-production-secrets | [Rotate Production Secrets](https://litespec.dev/4.0.0/quality/security.md#rotate-production-secrets) | rule | any | application | any | full | rule | guidance | Each production secret carries a secret-inventory entry with location and rotation date beside its revocation runbook. |
| litespec/quality/security#scan-every-pull-request-with-a-free-static-analyzer | [Scan Every Pull Request with a Free Static Analyzer](https://litespec.dev/4.0.0/quality/security.md#scan-every-pull-request-with-a-free-static-analyzer) | rule | any | application | any | full | rule | guidance | The static analysis report for the pull request shows its findings with a gap exception for each accepted one. |
| litespec/quality/security#scan-every-release-with-the-zap-baseline | [Scan Every Release with the ZAP Baseline](https://litespec.dev/4.0.0/quality/security.md#scan-every-release-with-the-zap-baseline) | rule | any | application | any | full | rule | guidance | The ZAP result file under `TestResults/` shows no medium or high alert for the pull request. |
| litespec/quality/security#set-an-asvs-level-as-the-security-target | [Set an ASVS Level as the Security Target](https://litespec.dev/4.0.0/quality/security.md#set-an-asvs-level-as-the-security-target) | rule | any | application | record:requirement | full | rule | guidance | The security quality requirement names its ASVS level with a passing check. |
| litespec/quality/security#test-the-resource-authorization-matrix | [Test the Resource Authorization Matrix](https://litespec.dev/4.0.0/quality/security.md#test-the-resource-authorization-matrix) | convention | any | application | test | full | default | guidance | Each protected operation passes every caller in the matrix, or the authorization-matrix convention names another set. |
| litespec/quality/security#treat-an-unsalted-digest-as-personal-data | [Treat an Unsalted Digest as Personal Data](https://litespec.dev/4.0.0/quality/security.md#treat-an-unsalted-digest-as-personal-data) | rule | any | application | any | full | rule | guidance | Each unsalted digest of personal data receives the handling its source data receives. |
| litespec/quality/security#use-deny-by-default-policies | [Use Deny-by-Default Policies](https://litespec.dev/4.0.0/quality/security.md#use-deny-by-default-policies) | convention | any | application | endpoint | full | default | guidance | New endpoints require authentication by default, or the endpoint-protection convention names another arrangement. |
| litespec/quality/security#use-one-current-actor-abstraction | [Use One Current Actor Abstraction](https://litespec.dev/4.0.0/quality/security.md#use-one-current-actor-abstraction) | convention | any | application | any | full | default | guidance | WebApi exposes one current-actor accessor, or the current-actor convention names another arrangement. |
| litespec/quality/security#validate-at-trust-boundaries | [Validate at Trust Boundaries](https://litespec.dev/4.0.0/quality/security.md#validate-at-trust-boundaries) | rule | any | application | endpoint | full | rule | guidance | Each trust boundary validates transport shape and file metadata before use. |

### workspace

| ID | Provision | Kind | Stack | Layer | Artifact | Conformance | Strength | Mark | Evidence |
|:---|:---|:---|:---|:---|:---|:---|:---|:---|:---|
| litespec/workspace/config#keep-documentation-directories-out-of-build-artifact-ignore-rules | [Keep Documentation Directories Out of Build-Artifact Ignore Rules](https://litespec.dev/4.0.0/workspace/config.md#keep-documentation-directories-out-of-build-artifact-ignore-rules) | convention | any | workspace | - | full | default | guidance | Each documentation directory stays tracked; `git check-ignore` reports no match for the record paths under `docs/`. |
| litespec/workspace/config#keep-environment-examples-beside-applications | [Keep Environment Examples Beside Applications](https://litespec.dev/4.0.0/workspace/config.md#keep-environment-examples-beside-applications) | convention | any | workspace | - | full | default | guidance | Each frontend and deployable host directory holds a `.env.example` with required names and safe values; where replaced, the project documentation names the central example location. |
| litespec/workspace/config#keep-local-overrides-untracked | [Keep Local Overrides Untracked](https://litespec.dev/4.0.0/workspace/config.md#keep-local-overrides-untracked) | convention | any | workspace | - | full | default | guidance | Developer overrides live in ignored local files or a platform secret store, with no second tracked environment-specific source. |
| litespec/workspace/config#keep-logging-configuration-provider-neutral | [Keep Logging Configuration Provider-Neutral](https://litespec.dev/4.0.0/workspace/config.md#keep-logging-configuration-provider-neutral) | convention | any | workspace | - | full | default | guidance | Application source logs through standard abstractions, with exporter configuration in hosts; where replaced, the host configuration names the project's own logging setup. |
| litespec/workspace/config#keep-secrets-outside-source-control | [Keep Secrets Outside Source Control](https://litespec.dev/4.0.0/workspace/config.md#keep-secrets-outside-source-control) | rule | any | workspace | - | full | rule | guidance | Each tracked configuration file carries only safe defaults and placeholders; real values live in user secrets or the deployment platform. |
| litespec/workspace/config#pin-the-javascript-toolchain | [Pin the JavaScript Toolchain](https://litespec.dev/4.0.0/workspace/config.md#pin-the-javascript-toolchain) | rule | any | workspace | - | full | rule | guidance | Root `package.json` declares `packageManager` and a Node.js engine matching the manifest releases; CI provisions the same releases. |
| litespec/workspace/config#pin-the-react-version-in-the-eslint-flat-config | [Pin the React Version in the ESLint Flat Config](https://litespec.dev/4.0.0/workspace/config.md#pin-the-react-version-in-the-eslint-flat-config) | rule | any | workspace | - | full | rule | guidance | Each React ESLint flat config sets a concrete `settings.react.version`. |
| litespec/workspace/config#use-one-frontend-dependency-graph | [Use One Frontend Dependency Graph](https://litespec.dev/4.0.0/workspace/config.md#use-one-frontend-dependency-graph) | rule | any | workspace | - | full | rule | guidance | The workspace holds one root `package.json`, `pnpm-workspace.yaml`, and `pnpm-lock.yaml`, with no nested lockfile tracked. |
| litespec/workspace/config#validate-backend-configuration-at-startup | [Validate Backend Configuration at Startup](https://litespec.dev/4.0.0/workspace/config.md#validate-backend-configuration-at-startup) | rule | any | workspace | - | full | rule | guidance | Each backend section binds a settings type that fails startup on a missing field, a bad range, or a bad format; read the settings types beside the backend host. |
| litespec/workspace/config#validate-frontend-environment-access | [Validate Frontend Environment Access](https://litespec.dev/4.0.0/workspace/config.md#validate-frontend-environment-access) | rule | any | workspace | - | full | rule | guidance | Each frontend reads environment values only through `src/lib/env.ts`, with server-only values apart from browser-visible ones. |
| litespec/workspace/dependencies#approve-new-packages-explicitly | [Approve New Packages Explicitly](https://litespec.dev/4.0.0/workspace/dependencies.md#approve-new-packages-explicitly) | rule | any | workspace | - | full | rule | checkable | `litespec model check` reports `dependency-undeclared` (level S) for a direct package in the bill of materials that the manifest does not pin and no decision admits, and `admission-invalid` (level G) for an `admits` entry missing any of its six facts. |
| litespec/workspace/dependencies#assign-each-baseline-package-to-its-owning-layer | [Assign Each Baseline Package to Its Owning Layer](https://litespec.dev/4.0.0/workspace/dependencies.md#assign-each-baseline-package-to-its-owning-layer) | convention | any | workspace | - | full | default | guidance | Each baseline package sits in the owning layer the table in this section assigns; where replaced, the admitting decision names the project's own owning layer. |
| litespec/workspace/dependencies#follow-the-declared-dependency-graph | [Follow the Declared Dependency Graph](https://litespec.dev/4.0.0/workspace/dependencies.md#follow-the-declared-dependency-graph) | rule | any | workspace | - | full | rule | guidance | Each layer and module dependency follows the declared graph; read the references between layer folders under `apps/api/src` and the imports in `apps/`. |
| litespec/workspace/dependencies#keep-application-free-of-provider-packages | [Keep Application Free of Provider Packages](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-application-free-of-provider-packages) | rule | any | workspace | - | full | rule | guidance | The Application layer folders reference only messaging abstractions, read abstractions, and the declared read boundary; read those folders and the manifests that serve them. |
| litespec/workspace/dependencies#keep-domain-dependency-free | [Keep Domain Dependency-Free](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-domain-dependency-free) | rule | any | workspace | - | full | rule | guidance | No Domain layer folder needs an external package or framework; read the Domain layer folders and the manifests that serve them. |
| litespec/workspace/dependencies#keep-frontend-applications-isolated | [Keep Frontend Applications Isolated](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-frontend-applications-isolated) | rule | any | workspace | - | full | rule | guidance | No import in one frontend names another application's source or another module's internal feature files. |
| litespec/workspace/dependencies#keep-generated-packages-dependency-light | [Keep Generated Packages Dependency-Light](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-generated-packages-dependency-light) | convention | any | workspace | - | full | default | guidance | The generated API types package carries no dependencies, and the shared client carries only the generator runtime, its query plugin, and those types; where replaced, the client package manifest names the project's own client dependency set. |
| litespec/workspace/dependencies#keep-providers-in-infrastructure | [Keep Providers in Infrastructure](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-providers-in-infrastructure) | rule | any | workspace | - | full | rule | guidance | Database providers, external SDKs, and resilience, discovery, and serialization adapters appear only in the Infrastructure layer folders; read those folders and the manifests that serve them. |
| litespec/workspace/dependencies#keep-test-dependencies-in-test-projects | [Keep Test Dependencies in Test Projects](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-test-dependencies-in-test-projects) | convention | any | workspace | - | full | default | guidance | No production project manifest references an assertion, substitution, host, container, or architecture-test package; where replaced, the project documentation names the shipped helper and its reason. |
| litespec/workspace/dependencies#keep-the-approved-web-ui-dependency-boundary | [Keep the Approved Web UI Dependency Boundary](https://litespec.dev/4.0.0/workspace/dependencies.md#keep-the-approved-web-ui-dependency-boundary) | rule | any | workspace | - | full | rule | guidance | Each React frontend manifest takes UI packages only from `uiBaseline`, and each Svelte one only from `uiBaselineSvelte`, in `litespec.manifest.json`. |
| litespec/workspace/dependencies#pin-every-dependency-version-centrally | [Pin Every Dependency Version Centrally](https://litespec.dev/4.0.0/workspace/dependencies.md#pin-every-dependency-version-centrally) | rule | any | workspace | - | full | rule | guidance | Every version resolves through central management or the committed lockfile at the manifest pin where one exists; no version sits inline in a module file. |
| litespec/workspace/naming#align-business-names-across-layers | [Align Business Names Across Layers](https://litespec.dev/4.0.0/workspace/naming.md#align-business-names-across-layers) | convention | any | workspace | record:module | full | default | guidance | One business name for each module spans Domain, Application, endpoints, features, and documentation; where replaced, the project documentation names the project's own per-layer names. |
| litespec/workspace/naming#anchor-aggregate-owned-types-on-the-aggregate-root | [Anchor Aggregate-Owned Types on the Aggregate Root](https://litespec.dev/4.0.0/workspace/naming.md#anchor-aggregate-owned-types-on-the-aggregate-root) | rule | any | workspace | aggregate | full | rule | guidance | Each aggregate-owned type name in `apps/api/src` begins with its aggregate root name, through nesting or prefix. |
| litespec/workspace/naming#avoid-generic-type-names | [Avoid Generic Type Names](https://litespec.dev/4.0.0/workspace/naming.md#avoid-generic-type-names) | convention | any | workspace | aggregate, state-record, value-object, domain-event, use-case, command-handler, query-handler, validator, reaction, port, repository, endpoint, migration, job | full | advice | guidance | Each type name in `apps/api/src` avoids the listed generic names where a narrower name exists; where replaced, the project documentation names the kept name and its reason. |
| litespec/workspace/naming#derive-boundary-names-from-the-ubiquitous-term | [Derive Boundary Names from the Ubiquitous Term](https://litespec.dev/4.0.0/workspace/naming.md#derive-boundary-names-from-the-ubiquitous-term) | convention | any | workspace | use-case, endpoint | full | default | guidance | Each route segment and JSON field name derives from its current aggregate or ubiquitous term; where replaced, the project documentation names the project's own boundary naming. |
| litespec/workspace/naming#group-event-handlers-by-the-fact-they-handle | [Group Event Handlers by the Fact They Handle](https://litespec.dev/4.0.0/workspace/naming.md#group-event-handlers-by-the-fact-they-handle) | rule | any | workspace | reaction | full | rule | checkable | `litespec model check` reports `code-placement-drift` (level S) for an event handler declared outside the `On{Fact}` folder its event names. |
| litespec/workspace/naming#keep-namespaces-aligned-with-folders | [Keep Namespaces Aligned with Folders](https://litespec.dev/4.0.0/workspace/naming.md#keep-namespaces-aligned-with-folders) | convention | any | workspace | aggregate, state-record, value-object, domain-event, use-case, command-handler, query-handler, validator, reaction, port, repository, endpoint, migration, job | full | default | guidance | Each namespace starts with its product name and follows the folders beneath the project root; where replaced, the project documentation names the project's own namespace root. |
| litespec/workspace/naming#name-asynchronous-operations-completely | [Name Asynchronous Operations Completely](https://litespec.dev/4.0.0/workspace/naming.md#name-asynchronous-operations-completely) | rule | any | workspace | command-handler, query-handler, validator, reaction, port, repository, endpoint, migration, job | full | rule | guidance | Each asynchronous operation name reveals asynchrony, and each cancelable operation signature takes cancellation explicitly; read the public signatures in `apps/api/src`. |
| litespec/workspace/naming#name-exceptions-by-failed-rule | [Name Exceptions by Failed Rule](https://litespec.dev/4.0.0/workspace/naming.md#name-exceptions-by-failed-rule) | rule | any | workspace | aggregate | full | rule | guidance | Each exception name states its failed rule, with Domain rejections in `{DomainType}{Reason}Exception` form leading with the aggregate root. |
| litespec/workspace/naming#name-repository-variables-after-their-interface | [Name Repository Variables After Their Interface](https://litespec.dev/4.0.0/workspace/naming.md#name-repository-variables-after-their-interface) | rule | any | workspace | command-handler, query-handler, validator, reaction, repository, job | full | rule | checkable | `dotnet build` reports `LS2010` for a repository parameter, field, or local whose name does not follow its interface, in the dotnet stack. |
| litespec/workspace/naming#name-result-parts-after-their-result | [Name Result Parts After Their Result](https://litespec.dev/4.0.0/workspace/naming.md#name-result-parts-after-their-result) | rule | any | workspace | use-case | full | rule | checkable | `dotnet build` reports `LS2009` for a type a use-case result reaches through its properties whose name does not start with the result name, in the dotnet stack. |
| litespec/workspace/naming#use-architectural-suffixes | [Use Architectural Suffixes](https://litespec.dev/4.0.0/workspace/naming.md#use-architectural-suffixes) | rule | any | workspace | state-record, domain-event, use-case, command-handler, query-handler, validator, reaction, repository, endpoint, job | full | rule | checkable | `dotnet build` reports `LS2005` for a handler missing its command or query suffix, `LS2006` for an endpoint missing its suffix, and `LS2007` for a reaction or job whose name hides its kind, in the dotnet stack; each other type name in `apps/api/src` and each frontend file name carries the suffix its role assigns in the Role Suffixes table. |
| litespec/workspace/naming#use-current-language-features | [Use Current Language Features](https://litespec.dev/4.0.0/workspace/naming.md#use-current-language-features) | rule | any | workspace | aggregate, state-record, value-object, domain-event, use-case, command-handler, query-handler, validator, reaction, port, repository, endpoint, migration, job | full | advice | guidance | Production code targets the pinned language version and uses its current constructs; read the toolchain pins and the language idioms in `apps/api/src`. |
| litespec/workspace/naming#use-intent-revealing-boolean-names | [Use Intent-Revealing Boolean Names](https://litespec.dev/4.0.0/workspace/naming.md#use-intent-revealing-boolean-names) | rule | any | workspace | aggregate, state-record, value-object, domain-event, use-case, command-handler, query-handler, validator, reaction, port, repository, endpoint, migration, job | full | advice | guidance | Each boolean property and method name in `apps/api/src` starts with `Is`, `Has`, `Can`, or a precise verb. |
| litespec/workspace/naming#use-predictable-frontend-names | [Use Predictable Frontend Names](https://litespec.dev/4.0.0/workspace/naming.md#use-predictable-frontend-names) | rule | any | workspace | component, route, form | full | rule | guidance | Each frontend folder uses kebab-case, each component file and export uses PascalCase, and each React hook file uses `use-{name}`. |
| litespec/workspace/structure#declare-size-and-application-stacks-in-project-config | [Declare Size and Application Stacks in Project Config](https://litespec.dev/4.0.0/workspace/structure.md#declare-size-and-application-stacks-in-project-config) | rule | any | workspace | - | full | rule | guidance | `.litespec/project.json` at the workspace root declares `size` and one stack for the backend and for each frontend. |
| litespec/workspace/structure#keep-consumer-documentation-at-the-root | [Keep Consumer Documentation at the Root](https://litespec.dev/4.0.0/workspace/structure.md#keep-consumer-documentation-at-the-root) | rule | any | workspace | - | full | rule | guidance | Every record path sits under the root `.litespec/` directory. |
| litespec/workspace/structure#keep-generated-api-contracts-in-packages | [Keep Generated API Contracts in Packages](https://litespec.dev/4.0.0/workspace/structure.md#keep-generated-api-contracts-in-packages) | convention | any | workspace | - | full | default | guidance | Generated OpenAPI types sit in `packages/api-types/` and the thin client in `packages/api-client/` once two frontends consume the API; with one frontend, that frontend keeps both outputs. |
| litespec/workspace/structure#keep-orientation-documents-separate-from-canonical-records | [Keep Orientation Documents Separate from Canonical Records](https://litespec.dev/4.0.0/workspace/structure.md#keep-orientation-documents-separate-from-canonical-records) | rule | any | workspace | - | full | rule | guidance | Each `README.md` under `.litespec/` links to its record and restates no record content. |
| litespec/workspace/structure#keep-production-and-test-code-separate | [Keep Production and Test Code Separate](https://litespec.dev/4.0.0/workspace/structure.md#keep-production-and-test-code-separate) | rule | any | workspace | - | full | rule | guidance | Production files sit under `apps/api/src/` and test files under `apps/api/tests/`, with no test helper shipped beside production code. |
| litespec/workspace/structure#keep-runnable-applications-under-apps | [Keep Runnable Applications Under Apps](https://litespec.dev/4.0.0/workspace/structure.md#keep-runnable-applications-under-apps) | rule | any | workspace | - | full | rule | guidance | Each directory under `apps/` runs on its own, and each directory under `packages/` is imported by an application. |
| litespec/workspace/structure#keep-the-generated-model-out-of-source-control | [Keep the Generated Model Out of Source Control](https://litespec.dev/4.0.0/workspace/structure.md#keep-the-generated-model-out-of-source-control) | rule | any | workspace | - | full | rule | guidance | No path under `.litespec/model/` is tracked in git; `git ls-files .model` prints nothing. |
| litespec/workspace/structure#limit-shared-typescript-packages | [Limit Shared TypeScript Packages](https://litespec.dev/4.0.0/workspace/structure.md#limit-shared-typescript-packages) | rule | any | workspace | - | full | rule | guidance | Each package under `packages/` is imported by at least two consumers, or carries generated output shared by design; read the imports in `apps/`. |
| litespec/workspace/structure#name-frontends-by-audience | [Name Frontends by Audience](https://litespec.dev/4.0.0/workspace/structure.md#name-frontends-by-audience) | convention | any | workspace | - | full | default | guidance | Each directory under `apps/` carries an audience name; where replaced, `paths.frontends` in `.litespec/project.json` names the project's own frontend names. |
| litespec/workspace/structure#use-the-canonical-root-tree | [Use the Canonical Root Tree](https://litespec.dev/4.0.0/workspace/structure.md#use-the-canonical-root-tree) | rule | any | workspace | - | full | rule | guidance | The workspace tree matches the canonical tree in this section, with each record at its type's home under `.litespec/`. |

## Reference

None.

## Learn

None.

## LiteSpec's Own Records

None.

