Health and diagnostics
V2 has no dedicated readiness endpoint, metrics collector, service supervisor or external uptime monitor. Test the actual reader and, separately, the private editor. A green process status, HTTP 200 or successful build answers only one question. None alone proves the intended page, current source or safe audience.
Reader acceptance matrix
| Target | Check |
|---|---|
| Home | Expected current content, branding and navigation |
| Deep page | Direct load, reload, correct route, content |
| Resources | Local CSS, JS, fonts, icons with correct MIME |
| Search | Current index plus real page, heading result |
| Media | Images, download bytes and intended audience |
| Diagram | Actual rendered SVG, not just a fenced source |
| Missing route | Missing-page content and HTTP 404 |
| Reader controls | Copy, theme, tree, drawer, anchors and focus |
Test a new browser context and an existing cached context, phone/desktop and both themes. A cached old homepage can mask missing deploy assets. An HTTP 200 response may be a soft 404/home fallback. Inspect page identity and requested resource bytes. Check authored remote requests independently of bundled local libraries.
For a reader at your confirmed production URL, a read-only command can inspect status/headers:
curl -I https://docs.example.org/
curl -I https://docs.example.org/reviewed-deep-route/
curl -I https://docs.example.org/a-deliberately-missing-route/
These illustrative paths are not a live installation. Choose an existing deep route and a genuinely absent route on yours. HEAD checks do not exercise JS, layout, search or actual rendered media. Follow them with browser inspection, including console/network failures. Do not put credentials in a command line or paste private URLs into public diagnostics.
Editor process and perimeter
| Layer | Evidence |
|---|---|
| Process | Correct engine, Node, working directory and listener |
| Network | Intended loopback, private bind, no public bypass |
| Host | Allowed incoming hostname, port matches policy |
| Proxy | Known peer, sanitized forwarding headers |
| Cookies | Correct host-only name, security and actual HTTPS |
| Sign-in | Real synthetic account, intended role, grants |
| Mutation | CSRF, same-origin controls, intended source saved |
Use your actual service manager/logs. MarkStack does not start or repair systemd/nginx for you. Default preview and editor are distinct: preview serves generated dist on loopback 3000; editor normally listens on loopback 3001 and manages private content/runtime.
Check unauthenticated protected APIs reject access. A login page being reachable does not mean protected APIs are healthy, nor does an API rejection mean the server is down. Never weaken allowed hosts, grant everyone admin or bind publicly to bypass a failed check.
Restart ends in-memory sessions and resets in-process limiter state. Account writes/auth versions persist. A stale tab can therefore require fresh sign-in; disabling/resetting an account should not be the first response. A session’s idle limit can expire while its absolute lifetime imposes a separate cap. Check actual configured values through the permitted administrator Security panel.
Administrator diagnostics
| View | Contents, limits |
|---|---|
| Security | Session, cookie, raw-HTML settings, audit warning and limiter summaries |
| Sessions | Current-process account session times; no usable tokens |
| Activity | Bounded records with filters and cursor |
| Publish status | Current in-memory job, stages, recent log and result |
| Publish failure | Sanitized diagnostics when job failed |
| Publish history | Retained audit records carrying publication summaries |
These controls are administrator-scoped, not public monitoring APIs. Account/session data belongs to its intended operator audience. Restart loses current publish job/log state; retained audit summaries are not full logs. History pagination is not unlimited retention. Account activity requests use 50 records; general history defaults 50 and clamps 1-100. See Activity and history for source-defined behavior.
Publication status returns recent 80 log lines from a bounded in-memory buffer. Redaction reduces common secret/path exposure; it is not a proof arbitrary diagnostics are safe to share. Review output manually and share the smallest useful excerpt.
Storage and permission checks
| Location | Required operation |
|---|---|
| Content | Read plus authorized save, create, delete |
| Templates, static, config | Read for build; owner-controlled changes |
| Users, runtime | Protected read, write and temp rename |
| Audit | Append, rotation in private runtime |
| Output parent | Stage, rename, backup cleanup, switch |
| Dependencies | Accessible selected packages, executable |
Check free space, inode availability where relevant, filesystem ownership, ancestor traversal permissions and service identity. Private users files are written owner-only; settings/links temp files use 0640. Host/OS ACLs and existing permissions still matter. Do not fix a failure with world-readable/writable accounts or by exposing the private folder through the web server.
A users-file lock conflict reports failure after bounded waiting. Do not delete a lock owned by an active process. The store’s recovery condition includes both a dead process and sufficient staleness; an unreadable/live lock is not safe to force through.
Audit warning after successful work
An audit append failure can coexist with a completed mutation/publication. Security reports a warning; the server logs the write error. Later successful append clears the in-process warning. A cleared warning does not reconstruct missing historical events.
- Check whether the original operation already changed its target.
- Preserve result/error/time rather than repeating the action.
- Inspect selected runtime path, disk and permissions privately.
- Repair the storage cause under your maintenance process.
- Confirm a later legitimate append and record the gap if evidence is needed.
Repeating a password reset, rename or publish can create unwanted effects. History should describe work, not induce duplicate work when its own logging fails.
Publication failure versus success
| Reported state | Check |
|---|---|
| Pre-switch failure | Prior reader still present; saved source separate |
| New build live | Actual artifact, resources, search and host |
| Backup rotation warning | Prior output may remain under reported old name |
| Switch, restore warning | Exact filesystem paths; live may be missing |
| Marker write warning | Reader may be correct; unpublished indicator wrong |
Do not assume every failure means unchanged output. Publishing stages distinguishes the swap, restoration and marker cases. Do not click publish again until source/job/current live state are understood.
The publication marker hashes source metadata, not content bytes. Equal-size edits preserving rounded modification times can evade that indicator. Manual CLI build does not record editor publication. For release integrity, compare actual artifact/source hashes with recorded evidence rather than treating the badge as a cryptographic verdict.
Safe support bundle
| Include | Remove or sanitize |
|---|---|
| Engine, Node, OS | Passwords, tokens, auth cookies and keys |
| Failing command, stage | Private paths, domain, account identities |
| Route and tiny reproducer | Customer records, unrelated source |
| Expected versus actual | Users file, hash dump and private runtime |
| Relevant status, errors | Full unreviewed logs, environment |
| Browser, width, theme | Session storage and private draft content |
Reproduce in disposable synthetic content/accounts when possible. Record timezone/time, service state, selected path labels and whether output changed. Do not publish a build transcript containing private content. A support report should let another maintainer reproduce the failure without access to your private installation.
Automated local tests and browser checks described in Validation limits do not certify production TLS, proxy policy, physical Safari, accessibility or capacity. Those are separate acceptance checks in your environment.