/diego/reseller EscríbemeWrite to meEscriu-me
AI Engineer · visión + LLM · reventa de segunda manoAI Engineer · vision + LLM · second-hand resellingAI Engineer · visió + LLM · revenda de segona mà
github.com/diegollr98-design/resellermaster

Construí el sistema que impide a una IA mentir sobre un producto.

I built the system that stops an AI from lying about a product.

Vaig construir el sistema que impedeix a una IA mentir sobre un producte.

RESELLERMASTER coge un lote de fotos mezcladas de ropa y objetos de segunda mano, las agrupa por producto y produce la ficha lista para copiar-pegar en Wallapop y Vinted (título, marca, talla, estado, precio) sin afirmar ni un atributo que no sea legible en una foto. El modo de fallo de este proyecto no es que el código pete: es que el pipeline invente «Nike, talla M, algodón, 25€» con total fluidez y yo lo publique. Una ficha mala no es un bug: es una venta perdida y reputación quemada. Empecé sin saber programar; lo levanté solo, con IA.

RESELLERMASTER takes a batch of mixed photos of second-hand clothes and objects, groups them by product and produces the listing ready to copy-paste into Wallapop and Vinted, title, brand, size, condition, price, without asserting a single attribute that isn't legible in a photo. This project's failure mode isn't the code crashing: it's the pipeline fluently inventing "Nike, size M, cotton, €25" and me publishing it. A bad listing isn't a bug: it's a lost sale and burned reputation. I started not knowing how to code; I built it solo, with AI.

RESELLERMASTER agafa un lot de fotos barrejades de roba i objectes de segona mà, les agrupa per producte i produeix la fitxa a punt per copiar i enganxar a Wallapop i Vinted (títol, marca, talla, estat, preu) sense afirmar ni un atribut que no sigui llegible en una foto. El mode de fallada d'aquest projecte no és que el codi peti: és que el pipeline s'inventi «Nike, talla M, cotó, 25€» amb tota fluïdesa i jo ho publiqui. Una fitxa dolenta no és un bug: és una venda perduda i reputació cremada. Vaig començar sense saber programar; el vaig aixecar sol, amb IA.

App local de un solo usuario. No automatiza la publicación (va contra los términos de Wallapop/Vinted): llega hasta «copiar y pegar en 2 clics», a propósito.Local single-user app. It does not automate publishing (against Wallapop/Vinted terms): it goes as far as "copy & paste in 2 clicks", on purpose.App local d'un sol usuari. No automatitza la publicació (va contra els termes de Wallapop/Vinted): arriba fins a «copiar i enganxar en 2 clics», a propòsit.

s
un export real cronometrado (n=1) · a mano ~285 s, estimado por un panelone real timed export (n=1) · by hand ~285 s, estimated by a panelun export real cronometrat (n=1) · a mà ~285 s, estimat per un panell
afirmaciones con confianza alta sin un píxel que las respalde · 33 fotos reales (7 productos), medido con la API contra el mapa de legibilidadhigh-confidence claims with no pixel to back them · 33 real photos (7 products), measured against the API using the legibility mapafirmacions amb confiança alta sense un píxel que les avali · 33 fotos reals (7 productes), mesurat amb l'API contra el mapa de llegibilitat
cts
coste medio de extracción por producto · 0 al reprocesar (caché)avg extraction cost per product · 0 on reprocess (cache)cost mitjà d'extracció per producte · 0 en reprocessar (cau)
fases cerradas · agrupar → extraer → export → precio → finanzasphases closed · group → extract → export → price → financesfases tancades · agrupar → extreure → export → preu → finances
RecorridoWalkthroughRecorregut

Del montón de fotos a la ficha, en 2 clics

From a pile of photos to the listing, in 2 clicks

Del munt de fotos a la fitxa, en 2 clics

El producto es visual, así que la prueba también. Un vídeo del pipeline real: ingesta del lote → curar la agrupación → ficha con cada campo junto a su recorte → export copy-paste por plataforma → finanzas. El clímax es el export cronometrado.

The product is visual, so is the proof. A video of the real pipeline: batch ingest → curate the grouping → listing with each field next to its crop → per-platform copy-paste export → finances. The climax is the timed export.

El producte és visual, així que la prova també. Un vídeo del pipeline real: ingesta del lot → curar l'agrupació → fitxa amb cada camp al costat del seu retall → export copy-paste per plataforma → finances. El clímax és l'export cronometrat.

vista previa · corte heropreview · hero cutvista prèvia · tall hero

