# channel_admin_app_release
See the [current correction and older-server guidance](../reference/README.md#current-input-casing-correction) before preparing new inputs; keep existing task inputs unchanged during recovery.
The integration retains this PWA contract.
Compose the source Channel administration app's initial release: validate the
selected channel and prerequisites, optionally upload an original icon, submit
one release request, then observe stored progress. This is not a plan purchase
or an installed-app verification operation.
The selected channel requires OWNER or DELEGATEE without an additional named
fine permission. Creator/account credentials cannot substitute. Hosted clients
need the exact authorized channel resource. The tool's idempotent annotation
does not authorize replaying uncertain effects with a different request ID.
## Input
| Field | Meaning |
| --- | --- |
| channelCode | Required exact selected channel code, string length 1–512; the parser also rejects `.`, `..`, slashes, backslashes and control characters |
| requestId | Required stable 8–80 character ID using letters, digits, underscores or hyphens |
| expectedRevision | Required 64-character lowercase SHA256 revision from channel_admin_app_get |
| confirmation | Required literal RELEASE_ADMIN_APP |
| iconFile | Optional strict object with filename and canonical base64 of original PNG/JPEG/WebP/UTF-8 SVG bytes |
| dryRun | Optional boolean, default false; validates without effects or journal |
The input object is strict; unknown fields are rejected. The exported schema
does not express every channel-code or image-byte refinement.
```json
{
"channelCode":"selected-channel-code",
"requestId":"admin-app-release-001",
"expectedRevision":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"confirmation":"RELEASE_ADMIN_APP",
"dryRun":true
}
```
Replace the example revision with the fresh observed value. The same requestId
must retain its original inputs, including expectedRevision and file bytes.
Changing dryRun from true to false is allowed because a dry run stores no task.
Only an observed NOT_RELEASED record may dispatch. Missing address is checked
before the plan and points to /channels/{channelCode}/publish/settings. A known
ineligible or unknown plan points to /channels/{channelCode}/plan/home. These
are human prerequisite handoffs with zero release effects. Other PWA states
and unavailable records point to preferences/ch-admin-app. One result contains
one relevant canonical console destination, never a generic console home.
Omit iconFile to use the observed PWA icon, falling back to the channel icon,
with the source ?ver= cache suffix removed. A custom file must have a matching
basename/extension and canonical base64, at most 1,000,000 decimal bytes. No
local paths, data URLs, arbitrary icon URLs, app-name edits or credentials.
filename must be 1–240 characters without directory separators, colon or control
characters, and end in .png, .jpg, .jpeg, .webp or .svg. Prefer lowercase extensions:
the registered parser is case-insensitive but its exported pattern omits that
flag. base64 must be 4–1,333,336 characters and round-trip to the same canonical
encoding of nonempty original bytes. Whitespace or a data-URL prefix is rejected.
The bridge checks bounded image/container structure, without rendering,
resizing or external-reference fetching. Resource gateway, bucket and region
must be configured by the host for a custom icon, including its dry run; using
the observed default icon does not require that upload configuration.
Original bytes and checksum bind the upload.
## Inputs
This tool takes no input fields.
## Results and recovery
PWA_RELEASE_DRY_RUN is a plan without grant, upload, release or journal.
An acknowledged release alone does not prove completion. INITIALIZING or an
unmatched readback stays pending. PWA_RELEASE_OBSERVED confirms a repeated
RELEASED record with the expected channel/icon. It does not prove installation,
public behavior, exclusive causality or backend transaction atomicity.
REVISION_CONFLICT rejects a stale initial revision. PWA_RECORD_UNAVAILABLE,
PWA_ALREADY_RELEASED, PWA_INITIALIZING, PWA_ADDRESS_REQUIRED, PWA_PLAN_REQUIRED
and PWA_PLAN_UNVERIFIED are action-required prerequisite outcomes, not completed
releases. INVALID_PWA_ICON identifies failed byte validation. A dispatched
request that fails acknowledgement may return an error with the preserved task
and phase; do not interpret that error as proof that nothing happened.
Use the returned taskId with taskType channel-admin-app-release. Both task_status
and task_resume are observational for this task type: they never send grants,
uploads or release requests. An untouched prepared task or acknowledged upload
can proceed only by repeating the identical channel_admin_app_release call.
Dispatched effects are durably recorded before sending and never replayed after
uncertainty. Unknown grant/upload acknowledgement requires operator inspection;
never work around it with a new requestId.
| Saved phase | Permitted continuation |
| --- | --- |
| prepared | Repeat the original release call to start remaining effects after current context and record checks. |
| grant-sent / upload-sent | Keep the task and inspect the uncertain upload; neither original recall nor status/resume repeats the dispatched stage. |
| uploaded | Repeat the original release call to submit the still-unsent release; the acknowledged object is reused. |
| release-sent | Observe only. INITIALIZING, absent or mismatched state stays unconfirmed; a repeated matching RELEASED record can complete the task. |
| done | Return stored historical completion without a fresh PWA observation or current console destination. |
Observation may persist a locally reconciled completion; it does not issue a
publ release or upload. REQUEST_ID_CONFLICT rejects changed original inputs;
TASK_CONTEXT_CHANGED rejects an inconsistent saved journal. Preserve the task
for inspection instead of deleting it to bypass either guard.
Completed replay is historical, verification.confirmed:false and has no fresh
console destination; use [channel_admin_app_get](channel_admin_app_get.md) for
current state. Context, actor, address, plan and original input remain bound.
The hosted channel resource also checks the saved task's exact channel.
Temporary upload credentials stay in memory. Original file bytes remain in the private task journal for recovery; the host must manage access and retention. They are not returned in results. Uploaded objects may remain unused if later checks fail. No rollback, object cleanup, re-release, rename or unpublish is provided.