Skip to content

Latest commit

 

History

History
528 lines (434 loc) · 27.6 KB

File metadata and controls

528 lines (434 loc) · 27.6 KB

Scribe — Build Progress Tracker

This file is the source of truth for what's been done, what's in progress, and what's next. If Benny gets rate limited or compacted, read this file first to resume.


🔴 Now — #40 Worker Monitoring & Auto-Restart

Issue: Worker is the engine — if it dies silently, articles stop generating. Need monitoring, auto-restart, and structured logging.

Tasks:

  • Task 1: Health check endpoint — GET/POST /api/worker/health, worker pings every 60s, stores in MongoDB (commit 72873e7)
  • Task 2: Process watchdog script — OpenClaw cron every 2 min, auto-restart on crash (commit 987a498) ⚠️ TEMPORARY — will be replaced by systemd on AWS
  • Task 3: Structured event logging — PAUSED, will implement on Linux VM with journald
  • Task 4: Graceful shutdown + crash recovery — PAUSED, will implement with systemd SIGTERM
  • Task 5: Basic alerting — PAUSED, will implement on Linux VM

🚀 AWS Migration (supersedes Tasks 3-5)

Decision: Move worker to AWS EC2 (t3.small, us-east-1). systemd replaces watchdog, journald replaces log files.

✅ #63 AWS Account Foundation Setup — CLOSED Mar 7, 2026

  • Apply for AWS Activate Founders credits ($1K) — submitted Mar 7
  • AWS account created: tryscribeco (092042969558), root MFA enabled
  • IAM Identity Center enabled (us-east-1, permanent)
  • AdminGroup + AdministratorAccess permission set created
  • User taha (taha@tryscribe.co) created, added to AdminGroup
  • Permission set assigned to tryscribeco account
  • Access Portal URL: https://d-906605d2b0.awsapps.com/start
  • AWS CLI v2 installed + SSO configured (profile: scribe-admin)
  • Workloads OU created (ou-uj2a-yibjo9fm)
  • Scribe Production account created (572885593715)
  • CloudTrail protection SCP attached to Production
  • $150/mo budget with alerts (80% actual + 100% forecast) → taha@ + dev@ + finance@tryscribe.co
  • Full Phase 5 verification passed
  • Earn extra $100 credits — Complete onboarding activities

