Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 20 additions & 16 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,29 @@ You are working in the [Shoploop](https://github.com/ninan-versioning/shoploop)

Owns `ARCHITECTURE.md`, `agent.md`, `soul.md` — the operating contracts every other repo and every AI agent reads. Cross-repo orchestration, threat response, policy enforcement engine, billing/metering, cost guardrails, data-ownership receipts, enterprise distribution.

**Do not put here:** product/render code (→ shoploop-core), Shopify-specific code (→ shoploop-shopify), growth orchestration code (→ shoploop-growth), public schemas (→ open-brand). This is the brain, not the body.
**Do not put here:** product/render code (→ shoploop-core), delivery/adapter code (→ shoploop-delivery, formerly shoploop-shopify), growth orchestration code (→ shoploop-growth), public schemas (→ open-brand). This is the brain, not the body.

---

## Mission

Shoploop = Grip-from-below. Grip serves LVMH/L'Oréal at enterprise pricing. Shoploop serves **$1M–$10M GMV Shopify D2C brands at $99–$299/month**. Distribution: Shopify App Store first. Dogfood: [Drink Varitea](https://github.com/ninan-versioning/drinkvaritea).
Shoploop = Grip-from-below. Grip serves LVMH/L'Oréal at enterprise pricing. Shoploop serves **$1M–$10M GMV tabletop D2C brands at $99–$299/month**. Distribution: URL paste on shoploop.studio first. Dogfood: [Drink Varitea](https://github.com/ninan-versioning/drinkvaritea).

Full-funnel positionless AI marketing for physical products. **AWS + NVIDIA + Mistral** stack.
Full-funnel positionless AI marketing for tabletop physical products. **URL is the only intake.** **AWS + NVIDIA + Mistral** stack.

## Locked decisions — do not re-litigate

- gstack sprint workflow
- AWS build stack (never Vercel for GPU workloads)
- Mistral + Codestral for autoresearch (climbmix-400b-shuffle dataset)
- Varitea as primary dogfood
- Shopify App Store as primary distribution
- **URL paste is the sole intake surface** (per [NVIDIA OpenUSD product configurator reference architecture](https://developer.nvidia.com/blog/developing-product-configurators-with-openusd/)). No catalog upload, no CSV, no SKU form. OAuth connects are secondary/optional.
- URL paste on shoploop.studio as primary distribution
- 2D → lifestyle image wedge ships first (6 weeks); full USD pipeline after PMF signal
- Three-tier render: `flux_pro` default · `ai_product_photo` mid · `omniverse` Scale tier only
- Single OSS surface: [`open-brand`](https://github.com/ninan-versioning/open-brand) (replaces planned open-pmf, renamed from open-icp)
- Klaviyo: orchestrate above, not beside
- Shopify Autopilot: channel expansion + brand-constrained creative is the wedge
- Channel expansion + brand-constrained creative from a single URL is the wedge

## Decision gate — every PR must answer

Expand All @@ -40,13 +41,15 @@ Full-funnel positionless AI marketing for physical products. **AWS + NVIDIA + Mi
## Architecture loop

```
Shopify Catalog → Product Ingest (→ product_twin.usda)
→ Scene Composer (brand_rules.json + USD stage)
→ Render Pipeline (Flux Pro default; AWS EC2 G/P + OpenUSD at Scale)
→ Post-Process (ComfyUI / SD-XL) → Creative Pack
→ Distribution (Meta / TikTok / Google / Klaviyo / Postiz)
→ Performance Ingest (ROAS, CTR, CAC, GA4)
→ Thompson Sampling → brand_rules.json (loop closes)
Existing Web Page URL
→ Page Parser (DOM + JSON-LD + OG + PDP heuristics)
→ Product Ingest (→ product_twin.usda + brand_rules.json + variant sets)
→ Scene Composer (brand_rules.json + USD stage)
→ Render Pipeline (Flux Pro default; AWS EC2 G/P + OpenUSD at Scale)
→ Post-Process (ComfyUI / SD-XL) → Creative Pack
→ Distribution (Meta / TikTok / Google / Klaviyo / Postiz)
→ Performance Ingest (ROAS, CTR, CAC, GA4, PostHog)
→ Thompson Sampling → brand_rules.json (loop closes)
```

Moat = USD scene graph + brand constraint enforcement. Not image generation. `soul.md` defines aesthetic constraints enforced at Scene Composer. **Kinfolk test**: if a frame wouldn't fit a Kinfolk spread, it's a regression.
Expand All @@ -57,15 +60,15 @@ Moat = USD scene graph + brand constraint enforcement. Not image generation. `so
|---|---|
| [shoploop](https://github.com/ninan-versioning/shoploop) | Control plane · orchestration · policy · threat response |
| [shoploop-core](https://github.com/ninan-versioning/shoploop-core) | OpenUSD · brand_rules engine · Scene Composer · closed moat |
| [shoploop-shopify](https://github.com/ninan-versioning/shoploop-shopify) | Shopify app · admin extensions · theme extensions |
| [shoploop-delivery](https://github.com/ninan-versioning/shoploop-shopify) | Web-publish adapters (GitHub PR + hosted-CMS admin APIs) · embed · AR configurator (repo still named shoploop-shopify on disk; rename tracked) |
| [shoploop-growth](https://github.com/ninan-versioning/shoploop-growth) | Full-funnel growth · paid + organic + lifecycle |
| [open-brand](https://github.com/ninan-versioning/open-brand) | Public OSS · brand_rules schema · reference pipeline |
| [drinkvaritea](https://github.com/ninan-versioning/drinkvaritea) | Dogfood brand (loose-leaf tea) |

## Releases

- **v0.1 Varitea Closed-Loop** (Aug 1) — dogfood cut. Flux Pro tier. No Stripe. No Omniverse. Kinfolk gate green.
- **v0.2 Shopify App Store Launch** (Oct 1) — public beta. GDPR webhooks. Stripe + managed billing. open-brand v0 published.
- **v0.2 URL-intake Public Beta** (Oct 1) — shoploop.studio paste-a-URL flow live. GDPR webhooks on optional connects. Stripe + managed billing. open-brand v0 published.
- **v0.3 Enterprise / Scale Tier** (Dec 15) — Omniverse. AP2 mandates. Amazon SP-API. Lifecycle automation.

## Tone for agents working here
Expand All @@ -83,11 +86,12 @@ Moat = USD scene graph + brand constraint enforcement. Not image generation. `so
- Re-explain D2C market sizing — already done
- Open with sycophantic preambles ("Great question!", "Let's dive in!")
- Produce trend reports
- Re-explain NVIDIA Omniverse, OpenUSD, Shopify app architecture, Temporal, Thompson Sampling, gstack, Mistral/Codestral, Polaris/Remix
- Re-explain NVIDIA Omniverse, OpenUSD, usd-content-agents, Temporal, Thompson Sampling, gstack, Mistral/Codestral, Polaris/Remix
- Propose intake surfaces other than URL. If a task needs data the URL can't provide, expose it as an optional secondary connect — not a required intake.

## Founder context

Solo technical founder, Houston TX, visa constraints. Parallel projects: Shoploop (primary), Drink Varitea (dogfood), Open Employee, Agentframe, Saas-Ikigai, Klartech. Stack: TypeScript/Node.js · Python · React/Next.js · AWS · Vercel (non-GPU) · Shopify · Temporal · Supabase · Cloudflare · LibSQL. Budget: $10K committed.
Solo technical founder, Seattle WA, visa constraints. Parallel projects: Shoploop (primary), Drink Varitea (dogfood), Open Employee, Agentframe, Saas-Ikigai, Klartech. Stack: TypeScript/Node.js · Python · React/Next.js · AWS · Vercel (non-GPU) · Temporal · Supabase · Cloudflare · LibSQL. Budget: $10K committed.

---

Expand Down
55 changes: 36 additions & 19 deletions LOOP_SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ _Last updated: 2026-07-24 · Status: drafted, not scheduled_

## The Product = The Reverse-Feedback Content Loop

**Intake rule (locked):** the only intake is an existing web page link. All other data sources (Google Ads, Meta, Klaviyo, GitHub) are secondary, optional connects layered on after the URL is parsed.

```
Customer connects (Nango) → PostHog reads impact → Creative Mutation generates variants
Customer pastes URL → Page Parser → product_twin.usda + brand_rules.json + variant sets
→ PostHog reads impact → Creative Mutation generates variants
→ 3D Render Batch produces MP4/PNG/USDZ → Ads Auto-Publish (Postiz) & Website Update PR
→ PostHog reads impact → posterior compounds nightly
```
Expand All @@ -18,17 +21,30 @@ Each loop is defined against the 9-primitive framework: Target · Fitness · Sea

---

### Loop 1 — Connector Ingest
- **Runs:** every 15 min
- **Job:** Nango pulls fresh data from customer's Google Ads + Shopify + PostHog + Meta + Klaviyo + GitHub into their own Postgres partition
- **Target:** 100% connector uptime, <5min data freshness lag by 2026-09-30
### Loop 1 — URL Intake (Page → Twin)
- **Runs:** on paste (event-driven) + revalidate every 24h per active URL
- **Job:** fetch the pasted page, run Page Parser (DOM + JSON-LD + OG + PDP heuristics + LLM extract fallback), emit `product_twin.usda` + `brand_rules.json` + variant sets into the customer's Postgres partition and git
- **Target:** ≥90% of pasted URLs produce a renderable twin without human touch by 2026-09-30
- **Fitness:** (auto-parse-success × 0.6) + (extractor-confidence × 0.4)
- **Search Space:** extractor strategies × material heuristics × variant-inference prompts
- **Stopping:** twin passes Validation Agent OR 3 extractor strategies exhausted → human review queue
- **Mutation:** on low confidence, escalate to next extractor; log which strategy won per URL pattern
- **Memory:** per-domain extractor priors in Postgres (Shoploop learns which strategy fits which storefront pattern)
- **Ground Truth:** Validation Agent + weekly human spot-check
- **Boundary:** no auto-render until twin passes Validation Agent; failed twins land in customer's review queue
- **Decay:** per-domain priors halved every 90 days (page templates drift)

### Loop 1b — Optional Connector Ingest (secondary)
- **Runs:** every 15 min, only for customers who have connected optional data sources
- **Job:** Nango pulls fresh data from optional connects (Google Ads, PostHog, Meta, Klaviyo, GitHub) into their own Postgres partition. Never required for Loops 2–6 to start.
- **Target:** 100% connector uptime on connected sources, <5min freshness lag
- **Fitness:** rows-synced-per-15min / expected-rows; alert if <95%
- **Search Space:** connectors enabled at customer onboarding
- **Search Space:** connectors enabled by customer post-URL-paste
- **Stopping:** none (continuous)
- **Mutation:** on API error, backoff + retry per Nango retry policy
- **Memory:** last-cursor per connector in Postgres
- **Ground Truth:** connector's own API response
- **Boundary:** OAuth expiration triggers customer email, does not auto-refresh
- **Boundary:** OAuth expiration triggers customer email, does not auto-refresh; a URL customer with zero connects still gets full Loop 2–6 output
- **Decay:** cursor state resets on connector reconnect

### Loop 2 — PostHog Reverse-Feedback Analyst
Expand Down Expand Up @@ -83,15 +99,15 @@ Each loop is defined against the 9-primitive framework: Target · Fitness · Sea
- **Boundary:** hard $ cap per week per customer; customer sets in onboarding
- **Decay:** paused ads deleted after 30 days idle

### Loop 6 — Website Update PR / API Push
### Loop 6 — Web Page Update (PR-first)
- **Runs:** daily 3am PT
- **Job:** for website changes (new hero, updated PDP 3D asset, copy tweaks, molecule swaps), open PR against customer's GitHub repo OR push to Shopify admin API. Adapter chosen at onboarding
- **Target:** website changes go live within 24h of Loop 3 approval
- **Job:** for changes to the pasted URL(s) (new hero, updated PDP 3D asset, copy tweaks, molecule swaps), open a PR against the customer's page repo (GitHub default). If the page lives on a hosted CMS the customer has optionally connected, push via that platform's admin API instead. Adapter auto-detected from the URL and customer's optional connects.
- **Target:** page changes go live within 24h of Loop 3 approval
- **Fitness:** median-time-from-approval-to-live < 24h
- **Search Space:** all pages tagged for auto-update in customer config
- **Stopping:** customer approval required on GitHub PR path; auto on Shopify API path with rollback watch
- **Search Space:** all URLs the customer has pasted + subpages the parser has discovered
- **Stopping:** customer approval required on GitHub PR path; auto on hosted-CMS API path with rollback watch (only when customer has connected the CMS)
- **Mutation:** on PR rejection, learn from customer's commit diff (feed back to Loop 3)
- **Memory:** PR history + Shopify version log per customer
- **Memory:** PR history + hosted-CMS version log per customer
- **Ground Truth:** post-deploy PostHog session recording sample
- **Boundary:** irreversible destructive changes (delete page, remove SKU) always require PR + human approve, never auto-API
- **Decay:** PR auto-closes after 7 days no activity, re-opens with fresh context
Expand All @@ -111,10 +127,10 @@ Each loop is defined against the 9-primitive framework: Target · Fitness · Sea

### Loop 8 — Platform Health (Nango + Embed + Renders)
- **Runs:** hourly
- **Job:** pings every customer's Nango OAuth + embed instance + render pipeline. Alerts on breakage. Weekly regression tests against top 20 Shopify + top 10 WooCommerce themes for embed compatibility
- **Target:** 99.9% embed uptime, MTTR < 30min, zero silent connector failures
- **Job:** pings every customer's URL intake + optional Nango OAuth + embed instance + render pipeline. Alerts on breakage. Weekly regression tests against the top 30 storefront page templates (Shopify, WooCommerce, BigCommerce, Squarespace, Webflow, static HTML) for parser + embed compatibility
- **Target:** 99.9% embed uptime, MTTR < 30min, zero silent parser or connector failures
- **Fitness:** (uptime × 0.5) + (1/MTTR × 0.3) + (regression_pass_rate × 0.2)
- **Search Space:** all live customer instances + top 30 host themes
- **Search Space:** all live customer instances + top 30 storefront page templates
- **Stopping:** none (continuous)
- **Mutation:** on regression failure, auto-file fix PR to packages/embed
- **Memory:** incident log per customer, theme compatibility matrix
Expand Down Expand Up @@ -159,9 +175,10 @@ Loop 3 uses PostHog session recordings (VLM samples 5/cycle for genuine vs rage-

## Scheduling policy

- Loops 1, 8 always-on (platform reliability)
- Loops 2, 3, 4, 5 gated by "customer has enrolled + Nango connected"
- Loop 6 gated by "customer chose GitHub or Shopify adapter"
- Loop 1, Loop 8 always-on (platform reliability)
- Loop 1b (optional connectors) runs only for customers who have connected optional sources
- Loops 2, 3, 4, 5 gated by "customer has pasted at least one URL and twin passed Loop 1 Validation"
- Loop 6 gated by "customer has a page repo (GitHub PR path) OR has connected a hosted CMS (API path)"
- Loop 7 gated by "customer has trilingual enabled" (default: yes)
- Loops 9, 10 always-on (founder-facing)

Expand Down
30 changes: 21 additions & 9 deletions POSITIONING.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
# Shoploop — Positioning

_Last updated: 2026-07-25 · Branch: jared/tabletop-swap_
_Last updated: 2026-07-25 · Branch: jared/drop-shopify-wording-url-intake_

## One line

**Full-funnel positionless AI marketing for tabletop products on Shopify.**
**Full-funnel positionless AI marketing for tabletop products.**

## What "tabletop" means

Expand All @@ -17,19 +17,31 @@ Countertop/shelf-visible SKUs a consumer can grip, rotate, and inspect in 3D. Ve
- **Wedge 2+** — skincare, spirits, coffee, sauces, supplements, candles, condiments, home fragrance
- **Never** — injectables, medical devices, prescription-only, cold-chain biologics

## Intake — one URL, nothing else

**The only intake is an existing web page link.** No catalog upload, no OAuth wizard, no CSV, no SKU form. Paste the URL of a product page (PDP, landing, brand homepage, Linktree). Shoploop extracts:

- The product model (geometry class + dimensions) → `product_twin.usda`
- Materials (glass, PET, HDPE, aluminum, cardboard) → PBR shader graph
- Brand rules (palette, type, logo, voice) → `brand_rules.json`
- Variant axes (size, flavor, dosage, molecule) → USD variant sets
- Existing copy in whatever language(s) the page ships

This matches the [NVIDIA OpenUSD product configurator reference architecture](https://developer.nvidia.com/blog/developing-product-configurators-with-openusd/): aggregate data → OpenUSD → variants → render → deliver. The URL is the aggregation layer; OpenUSD is the composition layer; Omniverse Kit is the delivery layer.

## What "positionless full-funnel" means

One agent, one loop, one graph — from ad impression to purchase to reorder — with no human "position" (media buyer, designer, copywriter, dev) required in the middle.

The customer connects their stack once. The agent then:
The customer pastes one URL. The agent then:

1. Reads their ad performance (Google Ads, Meta, Klaviyo)
2. Reads their site engagement (PostHog sessions, session recordings)
3. Reads their commerce (Shopify orders, ATC, checkout drop-off)
4. Mutates creatives (3D angle × molecule × material × copy × language)
1. Parses the page into a USD product twin + brand rules + variant graph
2. Reads ad performance where available (Google Ads, Meta, Klaviyo — optional connect)
3. Reads on-page engagement (PostHog auto-instrumented)
4. Mutates creatives (model × material × style × artwork × copy × language)
5. Renders (Blender + MolecularNodes + NVIDIA Omniverse + USD)
6. Publishes ads (Postiz to Meta/Google/YouTube)
7. Updates the website (GitHub PR or Shopify admin API)
7. Updates the page (GitHub PR against the page repo, or web publish API for hosted platforms)
8. Measures impact
9. Compounds the posterior nightly

Expand All @@ -45,7 +57,7 @@ The customer connects their stack once. The agent then:

| Alternative | What it does | Where it stops |
|---|---|---|
| **grip.tools** | 3D commerce for luxury (LVMH, L'Oréal) | $500k/yr enterprise, agency-installed, not self-serve, no tabletop wedge for SMB Shopify, no molecular layer |
| **grip.tools** | 3D commerce for luxury (LVMH, L'Oréal) | $500k/yr enterprise, agency-installed, not self-serve, no tabletop wedge for SMB, no molecular layer, requires asset handoff (not URL intake) |
| **Vagon.io / Innoactive** | Remote 3D streaming | Renders on their servers, no domain expertise, no ad-ops integration |
| **Threekit / Emperia** | 3D product configurators | Configurator only, no ad-ops loop, no trilingual, no molecular |
| **Postiz (upstream)** | Social scheduler | Scheduler only, no rendering, no PostHog feedback, no rendering pipeline |
Expand Down
Loading
Loading