ADR-071: Product name — Weft
Status: Accepted (superseded in part by ADR-091 — product name is now Crank) Date: 2026-04-23 Related: ADR-065 (persona-aware IA + niceties), ADR-067 (playbooks unified primitive), ADR-068 (playbook runtime architecture), ADR-070 (playbook UI contract), ADR-091 (renames product from Weft to Crank)
Superseded in part by ADR-091. §1 (product name = Weft) is replaced — the product is now Crank. Every other section of this ADR — the company-vs-product split, the naming-criterion framework, the weaving metaphor used as engineering vocabulary, the revocability principle — stands unchanged. The metaphor catalogue (loom, shuttle, warp, weft thread) is preserved as internal architectural shorthand; only the public-facing product name changed. This file is retained for historical record and is not edited in place.
Decision (one sentence)
Weft is the product name for Gyrum's SaaS factory. Gyrum (the company) owns the umbrella brand; Weft is the thing customers install, engineers ship, and operators run.
Context
Three months of ADRs have been written without a product name. The thing we are building has been called, at various times and by various people:
- "the SaaS factory" (pitch-deck phrasing, used in investor prose)
- "the platform" (engineering prose — ADR-054, ADR-058)
- "dark-factory" (the monorepo name, leaking into docs)
- "Gyrum" (collapsing company and product into one word)
- "the orchestration layer" (when the speaker means the runtime)
Each of those is correct in its register and wrong in every other register. A new engineer reading the ADR index cannot tell whether "the platform" in ADR-058 and "Gyrum" in the README are the same thing. A prospective customer looking at weft.gyrum.ai and gyrum.ai/orchestration cannot tell which surface is canonical. Every screen and every surface has to re-establish what it is, because the shared name does not exist.
This ADR settles it.
Why not just call it "Gyrum"?
Because Gyrum is the company. It has — or will have — a
hiring page, an investor deck, a research arm (ai-research), an
engineering blog, and press about what the company believes. None of
those are "the product". Collapsing company into product is the
Vercel → Next.js mistake in reverse: it makes the product sound like
a division of one company rather than the one thing the company
sells, and it makes the company sound like a product when it tries
to hire platform engineers or accept research collaborators.
Anthropic (company) → Claude (product). Vercel (company) → Next.js (product). Google (company) → Workspace (product). The pattern is well-worn; we adopt it.
Why not just call it "Dark Factory"?
"Dark factory" is the right industry metaphor — a lights-out manufacturing plant, fully automated, runs without humans on the shop floor. It names precisely what the platform does (turn specifications into working SaaS products with minimal human intervention). It is the correct internal and industry-critic term and will keep being used in prose.
It is not a viable product name in 2026:
- Crowded. StrongDM, Spotify, and Cursor all use "dark factory"
or "lights-out SaaS factory" in their 2026 marketing copy. A
domain audit on
darkfactory.*turned up parked domains under three active owners and a German industrial-automation consultancy atdunklefabrik.de. - Generic. "Dark factory SaaS" returns ~40k results in 2026 and is drifting toward the fate of "AI platform" — a phrase every company claims, therefore a phrase no company owns.
- Undifferentiated. If a prospect asks "which dark factory?", the answer has to be another name. At that point the first name was never the product name.
Dark Factory stays as the metaphor (we describe what Weft does as "running a dark factory"), stays as the monorepo name (no rename, no git-history pain), and stops being used as the product identifier.
Why not "Jacquard"?
The Jacquard loom (Joseph Marie Jacquard, 1804) is the first programmable machine — punch cards encoded the weave pattern, a mechanical reader pulled threads into position, the loom wove the pattern without a human intervening. It is, unarguably, the right ancestor for a playbook-driven automation platform. Early prose in the ai-research repo uses "Jacquard" informally.
jacquard.com is an active AI-SaaS competitor. Rebranded from Phrasee in 2023; enterprise content generation; well-funded; current marketing language uses the exact "programmable content at scale" positioning that a Gyrum product would also use. Direct collision. Domain is held. Brand is established. Using Jacquard as our product name is lethal in a comparison search and actively hostile in any SEO context.
The metaphor stays (we credit Jacquard's punch cards when explaining playbooks — see §4 below), the name is abandoned.
Decision
1. Name
Weft.
- Full form: "Gyrum Weft" in prose where umbrella-identification matters (investor docs, press, the first sentence of a README).
- Short form: "Weft" in daily use (UI chrome, engineer prose, Slack, the second sentence onward).
- Possessive: "Weft's runtime", not "the Weft runtime" (shorter, reads as a product not an object).
Pronunciation: /wɛft/ — rhymes with left. One syllable. No silent letters, no ambiguous spelling (unlike "gyrum", which /ˈdʒaɪrəm/-or-/ˈɡɪrəm/ even our own team disagrees about).
2. The metaphor
Weft, in weaving, is the horizontal thread — the thread the shuttle carries back and forth across the vertical warp threads, one pass at a time. The warp is the fixed skeleton of the fabric; the weft is what makes it a fabric rather than a fringe. Every pass of the shuttle lays down one more line of weft; the pattern (encoded on the Jacquard punch cards) tells the shuttle which warp threads to go over and which to go under; the accumulated passes are the fabric.
The metaphor maps cleanly onto the ADR-067 / ADR-068 architecture. This is not decoration. Every architectural component has a role on the loom; future architecture decisions can and should ask "what role does this play on the loom?" and get a well-defined answer.
2.1 Loom-metaphor mapping
| Weaving concept | Weft architectural component | Source ADR |
|---|---|---|
| Loom (the machine) | The Weft platform itself — the running ai-research instance, the frontend, the database, the queue |
ADR-068 (runtime architecture) |
| Warp threads (vertical skeleton) | The stable infrastructure: catalog, persona IA, project registry, runbooks | ADR-059 (project-first IA), ADR-060 (catalog-driven infra), ADR-064 (gyrum-catalog + hex arch), ADR-065 (persona IA) |
| Punch cards (the pattern) | Playbooks — YAML front-matter + Markdown body, one pattern per card, one stack of cards per product | ADR-067 |
| Punch-card reader | The playbook runtime's parser + validator — reads the YAML, resolves references, hands each step to its executor | ADR-068 §3 |
| Shuttle (carries weft thread through warp) | Step executors — one shuttle per step kind (shell, ssh, claude, http, pipeline, experiment, prompt, prompt_secret, approval, subplaybook) | ADR-068 §3 |
| One shuttle pass | One playbook_run — one complete execution of a playbook, from pending to completed / failed / cancelled |
ADR-068 §2 |
| Selvedge (finished edge of fabric) | The run report — the terminal-state envelope with outputs, events, timing, and the ADR-066 microvisualisations | ADR-068 §2, ADR-066, ADR-070 §1 |
| Operator at the loom | Human or agent who answers awaiting_input prompts, approves destructive steps, cancels a misbehaving run |
ADR-068 §2, ADR-070 §1 |
| Finished fabric | The SaaS products Weft produces — the sites and services the pattern was woven into existence to create | (the whole point) |
The mapping has structural value beyond naming. When a future ADR proposes, say, a "playbook-composition" primitive — subplaybooks calling subplaybooks — we can ask: is this the shuttle carrying two weft threads at once, or is it a second loom feeding the first? The metaphor constrains vocabulary and forces specificity.
2.2 Why the metaphor is load-bearing, not decorative
Three concrete uses:
Onboarding explains itself. A new engineer reading the ADR index can read ADR-067 → ADR-068 → ADR-070 → this one and walk away with a picture: pattern → reader → shuttle → fabric. The picture survives compression; the picture does not need the ADRs to be re-read every week.
Vocabulary is shared across the stack. The runtime talks about "runs"; the frontend talks about "reports"; prose talks about "patterns". Now they all share loom, pattern, shuttle, pass, fabric, selvedge. A bug report that says "the selvedge is missing timestamps on failed runs" is unambiguous in a way that "the report renderer dropped a field" is not.
The metaphor predicts. When we have to decide whether step-level cancellation should abort mid-step or let the step finish, the metaphor asks: can a shuttle be stopped mid-pass? The answer (yes, but you get a broken thread, and the next pass has to re-thread) maps to the on-restart behaviour in ADR-068 §2 — which is why that section requires operator confirmation rather than automatic resume.
3. Why "Weft" won over alternatives
A domain audit and competitor sweep on 2026-04-23 looked at every candidate that survived a first filter. The short list:
| Candidate | Root metaphor | Failure mode | Fatal? |
|---|---|---|---|
| Dark Factory | lights-out plant | generic, crowded, undifferentiated (see §Context) | yes — as a product name |
| Jacquard | programmable loom | jacquard.com is an active AI-SaaS competitor; direct collision |
yes |
| Umbra | shadow / dark | umbra.com is an active satellite-imagery company (well-funded, heavy press footprint); tech-trademark conflict |
yes |
| Penumbra | shadow edge | penumbra.com is a NYSE-listed medical-device company; search and trademark both collide |
yes |
| Nocturne | nighttime | Chopin connotation overwhelms tech connotation; also a Figma plugin + a Sony product line | yes (weak, but real) |
| Loom | the weaving machine | loom.com is Atlassian's video company (bought 2023, actively marketed); direct collision |
yes |
| Warp | the vertical thread | warp.dev is an active AI terminal company (YC, heavy marketing spend); direct collision |
yes |
| Shuttle | the thread-carrier | shuttle.rs is an active Rust-backend-hosting company; direct collision in dev-tools space |
yes |
| Heddle | loom part that lifts warp threads | obscure — most readers have never heard the word; pronunciation unclear | no, but unusable |
| Weft | the horizontal thread | no tech-company collision on the word; short, pronounceable, distinctive; weft.gyrum.ai available as canonical subdomain (see §7) |
— winner — |
The remaining filter: the name had to (a) extend the loom metaphor
already justified by the Jacquard / punch-card framing in ADR-067,
(b) be pronounceable in one syllable on first reading, (c) have an
available .dev or .ai domain in April 2026, (d) return zero
active tech-company collisions on a combined Google + GitHub +
Crunchbase sweep. Weft cleared all four. Nothing else did.
4. Positioning
4.1 Tagline
Recommended: "Weft — the SaaS factory that weaves itself."
The recommended tagline owns the metaphor (weaves), names the category (SaaS factory), and carries the autonomy claim (itself) without overclaiming ("weaves itself" is literally what the Jacquard loom does — a human doesn't throw the shuttle; the machine does). Short enough for a homepage hero, long enough to read as a promise.
Alternative: "Playbooks in. Products out."
Blunt, engineer-facing, reads as a functional spec. Good for the engineering-blog subtitle or a Hacker News comment. Loses the metaphor; gains legibility. Recommend as the secondary tagline on the docs landing page where the audience is engineers rather than buyers.
Alternative: "Gyrum Weft — automation that runs in the dark."
Keeps the dark-factory reference alive (it is the correct industry framing and worth nodding to), adds the umbrella brand, reads as slightly more enterprise. Recommend as the tagline for investor and press materials where "Gyrum" is the recognised entity and the dark-factory framing is the category-signalling anchor.
4.2 Brand voice
Three adjectives, ranked:
- Craft — Weft is a weaving word. The brand reads as something made carefully, patterns held deliberately, fabric inspected before it leaves the loom. Not "move fast and break things".
- Automation — the loom weaves itself; the factory runs in the dark; the engineer watches the patterns, not the threads.
- Quiet confidence — weaving is not loud. The best looms are the ones you hear steady in the background. Copy that shouts gets rejected; copy that over-promises gets rejected. (This matches the ADR-065 niceties principle: calm by default, loud only when actionable.)
Not: cute, playful, disruptive, revolutionary, "reimagining".
5. Rename targets — future work, not this PR
This ADR does not execute the rename. It enumerates the targets so future PRs (one per repo, prose-only) can land them incrementally.
5.1 Priority 1 — customer-facing prose
The surfaces a prospect, user, or customer encounters first. These should migrate in the first rename wave (one follow-up PR per repo).
| Surface | Today | After rename |
|---|---|---|
ai-frontend/src/routes/+page.svelte — homepage <title> |
"Gyrum" | "Weft — Gyrum's SaaS factory" |
ai-frontend/src/routes/+layout.svelte — nav brand |
"Gyrum" | "Gyrum Weft" (full form in chrome) |
Docs page titles — first H1 of every page under docs/ that names the product |
varies | Weft (prose only; filenames unchanged) |
| Landing-page copy — hero headline, subhead, CTA | "The SaaS factory" / "Gyrum" | "Weft" / "Gyrum Weft" |
README.md first paragraph — every public repo (ai-frontend, ai-research, dark-factory, gyrum-catalog, gyrum-playbook-runtime if extracted) |
varies | First-sentence pattern: "X is part of Weft, Gyrum's SaaS factory." |
Install guide headings — docs/getting-started/, docs/install/ |
"Install the platform" / "Install Gyrum" | "Install Weft" |
| Public tagline — homepage hero | (none canonical) | "Weft — the SaaS factory that weaves itself." (§4.1) |
OpenGraph / social meta — og:title, twitter:title on every public page |
"Gyrum" | "Weft — Gyrum's SaaS factory" |
| Email sender name — transactional mail from the platform | "Gyrum Platform" | "Weft" (from-address on gyrum.ai until a standalone domain is acquired — see §7) |
5.2 Priority 2 — engineer-facing prose
The surfaces engineers (ours and third-party) read when figuring out how the system is put together. Second rename wave; lower urgency, but still prose-only.
| Surface | Today | After rename |
|---|---|---|
| ADR titles — prose inside ADRs that references "the platform" | "the platform" | "Weft" (ADR IDs and filenames unchanged) |
CLAUDE.md first paragraphs — every repo's AI-context file |
varies | First-sentence pattern: "This repo is part of Weft (Gyrum's SaaS factory)." |
| Docstring first-lines — every exported symbol whose doc comment names the product | "the platform" / "Gyrum" | "Weft" (only where the product is explicitly named; most docstrings don't need to change) |
go doc package comments — top-of-package commentary for public packages |
varies | "Part of Weft." prefix where the package is product-specific |
| Engineering blog posts — once the blog launches | N/A | Use "Weft" and "Gyrum Weft" per §4.1 |
| Conference talks / slide decks — when we give them | varies | Product name: Weft. Company name: Gyrum. |
5.3 Explicitly NOT renamed
These stay as-is. Renaming them would break imports, git history, CI configuration, or operator muscle memory, and the cost is not worth the consistency gain.
- Repo names.
dark-factory,ai-frontend,ai-research,gyrum-catalog,gyrum-hiphip, and everything else stays. GitHub URL stability matters more than naming purity. New repos (e.g. a futuregyrum-playbook-runtimeper ADR-068's extraction path) may use the new naming, but old repos stay. - Go module paths.
gyrum.ai/orchestration,gyrum.ai/catalog, and similar module paths stay. Changing them would break everygo getand every downstream import. - Go module
gyrum-hiphip. Stays. Internal codename; the puzzle-piece-naming convention works for us. - File paths.
docs/decisions/071-product-name-weft.mdstays; we do not retrofitweft/into directory structures. - Internal variable names.
gyrumClient,platformConfig,darkFactoryRoot— no rename. The compiler does not care; code-review mental load is real. - Database table names and column names.
playbook_runs,playbook_run_steps,kpi_snapshots— unchanged. A rename here means a migration; a migration here means downtime or careful dual-write. Not worth it for naming consistency. - Environment variables.
GYRUM_DATABASE_URL,GYRUM_METRICS_BEARER— unchanged. Operators have them memorised. - CLI names.
gyrum-start-work,gyrum-complete-pr,gyrum-review-pr, and all othergyrum-*devtools stay. These are company-level tooling (they work across every gyrum project including ones that are not part of Weft), so the company prefix is correct. - Git history. Obviously. No
git filter-branch.
6. Brand relationship
Two brands, one umbrella. The separation is explicit and load-bearing.
| Brand | Scope | Primary domain | Tone | Content owners |
|---|---|---|---|---|
| Gyrum.ai | The company. Hiring, investor comms, research, press, company-wide identity, the research arm (ai-research), the long-form essays and conference talks that speak for the company rather than the product. |
gyrum.ai |
Institutional. "Gyrum believes…" | Founders, press, hiring |
| Gyrum.io | Owned, under-used. | gyrum.io |
Parked — 301 redirect to gyrum.ai for now. Future option: reserve for a second product, or for the research arm's standalone blog if it outgrows gyrum.ai/research. |
Reserved |
| Weft | The product. Landing page, docs, changelog, engineer blog posts about the product, customer-support prose, the UI chrome, the email-sender identity, the status page. | weft.gyrum.ai (canonical — see §7) |
Craft + automation + quiet confidence (§4.2) | Product, engineering |
Analogous patterns in the market:
- Anthropic → Claude. Anthropic publishes research, hires, talks to regulators. Claude has a product page, a pricing page, a changelog. The separation is clean and the company does not confuse the two.
- Vercel → Next.js. Vercel is the hosting company; Next.js is the framework. Vercel employs the Next.js team; they are not the same brand. A Next.js release is not a Vercel release.
- Google → Workspace. Workspace has its own identity
(
workspace.google.com), its own pricing, its own UI chrome. Google is the umbrella.
We follow the same split. The cost is ~two landing pages to maintain; the benefit is that the company can change its product strategy without rebranding, and the product can grow a second version without rebranding the company.
7. Domain strategy
Canonical URL: weft.gyrum.ai (subdomain of the company domain, already owned).
Standalone weft.* domains are squatter-heavy — weft.com, weft.ai, weft.io,
weft.dev, weft.works, weft.so etc are all either actively owned by real
companies or parked by domain squatters. DNS sniffs can be misleading for
parked-with-no-DNS domains; only the registrar is authoritative.
Decision: defer standalone domain purchase. weft.gyrum.ai is the
canonical product URL for now. Anthropic launched Claude at claude.anthropic.com
before owning claude.ai; GitLab lives at about.gitlab.com; Google Workspace
at workspace.google.com. A subdomain is a completely valid launch URL.
Revisit the standalone purchase when:
- Revenue or funding justifies a $50-$5,000 squatter negotiation
- Branded email (@weft.something) becomes load-bearing
- A genuinely available standalone appears at a normal price (~$20-50/year) —
check
weft.today,weft.systems,weft.industries, etc via Cloudflare's registrar search (authoritative — not DNS)
Don't let perfect domain hunting block product progress.
8. Consequences — honest
8.1 Costs
- Search friction. "Weft" is not a known product in April
- A prospect Googling for a "SaaS factory" will not find us by name until SEO catches up. Mitigation: every public surface pairs "Weft" with "Gyrum's SaaS factory" in the first sentence (the §5.1 rename pattern exists for this reason); "Gyrum" is the bridge while "Weft" gains its own search footprint.
- Rename work. §5 enumerates the surfaces. Conservatively ~6 repos × ~3 surfaces each = ~18 follow-up PRs over the next ~two weeks. Each PR is prose-only, small, and review-light.
- Two brands to maintain. A Gyrum landing page and a Weft landing page, each with their own copy, their own changelog, their own social cards. Real cost; we judge the clarity gain worth it.
- "Weft" is an obscure word. Many readers will not know it means "horizontal weaving thread" on first encounter. The metaphor is explained in docs and in the tagline; we accept that a fraction of users never learn the metaphor and that is fine (they don't need to, any more than Next.js users need to understand the "next" reference).
8.2 Benefits
- Internal clarity. No more "the platform" / "the SaaS factory" / "Gyrum" / "dark factory" naming wobble. Every ADR after this one uses "Weft" for the product and "Gyrum" for the company; every engineer onboarded after today sees a single consistent name.
- Metaphor vocabulary. §2.1's loom-mapping unlocks shared vocabulary across the stack. Bug reports, feature requests, architectural sketches, and diagrams can all use pattern / shuttle / pass / fabric / selvedge with shared meaning.
- Brand separation. The company can change its product strategy without rebranding; the product can grow a second version (a Weft 2, a Weft Cloud, a Weft Enterprise) without confusing the company identity.
- Competitive positioning. "Weft" is distinctive in search, trademark, and domain. No known active tech-company collisions as of the 2026-04-23 audit.
8.3 Risks, and what we'd do about each
| Risk | Likelihood | Mitigation |
|---|---|---|
| A competitor launches a product named "Weft" in the next 12 months | low — April 2026 audit found none | If it happens, evaluate their traction. A pre-revenue competitor does not force a rename; a funded competitor does. Worst case: rename is ~6 repos × ~3 surfaces of prose (the §5 list). |
| The metaphor doesn't land — readers find "weft" too obscure | moderate | Re-review at 90 days (§9). If engagement metrics on the landing page show the name is a bottleneck (high bounce, low "SaaS factory" conversion), consider pairing "Weft" permanently with "Gyrum's SaaS factory" in all external copy rather than renaming. Keep the short form for chrome where context is established. |
| Internal slip — engineers keep saying "the platform" | high in the first month | The §5 rename PRs are prose-only and fast; landing them over two weeks retrains usage. No enforcement beyond that; muscle memory fades. |
A genuinely-available standalone weft.* appears at a normal price |
plausible | Acquire it via Cloudflare Registrar, 301-redirect to weft.gyrum.ai initially, migrate canonical on the next brand-guide pass. No ADR change required. |
| Trademark filing reveals a prior registration | moderate | Run a USPTO TESS + EUIPO search before any future standalone-domain purchase. If a prior registration exists in software/SaaS class, re-open this ADR. |
9. Review cadence
Re-review this ADR on 2026-07-23 (90 days from acceptance).
The re-review asks one question: is "Weft" a name that has landed? Concretely:
- Is the product called Weft in internal Slack, in PR descriptions, in standups? (If we're still saying "the platform", the name hasn't landed.)
- Is
weft.gyrum.aidriving organic traffic? (If the landing page sees zero non-direct visitors, SEO hasn't caught.) - Has any customer, prospect, or external engineer used the name unprompted? (If not, the name is internal-only — which might be fine, but needs acknowledging.)
- Has a competitor named Weft emerged? (Unlikely but possible.)
If the re-review concludes the name has clearly not landed, we accept the cost of a rename. The §5.3 "explicitly NOT renamed" list is the ceiling on that cost — repo names, module paths, and env vars stay regardless; only the prose surfaces would change. That ceiling is the reason this ADR is not reckless: the cost of being wrong is ~18 follow-up PRs of prose, not a migration.
If the re-review concludes the name has landed (even partially), the cadence continues: no further review unless a material event (competitor collision, trademark challenge, major product repositioning) forces one.
10. Related work — immediate follow-ups
Out of scope for this ADR, listed here so future-us can track:
- PR-N+1: Stand up
weft.gyrum.ai— DNS + TLS + a holding page that reads "Weft — the SaaS factory that weaves itself. Coming soon. A Gyrum product." with a subscribe form. - PR-N+2: Run USPTO TESS and EUIPO trademark searches for "Weft" in software/SaaS classes (IC 009, IC 042). File if clear.
- PR-N+3..N+18: The §5.1 and §5.2 rename PRs, one repo at a time, prose-only, small.
- PR-N+19: Brand guide — logo, wordmark, colour palette, typography. Builds on the ADR-062 design-system foundation; applies the §4.2 voice.
- PR-N+20:
weft.gyrum.ailanding page proper — replaces the holding page; uses the recommended §4.1 tagline; links toweft.gyrum.ai/docsand togyrum.aifor the company-level surface.
References
- ADR-065: Platform UI adopts persona-aware routes + a niceties framework
- ADR-067: Playbooks as a unified primitive
- ADR-068: Playbook runtime architecture
- ADR-070: Playbook UI contract
- ADR-066: Microvisualisations — sparklines + timeline strips (referenced indirectly via §2.1's "selvedge" → run report mapping)
- ADR-062: Design system + component strategy (referenced for §4.2 brand voice continuity and §5.1 rename targets)
- ADR-059: Project-first IA (referenced for §2.1 "warp threads" mapping)
- Session context (2026-04-23): the naming conversation that triggered this ADR — the "dark factory" crowding audit, the
jacquard.comcompetitor discovery, and the domain sweep that found the standaloneweft.*space squatter-heavy (amended 2026-04-23 after Cloudflare-registrar confirmation).