Plan: SemaphoreUI user-facing documentation
IMPLEMENTATION RULES: Before implementing this plan, read and follow:
- WORKFLOW.md - The implementation process
- PLANS.md - Plan structure and best practices
Status: Completed
Goal: A lab owner who has just run uis deploy semaphore can find, on the
website, what the service is, what it can and cannot do, how to wire in their
first project, and the one upstream design choice (plaintext API tokens)
worth knowing before they rely on it.
Investigation: INVESTIGATE-service-semaphore.md — Part 4 named this as the second of two plans, alongside PLAN-service-semaphore-001-deploy.md.
Last Updated: 2026-10-05
Completed: 2026-10-05
Problem Summary
PLAN-service-semaphore-001-deploy.md's own Phase 4 ran into this plan's
deliverable as a hard dependency rather than a follow-on: services.json's
SCRIPT_DOCS field feeds Docusaurus's broken-link checker, and npm run build fails outright if the page it points to does not exist. So the
docs page was written during PLAN-001's implementation, not after it — this
plan's content shipped in the same PR (#548) that shipped the service itself,
and this document exists to record that formally, record what the page
covers against the Investigation's original spec, and close out the
Investigation's Part 4 list rather than leave a named-but-never-written plan
sitting in backlog/ pointing at work that already happened.
The Investigation's Part 4 described this plan's scope precisely:
website/docs/services/<category>/semaphore.mddescribing what it is, the scope limitation from F8, how to add a first project/repository/credential ..., and the plaintext-token fact from F6 stated plainly rather than discovered the hard way.
That is a checklist. The rest of this document verifies the shipped page against it, item by item, rather than re-describing it from scratch.
Phase 1: Write the page
Tasks
-
1.1 Create
website/docs/services/management/semaphore.md, following the shorterargocd.md/pgadmin.mdtemplate (summary table, What It Does, Deploy, Verify, Undeploy, Key Files, Troubleshooting, Learn More) rather than Uptime Kuma's much longer page — Semaphore's operational surface is far smaller (no monitors, no heartbeats, no alerting setup to document). -
1.2 Cover every item the Investigation's Part 4 named:
Required Where on the page What it is "What It Does" — projects, repositories, templates, access keys, run history F8's scope limitation "Running in-cluster is not a limitation" — states what it can reach (anything over SSH/HTTP) and the one thing it cannot (recovering its own pod's cluster) How to add a first project/repository/credential "Adding your first project" — four concrete steps, explicitly tied back to the empty-by-default convention ( dagster-code-locations.yaml) named in "A clean install has nothing configured"F6's plaintext-token fact A :::warningcallout stating tokens are stored as the bearer value itself, calling it upstream's own design, not a UIS defectAlso added beyond the Investigation's checklist, because the page would be incomplete without them: the admin-credentials table (which secret keys exist and what they inherit), the SQLite-not-Postgres rationale carried over from the Investigation's F3/Part 2, and a Troubleshooting section matching every other service page's shape.
-
1.3 Fixed a relative-link break and confirmed the page renders:
npm run buildinwebsite/passed with the page in place (verified during PLAN-001's implementation, not re-verified here since nothing about the page has changed since).
Validation
cd website && npm run build
Passed as part of PR #548 — services.json's semaphore entry's docs link
resolves, so the broken-link checker that made this page mandatory is itself
the validation.
Acceptance Criteria
-
website/docs/services/management/semaphore.mdexists and covers all four items the Investigation named (see table above) -
npm run buildpasses with the page in place - No real hostnames, IPs, or reference-instance project/repository names appear on the page (same constraint as the Investigation and PLAN-001)
- This plan is in
completed/
Files to Modify
website/docs/services/management/semaphore.md— shipped in PR #548, not this PR. This document is the retrospective record of that work, not a second round of changes to the page.
Implementation Notes
- Why this plan shipped before it was written. The normal flow is
backlog/→active/→completed/, written before the work starts. This one inverted that because the dependency ran the other way: PLAN-001 couldn't pass its own Acceptance Criteria (npm run buildpassing) without this page existing first. Writing this document after the fact is the honest record of what happened, not a re-enactment of a planning step that would have been theater at this point — see PLAN-001's own Implementation Notes for where it says so explicitly. - Nothing here is scheduled for later. Unlike
PLAN-tools-docs.md(hand-maintained, revisit if drift recurs), there's no deferred piece of this plan — the Investigation named exactly one page with four required contents, and all four shipped.