#40 Worker Migration to EC2 — IN PROGRESS

  • Provision EC2 instance — i-025c8a724390b03d1, t3.small, Ubuntu 24.04 x86_64
  • Elastic IP: 13.216.237.65, SSH config: ssh scribe-worker
  • Security group: sg-0f50a0862e7bb4e21 (SSH only)
  • Server hardening — fail2ban, UFW, key-only SSH, auto security updates, timezone MST
  • Node.js 22.22.1 installed
  • Repo cloned to /home/ubuntu/scribe, npm install complete (136 packages)
  • Env file at /etc/scribe/.env (root:root, 600) — MongoDB, OpenAI, Blob, Resend, worker secret
  • OpenClaw v2026.3.2 installed, PATH added to ~/.bashrc
  • openclaw onboard completed — Anthropic auth (setup-token), claude-opus-4-6, no channels, no skills
  • Hooks enabled: command-logger + session-memory (compaction resilience for multi-article runs)
  • openclaw doctor passes clean — no blockers
  • RESOLVED: OpenClaw gateway service on EC2
    • openclaw gateway install fails over SSH (known edge case — systemctl --user detection)
    • Solution: Created system-level systemd service (/etc/systemd/system/openclaw-gateway.service)
    • Runs openclaw gateway run --bind loopback --port 18789 (matches docs pattern from Hetzner guide)
    • Includes performance optimizations: NODE_COMPILE_CACHE, OPENCLAW_NO_RESPAWN=1
    • Service enabled, started, verified: RPC probe OK, openclaw health passes
    • Docs reviewed: remote access, exe.dev, Hetzner/Docker guides — all confirm this approach
  • Initial workspace files deployed (SOUL.md, AGENTS.md, IDENTITY.md, TOOLS.md, USER.md, HEARTBEAT.md)
  • Scribe Walker Agent Architecture Review — COMPLETE (Mar 7-8)
    • Architecture doc expanded: platform/docs/ARCHITECTURE.md with full agent design, decisions, diagrams
    • Three-way comparison posted to GitHub issue #40 (Mac prototype vs EC2 production)
    • Full analysis of Mac Mini Walker Posse architecture
    • Transcribed and analyzed Taha's 10-min voice memo on design philosophy
    • 22-point SEO quality checklist: platform/docs/SEO-QUALITY-CHECKLIST.md
    • Decision: Scribe Walker = main agent on EC2 (full OpenClaw lifecycle)
    • Decision: Prompt modules in JS files, not MongoDB — security > hot-reload
    • Decision: Agent is stateless — no persistent memory across jobs
    • Decision: DB stores DATA, JS stores RULES
  • Worker routing (#67) — COMPLETE (Mar 8)
    • WORKER_TARGET env var: ec2 (default) or local (Mac Mini)
    • EC2 picks up { status: "pending", worker: { $ne: "local" } }
    • Mac Mini picks up { status: "pending", worker: "local" } only
    • Generate API accepts ?worker=local query param
    • Job model: worker field (enum: ec2|local), compound index updated
    • Scroll Worker bumped to v0.2.0
    • Git tag mac-mini-worker-snapshot for rollback safety
    • Commit: 46d71f0
  • EC2 agent configuration — COMPLETE (Mar 8)
    • Agent ID configurable via AGENT_ID env var (default: main)
    • Tool profile: full (not messaging — agent needs exec/read/write)
    • Exec security: full with ask off (headless server, no companion app)
    • Unique session ID per job: scribe-job-{jobId}-{timestamp} (prevents history carryover)
    • OpenAI key in openclaw.json (matches Mac Mini extraction pattern)
    • SCRIBE-WALKER-CONTEXT.md deployed (production version, no Taha-specific content)
    • MongoDB credentials at ~/.openclaw/credentials/mongodb-scribe.json
  • EC2 end-to-end testing — COMPLETE (Mar 8)
    • 3 successful article generation runs (9 articles total)
    • DALL-E image generation + CDN upload working
    • Completion email notifications working
    • Dedup against existing titles working (checked 58-64 titles per run)
    • Average 1,800-2,000 words per article
    • ~4-6 min per 3-article batch
  • Image padding detection (#69) — COMPLETE (Mar 8)
    • 3-layer detection in image-processor.ts:
      1. Square/portrait: width ≤ height
      2. Solid padding: 20px scan → 100px confirmation, any color
      3. Soft padding: uniform edges + edge-vs-center color distance > 40
    • Tested against 5 flagged images — catches black, cream, peach padding
    • Verified no false positives on valid spa interior images
    • Auto-queues regeneration job on rejection
    • Commit: 82cae53
  • Services deployed on EC2 (Mar 7-8)
    • openclaw-gateway.service — systemd, loopback:18789, RPC OK
    • scribe-worker.service — systemd, polls MongoDB, spawns agent sessions
    • Both services running, auto-restart on failure
  • Cutover Step 2: Mac Mini comparison test — COMPLETE (Mar 8)
    • True end-to-end test via Summon button with ?worker=local
    • Snapshot code: avg 1,392 words / 6.2 min
    • EC2 production: avg 1,933 words / 7.2 min
    • EC2 wins on content depth (39% more), both pass quality gates
    • Comparison posted to GitHub issue #40
  • Cutover Step 2.5: Production hardening (Mar 8)
    • Word count ceiling: 1,400-1,700 target, 1,900 max
    • DALL-E demographic fix: prefer no-people images (DALL-E overrides ethnicity prompts)
    • README: comprehensive with mermaid diagrams, troubleshooting flowchart, ops guide
    • Accidental snapshot commit caught and fixed (job-worker.js)
    • Mac Mini watchdog cron deleted (no longer needed)
    • Test accounts standardized: dev+test1-7@tryscribe.co
    • Vercel platform deploy: manual CLI only (NOT auto-deploying on push)
  • ⏳ Cutover Step 3: 24h monitoring — IN PROGRESS (started Mar 8, 2032 MDT)
    • EC2 is sole production worker
    • Mac Mini workers killed, snapshot tag preserved for rollback
    • Hasnat (@Crypto_naka09) conducting external testing
    • Taha testing across multiple accounts/niches
  • ⏳ Cutover Step 4: Decommission Mac Mini worker — after monitoring passes
  • Complete Tasks 3-5 properly on Linux (structured logging, graceful shutdown, alerting)
  • Remove Mac watchdog cron, cleanup

Issues Filed During Migration (Mar 8)

  • #67 Worker routing — CLOSED (implemented)
  • #68 Browser 'Leave site?' popup contradicts 'Safe to leave' messaging — OPEN
  • #69 DALL-E image padding detection — CLOSED (3-layer detection implemented)

✅ Completed — #59 Site Owner Article Management

Issue: Site owners need to manage their own articles — delete, regenerate images, upload custom images, edit metadata, unpublish.

Tasks:

  • Task 1: Delete article — DELETE /api/articles/[id], ownership verification, Blob cleanup. Committed: 14e0961
  • Task 2: Regenerate featured image — async via worker job queue, DALL-E 3 → sharp Q85 → Blob CDN. Committed: 059e452
  • Task 3: Upload custom image — POST /api/articles/[id]/upload-image, 5MB max, sharp Q85 pipeline. Committed: c994f9f
  • Task 4: Edit article metadata — title, SEO title/description/keywords, modal UI. PAUSED — awaiting discussion
  • Task 5: Unpublish/republish toggle — PATCH /api/articles/[id]/status, draft ↔ published, auto-unpin. Committed: c994f9f
  • Task 6: Card clutter cleanup — stripped action buttons from cards, pencil ✏️ icon → manage modal with all actions. Committed: 20bd01e, 62ec67e
  • Task 7: Graceful "not available" page — branded page instead of 404, suggested articles, blog home CTA. Committed: 4481ad2

Bug fixes during #59:

  • Dashboard now polls during image regeneration (was only polling during article generation). Committed: 75b1ee7
  • Image-regen email notifications fixed (was using articleIds instead of articleId). Committed: 75b1ee7
  • Toast notifications on regenerate/upload. Committed: 2f29fdd

✅ Completed — #51 Image Optimization (v0.8.x)

Issue: All 57+ featured images stored as base64 in MongoDB (~1MB each, ~57MB total). No compression, no CDN.

Approach: Keep DALL-E 3 at 1792x1024 → sharp JPEG Q85 compression → Vercel Blob CDN → store only URL in MongoDB.

Tasks:

  • Task 1: Install sharp + @vercel/blob, connect Vercel Blob store (scribe-images, iad1), BLOB_READ_WRITE_TOKEN set
  • Task 2: src/lib/image-processor.tsprocessAndUploadImage() + processBase64AndUpload(), tested
  • Task 3: POST /api/images/upload endpoint — worker calls this with DALL-E URL, compresses + uploads + updates article
  • Task 4: Worker updated — passes DALL-E URL to upload API, no more base64 storage
  • Task 5: Migration complete — 63/63 articles migrated to Vercel Blob CDN, 0 errors, 56% avg compression
  • Task 6: Image route updated — 301 redirect to CDN URL with immutable cache, base64 fallback kept
  • Task 7: Projection workarounds removed — CDN URLs are tiny, queries clean again

Results: Blog SSR 2.80s→1.63s (42% faster), Image load 11.84s→0.43s (27x faster), 63MB freed from MongoDB

Related fixes already deployed:

  • Projection hotfix.select('-content -featuredImage.url') on all list queries to stop timeouts (Sally's Spa 33+ articles × 1MB = 33MB was crashing Vercel)
  • #53 Dashboard pagination — 24 articles per page, "Load more" button, server-side skip/limit

🔴 Now — EC2 Cost Optimization & Idle Monitoring

Date: March 11, 2026 Issue: EC2 server burning ~$5.76/day ($173/mo) while idle due to heartbeat misconfiguration.

Root Cause Analysis

  1. Wrong model name: anthropic/claude-haiku-3.5 doesn't exist → should be anthropic/claude-haiku-4-5
  2. Double-quote escaping bug: openclaw config set with bracket notation created key "anthropic/claude-haiku-4-5" (quotes as part of string) → haiku never matched allowlist
  3. Silent fallback to Opus: Heartbeat model override was blocked by allowlist, fell back to primary (Opus) at ~$0.24/heartbeat

Fix Applied

  • Fixed model name to anthropic/claude-haiku-4-5
  • Set allowlist using JSON object syntax (no bracket notation) to avoid escaping bug
  • Verified heartbeat cost dropped from ~$0.24 → ~$0.007 per heartbeat (34x cheaper)
  • Production config: Opus primary (article generation) + Haiku heartbeat (1h interval)
  • Projected idle cost: $0.17/day (down from $5.76/day)

Current EC2 Config

Primary model: anthropic/claude-opus-4-6 (for scribe-worker article generation)
Heartbeat model: anthropic/claude-haiku-4-5 (1h interval, lightContext: true)
Allowlist: Both Opus + Haiku (properly configured)

Monitoring — ✅ VERIFIED (4-hour test, Mar 11)

  • Confirm idle costs stay at ~$0.17/day — $0.05 over 4 hours = $0.30/day projected
  • Verify article generation quality unaffected (still using Opus) — awaiting next generation run
  • Check for any new FailoverError entries in logs — zero errors since fix
  • Token isolation test — revoked tokens, confirmed 401, deployed new token ✅

OG Image Fix (Mar 11)

  • og-image.jpg and og-image.png were missing from platform/public/ after subfolder migration
  • Copied from public/platform/public/, committed, deployed
  • Verified 200 OK via curl — link previews working again

Issues Updated

  • #81 — CLOSED: Idle Anthropic token consumption (root cause + fix documented)
  • #80 — CLOSED: Subfolder migration complete
  • #71 — Updated: OG image fix noted, tiered share cards still pending

🔴 Now — #5 Dashboard Completion (3 tasks)

Task 1: Stats Bar ✅ DONE

  • Add stats section below site header, above search bar
  • Shows: Total Articles count, Tier usage bar (e.g., "42 / 100 articles"), current month
  • Warm styling — amber progress bar on cream bg, color-coded by usage (green/amber/red)
  • Tier badge (Free/Pro/Business/Agency) with "Upgrade →" link when at limit
  • Dashboard API now returns tier field
  • Deployed + committed: 48573f2

Task 2: Tier Badge in Sidebar ✅ DONE

  • Show current plan name under user email in sidebar footer
  • Color-coded badge (gray Free, amber Pro, green Business, rust Agency)
  • Links to Settings page on click
  • Deployed + committed: 66e021d

Task 3: Analytics & Billing sidebar items ✅ DONE

  • Removed "Soon" badges — replaced with subtle amber dot indicator
  • Both now link to Settings page (will point to own pages when built)
  • Clickable, not dead-end — lighter text styling shows they're upcoming
  • Deployed + committed: d75c861

NOT included (P2): SEO scores (#8), publishing schedule, actual analytics data

✅ #38 Navigate-away notice + email when done — COMPLETE

Task 1: Navigate-away noticeTask 2: Completion emailTask 3: Email preferences in Settings ✅ Committed: 1c20825

✅ #31 Single article layout — COMPLETE

  • Copy link button (clipboard + checkmark feedback)
  • Next/prev navigation (publishedAt order, Playfair titles)
  • Committed: e156d46

🟡 Next

  • #32 — Dashboard stats + generate more — remaining: stats already in #5
  • #24 — Archive view — Month/year grouping
  • #3 — Stripe billing — Critical path for monetization
  • #54 — Server-side search/sort on status API — P2, when sites exceed ~100 articles

🟠 Backlog

  • #25 — Article limit enforcement bug
  • #26 — Upgrade popup (depends on #3)
  • #33 — Custom content (P2)
  • #34 — Listing-driven content / Realtors (P2)
  • #35 — Lead capture system (P2)
  • #43 — Comments + reactions
  • #46 — Lead management / CRM-lite
  • #39 — Admin analytics
  • #40 — Worker monitoring / auto-restart
  • #11 — Multi-language / i18n
  • #10 — Agency white-label
  • #9 — Referral system
  • #8 — SEO tracking
  • #7 — Custom domains (Phase 1: Vercel API, Phase 2: AWS post-incorporation)
  • #55 — MongoDB Atlas network security (tied to #7 Phase 2)

❓ Open Questions / Decisions

Infrastructure Scaling Strategy (Decided Mar 6, 2026)

Decision: Two-phase approach

  • Phase 1 (Now → Beta): Stay on Vercel. Custom domains via Vercel API. Handles 5-50 sites fine. Hobby = 50 domains, Pro ($20/mo) = 500.
  • Phase 2 (Post-Incorporation): Migrate serving layer to AWS (CloudFront + S3 + ACM + Route53). Apply for AWS Activate credits ($5K-$100K) with incorporation + partner offers.
  • Rationale: Don't burn cash on AWS before credits. Don't build twice. Learn from beta users first.
  • Phase 2 unlocks: Unlimited custom domains, S3 image storage, VPC peering to Atlas (#55), lower marginal cost at scale.
  • Platform dashboard stays on Vercel even in Phase 2 — good DX, only customer-facing blogs move to AWS.

✅ Completed Releases

v0.8.0 — Dashboard Sidebar + Live Generation + Settings (2026-03-05)

  • Dashboard sidebar navigation (#50) — 6 tasks: shared layout, Articles/Appearance/Settings pages, mobile hamburger with swipe-to-close
  • Live generation experience (#47) — Showcase-style rotating messages (23 total), dot indicators, published cards slide in, celebration screen
  • Website + social links (#45) — Onboarding optional fields + Settings page + worker CTA integration
  • Dashboard Settings page — Brand info, online presence, plan, danger zone
  • Appearance page — Layout picker + hero style picker extracted from dashboard home

v0.7.1 — Bug Fixes + Mobile UX + Article Layout (2026-03-05)

  • Auth page branding (#36) — Shared layout with header (logo + back link), footer
  • Single article layout (#31) — Full-bleed overlay hero, Playfair headings, Inter body, share buttons (X/LinkedIn/FB), related articles sidebar, sticky header, mobile responsive
  • Article hero style picker — Overlay (default) + Rounded, saved per-site
  • Mobile dashboard (#37) — Responsive empty state, shorter button text
  • DALL-E landscape fix (#42) — Enforced 1792x1024
  • Demographic-aware images (#48) — Location-based profile for DALL-E
  • Brand SEO + CTA (#44) — Brand in titles/meta, CTA block in every article
  • US-only location (#49) — Google Places restricted to US

v0.7.0 — Blog Features + Dashboard Management (2026-03-05)

  • Pagination (#18), Search (#19), Tags (#20), Sort (#21)
  • Featured/pinned article (#23), Featured indicator (#28)
  • Article management tools (#29), Collapsible layout selector (#30)
  • Reading time on cards, Editorial read time fixes (#27)

v0.6.1 — Blog Layout System

v0.5.0–v0.5.2 — Job Queue + Worker + OG + Branding

v0.4.0 — Article Generation (Raw API — replaced)

v0.3.0 — Branded Auth & Onboarding UX

v0.2.0 — Platform Scaffold + Social Accounts

v0.1.0 — Landing Page + Domain + GitHub


📋 Key References

  • GitHub: https://github.com/tryscribeco/scribe (private)
  • Project Board: https://github.com/orgs/tryscribeco/projects/1
  • Architecture: platform/docs/ARCHITECTURE.md
  • Marketing: tryscribe.co (Vercel: try-scribe)
  • Platform: app.tryscribe.co (Vercel: platform-try-scribe)
  • MongoDB: ScribeCluster on Atlas (Project: Scribe)
  • Vercel Blob: scribe-images store (iad1), token: BLOB_READ_WRITE_TOKEN
  • Latest tag: v0.9.5
  • Latest commit: fc8bb5f (operational cost breakdown in launch plan)
  • v0.9.2: Content Quality + Centralized Prompts (#60 closed, word count 800→1200, engagement rules, image dimension enforcement, rate limit fix)
  • v0.9.1: Site Owner Article Management (#59 closed — delete, regen, upload, unpublish, manage modal, graceful 404)
  • v0.9.0: Dashboard + Notifications + Article Polish

🔑 Architecture Decisions

  • OpenClaw agent orchestration — NOT raw API calls from Vercel
  • Claude Opus 4.6 for ALL tiers — cost modeling later
  • DALL-E 3 at 1792x1024 — quality non-negotiable, savings via compression not generation downgrade
  • JPEG Q85 compression via sharp — same as tahaabbasi.com Scribe Walker, 78% size reduction
  • Vercel Blob for image CDN — free 1GB tier, separate from Vercel bandwidth
  • Linux VM for production — cheaper than Mac VM
  • Per-brand subscription model — each brand = independent sub
  • "Brand" not "business" in all UI copy
  • Overlay+Side default blog layout — best above-the-fold
  • Overlay default article hero — full-bleed with gradient
  • Showcase over simulation for generation UX — educate, don't fake progress

📅 Daily Work Log

Quick reference of what was accomplished each working session. Most recent first.

March 11, 2026 — v0.9.5 (EC2 Cost Optimization)

Theme: EC2 Idle Cost Audit + Heartbeat Model Fix

  • Diagnosed $3.57 overnight burn on idle EC2 (Anthropic extra usage: $75.79 → $79.36)
  • Found heartbeat using wrong model name claude-haiku-3.5 (doesn't exist)
  • Discovered openclaw config set bracket notation double-quotes keys → allowlist bypass
  • Heartbeat was silently falling back to Opus ($0.24/heartbeat instead of Haiku $0.007)
  • Fixed: correct model name + JSON object syntax for allowlist
  • Tested at 30s, 1m, 2m intervals — confirmed Haiku costs 34x less
  • Production config: Opus primary + Haiku heartbeat @ 1h = ~$0.17/day idle
  • Cost savings: $5.76/day → $0.17/day ($168/month saved)

Commits since v0.9.4:

  • 73c59cc — docs: add test accounts to testing guide
  • a9fb359 — docs: move testing guide to GitHub issue #70
  • 0ca9357 — docs: add AWS Startup Showcase, growth channels, Pro pricing TBD
  • 1f474d6 — fix: related articles linking to /blog/ causing 404s
  • 31ad60d — feat: migrate from subdomains to subfolders for SEO authority (#80)
  • 3c13753 — fix: serve marketing page at root, redirect dashboard
  • d0bd7cb — fix: article links missing brand prefix in subfolder URLs
  • 07f2f28 — docs: update ARCHITECTURE.md and README.md for subfolder model (#80)
  • 11bb6f6 — Update launch plan with real cost data

March 8, 2026 — v0.9.3 → v0.9.4 (1317-2030+ MDT)

Theme: True E2E Comparison + Production Hardening + Docs + 24h Monitoring

  • True end-to-end Mac vs EC2 comparison via Summon button (EC2 wins: 39% more content)
  • Dashboard ?worker=local routing for testing
  • Vercel manual deploy workflow discovered (not auto-deploying on push)
  • Accidental snapshot commit fixed (job-worker.js reverted to production)
  • Word count ceiling: 1,400-1,700 target, 1,900 max
  • DALL-E demographic fix: prefer no-people images
  • Comprehensive README: mermaid architecture + troubleshooting flowchart + ops guide
  • Sensitive infra details moved from README to DEPLOYMENT.md
  • Mac Mini watchdog cron deleted
  • Test accounts standardized to dev+test1-7@tryscribe.co
  • 24h monitoring period started — EC2 sole production worker
  • Hasnat conducting external testing

Commits: 09b4086 (latest), Release: v0.9.4


March 7-8, 2026 — v0.9.2 → v0.9.3 (15hrs, 1358 MDT Mar 7 → 0500 MDT Mar 8)

Theme: AWS Foundation + EC2 Migration + Production Pipeline

AWS Account Foundation (#63) — CLOSED

  • AWS account tryscribeco (092042969558) created, root MFA enabled
  • AWS Organizations + Workloads OU
  • IAM Identity Center (us-east-1): AdminGroup, user taha (taha@tryscribe.co)
  • Access Portal: https://d-906605d2b0.awsapps.com/start
  • AWS CLI v2 + SSO profile scribe-admin configured
  • Scribe Production account (572885593715) in Workloads OU
  • CloudTrail protection SCP attached
  • $150/mo budget with alerts → taha@ + dev@ + finance@tryscribe.co
  • Applied for AWS Activate Founders credits ($1K)

EC2 Provisioned + Hardened (#40 Phases 1-2)

  • Instance: i-025c8a724390b03d1, t3.small, Ubuntu 24.04 x86_64
  • Elastic IP: 13.216.237.65, SSH config: ssh scribe-worker
  • Security hardening: fail2ban, UFW, key-only SSH, auto security updates, timezone MDT

Runtime + Agent Setup (#40 Phases 3-4)

  • Node.js 22.22.1 + npm installed
  • Repo cloned, npm install complete (platform + worker)
  • Env file: /etc/scribe/.env (root:root, 600)
  • OpenClaw v2026.3.2: onboard complete, gateway running via systemd (loopback:18789)
  • Agent workspace files deployed (SOUL.md, AGENTS.md, IDENTITY.md, TOOLS.md, USER.md, HEARTBEAT.md)
  • Production SCRIBE-WALKER-CONTEXT.md (generic multi-tenant, no personal content)
  • Scroll Worker systemd service deployed + running

Architecture & Documentation

  • Full architecture doc: platform/docs/ARCHITECTURE.md
  • 22-point SEO quality checklist: platform/docs/SEO-QUALITY-CHECKLIST.md
  • Three-way comparison posted to GitHub issue #40
  • Transcribed + analyzed Taha's 10-min voice memo on design philosophy
  • Agent workspace files version-controlled: worker/agent-workspace/
  • Deployment ops guide: worker/DEPLOYMENT.md

Worker Routing (#67) — CLOSED

  • WORKER_TARGET env var: ec2 default, local for Mac Mini
  • Generate API: ?worker=local routes jobs to Mac
  • Job model: worker field with compound index
  • Scroll Worker v0.2.0 with target display
  • Git tag mac-mini-worker-snapshot for rollback

EC2 End-to-End Testing (#40 Phase 5) — 5 bugs found + fixed

  1. Agent ID: hardcoded scribe-walker → configurable AGENT_ID env var
  2. Tool profile: messagingfull (agent needs exec/read/write)
  3. Exec security: askFallback deny → full + ask off (headless server)
  4. Session history carryover → unique scribe-job-{jobId}-{timestamp} per job
  5. Missing workspace files: SCRIBE-WALKER-CONTEXT.md + MongoDB creds deployed

Results: 9 articles generated on EC2 (avg 1,835 words), 6 image-regen jobs processed, DALL-E → CDN pipeline validated, completion emails working. ~4-6 min per 3-article batch.

Image Padding Detection (#69) — CLOSED

  • 3-layer detection in image-processor.ts:
    1. Square/portrait: width ≤ height
    2. Solid padding: 20px scan → 100px confirmation, any color (black, cream, blue, etc.)
    3. Soft padding: uniform edges + edge-vs-center color distance > 40
  • Tested against 5 images — all bad images caught, no false positives on valid images
  • Auto-queues regeneration on rejection

OpenAI Key Standardized

  • Both EC2 + Mac Mini use identical jq extraction from openclaw.json
  • Key lives at agents.defaults.memorySearch.remote.apiKey

Issues Filed: #67 (closed), #68 (beforeunload popup — open), #69 (closed)

Commits: 14 (46d71f0 → a6f29b9) Release: v0.9.3


March 5-6, 2026 — v0.9.1 → v0.9.2

Theme: Content Quality + Centralized Prompts + Rate Limiting

  • Centralized prompt modules: worker/prompts/{article-writing,quality-rules,dalle-image,tags}.js
  • Word count minimum: 800 → 1,200 words
  • Engagement rules (no filler, no fluff, actionable content)
  • Image dimension enforcement in prompts
  • Rate limit separation (generation vs image-regen)
  • Issue #60 closed

March 5, 2026 — v0.8.0 → v0.9.1

Theme: Dashboard Polish + Article Management + Image CDN

  • Dashboard sidebar navigation (#50)
  • Live generation experience (#47) — showcase messages, dot indicators, celebration
  • Website + social links (#45) — onboarding + settings + worker CTA
  • Site owner article management (#59) — delete, regen image, upload image, unpublish
  • Image pipeline (#51) — DALL-E → sharp Q85 → Vercel Blob CDN (42% faster SSR, 27x faster images)
  • Dashboard pagination (#53)
  • Graceful 404 page

March 4, 2026 — v0.6.1 → v0.8.0

Theme: Blog Features + Mobile UX + Article Layout

  • Blog pagination, search, tags, sort (#18-21)
  • Featured/pinned articles (#23, #28)
  • Single article layout (#31) — full-bleed hero, Playfair headings, share buttons
  • Auth page branding (#36)
  • Mobile dashboard (#37)
  • DALL-E landscape fix (#42)
  • Demographic-aware images (#48)
  • Brand SEO + CTA (#44)
  • US-only location (#49)

March 3, 2026 — v0.1.0 → v0.6.1

Theme: Platform from Zero

  • Landing page + domain + GitHub (v0.1.0)
  • Platform scaffold + social accounts (v0.2.0)
  • Branded auth & onboarding (v0.3.0)
  • Article generation — raw API (v0.4.0)
  • Job queue + worker + OG images (v0.5.x)
  • Blog layout system (v0.6.1)