Forgot password?
Satellite
Topo
Recon
Ocean Contours
US Nautical Charts
3D Satellite
3D Topo
Collections
📎
Upload · Drop GPX, KML, KMZ, USR or ZIP or Browse
Juliet
Juliet
Mission Planning Specialist AI
Trip Planner
No AI
Origin
Destination
Avoid
Route Color
Route Name (optional)
Map Layers
Routes
Tracks
Waypoints
Markers
Parcels
Federal Lands
📍 · · ·
No file loaded
LEADNAV Command — Developer Console

Every Update — Non-Negotiable Checklist

Koa must complete every item before calling anything "done." No exceptions.
  1. Test on dev.lncommand.com first. Never touch prod without verifying the change works on dev. Login, click around, confirm nothing is broken.
  2. Verify login still works on dev. Open dev.lncommand.com in a browser. Sign in with real credentials. Confirm the map loads.
  3. Syntax-check any JS changes. Extract the inline script block and run node -e "new Function(js)". Must pass clean before deploying.
  4. Copy ALL required files to prod — use ./deploy.sh. Never hand-copy individual files. deploy.sh syncs: index.html, changelog.html, color-guide.html, getting-started.html, marker-guide.html, working-with-juliet.html, JULIET_LAWS.md, CHANGELOG.md, markers/.
  5. Verify prod responds 200. curl -o /dev/null -w "%{http_code}" https://lncommand.com/ must return 200, not 302 or 500.
  6. Verify all guide pages return 200. Check marker-guide, color-guide, getting-started, working-with-juliet on lncommand.com.
  7. git commit & push to GitHub immediately. Every change must be committed before the session ends. If the repo ever needs a rollback, only committed code survives. git push origin dev confirmed.
  8. Confirm proxy is healthy if server.js was touched. curl http://localhost:3456/health must return ok:true.
  9. Verify BFCache bypass is present. Search index.html for pageshow. Must exist as window.addEventListener('pageshow', function(e) { if (e.persisted) window.location.reload(true); }) — without it, iOS/Safari serves stale page from memory and users see no changes after deploys.
  10. Verify Law 8 — marker size is 14px. Search index.html for PictureMarkerSymbol. Every waypoint icon instance must be width: 14, height: 14. If it says anything else, revert immediately before deploying.

Things That Are Banned

  • Adding client-side cache-busting JS that clears Supabase localStorage — it logs users out
  • Server-side version redirect loops (/?v=timestamp) — they break auth flows
  • Placing modal HTML after the <script> block — getElementById returns null and crashes all auth code
  • Using exec background:true for Claude Code — it sends stray messages to Telegram
  • Rolling back files without checking git log first — uncommitted work gets wiped
  • Calling anything "done" before it is verified working on prod

Deploy Procedure

Always use ./deploy.sh from the dev workspace. Never hand-copy files.

1. Pre-Deploy

  • Test on dev.lncommand.com first — login, maps, Juliet, help popups
  • Update changelog.html with today’s date (deploy.sh checks for it)
  • Run JS syntax check on index.html before deploying
  • If JULIET_LAWS.md changed, confirm dev and prod will match (script enforces this)

2. Run Deploy

cd /Users/project_koa/.openclaw/workspace/leadnav-command
./deploy.sh

Script syncs all required files, restarts proxy if server.js or any file in juliet-proxy/tools/ changed, runs health check. Node.js caches require() — tool file changes need a proxy restart or they silently have no effect.

3. Post-Deploy

  • Verify curl https://lncommand.com/ returns 200
  • Verify all guide HTML pages return 200
  • Test login on prod with real credentials
  • git commit & push immediately — before anything else
Cache fix (confirmed working 2026-05-16): The serve scripts send Cache-Control: no-store, no-cache, must-revalidate HTTP headers for all HTML. This is the real fix — not meta tags, not version redirects, not client-side localStorage clearing. Server headers only.

Juliet Laws

Full spec: /leadnav-command/JULIET_LAWS.md in the dev workspace.

