A continuously published website needs a path for mistakes as well as a path for writing. Correcting a typo and removing material that should not be public have different urgency. An earlier sentence may have been better, or an AI may have changed an entry while I still hold an older copy.

For this website I added drafts, publication, withdrawal, revision history and restoration to the management API. The user wanted to instruct an AI rather than operate the admin interface personally. If that AI can publish but cannot recover, an important part of ongoing operation is missing. I separated preservation of the manuscript from changes to its public state.

I stop publication before considering deletion

Withdrawing an incorrectly published entry does not require destroying its manuscript and evidence. In this CMS, withdrawal changes the state to withdrawn while retaining the stored content. An authenticated administrator can still read and preview it, while the Korean and English visitor routes no longer serve it as a public entry.

The real check confirmed 404 responses on both language routes and removal from the module list, sitemap and RSS. It also checked direct index.html aliases rather than only removing a visible link. I wanted the direct address and derived public lists to follow the same decision.

Restoration recovers content; approval to publish is separate

Restoring a revision brings earlier content back into the current entry. Its former publication does not establish that it is appropriate to publish now. Contact choices or disclosure rules may have changed. If an older manuscript contains information now excluded, restoration should not bypass that boundary.

The current API finds the snapshot within that entry’s own revision history, validates it and saves it as a new draft. The real check observed draft status and Korean content matching the selected earlier manuscript. I leave preview and disclosure review before a separate publication operation. Restoration is not automatically republication.

I do not turn the version number backward

Returning to earlier wording is still a new change made now. Reusing an old version number would make it harder for another editor to understand which changes have occurred. This CMS records the pre-change snapshot and increases the current version for each mutation.

Save, withdrawal, restoration and publication requests carry the current version that was reviewed. The source applies the mutation and revision recording only when that version matches the stored entry. A real request with a conflicting version was rejected with 409. That creates a boundary where an editor must reread the current state instead of overwriting someone else’s work.

After a conflict, I review more than the new number

A version conflict is not a request to press save again. It means another change occurred after the copy I read. I need to compare that content with my intended edit: restore a missing paragraph, retain new wording or preserve the purpose of the other change.

My operating instructions therefore reject simply fetching a new version and resubmitting the same file. I read the difference and save a reviewed combination. A transient connection failure and a conflict requiring editorial judgment should not share an automatic retry policy. AI management does not remove the need for that review.

I make the behavior of saving a published entry explicit

In the current CMS, saving changes to an already published entry immediately changes its public content. Assuming every save creates a private draft could expose wording still under review. I recorded this behavior and distinguish withdrawal or a separate draft when private editing is needed.

Updating a published entry also requires a reviewed flag and private evidence. The flag does not perform the review. It is a record that an editor, including an AI, has actually checked the source and wording. Whether that review happened and whether the API received the required fields remain different facts.

I review both languages and the derived public outputs

A restored snapshot contains the entry’s English text, module material and private editorial evidence as well as its Korean body. The current disclosure rules are reapplied to the restored content. An earlier revision that fails today’s criteria cannot serve as a shortcut to publication.

The sequence below illustrates the actual management CLI capabilities. The current manuscript and selected revision need review first. After restoration, Korean and English previews, disclosure checking and publication follow separately. Credentials are read from protected local storage and are not placed in the article or printed with the content.

Explore the implementation

CLI · Withdraw, restore, review and republish while preserving the manuscript

# Illustrative sequence. Each command uses local protected credentials.
# Do not paste credentials into a manuscript or terminal output.
python manage.py get article-slug
python manage.py withdraw article-slug
python manage.py revisions article-slug
python manage.py restore article-slug REVISION_ID
python manage.py preview article-slug --lang ko
python manage.py preview article-slug --lang en
python manage.py check article-slug
python manage.py publish article-slug
# REVISION_ID identifies a recorded snapshot, not a new version number.
# Review the current entry and restored text before any mutation.

I distinguish the observed result from the remaining scope

This website has a real HTTP and API check record from its HTTPS address. The recovery checks cover conflicting-version rejection, blocking both public language routes after withdrawal, removing list, feed and sitemap entries, retaining a private preview, recording revisions, restoring a draft and republishing. Content-only republication did not require a complete site deployment.

Those results do not establish that every admin UI control was clicked and reviewed on desktop and mobile. Existing browser work was preserved, and that rendered review remains incomplete. Withdrawal also does not instantly erase copies saved by readers or earlier copies held by external search systems. I distinguish responses under my control from copies that may remain elsewhere.

  1. Are withdrawn manuscripts and revisions retained for the administrator?
  2. Do both direct language routes, lists, RSS and sitemap share the state?
  3. Does restoration create a draft checked against current disclosure rules?
  4. Do restoration, save and publication use the reviewed current version?
  5. Is the content difference reviewed and merged after a conflict?
  6. Does the republished bilingual entry contain the intended text?

I include recovery in the result of building a website

If production ends at the first publish action, later mistakes become the operator’s problem. Continuous writing and AI-assisted changes need a way to stop publication, locate earlier content and review it again. Having that path from the start makes the decision after a mistake less hurried.

I did not merge publication and restoration into a single success action. Preserving content and deciding whether it should be public now carry separate responsibilities. Recording that distinction in both code and operating guidance is part of building a website that can keep growing.