Home / DDS Vibe Academy / 1,032 Words, Zero Lines of Code
1,032 Words,
Zero Lines of Code
A live Shopify store diagnosed, rebuilt, tested and promoted across 43 tickets in four days. The operator wrote no code, opened no editor, ran no command. This class is the protocol that made that survivable — and five things you can operate right here to see whether you could run it yourself.
Quick answer
Between 15 and 18 August 2026, a live Shopify storefront was diagnosed, repaired, tested and promoted to production across 43 tickets. The human in the loop typed roughly 1,032 original words and pasted about 11,140 — 8.5% authorship, zero lines of code. It worked because of an eight-rule written contract that made unverifiable claims inadmissible, and it nearly failed eleven times because a verifier reported a pass over an element it could not see. The transferable rule is one sentence: an absent element must never read as a pass.
What you are looking at
This is not a tutorial written after the fact. It is a reconstruction from the project's own artefacts: two chat transcripts totalling 561 messages, 43 tickets, 41 reports, and 354 evidence files of raw command output. Every figure on this page traces to one of them and carries a grade.
Key takeaways
Removing yourself from the code does not remove you from the engineering — it moves you into adjudication. A protocol is what makes that survivable. An absent element must never read as a pass. When two agents disagree, do not average them and do not defer to the senior one: find out which is right. And a report about the work is a different artefact from the work, with its own failure modes.
01 · The ledger
Forty-three tickets in four days. Each one is a written instruction with a mode, a file whitelist and a definition of done; each has a report answering it with cited evidence. Below is the whole programme. Drag your eye along the four days and the shape of the work appears — diagnosis clustered at the start, promotions in bursts, and a long tail of verification that outlasted the building.
Four days, left to right. Each mark is a ticket. Gold rings are promotions to live; red marks are URGENT or SEV1; hollow marks are the two ticket numbers with no file on disk.
Text equivalent of the timeline
The gaps are part of the record
TICKET-004 and TICKET-027 have no file on disk, and neither do REPORT-004, REPORT-025 and REPORT-027 MEASURED. Ticket 027 is the interesting one: it left evidence/027-rollback.json behind with 335 records, plus three tool scripts. The work happened. Only the paperwork is gone. A ledger that quietly renumbered around those holes would be a tidier artefact and a worse one.
02 · The protocol
Before the first ticket, eight rules were written into _exchange/README.md and never renegotiated. They are short, they are blunt, and every one of them exists because the alternative is a confident report you cannot check. Reproduced verbatim.
The loop, and where the human actually sits
Steps 2 and 4 are the entire human role. Everything else is written by one agent and checked by another. That is what an 8.5% authorship ratio looks like from the inside — not a person supervising, a person routing. The judgement is real and it is concentrated almost entirely in what happens when a report comes back wrong.
03 · What 1,032 words looks like
Across the two retained transcripts — 561 messages between them — the operator typed 1,032 original words and pasted approximately 11,140 MEASURED CALCULATED. The pasted figure is an estimate at ±10%: relayed agent output was counted by line at a measured average, not word by word.
The bar barely moves. That is the argument, and it is better made by a bar that refuses to fill than by a sentence.
The nine words that mattered most
Nine words. What makes them remarkable is when they were typed. In the same minute, the reviewing agent had just diffed a 110,938-byte Liquid file down to a single changed hunk, caught three evidence artifacts sharing one md5, and established that a test harness had been reduced from ten checks to four while being reported as improved. The operator's contribution to that minute was to ask for the next ticket. The system did the rest because the system had been built to.
And the words that mattered second
Claude had written CSS for a 114 KB section based on screenshots. The instruction to stop guessing and read the actual file is what surfaced the unclosed brace described in module 06 — the defect that was sending customers the wrong size. Anger, correctly aimed, was the highest-value input in the archive. It is also the clearest evidence that the human role is not clerical.
The archive, all of it
Every message with text, in order, classified. His own words are set in white; anything he pasted is a grey bar with its word count. Scroll it and the ratio stops being a statistic.
Thirty-one messages carrying 952 of the 1,032 words. The missing eighty are in messages that were screenshots only, or fell in the two windows where no transcript was retained. MEASURED
Read the pasted figures as a floor, not a total. The word counts above are per-message estimates taken from the relayed blocks that could be measured; several relays are recorded as zero because their length was never captured. Do not compute an authorship percentage from this view — it would come out far too high. The 8.5% figure elsewhere on this page is derived from whole-session totals, and it is the one to trust. This panel is here to show you the shape of the messages, not to recompute the ratio. CALCULATED partly ASSERTED
Where the transcript runs out, and why that matters
Two windows of the project have no retained transcript: tickets 001–005 and 016–028, thirteen of them including three live promotions MEASURED. The evidence that they existed is indirect and solid: late in a retained session, an agent refers to "the two corrections you had to make today" — and neither correction appears in any retained message. The likely cause is in the operator's own words: he was running two chat windows in parallel, which is also why the ticket numbers run ahead of the conversation. The honest figure is therefore 8.5% across roughly 25 of 41 tickets, not a whole-project number. A whole-project number would be a nicer statistic and an invented one.
04 · The Adjudicator
Eight real decision points from the archive. You get what the operator got — an agent's report, sometimes two that disagree — and four options, none of them stupid. Commit, then see what actually happened and what it cost. There is no time limit and no penalty for being wrong; the profile at the end tells you what kind of operator you are, not what score you got.
05 · The false-pass hunt
The project caught itself doing this four times by name and a review of the archive found seven more. In every case a check ran, reported green, and the thing it was supposed to catch was standing in plain sight — outside the set of things the check could see.
Five rounds. You get the checker's output, the selectors it used, and the DOM. Click the element the checker is blind to.
Four root causes, one rule
| Blind spot | What it looked like | Why the check could not see it |
|---|---|---|
| Selector for a class that does not exist | 3/3 PASS | Zero matched elements is not zero failures. An empty set passes every assertion in it. |
#FilterDrawerOpen at 109×40 | 3/3 PASS | Structurally outside a three-entry selector list. The control existed; the list did not know about it. |
| Product-page gate | coverage OK | Coverage was claimed for a page the harness never visited. It went red at 114×42 the moment it was opened. |
MAX_BADGES = 2 | assertions pass | No card ever rendered the third badge, so the assertions about it were true and meaningless. |
| Harness reporting 10 checks | 4/4 PASS | Six checks had been removed. The denominator moved and the report kept the old label. |
The rule
An absent element must never read as a pass. A check that finds nothing must say so out loud and fail closed. If your harness cannot tell "zero problems" from "zero elements examined", every green result it produces is uninformative.
06 · The bug that shipped wrong sizes
The best defect in the archive, and the one that teaches the most per minute. The symptom arrived as a 51-word bug report. What it turned out to be was four apparently separate features failing from one cause — and a safety net that was independently dead for an entirely different reason.
What customers were experiencing
- Pick Size M, the cart receives Size S.
- Image thumbnails inert.
- Quantity frozen at 1, so every order shipped quantity 1 regardless of what was chosen.
- And the console was clean, which is why it shipped.
The question that cracked it
Not "what is broken" — four things were broken and the list pointed nowhere. The productive question was which features still work? Two did: the size guide and the description dropdown, because they use delegated fallbacks. Delegated handlers survive a dead script. That single observation partitions a 114 KB file down to one <script> block: everything inside it is dead, everything delegated still runs.
The audit
Braces counted with strings, template literals, regex literals and comments stripped — because a { inside a string is not a block:
The missing closer was not missing. It was in the wrong block. A single <script> tag had at some point been split into two, and the closing brace of a forEach went with the wrong half. Confirmed twice at runtime: new Function(block1) throws Unexpected end of input, and the data <template> carries no data-init attribute because setting it is the first thing the IIFE does.
Counts curly braces, parentheses and square brackets outside of strings and comments, and reports the first line where the depth goes negative.
Then the safety net turned out to be dead too
The delegated fallback — the thing keeping two features alive — was itself broken, for a completely unrelated reason. getProductData() scraped variants: [...] out of inline script text with a regex. The section had since been refactored to emit its JSON into a <template>, and the script now reads variants: data.variants. The regex matched nothing, the function returned null, the handler bailed. Measured: null against 10 variants MEASURED.
07 · Everyone was wrong, in public, with receipts
The most useful property of this archive is that it contains its own errors, dated, with the correction attached. Not one of them was quietly amended.
Three wrong measurements in a row, on the same question
Asked to confirm a tap-target fix had landed, the reviewing agent reported failure three consecutive times. Each failure had a different cause, and the third is the one worth memorising.
| # | What was reported | Why it was wrong |
|---|---|---|
| 1 | Buttons measure 42 px, fix not in effect | The measurement predated the 15:02 push. It was reporting a real number about an old build. |
| 2 | Still 42 px after cache-busting | The “cache-bust” appended a query string but preserved Shopify's pinned ?v=, so it re-fetched the identical asset. A page load after a CSS push is not fresh unless the version changed. |
| 3 | Rendered box is 44.16×42.24, below the 44 px floor | getBoundingClientRect() was being read inside an ancestor carrying matrix(0.96,…) — the exact phantom documented in the report being reviewed. |
The executor closed it with source plus a time series: the keyframe declares only a 0% frame with fill-mode: none, so it interpolates from 0.96 to identity over 240 ms. Polled for 3.3 seconds, it was caught mid-flight at 0.9915 and settled to identity at 315 ms MEASURED. The 5.5-second reading was a throttled tab parking a CSS animation at frame zero.
And the winner corrected itself too
In the same exchange, the executor derived a scale factor from rendered ÷ layout and reported one element at “scale 0.9946”. Its matrix was matrix(1,0,0,1,-331.5,0) — a pure translate. Sub-pixel rounding. Reporting a translate as a scale would have been precisely the imprecision the new rule existed to kill, and it was caught in its own first draft, unprompted.
The file, byte by byte
One artefact from the archive says more about the process than any narrative: the size and hash of a single section file across the programme. Read the two +52 rows.
Fifty-two bytes of min-height:44px were applied, silently reverted by a bulk push, and applied again. The ledger is how anyone knew. Without per-file byte counts and hashes at each step, a 52-byte regression inside a 112 KB file is invisible — it does not change the layout enough to notice and it does not throw.
EF BB BF, prepended on write. It was caught by comparing byte counts, which is the only reason it was caught at all.The rule for disagreement
Two agents reporting two numbers is not a range to be split. It is a factual question with a knowable answer, and the cost of resolving it is almost always lower than the cost of shipping the average. Elsewhere in the project, a claim about which analytics pipeline fed a baseline was corrected two minutes after it was made, and an accusation of an unauthorised push was withdrawn after timestamps were checked.
08 · Where the store was lying
This module has legal teeth. A certification claim is not copy — it is a representation about the product, and an incorrect one is exposure. The archive contains an arc, 014 through 018, in which the store was found to be making claims nothing backed.
The setting
Roughly 636 live product cards were carrying a hardcoded certification badge MEASURED. Because collection.json is the fallback template, any new collection would have stamped GOTS on everything in it the moment it was created. And on one template the string being rendered inside the gold certification pill was the word JUDGE — a leftover placeholder, presented to shoppers with the visual authority of a certification mark.
The hardcoded string
Separately, a certification sentence was hardcoded into a product template rather than driven from product data. It appeared on 178 product pages, of which 177 have no recycled fabric MEASURED. Nobody asked for that finding; it surfaced because a ticket about a broken button required reading the template that contained it.
The backfill that reported success
The remediation is its own lesson. A metafield backfill ran and reported: 557 written, 0 errors, 0 mismatches, compliance gate ZERO. It had also destroyed 169 metaobject references across 133 products — moisture-wicking, quick-drying, UV-protection and water-resistant features, nine products each MEASURED.
Why the gate said zero
The compliance gate was measuring the thing that was written, not the thing that was overwritten. It counted successes and had no concept of collateral. A verification step that can only confirm its own intent will report a clean run through almost any accident.
When an agent refused
The operator instructed, twice and emphatically, that the OEKO-TEX mark be downloaded and displayed, framing it as a requirement. The agent checked the OEKO-TEX Labelling Guide and refused: DDS is not the certificate holder — the supplier's certifier is — so displaying the mark as the store's own would misrepresent who holds it. It offered three compliant alternatives and kept the text form. The operator accepted, and TICKET-018-HOTFIX-remove-oeko-tex-badge landed at 10:49 that morning.
09 · Reading the traffic honestly
Halfway through, the project stopped fixing things and asked whether the numbers it had been reasoning from meant anything. They did not.
One in five sessions was landing on a 404
2,560 of 11,908 sessions over 90 days — 21.5% — hit removed-locale URLs MEASURED. Over 365 days it was 4,100 sessions across 212 dead paths, with a single page, /zh/pages/claude-ai-shopify-prompt-library, carrying 1,889 of them. There were already 2,438 redirects in place; a query for path:/zh returned zero. The redirects existed and did not cover the paths people were actually arriving on.
The re-baseline
The finding that reframed everything
Excluding implausible traffic removed 39.4% of sessions and zero purchases. A conversion rate computed against the unfiltered number was not slightly wrong — it was measuring a denominator that had never bought anything and never would.
The 413, and a hypothesis that died well
Google Analytics was returning 413 Payload Too Large on collection pages, silently dropping page_view events. The team's first hypothesis was that they had caused it: fixing the Load More button had taken the grid from 16 rendered products to 53, so a payload built from rendered cards would have roughly tripled.
The payload was byte-identical at 16 cards and at 48. The hypothesis was disproven by its own test, which is the best possible outcome for a hypothesis. The real cause was repetition: item_category occupied 4,600 bytes carrying one distinct value, and item_brand 1,400 bytes carrying one. Six thousand bytes — 35% of the payload — were two strings repeated fifty times MEASURED, pushing 16,905 bytes against a 16,384 ceiling. Over by 521 bytes — 3.2%.
Verified live at publication
This class is published by the store it describes, so the claims are checkable. These were pulled from the live Shopify Admin API and a cold fetch on 19 August 2026, the day this page shipped.
The redirect count has moved from 2,438 to 2,869 since the archive was written — 431 added. And the specific path that carried 1,889 sessions into a 404, /zh/pages/claude-ai-shopify-prompt-library, now returns 301 and lands on a real page MEASURED. So does /zh/collections/all, which resolves to the English collection rather than the homepage — someone chose a sensible target rather than dumping every dead path at the root.
Why that last detail matters
A redirect to / converts a 404 into a bounce. A redirect to the equivalent page converts it into a session. The difference is judgement, and judgement is the part that did not get automated.
10 · Run this yourself
Everything above is only worth reading if you can do it on Monday. This module hands you the protocol, a ticket, and your own number.
What is your authorship ratio?
Paste a session from any AI tool. It counts what you typed against what you pasted and plots you against this project. Nothing leaves your browser — there is no network call in this page, and you can confirm that in your dev tools.
Forge a ticket
Six answers produce a ticket with the eight rules compiled into it, so an agent receiving it is bound by them whether or not it reads the protocol.
Twelve prompts that did the work
Adapted from the archive, generalised, and ordered by when you need them.
| When | Prompt |
|---|---|
| Opening a diagnosis | Read _exchange/inbox/ and work the lowest-numbered unanswered ticket. Read-only. Write raw output to evidence/ and a report to outbox/. Do not fix anything you notice. |
| Before any code is written | Pull the live file and read it in full before you write a line. Do not infer its contents from screenshots, from the theme editor, or from what it should contain. |
| Granting write access | WRITE MODE for this ticket only. You may modify exactly these files: [list]. Touch nothing else. If the fix requires a file not listed, stop and report. |
| Demanding evidence | Every claim in your report cites an evidence file and a line. A claim with no citation will be ignored. Label every number MEASURED, CALCULATED or ASSERTED. |
| When a report reads too cleanly | Which of these checks could pass if the element did not exist? For each check, tell me how many elements it actually matched. |
| When two agents disagree | You and [other] report different numbers for the same thing. Do not average them and do not defer. Find out which is right and show me the evidence that settles it. |
| When a measurement smells | Report the layout box and the rendered box, and print any transformed ancestor with its matrix. If they differ, tell me which one the user's finger meets. |
| After a CSS or asset push | Confirm the asset version token changed before you measure. A page load is not fresh unless ?v= moved. |
| Before a promotion | List every file that will change, with before and after byte counts and hashes. Confirm a rollback point exists and tell me where it is. |
| Authorising live | Promote to live now. Snippet first, then sections, then templates. Re-verify against the live theme with a cache-busted URL afterwards, not the bare one. |
| Calling a severity | Treat this as SEV1. Stop other work. Establish blast radius first — how many live pages carry it — before proposing any fix. |
| Closing a ticket | Summarise what you changed, what you verified, and what you could not verify. Anything you could not check is UNVERIFIED, not omitted. |
The bottom line
Removing yourself from the code does not remove you from the engineering. It moves you into adjudication, and adjudication needs a written contract with an evidentiary standard, or it collapses into believing whichever agent sounds most confident. Eight rules, a shared folder, and the discipline to treat an uncited claim as inadmissible — that is the whole system. The 1,032 words were the easy part.
Nothing completed yet
Work the Adjudicator and the false-pass hunt above, and this fills in.
11 · Eighteen questions
The operator never opened an editor, never wrote a function, and never ran a command. He wrote tickets in prose, relayed reports between two agents, and adjudicated when they disagreed. Every line of Liquid, CSS, JavaScript and every API call was written and executed by an agent. It does not mean the work required no engineering judgement — module 07 is entirely about the judgement it required.
Neither. It is a description of where the work moved. A low ratio means the protocol is absorbing the routine and you are only spending words on judgement. A high ratio means you are still hand-carrying things a written contract could carry. The useful question is not the number, it is which of your words were judgement and which were transport.
A verification step that reports success because it examined nothing. A selector matching zero elements passes every assertion applied to it. Eleven separate instances appear in this archive with four distinct root causes: selectors for classes that do not exist, controls structurally outside the selector list, coverage claimed for pages never visited, and constants that prevented the asserted state from ever rendering.
Because a single agent grades its own homework. Every one of the eleven false passes was caught by a reader who had not written the thing being checked. The second reader is not redundancy, it is the only mechanism in the system that can catch a confident wrong answer.
Four working directories: inbox for tickets, outbox for reports, evidence for raw unedited command output, and tools for scripts. In this project they held 43 tickets, 41 reports and 354 evidence files. The scaffold is downloadable from module 10.
Because without it you are choosing between two fluent narrators. Rule 2 states that a claim with no citation is treated as unverified and ignored. That single sentence converts an exchange between two confident systems into something with an evidentiary standard, and every other rule depends on it.
It makes the boundary of your knowledge visible in the artefact rather than in someone's memory. When a figure is labelled ASSERTED, a reader knows immediately that nobody reproduced it. Unlabelled numbers all look equally solid, which is how a vendor claim ends up quoted as a measurement six months later.
Yes, and it still works, because the mechanism is separation of roles rather than diversity of models. The reader has not written the thing it is checking, which is what matters. Different models add a little independence of failure mode, but the structural benefit is available with one.
Four days, 15 to 18 August 2026, producing 43 tickets. That pace is only possible because the operator is not the bottleneck: while one agent worked a ticket, the next was already being written.
Fifty-two bytes of tap-target CSS were silently reverted by a bulk push, twice. A rollback file was corrupted by a PowerShell UTF-8 byte-order mark, leaving it three bytes too large. Two evidence files were byte-identical with one cited as a staging run and the other as live, and neither contained a theme identifier. All three are in the archive because the protocol required them to be.
Because it is a representation about the product rather than a defect in it. A hardcoded certification string reached 178 product pages, 177 of which have no recycled fabric. That is not a rendering error, it is a claim the store cannot support, and the exposure is regulatory rather than technical.
Not before you check its grounds. In this archive an agent refused a direct, twice-repeated instruction to display a certification mark, having established that the store was not the certificate holder. It was right, and the operator accepted. An operator who cannot tolerate a well-grounded refusal will eventually publish something they cannot defend.
Make the denominator part of the report and compare it against the previous run. In this project a harness went from ten checks to four and was reported as 4/4 improved. The check that catches this is arithmetic, not judgement: if the total moved, say why before anyone reads the ratio.
An absent element must never read as a pass. A check that finds nothing must fail closed and say so. If your harness cannot distinguish zero problems from zero elements examined, every green result it has ever produced is uninformative.
No. The protocol is tool-agnostic — it needs a chat surface, a second agent with filesystem access, and a shared folder. Cowork suited it because the same session can read the folder, drive a browser and call the Shopify Admin API, which removes several relay steps. The eight rules would work over email.
Confirm the asset version token changed, then measure against a cache-busted URL. In this archive the same fix was reported as failed three times: once because the measurement predated the push, once because the cache-bust preserved the pinned version, and once because the geometry was read inside a scaled ancestor.
Because the mistakes are the transferable part. Anyone can copy eight rules; the reason those particular eight exist is that something failed without them. Three of the standing rules in this project were written immediately after the failure that made them necessary, by the agent that failed.
Make the folder, write the eight rules into a README, and issue one read-only diagnostic ticket about something already annoying you. Do not grant WRITE MODE on the first ticket. The forge in module 10 will generate the ticket and the scaffold for you.
