Attribute
Attributes belong to types; each attribute has its own configuration, governed by the rules of its attribute type.
If you want different access permissions for specific attributes, see Attribute permissions.
Creating an attributeโ
Mockup, not a screenshot โ confirmed against CreateAttributeDialog.tsx (components/SpaceSchemaModal/SpaceSchemaEditor/AttributeTable). The attribute type picker is a searchable card grid covering all 25 user-facing types (six shown here), not a dropdown; types that need extra configuration (Reference, Workflow, SLA, Depreciation) open a second "Configure" step instead of creating immediately.
You can create attributes manually, or with AI: describe what you need in plain language, and it will generate attributes you can review and select to create.
Create Attributes with AI
Use our default instruction or provide your own to generate attributes for this type.
Mockup, not a screenshot โ confirmed against TypeTemplateDialog.tsx (opened from the type's "Create with AI" button next to "+ New attribute"). "Give me the standard attributes of this type" is the real pre-filled default instruction โ you can replace it with your own.
Create Attributes with AI
We have provided attributes that are suitable for your Type. Select the attributes you want to create and leave the other ones disabled.
| Name | Type | Description | |
|---|---|---|---|
| Warranty period | Integer | Length of the manufacturer warranty, in months | |
| Discontinued | Boolean | Whether this product has been discontinued | |
| Supplier | Reference | The vendor this product is sourced from |
Mockup, not a screenshot โ confirmed against TypeTemplateDialog.tsx. Names/types/descriptions shown are illustrative, not real generated output. A suggestion whose name matches an attribute that already exists on the type is greyed out and can't be selected.
Label attributeโ
A label attribute is a mandatory, single-value attribute required for every type โ each type must
have exactly one attribute designated as the label. Whether a given attribute type can be used as
a label is controlled by that attribute type's labelSupport rule (see the table below for which
types currently support it).
When creating an object, a value for the label attribute must be provided. The label value serves as the object's "title," used to represent it across graphs, views, and references.
Attribute typesโ
An attribute type defines what kind of data an attribute can hold (e.g. text, integer, date) and the expected behavior for that attribute.
Cross-checked against AttributeTypeCode in the backend (libs/core/attribute-types). All 25
user-facing types below match the current enum. The enum also defines a RANK type not covered
here โ see Rank.
| Attribute type | Description | Rules | Configuration |
|---|---|---|---|
Text (STRING) | Names, identifiers, and free text values. | Label support: yes ยท User-updatable: yes | Required, uniqueness, regex, character limit (max 32,000 bytes) |
Rich text (STRING) | Markdown-formatted descriptions. | Label support: no ยท User-updatable: yes | Required, uniqueness (max 32,000 bytes) |
Date (DATE) | A calendar date with no time component โ launch dates, end-of-life dates. | Label support: no ยท User-updatable: yes | Required, uniqueness |
DateTime (DATETIME) | A date with a time component โ calendar invites and similar. | Label support: no ยท User-updatable: yes | Required, uniqueness |
Date Range (DATE | DATETIME) | A start and end date on a type. | Label support: no ยท User-updatable: yes | Required, type (date or datetime) |
Integer (INTEGER) | Whole numbers โ quantities, numerical identifiers, weight in grams. | Label support: yes ยท User-updatable: yes | Required, uniqueness |
Decimal (DECIMAL) | Numbers with a decimal component. | Label support: yes ยท User-updatable: yes | Required, uniqueness |
Boolean (BOOLEAN) | Yes/no values โ e.g. "Dishwasher safe," "Discontinued." | Label support: no ยท User-updatable: yes | Required |
Reference (REFERENCE) | A reference to another object of a type specified in the configuration. With includeChildren enabled (requires type inheritance), objects from both the parent type and its child types can be selected. | Label support: no ยท User-updatable: yes | Min/max cardinality (default 0 / 1, unlimited if blank), uniqueness, reference type, cascading |
User (USER) | A reference to a workspace user. | Label support: no ยท User-updatable: yes | Min/max cardinality, uniqueness |
Option (STRING) | One or many values from a configured, ordered set of options. | Label support: no ยท User-updatable: yes | Min/max cardinality, uniqueness, options list |
Priority (STRING) | A set of priorities; sort order follows priority order. | โ | Min cardinality, priorities list (defaults: Lowest, Low, Medium, High, Highest) |
Email (STRING) | An email address, optionally restricted by allowed/blocked domains. | Label support: yes ยท User-updatable: yes | Domains (allow/block list), required, uniqueness |
URL (STRING) | A link to an external resource. | Label support: no ยท User-updatable: yes | Required, uniqueness |
Media (STRING/BINARY) | A file of any format. Max size 200 MB; preview available for images, video, and PDF. | Label support: no ยท User-updatable: yes | Min/max cardinality |
Completeness (DECIMAL) | Tracks completion progress by "listening" to whether other attributes have values. | Label support: no ยท User-updatable: no | Select which attributes count toward completeness |
Calculated (DECIMAL) | Computes a result from other numeric attributes via a formula, e.g. `{{Car speed}} * {{Driving time}}`. Supports INTEGER, DECIMAL, RATING, CALCULATED, TEXT, OPTION, DATE_RANGE, and one level of reference traversal. | Label support: no ยท User-updatable: no | Formula, formatting, aggregation, supported functions (max, min, average, median) |
Composite (STRING) | Combines values from other attributes into a string, e.g. `{{First name}} {{Last name}}`. | Label support: no ยท User-updatable: no | Text template, supported functions (max, min, average, median, upper/lowercase, trim, replace) |
Location (STRING) | A location name plus latitude/longitude. | Label support: no ยท User-updatable: yes | Required, uniqueness |
SLA (STRING) | A service level agreement, with goals, conditions, and breach/remaining/elapsed tracking. | Label support: no ยท User-updatable: no | Goals (scope, priority, time target), conditions (start/pause/stop), display type |
Workflow (STRING) | Connects an object to a workflow and moves it through that workflow's stages. | Label support: no ยท User-updatable: yes | Required, workflow selection |
IP address (STRING) | An IPv4 or IPv6 address, optionally validated against a CIDR range. | Label support: yes ยท User-updatable: yes | Required, uniqueness, CIDR |
Sequence (STRING) | An auto-generated sequence value on object creation, e.g. TECH-1, TECH-2. | Label support: no ยท User-updatable: no | Optional prefix |
Rating (DECIMAL) | A star rating. | Label support: no ยท User-updatable: yes | Required, max rating (default 5), allow half values |
Depreciation (DECIMAL) | The calculated book value of an asset; recalculated monthly from purchase price, start date, useful life, and residual value. | Label support: no ยท User-updatable: no | Depreciation method (straight line, declining balance), linked attributes |
Starhive also uses several system-managed attribute types (not user-configurable) for built-in fields like created/updated timestamps, the object's avatar image, and the creating user.
Querying attributes with StarQLโ
Every attribute type supports the operators explained in Which operators apply to which attribute type โ what follows here is what's distinctive per type, plus real worked examples for each.
Referenceโ
Connects an object to other objects, and is the basis for all relationship queries โ including the
->/<- reference-traversal operators used throughout StarQL.
Beyond the shared operators (matched against the referenced object's label), Reference adds:
| Operator | Example | Description |
|---|---|---|
-> | Manager -> starQL(Department = Engineering) | Outbound: filter by attributes of the referenced object(s). |
<- | @Objects <- starQL(Position = Manager) | Inbound: find objects referenced by others matching a query. |
. | Employee.Manager.City.Country = Sweden | Dot notation โ traverses a chain of references to unlimited depth. |
Functions: starQL(...) (nest a query, recursively), objectId(uuid) (match a specific
referenced object by ID).
Basic reference filters:
Manager = Jack
Manager * Jack
Project * "Quarterly Review"
Manager = "Jack \"The Eagle\" Wilson"
Manager #* Jack
Manager *# son
Project is empty
Project is not empty
Outbound filtering (->):
Manager -> starQL(Department = Engineering)
Customer -> starQL(Country = "United States")
Customer -> starQL("Billing Address" * "New York")
@Objects -> starQL("Engagement type" = Project AND Title * "AI Research")
Inbound filtering (<-):
@Objects <- starQL(Order Status = Active)
@Objects <- starQL(Position = Manager AND Name * Jack)
Dot notation (unlimited depth):
Manager.Department.Location = Stockholm
Customer.Company."Main Office".Country = Sweden
Project."Client Contact"."Full Name" = "Jack \"The Eagle\" Wilson"
Nested starQL() recursion:
Manager -> starQL(Manager = Jack)
@Objects <- starQL("Engagement type" = Project AND Customer -> starQL("Billing Address" * London))
Using objectId():
Project = objectId(c7b3b1b0-3aad-46b9-a91a-460993163665)
If the attribute has Reference Properties, use
Attribute -> starQL(<query on the referenced object>;<query on the reference's own properties>):
ReportsTo -> starQL(;"Since" < "2020-01-01")
Purchased -> starQL(;Rating >= 4 AND "Purchase Date" >= now(-30d))
Friends -> starQL(;"Relationship Strength" > 0.8 AND Since >= "2024-01-01")
Friends -> starQL(Country = Sweden;"Relationship Strength" > 0.8 AND Since >= "2024-01-01")
Practical tips: use -> for outbound filtering and <- for inbound; dot notation supports
unlimited depth; quotes are optional for values/attribute names with no spaces, mandatory when
they contain spaces.
Textโ
Free text โ names, identifiers, titles. Supports the full shared set (equality, string matching, set, emptiness, history).
Title = Report
Name == "Annual Report"
Summary != Draft
Title !== "Final Report"
Title ~ Reprot
Summary * progress
Summary !* confidential
Name #* Ann
Title *# ment
Tagline is empty
Description is not empty
@Type = Document AND (Title * Q1 OR Summary * Finance)
@Type = Task AND Title * Review AND Summary * Approval
@Type = Project AND Name #* AI AND Description is not empty
Practical tips: use = for case-insensitive equality and == for strict equality; use ~ for
flexible, typo-tolerant searches when spelling might vary; always quote text containing spaces;
escape internal quotes with backslashes (e.g. "He said: \"Yes\"").
Rich textโ
Markdown-formatted long-form content. Restricted: only *, !*, is empty, is not empty,
and history โ no equality or anchored matching, since exact/prefix matching rarely makes sense
against formatted prose.
"Detailed Description" * network
Notes !* draft
Summary is not empty
"Detailed Description" is empty
Title * Proposal AND "Detailed Description" * security
Content is empty AND Name is not empty
@Type = Project AND (Summary * architecture OR "Detailed Description" * architecture)
Practical tips: equality operators (=/!=) aren't supported for rich text โ use */!*
instead; searches are case-insensitive.
Dateโ
A calendar date with no time component. Supports ordering and the date functions below.
Functions (all accept an offset โ h, d, w, m, y): now(), startOfDay(),
endOfDay(), startOfWeek(), endOfWeek(), startOfMonth(), endOfMonth(), startOfYear(),
endOfYear().
"Created date" = 2025-01-01
"Created date" < 2025-01-01
"Updated date" > 2025-04-01
"Updated date" >= 2025-01-01 AND "Updated date" <= 2025-06-30
"Created date" is empty
"Completion date" is not empty
"Created date" >= now(-1m)
"Created date" >= now(-7d)
"Updated date" >= startOfWeek()
"Updated date" >= startOfWeek(-1w) AND "Updated date" <= endOfWeek(-1w)
"Created date" >= startOfDay() AND "Created date" <= endOfDay()
"Created date" >= startOfDay(-1d) AND "Created date" <= endOfDay(-1d)
"Completion date" >= startOfMonth() AND "Completion date" <= endOfMonth()
"End date" <= endOfMonth(3m)
"Created date" >= startOfYear(-1y) AND "Created date" <= endOfYear(-1y)
@Type = Project AND "Start date" > 2025-04-01 AND Title * AI
@Type = Task AND "Created date" >= now(-2w) AND Assignee = "John Doe"
@Type = Document AND "Updated date" >= startOfMonth() AND "Updated date" <= endOfMonth() AND Status = Published
@Type = Order AND "Created date" < now(-1y) AND Status = Open
Practical tips: dates must be written in YYYY-MM-DD format; negative offsets (-1m, -2w)
refer to the past, positive offsets (1d, 2m) to the future.
DateTimeโ
A date with a time component. Same functions and format as Date, plus timezone-aware literals
(2025-10-14T14:55:08 local, or 2025-10-14T14:55:08Z UTC).
Also backs two system attributes with identical StarQL behavior: Created and Updated.
Created >= startOfDay(-7d)
Updated < 2025-10-14T00:00:00Z
"Start time" = 2025-10-14T14:55:08
"Meeting time" > 2025-04-01T12:00:00Z
"End time" >= now(-1d)
"Start time" >= now(-3h)
"Completion time" >= startOfDay() AND "Completion time" <= endOfDay()
"Meeting time" >= startOfDay(-1d) AND "Meeting time" <= endOfDay(-1d)
"Start time" >= startOfWeek(-1w) AND "Start time" <= endOfWeek(-1w)
"Start time" <= endOfMonth() AND "End time" >= startOfMonth()
"Start time" >= startOfMonth(1m) AND "Start time" <= endOfMonth(1m)
"End time" < now(-1y)
"Start time" is empty
"End time" is not empty
@Type = Task AND Status = Active AND "End time" < now()
@Type = Project AND Title * Review AND "Start time" >= startOfWeek() AND "Start time" <= endOfWeek()
Practical tips: always use ISO 8601 (local YYYY-MM-DDThh:mm:ss, UTC
YYYY-MM-DDThh:mm:ssZ); use functions for relative filtering and combine start/end functions to
define clear time windows.
Date Rangeโ
A start/end span, configured to hold either Date or DateTime values. Queried two ways: point-in-range
(compare to a single date, using =/!=) or range-vs-range (compare to another range).
Functions: dateRangeIntersects(d1, d2) (any overlap), dateRangeContains(d1, d2) (fully
covers), dateRangeWithin(d1, d2) (entirely inside), dateRangeEqual(d1, d2) (exact match). Range
function arguments can use unparenthesized offset subfunctions like startOfDay-2w or
startOfMonth+1m.
"Contract period" = 2025-02-15
"Maintenance window" = 2025-10-14T14:55:08
"Event duration" = 2025-10-14T12:55:08Z
"Contract period" != 2025-02-01
"Booking window" is empty
"Booking window" is not empty
"Contract period" = dateRangeIntersects(2025-02-01, 2025-02-28)
"Project timeline" = dateRangeWithin(startOfYear, startOfYear+1y)
"Warranty coverage" = dateRangeContains(startOfMonth, startOfMonth+1m)
"Event schedule" = dateRangeEqual(startOfWeek, startOfWeek+1w)
"Contract period" = dateRangeIntersects(startOfDay-2w, now)
"Vacation period" = dateRangeWithin(startOfMonth+1m, startOfMonth+2m)
@Type = Project AND Title * Migration AND "Project duration" = dateRangeIntersects(startOfMonth, startOfMonth+1m)
Practical tips: use point-in-range to check whether a single Date/DateTime falls inside a
stored range; use range functions for span-to-span logic; subfunctions in range functions don't
use parentheses (e.g. startOfDay-2w).
Integerโ
Whole numbers. Ordering plus equality and set membership; no string matching.
Function: countStarQL(<nested query>) โ returns the count of matching objects, usable on
either side of a comparison.
Quantity = 10
Count != 5
Age < 18
Age > 30
Score <= 50
Score >= 90
Attempts is empty
Attempts is not empty
Age >= 20 AND Age <= 35
Quantity > 100 AND Quantity < 500
Count > 50 AND Score is empty
Name * Laptop AND Quantity < 50
@Type = Task AND Priority > 3 AND Title * Critical
Quantity in (1, 2, 3)
Quantity not in (0, 99)
Age not in (18, 21)
(Quantity in (5, 10, 15) OR Quantity > 100) AND Status = Open
Stock < countStarQL(@Type = Order AND Status = Open)
Practical tips: use <, >, <=, >= for ranges, =/!= for exact matches; integer
attributes can't use text operators like * or ~; values are numeric only, no quotes.
Decimalโ
Numbers with a decimal component. Ordering plus equality and set membership; no string matching.
Function: countStarQL(<nested query>).
Price = 99.99
Score != 7.5
Weight < 12.5
Weight > 100.5
Price <= 20.0
Price >= 50.0
Price in (9.99, 19.99, 29.99)
Price not in (0.00, 9999.99)
Discount is empty
Discount is not empty
@Type = Product AND Category = Electronics AND Price > 500.00
@Type = Employee AND Score > 8.5 AND Bonus is empty
Total >= 100.50 AND Total <= 500.75
Stock < countStarQL(@Type = Order AND Status = "Waiting to be shipped" AND Product = "Labubu the Monster")
Booleanโ
true/false values only. Restricted to =, !=, is empty, is not empty, and history โ
no ordering or string matching.
Active = true
Active = false
Archived = true
Archived != true
Approved = true
Approved = false
Published is empty
Published is not empty
@Type = Project AND Active = true AND Title * Migration
Active = false AND "Last login" >= now(-1m)
Practical tip: Boolean values must always be written as true or false, without quotes.
Optionโ
One or more values from a configured, ordered list. Full shared operator set.
Plan = Premium
Plan != Basic
Plan ~ Premum
Region * East
Region #* North
Size *# XL
Plan is empty
Plan is not empty
Plan in (Basic, Premium, Enterprise)
Region not in (North, Central)
@Type = Product AND Plan = Premium AND Size = "Extra Large"
Plan = Enterprise AND Grade is empty
Plan * Pro AND Region !* West
Userโ
References a workspace user, matched by label (name), with dedicated functions. Also backs the
system attribute Creator (identical StarQL behavior).
Functions: userEmail(email), userCurrent() (the logged-in user), userId(uuid).
Creator = userCurrent()
Creator = Jack
Assignee = Jack
Reviewer = "Jack \"The Eagle\" Wilson"
Assignee #* Ja
Owner *# son
Assignee != Jack
Assignee = userEmail(jack@starhive.com)
Owner = userCurrent()
Reviewer = userId(c7b3b1b0-3aad-46b9-a91a-460993163665)
Reviewer is empty
Reviewer is not empty
@Type = Project AND Owner = userCurrent() AND Assignee = "Jack Svensson"
@Type = Document AND (Owner #* Jack OR Assignee *# Wilson)
Practical tip: userCurrent() filters dynamically for the active session user.
Emailโ
An email address, with dedicated function support.
Function: userCurrentEmail() โ the current user's own email.
"Contact email" = jack@starhive.com
"Contact email" *# starhive.com
"Contact email" #* sales
"Contact email" ~ gmal.com
"Contact email" in (jack@starhive.com, jill@starhive.com)
"Contact email" not in (noreply@starhive.com, test@starhive.com)
"Contact email" is empty
"Contact email" is not empty
"Contact email" * starhive.com AND "Contact email" !* support
"Contact email" *# .org OR "Billing email" *# .net
ContactEmail = userCurrentEmail()
Practical tip: don't quote standard emails; combine email filters with other attribute types (user, reference, date) for richer queries.
URLโ
A link to an external resource. Full shared operator set โ no dedicated functions.
Website = https://www.starhive.com
Website != https://test.starhive.com
Website ~ starhiev.com
Website * starhive.com
Website !* staging
Website in (https://www.starhive.com, https://help.starhive.com)
Website not in (https://old.starhive.com, https://test.starhive.com)
Website #* https://docs
Website *# .pdf
Website is empty
Website is not empty
Website #* https://help.starhive.com
Website * api AND Website !* starhive.com
PublishedDate >= startOfMonth() AND Website * news
Customer -> starQL("Company website" *# .se)
Practical tips: URL comparisons are case-insensitive unless you use strict operators
(==/!==); do not quote URLs.
Mediaโ
An uploaded file, matched by filename. Full shared operator set โ no dedicated functions. Also
backs the system attribute Avatar (the object's image), with identical behavior.
Avatar is not empty
Avatar * thumbnail
Attachment = banner.png
Attachment != logo.jpg
Attachment * report
Attachment is empty
Attachment is not empty
Attachment in (banner.png, brochure.pdf, logo.jpg)
Attachment not in (draft.docx, placeholder.jpg)
Category = Marketing AND "Media file" * promo AND "Created date" >= startOfMonth()
"Media file" * spec AND "Media file" !* old AND "Updated date" >= startOfWeek()
Practical tips: media filters are case-insensitive; quotes are required only for filenames
containing spaces (e.g. "Marketing Banner.png").
Priorityโ
An ordered set of priority levels (default: Lowest, Low, Medium, High, Highest). Full shared operator set โ order/sort behavior follows the configured priority order, not alphabetically.
Priority = High
Severity * Urgent
Priority != Low
Severity is not empty
Priority is empty
Priority in (High, Medium)
Priority not in (Low, Lowest)
Priority #* P-
Priority *# -1
Priority * Urgent AND Assignee = Jack AND "Updated date" >= startOfWeek()
Priority = High AND Priority not in (Backlog) AND "Created date" >= startOfMonth()
Compositeโ
A string built from a template combining other attributes, e.g. {{First name}} {{Last name}}
(see the Configuration column above). Queried the same way as Text, against its computed value.
"Full name" = "Jack Wilson"
"Display name" == "Jack Wilson, Senior Engineer"
"Product summary" !* Draft
"Product summary" * "Premium Package"
"Display name" #* Jack AND "Display name" not in ("Jack Test", "Jack Sample")
"Product summary" ~ Summar
"Full name" = "Jack \"The Eagle\" Wilson"
@Type = Product AND "Product summary" * "Summer Sale" AND "Publication date" >= startOfMonth()
("Display name" #* Jack OR "Display name" == "Wilson, Jack") AND "Display name" !* Test
Practical tips: composite values are usually multi-word โ quote values containing spaces; escape internal quotes with backslashes.
Ratingโ
A numeric star rating. Ordering plus equality; no string matching (it's numeric, not text).
Rating = 5
Rating != 3
Rating > 4
Rating >= 4.5
Rating < 2
Rating is not empty
Rating is empty
Rating >= 4 AND UpdatedDate >= startOfMonth()
Assignee = Jack AND Rating < 3.5
@Type = Article AND Title * Guide AND Rating is not empty
Practical tip: ratings may be integers or decimals depending on configuration โ use . as the
decimal separator (e.g. 4.5).
Completenessโ
A calculated percentage tracking how many designated attributes have values. Ordering plus
equality, plus countStarQL(...).
"Readiness for sale" = 100
"Readiness for sale" < 50
"Readiness for sale" not in (0, 99)
Images is empty AND "Readiness for sale" >= 75
"Readiness for sale" is empty
@Type = Project AND Status = Active AND Assignee = Jack AND "Readiness for sale" < 90
"Readiness for sale" >= 90 AND Status != Published
"Onboarding completeness" < 100
"Readiness for sale" < 80 AND countStarQL(@Type = Order AND Status = Open) > 0
Sequenceโ
An auto-generated identifier, optionally prefixed (TECH-123). Numeric comparisons work even
through a text prefix; also supports strict/non-strict equality and set membership.
ID = 123
"Product key" = TECH-123
pid == ord-0001
"Order id" != 999
Id in (100, 101)
Sequence not in (0, 99999)
pid < TECH-200
Key >= REV-99
@Type = Order AND ID > 1000 AND ID not in (TEST-1005, TEST-2004)
Practical tip: numeric operators (=, <, >, <=, >=) work even when the value includes
a text prefix; no need to quote values.
Calculatedโ
A computed decimal from a formula referencing other attributes. Ordering, equality, and
countStarQL(...), same as Decimal.
"Calculated score" = 12.5
"Calculated score" not in (0.0, 9999.0)
"Profit margin" < 0.20
"Discounted price" <= 19.99
"Backlog index" > countStarQL(@Type = Order AND Priority = High AND Status = Open)
@Type = Product AND Assignee = Jack AND "Profit margin" < 0.10
"Readiness ratio" < 0.8 AND countStarQL(@Type = Order AND Status = Pending) > 0
IP addressโ
An IPv4 or IPv6 address. Full shared operator set for exact/substring matching, plus subnet matching.
Function: CIDR(range) โ matches addresses inside a subnet, in either IPv4 or IPv6 CIDR
notation. Prefer this over substring matching (*) for real network-aware checks.
"IP address" = 192.168.0.10
"Source IP" = 2001:0db8:85a3:0000:0000:8a2e:0370:7334
"IP address" != 10.0.0.5
"IP address" = CIDR(192.168.0.0/24)
"Source IP" != CIDR(2001:0db8:85a3::/48)
"IP address" in (192.168.0.10, 10.0.0.5)
"IP address" not in (127.0.0.1, ::1)
"IP address" #* 10.0
"IP address" is empty
"Remote address" is not empty
"IP address" = CIDR(10.10.0.0/16) AND Status = Active
"IP address" * 192.168.1
Practical tips: prefer CIDR() for correct subnet matching; string operators (*, #*) do
substring matching, not true network-aware checks; use in/not in for small allow/deny lists of
exact IPs.
Workflowโ
Connects an object to a workflow and tracks its current state. Full shared operator set, plus
is endstate / is not endstate for final states.
Function: stateId(uuid) โ match a specific workflow state by ID.
Status = Draft
"Campaign status" = "In review"
"Campaign status" not in (Test, "Demo Stage")
Status != stateId(c7b3b1b0-3aad-46b9-a91a-460993163665)
Status #* Approve
Status is endstate
"Delivery stage" is not endstate
"Campaign status" is endstate AND Assignee = Jack
"Delivery stage" is not endstate AND Assignee = Jack
Status is endstate AND Archived != true
Practical tips: quote values/attribute names that contain spaces; is endstate covers all
final states when a workflow has more than one.
Locationโ
A location label plus latitude/longitude. Full shared operator set for the label text, plus geospatial functions.
Functions: radius(lat, lng, distance) (within a distance โ m, km, ft, mi),
polygon({lat|lng}, {lat|lng}, ...) (inside an area โ minimum 3 vertices, WGS84 decimal degrees).
Location == "New York, NY, USA"
"Store location" * "Central Station"
Location = radius(59.6493928, 17.9342942, 1km)
Location != radius(59.6493928, 17.9342942, 500m)
Location = polygon({59.6564539|17.9413554}, {59.6564539|17.9272330}, {59.6423316|17.9413554}, {59.6423316|17.9272330})
"Store location" = radius(59.6493928, 17.9342942, 5km) AND Status = Open
"Warehouse Location" != polygon({59.65|17.90}, {59.65|17.95}, {59.60|17.95}, {59.60|17.90})
Location is empty
Practical tips: radius()/polygon() operate on the stored lat/long pair โ use them instead
of text matching for real geospatial logic; quote attribute names or values only when they
contain spaces.
Depreciationโ
A calculated, decreasing book value (see the Configuration column above). Ordering plus equality, same as Decimal โ no string matching.
Book value = 9999.99
Book value != 7500
Book value < 12500.5
Book value > 100000
Book value <= 20
Book value >= 50000
Book value in (9999.99, 19999.99, 29999.99)
Book value not in (0, 1)
Book value is empty
Book value is not empty
@Type = Asset AND Category = IT AND Book value > 5000
Book value >= 10000 AND Book value <= 50000
SLAโ
A service level agreement with goals, conditions, and breach tracking. Equality, emptiness,
is endstate, and history, plus dedicated timing functions.
Functions: breached(), remaining(duration), elapsed(duration).
"Time to resolution" = PAUSED
"Time to resolution" != PAUSED
"Time to resolution" is empty
"Time to resolution" is endstate
"Time to resolution" = breached()
"Time to resolution" = remaining(2h)
"Time to resolution" = elapsed(8h)
Rankโ
RANK is a defined AttributeTypeCode in the backend (libs/core/attribute-types) with no
existing documentation. Its customer-facing name, purpose, and whether it's currently
user-selectable in the UI need to be confirmed with product/engineering before this section can be
written.