Edit the app's display, visibility, routing/entry and configuration attributes.
The slug and built-in flag are immutable; the editor renders them read-only rather than pretending
they are editable and 4xx-ing on save. Saves are a single PUT of the manifest.
Contract. Save is PUT /api/v1/app-registry/apps/{slug} replacing the
AppManifest; requires the apps:write scope. Slug and
builtin are immutable — rendered read-only, and the server rejects a changed slug.
Attributes are the manifest's config keys (menuLabel, chrome.menu,
mode, …) edited as key/value rows. A validation failure returns
422 rendered inline on the offending field (never a toast that loses the form); a
concurrent-edit 409 and a 403 denial are contract — see frame (f).
A caller without apps:write sees this whole form read-only with no Save affordance.