The main branch has GitHub branch protection configured with the following rules:
- Require branches to be up to date before merging (
strict: trueon required status checks) — a PR whose branch is behindmaincannot be merged until it is rebased onto the current tip ofmain. - Required status check:
buildmust pass before merging.
The delivery cataractae already enforces a mandatory rebase step (Step 2 in cataractae/delivery/INSTRUCTIONS.md) before opening or merging a PR. The GitHub branch protection rule is a second, independent layer of defense: even if an agent skips or fails the rebase step, GitHub will block the merge at the platform level with a status check error.
This is defense-in-depth — neither layer alone is sufficient:
| Layer | What it does |
|---|---|
| Delivery INSTRUCTIONS.md Step 2 | Agent rebases branch before creating or merging the PR |
GitHub branch protection (strict) |
Platform blocks merge if branch is behind main |
Both layers must remain in place. Do not disable the branch protection rule without a clear reason and a replacement control.
Before a PR can be merged:
- Rebase your branch onto the current tip of
main:git fetch origin main git rebase origin/main git push --force-with-lease origin <branch>
- Ensure the
buildstatus check passes.
If GitHub shows "This branch is out of date with the base branch", run the rebase above and push again.
The Cistern web UI is a React SPA served at /app/ alongside the xterm.js TUI dashboard at /.
- Node.js 18+ and npm
- Go 1.22+ (for building the server with embedded assets)
# Build the React SPA (outputs to cmd/ct/assets/web/)
make web-build
# Run the Vite dev server with API proxy to localhost:5737
make web-dev
# Build the Go binary (includes embedded web assets)
make build- Start the Go dashboard server:
ct dashboard --web --addr 0.0.0.0:5737 - In a separate terminal, run
make web-devfor hot-reloaded frontend development - The Vite dev server proxies
/apiand/wsrequests to the Go server
- Go server (
cmd/ct/dashboard_web_spa.go): Embeds the built SPA via//go:embed assets/weband serves it under/app/. Client-side routing handles all sub-routes. - React app (
web/src/): React Router routes under/app/, SSE for live updates, WebSocket for peek. Dark theme with Tailwind CSS. - Tests: Frontend tests use Vitest + React Testing Library (
npm test). Go integration tests cover SPA routing and API endpoints.