docs(web): describe the free tier and the archive we actually ship - #299
Conversation
Spark was sold as "AI Schema Extraction / Entity-Relationship Canvas /
Generated Next.js Frontend" and "Spark generates the Next.js frontend for
your described SaaS". It does none of that: tier 0 renders V0-Spark-NextJs
with {{ProjectName}} substituted and makes no LLM call at all, so every
free user gets the same nine-file task tracker. Copy now says so, and sells
what is genuinely there — an instant, always-boots run of the whole
pipeline with a real Next.js app live in the browser.
The same audit against the templates found the paid lists claiming files
the engine never emits (OpenAPI spec, ADRs and a data-flow diagram at
Blueprint; Stripe and an auth integration at Boilerplate; a GitHub Actions
pipeline and a cost report at Infrastructure) and omitting ones it does
(Terraform, build-report.json). Every bullet and comparison row is now
traceable to a rendered file; the sourcing rule is written next to the
data so the next edit has to keep it.
Docs corrected to the real V1 tree: two top-level directories, dotnet/ and
nextjs/, one .NET project rather than an Api/Core/Data solution, no auth
route groups or per-entity CRUD pages, no README in the archive, and the
Blueprint archive as its actual two files. Simple Mode's "you review the
generated schema before committing to purchase" is gone - extractSchema
has no callers, so there is no review step on that path.
No prices changed and no product code touched.
Verified: npm run lint (0), tsc --noEmit (0), vitest 308/308,
e2e:smoke 29/29 at --workers=2, next build clean.
Review — independent verification (lane: pricing-truth)Read the full diff, checked every changed claim against the code path it describes, and re-ran the web gates in a fresh worktree off Verdict: fix-needed. Two claims this PR introduces are contradicted by the code — same class of defect the PR exists to remove. Everything else checks out, and the audit is genuinely good. 🔴 1.
|
| Claim | Source |
|---|---|
| Spark = fixed template, no LLM call, no download | GenerationOrchestrator.cs:112-135,283-296 |
| Spark = nine files | V0-Spark-NextJs/ — 9 files |
| Spark runs in StackBlitz WebContainers; Chromium-only | micro-ide-embed.tsx:22,57,78,141 |
| 5 free builds / calendar month / account | 20260530000008_enforce_free_generation_quota.sql; actions.ts:236 |
| Advanced-Mode schema survives to a paid run | StripeWebhookHandler.cs:112,124,335-339 |
Blueprint = schema.json + api-docs.md, and nothing else |
Tier1ArtifactBuilder.cs:23-27 |
| Blueprint = field table + 5 REST endpoints + relationship list | Tier1ArtifactBuilder.cs:57-91 |
| Tier 2 does not include the Blueprint artifacts | GenerationOrchestrator.cs:140-160 vs 172-177 |
| No auth / no Stripe anywhere in the emitted app | Prompts/V1-generation.md (whole file); Program.cs has no AddAuthentication |
| RLS enabled, no policies | V1-generation.md:90 |
| Two top-level dirs, out-of-tree paths rejected | V1-generation.md:19-31; ReconstructionService.cs:122-137 (UnmappedLlmFileException) |
One .csproj, no solution, no README, no docker-compose.prod.yml, no GH Actions |
V1-DotNet-NextJs/ + Tier3-Infrastructure/ file lists |
/api/v1/{entity}s; OpenAPI in Development only |
V1-generation.md:212; Program.cs:46-49 |
Migrations mounted into /docker-entrypoint-initdb.d |
docker-compose.yml:15 |
Dockerfile targets web + engine; Node 24 |
Dockerfile:11,18,33,45,54 |
dotnet restore → dotnet build --no-restore; npm ci → typecheck → next build |
DotNetBuildStrategy.cs:71-78,108-148 |
build-report.json at archive root |
BuildReportWriter.cs:26,80-82 |
Tier 3 = CDK (VPC/ECS Fargate/ALB/RDS) + Terraform + Helm + DEPLOYMENT.md |
Tier3-Infrastructure/ tree; main.tf; DEPLOYMENT.md headings |
| Tier 3 files appended only at tier 3 | GenerationOrchestrator.cs:311-322 |
.env.example block quoted verbatim |
V1-DotNet-NextJs/.env.example |
| No schema-review step in Simple Mode | extractSchema has zero callers (actions.ts:399) |
No price changed — 299 / 599 / 999 identical on every surface (git diff on all price-bearing lines). No product code touched. No test file touched — git diff --name-only 54bd0854..HEAD matches nothing under test|spec|Fixtures|.csproj, so no gate was weakened.
Gates re-run independently (fresh worktree, CI=true, npm ci from lockfile)
npm run lint LINT_EXIT=0
npx tsc --noEmit TSC_EXIT=0
npx vitest run Test Files 35 passed (35) | Tests 308 passed (308) | VITEST_EXIT=0
npm run build BUILD_EXIT=0
The V1 compile gate is not the relevant gate here — the diff touches no engine, template, or fixture file.
The FAQ answer to "Do I need an account to try it?" claimed a signed-out visitor can model a schema in the Advanced Mode wizard. middleware.ts lists /simple, /advanced and /generate as protected prefixes and redirects signed-out visitors to /login, so neither build mode is reachable without an account. Rewritten to say what is actually public. getting-started step 5 said "up to 3 attempts total". MaxRetries = 3 and the worker loops while RetryCount <= MaxRetries, so the ceiling is four build attempts, and CompileWorkerRetryTests asserts exactly that. Every sibling doc counts retries; restored the retry wording.
Whitespace only. The pricing-tiers entry indented `answer:` six spaces where every sibling uses four.
|
Both criticals from the review are fixed on this branch ( Critical 1 — faq.md, the account claim. Re-verified before changing it:
The correct half (account required to start a build, 5 per calendar month) is preserved verbatim. Grepped the rest of the tree for the retired phrasing — it appeared only in Critical 2 — getting-started.md step 5. Reverted to the base wording, Nit (b) — Gates re-run on the fixed tree (fresh worktree at Not merged; PR left OPEN. Still open, not addressed here (reported as non-blocking in the review, left for the owner's call): the retired claims surviving on |
Review — round 2 (re-review at
|
| Claim | Source |
|---|---|
| Spark = fixed template, zero LLM call | GenerationOrchestrator.cs:112-135, RenderTier0Preview at :292-296 |
| Spark = nine files, a todo/task tracker | src/StackAlchemist.Templates/V0-Spark-NextJs/ (9 files, app/api/todos/…) |
| "a real Next.js 15 app" | V0-Spark-NextJs/package.json — next 15.5.21, React 19, app/ router |
| StackBlitz WebContainers, Chromium-only | components/micro-ide-embed.tsx:53-79, :141 |
| "read it, edit it, re-run it" | micro-ide-embed.tsx:64 view: "default" (editor + live preview), no read-only flag |
| Advanced-Mode schema saved on the build, buyable later | actions.ts:507-522 inserts schema_json: schema at tier 0; StripeWebhookHandler.cs:113-127 re-enqueues that same row's schema on checkout |
Blueprint = schema.json + api-docs.md, nothing else |
Tier1ArtifactBuilder.cs:23-27; fields/keys/nullability/default at :63-68; 5 endpoints at :74-78; relationships at :82-91 |
Blueprint has no build-report.json |
CompileWorkerService.cs:86-98 — the Packing branch skips the build entirely |
Boilerplate .NET shape (records + DTO, Dapper repos, {Entity}Endpoints.cs, MapGroup) |
Prompts/V1-generation.md:59-81, few-shot :131-233; mirrored in PromptBuilderService.cs:224-243 |
| Migration: uuid-ossp, UUID PKs, FKs, RLS enabled | V1-generation.md:85-90, :240-251 |
/api/v1/{entity}s, /openapi/v1.json in Development |
V1-generation.md:212; Program.cs MapOpenApi() inside IsDevelopment() |
| Two top-level dirs, paths outside them rejected | V1-generation.md:19-31, PromptBuilderService.cs:211-214 |
Docker Compose + multi-stage Dockerfile, web/engine targets, Node 24 |
V1-DotNet-NextJs/Dockerfile (node:24-alpine, aspnet:10.0), docker-compose.yml |
| Migrations mounted into the Postgres init hook | docker-compose.yml — ./dotnet/Migrations:/docker-entrypoint-initdb.d:ro |
.env.example block quoted in your-output.md |
matches V1-DotNet-NextJs/.env.example verbatim |
| Compile Guarantee commands | DotNetBuildStrategy.cs:72,78 (dotnet restore, build --no-restore), :108-113 (npm ci), :131-138 (npm run typecheck), :146-148 (npm run build) |
build-report.json = command + exit code + per-half verdict |
Models/BuildReport.cs — BuildStepReport.Command/ExitCode, BuildHalfSummary.Status |
Tier 3 = CDK (VPC/ECS Fargate/ALB/RDS) + Terraform + Helm + DEPLOYMENT.md; no CI/CD, no cost report |
Tier3-Infrastructure/infra/cdk/lib/…-stack.ts:14,19,33,58; infra/terraform/main.tf (VPC/ECS/ALB/RDS/log group); infra/helm/templates/{deployment,service,ingress,hpa,configmap,secrets}.yaml; DEPLOYMENT.md §Preflight/CDK/Terraform/Helm/Rollback. No .github/workflows and no cost report anywhere in the tree. |
No README.md, no solution file, no docker-compose.prod.yml in the archive |
full file listing of V1-DotNet-NextJs/ + Tier3-Infrastructure/ |
| "no schema-review step in Simple Mode" | extractSchema (actions.ts:399) has zero call sites in src/ |
| Simple Mode paid run reads the prose directly | GenerationOrchestrator.cs:466-472 (BuildUserPrompt) + :440-460 (falls back to V1-generation.md with {} when Schema is null) |
| Simple Mode always starts a free Spark build | SimpleModePage.tsx:75 — submitSimpleGeneration(prompt, 0) |
No price changed — $299 / $599 / $999 are byte-identical everywhere in the diff, and no price literal exists outside copy.
No gate weakened — git diff main…HEAD --stat -- src/StackAlchemist.Engine.Tests src/StackAlchemist.Templates .github is empty. Docs + web copy only.
Gates I re-ran (CI=true, fresh worktree, npm ci)
npm run lint LINT_EXIT=0 (eslint --max-warnings 0)
npx tsc --noEmit TSC_EXIT=0
npx vitest run Test Files 35 passed (35) / Tests 308 passed (308) VITEST_EXIT=0
npm run build BUILD_EXIT=0
e2e:smoke not re-run here; instead I grepped e2e/ and __tests__/ for every string this PR removed (view-only, Live Preview, AI Schema Extraction, Try Before You Buy, Free Preview, Architecture is Ready, Designing your data model, Entity-Relationship Canvas, OpenAPI 3.0, Stripe Payments) — the only hit is a test title at e2e/smoke/simple-mode-flow.spec.ts:4, no assertion. The claim that no spec needed changing holds.
One thing to fix before merge
/about still ships the two claims this PR just deleted from /pricing as false.
src/StackAlchemist.Web/src/app/about/page.tsx:238
"Row Level Security policies scaffolded for your entities. Auth flows wired into the frontend. Ready for production the moment you deploy."
src/StackAlchemist.Web/src/app/about/page.tsx:248
"Lambda, RDS, S3, CloudFront — all as TypeScript infrastructure code."
Both are checkably false against the same sources this PR used. No auth code is generated anywhere (V1-generation.md §Required Output emits Models/Repositories/Endpoints/migration/types/api.ts/page.tsx and nothing else; no [Authorize], no JWT config in Program.cs, no login route). The migration enables RLS with no policies (V1-generation.md:90). The CDK stack is VPC + ECS Fargate behind an ALB + RDS PostgreSQL (…-stack.ts:19,33,58) — there is no Lambda, no S3 and no CloudFront construct in the tree.
/about is a live public route, and after this PR the two pages contradict each other on a $599 purchase input: /pricing now says "Supabase client and env wiring preinstalled (auth flows are yours to write)" while /about says "Auth flows wired into the frontend." That's exactly the failure mode the PR's own new comment in components/home/pricing-section.tsx:4-6 warns about — "the two pages disagreeing is how a false one survives." Not introduced here, but it's the same surface, the same claim, and a two-line fix; leaving it means the sweep landed on the pricing page rather than on the site.
(docs/user/user-guide.md:23 carries the same "Supabase auth integration" claim, but it is not in docs-manifest.ts, so it isn't published — worth the same edit, lower priority.)
Nits, not blocking
api-docs.mdisn't quite stack-neutral./pricingbullet "Stack-agnostic — nothing in it assumes .NET or Next.js", but the generated file's own preamble reads "upgrade to Tier 2 (Boilerplate) for the generated.NET/Reactcodebase" (Tier1ArtifactBuilder.cs:36-37). The contract is stack-neutral; the upsell paragraph inside it isn't. Either soften the bullet or drop the stack names from the preamble.your-output.mdarchive tree omits two real files —nextjs/package-lock.json(theDockerfilecopies it) andnextjs/public/.gitkeep— while asserting "the layout above is the whole of it." Same class of imprecision the PR is fixing, just tiny.npm cihas a documented fallback. Docs say the loop runsnpm ci;DotNetBuildStrategy.cs:112-127falls back tonpm installwhen the LLM added a dependency and the lockfile disagrees. Not worth a docs paragraph, but "npm ci" isn't the whole truth.- Simple Mode + Blueprint — agreed with the PR body:
schema_json: null(actions.ts:337) reachingTier1ArtifactBuilder.Build(null, …)yields an emptyschema.jsonand "No entities are defined in this schema." for $299. Product bug, correctly out of scope. Worth an issue before Blueprint gets any traffic from/simple.
Everything else in the diff checks out. Fix /about and this is good to go.
/about carried the two claims this branch deletes from /pricing as false, on a live public route. Verified against the same sources: - "Row Level Security policies scaffolded ... Auth flows wired into the frontend" — the generation prompt emits only models, repositories, endpoints, the migration, types, api.ts and page.tsx. There is no [Authorize], no JWT configuration in the template Program.cs and no login route; the migration runs ENABLE ROW LEVEL SECURITY with no CREATE POLICY. The Supabase client and its env slots are preinstalled and nothing more. - "Lambda, RDS, S3, CloudFront" — the CDK stack is VPC + ECS Fargate behind an ALB + RDS PostgreSQL. No Lambda, S3 or CloudFront construct exists anywhere in the Tier 3 tree. Three neighbours in the same six-item list failed the same check and are corrected with them: the backend is a Dapper/Npgsql minimal API, not controllers with model validation and Entity Framework-ready data access; the migration emits no indexes; and .env.example says to copy and fill it before running, so "no config required" was wrong. Also fixes docs/user/user-guide.md, which is unpublished (absent from docs-manifest.ts) but described a Tier 3 tree that does not exist — bin/app.ts, database-stack.ts, api-stack.ts, frontend-stack.ts, auth-stack.ts and a .github/workflows pair, none of which ship. Replaced with the real cdk/terraform/helm layout. Adds a sourcing note above the list so the next edit keeps /about and /pricing in substance identical.
|
Round-2 critical fixed in d20a4fa.
Both rows now read the same as the Three neighbours in the same six-item list failed the same check, so I corrected them rather than leave known-false copy beside the two I was fixing:
Also fixed GatesNo gate weakened — Ran locally with Grepped the prerendered One note for the record: All 14 checks green on d20a4fa. Leaving this open and unmerged for you. |
Review round 3 —
|
| Claim | Source |
|---|---|
| Spark = fixed template, no LLM call | GenerationOrchestrator.cs:113-134 — "NO LLM call", returns before the codegen path |
| …nine files, task tracker | Templates/V0-Spark-NextJs/ — 9 files, app/api/todos/, _data/store.ts |
| …runs in StackBlitz WebContainers, editable | micro-ide-embed.tsx:53-77 — template: "node", view: "default", crossOriginIsolated: true; no read-only flag |
| 5 builds / calendar month, no card | lib/actions.ts:236 FREE_TIER_MONTHLY_LIMIT = 5; enforced at :323 and :499 |
| Advanced-Mode schema survives a free build | actions.ts:516 inserts schema_json: schema at tier 0; upgrade reuses the same row id (upgrade-modal.tsx:19-26) and StripeWebhookHandler.cs:336 reads schema_json back off it — so "come back and buy a paid run against it" holds |
Blueprint = schema.json + api-docs.md, nothing else |
Tier1ArtifactBuilder.cs:19-28 — the dictionary has exactly two keys |
| Tier 2 does not ship the Blueprint files | GenerationOrchestrator.cs:159-176 — the tier-1 branch returns early; the ≥2 path never calls Tier1ArtifactBuilder. The bb: false / infra: false on "Schema + API contract documents" is correct |
Boilerplate = record + DTO, I…Repository + Dapper impl, …Endpoints.cs per entity |
V1-generation.md:61-73 |
| Migration: UUID keys, FKs, RLS enabled | V1-generation.md:85-91 + example :240-251 |
Docker Compose + multi-stage Dockerfile, web and engine targets |
Dockerfile:33,54 (AS web, AS engine); docker-compose.yml builds target: engine / target: web |
| Supabase client + env wiring preinstalled, no auth | nextjs/package.json has @supabase/supabase-js ^2.49.4; next.config.ts:14-15 + compose pass the env through; zero supabase references under nextjs/src/ |
build-report.json in the archive |
BuildReportWriter.cs:26 FileName = "build-report.json" |
Compile Guarantee = dotnet restore → build --no-restore, npm ci → typecheck → next build |
DotNetBuildStrategy.cs:72,78,108,131-137 |
Tier 3 = CDK (VPC/ECS Fargate/ALB/RDS) + Terraform + Helm + DEPLOYMENT.md |
{{ProjectNameKebab}}-stack.ts:19,33,50,58; infra/terraform/{main,variables,outputs}.tf; infra/helm/templates/{deployment,service,ingress,hpa,configmap,secrets}.yaml |
| No Lambda / S3 / CloudFront anywhere in Tier 3 | grep -riE "lambda|cloudfront|aws-s3|s3\." Tier3-Infrastructure/ → 0 hits |
| FAQ: "both build modes are gated" | middleware.ts:12 — ["/simple", "/advanced", "/generate"] |
| Docs: two top-level source dirs, prompt rejects paths outside them | V1-generation.md:30-31 — "Every file path you emit MUST begin with dotnet/ or nextjs/" |
Docs: /api/v1/{entity}s, OpenAPI at /openapi/v1.json in Development |
V1-generation.md:212; Program.cs MapOpenApi() inside IsDevelopment() |
Docs: tables lowercase plural, columns snake_case, Guid ↔ string |
V1-generation.md:243-251 (CREATE TABLE products, created_at) vs :252-258 (id: string) |
No price changed. $299 / $599 / $999 appear on both sides of every hunk that touches them; the only pricing-table delta is a new Free column for Tier 0.
No gate weakened. git diff 54bd0854...HEAD --stat -- src/StackAlchemist.Engine.Tests src/StackAlchemist.Templates src/StackAlchemist.Engine .github → empty. Docs + web copy only.
Gates I re-ran
npm ci 0 vulnerabilities
npm run lint LINT_EXIT=0 (eslint --max-warnings 0)
npx tsc --noEmit TSC_EXIT=0
npx vitest run Test Files 35 passed (35) / Tests 308 passed (308) VITEST_EXIT=0
npm run build BUILD_EXIT=0
V1TemplateCompileTests deliberately not re-run: the diff provably touches no Engine, Template or workflow file, so it cannot move that gate. All 14 checks are green on d20a4fa1.
One finding — not blocking this PR, but open an issue
The two claims you deleted as false are still live on ~20 other public pages. /pricing no longer sells "Supabase Auth Integration" or "Stripe Payments Integration"; /compare/* and /solutions/* still do, in winsForUs bullets and indexed meta descriptions:
src/StackAlchemist.Web/src/lib/compare-manifest.ts:48— "Supabase + Stripe + Postgres wired by default"src/StackAlchemist.Web/src/lib/compare-manifest.ts:89— "Compile-gated output: frontend + backend + DB + auth + Stripe"src/StackAlchemist.Web/src/lib/compare-manifest.ts:153— "Backend + DB schema + auth + Stripe in one generation, not bolted on"src/StackAlchemist.Web/src/lib/solutions-manifest.ts:20,46,72,123,279…— "…with Stripe, auth, and inventory in 12 minutes. Verified build."- plus ~20 files under
content/{compare,solutions,blog,press}/carrying the same class
The build output confirms these are real routes (● /solutions/[vertical], 18 prerendered paths). Same failure mode as the /about row, but this is a 20-file sweep across SEO-indexed marketing copy, not a two-line fix — it belongs in its own PR with its own read of the templates. Blocking a correct copy fix on it would just make the honest page hostage to the dishonest ones. Please open the tracking issue before merging so the sweep doesn't die with this branch.
Carried-over nits, still open (fine to leave)
api-docs.mdisn't quite stack-neutral./pricingsays "Stack-agnostic — nothing in it assumes .NET or Next.js" (pricing/page.tsx:69), but the generated file's preamble names them (Tier1ArtifactBuilder.cs:36-37). The contract is neutral; the upsell paragraph inside it isn't.your-output.mdtree omitsnextjs/package-lock.jsonandnextjs/public/.gitkeepwhile asserting "the layout above is the whole of it" — and the lockfile matters, since the same doc tells the reader to runnpm ci. Same class the PR is fixing, just tiny. (infra/also being top-level at Tier 3 slightly bends "exactly two top-level source directories".)npm cihas a documented fallback.DotNetBuildStrategy.cs:104-126falls back tonpm installwhen the LLM adds a dependency — the code comment calls it "the DOCUMENTED common path", so a buyer reading "npm ci" in the docs may findnpm installin theirbuild-report.json.getting-started.mdStep 4 now narrates the tier-2/3 pipeline with a Spark caveat but no Blueprint one — a Blueprint buyer reads steps 3-5 (restore/build/retry) that never run for them.- "Chromium-based browsers only" (
tiers-and-pricing.md:34,getting-started.md:80) mirrors the app's own error string atmicro-ide-embed.tsx:141, so it's internally consistent — but WebContainers also run on Firefox and Safari 16.4+, so both the docs and that string are probably understating support.
Approving. Leaving it to you to merge.
Why
/pricingsold Spark as "Entity-Relationship Canvas / AI Schema Extraction / Generated Next.js Frontend", and the FAQ said "Spark generates the Next.js frontend for your described SaaS."What tier 0 actually does (
GenerationOrchestrator.RenderTier0Preview, L283-296):Every free user gets the same nine-file todo app with
{{ProjectName}}swapped in. Zero AI calls, no.NEThalf, no download. The copy was selling a generation that does not happen.Auditing the rest of the page against the templates turned up the same class of problem on the paid cards, so this PR makes every bullet traceable to a rendered file.
What changed — free tier
Spark is now sold as what it is and what it is good for: an instant, always-boots lap of the whole pipeline with a real Next.js 15 app live in the browser, five a month, no card. The card, the hero, the banner, the tier chooser and the delivery-page header all state plainly that the demo app is fixed and not built from your description.
Also corrected on the way through:
/simplemetadata promised "StackAlchemist extracts the schema and hands back a compiled .NET + Next.js repo" on the page that runs a free Spark build.SchemaFallbackView's upgrade CTA offered "the full source code — compiled, tested" for Blueprint, which is documents, and nothing anywhere is tested.What changed — paid tiers
Claims the engine never emits, removed:
Tier1ArtifactBuilderemitsschema.json+api-docs.md. That is the whole tier.Tier1ArtifactBuilder— those two files are not in the archive.Program.cs, no auth pages, RLS enabled with no policies. The client lib and env slots ship; the wiring does not.Tier3-Infrastructure.Real deliverables that were going unsold — the Terraform baseline,
build-report.json, the RLS-enabled migration, both Dockerfile targets — are now listed. The Compile Guarantee text matches what the gate verifies: both halves,dotnet restore/buildandnpm ci→typecheck→next build, with the report in the archive.No price changed. No product code touched.
Docs
your-output.mddocumented an archive that does not exist —api/YourProject.Api+YourProject.Core+YourProject.Data, aweb/frontend with(auth)and(dashboard)route groups and per-entity CRUD pages, a rootREADME.md. The real tree is two directories,dotnet/andnextjs/, one .NET project, and a frontend ofpage.tsx+lib/api.ts+types/index.ts. Rewritten from the rendered template and the golden fixture, including a "not in the archive" note so the absences are stated rather than discovered.getting-started.mdpromised aREADME.mdin every package and a schema review before purchase;simple-mode.mdhad "You review the generated schema before committing to purchase" as step 4.extractSchemahas no callers — there is no review step on that path. Both corrected, andtiers-and-pricing.md/faq.mdbrought in line so the docs do not contradict the page.Verification
The smoke suite flakes on this box at default worker count (13 failures on one run, 2 on another, across specs this PR does not touch —
seo-content-routes,robots.txt,sitemap.xml); at--workers=2, which is what CI uses (workers: 1), it is green. No e2e assertion referenced the old copy, so no spec needed changing.Two things worth a decision, not fixed here
submitSimpleGenerationinsertsschema_json: nullandextractSchemais never called, so a Simple-Mode tier-1 purchase reachesTier1ArtifactBuilder.Build(null, …)→schema.jsonof an empty schema and anapi-docs.mdreading "No entities are defined in this schema." That is $299 for two empty documents. Product bug, out of scope for a copy PR — worth an issue.