# Rules

Explore the documented source-scan conditions first, then switch to the full catalog to study the wider design. A rule's selection, historical evidence and observed coverage are separate facts.

## Availability in source-scan

9 conditions are selected by default; 2 stdio conditions require --include-stdio-rules. The other 130 conditions are unavailable in source-scan. Each rule page also identifies any separate experimental source preview.

The catalog contains 138 stable Rule IDs grouping 141 conditions. The 33 historically accepted bounded conditions at 4558458d have not been requalified for product 524fa07e. Read the condition's method and evidence boundary before applying a result.

Without JavaScript, the links below remain available and the complete catalog is included in the readable page. Interactive filters narrow the same list when JavaScript is available.

## Complete catalog

- [repository-unused@1.0.0 — Unused declaration or declaration group](https://docs.swift-analyzer.com/catalog/repository-unused/)
- [architecture.production-used-only-by-tests@1.0.0 — Production code used only by tests](https://docs.swift-analyzer.com/catalog/architecture.production-used-only-by-tests/)
- [architecture.forbidden-dependency@1.0.0 — Forbidden dependency or layer bypass](https://docs.swift-analyzer.com/catalog/architecture.forbidden-dependency/)
- [api.access-narrowing@1.0.0 — Excessive API visibility](https://docs.swift-analyzer.com/catalog/api.access-narrowing/)
- [architecture.unused-product-dependency@1.0.0 — Unused product dependency](https://docs.swift-analyzer.com/catalog/architecture.unused-product-dependency/)
- [architecture.undeclared-direct-provider@1.0.0 — Undeclared direct provider](https://docs.swift-analyzer.com/catalog/architecture.undeclared-direct-provider/)
- [architecture.dependency-cycle@1.0.0 — Disallowed component cycle](https://docs.swift-analyzer.com/catalog/architecture.dependency-cycle/)
- [api.implementation-type-leakage@1.0.0 — Implementation type exposed through an API](https://docs.swift-analyzer.com/catalog/api.implementation-type-leakage/)
- [architecture.registration-contract-mismatch@1.0.0 — Incompatible registration or entry point](https://docs.swift-analyzer.com/catalog/architecture.registration-contract-mismatch/)
- [portfolio.arch.10@1.0.0 — Required resource missing from a shipping variant](https://docs.swift-analyzer.com/catalog/portfolio.arch.10/)
- [portfolio.arch.11@1.0.0 — Parameter unused across its dispatch family](https://docs.swift-analyzer.com/catalog/portfolio.arch.11/)
- [portfolio.arch.12@1.0.0 — Property is written but never observed](https://docs.swift-analyzer.com/catalog/portfolio.arch.12/)
- [portfolio.arch.13@1.0.0 — Redundant protocol or conformance](https://docs.swift-analyzer.com/catalog/portfolio.arch.13/)
- [portfolio.arch.14@1.0.0 — Semantically redundant import](https://docs.swift-analyzer.com/catalog/portfolio.arch.14/)
- [concurrency.incompatible-isolation@1.0.0 — Call crosses incompatible isolation](https://docs.swift-analyzer.com/catalog/concurrency.incompatible-isolation/)
- [concurrency.unproven-mainactor-entry@1.0.0 — MainActor entry without a proven context](https://docs.swift-analyzer.com/catalog/concurrency.unproven-mainactor-entry/)
- [concurrency.detached-task-context-loss@1.0.0 — Required context lost through detachment](https://docs.swift-analyzer.com/catalog/concurrency.detached-task-context-loss/)
- [concurrency.dispatch-isolation-mismatch@1.0.0 — Callback runs in an incompatible scheduler context](https://docs.swift-analyzer.com/catalog/concurrency.dispatch-isolation-mismatch/)
- [portfolio.exec.05@1.0.0 — Invalid isolation assumption](https://docs.swift-analyzer.com/catalog/portfolio.exec.05/)
- [portfolio.exec.06@1.0.0 — Resource used outside its execution domain](https://docs.swift-analyzer.com/catalog/portfolio.exec.06/)
- [portfolio.exec.07@1.0.0 — Thread-affine value survives a suspension](https://docs.swift-analyzer.com/catalog/portfolio.exec.07/)
- [portfolio.exec.08@1.0.0 — Required task-local value or executor preference is lost](https://docs.swift-analyzer.com/catalog/portfolio.exec.08/)
- [concurrency.main-actor-blocking@1.0.0 — Blocking call on a critical executor](https://docs.swift-analyzer.com/catalog/concurrency.main-actor-blocking/)
- [portfolio.exec.10@1.0.0 — Expensive computation on a critical executor](https://docs.swift-analyzer.com/catalog/portfolio.exec.10/)
- [portfolio.exec.11@1.0.0 — Removable scheduling boundary](https://docs.swift-analyzer.com/catalog/portfolio.exec.11/)
- [portfolio.exec.12@1.0.0 — Cost amplified by actor crossings](https://docs.swift-analyzer.com/catalog/portfolio.exec.12/)
- [portfolio.exec.13@1.0.0 — Independent work is unintentionally serialized](https://docs.swift-analyzer.com/catalog/portfolio.exec.13/)
- [portfolio.exec.14@1.0.0 — Custom SerialExecutor violates serialization](https://docs.swift-analyzer.com/catalog/portfolio.exec.14/)
- [concurrency.state-freshness-across-suspension@1.0.0 — State check becomes stale across await](https://docs.swift-analyzer.com/catalog/concurrency.state-freshness-across-suspension/)
- [concurrency.actor-invariant-exposure@1.0.0 — Broken invariant is observable during suspension](https://docs.swift-analyzer.com/catalog/concurrency.actor-invariant-exposure/)
- [concurrency.obsolete-generation-commit@1.0.0 — Stale result overwrites a newer generation](https://docs.swift-analyzer.com/catalog/concurrency.obsolete-generation-commit/)
- [portfolio.async.04@1.0.0 — Operation requiring single-flight starts more than once](https://docs.swift-analyzer.com/catalog/portfolio.async.04/)
- [portfolio.async.05@1.0.0 — Code depends on an unspecified actor-task order](https://docs.swift-analyzer.com/catalog/portfolio.async.05/)
- [concurrency.lost-continuation-resume@1.0.0 — Continuation can finish without resume](https://docs.swift-analyzer.com/catalog/concurrency.lost-continuation-resume/)
- [concurrency.double-continuation-resume@1.0.0 — Continuation can resume more than once](https://docs.swift-analyzer.com/catalog/concurrency.double-continuation-resume/)
- [concurrency.cancel-register-start-race@1.0.0 — Cancellation is lost between registration and start](https://docs.swift-analyzer.com/catalog/concurrency.cancel-register-start-race/)
- [concurrency.cancelled-forbidden-effect@1.0.0 — Forbidden commit after cancellation or rejection](https://docs.swift-analyzer.com/catalog/concurrency.cancelled-forbidden-effect/)
- [concurrency.unresponsive-cancellation-work@1.0.0 — Work does not honor its cancellation contract](https://docs.swift-analyzer.com/catalog/concurrency.unresponsive-cancellation-work/)
- [concurrency.timeout-sibling-outlives-race@1.0.0 — Timeout or first result does not finish its scope](https://docs.swift-analyzer.com/catalog/concurrency.timeout-sibling-outlives-race/)
- [concurrency.task-outlives-scope@1.0.0 — Task outlives its required lifecycle scope](https://docs.swift-analyzer.com/catalog/concurrency.task-outlives-scope/)
- [portfolio.async.13@1.0.0 — Required task result or error is lost](https://docs.swift-analyzer.com/catalog/portfolio.async.13/)
- [concurrency.guard-held-across-suspension@1.0.0 — Guard is held across a disallowed await](https://docs.swift-analyzer.com/catalog/concurrency.guard-held-across-suspension/)
- [concurrency.sole-producer-self-block@1.0.0 — Wait cycle blocks required producers](https://docs.swift-analyzer.com/catalog/concurrency.sole-producer-self-block/)
- [portfolio.async.16@1.0.0 — Synchronous waits exhaust the cooperative pool](https://docs.swift-analyzer.com/catalog/portfolio.async.16/)
- [portfolio.async.17@1.0.0 — Priority inversion through opaque waiting](https://docs.swift-analyzer.com/catalog/portfolio.async.17/)
- [portfolio.async.18@1.0.0 — Shared-memory race across an unsafe or legacy boundary](https://docs.swift-analyzer.com/catalog/portfolio.async.18/)
- [portfolio.async.19@1.0.0 — Synchronous callback re-enters an unfinished protocol](https://docs.swift-analyzer.com/catalog/portfolio.async.19/)
- [portfolio.async.20@1.0.0 — Custom executor loses or repeats a job](https://docs.swift-analyzer.com/catalog/portfolio.async.20/)
- [lifetime.escaping-value@1.0.0 — Borrowed pointer or view escapes its lifetime](https://docs.swift-analyzer.com/catalog/lifetime.escaping-value/)
- [portfolio.life.02@1.0.0 — Use after free](https://docs.swift-analyzer.com/catalog/portfolio.life.02/)
- [portfolio.life.03@1.0.0 — Repeated or incompatible deallocation](https://docs.swift-analyzer.com/catalog/portfolio.life.03/)
- [portfolio.life.04@1.0.0 — Unowned access after owner deallocation](https://docs.swift-analyzer.com/catalog/portfolio.life.04/)
- [lifetime.unmanaged-ownership-balance@1.0.0 — Unmanaged ownership imbalance](https://docs.swift-analyzer.com/catalog/lifetime.unmanaged-ownership-balance/)
- [lifetime.ownership-cycle@1.0.0 — Strong ownership cycle without a valid termination](https://docs.swift-analyzer.com/catalog/lifetime.ownership-cycle/)
- [portfolio.life.07@1.0.0 — Required weak consumer is released too early](https://docs.swift-analyzer.com/catalog/portfolio.life.07/)
- [lifetime.registration-outlives-scope@1.0.0 — Registration outlives its allowed scope](https://docs.swift-analyzer.com/catalog/lifetime.registration-outlives-scope/)
- [lifetime.undischarged-resource-obligation@1.0.0 — Cleanup obligation is not discharged](https://docs.swift-analyzer.com/catalog/lifetime.undischarged-resource-obligation/)
- [portfolio.life.10@1.0.0 — Closed or transferred resource is still used](https://docs.swift-analyzer.com/catalog/portfolio.life.10/)
- [portfolio.life.11@1.0.0 — Read from an uninitialized buffer region](https://docs.swift-analyzer.com/catalog/portfolio.life.11/)
- [correctness.pointer-count-initialization@1.0.0 — Pointer or count exceeds its valid extent](https://docs.swift-analyzer.com/catalog/correctness.pointer-count-initialization/)
- [performance.repeated-linear-traversal@1.0.0 — Repeated linear traversal / Lazy pipeline is recomputed](https://docs.swift-analyzer.com/catalog/performance.repeated-linear-traversal/)
- [performance.repeated-sorting@1.0.0 — Repeated invariant sorting](https://docs.swift-analyzer.com/catalog/performance.repeated-sorting/)
- [performance.repeated-consumed-materialization@1.0.0 — Repeated consumed materialization / Growing prefix is repeatedly materialized](https://docs.swift-analyzer.com/catalog/performance.repeated-consumed-materialization/)
- [performance.array-fifo-shifts@1.0.0 — Array used as a growing shifting FIFO](https://docs.swift-analyzer.com/catalog/performance.array-fifo-shifts/)
- [portfolio.perf.06@1.0.0 — Full sort used for an extremum or top-k result](https://docs.swift-analyzer.com/catalog/portfolio.perf.06/)
- [performance.comparator-projection-amplification@1.0.0 — Expensive projection repeated by a comparator](https://docs.swift-analyzer.com/catalog/performance.comparator-projection-amplification/)
- [portfolio.perf.08@1.0.0 — Eager materialization before a short consumer](https://docs.swift-analyzer.com/catalog/portfolio.perf.08/)
- [portfolio.perf.09@1.0.0 — Repeated physical copy-on-write detach](https://docs.swift-analyzer.com/catalog/portfolio.perf.09/)
- [portfolio.perf.10@1.0.0 — Get-copy-modify-set amplifies cost](https://docs.swift-analyzer.com/catalog/portfolio.perf.10/)
- [portfolio.perf.12@1.0.0 — Capacity policy violates the amortized bound](https://docs.swift-analyzer.com/catalog/portfolio.perf.12/)
- [portfolio.perf.13@1.0.0 — Repeated element-by-element bridging](https://docs.swift-analyzer.com/catalog/portfolio.perf.13/)
- [portfolio.perf.14@1.0.0 — Repeated expensive hashing or equality work](https://docs.swift-analyzer.com/catalog/portfolio.perf.14/)
- [portfolio.perf.15@1.0.0 — Small slice retains large storage](https://docs.swift-analyzer.com/catalog/portfolio.perf.15/)
- [portfolio.perf.16@1.0.0 — Fine-grained tasks amplify scheduling work](https://docs.swift-analyzer.com/catalog/portfolio.perf.16/)
- [portfolio.perf.17@1.0.0 — Fanout retains excessive live data](https://docs.swift-analyzer.com/catalog/portfolio.perf.17/)
- [security.sensitive-data-flow@1.0.0 — Sensitive data reaches logs / Sensitive data reaches a forbidden destination](https://docs.swift-analyzer.com/catalog/security.sensitive-data-flow/)
- [security.sql-structure-injection@1.0.0 — SQL injection](https://docs.swift-analyzer.com/catalog/security.sql-structure-injection/)
- [security.shell-command-injection@1.0.0 — Shell injection](https://docs.swift-analyzer.com/catalog/security.shell-command-injection/)
- [security.format-position-injection@1.0.0 — Format-string injection](https://docs.swift-analyzer.com/catalog/security.format-position-injection/)
- [security.path-traversal@1.0.0 — Path traversal outside the extraction root](https://docs.swift-analyzer.com/catalog/security.path-traversal/)
- [security.javascript-code-injection@1.0.0 — JavaScript or HTML context injection](https://docs.swift-analyzer.com/catalog/security.javascript-code-injection/)
- [security.privileged-url-input@1.0.0 — Unprivileged input controls a privileged URL sink](https://docs.swift-analyzer.com/catalog/security.privileged-url-input/)
- [portfolio.sec.09@1.0.0 — Predicate injection](https://docs.swift-analyzer.com/catalog/portfolio.sec.09/)
- [portfolio.sec.10@1.0.0 — Regular-expression injection](https://docs.swift-analyzer.com/catalog/portfolio.sec.10/)
- [portfolio.sec.11@1.0.0 — Algorithmic denial of service through a regular expression](https://docs.swift-analyzer.com/catalog/portfolio.sec.11/)
- [portfolio.sec.12@1.0.0 — External-entity expansion from untrusted XML](https://docs.swift-analyzer.com/catalog/portfolio.sec.12/)
- [portfolio.sec.13@1.0.0 — TLS trust evaluation is effectively disabled](https://docs.swift-analyzer.com/catalog/portfolio.sec.13/)
- [portfolio.sec.14@1.0.0 — Cryptography does not provide the claimed property](https://docs.swift-analyzer.com/catalog/portfolio.sec.14/)
- [portfolio.sec.15@1.0.0 — Keyed nonce or IV is reused in an unsafe mode](https://docs.swift-analyzer.com/catalog/portfolio.sec.15/)
- [portfolio.sec.16@1.0.0 — Unsafe password-derivation contract](https://docs.swift-analyzer.com/catalog/portfolio.sec.16/)
- [portfolio.sec.17@1.0.0 — Predictable randomness in a security-sensitive value](https://docs.swift-analyzer.com/catalog/portfolio.sec.17/)
- [portfolio.sec.18@1.0.0 — Untrusted deserialization crosses the allowed-type boundary](https://docs.swift-analyzer.com/catalog/portfolio.sec.18/)
- [portfolio.sec.19@1.0.0 — Privileged effect bypasses required authorization](https://docs.swift-analyzer.com/catalog/portfolio.sec.19/)
- [portfolio.sec.20@1.0.0 — Security validator or sanitizer is bypassed](https://docs.swift-analyzer.com/catalog/portfolio.sec.20/)
- [portfolio.sec.21@1.0.0 — Embedded secret reaches a security-sensitive use](https://docs.swift-analyzer.com/catalog/portfolio.sec.21/)
- [portfolio.sec.22@1.0.0 — WebView receives forbidden capabilities](https://docs.swift-analyzer.com/catalog/portfolio.sec.22/)
- [portfolio.sec.23@1.0.0 — Cryptographic key has insufficient strength](https://docs.swift-analyzer.com/catalog/portfolio.sec.23/)
- [portfolio.sec.24@1.0.0 — Dependency is fetched over an untrusted channel](https://docs.swift-analyzer.com/catalog/portfolio.sec.24/)
- [portfolio.sec.25@1.0.0 — Non-reproducible dependency resolution violates policy](https://docs.swift-analyzer.com/catalog/portfolio.sec.25/)
- [portfolio.sec.26@1.0.0 — Debug capability is exposed in a shipping product](https://docs.swift-analyzer.com/catalog/portfolio.sec.26/)
- [correctness.equality-hash-contract@1.0.0 — Equality and hashing disagree](https://docs.swift-analyzer.com/catalog/correctness.equality-hash-contract/)
- [correctness.persisted-process-hash@1.0.0 — Process-local hash is used as a stable identity](https://docs.swift-analyzer.com/catalog/correctness.persisted-process-hash/)
- [correctness.regex-range-units@1.0.0 — Incompatible length or index units](https://docs.swift-analyzer.com/catalog/correctness.regex-range-units/)
- [correctness.invalidated-collection-index@1.0.0 — Invalidated collection index is used](https://docs.swift-analyzer.com/catalog/correctness.invalidated-collection-index/)
- [correctness.mutable-collection-key@1.0.0 — Key changes equality or hash while in a collection](https://docs.swift-analyzer.com/catalog/correctness.mutable-collection-key/)
- [correctness.bounded-ordering-law@1.0.0 — Ordering laws are violated](https://docs.swift-analyzer.com/catalog/correctness.bounded-ordering-law/)
- [correctness.canonical-output-nondeterminism@1.0.0 — Unstable ordering reaches canonical output](https://docs.swift-analyzer.com/catalog/correctness.canonical-output-nondeterminism/)
- [portfolio.cor.08@1.0.0 — Size or count exceeds its numeric range](https://docs.swift-analyzer.com/catalog/portfolio.cor.08/)
- [portfolio.cor.09@1.0.0 — Non-finite value reaches a finite-only consumer](https://docs.swift-analyzer.com/catalog/portfolio.cor.09/)
- [portfolio.cor.10@1.0.0 — Interprocedural path reaches an invalid force operation](https://docs.swift-analyzer.com/catalog/portfolio.cor.10/)
- [portfolio.cor.11@1.0.0 — Single-pass sequence is consumed more than once](https://docs.swift-analyzer.com/catalog/portfolio.cor.11/)
- [portfolio.cor.12@1.0.0 — Copy violates the state-independence contract](https://docs.swift-analyzer.com/catalog/portfolio.cor.12/)
- [portfolio.cor.13@1.0.0 — Producer and consumer canonicalize identity differently](https://docs.swift-analyzer.com/catalog/portfolio.cor.13/)
- [portfolio.cor.14@1.0.0 — Written value is lost before observation](https://docs.swift-analyzer.com/catalog/portfolio.cor.14/)
- [portfolio.cor.15@1.0.0 — Predicate does not distinguish valid states](https://docs.swift-analyzer.com/catalog/portfolio.cor.15/)
- [portfolio.cor.16@1.0.0 — Conditional-result branches are semantically identical](https://docs.swift-analyzer.com/catalog/portfolio.cor.16/)
- [portfolio.cor.17@1.0.0 — Control-flow region is unreachable](https://docs.swift-analyzer.com/catalog/portfolio.cor.17/)
- [portfolio.cor.18@1.0.0 — Computed result is discarded without a useful effect](https://docs.swift-analyzer.com/catalog/portfolio.cor.18/)
- [portfolio.cor.19@1.0.0 — Comparison violates its numeric precision contract](https://docs.swift-analyzer.com/catalog/portfolio.cor.19/)
- [portfolio.stream.01@1.0.0 — Buffer or accumulator lacks a required bound](https://docs.swift-analyzer.com/catalog/portfolio.stream.01/)
- [portfolio.stream.02@1.0.0 — Drop policy violates required event delivery](https://docs.swift-analyzer.com/catalog/portfolio.stream.02/)
- [portfolio.stream.03@1.0.0 — Concurrent next calls on a single-consumer iterator](https://docs.swift-analyzer.com/catalog/portfolio.stream.03/)
- [portfolio.stream.04@1.0.0 — Stream is not finished on a required terminal path](https://docs.swift-analyzer.com/catalog/portfolio.stream.04/)
- [portfolio.stream.05@1.0.0 — Retry or refresh forms a loop without progress or budget](https://docs.swift-analyzer.com/catalog/portfolio.stream.05/)
- [portfolio.stream.06@1.0.0 — Retry duplicates a non-idempotent effect](https://docs.swift-analyzer.com/catalog/portfolio.stream.06/)
- [portfolio.stream.07@1.0.0 — Related changes escape a required transaction](https://docs.swift-analyzer.com/catalog/portfolio.stream.07/)
- [portfolio.ui.01@1.0.0 — Element identity is unstable across updates](https://docs.swift-analyzer.com/catalog/portfolio.ui.01/)
- [portfolio.ui.02@1.0.0 — Distinct elements share one identity](https://docs.swift-analyzer.com/catalog/portfolio.ui.02/)
- [portfolio.ui.03@1.0.0 — View computation causes a state-update cycle](https://docs.swift-analyzer.com/catalog/portfolio.ui.03/)
- [portfolio.ui.04@1.0.0 — One-time state does not update with required input](https://docs.swift-analyzer.com/catalog/portfolio.ui.04/)
- [portfolio.change.01@1.0.0 — Source API change breaks an admitted consumer](https://docs.swift-analyzer.com/catalog/portfolio.change.01/)
- [portfolio.change.02@1.0.0 — ABI change breaks binary compatibility](https://docs.swift-analyzer.com/catalog/portfolio.change.02/)
- [portfolio.change.03@1.0.0 — Existing signature gains incompatible behavior](https://docs.swift-analyzer.com/catalog/portfolio.change.03/)
- [portfolio.change.04@1.0.0 — Consumer silently binds to a different symbol](https://docs.swift-analyzer.com/catalog/portfolio.change.04/)
- [portfolio.change.05@1.0.0 — Version range admits an incompatible provider](https://docs.swift-analyzer.com/catalog/portfolio.change.05/)
- [portfolio.change.06@1.0.0 — Change bypasses required consumer review](https://docs.swift-analyzer.com/catalog/portfolio.change.06/)
- [portfolio.change.07@1.0.0 — Comparable resource bound regresses](https://docs.swift-analyzer.com/catalog/portfolio.change.07/)
- [portfolio.change.08@1.0.0 — Cache key or invalidation omits a result dependency](https://docs.swift-analyzer.com/catalog/portfolio.change.08/)


---

Language: en
Canonical: https://docs.swift-analyzer.com/catalog/
Product revision: 524fa07e0ae4153c84ac12ae9eb6559df89ec2be
Catalog revision: 4558458d
Documentation digest: 1f17ba58ab08627e0de898f1442067b09e960b48cd5605d6529e9275f8930d68
Channel: pre-prod; maturity: experimental; access: owner-provided checkout.
