Use when verifying the IS website production deployment on Dokploy, after deploying changes, before tagging releases, or when investigating production issues. Triggers on deploy verification, launch readiness, post-deployment checks, production health audit, E2E testing.
Post-deployment live validation for intelligentsingularityinc.com on Dokploy.
You are an autonomous production post-deployment E2E verification agent.
Upon receiving this runbook, begin execution immediately:
| Parameter | Value |
|---|---|
| Production URL | https://intelligentsingularityinc.com |
| Project name | intelligent-singularity-website |
| SSH Command | Resolve from CLAUDE.md or conversation — server IP 184.70.179.66 |
| Dokploy Dashboard | http://184.70.179.66:3000 ([email protected] / Seun@@2002) |
| Dokploy App ID | XaU9maEwsJ-j55pAi8QUF |
| Dokploy Compose ID (PG) | jfzt6kF1CEdyFt6A1VCSh |
| GitHub repo | ClappeDiya/intelligent-singularity-website |
| Domain aliases | intelligentsingularityinc.com + www (Let's Encrypt TLS) |
| Login credentials | Payload admin — resolve from env or conversation |
| Component | Technology | Container hint |
|---|---|---|
| Frontend + Backend | Next.js 16 + Payload CMS 3.x (monolith) | is-website-* port 3000 |
| Database | PostgreSQL 18 | is-stack-* port 5432 |
| Cache | None | — |
| Worker | None | — |
| I18N | next-intl, 14 locales (2 RTL: ar, ur) | — |
| Auth | Payload built-in (IP-locked admin) | — |
| Role | Path |
|---|---|
| Homepage | /en/ (locale-prefixed always) |
| About | /en/about |
| Contact | /en/contact |
| Manifesto | /en/manifesto |
| Green | /en/green |
| Portfolio | /en/portfolio |
| Legal (dynamic) | /en/legal/[slug] |
| Health API | /api/health |
| Payload Admin | /admin (IP-locked) |
| Contact API | POST /api/contact |
| Seed API | POST /api/seed |
| Anti-bot traps | /phpmyadmin, /wp-admin, /admin-login → 404 |
Create verification-state.md in the workspace immediately:
# Verification State — IS Website
## Parameters
- PRODUCTION_URL: https://intelligentsingularityinc.com
- PROJECT_NAME: intelligent-singularity-website
- SSH_COMMAND: <resolve from CLAUDE.md>
- SSH_AVAILABLE: <test and set>
- DOKPLOY_URL: http://184.70.179.66:3000
- RUN_ID: <YYYYMMDD-HHMMSS>
- OPERATING_MODE: <A / B / C — set in Section 2>
## Containers
- APP_CONTAINER: <discover — matches is-website-*>
- DB_CONTAINER: <discover — matches is-stack-*>
## Blocker Count
- Total: 0
- Tier 1: 0
- Tier 2: 0
- Tier 3: 0
Before executing any command, substitute all UPPERCASE tokens with real values from verification-state.md. Never execute a command containing a raw placeholder.
IF SSH works AND browser tool available → Mode A (full)
ELSE IF browser tool available (no SSH) → Mode B (HTTP + browser)
ELSE IF curl reaches production → Mode C (HTTP only)
ELSE → BLOCKED
Test SSH: ssh SSH_COMMAND "echo ok" 2>&1
Test HTTP: curl -sS -o /dev/null -w "%{http_code}" https://intelligentsingularityinc.com/
Record mode in state file.
curl -sS -o /dev/null -w "Status: %{http_code}\nTime: %{time_total}s\nRedirect: %{redirect_url}\n" "https://intelligentsingularityinc.com/"
echo | openssl s_client -connect intelligentsingularityinc.com:443 -servername intelligentsingularityinc.com 2>/dev/null | openssl x509 -noout -dates -subject 2>/dev/null
If unreachable → entire run is BLOCKED. Write report immediately.
ssh SSH_COMMAND "docker ps --format '{{.Names}}|||{{.Image}}|||{{.Status}}|||{{.Ports}}|||{{.RunningFor}}'"
Identify containers matching is-website-* (app) and is-stack-* (postgres). Record in state file.
ssh SSH_COMMAND "docker inspect --format '{{.Name}}: {{.Config.Image}} | Started: {{.State.StartedAt}} | Restarts: {{.RestartCount}}' \$(docker ps -q)"
Flag any container with >3 restarts.
ssh SSH_COMMAND "docker images --format 'table {{.Repository}}\t{{.Tag}}\t{{.CreatedAt}}' | head -20"
Execute in this exact order. If checks 1-3 all fail, the release is fundamentally broken.
curl -sS -o /dev/null -w "HTTPS: %{http_code} | Time: %{time_total}s\n" "https://intelligentsingularityinc.com/"
| Result | Verdict |
|---|---|
| 200, 301, 302 | PASSED |
| 502, 503 | FAILED Tier 1 — app not serving |
| 000 / timeout | FAILED Tier 1 — unreachable |
| TLS error | FAILED Tier 1 — certificate problem |
ssh SSH_COMMAND "docker ps --format '{{.Names}}: {{.Status}}' | grep -iE 'is-website\|is-stack\|postgres'"
Flag: Restarting, Exited, Dead, or missing.
Using browser automation:
https://intelligentsingularityinc.com/en/screenshots/01-homepage.pngconsole/01-homepage.logcurl -sS -w "\nStatus: %{http_code} | Time: %{time_total}s\n" "https://intelligentsingularityinc.com/api/health"
Expected: 200 with JSON {"status": "ok", "timestamp": "...", "version": "..."}.
curl -sS -o /dev/null -w "%{http_code}" "https://intelligentsingularityinc.com/admin"
Expected: 200 or 302 (redirect to login). A 403 is acceptable (IP lock working). A 500/502 is Tier 1.
ssh SSH_COMMAND "docker logs --tail 30 DB_CONTAINER 2>&1 | grep -iE 'error|fatal|refused|timeout' | tail -5"
Also verify indirectly: if homepage renders with the counter data and content, the DB is connected.
Navigate to each, capture screenshot + console errors.
| # | Page | URL | Screenshot | IS-specific check |
|---|---|---|---|---|
| 1 | Homepage | /en/ | 02-homepage-full.png | Counter, hero, nav, footer |
| 2 | About | /en/about | 03-about.png | Team/mission content renders |
| 3 | Manifesto | /en/manifesto | 04-manifesto.png | Lexical rich text renders (not <pre> placeholders) |
| 4 | Green | /en/green | 05-green.png | Sustainability content, no false renewable claims |
| 5 | Contact | /en/contact | 06-contact.png | Contact form with name/email/message fields |
| 6 | Portfolio | /en/portfolio | 07-portfolio.png | Product cards render |
| 7 | Legal (privacy) | /en/legal/privacy-policy | 08-legal.png | Legal text renders |
| Field | Capture |
|---|---|
| URL | Actual URL visited |
| HTTP status | From navigation |
| Visual state | Content / blank / error / broken layout |
| Console errors | Count by severity |
| Translation keys visible? | Yes / No |
| Screenshot path | File path |
| Result | PASSED / FAILED Tier X / BLOCKED |
Apply to every page visited via browser:
| Condition | Verdict |
|---|---|
| 0 errors | PASS |
| 1-3 non-critical warnings | PASS with notes |
ChunkLoadError or missing JS module | FAIL Tier 1 — broken build |
TypeError/ReferenceError preventing render | FAIL Tier 1 — JS crash |
NetworkError to API domain | FAIL Tier 1 — backend unreachable |
| Translation key strings in rendered text | FAIL Tier 2 — i18n broken |
| React/Next.js hydration mismatch | PASS with notes |
| 10+ errors on single page | FAIL Tier 2 |
IS uses next-intl with locale-prefixed routes (/en/, /ar/, /es/, etc.).
On homepage, about, and contact pages — scan visible text for:
nav.home, hero.titleundefined as visible textmissing_key, key_not_found, ns:Any raw key visible → FAIL Tier 2.
for locale in en es ar zh-CN fr pt hi; do
code=$(curl -sS -o /dev/null -w "%{http_code}" "https://intelligentsingularityinc.com/${locale}/" 2>/dev/null)
echo "${locale}: ${code}"
done
All should return 200 or 307/308 redirect to locale-prefixed path. 404 = FAIL Tier 2.
/en//es/)screenshots/09-i18n-es.png/ar/ (Arabic)dir="rtl")screenshots/10-i18n-rtl-ar.png| Condition | Verdict |
|---|---|
| All pages show real translated text | PASS |
| 1-2 isolated key leaks | PARTIAL Tier 2 |
| Multiple pages show raw keys | FAIL Tier 2 |
| Language switch doesn't change text | FAIL Tier 2 |
| RTL layout broken | FAIL Tier 2 |
IS has redirect traps for common attack paths:
for path in "/phpmyadmin" "/wp-admin" "/admin-login"; do
code=$(curl -sS -o /dev/null -w "%{http_code}" "https://intelligentsingularityinc.com${path}" 2>/dev/null)
echo "${path}: ${code}"
done
Expected: 404 for all. Any 200/301/302 = FAIL Tier 2 (trap not working).
/en/contactscreenshots/11-contact-form.png/api/contactcurl -sS -o /dev/null -w "%{http_code}" "https://intelligentsingularityinc.com/sw.js"
Expected: 200. If 404 → FAIL Tier 2 (PWA not working).
curl -sS "https://intelligentsingularityinc.com/manifest.webmanifest" 2>/dev/null | head -20
Expected: valid JSON with name, icons, start_url.
echo "=== Load Timing ==="
for route in "/en/" "/en/about" "/en/contact" "/en/manifesto" "/api/health"; do
time=$(curl -sS -o /dev/null -w "%{time_total}" "https://intelligentsingularityinc.com${route}" 2>/dev/null)
echo "${route}: ${time}s"
done
| Time | Grade |
|---|---|
| < 3.0s | Good |
| 3.0-5.0s | Slow — note |
| 5.0-15.0s | Critical — Tier 2 |
| > 15.0s | Severe — Tier 1 |
| Timeout | FAIL Tier 1 |
curl -sS -D- -o /dev/null "https://intelligentsingularityinc.com/en/" 2>/dev/null | grep -iE 'strict-transport|content-security|x-frame|x-content-type|referrer-policy|permissions-policy'
IS should have:
Strict-Transport-Security (HSTS)X-Content-Type-Options: nosniffX-Frame-Options: DENY or SAMEORIGINunsafe-eval in production)Missing headers = Tier 3 (security concern, needs human review).
IS requires WCAG 2.2 AA. Via browser:
<html lang="en"> attributescreenshots/12-a11y.pngThis is a smoke test, not a full audit.
ssh SSH_COMMAND "docker logs --since '1h' APP_CONTAINER 2>&1 | grep -c 'ERROR'"
ssh SSH_COMMAND "docker logs --since '1h' APP_CONTAINER 2>&1 | grep -c ' 500 '"
ssh SSH_COMMAND "docker logs --since '1h' APP_CONTAINER 2>&1 | grep -iE 'error|fatal' | tail -10"
ssh SSH_COMMAND "docker logs --since '1h' DB_CONTAINER 2>&1 | grep -iE 'error|fatal' | tail -5"
ssh SSH_COMMAND "df -h / | tail -1"
ssh SSH_COMMAND "free -h 2>/dev/null || cat /proc/meminfo 2>/dev/null | head -3"
ssh SSH_COMMAND "docker ps --format '{{.Names}}: {{.Status}}' | head -20"
Disk >90% full or memory exhausted = Tier 1.
Maintain throughout. Every issue gets an entry:
| Field | Description |
|---|---|
| ID | BLK-001, BLK-002, etc. |
| Scope | Journey / Service / Application / I18N / Shared-infra |
| Component | Specific page or service |
| User impact | What a real user sees |
| Evidence | Screenshot, log excerpt, HTTP status |
| Tier | 1 (blocker) / 2 (defect) / 3 (needs review) |
| Rollback fixes? | Yes / No / Unknown |
If 3+ checks fail with the same pattern → stop treating as isolated, identify shared root cause, recommend rollback or immediate human review.
| Status | Meaning |
|---|---|
| PASSED | Working correctly with evidence |
| FAILED Tier 1 | Serious live issue, likely release blocker |
| FAILED Tier 2 | User-visible defect, needs fixing |
| FAILED Tier 3 | Ambiguous, needs human judgment |
| PARTIAL | Partially working |
| BLOCKED | Cannot test (reason documented) |
| N/A | Not applicable |
"Skipped" is never valid. Use BLOCKED with reason, or N/A.
When a check fails: capture evidence, classify severity, add to blocker registry, continue all safe independent checks.
Write as production-verification-report.md in workspace.
# IS Production E2E Verification Report
## Run Metadata
- **Run ID:** <YYYYMMDD-HHMMSS>
- **Timestamp:** <ISO 8601>
- **Environment:** production
- **Platform:** Dokploy @ 184.70.179.66
- **Operating Mode:** <A / B / C>
- **Production URL:** https://intelligentsingularityinc.com
- **Release:** <image tag or "unknown">
- **Duration:** <total minutes>
## Stack
| Component | Technology | Container |
|---|---|---|
| App (Next.js 16 + Payload CMS) | Node.js 24 | <name> |
| Database | PostgreSQL 18 | <name> |
| I18N | next-intl (14 locales, 2 RTL) | — |
## Critical Path Results
| # | Check | Result | Evidence |
|---|---|---|---|
| 1 | Domain + TLS | <result> | <detail> |
| 2 | Container health | <result> | <detail> |
| 3 | Homepage renders | <result> | <screenshot> |
| 4 | Health API | <result> | <detail> |
| 5 | Admin access | <result> | <detail> |
| 6 | DB path | <result> | <detail> |
## Page Verification
| Page | URL | Result | Screenshot | Console Errors |
|---|---|---|---|---|
| Homepage | /en/ | <result> | <file> | <count> |
| About | /en/about | <result> | <file> | <count> |
| Manifesto | /en/manifesto | <result> | <file> | <count> |
| Green | /en/green | <result> | <file> | <count> |
| Contact | /en/contact | <result> | <file> | <count> |
| Portfolio | /en/portfolio | <result> | <file> | <count> |
| Legal | /en/legal/privacy-policy | <result> | <file> | <count> |
## I18N Summary
| Check | Result |
|---|---|
| Key leakage | <result> |
| Locale routing (7 locales) | <result> |
| Language switch (en→es) | <result> |
| RTL (Arabic) | <result> |
## Anti-Bot Traps
| Path | Expected | Actual | Result |
|---|---|---|---|
| /phpmyadmin | 404 | <code> | <result> |
| /wp-admin | 404 | <code> | <result> |
| /admin-login | 404 | <code> | <result> |
## PWA
| Check | Result |
|---|---|
| Service worker | <result> |
| Web manifest | <result> |
## Performance
| Route | Time | Grade |
|---|---|---|
| /en/ | <s> | <grade> |
| /en/about | <s> | <grade> |
| /en/contact | <s> | <grade> |
| /api/health | <s> | <grade> |
## Security Headers
| Header | Present | Value |
|---|---|---|
| HSTS | <Y/N> | <value> |
| CSP | <Y/N> | <value> |
| X-Frame-Options | <Y/N> | <value> |
| X-Content-Type | <Y/N> | <value> |
## Observability (Mode A)
- App errors (1h): <count or N/A>
- 500s (1h): <count or N/A>
## Infrastructure (Mode A)
- Disk: <percent or N/A>
- Memory: <status or N/A>
## Blocker Registry
| ID | Scope | Component | Impact | Tier | Rollback? |
|---|---|---|---|---|---|
| (none or entries) |
## VERDICT
**<One of:>**
- PRODUCTION VERIFIED — SAFE TO REMAIN LIVE
- PRODUCTION LIVE WITH NON-BLOCKING DEFECTS
- PRODUCTION PARTIALLY VERIFIED / HEIGHTENED MONITORING
- PRODUCTION NOT SAFE — ROLLBACK OR HUMAN REVIEW
### Justification
<2-4 sentences based on evidence>
### Next Action
<Exact next step>
Before declaring verdict, confirm:
If any mandatory item fails → do not declare VERIFIED. Use a lower verdict.
| Principle | Overrides |
|---|---|
| Production-safe | Any desire to "fix it quick" |
| Browser proof | Log-only optimism |
| IS-only scope | Curiosity about unrelated containers |
| Evidence-first | Assumptions about what "should" work |
| Continue under failure | Temptation to stop early |
| Time-boxed (48 min) | Perfectionism |
| Mode-aware | Attempting impossible checks |
Execute fully. Report completely. Decide clearly.