Guion: ingesta → cremallera con pestillo (curar) → ficha con badges 📷/🧠 → export por plataforma → «5. Finanzas» (Subido → Vendido → beneficio → Excel). El export real se cronometró una vez en ~210 s (n=1; a mano ~285 s, estimado).Script: ingest → latching zipper (curate) → listing with 📷/🧠 badges → per-platform export → "5. Finances" (Uploaded → Sold → profit → Excel). The real export was timed once at ~210 s (n=1; by hand ~285 s, estimated).Guió: ingesta → cremallera amb balda (curar) → fitxa amb badges 📷/🧠 → export per plataforma → «5. Finances» (Pujat → Venut → benefici → Excel). L'export real es va cronometrar un cop en ~210 s (n=1; a mà ~285 s, estimat).

Ficha · producto 3Listing · product 3Fitxa · producte 3 representación de la pantalla realrepresentation of the real screenrepresentació de la pantalla real
MarcaReebok📷 leídoreadllegit
TallaXXL📷 leídoreadllegit
TipoTypeTipussudaderahoodiedessuadora🧠 inferidoinferredinferit
Colorgrisgreygris🧠 inferidoinferredinferit
MaterialMaterialMaterial, (etiqueta no fotografiada), (label not photographed), (etiqueta no fotografiada)null
EstadoConditionEstatMuy buenoVery goodMolt bo✓ lo confirma Diego✓ Diego confirms✓ ho confirma en Diego
PrecioPricePreu20 € mediana de 15 parecidosmedian of 15 similarmediana de 15 semblantscomparablescomparablescomparables
Cada campo lleva su recorte de la foto al lado. La app PROPONE; Diego CONFIRMA con el píxel delante.Each field shows its photo crop alongside. The app PROPOSES; Diego CONFIRMS with the pixel in front of him.Cada camp porta el seu retall de la foto al costat. L'app PROPOSA; en Diego CONFIRMA amb el píxel al davant.

Esto es lo que ningún otro proyecto mío tiene: una ficha donde cada dato dice de dónde salió. Un badge 📷 leído significa que el valor está contenido en el texto legible del recorte citado. Un 🧠 inferido es la mejor estimación del modelo, marcada como tal y con confianza baja.

El material sale vacío porque la etiqueta no está en ninguna foto, y eso es un acierto, no un hueco: un campo vacío se recupera; una talla inventada es una devolución.

This is what no other project of mine has: a listing where every value says where it came from. A 📷 read badge means the value is contained in the legible text of the cited crop. A 🧠 inferred one is the model's best guess, flagged as such with low confidence.

Material is left empty because the label isn't in any photo, and that's a win, not a gap: an empty field is recoverable; an invented size is a return.

Això és el que cap altre projecte meu té: una fitxa on cada dada diu d'on va sortir. Un badge 📷 llegit vol dir que el valor està contingut en el text llegible del retall citat. Un 🧠 inferit és la millor estimació del model, marcada com a tal i amb confiança baixa.

El material surt buit perquè l'etiqueta no és a cap foto, i això és un encert, no un forat: un camp buit es recupera; una talla inventada és una devolució.

📷 en la fotoin the photoa la foto 🧠 inferidoinferredinferit ✓ confirmadoconfirmedconfirmat null no legiblenot legibleno llegible
El ahorro a escalaSaving at scaleL'estalvi a escala

La app no gana en un producto. Gana en el lote.

The app doesn't win on one product. It wins on the batch.

L'app no guanya en un producte. Guanya en el lot.

A mano, cada producto es trabajo íntegro que se repite: fotografiar, teclear, categorizar, tasar, pegar. Con la app, el agrupado, la extracción y la confirmación se hacen en bloque para todo el lote, así que la ventaja no es fija: compone con cada producto que añades.

By hand, each product is full work repeated: shoot, type, categorize, price, paste. With the app, grouping, extraction and confirmation happen in bulk for the whole batch, so the advantage isn't fixed: it compounds with every product you add.

A mà, cada producte és feina íntegra que es repeteix: fotografiar, teclejar, categoritzar, taxar, enganxar. Amb l'app, l'agrupament, l'extracció i la confirmació es fan en bloc per a tot el lot, així que l'avantatge no és fix: compon amb cada producte que hi afegeixes.

