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.
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.
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).
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ó.
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.
«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.
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).
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.
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.
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 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).
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.
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ó.
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.
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 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.
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.
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.
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 📷/🧠.
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.
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.
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.
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.
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.
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í.
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.
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.