# How do specifications work? A **Specification** is designed to be easy for humans to understand. However, **Specifications** are also highly structured so that computer software may automatically and accurately check information requirements with no ambiguity. Every **Specification** has three main parts: 1. **Description**: a description of the rationale for the **Specification** and instructions of how to achieve it. This part is designed for humans to read and understand why information is being requested. This field is also used to describe the rationale for the various applicability facets, and how they serve to identify the relevant data contracts on an asset as a whole, rather than individually. Conversely, the `description` data on each requirement facet should help the user understand the purpose of the individual piece of information required. 1. **Applicability**: Identifies the subset of the model that we are intending to specify. There are many different types of objects in IFC models, but each **Specification** only applies to a subset. The subset can be identified via the available facets like entity (e.g. walls, windows), classification (e.g. Uniclass EF_25_10_25 External walls), and others. 1. **Requirements**: what information is required for subset identified in the applicability, such as required properties or materials. For example, the **Specification** of "_all walls must have a fire rating property_" is structured like so: 1. **Description**: wall fire ratings are critical for building code compliance 1. **Applicability**: this specification applies to all wall objects 1. **Requirements**: the aforementioned wall objects must have a fire rating property ## How specifications can describe information **Applicability** and **Requirements** are described using a collection **Facets**. A **Facet** describes information that a single entity (e.g. wall, door, etc) in your model may have. A **Facet** describes its information precisely using fixed **Facet Parameters** so that computers can understand exactly what information you are after. When a **Facet** is used in the **Applicability** section, it describes the information that we use to identify the relevant parts of the model. When a **Facet** is used in the **Requirements** section, it describes the information constraints that the model parts must fulfill to comply with the **Specification**.  There are six different **Facets** of information: | Facet Type | Facet Parameters | Example applicability | Example requirement | | ------------------ | ----------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | **Entity** | **IFC Class** and **Predefined Type** | Applies to "IfcWall" with predefined type of "SHEAR" | Must be an "IfcWall" with a predefined type of "SHEAR" | | **Attribute** | **Name** and **Value** | Applies to elements with the attribute "Name" having the value "W01" | Must have the attribute "Name" with the value "W01" | | **Classification** | **System** and **Value** | Applies to elements classified under "Uniclass 2015" as "EF_25_10_25" | Must have a "Uniclass 2015" classification reference of "EF_25_10_25" | | **Property** | **Property Set**, **Name**, and **Value** | Applies to elements with a property set of "Pset_WallCommon" with a "LoadBearing" property set to "TRUE" | Must have a "Pset_WallCommon" property set with a "LoadBearing" property set to "TRUE" | | **Material** | **Value** | Applies to "concrete" elements | Must have a "concrete" material | | **Parts** | **Entity** and **Relationship** | Applies to elements that are "contained in" an "IfcSpace" | Must be "contained in" an "IfcSpace" | You can combine multiple **Facets** together in either the **Applicability** or **Requirements** section to describe a wide variety of **Specifications**. Some **Facets** may have optional **Facet Parameters**. For example, if you want to specify that a property should exist, but not the exact value, you may omit the value parameter of the **Property Facet**. You may also specify a list of valid values, or a range of numbers, or text pattern for some **Facet Parameters**. These are known as **Complex Restrictions**. For example, you would use a **Complex Restriction** to specify that a fire rating property must choose from either the value "0HR", "1HR", or "2HR" only. Here are a few examples to wet your appetite: | Intent | Applicability | Requirements | | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | External load bearing walls need to have a fire rating property for code compliance |