productos en el loteproducts in the batchproductes al lot 10 productosproductsproductes
A manoBy handA mà1 h 10 min
Con la appWith the appAmb l'app37 min
Ahorro proyectado: ~33 min en 10 productos. Projected saving: ~33 min across 10 products.Estalvi projectat: ~33 min en 10 productes. −47%menos tiempoless timemenys temps
⚠ ESTIMACIÓN RAZONADA (persona media), no cronometrada. A mano ≈ 7 min/producto y todo se repite: separar las fotos · buscar referencia de precio en Wallapop/Vinted/Google · pensar título+descripción · categoría+atributos · subir a las 2 plataformas · registrar en Excel. Con la app: ~2 min fijos de montar el lote (ingesta + «extraer todo»: 2 clics para N productos) + ~3,5 min por ficha (revisar con el recorte + export copy-paste; ≈ el export medido, n=1). Por eso el % crece con el lote: lo fijo se amortiza. Cifras para una persona media (Diego va más rápido); el único dato MEDIDO es el export (~210 s). El imbatible sigue siendo cronometrar un lote real. ⚠ REASONED ESTIMATE (average person), not timed. By hand ≈ 7 min/product and everything repeats: separate the photos · look up a price reference on Wallapop/Vinted/Google · think up title+description · category+attributes · upload to both platforms · log it in Excel. With the app: ~2 min fixed to set up the batch (ingest + "extract all": 2 clicks for N products) + ~3.5 min per listing (review with the crop + copy-paste export; ≈ the measured export, n=1). That's why the % grows with the batch: the fixed cost amortizes. Figures for an average person (Diego is faster); the only MEASURED datum is the export (~210 s). The unbeatable one is still to time a real batch.⚠ ESTIMACIÓ RAONADA (persona mitjana), no cronometrada. A mà ≈ 7 min/producte i tot es repeteix: separar les fotos · buscar referència de preu a Wallapop/Vinted/Google · pensar títol+descripció · categoria+atributs · pujar a les 2 plataformes · registrar a Excel. Amb l'app: ~2 min fixos de muntar el lot (ingesta + «extreure tot»: 2 clics per a N productes) + ~3,5 min per fitxa (revisar amb el retall + export copy-paste; ≈ l'export mesurat, n=1). Per això el % creix amb el lot: el que és fix s'amortitza. Xifres per a una persona mitjana (en Diego va més ràpid); l'única dada MESURADA és l'export (~210 s). L'imbatible segueix sent cronometrar un lot real.
14 → 2

clics para extraer el loteclicks to extract the batchclics per extreure el lot

«Extraer TODO el lote» cuesta 2 clics, sea N=1 o N=30. Antes era 2 por producto. Hecho contado, no estimado."Extract the WHOLE batch" costs 2 clicks, whether N=1 or N=30. It used to be 2 per product. A counted fact, not an estimate.«Extreure TOT el lot» costa 2 clics, sigui N=1 o N=30. Abans era 2 per producte. Fet comptat, no estimat.

~1 €

coste de 30 productoscost of 30 productscost de 30 productes

3,4 cts/producto de extracción · 0 al reprocesar (caché por hash de imagen: cada llamada se paga una vez).3.4 cts/product for extraction · 0 on reprocess (cache by image hash: each call is paid once).3,4 cts/producte d'extracció · 0 en reprocessar (cau per hash d'imatge: cada crida es paga un cop).

×N

cómo componehow it compoundscom compon

A mano cada producto se repite entero; en la app agrupar / extraer / confirmar se amortizan sobre todo el lote.By hand each product repeats in full; in the app grouping / extracting / confirming amortize across the whole batch.A mà cada producte es repeteix sencer; a l'app agrupar / extreure / confirmar s'amortitzen sobre tot el lot.

Flagship · el corazón del proyectoFlagship · the heart of the projectFlagship · el cor del projecte

El Loop de Verdad: la app no AFIRMA, PROPONE

The Truth Loop: the app doesn't ASSERT, it PROPOSES

El Loop de Veritat: l'app no AFIRMA, PROPOSA

La app está diseñada para que yo confíe y copie rápido, y esa confianza es exactamente lo que convierte una alucinación en una venta perdida. Así que la honestidad no es un eslogan: está incrustada en la arquitectura. Quien AFIRMA es el humano al confirmar; la máquina sólo propone y enseña el píxel.

The app is built so I trust it and copy fast, and that trust is exactly what turns a hallucination into a lost sale. So honesty isn't a slogan: it's baked into the architecture. The one who ASSERTS is the human on confirm; the machine only proposes and shows the pixel.

L'app està dissenyada perquè jo m'hi confiï i copiï de pressa, i aquesta confiança és exactament el que converteix una al·lucinació en una venda perduda. Així que l'honestedat no és un eslògan: està incrustada a l'arquitectura. Qui AFIRMA és l'humà en confirmar; la màquina només proposa i ensenya el píxel.

