PageSourceSearch

https://santiandrade.github.io/blog/js/data/posts/city-generator-unity-ia-spec-driven-development.js

js santiandrade.github.io collected 2026-10-03 09:54:04 UTC 31,847 bytes, 123 lines download raw bytes

1// Contenido del post "city-generator-unity-ia-spec-driven-development".
2window.SITE_POST_BODIES = window.SITE_POST_BODIES || {};
3window.SITE_POST_BODIES["city-generator-unity-ia-spec-driven-development"] = {
4  heroHtml: `
5    <figure class="post-hero">
6      <img src="assets/posts/city-generator-unity-ia-spec-driven-development.png" data-alt-es="Ilustración editorial de una ciudad procedural generada a partir de una especificación y una configuración." data-alt-en="Editorial illustration of a procedural city generated from a specification and configuration." alt="Ilustración editorial de una ciudad procedural generada a partir de una especificación y una configuración.">
7      <figcaption><span data-l="es">Una ciudad recorrible, configurable y pensada para volver a generarse.</span><span data-l="en">A walkable, configurable city designed to be generated again.</span></figcaption>
8    </figure>`,
9  introHtml: `<span data-l="es">Una ciudad para un videojuego tiene una cualidad curiosa: cuanto más “vacía” parece al empezar, más decisiones esconde. No basta con poner edificios. Hay que decidir dónde van las calles, qué cruces existen, cómo se colocan las aceras, qué puede regenerarse sin destrozar una escena y qué sistemas deben seguir funcionando cuando aparecen decenas —o cientos— de objetos.</span><span data-l="en">A city for a video game has a curious quality: the emptier it looks at the outset, the more decisions it hides. It is not enough to place buildings. You have to decide where streets go, which junctions exist, how pavements are laid out, what can be regenerated without wrecking a scene, and which systems must keep working when dozens—or hundreds—of objects appear.</span>`,
10  bodyHtml: `
11    <p><span data-l="es">De ahí salió <strong>City Generator</strong>, una herramienta de Editor para Unity que genera una ciudad recorrible y configurable en una escena nueva o en una ya existente. Puede construir carreteras, aceras, marcas viales, edificios, plazas, mobiliario urbano, semáforos, tráfico, peatones, audio ambiental y un minimapa. El proyecto empezó como una prueba de concepto personal; el objetivo dejó de ser “tener una ciudad” y pasó a ser poder crear muchas sin reconstruir el mismo escenario a mano cada vez.</span><span data-l="en"><strong>City Generator</strong> grew out of that: a Unity Editor tool that generates a walkable, configurable city in a new or existing scene. It can build roads, pavements, road markings, buildings, plazas, street furniture, traffic lights, traffic, pedestrians, ambient audio and a minimap. The project began as a personal proof of concept; the goal shifted from “having a city” to being able to create many without rebuilding the same environment by hand each time.</span></p>
12    <p><span data-l="es">La parte interesante no es que una IA pueda escribir código para colocar una farola. Puede hacerlo. La parte interesante es usarla dentro de un proceso donde las decisiones siguen teniendo dueño.</span><span data-l="en">The interesting part is not that AI can write code to place a streetlight. It can. The interesting part is using it within a process where decisions still have an owner.</span></p>
13    <p><span data-l="es">En este proyecto trabajo con una idea muy simple: <strong>la IA puede acelerar la ejecución, pero no debe sustituir el criterio</strong>. Para conseguirlo, mi unidad de trabajo no es un prompt gigantesco del estilo “hazme una ciudad procedural”, sino una <em>spec</em>.</span><span data-l="en">For this project, I work from a very simple idea: <strong>AI can speed up execution, but it should not replace judgement</strong>. To make that work, my unit of work is not a giant prompt such as “make me a procedural city”, but a <em>spec</em>.</span></p>
14    <figure class="post-video">
15      <div class="post-video-frame">
16        <iframe src="https://www.youtube-nocookie.com/embed/hroxltySGeI" title="City Generator demo" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture;
16 web-share" referrerpolicy="strict-origin-when-cross-origin" loading="lazy" allowfullscreen></iframe>
17      </div>
18      <figcaption><span data-l="es">City Generator en marcha: una ciudad generada desde una configuración, no montada a mano.</span><span data-l="en">City Generator in action: a city generated from a configuration, not assembled by hand.</span></figcaption>
19    </figure>
20
21    <h2 id="s1">01 · <span data-l="es">El problema real no era crear edificios</span><span data-l="en">The real problem was not creating buildings</span></h2>
22    <p><span data-l="es">Montar un entorno urbano a mano es razonable cuando quieres una escena concreta y cerrada. Pero para probar gameplay, cámaras, navegación, tráfico, minijuegos o escala visual, ese enfoque tiene una trampa: pasas demasiado tiempo construyendo el decorado antes de saber siquiera si la mecánica funciona.</span><span data-l="en">Building an urban environment by hand makes sense when you want one specific, self-contained scene. But when you are testing gameplay, cameras, navigation, traffic, minigames or visual scale, that approach has a trap: you spend too much time building the set before you even know whether the mechanic works.</span></p>
23    <p><span data-l="es">Una herramienta procedural reduce ese coste inicial. Con una configuración puedes generar una cuadrícula, poblarla y recorrerla. Cambias el tamaño, la semilla, los prefabs o la densidad y vuelves a probar. La ciudad deja de ser una maqueta única y se convierte en un entorno que puedes iterar.</span><span data-l="en">A procedural tool reduces that initial cost. With a configuration, you can generate a grid, populate it and walk through it. Change the size, seed, prefabs or density, then test again. The city stops being a one-off model and becomes an environment you can iterate on.</span></p>
24    <p><span data-l="es">Pero “generar aleatoriamente” no equivale a “ser útil”. Si el resultado solo funciona con los assets de una demo, rompe la escena del usuario o no se puede repetir, no has creado una herramienta: has creado una captura de pantalla con ambiciones.</span><span data-l="en">But “generating at random” is not the same as “being useful”. If the result only works with demo assets, breaks the user’s scene or cannot be reproduced, you have not created a tool: you have created a screenshot with ambitions.</span></p>
25    <p><span data-l="es">Por eso City Generator se diseña como un paquete instalable desde Git, con una ventana accesible desde <strong>Tools &gt; City Generator &gt; Open</strong>. El contenido de demostración sirve para arrancar rápido, pero la herramienta está pensada para aceptar prefabs propios y generar instancias de escena, no para obligar a quien la use a adoptar mi terrario completo.</span><span data-l="en">That is why City Generator is designed as a package installable from Git, with a window available at <strong>Tools &gt; City Generator &gt; Open</strong>. The demo content helps you get started quickly, but the tool is meant to accept your own prefabs and generate scene instances—not force anyone using it to adopt my entire terrarium.</span></p>
26
27    <h2 id="s2">02 · <span data-l="es">Una <em>spec</em> antes que un prompt</span><span data-l="en">A <em>spec</em> before a prompt</span></h2>
28    <p><span data-l="es">Cuando quiero abordar una funcionalidad, antes de pedir implementación intento dejar por escrito cinco cosas:</span><span data-l="en">When I want to tackle a feature, before asking for implementation I try to write down five things:</span></p>
29    <ol class="post-bullets"><li><span data-l="es"><strong>Qué problema resuelve.</strong></span><span data-l="en"><strong>Which problem it solves.</strong></span></li><li><span data-l="es"><strong>Qué forma parte del alcance y qué queda fuera.</strong></span><span data-l="en"><strong>What is in scope and what stays out.</strong></span></li><li><span data-l="es"><strong>Qué datos y decisiones tiene que respetar.</strong></span><span data-l="en"><strong>Which data and decisions it must respect.</strong></span></li><li><span data-l="es"><strong>Qué riesgos de integración aparecen.</strong></span><span data-l="en"><strong>Which integration risks arise.</strong></span></li><li><span data-l="es"><strong>Cómo comprobaré que funciona.</strong></span><span data-l="en"><strong>How I will verify that it works.</strong></span></li></ol>
30    <p><span data-l="es">Esa <em>spec</em> puede ser breve. De hecho, mejor que lo sea: si no puedes explicar el contrato de una funcionalidad sin tener que escribir la biblia en verso, probablemente todavía no has decidido qué estás construyendo.</span><span data-l="en">That <em>spec</em> can be brief. In fact, it is better if it is: if you cannot explain a feature’s contract without writing the Bible in ver
30se, you probably have not decided what you are building yet.</span></p>
31    <pre class="code-block"><code><span data-l="es">Objetivo: regenerar una ciudad con nueva configuración.
32
33Debe:
34- permitir una escena nueva o existente;
35- conservar los objetos ajenos a la ciudad generada;
36- reproducir la misma distribución con la misma semilla;
37- validar los prefabs y requisitos antes de generar;
38- dejar los prefabs fuente sin modificar.
39
40No debe:
41- hornear iluminación ni oclusión por cuenta propia;
42- decidir LODs para assets del proyecto consumidor;
43- convertir el sistema en un simulador de tráfico urbano.</span><span data-l="en">Goal: regenerate a city with a new configuration.
44
45It must:
46- support a new or existing scene;
47- preserve objects unrelated to the generated city;
48- reproduce the same layout with the same seed;
49- validate prefabs and requirements before generating;
50- leave source prefabs unchanged.
51
52It must not:
53- bake lighting or occlusion on its own;
54- decide LODs for assets in the consuming project;
55- turn the system into an urban traffic simulator.</span></code></pre>
56    <p><span data-l="es">Esto cambia por completo la conversación con la IA. Ya no le estoy pidiendo que improvise arquitectura a partir de una intención visual. Le doy un contrato: puede proponer diseño, detectar casos límite, implementar una parte delimitada o ayudar a preparar pruebas. Después me toca revisar si la propuesta respeta el contrato y si encaja en el proyecto real.</span><span data-l="en">This completely changes the conversation with AI. I am no longer asking it to improvise an architecture from a visual intention. I give it a contract: it can propose a design, spot edge cases, implement a bounded part or help prepare tests. Then it is up to me to review whether the proposal respects the contract and fits the real project.</span></p>
57    <p><span data-l="es">La <em>spec</em> también permite descartar ideas con fundamento. Por ejemplo, adoptar ECS/DOTS solo porque “hay muchos agentes” podría sonar moderno hasta que miras el coste: nuevas dependencias, una reescritura relevante y una complejidad que el volumen actual no justifica. Por ahora, no compensa.</span><span data-l="en">The <em>spec</em> also makes it possible to reject ideas on sound grounds. For example, adopting ECS/DOTS just because “there are many agents” might sound modern until you examine the cost: new dependencies, a significant rewrite and complexity the current scale does not justify. For now, it is not worth it.</span></p>
58
59    <h2 id="s3">03 · <span data-l="es">De una configuración a una escena recorrible</span><span data-l="en">From configuration to a walkable scene</span></h2>
60    <p><span data-l="es">El pipeline de City Generator parte de datos de configuración y los convierte en una escena. A alto nivel, el proceso se parece a esto:</span><span data-l="en">City Generator’s pipeline starts with configuration data and turns it into a scene. At a high level, the process looks like this:</span></p>
61    <pre class="code-block"><code><span data-l="es">Spec y configuración
62        ↓
63Rejilla y forma de ciudad
64        ↓
65Suelo, carreteras, aceras y señalización
66        ↓
67Manzanas, edificios, plazas y lugares personalizados
68        ↓
69Props, vegetación y audio
70        ↓
71Redes de tráfico y peatones
72        ↓
73Jugador, cámara, minimapa y sistemas de runtime</span><span data-l="en">Spec and configuration
74        ↓
75Grid and city shape
76        ↓
77Ground, roads, pavements and road markings
78        ↓
79Blocks, buildings, plazas and custom locations
80        ↓
81Props, vegetation and audio
82        ↓
83Traffic and pedestrian networks
84        ↓
85Player, camera, minimap and runtime systems</span></code></pre>
86    <p><span data-l="es">La cuadrícula puede ser rectangular o tener una silueta dibujada bloque a bloque. Desde ahí se distribuyen calles y espacios edificables. Las plazas sustituyen manzanas de edificios; los lugares personalizados permiten fijar un prefab y una orientación en un punto concreto; y una semilla hace que la generación sea reproducible.</span><span data-l="en">The grid can be rectangular or have a silhouette drawn block by block. From there, streets and buildable space
86s are distributed. Plazas replace building blocks; custom locations let you fix a prefab and orientation at a specific point; and a seed makes generation reproducible.</span></p>
87    <p><span data-l="es">La reproducibilidad parece un detalle menor hasta que necesitas depurar. Si un resultado extraño solo aparece en una ciudad concreta, necesito poder volver a ella. La misma configuración y la misma semilla deben producir el mismo caso.</span><span data-l="en">Reproducibility sounds like a minor detail until you need to debug. If an odd result only appears in one particular city, I need to be able to return to it. The same configuration and the same seed must produce the same case.</span></p>
88    <p><span data-l="es">Después entra la parte “viva”. El tráfico se apoya en una red de carriles y semáforos, y los vehículos responden a las señales y a los sensores delanteros. Los peatones se mueven por su propio grafo de aceras. El minimapa no pretende repetir toda la escena con una segunda ciudad renderizada: representa la estructura útil para orientarse y mantiene el coste bajo.</span><span data-l="en">Then the “living” part comes in. Traffic relies on a network of lanes and traffic lights, and vehicles respond to signals and front sensors. Pedestrians move through their own pavement graph. The minimap is not meant to replicate the entire scene with a second rendered city: it represents the useful structure for orientation while keeping the cost low.</span></p>
89    <p><span data-l="es">Separar los sistemas de generación de los sistemas que funcionan mientras juegas es crucial. La herramienta organiza el código en ensamblados de <strong>Editor</strong> y <strong>Runtime</strong>. El Editor genera y configura; el Runtime mantiene lo que debe seguir vivo al pulsar Play. Esa frontera evita que la lógica de construcción de escenas se convierta en una dependencia permanente del juego final.</span><span data-l="en">Separating generation systems from systems that run while you play is crucial. The tool organises code into <strong>Editor</strong> and <strong>Runtime</strong> assemblies. The Editor generates and configures; Runtime keeps alive what must continue once Play is pressed. That boundary prevents scene-building logic from becoming a permanent dependency of the finished game.</span></p>
90
91    <h2 id="s4">04 · <span data-l="es">Portabilidad no es una nota al pie</span><span data-l="en">Portability is not a footnote</span></h2>
92    <p><span data-l="es">Uno de los criterios más importantes del proyecto es que la herramienta no debe funcionar únicamente en su demo.</span><span data-l="en">One of the project’s most important criteria is that the tool must not work only in its demo.</span></p>
93    <p><span data-l="es">Por eso hay varias reglas de producto que pesan más que una ciudad especialmente fotogénica:</span><span data-l="en">That is why several product rules matter more than an especially photogenic city:</span></p>
94    <ul class="post-bullets"><li><span data-l="es">La ciudad se puede generar en una escena nueva o existente.</span><span data-l="en">
94The city can be generated in a new or existing scene.</span></li><li><span data-l="es">La regeneración no debe borrar cámara, jugador, luz, volumen u otros objetos que no pertenecen a la ciudad.</span><span data-l="en">Regeneration must not delete a camera, player, light, volume or other objects that do not belong to the city.</span></li><li><span data-l="es">Los prefabs que recibe la herramienta no se modifican como assets: los componentes necesarios se aplican sobre instancias generadas.</span><span data-l="en">The prefabs the tool receives are not modified as assets: required components are applied to generated instances.</span></li><li><span data-l="es">Los requisitos se validan antes de construir, por ejemplo cuando una configuración necesita semáforos o determinados componentes.</span><span data-l="en">Requirements are validated before building, for example when a configuration needs traffic lights or particular components.</span></li><li><span data-l="es">La geometría estática se deja preparada para <em>batching</em> y oclusión, pero el horneado, los LOD de assets propios y el acabado de iluminación siguen siendo responsabilidad de la escena destino… del usuario.</span><span data-l="en">Static geometry is prepared for <em>batching</em> and occlusion, but baking, LODs for custom assets and lighting polish remain the responsibility of the target scene… and its user.</span></li></ul>
95    <p><span data-l="es">Es una distinción menos vistosa que un vídeo con coches circulando, pero es la que decide si una herramienta se puede reutilizar. Unity permite hacer muchas cosas con un prefab en tu proyecto; eso no te concede permiso para modificar alegremente los assets de quien instale el paquete.</span><span data-l="en">It is a less flashy distinction than a video of cars driving around, but it decides whether a tool can be reused. Unity lets you do many things with a prefab in your project; that does not give you permission to casually modify the assets of whoever installs the package.</span></p>
96    <p><span data-l="es">También obliga a ser explícito con los límites. Los edificios propios deben respetar el tamaño de sus espacios. Los vehículos y peatones tienen requisitos concretos de configuración. Las capas usadas por los sensores necesitan estar disponibles. La herramienta puede ayudar y validar, pero no puede convertir cualquier asset arbitrario en algo compatible mediante telepatía.</span><span data-l="en">It also requires being explicit about limits. Custom buildings must respect the size of their spaces. Vehicles and pedestrians have specific configuration requirements. Layers used by sensors need to be available. The tool can help and validate, but it cannot turn any arbitrary asset into something compatible through telepathy.</span></p>
97
98    <h2 id="s5">05 · <span data-l="es">Qué aporta la IA —y qué no le delego</span><span data-l="en">What AI contributes—and what I do not delegate to it</span></h2>
99    <p><span data-l="es">La IA me resulta útil en varias fases del trabajo:</span><span data-l="en">AI is useful to me at several stages of the work:</span></p>
100    <ul class="post-bullets"><li><span data-l="es">Convertir una intención inicial en alternativas técnicas con ventajas y costes.</span><span data-l="en">Turning an initial intention into technical alternatives with benefits and costs.</span></li><li><span data-l="es">Revisar una <em>spec</em> para encontrar ambigüedades o criterios de aceptación ausentes.</span><span data-l="en">Reviewing a <em>spec</em> to find ambiguities or missing acceptance criteria.</span></li><li><span data-l="es">Dividir una implementación grande en cambios más pequeños y revisables.</span><span data-l="en">Breaking a large implementation into smaller, reviewable changes.</span></li><li><span data-l="es">Proponer pruebas de regresión y casos límite.</span><span data-l="en">Proposing regression tests and edge cases.</span></li><li><span data-l="es">Analizar diffs, dependencias y puntos frágiles antes de integrar cambios.</span><span data-l="en">Analysing diffs, dependencies and fragile points before integrating changes.</span></li><li><span data-l="es">Explicar un sistema existente para comprobar que su arquitectura sigue siendo entendible.</span><span data-l="en">Explaining an existing system to check that its architecture remains understandable.</span></li></ul>
101    <p><span data-l="es">Pero no le delego las decisiones que determinan el producto. La IA no sabe qué concesión de rendimiento es aceptable para mi caso, qué API será cómoda para quien use la herramienta ni qué comportamiento visual merece quedarse. Tampoco puede asegurar que algo funciona en Unity solo porque el código parezca convincente. Los prefabs, la escena, el compilador, las pruebas y una revisión humana siguen teniendo la última palabra.</span><span data-l="en">But I do not delegate decisions that determine the product. AI does not know which performance trade-off is acceptable in my case, which API will be comfortable for someone using the tool or which visual behaviour deserves to stay. Nor can it guarantee something works in Unity just because the code looks convincing. The prefabs, the scene, the compiler, tests and human review still have the final say.</span></p>
102    <p><span data-l="es">Ese reparto reduce dos riesgos habituales. El primero es aceptar código correcto de forma local pero equivocado para el sistema: una mejora que resuelve una pantalla y rompe la portabilidad. El segundo es confundir velocidad de escritura con avance real. Generar muchos cambios rápidamente no sirve de gran cosa si luego no puedes explicar sus invariantes ni verificar el resultado.</span><span data-l="en">That split reduces two common risks. The first is accepting code that is locally correct but wrong for the system: an improvement that fixes one screen and breaks portability. The second is mistaking writing speed for real progress. Generating many changes quickly is not much use if you cannot later explain their invariants or verify the result.</span></p>
103
104    <h2 id="s6">06 · <span data-l="es">Verificar es parte de construir</span><span data-l="en">Verification is part of building</span></h2>
105    <p><span data-l="es">En un sistema procedural, una funcionalidad no está terminada porque haya generado una ciudad una vez. Tiene que conservar sus propiedades cuando cambia la configuración, el tamaño de la ciudad o el contenido que recibe.</span><span data-l="en">In a procedural system, a feature is not finished because it generated a city once. It has to preserve its properties when the configuration, city size or received content changes.</span></p>
106    <p><span data-l="es">Para City Generator, algunas preguntas de verificación son más valiosas que una captura bonita:</span><span data-l="en">For City Generator, some verification questions are more valuable than a pretty screenshot:</span></p>
107    <table class="post-table post-table--stacked"><thead><tr><th>
107<span data-l="es">Propiedad</span><span data-l="en">Property</span></th><th><span data-l="es">Pregunta comprobable</span><span data-l="en">Verifiable question</span></th></tr></thead><tbody><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Reproducibilidad</span><span data-l="en">Reproducibility</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿La misma semilla y configuración generan el mismo resultado?</span><span data-l="en">Do the same seed and configuration generate the same result?</span></td></tr><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Integración</span><span data-l="en">Integration</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿La regeneración preserva lo que no pertenece a la ciudad?</span><span data-l="en">Does regeneration preserve what does not belong to the city?</span></td></tr><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Portabilidad</span><span data-l="en">Portability</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿Los prefabs de entrada permanecen sin modificar?</span><span data-l="en">Do input prefabs remain unchanged?</span></td></tr><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Seguridad de configuración</span><span data-l="en">Configuration safety</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿Los requisitos inválidos se detectan antes de generar?</span><span data-l="en">Are invalid requirements detected before generation?</span></td></tr><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Uso real</span><span data-l="en">Real use</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿La escena resultante se puede recorrer y los sistemas de runtime funcionan?</span><span data-l="en">Can the resulting scene be walked through and do runtime systems work?</span></td></tr><tr><td data-label-es="Propiedad" data-label-en="Property"><span data-l="es">Escalabilidad honesta</span><span data-l="en">Honest scalability</span></td><td data-label-es="Pregunta comprobable" data-label-en="Verifiable question"><span data-l="es">¿Qué ocurre cuando se eleva el número de agentes o el tamaño de la cuadrícula?</span><span data-l="en">What happens when the number of agents or grid size increases?</span></td></tr></tbody></table>
108    <p><span data-l="es">No todas las comprobaciones necesitan automatización desde el primer día, pero todas deberían ser explícitas. Si el requisito es importante, debe poder demostrarse.</span><span data-l="en">Not every check needs automation from day one, but all of them should be explicit. If a requirement matters, it must be demonstrable.</span></p>
109    <p><span data-l="es">La herramienta incluye avisos cuando una configuración se aproxima a límites prácticos. El tráfico no hace planificación de rutas ni evita la congestión densa, así que no pretende ser un simulador urbano. El gestor centralizado y el escalonado de sensores ayudan al coste de actualización, pero no sustituyen una decisión de diseño sobre el comportamiento de tráfico. El cuello de botella real no siempre es la CPU; a veces es pedirle a un coche que tenga una vida interior demasiado compleja.</span><span data-l="en">The tool includes warnings when a configuration approaches practical limits. Traffic does not plan routes or avoid dense congestion, so it is not intended as an urban simulator. Centralised management and staggered sensors help with update cost, but they do not replace a design decision about traffic behaviour. The real bottleneck is not always the CPU; sometimes it is asking a car to have an overly complicated inner life.</span></p>
110
111    <h2 id="s7">07 · <span data-l="es">De la herramienta a las demos jugables</span><span data-l="en">From the tool to playable demos</span></h2>
112    <p><span data-l="es">La utilidad de City Generator no termina en generar una ciudad para mirar desde arriba. También es una base para probar gameplay donde la forma urbana importe: rutas de reparto, carreras cortas, evacuaciones, exploración con dron, puzles de semáforos o recorridos de parkour.</span><span data-l="en">City Generator’s usefulness does not end with generating a city to look at from above. It is also a foun
112dation for testing gameplay where urban form matters: delivery routes, short races, evacuations, drone exploration, traffic-light puzzles or parkour routes.</span></p>
113    <p><span data-l="es">Estas demos no tendrían que ser juegos completos. Su valor está en demostrar que la ciudad generada no es un fondo decorativo, sino un sistema capaz de crear variaciones jugables. Si cambiar la topología de calles modifica rutas, obstáculos, puntos de interés o decisiones del jugador, la herramienta está aportando algo más que edificios aleatorios.</span><span data-l="en">These demos would not need to be complete games. Their value lies in showing that the generated city is not a decorative backdrop, but a system capable of creating playable variations. If changing street topology changes routes, obstacles, points of interest or player decisions, the tool is contributing more than random buildings.</span></p>
114    <p><span data-l="es">Ahí vuelve a ser útil el mismo proceso. Antes de añadir una mecánica, conviene definir qué datos ofrece la ciudad, qué variación interesa, qué debe mantenerse reproducible y cuál es el mínimo resultado visible que demuestra el valor de la idea.</span><span data-l="en">The same process becomes useful again here. Before adding a mechanic, it is worth defining which data the city provides, which variation matters, what must remain reproducible and what minimum visible outcome proves the idea’s value.</span></p>
115
116    <h2 id="s8">08 · <span data-l="es">La pregunta que me queda</span><span data-l="en">The question I am left with</span></h2>
117    <p><span data-l="es">Usar IA para desarrollar City Generator no consiste en pedirle “hazme una ciudad” y cruzar los dedos. Consiste en usarla para explorar, implementar y revisar dentro de límites que he decidido antes.</span><span data-l="en">Using AI to develop City Generator is not about asking it to “make me a city” and crossing my fingers. It is about using it to explore, implement and review within limits I decided beforehand.</span></p>
118    <div class="post-callout"><span class="post-callout-label"><span data-l="es">El criterio editorial</span><span data-l="en">The editorial principle</span></span><p><span data-l="es"><strong>Delego la ejecución a la IA, nunca mi criterio.</strong></span><span data-l="en"><strong>I delegate execution to AI, never my judgement.</strong></span></p></div>
119    <p><span data-l="es">En un proyecto procedural, la pregunta útil no es “¿puede la IA generar este código?”, sino “¿qué debe seguir siendo verdad cuando este código genere cien veces más ciudad?”.</span><span data-l="en">In a procedural project, the useful question is not “can AI generate this code?”, but “what must remain true when this code generates one hundred times more city?”</span></p>
120    <p><span data-l="es">Si estás construyendo una herramienta, un sistema repetitivo o un prototipo con IA, prueba algo pequeño: antes de abrir el editor, escribe cuatro límites verificables. Qué debe hacer, qué no debe hacer, qué no puede romper y cómo sabrás que funciona. Luego pide a la IA que te ayude con el plan, no que tome el volante.</span><span data-l="en">If you are building a tool, a repetitive system or an AI prototype, try something small: before opening the editor, write four verifiable limits. What it must do, what it must not do, what it cannot break and how you will know it works. Then ask AI to help with the plan, not to take the wheel.</span></p>
121    <p><span data-l="es">Puede que tardes cinco minutos más al principio. Probablemente te ahorres bastantes más cuando tu ciudad deje de ser una demo de una sola vez y empiece a convertirse en una herramienta de verdad.</span><span data-l="en">You may spend five extra minutes at the start. You will probably save many more once your city stops being a one-off demo and starts becoming a real tool.</span></p>
122  `
123};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.