# Change Desk > One proposed production change in, three documents out: the change request, the pre-deploy > verification checklist, and the operational runbook. https://change-desk.skillsafe.ai/ Change Desk takes a single change — a unified diff, a database migration, a Kubernetes manifest, a Terraform file, a lockfile bump, or any mixture — plus the author's sentence about why, and produces the paperwork that has to exist before it ships. It is one app with three lanes over the same work object, not three tools sharing a header. ## What runs in the browser, free, before anything is sent A real reader, not a keyword search. It runs on every keystroke, needs no account, and its output is handed to the model as facts the answer must reconcile. - **Segmentation.** Unified diffs are split per file with hunk accounting; `# file: path` headers and banner-delimited blocks are recognised as whole files; anything unattributed is read as prose. - **File classification.** Fourteen kinds — migration, SQL, lockfile, dependency manifest, CI pipeline, infrastructure as code, container or chart, secret material, configuration, application code, test, documentation — with the narrow rules ahead of the broad ones, so a `.py` under `migrations/` is a migration and `package-lock.json` is a lockfile rather than a manifest. - **SQL statement splitting** with single quotes, double quotes, `--` comments, `/* */` blocks and dollar-quoted bodies all tracked, so a semicolon inside a literal never splits a statement. - **Per-statement classification**: the strongest lock it takes, whether it can be undone at all, and whether it destroys data. `CREATE INDEX CONCURRENTLY` and `ADD CONSTRAINT … NOT VALID` are recognised specifically and change the answer, because they are the difference between a blocking migration and a safe one. - **Dependency bumps** read as name/version pairs across five manifest dialects (package.json, PEP 508 requirements, go.mod, TOML, Gemfile.lock) and compared as semver, so a major bump is named and a patch bump is not. - **Configuration movement**: keys that appear, keys that disappear, replica counts and capacity that shrink, retention windows that shorten, cron schedules that move, resource limits that change. - **Credential-shaped literals** found and masked before anything is sent, with obvious placeholders (`${VAR}`, ``, `changeme`) left alone. - **A mechanical risk tier** — low, moderate, high, severe — computed from the flags and handed to the model as an opinion it is free to disagree with. ## The three lanes Every lane takes the same change. The order is the order of the work: assess it, decide how you will know it worked, then write down how to do it. | `task` | What you get | Derived from | | --- | --- | --- | | `impact` | The change request: blast radius by area, risk assessment, the rollback plan, the approvals to request. | `@anthropics/change-request` | | `checklist` | The pre-deploy verification checklist: gates in time order (T-24h … T+24h), each with a role owner and an observable pass criterion. | `@anthropics/deploy-checklist` | | `runbook` | The runbook: preconditions, the numbered procedure with commands and expected output, verification, rollback, escalation. | `@anthropics/runbook` | Handoff is a button: the change request hands itself to the checklist lane as `upstream`, and the checklist hands itself to the runbook lane, keeping the same change. ## Input contract `POST https://api.skillsafe.ai/v1/app-api/run` (or `/run-stream`), `Authorization: Bearer `: ```json { "task": "impact | checklist | runbook", "change": "the parsed digest, or a raw unified diff", "intent": "why this change exists, in the author's words", "environment": "production | staging-then-production | multi-region | customer-managed", "window": "business-hours | low-traffic | maintenance-window | freeze | emergency", "audience": "approver | author | oncall", "context": "table sizes, traffic shape, deploy duration, ownership", "prescan_facts": {"risk_tier": "...", "flags": [{"id": "...", "severity": "...", "detail": "..."}], "resources": [], "stats": {}}, "upstream": "the previous lane's result, when chaining" } ``` ## Output contract One JSON object, the same shape in every lane: `lane`, `title`, `headline`, `verdict` (`ready` | `needs-work` | `blocked`), `risk_tier` (`low` | `moderate` | `high` | `severe`), `summary`, `checks[]` (`{id, name, status, evidence, requirement}`), `findings[]` (`{id, severity, area, problem, evidence, fix}`), `steps[]` (`{n, phase, title, detail, owner, command, expected, abort}`), `detail_table` (`{title, columns[], rows[][]}`), `artifact` (`{format, filename, title, content}`), `coverage_check[]` (`{flag_id, status, note}`), `assumptions[]`, `open_questions[]`. Only `steps`, `detail_table` and `artifact` mean something different per lane: the rollback plan and the blast radius for `impact`, the gates and the sign-offs for `checklist`, the procedure and the escalation path for `runbook`. ## Rules the prompt enforces - Every prescan flag id must be reconciled exactly once — confirmed, cleared with a reason, or set aside as another lane's business. Any flag the reply skips is named on the page. - Reversibility is not rollback: over an irreversible statement the plan must lead with a restore and may not claim a revert fixes it. - Exactly one runbook step marks the point of no return, or the reply says there is none. - Owners and contacts are roles, never invented people, teams or channels. - Nothing is invented: no table sizes, no traffic figures, no ticket numbers, no commands the change does not support. What is unknown goes in `open_questions`. ## Links - App: https://change-desk.skillsafe.ai/ - API tutorial in eight languages: https://change-desk.skillsafe.ai/api.html - Token management: https://change-desk.skillsafe.ai/tokens.html ## Credits A derived work built on and crediting three published agent skills from the `@anthropics/knowledge-work-plugins` repository: `@anthropics/change-request`, `@anthropics/deploy-checklist` and `@anthropics/runbook`. Not affiliated with those skills' authors. ## What it is not It does not connect to a database, run a command, reach your infrastructure or deploy anything. Every command it writes is text for a person to read before running. It is not a substitute for reading the migration yourself, and its risk tier is an opinion about the text you pasted, not a guarantee.