# la garantía no la da el prompt — la fuerza un `if` # core/extract.py :: _construir_campo_desde_sintesis valor = "Reebok" cita = crop("IMG_0421.jpg", region_etiqueta) if valor.lower() in texto_legible(cita).lower(): fuente = "foto" # está en el píxel confianza = "media" else: fuente = "inferido" # NO se ve → se marca confianza = "baja" # extender una lectura ("Reebok" → "Reebok # Classic 100% algodón") es INEXPRESABLE: # el valor extendido ya no está en la cita.
# the guarantee isn't the prompt: an `if` forces it # core/extract.py :: _build_field_from_synthesis value = "Reebok" cite = crop("IMG_0421.jpg", label_region) if value.lower() in legible_text(cite).lower(): source = "photo" # it's in the pixel confidence = "medium" else: source = "inferred" # NOT visible → flagged confidence = "low" # extending a reading ("Reebok" → "Reebok # Classic 100% cotton") is UNEXPRESSABLE: # the extended value is no longer in the cite.
# la garantia no la dona el prompt — la força un `if` # core/extract.py :: _construir_campo_desde_sintesis valor = "Reebok" cita = crop("IMG_0421.jpg", region_etiqueta) if valor.lower() in texto_legible(cita).lower(): fuente = "foto" # és al píxel confianza = "media" else: fuente = "inferido" # NO es veu → es marca confianza = "baja" # estendre una lectura ("Reebok" → "Reebok # Classic 100% cotó") és INEXPRESSABLE: # el valor estès ja no és a la cita.

Cada campo lleva procedencia obligatoria: valor · fuente · evidencia · confianza. Un fuente=foto sin evidencia no es un dato, es un bug.

Un panel adversarial Opus (mi agente listing-audit) cazó justo esto: el if sólo validaba que la cita existiera, no que el valor estuviera en ese píxel: el modelo podía extender una lectura y colarla como leída. Veredicto BLOQUEANTE, corregido con guarda + test.

Una garantía prometida en prosa no está garantizada hasta que un `if` la fuerza.

Every field carries mandatory provenance: value · source · evidence · confidence. A source=photo without evidence isn't a datum, it's a bug.

An adversarial Opus panel (my listing-audit agent) caught exactly this: the if only checked the citation existed, not that the value was in that pixel: the model could extend a reading and pass it as read. BLOCKING verdict, fixed with a guard + test.

A guarantee promised in prose isn't guaranteed until an `if` enforces it.

Cada camp porta procedència obligatòria: valor · font · evidència · confiança. Un fuente=foto sense evidència no és una dada, és un bug.

Un panell adversarial Opus (el meu agent listing-audit) va caçar justament això: l'if només validava que la cita existís, no que el valor fos en aquell píxel: el model podia estendre una lectura i colar-la com a llegida. Veredicte BLOQUEJANT, corregit amb guarda + test.

Una garantia promesa en prosa no està garantida fins que un `if` la força.

El precio nunca sale del LLMPrice never comes from the LLMEl preu mai surt de l'LLM

El precio no es un atributo del producto: es una observación del mercado. Sale de comparables reales con su URL (la mediana de N parecidos, que puedo abrir y comprobar) o es None + motivo. Nunca un número plausible sin fuente. Límite honesto que la propia app declara en su UI: los anuncios publican lo que la gente PIDE, no por cuánto VENDIÓ (los precios de venta no son públicos).

