Channel administration app (PWA)
Source and purpose
DefaultPreferences/Container and CreatorDeniedRoute admit owner/delegate, excluding creators, without an additional named channel permission. ChAdminApp fetches the PWA record. ChAdminAppSection renders NOT_RELEASED, INITIALIZING and RELEASED. Its only writer is initial release, with an optional custom icon. The released name is read-only and derived by the original UI; there is no rename, re-release, unpublish or independent icon-update control.
The release check first requires the channel loginKey/address, then the source isBusinessPlanOrHigher table. Known disallowed plans are FREE_TRIAL, NORMAL_STARTER, NORMAL_STARTER_2023_04, NORMAL_BASIC and NORMAL_ESSENTIAL. Known remaining source plans are allowed; an unknown future plan is unknown, not silently entitled by the source helper's default branch. Missing address links to publish/settings; plan changes link to plan/home. No plan purchase is sent.
Source repository requests: GET /seller/api/v1/channel-management/pwa and POST /seller/api/v1/channel-management/pwa/release with {iconImageSrc}. The source saga optionally uploads the original icon first, then refreshes PWA info. API origin, selected channel bearer and x-publ-channel-id apply. The active reducer consumes data.pwaReleaseInformation, despite the repository's stale undefined return type. The optional record being absent is not proof of NOT_RELEASED.
The original modal accepts PNG/JPEG/WebP/SVG up to 1,000,000 bytes. Omit iconFile to use the observed PWA icon or channel icon, with the UI's ?ver= suffix removed. Do not accept arbitrary image URLs, local paths, mutable names or private keys. Raw loginKey and installationUri stay out of MCP responses/journals; actual installation and copying its link belong to the original console. Preserve only address/link presence, a private address-change digest and source presentation fields. Repeated source observations are not an atomic snapshot.
Interface and recovery plan
channel_admin_app_get returns stored status, presentation fields, prerequisites, revision and one exact preferences/ch-admin-app destination. channel_admin_app_release requires channelCode, expectedRevision, stable requestId and confirmation RELEASE_ADMIN_APP; optional iconFile carries original base64 bytes. dryRun plans without upload, POST or journal. Supported preconditions never imply a completed release or functioning installed app.
A durable taskType channel-admin-app-release records phases before grant, upload and release effects. Never repeat an uncertain effect. Keep temporary upload credentials in memory only. A prepared/acknowledged-upload task may continue only through the identical release call; task_status and task_resume are observation only. INITIALIZING remains pending. RELEASED with the expected icon and unchanged channel/address/actor can reconcile stored completion without proving causality. Completed replay is historical and unconfirmed; use get for current status. No rollback, image deletion, reinstall or automatic plan/domain change.
Implementation reconciliation
HTTP release acknowledgements 200/201/202/204 are dispatch acknowledgements only; source code gives no usable release data DTO. Non-204 responses must retain the source data envelope without a contradictory error, bounded to 2 MiB. A malformed envelope stays an unknown dispatched outcome, never an acknowledgement or replay opportunity. No response data is used as completion evidence: repeated stored RELEASED/channel/icon observations are required, with causalityVerified:false. Actual backend acknowledgement compatibility is pending.
This branch appends only the PWA section and does not overwrite that owner's transport/login guidance reconciliation. The current provider-view confirmation wording already distinguishes activation versus provider observations; the separate Docs candidate is not treated as integrated or approved.
Root static-check record
Accounting is 108 tools / 44 partial workflows / 209 partial API associations / 42 human financial handoffs / 738 pending audits. Ten changed Markdown files, six JSON example blocks and 241 relative file links were checked; the three PWA documents are in both package entries and the public allowlist. This validates file inclusion, not built-package or rendered-public-response behavior. No product test was executed by root. Existing public-guide/actual/hosted/model holds are not closed.
The release dry-run checks an existing journal under the task lock and rejects
changed original input with REQUEST_ID_CONFLICT. A valid saved record does not
turn the dry-run into historical success: it still checks fresh prerequisites.
No durable task is created or updated by planning.
Saved record identity
A missing file differs from a present malformed record. JSON null, false, zero
or an empty string is rejected with TASK_CONTEXT_CHANGED; apply/dry-run/status/
resume do not overwrite it or start replacement work. Preserve the file for
inspection. Do not delete/edit it or substitute a new request ID to bypass the
error. Valid original-task recovery and genuinely missing-record behavior remain.