The product is a structured model of the business; the application is a projection of it
Wildo does not start from a blank repository and a prompt. It first builds a model of the business: a vision brief, a market snapshot, requirements, a roadmap, a domain plan, a build plan, a compliance posture. Each part is a typed file with its own schema and its own validator, and each part refers to the others by identifier rather than by prose. The application is generated as one projection of that model, and because the model is structured, Wildo can answer questions about the business mechanically: which stated goal no roadmap phase delivers, which reference points at nothing, which fact a legal document cites that the application never declared.
The problem it answers
Every AI application builder can emit code. Code is semi-structured: it can be generated, and it can be compiled, but it cannot be reasoned over as a description of a business. The answers to “which requirement does this screen serve”, “which role may reach this record” or “what does this feature owe a regulator” are in the code somewhere, in the way a novel’s plot is in its letters. A generator asked those questions can only generate more code.
Paul’s own statement of the bet, recorded in messaging.md:
The bet of Wildo is that structured data, avoiding the more complex parts of applications, and focusing on a sub-domain, B2B SaaS and corporate internal tools, makes it possible to define needs well beyond application creation alone. We determine the business way with the product, together. That the data is structured, and not only semi-structured, is key.
The distinction that matters is between a specification that is prose and a specification that is data. A prose specification is what language models are best at producing and what most spec-driven tooling has converged on. It reads well and it refuses nothing. You cannot run a set operation over it: you cannot ask it, exactly and for free, which of its requirements no task decomposes. A typed model can be asked, and the answer is a computation rather than an opinion.
What it rules in, and what it rules out
- Every part of the product definition is a schema-backed file family. The market snapshot, the domain plan and the compliance documents are Zod-typed values landed as TypeScript files in the application’s own specifications package, not documents beside the repository. Rejected: a prose brief per phase. Prose cannot be cross-referenced by identifier, so nothing downstream could be checked against it.
- Families reference each other by ref, never by name in a sentence. A roadmap phase names the success criteria it delivers; a document clause names the facts it cites. Rejected: free-text links. They cannot dangle visibly, which means they dangle silently.
- Cross-family questions are answered by a derived report, not by a reviewer’s memory. The coherence report is a pure function over the landed families and is recomputed from the working tree on demand. Rejected: a stored coverage matrix. A stored answer goes stale the moment a family moves, and a stale answer reads exactly like a current one.
- The report informs; it does not refuse. A coverage gap is frequently legitimate: a success criterion deferred past the current horizon is a gap and is correct. Rejected: turning coherence findings into a gate. That decision belongs to a human reading the report, and promoting a row into a refusal is a separate, deliberate step.
- The application is downstream of the model, not beside it. Coding agents write code against
specifications the model produced, into an engine that already carries tenancy, roles, billing
and audit. Rejected: generating the application first and reverse-engineering a model from it.
That is the round-trip problem, and it is what the sibling principle
creation-is-not-a-first-run.mdxexists to avoid.
What it means for someone building with Wildo
- You get a product definition you can query, not only read. Which requirement is undecomposed, which document fact is missing, which criterion nothing ships toward: each is a line in a derived report rather than a review meeting.
- Your specifications live in your repository as TypeScript, under version control, and are part of the same history as the code. There is no second system where the model is kept.
- A schema is a commitment. When the model generates a family, the family’s own schema constrains the output, and the family’s validator can reject a value that is schema-valid but internally incoherent. You are not asked to trust a well-formed document that references nothing.
- The report is advice, not a gate. A finding tells you something is stated with nothing behind it; whether that is a defect or a deliberate deferral is your call, and Wildo does not make it for you.
For engineers
Where it lives in the framework
- The family registry.
FAMILY_ASPECTS_REGISTRYassembles one aspect declaration per specification family, keyed by the family’s semantic schema ref. It currently lists seventeen declarations, from the vision snapshot through market, requirements, feature drafts, roadmap, business model, brand, domain plan, build plan, placement plan and the compliance document families to the assurance programme, which is deliberately aspect-empty. The registry itself refuses to state its count in prose, because the number moves. - One folder per family with schemas and a validator. Under
_core, each family carries its Zod schemas and a*-validation.tsthat walks the assembled value as a typed graph. The market snapshot validator, for instance, is a pure walker over the snapshot with a rule table of eighteen issue kinds, from orphan references to influence cycles between customer profiles. - The coherence report.
buildApplicationCoherenceReportreads every landed family it knows, skips absent ones (saying which), reports malformed ones as unreadable rather than throwing, and returns dangling-reference and coverage findings across families. It is rendered to aCOHERENCE.mdin the application, served by the companion atGET /playbooks/coherence, and read bywildo context coherence. - A landed model in a real application.
srcholds the families as they were produced through the creation journey: adomain-plan/with its module decomposition and relationship intents,market/,requirements/,roadmap/,build-plan/,document-facts/,compliance-document-candidates/and aprocessor-register/, plus the per-module resource specifications the domain plan led to. ItsCOHERENCE.mdis a real report: it names roadmap references to success criteria that no longer exist and document clauses citing facts the application does not declare, and it refuses nothing. - The engine as the projection target.
wildo.saas.config.tsdeclares the capabilities the application needs (organisations, transactional email, billing) from the closedEngineCapabilityvocabulary, so the generated application inherits those parts rather than regenerating them.