Upload and preview
Screen 1 of 2[clickable mockup goes here]
Drop zone, template download, parse progress, then the first rows with a flagged count.
One paragraph from a founder goes in. Before any agent writes code, Nebula Swarm turns it into a PRD, architecture and UX constraints, a list of decisions only you can make, and a ticket plan in dependency order. This is that output for one realistic feature, trimmed to fit a page.
Sample The company, the feature and every number on this page are made up to show the format. This is not a customer's document.
"Our bigger customers keep emailing us spreadsheets of orders and support types them in by hand. Let them upload a CSV instead, up to about 2,000 orders. They should see a preview first, with anything wrong clearly flagged, and only the rows they approve should turn into orders. And please make sure we don't end up with duplicate order numbers. That's the thing support complains about most."
That's the whole input. Everything below was produced from it, plus answers to the questions in Open Decisions, below.
Nebula Swarm makes clickable mockups and a small design system first, so you approve what the customer sees before the PRD is written. On the real download these are live screens.
Screen 1 of 2[clickable mockup goes here]
Drop zone, template download, parse progress, then the first rows with a flagged count.
Screen 2 of 2[clickable mockup goes here]
Filter to flagged rows, reasons in plain words, a duplicate badge, one approve action and a downloadable error file.
Written by the product-manager agent in the harness's fixed section order, then merged from several drafts written from different angles (pragmatic, user-first, ambitious) into one gold version.
<!-- { "artifact_type": "prd", "stage": "requirements", "agent_type": "ProductManager",
"run_id": "2026.10.09-10.14.02-prd", "status": "complete", "lens": "gold" } -->
Customers with more than about 50 orders a day send spreadsheets to support, who type each order in by hand. It takes about 45 minutes per 500 orders, causes typos in addresses, and creates duplicate orders when the same sheet is sent twice. The biggest accounts are the ones feeling it most.
To load 500 orders, from upload to committed. Today it's about 45 minutes of support time.
import_started → batch_committed, p75Duplicate orders created through import in the first 90 days.
orders with same tenant + order_noOf import batches committed without a support ticket about that batch.
batches vs. tickets tagged "import"| Area | Target |
|---|---|
| Performance | Preview of 2,000 rows ready in under 10 s (p95). Commit of 2,000 rows in under 60 s. |
| Reliability | Commit is idempotent and resumable. No half-created orders. |
| Privacy | Files hold customer addresses: tenant-isolated storage, raw file deleted after 7 days, no addresses in logs. |
| Security | File type checked by content, not just extension. Error CSV is escaped against spreadsheet formula injection. |
| Accessibility | WCAG 2.2 AA. The preview table can be used with the keyboard and a screen reader. |
| Cost | No new paid services. Background work runs on the existing job queue. |
import_started · preview_ready (rows, flagged, ms) · rows_deselected · batch_committed (created, skipped, ms) · error_csv_downloaded
Harness artifact: reduce/backlog_gold_v2.md · traceability matrix maps every sentence of the request to R1–R10
The architect and UX agents write these, and they're attached to the backlog before it's split into tickets. Shortened here.
reduce/architecture_gold.md
reduce/ux_spec_gold.md
Agents shouldn't guess at product calls. Nebula Swarm challenges the plan, lists what's still open, and gives each question options and a recommendation. Nothing gets built until you answer. Most take a minute.
The founder's top worry. It affects R5, R7 and the support load.
Why A: it can't damage live orders, and updating orders is a separate feature.
Sets the shape of the approve step.
Why A: it matches the request ("only the rows they approve") and avoids a 2,000-row file being blocked by one typo.
Sets the architecture and the "importing" screen.
Why B: 2,000 rows can outlast a web request timeout, and a job can resume after a crash.
The request said "about 2,000".
Why A: one number to test and to explain. Revisit with usage data after 30 days.
Decides whether R10 is in this release.
Why A: saves two tickets now. Mapping becomes R10 if error files show header mismatches.
The file contains customer addresses.
Why B: support can still help with "what did I upload?" without keeping addresses longer than needed.
Your answers are written back into the PRD and the ticket specs, with the date, so the agents read the decision, not a guess. Harness artifact: Open Decisions (not decided here, recommendation given, you decide) in each task spec.
The dev-manager agent splits the PRD into small tickets, each with its own acceptance criteria and dependencies, and orders them so as many as possible run at once. The shared contract comes first, so the API, backend and screens can be built in parallel against it.
Scroll sideways to see the whole plan →
Scroll the table sideways →
| ID | Ticket | Size | Depends on | Lane · wave | Covers |
|---|---|---|---|---|---|
| T001 (critical path) | Import contract and data modelBatch and row tables, API shapes, fixtures for the UI to build against | S | None | Shared · 0 | R1–R9 |
| T002 (critical path) | CSV parser and row validatorStreaming parse, template headers and aliases, manual-entry rules reused | M | T001 | Backend · 1 | R1 R3 |
| T003 | Upload and preview APISize, row and type limits on the server; progress polling | M | T001 | API · 1 | R1 R2 R4 |
| T005 | Upload and preview screenDrop zone, template link, progress, first rows; built against T001 fixtures | M | T001 | UI · 1 | R1 R2 R4 |
| T008 | Import history and telemetrySupport view of batches; the five events in the PRD | S | T001 | Ops · 1 | R9 |
| T004 (critical path) | Duplicate order-number detectionAgainst existing orders and within the file (D1) | S | T002 | Backend · 2 | R5 |
| T007 | Flagged-row review and approveFilter, reasons, selection rules, virtualized table, keyboard path | M | T003 T005 | UI · 2 | R4 R6 |
| T006 (critical path) | Commit jobIdempotent, resumable, re-checks duplicates at commit; result and error CSV | M | T003 T004 | Backend · 3 | R6 R7 R8 |
| T009 (critical path) | End-to-end test with a 2,000-row fileHappy path, flagged rows, crash mid-commit, performance budget | S | T006 T007 T008 | Shared · 4 | All |
| T010 (critical path) | Feature flag and rolloutOff by default; on for three pilot customers, then everyone | XS | T009 | Shared · 5 | - |
Ember dot = on the critical path. Each ticket becomes a Jira issue (or a local task file) with sections for description, user value, scope, acceptance criteria, technical notes and open decisions, and an implementation checklist. Harness artifacts: reduce/tasks_gold.json, task_dag.md, final/tasks/T*.md.
The tester agent maps each acceptance criterion to a named test. A ticket isn't done until its tests pass and the reviewer has seen them.
Scroll the table sideways →
| Req | What's proven | Tests | Type | Ticket |
|---|---|---|---|---|
| R1 | Limits are enforced on the server | rejects_2001_rows · rejects_over_5mb · rejects_renamed_xlsx | Unit, API | T002 T003 |
| R2 | Template round-trips | template_parses_clean | Unit | T003 |
| R3 | Each rule gives row, column and fix | validator_rules_table (14 cases) | Unit | T002 |
| R4 | Flags are visible and filterable without color | preview_flagged_filter · status_has_text_label · axe_preview | Component, a11y | T005 T007 |
| R5 | Duplicates caught in DB and in file | dup_existing_order · dup_within_file_first_wins | Integration | T004 |
| R6 | Created orders equal approved rows | only_approved_rows_created · error_rows_not_selectable | Integration, E2E | T006 T007 |
| R7 | No double orders on retry or crash | double_submit_idempotent · worker_kill_resumes · race_dup_at_commit | Integration | T006 |
| R8 | Error CSV is correct and safe | error_csv_only_skipped · formula_injection_escaped | Unit | T006 |
| R9 | Support sees every batch | history_lists_batch · events_emitted | Integration | T008 |
| NFR | 2,000 rows: preview < 10 s, commit < 60 s | perf_2000_rows | E2E | T009 |
Lessons from each ticket are written to the project's memory and read before the next one starts.
Send us one paragraph about a feature on your roadmap. On a scoping call we'll walk through what Nebula Swarm would produce for it, using your codebase and your Jira, and tell you plainly whether it fits your team.