Price is not a product attribute: it's a market observation. It comes from real comparables with their URL (the median of N similar items I can open and check) or it's None + reason. Never a plausible number without a source. An honest limit the app states in its own UI: listings publish what people ASK, not what they SOLD for (sale prices aren't public).

El preu no és un atribut del producte: és una observació del mercat. Surt de comparables reals amb la seva URL (la mediana de N semblants, que puc obrir i comprovar) o és None + motiu. Mai un número plausible sense font. Límit honest que la mateixa app declara a la seva UI: els anuncis publiquen el que la gent DEMANA, no per quant es va VENDRE (els preus de venda no són públics).

COSTURA 01 · ExtractorEngine

Un solo punto de llamadaOne call pointUn sol punt de crida

Toda llamada a cualquier proveedor (Claude/OCR/local) pasa por un módulo: contabiliza el coste por producto y cachea por hash de imagen. El proveedor es una decisión reversible, no una dependencia esparcida.Every call to any provider (Claude/OCR/local) goes through one module: it accounts cost per product and caches by image hash. The provider is a reversible decision, not a scattered dependency.Tota crida a qualsevol proveïdor (Claude/OCR/local) passa per un mòdul: comptabilitza el cost per producte i fa cau per hash d'imatge. El proveïdor és una decisió reversible, no una dependència escampada.

COSTURA 02 · PriceEngine

Precio desde comparablesPrice from comparablesPreu des de comparables

Lee la búsqueda pública por texto, coge ~15 parecidos y devuelve mediana + rango + URLs. Sin n≥5 → None + motivo. Leer ≠ publicar: volumen doméstico, sin herramientas de evasión.Reads the public text search, takes ~15 similar items and returns median + range + URLs. Without n≥5 → None + reason. Reading ≠ publishing: domestic volume, no anti-detection tooling.Llegeix la cerca pública per text, agafa ~15 semblants i torna mediana + rang + URLs. Sense n≥5 → None + motiu. Llegir ≠ publicar: volum domèstic, sense eines d'evasió.

COSTURA 03 · ListingSchema

Los campos, en un sitioFields in one placeEls camps, en un sol lloc

Los campos obligatorios de cada plataforma × categoría viven en un esquema declarativo. El LLM RELLENA un esquema; no inventa campos ni olvida los obligatorios. Añadir una categoría es añadir datos, no código.Each platform × category's required fields live in a declarative schema. The LLM FILLS a schema; it doesn't invent fields or forget required ones. Adding a category is adding data, not code.Els camps obligatoris de cada plataforma × categoria viuen en un esquema declaratiu. L'LLM OMPLE un esquema; no s'inventa camps ni oblida els obligatoris. Afegir una categoria és afegir dades, no codi.

Lo que decidí NO construirWhat I decided NOT to buildEl que vaig decidir NO construir

Decisiones medidas, no intuidas

Measured decisions, not guessed

Decisions mesurades, no intuïdes

El activo que no se puede fingir no es el código: es el juicio. Antes de pagar una API o meter una dependencia, mido la alternativa gratuita sobre datos reales. Matar una hipótesis con un dato ( incluso cuando el dato va en mi contra ) es la señal de un proceso serio.

The asset you can't fake isn't the code: it's judgment. Before paying for an API or adding a dependency, I measure the free alternative on real data. Killing a hypothesis with data ( even when the data goes against me ) is the signature of a serious process.

L'actiu que no es pot fingir no és el codi: és el criteri. Abans de pagar una API o ficar-hi una dependència, mesuro l'alternativa gratuïta sobre dades reals. Matar una hipòtesi amb una dada ( fins i tot quan la dada va en contra meu ) és el senyal d'un procés seriós.

IdeaIdeaIdea Por qué tentabaWhy it temptedPer què temptava Qué medíWhat I measuredQuè vaig mesurar VeredictoVerdictVeredicte
Búsqueda por imagen / LensImage search / LensCerca per imatge / Lensidentificar el producto por su fotoidentify the product from its photoidentificar el producte per la seva foto «sube la foto y te dice qué es»"upload the photo and it tells you what it is"«puja la foto i et diu què és» todas exigen URL pública; app local sin hostingall require a public URL; local app, no hostingtotes exigeixen URL pública; app local sense hosting Descartada · 4 agentesRuled out · 4 agentsDescartada · 4 agents
CLIP · match visualvisual matchmatch visualagrupar fotos del mismo producto por similitudgroup same-product photos by similarityagrupar fotos del mateix producte per similitud embeddings gratis, sin APIfree embeddings, no APIembeddings gratis, sense API 0.90 de similitud entre dos sudaderas DISTINTAS0.90 similarity between two DIFFERENT hoodies0.90 de similitud entre dues dessuadores DIFERENTS [INC-004]
OCR · clasificar tipo de fotoclassify photo typeclassificar tipus de fotodetectar etiqueta/metro/plano por su textodetect label/tape/wide-shot by its textdetectar etiqueta/metre/pla pel seu text etiqueta y metro SON textolabel and tape ARE textetiqueta i metre SÓN text los caracteres se solapan por completocharacter counts overlap completelyels caràcters se solapen del tot [INC-007]
VLM localLocal VLMVLM localcorrer un modelo de visión en mi portátilrun a vision model on my laptopcórrer un model de visió al meu portàtil coste 0, sin depender de nadiezero cost, no dependencycost 0, sense dependre de ningú RTX 3050 · 4 GB VRAM → no entra→ won't fit→ no hi entra Medido, no intuidoMeasured, not guessedMesurat, no intuït
Automatizar la publicaciónAutomate publishingAutomatitzar la publicacióSelenium sobre los formularios de Wallapop/VintedSelenium over Wallapop/Vinted formsSelenium sobre els formularis de Wallapop/Vinted el paso final «gratis»the "free" final stepel pas final «gratis» contra sus términos → baneo de la cuenta que ES el negocioagainst their terms → ban on the account that IS the businesscontra els seus termes → bloqueig del compte que ÉS el negoci Descartada a propósitoRuled out on purposeDescartada a propòsit
Umbral de agrupación 15 s15 s grouping thresholdLlindar d'agrupació 15 scuándo dos fotos son productos distintoswhen two photos are different productsquan dues fotos són productes diferents barrido completo 5–30 s sobre 33 fotos realesfull 5–30 s sweep over 33 real photosescombrada completa 5–30 s sobre 33 fotos reals zona segura 1–23 s → 0 fusiones; acantilado a 24 ssafe zone 1–23 s → 0 merges; cliff at 24 szona segura 1–23 s → 0 fusions; espadat a 24 s En usoIn useEn ús
El pipelineThe pipelineEl pipeline

Cinco etapas, un solo estado en disco

Five stages, one state on disk

Cinc etapes, un sol estat al disc

El flujo es un flywheel de cinco etapas. El estado del curado se escribe en disco, no sólo en memoria: un rerun de Streamlit, un crash o un cierre de pestaña no pueden costarme dos horas de trabajo.

The flow is a five-stage flywheel. Curation state is written to disk, not just memory: a Streamlit rerun, a crash or a closed tab can't cost me two hours of work.

El flux és un flywheel de cinc etapes. L'estat del curat s'escriu al disc, no només a memòria: un rerun de Streamlit, un crash o un tancament de pestanya no em poden costar dues hores de feina.

pasa el ratón por una etapa para resaltarlahover a stage to highlight itpassa el ratolí per una etapa per ressaltar-la
1 INGERIRINGESTINGERIR

Fotos + EXIFPhotos + EXIFFotos + EXIF

Sin fecha (WhatsApp la borra) la señal primaria no existe → la app avisa en la ingesta.No date (WhatsApp strips it) → the primary signal is gone → the app warns on ingest.Sense data (WhatsApp l'esborra) el senyal primari no existeix → l'app avisa a la ingesta.

2 AGRUPARGROUPAGRUPAR

La cremalleraThe zipperLa cremallera

Propone clusters por hueco temporal; Diego confirma. Fusionar dos productos es INEXPRESABLE.Proposes clusters by time gap; Diego confirms. Merging two products is UNEXPRESSABLE.Proposa clústers per buit temporal; en Diego confirma. Fusionar dos productes és INEXPRESSABLE.

3 EXTRAEREXTRACTEXTREURE

Schema + procedenciaSchema + provenanceSchema + procedència

OCR localiza el texto → recorte → el VLM lee. Cada campo con su badge 📷/🧠.OCR locates text → crop → the VLM reads. Every field with its 📷/🧠 badge.L'OCR localitza el text → retall → el VLM llegeix. Cada camp amb el seu badge 📷/🧠.

4 TASARPRICETAXAR

ComparablesComparablesComparables

Mediana de parecidos con URL, editable. Sin n≥5 → None + motivo.Median of similar items with URLs, editable. Without n≥5 → None + reason.Mediana de semblants amb URL, editable. Sense n≥5 → None + motiu.

5 EXPORTAREXPORTEXPORTAR

Copy-paste por plataformaPer-platform copy-pasteCopy-paste per plataforma

Literales exactos por plataforma, orden del formulario de cada una. Era el ~66% de mi tiempo.Exact platform literals, each one's form order. It was ~66% of my time.Literals exactes per plataforma, ordre del formulari de cadascuna. Era el ~66% del meu temps.

El reloj puede PARTIR, pero no CONFIRMARThe clock can SPLIT, but not CONFIRMEl rellotge pot PARTIR, però no CONFIRMAR

La agrupación no optimiza acierto: optimiza no-fusionar. Partir un producto de más cuesta 5 segundos; fusionar dos mete una foto del producto A en la ficha del B, y eso no lo caza nadie. Por eso una pausa larga puede partir un grupo, pero la ausencia de pausa no confirma nada, y ningún grupo sale con confianza alta desde el reloj. La unidad de la UI es la frontera, no la foto: mezclar dos productos lejanos es inexpresable, no sólo desaconsejado.

Grouping doesn't optimize accuracy: it optimizes not-merging. Over-splitting a product costs 5 seconds; merging two puts a photo of product A into product B's listing, and nobody catches that. So a long pause may split a group, but the absence of a pause confirms nothing, and no group ships with high confidence from the clock. The UI's unit is the boundary, not the photo: mixing two distant products is unexpressable, not merely discouraged.

L'agrupació no optimitza encert: optimitza no-fusionar. Partir un producte de més costa 5 segons; fusionar-ne dos fica una foto del producte A a la fitxa del B, i això no ho caça ningú. Per això una pausa llarga pot partir un grup, però l'absència de pausa no confirma res, i cap grup surt amb confiança alta des del rellotge. La unitat de la UI és la frontera, no la foto: barrejar dos productes llunyans és inexpressable, no només desaconsellat.

Cómo trabajo con IAHow I work with AICom treballo amb IA

Validación adversarial multi-agente

Adversarial multi-agent validation

Validació adversarial multiagent

No le pido a la IA una respuesta. Un orquestador (Opus) delega la construcción en agentes Sonnet en paralelo, y luego un panel escéptico ataca lo construido: bug-hunter busca la causa raíz sin contexto, listing-audit intenta pillar al pipeline mintiendo contra las fotos reales, flow-qa mide la velocidad. El orquestador re-deriva cada veredicto ejecutando, no por informe. Yo juzgo.

I don't ask the AI for an answer. An orchestrator (Opus) delegates building to parallel Sonnet agents, then a skeptical panel attacks what was built: bug-hunter finds the root cause with no context, listing-audit tries to catch the pipeline lying against the real photos, flow-qa measures speed. The orchestrator re-derives every verdict by executing, not by report. I judge.

No li demano a la IA una resposta. Un orquestrador (Opus) delega la construcció en agents Sonnet en paral·lel, i després un panell escèptic ataca el que s'ha construït: bug-hunter busca la causa arrel sense context, listing-audit intenta enxampar el pipeline mentint contra les fotos reals, flow-qa mesura la velocitat. L'orquestrador re-deriva cada veredicte executant, no per informe. Jo jutjo.

el orquestador re-deriva el veredicto EJECUTANDO · no por informe the orchestrator re-derives the verdict by EXECUTING · not by reportl'orquestrador re-deriva el veredicte EXECUTANT · no per informe PANEL ADVERSARIAL · intentan pillar al pipeline mintiendo ADVERSARIAL PANEL · they try to catch the pipeline lyingPANELL ADVERSARIAL · intenten enxampar el pipeline mentint CONSTRUIRBUILDCONSTRUIR Sonnet en paraleloparallel SonnetSonnet en paral·lel /eval golden set · alucinacióngolden set · hallucinationgolden set · al·lucinació bug-hunter causa raíz, sin contextoroot cause, no contextcausa arrel, sense context listing-audit refuta las afirmacionesrefutes the claimsrefuta les afirmacions flow-qa segundos por productoseconds per productsegons per producte /seed-review agente ciegoblind agentagent cec LA FICHATHE LISTINGLA FITXA bajo ataqueunder attacksota atac DIEGO · juzgaDIEGO · judgesDIEGO · jutja el píxel delantethe pixel in frontel píxel al davant PUBLICAPUBLISHESPUBLICA copy-pastecopy-pastecopy-paste ✓ AL LEDGERTO THE LEDGERAL LEDGER → regla vía /optimize→ rule via /optimize→ regla via /optimize ✗

Pellizca para acercar y leer el detalle ↔Pinch to zoom in and read the detail ↔Pessiga per apropar i llegir el detall ↔

Una ficha sobrevive sólo si resiste el ataque. El juicio final es mío, con el píxel delante: es la única capa que verifica verdad, no sólo legibilidad.

A listing survives only if it withstands the attack. The final judgment is mine, with the pixel in front: the only layer that verifies truth, not just legibility.

Una fitxa sobreviu només si resisteix l'atac. El judici final és meu, amb el píxel al davant: és l'única capa que verifica veritat, no només llegibilitat.

Verificación por ejecuciónVerification by executionVerificació per execució

Ningún «el subagente reportó que OK» cierra nada. Corro yo pytest / /eval / la app y pego la salida REAL en el prompt del siguiente agente. Un informe no es evidencia; una salida sí.No "the subagent reported OK" closes anything. I run pytest / /eval / the app myself and paste the REAL output into the next agent's prompt. A report isn't evidence; output is.Cap «el subagent ha reportat que OK» tanca res. Corro jo pytest / /eval / l'app i enganxo la sortida REAL al prompt de l'agent següent. Un informe no és evidència; una sortida sí.

# esta misma semana: el /seed-review de MI plan de cierre $ /seed-review cierre-ultra-review.md agente CIEGO // no ve el plan → deriva el objetivo desde la fuente 2 críticos // en paralelo, mandato: REFUTAR ciego ✎ el plan audita CÓDIGO con 900 tests verdes… pero la métrica-norte «segundos-hasta-publicar» NUNCA se midió en 5 fases → es un PROXY, no el objetivo [INC-016] # reordené: MEDIR primero → ~210 s con la app vs ~285 a mano # y midiéndolo apareció un bug real: [INC-031] 400 de esquema en TODA re-extracción // 904 tests // verdes no lo vieron: mockean el motor y // nunca mandan el json_schema a la API real
# this very week: the /seed-review of MY closing plan $ /seed-review closing-ultra-review.md BLIND agent // never sees the plan → derives the goal from the source 2 critics // in parallel, mandate: REFUTE blind ✎ the plan audits CODE with 900 green tests… but the north metric "seconds-to-publish" was NEVER measured in 5 phases → it's a PROXY, not the goal [INC-016] # I reordered: MEASURE first → ~210 s with the app vs ~285 by hand # and measuring it surfaced a real bug: [INC-031] schema 400 on EVERY re-extraction // 904 green // tests didn't see it: they mock the engine and // never send the json_schema to the real API
# aquesta mateixa setmana: el /seed-review del MEU pla de tancament $ /seed-review cierre-ultra-review.md agent CEC // no veu el pla → deriva l'objectiu des de la font 2 crítics // en paral·lel, mandat: REFUTAR cec ✎ el pla audita CODI amb 900 tests verds… però la mètrica-nord «segons-fins-a-publicar» MAI es va mesurar en 5 fases → és un PROXY, no l'objectiu [INC-016] # vaig reordenar: MESURAR primer → ~210 s amb l'app vs ~285 a mà # i mesurant-ho va aparèixer un bug real: [INC-031] 400 d'esquema en TOTA re-extracció // 904 tests // verds no ho van veure: mockegen el motor i // mai envien el json_schema a l'API real

El panel cazó que mi propio plan de cierre probaba un proxy: auditar código verde en vez de medir la métrica primaria del proyecto. Reordené, medir primero, y el número que corona el proyecto (~210 s) apareció ahí, junto a un bug que 904 tests verdes no veían. El rigor es cuestionar tu propio plan, no defenderlo.

The panel caught that my own closing plan was testing a proxy: auditing green code instead of measuring the project's primary metric. I reordered, measure first, and the number that crowns the project (~210 s) showed up there, next to a bug 904 green tests couldn't see. Rigor is questioning your own plan, not defending it.

El panell va caçar que el meu propi pla de tancament provava un proxy: auditar codi verd en comptes de mesurar la mètrica primària del projecte. Vaig reordenar, mesurar primer, i el número que corona el projecte (~210 s) va aparèixer allà, al costat d'un bug que 904 tests verds no veien. El rigor és qüestionar el teu propi pla, no defensar-lo.

El resto del método (la refutación asimétrica, el agente ciego que audita mis planes, el ledger que convierte un fallo en regla) es el mismo en los cinco sistemas y está contado una vez: en el índice.The rest of the method (asymmetric refutation, the blind agent auditing my own plans, the ledger that turns a failure into a rule) is the same across all five systems and is told once: on the index.La resta del mètode (la refutació asimètrica, l'agent cec que audita els meus plans, el ledger que converteix una fallada en regla) és el mateix als cinc sistemes i està explicat una vegada: a l'índex.

Disponible para trabajarAvailable for workDisponible per treballar

Cojo un problema difuso, lo descompongo y orquesto IA para construir cada pieza, sin perder el rigor.

I take a fuzzy problem, break it down and orchestrate AI to build every piece, without losing the rigor.

Agafo un problema difús, el descomponc i orquestro IA per construir cada peça, sense perdre el rigor.

Si buscas a alguien para applied-AI, automatización o forward-deployed engineering, que construye sistemas para que la IA no se engañe a sí misma, hablemos.

If you're looking for someone in applied-AI, automation or forward-deployed engineering who builds systems so the AI can't fool itself, let's talk.

Si busques algú per a applied-AI, automatització o forward-deployed engineering, que construeix sistemes perquè la IA no s'enganyi a si mateixa, parlem-ne.

RESELLERMASTER · Diego · 2026 App local · construido con IA · sin formación técnica previaLocal app · built with AI · no prior technical backgroundApp local · construït amb IA · sense formació tècnica prèvia