JOURNAL

The Journal

Notes the AI takes at the close of each session: what was requested, what was corrected, and where the AI got it wrong. Written by the AI; quotes checked against what was typed.

Working protocol with AI agents

8 sections

A standardized technical process for running several AI coding agents (Claude Code) in parallel: per-agent isolation, a record at the close of every session, context-cost control, backup and security. It includes the web layer that organizes, edits, publishes and exports the documents the process produces.

1. Architecture: one agent per directory

  • Unit of work: one directory is one agent, with its own startup context (CLAUDE.md) and its own persistent memory. No agent reads another agent's memory.
  • Two instruction levels: global memory (the user's rules for every agent) and per-project memory.
  • Per-project memory: one fact per file, with metadata (name, description, type) and four types: user, feedback, project and reference. A one-line-per-entry index is the only part loaded on every request; topic files are opened on demand.
  • Memory is bound to the directory the session is opened from, not to the repository: opening the same project from two paths produces two independent indexes.

2. Artifacts recorded per session

artifactpurposeformat
Startup context (CLAUDE.md)What the agent reads on startOnly what causes a failure if unknown: rules, deployment traps, closed decisions. Capped at 13–14 KB; reference material moves to docs/ and leaves a pointer
ChangelogChronological indexOne short entry per session; no detail
Session fileFull recordSummary · files modified · files created · decisions · deploys · tests · lessons · open items
Decision record (ADR / D-NNN)TraceabilityContext, decision, author, date and which earlier decision it repeals
Professional logEvidence-backed professional profileIn English. Per session: Direction & Decision-Making · Technical Strategy · Creative · Areas of Opportunity · Cumulative Profile Update. Records decision patterns, not lists of deliverables. Source for the skills map and the CV
Development treeInventory of real state per branchStates, one line per feature (see below)
Performance buffsThe agent's operating manual toward the userBehavior → amplification → effect (see below)
MemoryFacts that persist across sessionsAbsolute dates; an existing file is updated before a duplicate is created

Development tree. Allowed states:

statemeaning
[x]shipped and verified in production
[~]shipped, end-to-end test pending
[!]blocked, open bug or anomaly
[ ]not started
[-]deferred or retired, with the reason on the line

Rules: one line per feature, 60 characters at most, with the session suffix (Sxx); two heading levels at most; a feature that spans branches is listed in each. The close applies incremental deltas; the tree is never rebuilt.

Performance buffs. Each entry follows the sequence: user behavior → how the agent amplifies it → effect on the user's cognitive load. Categories: pacing, communication, execution, verification and debugging; an anti-patterns section; a last-reviewed line. If the session revealed no new pattern, the file is left untouched. It does not duplicate the professional log: that one observes for the record; this one states what the agent must do.

One source per document. Each document exists as a single markdown file; the web version and the PDF are generated from it. An automated test compares the SHA-256 fingerprint of the source with the one recorded at the last generation and blocks the deploy if they differ. It removes drift between versions of the same document. This protocol is published that way.

3. Standardized session close

  • One local skill per agent, with a unique name (cierre-<agent>) and never the name of a global skill: when names collide, the personal skill takes precedence over the project one. Invoked from another agent's session, the name does not resolve, which works as a guard.
  • Common skeleton, fixed order:
stepcontent
0Smoke gate: paths tested, with evidence. Blocks the documentation
1Changelog
1.xDevelopment tree
2Session file
2.xProfessional log, performance buffs and decisions
3CLAUDE.md: the history keeps only the latest session; over the cap, the close warns and does not trim
4Memory
5Commit by path; push per the repository's policy; without git, the backup state is reported
6Report with evidence
  • Each agent's own steps are derived from evidence in the repository (its CLAUDE.md, its latest session files and the records of its previous closes), not from a template. Each step cites its source.
  • How the closes are produced: one read-only subagent per directory drafts in parallel; a mechanical check covers name, size, banned terms and sections; installation is a commit limited to that path.

4. Context audit and token-cost optimization

  • Cost model: every request resends the full context (instructions, CLAUDE.md, memory index and conversation history). A session's cost is the sum of the context of all its requests.
  • Measurement: from the sessions' JSONL logs, deduplicated by requestId (streaming leaves ~1.7 entries per request). Metrics: floor, average, maximum, total and number of compactions (compact_boundary).
  • Targets: CLAUDE.md ≤ 13 KB; memory index ≤ 17 KB and ≤ 135 lines. Above ~24 KB the index is truncated when read: paid in full, not read in full.
  • Trim by relocation, never by deletion: reference sections move to docs/ with a pointer; a line-by-line check then confirms that all original content exists in some destination and that no reference is left orphaned.
  • Compaction window: the model alias was found to have moved to a 1M-token window, with automatic compaction near 967K. Sessions of hundreds of requests were measured with zero compactions and peaks of 900–965K. Countermeasure: an explicit cap (autoCompactWindow), validated by counting compactions in the log. Estimate with a 300K cap: average context per request drops from ~500K to ~200K (≈2.5×).
  • Operational hygiene: read ranges, not whole files; subagents return conclusions, not content; the tool set (MCP) is not changed mid-session because it invalidates the prompt cache (one measured invalidation: 332,903 tokens); coordination between sessions by messaging was discarded on cost.
  • Measured proportion: trimming CLAUDE.md accounted for ~1% of the spend; the dominant factor was the uncompacted window.

5. Web platform for document organization

  • Structure: document repository by project → section → document, with a viewer.
  • Source of truth: the disk. One-way publishing with a distribution manifest and change detection by SHA-256. A guard compares the local copy against the remote before publishing, so an outdated copy cannot overwrite what is published, and aborts if it cannot read the published state.
  • Four publishing modes: text (markdown to database), file (self-contained HTML to object storage), binary (PDF or image, untransformed) and folder.
  • In-browser editing: edits are saved as drafts; publishing is a separate privilege. Documents can be created from the browser. Publishing commits automatically to the private documents repository.
  • Server-side PDF generation through an API-driven headless browser.
  • Share links with access control and expiry; printable as a QR code.
  • Site content: compiled text as the floor and an editable patch on top; each section's visibility is data (a flag), not a code branch.
  • Operational modules: calendar of events and open calls (with source, text and notes), contacts directory, and outgoing mail with blind copy and a sent log.
  • Documentation map generated from counts read from disk, with a verifier that fails when the map no longer matches the files.

6. Interactive editing and automation of professional documents

  • Editor with a live preview of the real PDF next to the full document, with a page counter.
  • Symbolic deletion: text is struck through, not removed; each mark follows its text even when the text moves.
  • Named variants: create, duplicate, publish and delete; one published per language; entries and bullets reordered by drag and drop.
  • Layout engine: primitives shared by the web renderer and the PDF renderer; blocks that measure themselves and return a stroke plan; region-based fitting that never truncates silently; a schema with mixed tokens (millimeters and fractions), regions, page papers and ornaments, validated per layout.
  • Per-document settings: destination, layout, palette, target and colors; insertable cover pages.
  • PDF with real hyperlinks (annotations). The public download honors the layout of the published variant.
  • Generators from markdown: reference document with cover, presentation, and PDF printed by a headless browser with reduced motion; three visual dialects derived from the same design tokens.
  • Automated tests that read the text of the generated PDF (ToUnicode map decoding).

7. Backup and security

Backup

  • Private repositories. Content (md, html, scripts) is versioned in git; multimedia stays out through .gitignore.
  • Derived and binary files in private storage with no public domain, with the inventory kept inside the storage itself; restoring verifies file by file against its hash.
  • A backup counts only once verified: files on the remote = versioned files.

Security

  • Secrets and credentials kept out of the repository; one key per product, so revoking one does not affect the others.
  • Writes to another project's production database only with the user's explicit authorization in the chat.
  • In repositories shared between agents, each commit includes only the agent's own paths.
  • The organization of security is not described in this document: publishing it represents a vulnerability.

8. Failures detected: continuous learning

«Se vale fallar, eso me ayudó a perfeccionar este sistema». — Marco Francisco

detectedcountermeasure
A single close template applied to different repositories: nonexistent steps marked N/A or run falsely; 5 of 11 agents with an unclosed sessionPer-agent close, with steps derived from its own evidence
Documentation drift: a capabilities document 52 sessions behind the canonical manualOnly the manual regenerated at every close is cited
Loss of qualifiers when compressing a rule («hasta verificarse», until verified, was dropped)Check against the original text when trimming
A configuration assumption invalidated by a model change (alias with a 1M window)Validation by measurement, not by declared configuration
Zero-coverage checks; recursive searches that skip files ignored by git or detected as binaryEvery check reports how many items it examined; searches force text reading
3 of 11 directories without external backupPrivate git, content only
Memory bound to the directory of origin: two indexes for the same projectThe audit covers every memory directory

What I bring

4 areas

Technical direction

Browser-based 3D enginesPlatform architecture (monorepo)Real-time shaders & rendering3D pipeline (Meshy→Mixamo→Blender)Cloudflare edge (D1/R2/Workers)Security & auth (2FA)Diagnosis by observation

Product & business direction

Reframe-to-systemViability as a gateRobust over fastNothing hardcodedSunk-cost immunityDeliberate monetizationInfra by real riskLive monetized product

Creative & art direction

Cinematic vocabularyReferences as specificationGame-feel / diegeticColor & light as languageNaming as world-buildingFidelity as a contractHistorically faithful, inclusive content

Process & AI orchestration

Clinical bug reportsControl-case debuggingOrchestrating parallel agentsProcess as infrastructureReverting without egoPhase-gated authorizationTesting on real devices

The log

82 entries

He asked for every parameter to be connected at once and accepted the cost

Every engine parameter was supposed to react to the hits from his animation app, and until then they were being connected by family. He opened the planning with the problem: «Esta planeación viene de una incomodidad… se volvió un cuello de botella: ahora qué familia, ahora qué parámetros de esa familia, y solo de ciertos parámetros. No es la idea». When the first progress covered a single effect: «no quiero ver mockup de cada parámetro porque volvemos al cuello de botella», and he proposed the method: «listame los tipos de parámetros, sobre ese listado se implementarán estados por barrido, en bulk». The AI warned that the first stage grew and touched eight components at once. He answered: «Acepto el costo: quiere decir que es más robusta la implementación, y recuerda: Robusto es mejor». The sweep produced 39 sheets and 416 parameters: 221 connectable and 195 greyed out, each with its reason. In the next session all 39 were connected.

He asked whether the file carried enough for the engine

His animation app exports a file that the engine reads. Reviewing it, he asked: «¿exporta estados?? ¿ida y regreso??… eso debe exportarse». Two hours later, with the engine about to let any parameter react through states, he came back to it: «¿Viene la info suficiente de esos estados?… duraciones, si es loop, si se mantiene un estado hasta el siguiente teclazo, si tiene curvas». The review found that states triggered by a key already traveled in the file and cycles did not. That afternoon the stage that exports them was built, off by default until the engine accepted it; it accepted within minutes. In the check, across 360 frames, the largest difference between the cycle in the file and what the exported video shows was 0.0092, the video's own noise.

He barred agents from reviewing folders that are not theirs

In the session for his own game, the agent opened the engine's code on its own. He stopped it: «No te corresponde revisar el código del motor». Three minutes later, in his web studio's session, he asked for it to be saved as a rule for everyone: «cada agente generado solo debe trabajar sobre su carpeta designada». The reason, in his words and in the third person: when an agent analyzes other folders, «Marco queda con desconocimiento de control y enfoque por cada carpeta». He left a single exception, his studio's agent, and only by assignment. The rule became the first work rule in the global memory every agent loads. That night came the first assignment under the rule: six named files and a cap, «abusado con leer todo, no quiero gastar tokens a lo bestia con esto». Of the engine's technical manual, about 660 KB, only six sections were read.

He took the first person out of his method and kept the failures with their numbers

He asked for his method of organizing and recording work with AI agents, session by session, to be documented. The first draft opened with what he had built and was written in the first person. He corrected it: «no hablamos de ningún proyecto, este es un proceso técnico estandarizado, no se hablará de proyectos en específico». On the wording: «Tú dices que yo aprendí, yo digo que se indica "se detectó" y luego toda la prosa va por ese modo». The AI recommended dropping the failure counts, which a reader could take as rigor or as carelessness. He answered: «no soy dev, "se vale fallar, eso me ayudó a perfeccionar este sistema" es un aprendizaje continuo». The section kept that line as its epigraph and a two-column table, what was detected and the countermeasure, with the counts: 5 of 11 agents with an unclosed session, 3 of 11 directories with no external backup.

He asked for the text to be backed up, not the media

While a session close was being prepared for each agent, three project folders turned up with no backup of any kind. He answered folder by folder: one stays on the local disk only and two go to backup, with a question: «¿se puede en git?». Then he scoped what goes in: «necesito respaldo solo de contenidos, no de assets, normalmente las carpetas assets son git-ignore, ya que son multimedia», and in the next two messages: «solo textos, información, estrategias» and «htmls, mds... ese tipo de cosas». Each folder went into its own repository, with a list that leaves out images, audio, fonts, archives and PDF. From a 993 MB folder, 109 files went up, 5.5 MB; from a 185 MB one, 87 files, 1.9 MB. The check against the disk gave 109 of 109 and 87 of 87.

He asked for each agent to close with its own steps

Closing a session, the close command loaded the global routine, written for another project: when two routines share a name, the personal one wins. He asked twice: «¿por qué global??». At the end of the next session he left the order for the one after: «comienzas a asignar cierre de sesión ya no global sino por agente». The review found seven agents closing with the global routine, 18 KB of steps about the engine that mostly did not apply to them. Eleven closes were installed, one per agent, each with its own name and the steps of its own folder. Typed in the wrong session, the command does not exist.

He vetoed coordinating the agents by messaging, on cost

Eleven agents were each going to get their own session-close routine. The AI announced per-folder drafts and a review round before installing them. He cut it: «¿Te piensas comunicar por agente?? No lo hagas, eso gastaría muchos tokens y se va a volver un cuello de botella nefasto, solo impleméntalo». The eleven closes were installed that same afternoon, with no review round and no messages between the agents' sessions.

He asked for the single-source rule to be written down

A public document was going to exist in two forms: as a section of a page and as a downloadable PDF. The AI proposed generating both from a single markdown file. He approved it and asked for the rule to be written into the document itself: «Dale a ese markdown, ¿hacemos mención de esta dinámica también para la documentación? Es importante, resuelve no tener documentos con información diferida con el tiempo». An automated test compares the fingerprint of the source with that of each output and blocks the deploy if they differ; with the source edited and not regenerated, it reported 18 of 20 and did not deploy.

He chose the context cap with the arithmetic in front of him

A measurement over his session logs showed requests of up to 965 thousand tokens of context and sessions of hundreds of requests without a single compaction: the model had moved to a one-million window and the previous setting no longer capped it. The AI laid out three caps with their arithmetic — 200, 300 and 400 thousand, with the estimated spend and the compactions of each — and recommended 300 thousand. He answered: «Sí, ponle 300K». The cap became a global setting for all of his agents.

He separated the general from the particular

Over one afternoon, the details of a single design — the colors of an animation on a light background and twelve questions from another agent — had turned into engine work, options for him to choose from and a new version of the manual. He stopped it: «la instrucción de mi parte es: haz esto, diseña unas animaciones, con estos parámetros para que los lea mi engine… todo se resuelve a nivel general, no resolvemos particularidades, esas las detecto yo y las resuelvo con mi criterio, estamos perdiendo horas de trabajo por cosas que no valen la pena». In the next message he set the goal: «resolver las dudas… hasta tener un manual que no implique la intervención del agente… para crear layers animados». On the third round, the other agent rebuilt its screen using only the manual and reported zero questions.

He corrected what his app was being measured by

The AI had assessed one of his animation app's open items by how smoothly the preview played. He corrected it: «para proyectos de motion no me interesa tanto la visualización en tiempo real, lo que me interesa es tener bien identificados los hits, esos van a determinar las animaciones y cambios… ¿estamos en la misma frecuencia??». That item, and another that only affected the preview, were parked. One that did change the final render moved to the front: a sequence with transparency that came into the app darker, with thinner lines, than at its source. The fix was built that same night; on the measured frame, the edge difference dropped from 41.7 to 10.1 levels.

He stopped the research outside the manual

The job was to build animated screens for one of his projects using only the manual the engine has for that: the test was whether the manual was enough. While the AI was opening, on its own, the code that had generated the reference backgrounds, he asked: «el ejercicio es revisar el manual de creación de screens… y crear de ahí los htmls, ¿estamos haciendo eso?». Three minutes later he stopped it: «ese manual es para cualquier AI… Si investigas por tu cuenta me estás afectando directamente: el manual es la biblia: Nada Más!!! Si hay cosas que no entiendas de ese manual solamente, se lo hacemos saber». The doubts went as a list to the engine's session: twelve in the first round. In the third, the loading screen came out of the manual alone, with nothing guessed, and fourteen doubts had been resolved inside the manual itself.

He asked for a number below what had been verified

One of his animation tools has a capability sheet where only what has been verified in the app counts. Checking it against what was published, the AI found “61 formats” on a live page and in three documents, while the sheet verified up to nine formats at once. He answered: «¡exacto! No sé en qué pinche momento se desvarió a 61 formatos. Dale más de 5 formatos simultáneos». “More than five simultaneous formats” replaced the figure everywhere public. The deployed site ended with zero mentions of the old number and fourteen of the new one.

He ruled out the fix that cost him the image, and spotted the next bug

The videos in his virtual room wouldn't play on Android, and the AI kept answering from an old screenshot. He corrected it: «te dije que revisaras mis parámetros, ya están guardados así desde hace rato y no los reproduce mi Android». He tested the hypothesis of turning bloom off and ruled it out: «se ve triste sin bloom todo, no lo hagamos otra vez». The cause was in the saved data: the panel said “Siempre en móvil” and the saved value, “Auto”. With bloom on, the video played, and in that same message he reported the next bug: a still frame of the video that, as he got closer, «parece como un espejo, se mueve conforme me muevo yo».

He stopped a wrong build by explaining the craft

He was handed particle meshes built on a different idea. He didn't list defects; he explained the concept: «¿por qué consideras que superficie de agua y nube sólida son partículas tipo Form?? originalmente este tipo de partículas forman mallas, los shapes debieran ser la base, repetirlos en z y deformarlos es lo que los vuelve interesantes». And before going any further: «es importante primero estar en la misma línea». From the rejected work he kept what was useful: «déjame agua y nube como parámetros de partículas, me gustan esos presets». The meshes were rebuilt around repetition, in a panel of their own.

He isolated the failure and reproduced it where it shouldn't happen

A scene wouldn't load on his phone, and four hypotheses drawn from the code had already fallen. He separated the problem: «antes de que conjetures: varios biomas tienen las cosas que desactivaste… y cargan… según yo la bronca no es el link, es la transición desde “iniciar experiencia” a montaje de bioma donde se rompe». Then he supplied the fact nobody was looking for: every new scene is born with bloom off on mobile, and he had switched it on by hand right when he tested the direct link; «algo me dijo: mira we, activaste el bloom, entra desde el menú». He turned it off on his iMac and the failure showed up on desktop: «ahlaverga apagué el bloom desde desktop y valió madre, esto es un screenshot de iMac!!». It was not a mobile bug.

He traded a slider for named behaviours

For the dust that reacts to light, he had accepted a slider blending two looks. Mid-build he cut in: «Espera, ¿podemos obtener diferentes comportamientos mejor? Es lo más adecuado». The slider moved a number between two states; what he asked for were distinct behaviours. He chose four — revelado, estela, agitadas, atraídas o huyen — and chose to make them stackable.

He wouldn't let a measurement become a limit

He measured how many lights his installation laptop can take: the breaking point came out between 12 and 16, against 48 to 64 on the development Mac. The AI began treating that number as a cap the engine would enforce. He stopped it: «Ashur debe poder crear sin esta presión… es meramente informativo el test, yo decido entonces que mi instalación digital debe usar hasta 16 luces por escenario… ¿Cachas lo que quiero lograr? No limitarme». Lights were grouped into switchable sets, and each machine's profile only warns.

He rejected how the music played, citing how he edits

The music in a scene started playing as soon as he entered the editor, as a separate element that didn't follow playback. He explained why it didn't work: «¿Por qué no sirve este approach implementado? porque no puedo dirigir la narrativa del cutscene, verás, me guío principalmente por la música cuando edito videos», and that way he couldn't «determinar el momento preciso en el tiempo donde va cierta parte del track e insertar composiciones visuales ahí». Audio was rebuilt to move with the timeline, and when he tested it he confirmed it behaved as he had planned.

He said what he didn't know, and authorized the fix once he saw the evidence

To stop testing blind how to wire a scene, he asked: «mejor genérame el json para importarlo directo… y lo estudio en vez de estarlo tanteando». Importing it left his scene pointing at the new graph, and his own seemed lost. He reported it without making up a version: «no guardé los cambios cuando importé tu json… o más bien le di guardar inconscientemente». His graph was intact in the database. With that in view he authorized: «hazlo tú por SQL y borra el grafo importado».

He corrected an assumption the AI had written into its own code

While composing a scene, he noticed that giving a character a second action duplicated it on screen. He put it this way: «un grafo que determine acciones en vez de performers diferentes arreglaría este conflicto, los grafos determinan estados de personaje, no los personajes en sí mismo». The opposite premise was written in a comment in the code: that two clones of the same model were the normal case. Since then, dragging the same character in again takes it to its own track.

He told the speed of a strike apart from the gap between strikes

The soldiers in a battle were striking too fast: «pegan chingo rápido, ni van a disfrutar sus golpes». When the AI started checking whether the animation itself could be slowed, he narrowed it down: «no busco velocidad de animación, busco más espaciado entre cada chingadazo, creo que eso sí existe». It did exist: the wait between strikes lives on the weapon, and the sabre was set to half a second.

He asked for tools, not copies of his references

He brought a folder of lighting references and didn't ask for any of them to be reproduced: «necesito más que la implementación directa, los tools que me permitan realizar ese tipo de efectos». When the questions drifted toward specific images, he said it again: «Te recuerdo que pienses a nivel general, herramientas que generen no solo este tipo exacto de ejemplos, sino variaciones a través de la integración de parámetros varios y controles varios». The first finding was that the editor gave him no control over the scene's light, and that was built before anything else.

He rejected the fix offered and named the better problem

Offered a higher brushstroke cap, he answered: «no necesito más brochazos, necesito implementar una sola textura por lado de la estructura… incluyendo curvas si se selecciona pared completa». The proposal treated the symptom — running out of strokes — as the requirement. The requirement was that covering a surface should not be a manual operation at all.

He described the dialogue camera in film grammar

«Es la idea cinematográfica de las conversaciones.» He described the behavior he wanted — forward and back, no 270-degree swing — without naming the 180-degree rule, which is exactly what he was asking for. He reaches for cinematography vocabulary when the problem is cinematographic.

He specified the fix at the level of the model, not the UI

«Que todas se estilicen por un solo control, no controles por línea de diálogo. 2: que se integren por casillas numeradas. ¿Cachas hacia dónde voy?» Two sentences containing the grouping key, the cardinality and the addressing scheme. The implementation had almost nothing left to decide.

He chose the more expensive option, and cited the principle by name

«Opción B papá, recuerda: decisiones robustas siempre, las mejor integradas y planeadas.» Option B cost an extra deploy; he took it without discussion. He cites the principle rather than re-deriving it each time.

He asked whether the feature needed building at all

On per-biome loading screens: «CREO que no hay que implementar nada, confírmame que esta afirmación sea real.» He tested whether the pieces that already existed composed into what he wanted, before authorizing new surface area.

Retired his own tooling on cost, and protected one by name

«Borra de sistema social media y terminología, no funciona como espero, y no me sirven, gastan tokens.» Two systems he had commissioned himself, with months of accumulated output, deleted without hesitation once the cost stopped adding up. In the same message he protected a third: «pero continúa professional logs, ese ha sido excelente.»

He asks for the concept, not the conclusion

«Luego me lo explicas un chingo más entendible pero no tan simple, solo quiero entender.» The qualifier is the instruction: he is not asking to be shielded from the mechanism, he is asking for it stated well. Over-simplifying fails the same way as not explaining.

He brought the measurement, not the complaint

«Estoy llegando al límite de mi uso semanal mucho antes del martes, necesito que realicemos unos ajustes sobre este diagnóstico» — with the report pasted in. He did not ask what was wrong or ask for reassurance: he brought the measurement and asked for the fix. The report is what identified the cause.

He turned an accident into a work arc

«Descubrimiento mamón: comencé a caminar y a correr con encuadre de acercamiento activado y woooowww!!!! Quiero poder grabar esos encuadres y poder asignarlos como vista default del personaje.» He was testing one feature, noticed an emergent property, and specified it as a separate capability. Then extended the scope himself: «una toma guardada debe estar disponible en todos los demás biomas generados.»

He rejected a constant standing in for a decision

On the approach camera: «El desde quién se encuadra, que siempre va a ser mi player, me parece un tanto hardcodeado.» He accepts a default; he does not accept a constant standing in for a decision that belongs to the designer.

Killed a whole architecture in one word, then handed over the correct model in the same message

After the AI shipped a conversation camera built on the wrong system: «MAL. No es lo que se buscó nunca. Desde el panel del personaje, se asigna la toma… esta no es una toma, es un acercamiento seteado por developer, este acercamiento existe solo durante la conversación, si se cierra o termina se aleja la toma nuevamente.»

Five sentences, and every one is a design constraint: where it's authored, what it is, how long it lives, who else has one, and what a dialogue fundamentally is. Second consecutive session where the rejection carries the correct answer inside it.

Framed the request around how he actually reads

«estás en plan mode, normalmente leo de pasada y medio entiendo, ahora genera el plan y al final dime de la manera mas sencilla, así como yo te explico mis ideas de implementaciones.» He named his own reading behavior as a constraint on the output, and set the register by pointing at his own. The target wasn't «simpler» — it was his voice.

Suspected a mechanism he had no way to read, and was right

On behavior rules: «estuve seteando un when someone of team player within 2m then face pero tengo varias chinacas merodeando, esto implicaría que se voltearían a ver entre ellas no es así?» He inferred, from the semantics of the control alone, that a side-scoped proximity condition can't tell allies apart. He was right.

Called out instructions describing an interface that didn't exist

«cómo voy a duplicar esta caja y cómo le asigno sus nombres? o es duplicar el screen entero? esa no es la idea.» He was right on both counts: there was no way to duplicate, and the replicas came out identical with no way to tell them apart. He opened with «vamos paso a paso porque no eres muy descriptivo» — the accurate read: the AI had been narrating outcomes instead of steps.

Rejected an entire architecture in one sentence, and named the right one in the same breath

«se vé terrible, revierte esa implementación, la función original era la adecuada, solo lo hace de golpe, solo era fadear bien cabrón player cam to cinematic cam and back, solo eso.» A verdict, the reason, and the actual requirement. The last clause is the whole spec: the original model was right and only lacked duration. He didn't need to know any parameter to know it was a cut and not a transition.

Described a bug at frame resolution

«alcancé a detectar que es el turno dos el que aparece de putazo por 0.3s antes de que termine de desaparecer turno 1, desaparece y luego ya fade in de turno 2.» That sequence — appears, disappears, then fades in — isolated the mechanism from the visuals alone. Fifth consecutive session where his bug report is the strongest lead available.

Called in an old debt with the receipt attached

«desde que integramos el primer personaje hardcodeaste una pinche ficha toda horrible que nunca hemos quitado… es descriptiva del personaje que se acerca al player, sucede con todos.» He identified when it entered, what it is and its scope: a piece of scaffolding he had tolerated for 111 sessions, surfaced the moment something real landed on top of it.

Refused to let the engine bake in a design decision

Told the dialogue box anchors to the head, he immediately saw the failure case — a kneeling soldier's head isn't at head height. Instead of asking to auto-stand him, he asked for composition: «debo contar con un within Nm, the action y poder añadir otra acción de posición: and then Idle, esto obligará a pararse y face to player.»

When the AI offered «se vuelve a sentar» as the default on walking away, he interrupted: «no espera, si el personaje se aleja y termina la conversación, arquitecto define cuál será la acción… eso es seteable por arquitecto.» He caught the other half of the rule about to be hard-coded.

Named the constraint and asked for the solution in the same breath

«tal vez no sea eficiente ya que un cielo que dura desde las 8pm hasta las 5am no podría visualmente acomodarse manualmente no es así? resuélvelo inteligentemente.» He identified that a range wrapping past midnight breaks a linear slider, admitted he didn't have the answer, and delegated explicitly. A circular dial came out of that; «give me a slider» would have shipped the broken linear one.

In the same session he reversed his own decision on cost, within one turn: he chose eight sky materials and immediately — «al parecer 8 texturas seteadas va a ser un peso considerable… reconsidero mi decisión a solo cuatro para optimización.»

Rejected verbosity in the product, not just in conversation

«borra el texto descriptivo indicativo que integraste en ese control» — the explanatory paragraph the AI had put under an editor slider. He wants controls that read at a glance; explaining is the conversation's job, not the panel's.

His confusion is a signal about the system, not about him

«ando muy confundido con los controles» and later «explícame las horas, no le hallo». Both pointed at real gaps: the second surfaced that the editor clock was pinned to a fixed hour, so anchoring skies to hours he couldn't see was guesswork. He asks the clarifying question instead of assuming the feature is broken, and the question lands on the actual defect.

Two halves of the same bug class, closed sixteen sessions apart

He reported that character feet were sinking into the ground. The symptom had already been closed twice, sixteen sessions earlier, but this time the mechanism was different. It was measured on his biome before touching anything: 27 cm average, 1.08 m at the worst point — 60% of the character's height. It surfaced now because he lowered the terrain detail chasing the low-poly look of his screenshots.

Handed over his browser at exactly the right moment

«smoke tests paso a paso o... puedes hacerlo tú? te acabo de dar accesos a chrome.» Four sessions of deferred tests, and one message that converts them into work the AI can do. The delegation was scoped by the tool he granted.

And when he decided not to test, he said so: «arre testeo en la siguiente sesión». He closed the session knowing five features were unverified. That is a decision, not an omission.

His measurement killed the obvious mitigation

After a mobile performance collapse, the AI offered two discriminating tests. He came back with the one that mattered: «en extensión a 100 igual se llegó a trabar.» That number invalidated the cheap fix — shrink the plane — and forced the correct model: the cost is pixels on screen, not meters in the world. He didn't argue the theory; he produced the datum that broke it.

And in the same message he derived the solution: «Me diste una idea excelente: ¿qué tal si no quiero el espejo sobre todo el bioma, quiero trazarlo?» He turned the physical explanation into a feature that is simultaneously the performance fix and the better composition.

Split one control in two because they answer different questions

«Dame control de resolución… de manera individual: desktop y mobile, de esa manera aseguro max comp quality para desktop, y enough quality para mobile.» Not «make it configurable»: he named the two distinct intents and demanded they stop sharing a knob. A single number that forces a tradeoff is a design flaw, not a simplification.

He corrected his own word and killed the work that word had invented

«Neones, no LEDs — elimina la conjetura de los puntitos, lo comuniqué mal.» He had said LEDs a session earlier, and from that word the AI had derived a whole feature he never asked for: strips of dots. In one message he renamed the concept, took the misunderstanding as his own, and deleted the phantom scope. Backtracking on your own work is rare enough; deleting work that exists only because of a vocabulary accident is rarer.

He stopped the trickle of one-off effects and asked for the editor that holds them

With a folder of lighting references already analyzed and three pieces delivered one at a time — floor reflection, translucent emissive, haze — he changed the scale of the request: «las composiciones visuales de estas instalaciones tienen un común denominador: composiciones abstractas… no quiero herramientas separadas para hacer una sola cosa, quiero un editor de instalaciones digitales. ¿Comprendes el alcance?». He asked for the plan to start from «lo que ya tenemos construido para no repetir cosas». The plan came back as a single editor inside Modo Arquitecto.

He worked out where to hang an info card and how to open it from a phone

A maguey field needed an info card and there was no object to hang it on. He proposed a null, an empty object, placed «en una cima con vista agradable». When he couldn't open the card in-game from his phone, he said how it had to work: «Veo que cableaste a un click, yo estoy testeando en mobile, debe de poder activarse como cuando recojo un arma, mi botón de ataque cambia a acción». Now, near a card, the attack button changes its icon just as it does with a weapon.

He asked for the cause of the anomalies, not a fix for each one

The AI came back with a list of anomalies in the mobile scene. He sent it back: «no me interesa que resuelvas esas en específico, lo que me interesa es saber por qué existen esas anomalías, identificar qué es lo que hace que existan». To check some campfires that looked upside down on the phone, he moved the camera below the terrain: «ya no es invertido, creo que están como embarradas en X, a nivel de piso pero siguen debajo del nivel del piso». That description was the exact signature of an adjustment the AI itself had made, and it proved the old code path was still running.

He turned a loading wait into a chosen frame

When a scene opened, the camera sat staring at a wall while it loaded: «siete-ocho segundos es too much el usuario se pierde». The AI proposed having the camera frame the scene on its own from the player's spawn point. He asked for it differently: «Camera starting point hay que setearlo desde modo-arquitecto, así me aseguro que la composición sea la adecuada y no sea random, independientemente del tiempo que cargue el escenario». Each scene's opening frame became an editor setting.

He rejected a graphic patch and said where the direction had to live

The radar's first pointer had a white dot on its tip so you could read where it pointed. Asking for variants, he named what didn't work: «lo que no me gustó de la v1 fue que le pusiste un dot blanco en la punta del triángulo para acentuar dirección, bastaba solo con hacerlo desde el mismo shape del triángulo». The dot was compensating for a silhouette that didn't show its front. The six new shapes mark it with the outline: a notch, a flat base, the angle of a chevron.

He stopped the session in time and left the door open with a joke

«le paramos un rato? necesito avanzar con defensa de puebla, o quieres calarle unos ajustes más.» He offered a choice instead of cutting, and named his real priority without dressing it as something else. The sign-off was «si sale te compro unos chetos». Second session in a row where he stops for a deadline of his own, not out of frustration with what's being built.

He held his description against the AI's hypothesis, twice in one session

The AI blamed the transition for a veil that interrupted the scene change, and he held his ground: «Mira, no te lo estoy diciendo a la ligera, el velo se caracteriza por un círculo delgado de carga, ese está hardcodeado… no estoy loco». He was right, and hours later his description of a weapon floating in mid-air also led to the real cause. At the end he said it: «normalmente haces tus conjeturas y detecto que trabajas a lo wey, cuando aun sin ser dev, puedo identificar y expresar lo que considero que pasa en mi sistema». The AI saved it as a rule: his report is the first hypothesis to trace.

He specified the game's boot sequence as a stack of layers

On entering the game you could watch everything assemble: the menu arranging its text, the scenes loading. He specified it as a layer order: on top, «Fade in, velo negro, universal, no configurable, hardcodeado, imagina que es un layer, va hasta arriba y solo existe los primeros tres segundos al abrir la web app. Inmutable, nada encima de él»; in the middle, the main menu; at the bottom, the biomes. Then he set the one dial: «Dos segundos es suficiente, tres es too much, pero no quiero errar». The veil became a value from one to three seconds, two by default.

When he's annoyed, he names the pattern, not the incident

«ya estas pensando en hardcodear... muy muy mal... te mama hardcodear, no es nuevo.» The second half is what makes the sentence different: he isn't flagging today's mistake, he's saying he's seen it before. That same day an automated email went out from the wrong project toward an institutional proposal, and the reaction had the same shape — unambiguous annoyance, with the instruction attached on the same line: «detalla esa pinche lógica».

Found a data-loss bug by testing the product as a client, from his phone

He didn't open the dev panel: he opened the link over WhatsApp, on his phone, filled the fields, uploaded photos, closed it and came back. Then he reported what he saw: «solo se guardaron mis fotos, la info que guardé se borró». Not «it's broken» — he separated what survived from what didn't, and that separation pointed straight at a race condition. The automated test ladder had missed it because it runs its steps in order, and the bug only shows up when two things happen at once.

Handed deploys back the moment the blocker cleared

He had taken deploys over himself a few days earlier, when a credentials problem left the AI going in circles. Once it was resolved he handed them back without ceremony: «Correlo tú, solo lo implementé porque te vi atoradísimo el día de ayer». He didn't keep it as a precaution or turn it into a new policy.

He rejected three drafts of his journals until the register was right

He read the first draft of his development journals: «mira tu modelo tiende a maquillar el lenguaje bien cabrón, a integrar slogans cuando nadie los pidió». He asked for «una prosa muchísimo menos maquillada, más práctica, real, honesta. Parece como si fuera post para LinkedIn: falso». Of the second he asked that it not be «un diario de la princesa y sus aventuras de desarrollo»; of the third, the «punto medio entre dev y creativo visual». Of the fourth he said: «¡Esto es lo que busco!».

Directs the interface in motion vocabulary, not software vocabulary

«blureálo 200%», «fusión de layer tipo Add», «que se queme como After Effects Glow», «filament detrás del botón, no debajo». He doesn't ask for CSS values or property names: he names the result in the terms of his craft, and they're precise enough to translate into a concrete adjustment and iterate again. The distinction between «detrás» and «debajo» is a position in the layer stack, not a preference.

He caught the example becoming the product

He specified an animated-graphics system in the terms of his craft: «como shapes de After Effects, baratos», animatable in position, rotation, scale and opacity, with blur and glow as effects. At the end he listed what he could make with it: lightning strikes, flashes, explosions. What shipped was explosions. Ten hours later: «Creo que hardcodeaste animatics, era un editor de animación de gráficos sencillos, pero tú diseñaste explosiones».

His jokes carry the requirement inside them

«necesito paz para pues... trabajar» was an exact technical request: freeze the simulation without freezing the camera, because everything moving in the background kept him from framing a shot. «chinaca ya recoge bien sus armas» was the confirmation that a picked-up weapon respected the calibrated scale. The light tone doesn't dilute the data — it carries all of it.

He turned down reviewing code he can't read

Before wiring in a new behavior system, the AI offered to let him review the foundation first. His answer: «No serviría de nada revisar el cimiento, ya que no sé ni madres de desarrollo, así que es completamente absurdo». His checkpoint is somewhere else: trying it on the device. The AI recorded it that way: he gets something to test, not code to read.

His battle concept came from a game that marked him, and from a question he asked himself

«vengo del elden ring, quedé mamadísimo con su sistema de atributos.» That's where the attribute system came from. The «teatro» idea was different: he asked out loud «corren al encontrarse?» and answered it himself — the characters choreograph the fight in the background until the player steps in. Nobody proposed it to him. It showed up as the answer to his own question, a few messages after he asked it.

He rejected a name in two words, and had a structural reason

The AI had named a tool after the use case he'd just described. His full reply was: «escenario menú? que horror». It sounded like personal taste and it wasn't: that same tool was also going to serve level extensions and variants, so a menu-bound name would have been wrong in the code forever. He protected the piece's generality better than the one writing it.

After three rounds of not understanding each other, he treated the collaboration as a system with a bug

The AI had built the character inside the biome; he pictured it as a menu asset. Three attempts, three misunderstandings. He didn't correct the fourth one: «debemos trabajar en un modelo de comunicación que nos permita entendernos desde el primer momento». And he supplied the diagnosis, which splits the responsibility in two: «expreso mal lo que quiero, y tú entiendes lo que te hace lógica».

He called it a «comodín», an idea a programmer wouldn't have had

One base geometry that gets dressed in several ways and baked as different variants: the same piece comes out in marble, in igneous rock, or covered in vegetation. Model once, dress many times. It isn't a code optimization — it's how you organize a production when the bottleneck is the artist's time, not the machine's. The word he chose to name it comes from that trade too.

Separates the wrong direction from the unpolished one

Live-session saving broke three times in a row. The closest thing to a complaint was «se está volviendo absurdo», and even that message carried the detail that unblocked the fix. He doesn't confuse something failing repeatedly with the underlying decision being wrong: when the direction *was* wrong he said so in those words, in other sessions, and there he aborted.

Aborted a plan that was already built, and asked for the explanation in his own language

He had approved a whole phase. The scaffolding existed, a twelve-section plan document, working code. When the time came to justify what problem it solved against what it cost, he cut it: «no me parece nada viable, investiga si podemos implementar una estructura que me permita máxima calidad de animación detallada y export fiel a lo que se observa desde batch preview». And to review the alternative he set the condition in the same breath: «Sin tecnicismos, soy motion designer. 2: porqué necesitamos linear y radial gradient para bakear?». The dead plan wasn't deleted — it was archived with a header pointing at the one that replaced it.

When the tool wasn't what he thought, he changed the question instead of pushing

He came into the session expecting the connector to compose visual pieces from a prompt. The first batch came back pixelated and it became clear the tool did something else. His response: «subestimé lo que tenías en mente... fui demasiado alto, asumí que Anthropic era la herramienta». He closed that track on the spot and asked what could actually be done well. It's the second logged instance of him renegotiating the contract when the premise breaks, rather than optimizing inside a frame that no longer applies.

Named the real division of labor in one line

In the same session where the automated path collapsed, he described how it actually works: «yo manualmente obtengo las capturas, necesito tus copys, fonts, y yo integro y posteo». He directs and composes; the AI delivers copy and strategy. He said it out loud instead of letting the mismatch run for another session.

His bug report carried the deciding clue in its last sentence

«borré todos los layers, grabé una nueva sesión, le dí cargar y dice playing pero no se ve nada, y si presiono q se anima normalmente mi secuencia.» Three facts in one line: the state he started from, what he did, and what he expected versus what he saw. The second half — that pressing the key *did* animate it — is what split the problem: it wasn't playback, it was specifically what gets recorded from the keyboard.

Cut a three-tier fix with a single question

Earlier that day the AI had diagnosed a serious indexing problem and proposed a full architecture migration. He asked to verify it in the search console first: the diagnosis collapsed on its own, the system was fine. Hours later a three-stage fix plan arrived for a different bug and he asked: «porqué es tan compleja la solución?». Before approving the real fix he asked what he always asks: «qué falló en términos simples? cómo se va a solucionar? por qué es tan compleja?». When the AI owned the earlier false alarm — «te debo disculpa por el alarmismo» — he didn't dwell on it or hold it: he moved to the next step.

He found a deploy had wiped the previous day's work, and ordered the sequence

«le diste en la madre», and in the same message: «Resuelvelo, y luego implementas seo nivel 3». The annoyance didn't turn into an argument about whose fault it was — it turned into an order of operations. First recover what had already shipped, then keep adding. A day of work at stake and not one extra sentence.

Predicted a bug that didn't exist yet, walking the product as a new user

He paid for an event, opened it fresh, and noticed the public address was already showing before activation. Instead of asking what that link was doing there, he built the whole story: «user compra, decide no editar aún, ve un link... ¿ese link cambia al editar? si cambia y lo comparte, se rompe». That scenario wasn't on any bug list, because reaching it means sitting in the chair of someone who doesn't know the system — the hardest chair to occupy for the person who built it.

Didn't accept the task being handed back without a reason

The AI told him the migration was his to run. His answer was a question: «¿no es más fácil que lo realices tú?». He didn't argue the conclusion, he asked for the reason. Every time the AI defers upward, he checks whether the deferral is justified or just default caution.

He closed the session with a screenshot, not with an «it works»

«no mames al fin quedó», with the two characters together in the biome attached. He didn't describe it: he showed it. That's his pattern for calling something done — see the thing running before saying it's ready. In another session a fix was confirmed the same way, with the evidence and the scene described in his own terms: «pilares clonados y un pinche mono ahí trepado».

Killed his own experiment after three iterations

The idea of making the previews a third taller went through three consecutive adjustments, each smaller than the last. On the third he closed it: «se ve bien pinche raro, vamos a echar atras». It was his own proposal and it had work in it. In the same session, before approving another change, he verified the blast radius even after being told it was safe: «esto no afecta preview de plantillas a pantalla completa vdd?».

He wrote the incident playbook thinking about who'll read it scared

After a production incident, the AI offered a post-mortem. He accepted but changed its purpose: «este documento nos ayudará a despejar dudas y resolver futuros errores de este tipo para solucionar en chinga». And he gave the instruction on tone: «que no entre el pánico, así lo solucionamos». The document opens by telling whoever arrives in a rush to breathe before following the procedure.

He named eighteen collections in three days, and not one says what it is

Cenote Místico. Niebla de Jade. Noche de Ámbar. Obsidiana Dorada. The categories grouping them are Alba and Obsidiana — dawn and volcanic stone — which is how a fashion house names its lines, not how you label a light theme and a dark one. The catalog went from 16 to 147 templates in three days and every name was decided in that sprint, with almost no later revision. He applies the same standard to URLs: he debated «quinceanera» versus «xv-anos» the way you debate a product name, not internal plumbing.