Field reference
Every field on every Platform and Apps form: label in English and Arabic, type, whether it is required, its limits, a valid example and what the system refuses.
On this page (24)
Package recordPackage > Licence reviewPackage > Send back / RetireExtension recordRelease recordRelease > Packages tabRelease > ApproveRelease > RecoverRelease > Recover / Retire / Send back / CancelRelease > Evidence > RehearseEnvironment recordEnvironment > ApproveJob recordJob > Run nowRestore drills > Run a restore drillAlert policy recordRelease policy recordFlag recordFlag > Propose a value / Propose a changeFlag > RefuseFlag > Companies tabAdvisories > Import OSV advisoriesAdvisories > WaivePlatform roles > Grant a role
Package record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Code | الرمز | Text | Yes | Create only; turned to capitals; must match capitals, digits and _ , 2-40 characters, starting with a letter | X_DEMO | '1abc' -> 'A package code is capitals, digits and _ (2-40).' | |
| Version | الإصدار | Text | Yes | Create only; semantic version major.minor.patch (optional -suffix); unique with the code | 1.0.0 | '1.4' -> 'Use a version such as 1.4.0.'; an existing code+version -> 'That version of the package is already registered.' | |
| Title | العنوان | Text | Yes | Max 160 | Demo extension package | (empty) -> 'This is required.' | |
| Artifact SHA-256 | بصمة SHA-256 | Text | Yes | Create only; exactly 64 hex characters (turned to lower case) | 64 x 'a' (aaaa...aaaa) | 'abc123' -> 'Give the SHA-256 of the package artifact (64 hex characters).' | |
| Origin | المصدر | Text | No | Max 400; manifest packages show repo://modules/<name> | https://example.test/x_demo | ||
| Licence | الترخيص | Text | No | Max 80 | MIT | 81 characters -> 'Keep this to 80 characters or fewer.' | |
| Licence review | مراجعة الترخيص | Read only (set by the Licence review step) | No | Pending / Approved / Not required / Rejected; must be Approved or Not required before Review | Pending | Approved | |
| Support owner | مسؤول الدعم | Text | Conditional | Max 120; support owner OR maintainer needed before Review | Platform lead | Both empty, then Review -> 'Name the support owner or maintainer.' | |
| Maintainer | المشرف | Read only | No | Set only through the API (maintainer_id, an active person) | (API) an inactive user -> 'Choose an active person.' | ||
| Core versions | إصدارات النواة | Text (version range) | No | Range grammar: '', '*', '1', '1.x', '^1.2.0', '~1.2.0', '>=1.0, <2.0'; this build is core 1.0.0 | 1 | >=1.0, <2.0 | 'abc' -> ''abc' is not a version number.'; '2' saves but Review says 'X_DEMO 1.0.0 needs core 2; this build is core 1.0.0.' |
| Dependencies (one per line: CODE range) | الاعتماديات (سطر لكل: الرمز النطاق) | Lines | No | Max 60 lines; each 'CODE range' (range defaults to *); code capitals/digits/_; each code once | FIN >=1.0 MDM | 'fin-x 1' -> 'A package code is capitals, digits and _.'; FIN twice -> 'Each dependency once.'; 'FIN abc' -> ''abc' is not a version number.' | |
| Files | الملفات | Read only | No | Count of files digested (0 for an uploaded package) |
Package > Licence review
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Decision | القرار | Select | Yes | Approved / Not required / Rejected | Approved | Approved | |
| Note | ملاحظة | Text area | Conditional | Max 1000; required when the decision is Rejected | MIT, approved by legal | Rejected with an empty note -> 'This is required.' |
Package > Send back / Retire
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Reason | السبب | Text area | Conditional | Max 1000; required for Send back, optional for Retire | Licence text missing | Send back with no reason (API) -> 'Say why it goes back.' |
Extension record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Namespace | النطاق | Text | Yes | Create only; lower-cased; x_ then a letter, then letters/digits/_; 3-30 characters; unique per hook | x_acme | 'acme' -> 'A namespace starts with x_ and is lower-case, such as x_acme.'; same namespace + hook again -> 'This namespace is already registered on that hook.' | |
| Hook point | نقطة الربط | Select | Yes | Create only; partner.after_save, product.after_save, document.before_confirm, document.after_confirm, report.columns (all v1) | partner.after_save | (API) 'ledger.after_post' -> 'That point protects access, posting, periods, audit or tenancy. No extension can attach to it.'; unknown -> 'Choose one of the published hook points.' | |
| Name | الاسم | Text | Yes | Max 160; defaults to the namespace | Acme partner tagging | ||
| Core versions | إصدارات النواة | Text (range) | Yes | Same range grammar as packages; required before Review | 1 | 1 | Empty, then Review -> 'Say which core versions it supports.'; '2' -> 'It supports core 2; this build is 1.0.0.' |
| Permission needed | الصلاحية المطلوبة | Text | No | A permission code: lower-case words joined by dots; max 80 | contacts.edit | 'Contacts' -> 'A permission code, such as contacts.edit.' | |
| Function (custom_modules.<pkg>.<module>:<function>) | الدالة | Text | Yes | Max 200; must start with custom_modules. and end :function; must import at Activate | custom_modules.acme.hooks:on_save | 'app.services:x' -> 'The function lives under custom_modules: custom_modules.acme.hooks:on_save.'; a function that does not exist -> Activate refused 'The function cannot be loaded: ...' | |
| Its fields (one per line: model field) | حقولها (سطر لكل: النموذج الحقل) | Lines | No | Max 60; model must be one the hook works on; field must be <namespace>_ + 1-30 lower-case chars; each once | contacts.partner x_acme_tier | 'contacts.partner name' -> 'An extension writes only its own registered fields, named x_acme_...'; 'catalogue.product x_acme_a' on partner.after_save -> 'This hook works on contacts.partner.' | |
| Last error | آخر خطأ | Read only | No | Last failure of the function (max 1000) |
Release record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Title | العنوان | Text | Yes | Max 160 | October payroll fixes | (empty) -> 'This is required.' | |
| Environment | البيئة | Select | Yes | Environments that are not archived | STAGING - Staging | (none) -> 'Choose the environment the release goes to.'; an archived one (API) -> 'Choose an environment that is not archived.' | |
| Release policy | سياسة الإصدار | Select | No | Active policies only; when left empty and exactly one active policy fits the environment's tier, it is chosen automatically | STD - Standard | (API) a draft policy -> 'Choose an active release policy.' | |
| Migration head | رأس الترحيل | Text | Yes | Max 120; comma-separated heads, sorted and de-duplicated; defaults to this build's heads; required at Submit | This build's alembic head(s) | (keep the default) | Emptied, then Submit -> 'Say which migration head the release brings the schema to.' |
| Rollback plan | خطة التراجع | Text area | Yes | Max 4000; the screen marks it required; the server checks it at Submit | Forward fix REL-next; else restore last verified backup | Empty, then Submit -> 'Write the rollback plan: forward fix or restore, and how.' | |
| Notes | ملاحظات | Text area | No | Max 1000 | 1001 characters -> 'Keep this to 1000 characters or fewer.' | ||
| Artifact hash / QA disposition / Last reason | بصمة الحزمة / قرار الجودة / آخر سبب | Read only | No | Artifact hash written at Submit; QA disposition at Approve; reason by Send back / Cancel / Retire / Recover |
Release > Packages tab
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Choose package versions | اختر إصدارات الحزم | Checkbox list | Yes | 1 to 200 lines; only Reviewed or Certified versions are offered; one version per code | Tick two certified packages | (API) none -> 'A release carries between 1 and 200 package versions.'; two versions of one code -> 'FIN is in the release twice.'; unknown id -> 'No such package version.' |
Release > Approve
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| QA disposition | قرار الجودة | Text area | Yes | Max 1000 | UAT passed on staging 2 Oct | (empty via API) -> 'This is required.' | |
| I have read and accept the rollback plan | قرأت خطة التراجع وأقبلها | Checkbox | Yes | Must be ticked | (API) false -> 'Confirm you have read and accept the rollback plan.' |
Release > Recover
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Outcome | النتيجة | Select | Yes | Forward fix (-> Recovered), Restored from backup (-> Recovered), Failed - not recovered (-> Failed) | Forward fix | Restored from backup | |
| Fixing release id (forward fix) | معرّف إصدار الإصلاح | Text (internal id) | Conditional | Needed for Forward fix: another release of the SAME environment, not cancelled/failed/retired; it is the 32-character internal id, not REL-number | REL-0002 typed as a number, or a release of another environment -> 'Name the fixing release for the same environment.' | ||
| Passed restore drill id (restore) | معرّف تجربة الاستعادة الناجحة | Text (internal id) | Conditional | Needed for Restored from backup: a drill in state Passed (internal id) | A failed drill's id -> 'A restore is evidenced by a passed restore of that backup.' |
Release > Recover / Retire / Send back / Cancel
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Reason | السبب | Text area | Yes | Max 1000 | (API) empty: Retire -> 'Say why the release is retired.'; Send back -> 'Say why it goes back to draft.'; Cancel -> 'Say why the release is cancelled.' |
Release > Evidence > Rehearse
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Backup | النسخة | Select | No | Succeeded, not pruned backups (newest 50); empty = Newest backup | Newest backup | No stored backup exists -> 'Choose a stored, successful backup.' |
Environment record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Code | الرمز | Text | Yes | Create only; capitals, digits, _ (2-40); unique | STAGING | 'stg-1' -> 'A code is capitals, digits and _.'; duplicate -> 'An environment with that code exists.' | |
| Name | الاسم | Text | Yes | Max 120 | Staging server | ||
| Tier | المستوى | Select | Yes | Development / Staging / Production / Recovery | Staging | Staging | (API) 'qa' -> 'Choose one of: development, staging, production, recovery.' |
| Region | المنطقة | Text | No | Max 60 | me-dubai-1 | ||
| Database class | فئة قاعدة البيانات | Select | No | Small (2 vCPU), Medium (4 vCPU), Large (8+ vCPU) | Small | Medium | |
| Runtime | بيئة التشغيل | Text | No | Max 40 | Python 3.12 | ||
| Migration head | رأس الترحيل | Read only | No | Set when a release is activated here | |||
| RPO (minutes) | RPO (دقائق) | Number | No | 1 to 10080; used by the backup gate at Activate | 1440 | 1440 | 0 -> 'Choose between 1 and 10080.' |
| RTO (minutes) | RTO (دقائق) | Number | No | 1 to 10080 | 240 | 240 | 20000 -> 'Choose between 1 and 10080.' |
| Retention (days) | الاحتفاظ (أيام) | Number | No | 1 to 3650 | 30 | 30 | 4000 -> 'Choose between 1 and 3650.' |
| Window day | يوم النافذة | Select | Yes | Any day, Monday ... Sunday (-1 .. 6) | Any day | Friday | |
| Window opens (HH:MM) | تبدأ النافذة | Time | No | HH:MM 00:00-23:59; empty = no window (any time allowed) | 23:00 | (API) '25:00' -> 'Give the window's start as HH:MM.' | |
| Window length (minutes) | مدة النافذة | Number | Conditional | 0 to 1440; must be more than 0 when a start time is set | 120 | Start 23:00 with length empty/0 -> 'Say how long the window lasts.' | |
| Time zone | المنطقة الزمنية | Text | Yes | An IANA zone, max 40 | Asia/Dubai | Asia/Dubai | 'Dubai' -> 'Choose a time zone such as Asia/Dubai.' |
| This server is this environment | هذا الخادم هو هذه البيئة | Checkbox | No | Only one environment can be current; ticking it clears it on the others | No | Tick on STAGING | |
| Secret references (env:NAME, vault:path) | مراجع الأسرار | Lines | No | Max 30; each env:/vault:/file: + 1-120 of A-Z a-z 0-9 _ . / -; never a value | env:A2N_DB_PASSWORD | 'P@ssw0rd!' -> 'A secret is referenced as env:NAME, vault:path or file:path - never written here.' |
Environment > Approve
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Reason | السبب | Text area | No | Max 1000; kept on the approved version | Matches the runbook |
Job record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Code | الرمز | Text | Yes | Create only; lower-cased; words joined by dots (2-6 parts), max 60; unique | sales.nightly_digest | 'nightly' -> 'A job code is lower-case words joined by dots, such as sales.nightly_digest.'; duplicate -> 'A job with that code exists.' | |
| Name | الاسم | Text | Yes | Max 160 | Nightly digest | ||
| Handler | المعالج | Select | Yes | Registered handlers only (e.g. Heartbeat, Record latency..., Evaluate alert policies, Check packages for drift, Take an SBOM, Prune, Restore drill, Upgrade rehearsal) | Heartbeat (records that the engine runs) | (API) 'os.system' -> 'Choose one of the registered handlers.'; empty -> 'This is required.' | |
| Schedule | الجدولة | Select | Yes | On demand / Every N minutes / Daily at a time / Weekly on a day | On demand | Every N minutes | |
| Every (minutes) | كل (دقيقة) | Number | No | 1 to 10080; slots aligned to 1 Jan 2026 00:00 UTC | 60 | 60 | 0 -> 'Choose between 1 and 10080.' |
| At (HH:MM) | في (س:د) | Time | No | HH:MM wall time in the job's zone (daily / weekly) | 02:00 | 02:00 | (API) '2am' -> 'Give the time as HH:MM.' |
| Weekday | اليوم | Select | Yes | Monday (0) ... Sunday (6); weekly schedules | Monday | Sunday | (API) 7 -> 'Choose between 0 and 6.' |
| Time zone | المنطقة الزمنية | Text | Yes | IANA zone, max 40 | Asia/Dubai | Asia/Dubai | 'GST' -> 'Choose a time zone such as Asia/Dubai.' |
| Timeout (s) | المهلة (ث) | Number | No | 5 to 21600; an overrun is noted on a successful run | 900 | 900 | 2 -> 'Choose between 5 and 21600.' |
| Lease (s) | الحجز (ث) | Number | No | 10 to 21600 | 300 | 300 | 5 -> 'Choose between 10 and 21600.' |
| Attempts | المحاولات | Number | No | 1 to 10 (max attempts before dead letter) | 3 | 3 | 11 -> 'Choose between 1 and 10.' |
| Backoff (s) | التأخير (ث) | Number | No | 1 to 3600; wait = backoff x 2^(attempt-1), capped at 6 h | 60 | 60 | 0 -> 'Choose between 1 and 3600.' |
| Concurrency | التزامن | Number | No | 1 to 4 runs of this job at once | 1 | 1 | 5 -> 'Choose between 1 and 4.' |
| Payload (JSON, plain values only) | الحمولة (JSON) | JSON | No | An object, max 4 KB, values text / number / true-false / null only | {} | {"keep_days": 30} | '{abc' -> 'That is not valid JSON.' (screen); {"a": {"b": 1}} -> 'Only plain values: text, numbers, yes / no.'; over 4 KB -> 'Send an object of at most 4 KB.' |
| Next due / Runs accepted | الاستحقاق التالي / تشغيلات مقبولة | Read only | No | Next slot when enabled; accepted = runs ever accepted |
Job > Run now
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Run key (blank = a new run) | مفتاح التشغيل (فارغ = تشغيل جديد) | Text | No | Max 160; blank mints 'manual:<timestamp>'; the same key twice returns the first run | test-key-1 | 161 characters -> 'Keep this to 160 characters or fewer.' |
Restore drills > Run a restore drill
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Backup | النسخة | Select | No | Newest stored backup, or one of the last 50 succeeded backups (shows date, engine, target, 'no fingerprint' when old) | Newest stored backup | Newest stored backup | No succeeded backup stored -> 'Choose a stored, successful backup.' |
Alert policy record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Code | الرمز | Text | Yes | Create only; capitals, digits, _ and - (2-40, starts with a letter); unique | QUEUE-LAG-2 | 'q lag' -> 'A code is capitals, digits, _ and -.'; existing -> 'A policy with that code exists.' | |
| Name | الاسم | Text | Yes | Max 120 | Queue lag over 5 min | ||
| Measurement | القياس | Select | Yes | p95 request latency (ms), Server error rate (%), Oldest queued job (seconds), Dead-letter jobs, Hours since the last good backup, Failed restore drills (30 days) | Oldest queued job (seconds) | Dead-letter jobs | |
| When | عندما | Select | Yes | > , >= , < , <= | > | > | |
| Threshold | الحد | Number | No | Any number between -10^12 and 10^12 | 900 | 300 | (API) 'abc' -> 'Send a number.'; 1e13 -> 'That threshold is out of range.' |
| Window (minutes) | النافذة (دقائق) | Number | No | 1 to 1440 | 15 | 15 | 0 -> 'Choose between 1 and 1440.' |
| Severity | الخطورة | Select | Yes | Info / Warning / Critical | Warning | Critical | |
| Who answers it | من يتولاه | Select | Yes | One of the 5 platform roles (in-app only; nobody is emailed) | Operator | Operator | |
| Runbook | دليل التشغيل | Text area | No | Max 400 | Check Job runs for the oldest queued run | 401 characters -> 'Keep this to 400 characters or fewer.' |
Release policy record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Code | الرمز | Text | Yes | Create only; capitals, digits, _; unique | STD | 'std-1' -> 'A code is capitals, digits and _.'; existing -> 'A policy with that code exists.' | |
| Name | الاسم | Text | Yes | Max 120; defaults to the code | Standard release | ||
| Approvers needed | عدد المعتمدين | Number | No | 1 to 3 different approvers | 1 | 2 | 4 -> 'Choose between 1 and 3.' |
| Rollout batch (%) | دفعة النشر (%) | Number | No | 1 to 100; recorded, not enforced | 100 | 100 | 0 -> 'Choose between 1 and 100.' |
| Optional gates this policy asks (one per line: contracts, restore, sbom) | البوابات الاختيارية (سطر لكل: contracts, restore, sbom) | Lines | No | Published check keys; only contracts, restore and sbom change anything (the others are always asked) | sbom restore | 'speed' -> 'Choose from the published checks.' | |
| Applies to tiers (one per line) | يطبق على المستويات | Lines | No | development / staging / production / recovery; empty = every tier | staging | 'qa' -> 'Choose from development, staging, production, recovery.' | |
| Recovery plan template | قالب خطة الاستعادة | Text area | No | Max 4000 | Forward fix first; restore as a last resort |
Flag record
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Key | المفتاح | Text | Yes | Create only; lower-cased; words joined by dots (2-6 parts); unique; not in security. auth. authorization. access. permission. period. posting. ledger. audit. approval. tenancy. rls. sod. | sales.quick_quote | 'quickquote' -> 'A flag key is lower-case words joined by dots, such as sales.quick_quote.'; 'posting.skip_lock' -> 'That is a protected control (authorization, periods, posting, audit, approvals or tenancy). It cannot be governed by a feature flag.'; existing -> 'A flag with that key exists.' | |
| Name | الاسم | Text | Yes | Max 160 | Quick quote button | ||
| Type | النوع | Select | Yes | Create only; Yes / no, Text, Number | Yes / no | Yes / no | |
| Scope | النطاق | Select | Yes | Create only; Whole workspace / Per company | Whole workspace | Per company | |
| Value in force / Waiting for approval | القيمة النافذة / بانتظار الاعتماد | Read only | No | Value: false / empty / 0 until approved; outside the effective dates the default is in force | |||
| Effective from | يسري من | Date and time | No | Optional start; local time sent as UTC | Today 09:00 | ||
| Effective to | يسري حتى | Date and time | No | Must be after Effective from | Today + 30 days | Earlier than Effective from -> 'The end must come after the start.' | |
| Protected control (can only be tightened) | تحكم محمي (يُشدّد فقط) | Checkbox | No | Once ticked it cannot be unticked; a Yes / no protected flag can never be proposed false | No | Tick | Untick on a draft and Save -> 'A protected control stays protected.' |
| Description | الوصف | Text area | No | Max 1000 |
Flag > Propose a value / Propose a change
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Value / New value | القيمة / القيمة الجديدة | Text | Yes | Yes / no: true or false; Number: any number; Text: max 400 | true | 'yes' on a Yes / no flag -> 'A yes / no flag is true or false.'; 'ten' on Number -> 'Send a number.'; false on a protected control -> 'This flag is a protected control: it can be tightened, never switched off.' |
Flag > Refuse
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Reason | السبب | Text area | Yes | Max 1000 | (API) empty -> 'Say why the proposal is refused.' |
Flag > Companies tab
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Company / Value | الشركة / القيمة | Select + text | Yes | Per-company flags only; a company of the workspace; value checked like the flag type | Test Company LLC / true | On a workspace flag (API) -> 'This flag is set for the whole workspace, not per company.'; false on a protected control -> 'This flag is a protected control: no company may switch it off.' |
Advisories > Import OSV advisories
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| OSV JSON (one record, a list, or {"vulns": [...]}) | OSV JSON | Text area (JSON) | Yes | 1 to 5000 records; OSV format (affected[].package.ecosystem PyPI/npm, ranges) or plain rows {ref, ecosystem, package, affected, fixed, severity} | {"ref": "CVE-2026-0001", "ecosystem": "pypi", "package": "requests", "affected": "<9.0", "severity": "high"} | [] -> 'Send OSV records - one, a list of up to 5,000, or {"vulns": [...]}.'; ecosystem 'maven' -> 'pypi or npm.'; no ref -> 'Every advisory has an id (CVE-..., GHSA-..., PYSEC-...).'; severity 'urgent' -> 'low, moderate, high or critical.' |
Advisories > Waive
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Why the risk is accepted | سبب قبول المخاطرة | Text area | Yes | Max 1000 | Not reachable in our deployment | ||
| Waiver ends | ينتهي الإعفاء | Date and time | Yes | Must be in the future | Today + 30 days | Yesterday -> 'The waiver must end in the future.' |
Platform roles > Grant a role
| Field | Arabic label | Type | Required | Rules and limits | Default | Example | Refused when |
|---|---|---|---|---|---|---|---|
| Person | الشخص | Select | Yes | Active users who are not workspace owners | test.operator | (API) the workspace owner -> 'The workspace owner already holds every platform role.'; inactive -> 'Choose an active person.' | |
| Role | الدور | Select | Yes | Operator, Release manager, Independent approver, Configuration owner, Viewer / auditor | Operator | The same person and role again -> 'That person already holds this role.' |