shopflow-suite

ADR-003: Builder Integration Surface and Product Language Boundary

Context

Shopflow’s original contract already locked the repo into a shopping-only, Chrome-first 8+1 extension family with one engineering source of truth.

That solved the product-shape problem, but it left four newer questions only partially answered:

  1. Which builder-facing surfaces are already real today?
  2. Which integration surfaces are worth moving into current-scope now?
  3. How should Shopflow talk about AI, agents, API, MCP, CLI, SDK, skills, and marketplace paths without overclaiming?
  4. What language policy keeps public copy and product UI systematic instead of drifting into scattered bilingual literals?

The repo now already contains:

At the same time, the repo still does not contain:

We therefore need a formal contract that upgrades the stronger product vision without rewriting future aspirations as today-ready product truth.

Decision

1. Shopflow remains an operator runtime first

Shopflow’s category stays:

It does not become, by wording alone:

In plain language:

AI and builder integration must grow from the existing shopping runtime truth. They must not replace the repo’s real product category.

2. AI must stay inside the real workflow

Current AI-facing truth in this repo is not a floating chat panel.

Current-scope AI must remain anchored to:

That means:

3. API substrate first means machine-readable read models first

For Shopflow, API substrate first means:

It does not mean:

The substrate sequence is therefore:

  1. typed contracts and read-only runtime truth
  2. builder-facing docs, examples, and repo-local stdio MCP transport
  3. future public read-only API / HTTP MCP transport
  4. future CLI wrapper or thin SDK

4. Product language policy is now a contract, not just a copy preference

Public-facing surfaces must be:

Product UI must be:

Current repo truth may say:

Current repo truth must not say:

Hard rule:

New user-visible strings must route through shared locale catalogs. Scattered bilingual literals are contract drift.

5. Shopflow now uses five honest integration buckets

Today

Current-scope now

Later

No-go for the current stage

Owner-decision

6. Ecosystem binding is now explicit

Shopflow may use the following truthful binding matrix:

Target Placement Truthful wording now Must not claim now
Codex front-door primary example strong builder fit because Shopflow already exposes typed contracts, workflow briefs, read-only builder snapshots, and path-bounded repo surfaces official integration, official plugin, marketplace package
Claude Code front-door primary example strong builder fit for the same builder-facing reasons official integration, official plugin, shipped skills pack
OpenCode ecosystem secondary useful comparison or later-facing integration path when CLI/skills packaging becomes explicit main hero binding, official package
OpenHands ecosystem secondary useful comparison for agentic coding and automation main hero binding, official package
OpenClaw public-ready secondary public-ready install, discovery, and proof route with official-listing claims still gated by the real external surface official listing, official integration
MCP repo-local read-only stdio now; public transport later today’s runtime truth already supports a truthful stdio MCP entry over the core four surfaces, while public transport and registry publication remain later-stage work current public HTTP MCP product or write-capable MCP

Consequences

Positive

Negative

Hard Rules

  1. Do not move public API / MCP / SDK into today without fresh repo-owned evidence of those surfaces.
  2. Do not claim a broader language settings system until it actually exists beyond the minimal shell-level route toggle.
  3. Do not add new user-visible strings outside shared locale catalogs.
  4. Do not use AI wording that turns Shopflow into a generic assistant product.
  5. Do not let ecosystem/platform wording outrun adapter truth, operator truth, or verified-scope boundaries.

Required Follow-up

This ADR is only complete when the same change set also updates: