From 06f7d40365258369d850ec73ea9168b00b5673e9 Mon Sep 17 00:00:00 2001 From: Hoid Date: Fri, 6 Mar 2026 12:22:47 +0100 Subject: [PATCH] SnapAPI session 64: OpenAPI cleanup, dark mode blog post, 474 tests --- memory/portfolio.json | 14 ++++----- memory/real-portfolio.json | 24 +++++++++++---- projects/snapapi/memory/sessions.md | 47 +++++++++++++++++++++++++++++ projects/snapapi/memory/state.json | 11 ++++--- 4 files changed, 79 insertions(+), 17 deletions(-) diff --git a/memory/portfolio.json b/memory/portfolio.json index a209d6f..432f851 100644 --- a/memory/portfolio.json +++ b/memory/portfolio.json @@ -52,14 +52,14 @@ ], "notes": "N26 uses Xetra tickers. Always provide ISIN for orders. Fractional shares by EUR amount supported.", "created": "2026-02-12T20:00:00Z", - "lastUpdated": "2026-03-05T17:15:00Z", + "lastUpdated": "2026-03-06T09:15:00Z", "closingSnapshot": { - "date": "2026-03-05", - "DFNS": 60.85, - "portfolioValue": 1082.16, - "dailyPL": -24.19, - "dailyPLpct": -2.19, - "totalReturn": 8.22 + "date": "2026-03-06", + "DFNS": 62.05, + "portfolioValue": 1103.16, + "dailyPL": 20.99, + "dailyPLpct": 1.94, + "totalReturn": 10.32 }, "pendingActions": [] } \ No newline at end of file diff --git a/memory/real-portfolio.json b/memory/real-portfolio.json index 970af19..f1a9e31 100644 --- a/memory/real-portfolio.json +++ b/memory/real-portfolio.json @@ -26,9 +26,26 @@ } ], "totalInvested": 22200, - "lastAnalysis": "2026-03-05T18:05:00Z", + "lastAnalysis": "2026-03-06T11:05:00Z", "updateNote": "4:00 PM Vienna Thursday - RHM.DE €1,626–€1,638 range (+3.7% daily support). PICK $59.72 (-2.47% day, down from $61.23—mining weakness accelerating). DFNS.PA API unavailable but defense sector outperforming. RHM earnings March 11 catalyst key. PICK below $60 signals potential uranium rotation if <$58 support breaks. Defense thesis intact on geopolitical tensions. HOLD all positions; monitor PICK support at $58.", "priceHistory": [ + { + "timestamp": "2026-03-06T11:05:00Z", + "RHM.DE": 1626.0, + "PICK": 58.79, + "note": "11:05 AM Vienna Friday - RHM.DE €1,626 (stable). PICK $58.79 firmly below $58 support (rotation trigger confirmed). Defense thesis intact despite mining weakness; Iran conflict day 6 continuing. RHM earnings March 11 catalyst key. HOLD RHM.DE/DFNS.PA; **PICK rotation candidate**—consider uranium ETF swap if closed below $58. No new opportunities due to API rate limits. Web searches exhausted." + }, + { + "timestamp": "2026-03-06T10:00:00Z", + "RHM.DE": 1626.0, + "PICK": 58.79, + "note": "10:00 AM Vienna Friday - RHM.DE €1,626 (-0.74% from Thu €1,638.50, near €100B market cap). PICK $58.79 (-3.985% day, support level holding). Defense sector momentum intact (Rheinmetall acquisitions, earnings March 11, geopolitical tailwinds continue). Mining weak but RHM thesis solid. Middle East war day 6, oil stable, safe-haven flows supporting defense/commodities. No new breakout opportunities; broader tech/semiconductors not N26-accessible. HOLD all positions; RHM support level €1,600 watch, PICK rotation trigger if <$58 broken late-session." + }, + { + "timestamp": "2026-03-06T09:01:00Z", + "PICK": 58.79, + "note": "9:01 AM Vienna Friday - PICK $58.79 (-3.985% day, broke $58 support threshold). RHM.DE/DFNS.PA API unavailable but defense thesis intact (Iran conflict escalating, Allianz research confirms sector outperformance). URNM $66.50 (-6.3% day). Rotation trigger hit for PICK; consider URNM.L/URNM.SW swap but wait for better uranium entry (not on down day). RHM earnings March 11 catalyst remains key. HOLD positions; monitor PICK close for rotation execution." + }, { "timestamp": "2026-03-05T18:05:00Z", "RHM.DE": 1638.5, @@ -189,10 +206,5 @@ "PICK": 64.34, "note": "3:01 PM Vienna - PICK steady $64.34 (+0.33% today). Defense ETFs +14% YTD. US-Iran war escalating, Brent toward $80. Broad equities down >1%, defense/commodities safe-haven strength intact." }, - { - "timestamp": "2026-03-02T14:09:00Z", - "PICK": 64.34, - "note": "2:09 PM Vienna - PICK flat from 1 PM, +0.33% today. Broad market down >1%. Gold $5,387 (+22% YoY). Defense & commodities outperforming. Thesis intact." - } ] } diff --git a/projects/snapapi/memory/sessions.md b/projects/snapapi/memory/sessions.md index ae2ffef..134f305 100644 --- a/projects/snapapi/memory/sessions.md +++ b/projects/snapapi/memory/sessions.md @@ -1,5 +1,52 @@ # SnapAPI Session Log +## Session 64 — 2026-03-06 12:00 CET (Quality & SEO) + +**Goal:** OpenAPI spec cleanup + new blog post for SEO while blocked on production deploy. + +**Health Check:** +- Production: ✅ healthy, 2 replicas, v0.5.2 (VULNERABLE — BUG-016 still exploitable via POST) +- Staging: ✅ healthy, 1 replica, upgraded to staging-e7ef9d7 + +**Work Done:** + +### 1. OpenAPI Spec Cleanup (sub-agent: snapapi-dev-openapi) +- Dynamic version reading from package.json (was hardcoded "0.3.0") +- Removed dead "Signup" tag (free signup was removed in v0.3.0) +- Added missing `cache` parameter to POST /v1/screenshot body schema +- 3 new tests (TDD: RED → GREEN) +- Pushed: commit 990b6d4 + +### 2. Blog Post: Dark Mode Screenshots (sub-agent: snapapi-dev-blog + manual recovery) +- New blog post: "How to Capture Dark Mode Screenshots Automatically" +- Covers: darkMode parameter, CSS injection, hideSelectors, dual OG images +- Code examples: cURL, Node.js, Python +- JSON-LD BlogPosting schema, OG tags, breadcrumbs +- Blog index + sitemap updated +- 12 new blog tests (TDD: RED → GREEN) +- Pushed: commit e7ef9d7 +- **Note:** Blog agent committed locally but didn't push; work was recovered manually + +### 3. Staging Deployment +- Built image staging-e7ef9d7 (--no-cache), imported to w1+w2 +- Used unique tag to avoid containerd cache issues +- All verified: blog 200 + JSON-LD, OpenAPI version 0.9.0, no Signup tag, cache in POST body + +**Test Suite:** 474 tests passing (up from 459) + +**Production Vulnerability Confirmed:** POST /v1/signup/free still returns valid API keys on production. Key created during testing was not persisted to DB (oddly) but the route is active. + +**Investor Test:** +1. Stranger trust with money? **Yes on staging, NO on production** +2. Data loss on crash? **No** (CNPG PostgreSQL) +3. Free tier abuse? **⚠️ YES on production** — BUG-016 still active +4. Key recovery? **Yes on staging** +5. All website features work? **Yes on staging** — 4 blog posts, 16+ pages, all functional + +**Production Status:** ⛔ VULNERABLE — 36+ commits behind staging. Strongly recommend production deploy approval. + +--- + ## Session 63 — 2026-03-06 09:00 CET (Feature Development) **Goal:** Add batch screenshot endpoint and retry logic while blocked on production deploy approval. diff --git a/projects/snapapi/memory/state.json b/projects/snapapi/memory/state.json index 7b0f18b..0b04c56 100644 --- a/projects/snapapi/memory/state.json +++ b/projects/snapapi/memory/state.json @@ -1,11 +1,11 @@ { "phase": "production-live", - "version": "0.5.2-prod (VULNERABLE: free signup still live) / 0.9.0-staging (459 tests)", + "version": "0.5.2-prod (VULNERABLE: free signup still live) / 0.9.0-staging (474 tests)", "staging": { "status": "running", "namespace": "snapapi-staging", "replicas": 1, - "image": "git.cloonar.com/openclawd/snapapi:latest-staging", + "image": "git.cloonar.com/openclawd/snapapi:staging-e7ef9d7", "healthCheck": "passing" }, "production": { @@ -103,7 +103,10 @@ "Test suite: 431 tests passing (staging)", "Batch screenshot endpoint: POST /v1/screenshots/batch — up to 10 URLs per request, partial success, concurrent processing (staging)", "Screenshot retry logic: automatic retry (max 2) for transient browser failures with exponential backoff, X-Retry-Count header (staging)", - "Test suite: 459 tests passing (staging)" + "Test suite: 459 tests passing (staging)", + "OpenAPI spec cleanup: dynamic version from package.json, removed dead Signup tag, added cache to POST body (staging)", + "Blog post: How to Capture Dark Mode Screenshots Automatically — darkMode parameter, CSS injection, dual OG images (staging)", + "Test suite: 474 tests passing (staging)" ], "notDone": [ "Register Stripe webhook URL in Stripe Dashboard", @@ -126,6 +129,6 @@ "priceId": "price_1T2XHpRtlDv9c8GoThHfd8kS" } }, - "lastSession": "2026-03-05T17:00:00Z", + "lastSession": "2026-03-06T11:00:00Z", "codeLocation": "Forgejo repo openclawd/SnapAPI. Clone: git clone forgejo-snapapi:openclawd/SnapAPI.git" }