Launch-readiness gate
Rostrum contains a complete credential-free local workflow and the controls needed to build a production candidate. A repository test pass is not a public launch decision. The exact image, hosted configuration, identity, provider, storage, and recovery paths still require operator-owned evidence.
Decision summary
| Area | Repository posture | Required before production approval |
|---|---|---|
| Source distribution | MIT license, evaluator quickstart, CI, community files, and versioned docs | Verify the exact candidate can be cloned anonymously and every public source/docs link resolves |
| Core program flow | Implemented and covered by unit, race, policy, and rendered-flow checks | Run the operator journey against the immutable candidate |
| Public read-only preview | Generic fail-closed APP_MODE=preview plus the isolated examples/demo/ fixture and deployment |
Prove the deployed host is running the pinned fictional template and intended version while refusing every mutation |
| Identity | Organizer roles, one-time setup, magic link, OAuth adapters, passkeys, speaker/reviewer signed links | Test the selected sign-in method from an external browser/inbox |
| Durable outbox plus Resend and SMTP transports | Send through the selected real transport and retain non-secret evidence | |
| Canonical storage | JSON, SQLite WAL, and Postgres implementations share a validated aggregate contract | Restart, backup, and restore the exact selected backend |
| Accelevents | One-way published-program adapter with dry run and visible run ledger | Test a restricted event if the integration is enabled |
| Airtable | One-way, explicit, batched projection with dry-run and durable retry state | Test a restricted target base if the integration is enabled |
| Recovery | Checksummed online workspace import, pre-import backups, full archives, approved-upload bundle | Rehearse structured restore and stopped-process upload recovery |
| Release identity | ROSTRUM_VERSION is exposed by health and accepted by the container build |
Record tag/SHA, image digest, health response, operator, and timestamp |
Current decision: suitable for a production-candidate deployment after the repository gates pass. Not production-approved until every selected external surface and the recovery runbook have acceptance evidence.
Repository gates
Install the pinned tools:
go install m31labs.dev/gosx/cmd/gosx@v0.38.1
go install m31labs.dev/arbiter/cmd/arbiter@v1.9.0
Run:
make check
make smoke
make size-budget
These commands prove:
- Go and GoSX formatting, Arbiter policy validation,
go vet, unit tests, and race tests pass for this source tree. - A temporary
APP_MODE=previewprocess boots from the generated, checksummed fictional example; organizer, signed persona, CFP, public/embed/API/calendar, header, count, and mutation-refusal contracts pass. - The production bundle stays within committed static HTML, island, runtime, server binary, distribution, and per-route client budgets.
They do not prove a remote host, credential, DNS/TLS setup, external database, mailbox, Airtable base, backup system, or operator procedure.
Implemented launch contract
Program state and decisions
- A proposal can move through policy-backed routing, assigned human review, acceptance, speaker tasks, conflict-aware scheduling, publication, public JSON, calendar, embed, and export surfaces.
- Manual sessions retain their chosen format, speaker set, and duration while being scheduled and unscheduled.
- Event date changes rebase scheduled calendar days. Event timezone changes preserve each scheduled session’s wall-clock time.
- Human review coverage and aggregates count attributed human evaluations. Governed final decisions enforce assignment/quorum policy, with an audited chair override path.
Canonical storage
- JSON validates a cloned state and atomically replaces its file.
- SQLite uses WAL and a migration ledger.
- Postgres and
postgresqluseDATABASE_URLand the same aggregate contract. - Rostrum remains canonical. Accelevents and Airtable are one-way projections and cannot alter review, scheduling, identity, archive, or audit state.
Audit history
Every governed mutation records aggregate audit context and appends to an operator-owned, fsynced, hash-chained JSON Lines ledger. Existing ledger corruption fails startup instead of silently beginning a new chain.
The canonical transaction completes before the independent ledger append. If the ledger filesystem fails after a state commit, Rostrum returns an error that explicitly says the workspace commit succeeded. Preserve the evidence, repair the ledger path, and reconcile that mutation. Do not describe this as a distributed transaction.
Export, import, and recovery
- Organizer/chair workspace export produces a checksummed, versioned envelope.
- Import validates export/schema version, checksum, and domain invariants, creates an exact pre-import backup, retains the newest ten, preserves local organizer principals and authentication records, and rebases upload paths.
- Full archive export streams workspace state, private uploads, and active and rotated audit segments.
- Approved-upload export produces a deterministic ZIP and digest-bearing manifest of approved regular files only, with path, symlink, count, and size defenses.
- Full upload recovery remains a stopped-process procedure. Source audit segments stay with the recovery record; they are not spliced into the receiving instance’s chain.
Public and identity edge
- Organizer, chair, and observer roles are application-enforced. Speaker and reviewer access is signed-link scoped.
- Public JSON emits only published sessions and their attached speakers.
- Production refuses weak/default session secrets, non-HTTPS public URLs, and in-memory persistence.
- The exact GoSX preflight is
gosx v0.38.1; build/check targets reject a different version. ROSTRUM_VERSIONis deployment-owned and visible at/api/health.
Hosted preview acceptance
The preview must be a separate process, hostname, volume, upload directory,
audit path, and session secret containing only the fictional evaluation
example. Follow
examples/demo/README.md,
which generates environment-specific workspace and checksum files. The hosted
process must use:
APP_MODE=preview
APP_ENV=production
PUBLIC_URL=https://demo.example.com
ROSTRUM_VERSION=<immutable-release-or-commit>
SESSION_SECRET=REPLACE_ME
INITIAL_WORKSPACE_PATH=/app/demo-data/initial-workspace.json
INITIAL_WORKSPACE_SHA256_FILE=/app/demo-data/initial-workspace.sha256
STORE_DRIVER=sqlite
DATA_PATH=/app/demo-data/rostrum.sqlite
UPLOAD_DIR=/app/demo-data/uploads
AUDIT_LOG_PATH=/app/demo-data/audit.log
BACKUP_DIR=/app/demo-data/backups
MAIL_DRIVER=outbox
ORGANIZER_EMAILS=
PRINCIPAL_ROLES=
RESET_SECRET=
TRUSTED_PROXY_CIDRS=<exact-private-ingress-cidrs>
Do not provide external database, network mail, Accelevents, Airtable, or OAuth
credentials to the preview. Startup must fail if the template pin, complete
persisted state, persistence path, release identity, or credential posture
differs. It must also fail if any email-like value anywhere in the complete
workspace uses a domain other than example.com, example.net, example.org,
or their subdomains. This is preview-only protection; it does not constrain a
live organizer workspace. The generated workspace, workspace checksum, and
upload-checksum manifest are runtime artifacts; approved-upload paths in the
workspace are absolute. Do not commit these files or reuse them in live.
Verify all of the following against the deployed candidate:
/api/healthreturnsok=trueand the expected immutable version./api/v1/workspacereturns the M31 Systems Forum example with non-zero published session/speaker counts./organizeris anonymously readable; the product tour, CFP, agenda, public agenda, gallery, and public calendar return 200.POST,PUT,PATCH, andDELETEare refused. Authentication/setup, reset, import, export, upload, and private-file paths return 403.- The read-only banner and login explanation are visible.
- Every response sends
X-Robots-Tag: noindex, nofollow, noarchive. - A disposable preflight using a non-reserved email in any workspace field fails startup without echoing the rejected address; the shipped fictional example uses only reserved example domains.
- No network provider request occurs.
- On a disposable staging volume, the example init accepts the unchanged overlay on restart and refuses a missing, replaced, added, or symlinked portrait instead of serving it.
Run the exact remote contract from a checkout of the same candidate:
make smoke \
SMOKE_URL=https://demo.example.com \
SMOKE_EXPECTED_VERSION=<immutable-release-or-commit>
Remote smoke checks the full anonymous read-only surface—including organizer and signed speaker/reviewer persona routes—plus public/embed/API/calendar output, deterministic counts, headers, mutation refusal, and exact version. Manual browser inspection still verifies presentation quality.
Provider acceptance
Transactional email
Choose one transport for the live candidate:
- Resend:
MAIL_DRIVER=resend,RESEND_API_KEY, and a verifiedMAIL_FROM. - SMTP:
MAIL_DRIVER=smtp,SMTP_HOST,SMTP_PORT,SMTP_USER,SMTP_PASSWORD, andMAIL_FROM.
From a real external inbox:
- Submit a test proposal.
- Verify arrival from the intended domain and a working signed portal link.
- Repeat the trigger and confirm idempotency prevents duplicate lifecycle delivery.
- Verify a scheduled-session message carries a valid calendar attachment.
- Record provider message ID/time, recipient, release version, and result. Never record the token or SMTP password.
The preview’s local outbox is useful product evidence, but it is not delivery proof.
Accelevents (only when enabled)
Configure a restricted API credential and the target event URL only on the live candidate. Rostrum publishes speakers attached to published, scheduled sessions first, then those sessions; it never reads changes back.
- Run the credential-free dry run and inspect the exact speaker/session plan.
- Publish into a disposable or staging event and verify the candidate workspace’s intended published-session count.
- Re-run and verify the provider updates stable Rostrum IDs rather than creating duplicates.
- Confirm a draft or cancelled session does not reach the target event.
- Preserve the visible run ledger result, timestamp, and release version; never preserve the API token.
Airtable (only when enabled)
Use a restricted Personal Access Token with record-write access only to the
target base. Rostrum expects stable Rostrum ID fields and the columns listed
in the deployment guide.
- Run the credential-free dry run and review its exact record plan.
- Sync once and verify intended accepted speakers and scheduled sessions.
- Sync again and verify upsert/update rather than duplicate records.
- Change a harmless Airtable test row and prove Rostrum does not pull it back.
- Check the visible sync ledger and independent audit history.
Selected storage
- JSON: mount private durable storage for data, uploads, audit, and backups; keep one application replica.
- SQLite: boot and restart twice against the same path; retain the database, WAL files, uploads, audit, and backups together.
- Postgres: use a non-production endpoint, restart, submit or import a controlled staging workspace, and prove state plus audit behavior. Complete the managed-database backup and restore drill separately.
Release verification runbook
Complete every item against the exact immutable candidate. Attach command output, timestamp, release identifier, image digest, and operator; never attach secrets or signed speaker/reviewer tokens.
- Source: record commit SHA and a clean, reviewed diff; from a logged-out environment, clone the repository and open the published documentation.
- Repository gates: run
make check,make smoke, andmake size-budget. - Package: build the container with immutable
ROSTRUM_VERSION; verify it runs as UID 10001 with read-only capabilities and durable mounts. - Health and edge: verify TLS, expected health version, cache headers, security headers, WebSocket upgrade, and public-data allow-list.
- Core journey: submit; inspect routing trace; assign and review; make a governed decision; schedule; resolve a deliberate conflict; publish; verify agenda, gallery, API, and calendar.
- Identity: test the selected organizer sign-in and signed reviewer and speaker links; verify observer and export restrictions.
- Recovery: export workspace JSON, import into clean staging, verify local organizer access and pre-import backup, then rehearse archive upload restore with the process stopped.
- Providers: complete selected email, storage, and optional Accelevents/Airtable acceptance.
- Preview: complete every hosted-preview isolation check if a preview will be published.
- Approval: record pass/fail, named owner, and any exception with expiry.
The judging guide is the presentation path. This document is the operational go/no-go path.