A Law is a code gate only. If it can’t be enforced by code, it’s not a Law.

Active Laws Summary

  • Law 1–3: GPX file processing gates (track conversion, direction, spiderweb)
  • Law 4: Geocoding required before any map navigation
  • Law 5: Waypoint injection requires confirmed course note source
  • Law 6: Delete operations require two-step confirmation
  • Law 7–10: See JULIET_LAWS.md for full detail
  • Law 11: Deploy Cache Integrity — serve scripts send no-cache headers for all HTML

Lessons Learned — Koa’s Failure Log

These are real mistakes that cost Damian time and tokens. Koa must read this before every update.

2026-05-16: The Cache Fix Disaster

  • Asked Claude Code to fix login hang and add help popups. Claude Code added a cacheBust() function that cleared Supabase localStorage, logging all users out on every deploy. Also added a /?v=timestamp redirect loop that broke auth flows.
  • Dev Console + all of yesterday’s work was never committed to git. When the rollback happened, it was all gone.
  • Modal HTML was placed after the <script> block. getElementById returned null, crashed all auth code, broke login again.
  • Rule added: HTML that JS references must appear BEFORE the script block.
  • Rule added: No client-side cache-clearing code. HTTP headers handle caching.
  • Rule added: Commit and push to GitHub after every single change, no exceptions.

2026-05-15: Guide Files Never Deployed to Prod

  • marker-guide.html, color-guide.html, getting-started.html, working-with-juliet.html existed in dev but were never in deploy.sh. Users got 404 on prod.
  • Rule added: deploy.sh now explicitly lists every file. Never hand-copy.

2026-05-17: search-gate blocked legitimate hospital markers

  • User asked Juliet to mark hospitals with phone numbers. Juliet geocoded 3 real hospitals correctly. The search-gate blocked all of them because "any" + "around" triggered SEARCH_TRIGGER_RE, and the gate was binary — any wpt write without SEARCH_TOOL = blocked.
  • Fixed by counting new wpt elements: ≤5 targeted markers allowed through; >5 still require SEARCH_TOOL. The gate was right in principle but wrong in granularity.
  • Rule added: search-gate threshold is 5 new wpts. Fewer = individual research. More = area dump requiring OSM.

2026-05-17: Proxy tool file changes silently had no effect

  • Updated juliet-proxy/tools/road-route-builder.js to strip filler words from marker names. Deployed. Fix had no effect — proxy was still running the old cached version of the file because Node.js require() caches modules at startup.
  • deploy.sh only restarted the proxy when server.js changed, not tool files. The fix was live on disk but dead in memory.
  • Fixed: deploy.sh now diffs juliet-proxy/tools/ and restarts proxy when any tool file changes.

Recurring: exec background for Claude Code

  • Using exec background:true for Claude Code sends stray completion wake messages to Telegram. Happened multiple times despite being documented in MEMORY.md.
  • Fix: Use sessions_spawn runtime:subagent or run Claude Code foreground.

Infrastructure

  • Dev server: port 8081 — ~/.openclaw/bin/serve-lncommand-dev.js
  • Prod server: port 8080 — ~/.openclaw/bin/serve-lncommand-prod.js
  • Juliet proxy: port 3456 — /workspace/leadnav-command/juliet-proxy/server.js
  • Cloudflare tunnel: lncommand.com→8080, dev.lncommand.com→8081, juliet.lncommand.com→3456
  • Dev workspace: /Users/project_koa/.openclaw/workspace/leadnav-command/
  • Prod workspace: /Users/project_koa/.openclaw/workspace-prod/leadnav-command/
  • GitHub: ProjectKoa/Juliet-LN-COMMAND, branch: dev
  • Supabase: bzbvyjuhmpshtjzbcmqz.supabase.co
  • Email provider: Resend — noreply@lncommand.com

Quick Health Check

curl http://localhost:3456/health
curl -o /dev/null -w "%{http_code}" https://lncommand.com/
curl -o /dev/null -w "%{http_code}" https://dev.lncommand.com/
Help