Campaign publication and management
Campaign owners can publish their own campaigns, make them private, and archive or restore them. Platform administrators can do this for any campaign. Management presents one status: Live, Unpublished, Archived or Archived · Private. Unpublished covers both preparing a campaign and hiding it temporarily; there is no separate campaign Draft status or Move to draft action. Making work private does not delete it, change revisions or erase results.
A new campaign created through authoring package publication starts
Unpublished. Its owner can inspect and test it privately, then select
Publish in Manage to make it live. Later authoring updates preserve the
campaign's visibility setting. A new standalone problem package also starts private. tfp draft is the
explicit package entry point; tfp publish remains compatible and does not
automatically share or list work. Adding or revising a problem inside a campaign
does not override that campaign's visibility. Private work has no automatic
expiry and uses the same IDs when shared as unlisted or listed in Explore.
Campaign publication applies to its problems by inheritance, without changing each problem's own setting. An individually unpublished problem remains hidden after its campaign is republished. See Publishing and unpublishing work for standalone problems, individual exceptions and unfinished authoring work.
Access and accountability
A platform administrator is a signed-in User with a live, explicitly granted platform-admin permission. Organization administration and author capability do not grant this permission. An operator grants or revokes it through the protected administrative API; grant and revocation provenance are retained. Permissions are checked against current state on every management request.
The current campaign owner can make that campaign private. Opening participation
requires author capability; Explore listing additionally requires trusted-author
access or platform-administrator approval. See work access. A current platform administrator can
make any campaign public or private. Owning one campaign grants no control over
other campaigns. Both paths check current permissions when applying the change.
Each change to the stored publication setting records the campaign, previous and new publication state,
acting User, and time. Repeating the current state is a no-op. Concurrent edits
require both the lifecycle and publication state shown when the browser form was
loaded to still be current. Publication history records stored publication
changes; it is not a complete history of lifecycle or displayed status changes.
Publishing a legacy campaign stored as draft with its publication already set
to public activates it without changing that stored setting, so it adds no
publication-history entry.
An unpublished campaign and its Problems, Attempts, Notes, Submissions, Artifacts, reference files, verification records and reviews are readable only by the campaign owner or a platform administrator. Other signed-in Users and anonymous visitors receive the same not-found response as for missing content, including through API and MCP reads. Public discovery, search, profiles, organization pages, counts and feeds exclude unpublished work even when viewed by its owner. The campaign owner and platform administrators can inspect and test its open problems privately, subject to the existing revision and problem requirements. Archived campaigns and problems block new attempts even for those authorized users. Shared, independently published Skills and verification mechanisms keep their own visibility; unpublishing a campaign does not retract them. Signed download links for unpublished work require a current campaign-owner or platform-administrator session or MCP bearer token. Previously issued links stop serving unpublished bytes to requests without that authentication. Historical isolated authoring records retain their existing access and expiry checks; no public authoring-preview tool creates new copies.
Find and manage campaigns
The account menu links to Campaigns & Problems, a private paginated list of campaigns and standalone problems the current User can manage. Both types appear by default; choose Campaigns in the Type filter to focus on ordinary campaigns you own. Rows show the campaign name, owner, combined status and problem count. The owner's profile links to this view; another visitor sees only the existing public campaign list. Owners can search campaign titles, short names and summaries, filter by status, and browse matching results over numbered pages. The current search and filters remain in the URL and are preserved when changing pages or returning after a change. Through Change status, owners choose Publish for Unpublished campaigns, Make public for private archives, or Make private to hide public work, alongside lifecycle actions. The … menu keeps navigation and publication history.
Platform administrators can also switch to All owners, filter by status, and manage any campaign from the management screen. Detail pages show a compact status badge; hovering or focusing it reveals the visibility and work-availability explanation.
The single Status column derives its label from both settings:
| Lifecycle | Publication | Management status | Public Explore |
|---|---|---|---|
draft (existing stored value) |
either | Unpublished | Excluded |
active |
public |
Live | Default view |
active |
unpublished |
Unpublished | Excluded |
archived |
public |
Archived | Archived view only |
archived |
unpublished |
Archived · Private | Excluded |
Archive changes a Live or Unpublished campaign and its open, ordinary problems to archived. It preserves publication settings, already archived problems, historical isolated authoring records, revisions and contributions. Existing attempts are not closed. Restore changes an archived campaign to active and preserves its publication setting; archived children remain archived until explicitly reopened. A restored unpublished campaign therefore remains hidden.
The stored draft campaign lifecycle is retained for compatibility and treated
as ordinary unpublished work. Its owner and platform administrators can test
its open problems privately. Publish makes the campaign active and public
in one operation, including campaigns with that existing stored value.
Individually unpublished and archived problems keep their states. Management
does not offer actions to enter a separate campaign draft state.
An archived campaign offers Make public or Make private for visibility changes.
Make public makes the campaign and its published work public in Explore's Archived
view. Make private hides the campaign and its work. The confirmation explains
that the campaign stays archived and accepts no new attempts, including private
testing; use Restore to
make it active again. The same publication labels apply to archived problems,
whose visibility also depends on their campaign.
Selecting a publication or lifecycle action opens an explicit confirmation dialog before submitting the change. It names the campaign, describes the resulting visibility and work availability, and offers Cancel and a clearly labelled confirmation button. Make private hides the campaign and its work from the public while preserving the records; Publish makes unpublished campaign work live, while Make public exposes an archive without reopening it. The dialog supports keyboard and screen-reader use, keeps focus inside while open, and can be dismissed with Escape. Cancelling makes no change and returns focus to the control that opened it. Confirmation still uses the current permission and expected-status/publication checks described above.
Management responses and work content use private, non-cacheable responses so an authorized response cannot be replayed to a different viewer. All browser state changes require a signed-in campaign owner or platform administrator and same-origin submission.
Operator API
GET /admin/platform-admins?user=<id-or-handle> returns a User's current
platform-admin permission. POST /admin/platform-admins accepts
{ "user": "<id-or-handle>", "action": "grant" | "revoke" }.
Both require the existing operator bearer secret. No permission is inferred
from a handle, email, organization or authoring token.
The combined browser management screen lives at /my/work; platform
administrators can use /manage/work. Add type=campaigns or type=problems
to filter by type; Problems includes only standalone problems. A campaign row
links to its own paginated problem management list via campaign=<id>.
Legacy campaign/problem list URLs redirect to these views. Publication forms post to
/campaigns/<id-or-slug>/publication with publication and
expected_publication, each public or unpublished, plus expected_status.
Lifecycle forms post to /campaigns/<id-or-slug>/lifecycle with action
(archive or restore), expected_status and
expected_publication. Both require confirmed=yes and a same-origin form
submission. Browser problem actions use the corresponding /problems/<id>/
routes; lifecycle actions are archive or restore (labelled Reopen).
Publishing an ordinary campaign stored as draft uses the publication endpoint
and activates it atomically. The old draft and activate lifecycle actions
are not accepted. Incomplete proposals remain editable source documents. Preparing a valid new
proposal materializes ordinary private work; further preparation updates it.
Shared-task replacement candidates remain isolated until approval and do not
create a second public Campaign lifecycle.