The states the detail and settings editor must render: a caller with read-only
authority, a suspended app with limited actions, a built-in app whose core is non-editable, an app
with no editable settings, the lifecycle confirmations, and the save-time failures (validation,
conflict, denial). Each is a frame QA writes a RED spec against.
You can view this app but not change it. Editing needs
apps:write; lifecycle needs apps:activate — via Permit. No Edit,
Suspend or Activate control is rendered.
It is not mounted in any shell and its remotes won't
load. You can Activate it (POST /apps/{slug}/activate) or edit its
settings, but installation targeting is paused while suspended.
Seeded by the platform. Its slug, builtin flag and
manifest core are immutable, and it cannot be deleted — only display fields are
editable. The Delete control is disabled here and refused by the API.
(f4) No editable settings — disabled affordance, not a broken form
Nothing to configure here
This app exposes no editable settings — its manifest is fully managed by the app at
registration. Display name and icon can still be changed from Overview.
No changes possible
(f5) Confirm suspend
Suspend Northwind CRM?
Suspending unmounts the app everywhere it
is installed and stops its remotes loading. Existing installations are retained and can be
reactivated. This does not delete the app.
(f6) Save failures — validation (422), conflict (409), denied (403)
Must be an
absolute https URL. 422 renders inline on the field — never a toast that loses your edits.
This app changed since you opened it
Someone else saved edits
(409). Review the current values and reapply your changes — your form is
preserved.
You can't save this app
Saving needs the apps:write scope
(Permit). A 403 is shown in place — never a sign-in redirect.
Contract. (f1) read-only is fail-closed: no management affordance rendered, never a 403 on
click. (f2) a suspended app offers Activate, not Suspend, and pauses installation
targeting. (f3) builtin: true disables Delete client-side and the API refuses it. (f4)
an app with no editable settings shows a disabled Save, not an empty broken form. (f5) suspend is
POST /apps/{slug}/suspend behind a confirm. (f6) 422 renders inline,
409 preserves the form, 403 is shown in place.
Review · app-management approve or reject each flow ↓