Skip to the masterclass

Home / DDS Vibe Academy / 1,032 Words, Zero Lines of Code

DVA · Class #84 · Free · No signup

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.

Advanced95 minMastery stage Claude laneShipped 2026-08-195 interactive modules
43Tickets
4Days
1,032Words typed
0Lines of code
8.5%Authorship

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.

How the numbers are labelled. MEASURED came from a command or API response somebody can point at. CALCULATED is derived from measured values with the arithmetic shown. ASSERTED means a source claims it and nobody reproduced it. UNVERIFIED means we tried and could not. That labelling is not decoration — it is rule 3 of the protocol this class is about, and it is applied to this page too.

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.

◎ Interactive — the ledgerhover or focus a ticket

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.

1. Raw output only in evidence/. Redirect the command's real stdout/stderr to the file. Do not retype, reformat, truncate, or summarize. If it is 800 lines, it is 800 lines. 2. Every claim in a report cites an evidence file. A claim with no citation will be treated as unverified and ignored. 3. Label every number: MEASURED / CALCULATED / ASSERTED 4. Write UNVERIFIED when you could not check something. Do not fill gaps from memory, from earlier in the conversation, or from what the code "should" do. A report with honest gaps is worth more than a complete-looking one with invented parts. 5. No mocking, no interception, no simulated responses in any verification step. Hit the real service, the real API, the real DOM. 6. Read-only unless the ticket says WRITE MODE. A ticket that authorizes writes says so explicitly at the top, and lists exactly which files you may modify. 7. Never push to the live theme. All theme work lands on staging. Promotion to live is a separate, explicitly authorized ticket. 8. Stop and write a report when blocked. Do not improvise a different approach, do not expand scope, do not "fix" adjacent things you noticed.

The loop, and where the human actually sits

1 Claude writes inbox/TICKET-NNN-*.md 2 Rob tells the agent to read _exchange/inbox/ and work the lowest unanswered ticket 3 Agent writes evidence to evidence/, then outbox/REPORT-NNN-*.md 4 Rob tells Claude the report is ready 5 Claude reads the report and evidence, verifies independently, writes the next ticket

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.

Rule 2 is the load-bearing one. "A claim with no citation will be treated as unverified and ignored" converts a chat between two confident systems into something with an evidentiary standard. Without it, every other rule is a suggestion.

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.

1,032 typed8.5% authorship11,140 pasted

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

I need the prompt for the agent for the ticket.— the operator, TICKET-030 window

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

this is the most important section file in the store and you guessed!!!! OMG WTF. You are going to pull the LIVE FUCKING SECTION FILE NOW and full READ it before you code.— the operator, TICKET-007 window

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 four kinds of message. Of the operator's turns: DIRECTION (instructing), RELAY (pasting a report back untouched), DECISION (approving, authorising, choosing), and CORRECTION (telling an agent it is wrong). Relays were the majority. Corrections were the rarest and the most valuable.

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

◎ Interactive — the prompt archive

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

Read the corrections back to back. Four messages in the whole programme tell an agent it is wrong, and every one of them changed the outcome: read the file instead of guessing, verify in a browser yourself, those templates are dead, and not all of our products are GOTS. That last one, in a parenthesis, is where the certification arc starts.

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.

◎ Interactive — the Adjudicatorround 1 of 8
Round 2 is the one worth sitting with. The operator gave a direct instruction, twice, with emphasis. The agent refused, on grounds it had checked. An agent refusing you can be the correct outcome, and an operator who cannot tolerate that will eventually publish a claim they cannot support.

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.

◎ Interactive — spot the false passround 1 of 5

Four root causes, one rule

Blind spotWhat it looked likeWhy the check could not see it
Selector for a class that does not exist3/3 PASSZero matched elements is not zero failures. An empty set passes every assertion in it.
#FilterDrawerOpen at 109×403/3 PASSStructurally outside a three-entry selector list. The control existed; the list did not know about it.
Product-page gatecoverage OKCoverage was claimed for a page the harness never visited. It went red at 114×42 the moment it was opened.
MAX_BADGES = 2assertions passNo card ever rendered the third badge, so the assertions about it were true and meaningless.
Harness reporting 10 checks4/4 PASSSix 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:

