adr: 0017 Law 2 (cost is telemetry) + 0018 catalog-scale content factory - #62
Merged
ninan-versioning merged 4 commits intoJul 29, 2026
Merged
Conversation
Product quality defines architecture; cost is telemetry, not a constraint. ADR 0017 reopens the locked $299/mo Managed price and deliberately does not replace it with another number — Managed pricing is set only after measured production unit economics plus stated reliability and support requirements, in a new ADR citing those figures. $0 OSS self-host stays locked. Cost governance is retained and tightened, not relaxed: every PR still states a monthly delta, >=$50/mo still triggers an ADR (now a disclosure gate rather than an affordability veto), runtime spend is attributed per tenant/run/asset, and budget alarms notify without ever auto-degrading a capability. ADR 0018 makes the catalog-scale content factory the target demonstration: one brand website URL in, same-domain PDP discovery, >=10 accepted tabletop SKUs in Pimcore with brand_rules and product_rules, one real OpenUSD twin per accepted SKU, and >=250 assets out across 5 compositions x 5 aspect ratios (9:16, 1:1, 16:9, 3:4, 4:5) from shared twins and manifests. The sole routine human step is a Pimcore object workflow on the record. Phase 1 is reframed as the plumbing gate; Phase 4 narrows to the operator frontend. No new repo, service, framework, frontend surface, or placeholder renderer. No fidelity gate relaxed. Catalog-scale GPU and render figures are marked benchmark-required rather than estimated. Cost: $0/mo delta (documentation and copy only). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Law 2 was asserted in ADR 0017 but contradicted in the docs that implement it, and the ADR 0018 landing pass left the customer-facing copy describing the pre-catalog intake model. This makes the contract self-consistent. - LOOP_SPEC Loop 4: usdchecker + OpenPBR >=0.85 become hard constraints, cost leaves the fitness function entirely and becomes a tie-breaker among candidates that already passed. The $50/day/customer hard-stop becomes alert-and-escalate; Loop 5's customer-owned ad-spend cap is kept and labelled as the customer's budget, not a Shoploop limiter. - ADR 0018 + BUILD_ORDER no longer revive ADR 0010's superseded >2% clipping and dpi_effective <220 thresholds. HITL routes on the live ADR 0012 contract; any numeric tolerance goes on BrandRulesAPI via its own ADR. - The "two links out" quantifier is stated as amended rather than asserted unchanged: two entry links per tenant, one Pimcore catalog graph with one object per accepted SKU. - Supersession made symmetric across ADRs 0009/0014/0016 with the treatment differing by kind, and ADR 0016's $10k/mo tier removed as an invented price rather than historicised as a real one. - One Phase 1 acceptance contract in both BUILD_ORDER and MILESTONES: a live Kit stream. The Cycles bake stays as required spot-preemption evidence, not a second way to close the gate. v0.2 and the commercial target are marked contingent rather than dated behind an undated upstream. - demo-tenants/ashwagandha stated as required acceptance work in all three places, because it is not in the tree. - Landing intake copy, llms.txt and a2ui.json moved to the catalog model, brand_rules.json dropped for BrandRulesAPI across the active docs, and hi/mr marked deferred wherever it still read as shipped.
The prior pass updated the marketing surfaces but left the gates that actually reject future PRs — the PR template, CONTRIBUTING, and .cursor/rules/00-laws.mdc — still requiring single-product intake, so the next PR would have been failed for doing what ADR 0018 legalises. Also removes two claims this repo cannot back: that the ashwagandha fixture resolves today (it is unauthored), and that BrandRulesAPI carries a safe-area assertion (ADR 0012 defines none and packages/brand-rules has no schema.usda). The safe area joins the label-projection tolerances already deferred to one future ADR. ADR 0011 gains an "Amended by ADR 0012" marker and a struck line rather than a silent rewrite, so the superseded artifact shape stays legible. The surviving brand_rules.json references in connector scaffolding are recorded as known debt in BUILD_ORDER against ADR 0012, scheduled with Phase 1 step 4, so they cannot be mistaken for the contract. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The prior commit added "these two files must agree" to 00-laws.mdc:64 and shipped it violated: shoploop.mdc:31 still led with "Any product web page URL", the phrasing AGENTS.md:174 retires in the same commit, and omitted the brand-owned-domain scope that every other enforced surface now carries. Since ADR 0018 widens discovery across a whole domain, that scope is the load-bearing half of the clause. Lead clause only. The rest of the bullet is unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ninan-versioning
deleted the
adr/0017-0018-cost-telemetry-catalog-factory
branch
July 29, 2026 01:00
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What lands
Two new ADRs and the contract updates they force: the
$299/moManaged price is reopened and not replaced, and the catalog-scale content factory becomes the target demonstration.Decision summary
ADR 0017 — Product quality defines architecture; cost is telemetry (Law 2)
$0OSS self-host is unchanged and still locked.$299/moManaged price is reopened and deliberately not replaced with another number. It is set only after (a) measured production unit economics, (b) stated reliability requirements, (c) stated support requirements — in a new ADR citing those figures. Until then no Shoploop surface states a Managed price.$/motarget. If the economics do not work, the price changes; the product does not. Fidelity gates (usdchecker, OpenPBR ≥0.85) are never relaxed to reduce render cost.$99/enterprise tiers rejected — those were rejected on licence, architecture and Law 0 grounds, not affordability.ADR 0018 — The catalog-scale content factory is the target demonstration
discoverCatalog(url) → product_url[]resolvessitemap.xml→ JSON-LDItemList(with pagination) → DOM product anchors →NO_PRODUCT_FOUND. Still exactly one URL in. Same-domain only,robots.txthonoured, rate-limited, authorized domains only.product_rules(regulated claims, disclaimers, prohibited wording, jurisdictional flags, age gating) live as a Pimcore Classification Store group with Data Quality rules — writing aproduct_rules.schema.jsonwould be a Law 0 violation and is forbidden.brand_rulesorproduct_rulesregenerates every dependent asset..usdascene layer with the product slot as a reference; aspect ratio is an output parameter with a declared safe area. No "Template Engine" (ADR 0013), no interactive canvas (ADR 0009).usdcheckerand OpenPBR ≥0.85 apply to every one of the 250+ assets.Superseded / amended contracts
Nothing is silently contradicted. Every conflict is resolved by supersession metadata.
OFF_DOMAIN_PRODUCT_LINK,UNSUPPORTED_INTAKE,intake_url/product_url/resolverrecorded. First-product-wins is retained as the hero-SKU and ordering tie-break rule. Adiscoveryfield is added.$299/mofigures as the record of their moment; Polotno and canvas editors were rejected on licence and architecture, and stay rejected under Law 2.AGENTS.md§Locked model, §Non-negotiables, decision gate Q6$299bullet rewritten; Law 2 section added; catalog discovery added to the one-URL bullet; two new non-negotiables; Q6 reframed as telemetry.docs/BUILD_ORDER.md#52–#57unchanged.MILESTONES.mdCOSTS.md,POSITIONING.md,README.md,LOOP_SPEC.md, competitive docs, landing copy,.cursor/rules/, PR template,CONTRIBUTING.md,docs/decisions/README.mdOld ADR text is preserved. Only status/supersession metadata was added to 0009, 0011 and 0013 — no historical reasoning was rewritten.
Acceptance target
Phase 2 acceptance evidence, per ADR 0018 and
docs/BUILD_ORDER.md:resolver/discoveryper SKUusdchecker+ fidelity score per twin, all ≥0.85(twin@SdfLayer hash, scene-layer@version, rule-set@version, renderer@version, seed)brand_rulesand oneproduct_rulesvalue, show every dependent asset regenerated, with count and wall-clockCost
$0/modelta. This PR is documentation, contract and marketing-copy only; it adds no service, no dependency and no runtime.Catalog-scale GPU and render figures are
benchmark-required/TBD, not estimated —COSTS.mdgains a "Benchmark required" table (GPU-min per twin,$/twin, GPU-min per composition,$/aspect-ratio output, total$/run, steady-state$/mo/tenant, cache hit rate) at 10 and 50 SKUs. Fabricating those numbers would corrupt the unit economics ADR 0017 requires before a Managed price is set.Known baselines are preserved with scope now explicitly labelled, which resolves a pre-existing ambiguity in
COSTS.md: today ~$2/mo; Phase 1 plumbing gate ~$202/mo (Pimcore 55 + Temporal 40 + GPU 90 + S3/CloudFront 15); fuller reference deployment ~$325/mo (adds PostHog 70 + Postiz 35 + Nango 20, all Phase 5 lines). One GPU line —g5.xlargespot — unchanged.ADRs touched
Adds 0017, 0018. Amends 0011 (metadata), 0013 (metadata), 0009 (historical note only). Does not reopen 0001, 0003, 0004, 0005, 0006, 0008, 0012, 0014, 0015, 0016.
Test evidence
pnpm -r --if-present run typecheckapps/landing,packages/connector-shopify,packages/connector-google-adspnpm -r --if-present run testbash scripts/check-horizontal-invariant.shapps/landing/public/.well-known/a2ui.json$299claimsscrape/crawl(per.cursor/rules/00-laws.mdc)fetch/discovery; no violations introducedPartner-neutrality statement
No partner-specific material is included in this PR. A repo-wide case-insensitive grep for the design partner's name returns zero results. No partner or prospect brand name, domain, contact, logo, commercial term, or IP appears in any file, fixture, commit message or copy string. All examples are generic, and ADR 0018 adds a binding neutrality section plus an
AGENTS.md§Dogfood amendment restricting catalog discovery to the brand-neutralashwagandha.shoploop.studioreference tenant or the founder's own DTC brand — never a partner's or prospect's domain.Non-negotiables touched
BrandRulesAPIandproduct_rulesproduct_rulesis a Pimcore Classification Store group; the HITL gate is a Pimcore object workflow; identity staysSdfLayer+ Ar 2.0New component?
None. Pimcore,
pimcore-sdk,page-parser,usd-runtime,brand-rules, Kit-App-Template, OVAS, Temporal,usd-content-agents, Deadline Cloud and S3/CloudFront are all already adopted.Unresolved contradictions (pre-existing, not introduced here)
Flagged rather than silently fixed — each predates this branch and needs its own decision:
MILESTONES.mdv0.1 item 4 vsdocs/BUILD_ORDER.mdPhase 1. MILESTONES accepts "either a Kit-streamed twin or a Blender/Cycles still + baked MP4"; BUILD_ORDER Phase 1 acceptance requires a KitRTX Readylog and a live stream URL. Both were last dated 2026-07-27. BUILD_ORDER is the stricter and more recent statement of the gate.POSITIONING.md"trilingual" vs ADR 0008. Two comparison-table cells still advertise trilingual as a differentiator while §Languages correctly states English-only at v0.apps/landing/public/llms.txtvs ADR 0008. Still claims "Hindi (हिन्दी), English, Marathi (मराठी) day one", andapps/landing/app/layout.tsxJSON-LD still declaresinLanguage: ['en','hi','mr'].Items 2 and 3 are ADR 0008 copy debt outside this PR's scope; item 1 is a v0.1 acceptance question for PA.
🤖 Generated with Claude Code