block 1 { 82 } 81 ← one unclosed block 1 ( 212 ) 211 ← and one unclosed paren block 2 { 47 } 48 ← one EXTRA closer

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.

◎ Interactive — the brace auditorthe real tool, running here

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.

Four lessons in one ticket. The symptom named the wrong subsystem. The safety net had its own independent failure. Structure and runtime state found what reading the code did not. And the fix closed to the byte — +288 = 94 + 194, two insertions accounted for exactly.

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 reportedWhy it was wrong
1Buttons measure 42 px, fix not in effectThe measurement predated the 15:02 push. It was reporting a real number about an old build.
2Still 42 px after cache-bustingThe “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.
3Rendered box is 44.16×42.24, below the 44 px floorgetBoundingClientRect() 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.

What the loser did next. Rather than quietly correcting, the reviewing agent wrote its own three failures into the next ticket as the deliverable: “I got this wrong three times and the protocol is the deliverable.” Two standing rules came out of it — measure geometry on the layout box and print the ancestor matrix; and a page load is not fresh unless the version token changed.

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.

bytes md5 state 112,089 d748a4f2… live, pre-Phase-C 110,938 2ec6041d… post-Phase-C delta −1,151 (35 lines removed) 110,990 staging, tap-target fix delta +52 112,719 57257572… post-Load-More fix delta +1,781 112,771 5c19efc9… tap-targets re-applied delta +52 ← the same 52 bytes, again 112,789 f8c74207… #FilterDrawerOpen fix delta +18

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.

A rollback that could not roll back. One recovery artefact was written through PowerShell and came back three bytes larger than the file it was meant to restore — a UTF-8 byte-order mark, 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

Don't average them. Find out which is right.— the adjudication standard, used throughout

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

setting: "Force cert badge on every card" collection.json → GOTS hardcoded, applied to every card collection-clothing.json → GOTS collection-drinkware → GOTS collection-accessories → GOTS collection-recycled → GRS collection-staging-testJUDGE ← rendered inside a gold certification pill

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.

For the record, and because this class is published by the store in question: Design Delight Studio holds GOTS, GRS, OCS and PETA-Approved Vegan. It does not hold Fair Trade and has never claimed it. OEKO-TEX is referenced per-product by certificate number where a supplier holds it, never as a brand-level mark. That precision is the entire point of this module.

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

◎ Interactive — the funnel, honestlyclick a band for its exclusion rule

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.

◎ Interactive — what was in the payloadtoggle the card count
16,384 limit

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.

683Products live
2,869URL redirects
301Dead locale now redirects
0Themes published but MAIN

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.

◎ Interactive — your authorship ratioruns entirely on your machine

The number is a prompt, not a grade. A high ratio is not failure — it means you are still doing work a protocol could be doing. The question to ask of your own figure is: which of those words were judgement, and which were transport? Only the first kind needs you.

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.

◎ Interactive — the ticket forgecopy, or download the whole scaffold

          

Twelve prompts that did the work

Adapted from the archive, generalised, and ordered by when you need them.

WhenPrompt
Opening a diagnosisRead _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 writtenPull 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 accessWRITE 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 evidenceEvery 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 cleanlyWhich 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 disagreeYou 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 smellsReport 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 pushConfirm the asset version token changed before you measure. A page load is not fresh unless ?v= moved.
Before a promotionList 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 livePromote 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 severityTreat this as SEV1. Stop other work. Establish blast radius first — how many live pages carry it — before proposing any fix.
Closing a ticketSummarise 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.

◎ Your sessionstays in this browser

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.

Class #84 · DDS Vibe Academy · free, no signup, no email, no certificate.

Reconstructed from the project's own artefacts: 561 transcript messages, 43 tickets, 41 reports, 354 evidence files. Every credential in the source archive is published here as shpat_REDACTED. No live token, key, customer record or order-level datum appears in this file.

Prerequisites: Class #51 — Claude Cowork · Class #66 — Cowork Production Stack