The website clone system

Everything it takes to rebuild a website and prove it

A pixel verified website cloning and machine readiness pipeline, explained in full: 16 stages in the order they must run, 106 configured numbers with what each one protects, 40 module contracts, 24 tests, the failures that shaped all of it, and the whole starter kit downloadable from this page. No signup, no email, nothing held back.

Get the kit Read the pipeline
The output first

Four pages, rebuilt and measured

Every number below came out of one real run against the test site that ships inside the kit on this page. You can run it yourself and get your own.

Pixel fidelity, site average
99.88
Out of 100, measured against the capture
Machine readiness, before
42
The original site as found
Machine readiness, after
100
The same pages, rebuilt
Readiness by axis, before and after
BeforeAfter
schema
metadata
semantics
media
links
crawler Access
llms
agent Surface

Eight readiness axes measured before and after the rebuild. Site score moved from 42 to 100.

The lowest scoring page was contact.html at 99.63 pixel fidelity, and it stayed the lowest through the whole run. A system that only reports its average is hiding its worst page.

That fidelity average is 99.88 and not 100, on a test site with no third party scripts and no fonts to load. This is the honest ceiling: capture is not deterministic, it moves about two points run to run, and the correct response to a score inside that band is to leave it alone.

In plain words

What this actually is

The problem

Rebuilding somebody's website by hand takes days, and the rebuild is never quite the same page. Meanwhile the thing that decides whether that business gets found has changed: people ask an assistant instead of scrolling a results list, and assistants read structure, not layout.

What it does

This takes one web address and produces a working copy of that site that looks the same, plus the machine-readable structure the original was missing. It proves the copy looks the same by taking a picture of both and comparing them pixel by pixel, and it refuses to ship a page that failed that comparison.

What you get

A folder you can open. The pages, their assets, a score for how closely each page matched, a score for how ready the site is to be read by a machine, and a report that shows both numbers with the failures listed rather than summarized.

If that is enough, the whole thing is downloadable from the kit section with no form and no email. The rest of this page is how it works and why each part is shaped the way it is.

What it cost to learn

Five failures that shaped every threshold below

These are published early on purpose. Anyone can show you a passing run. The useful part of a system is the list of ways it already broke, because that is what the numbers in the config are actually defending against.

The crash that only happened at the end

A network request that arrives while the browser context is already closing rejects when you fulfill it AND rejects when you let it continue. Catching one leaves the other, and an unhandled rejection takes the whole process down.

What it costLong jobs died near completion, after all the expensive work was already done.
The fixSwallow both sides of the route, add a process level backstop that writes the crash state with the phase it died in, and give the watchdog something to resume from. Three separate pieces, because any one of them alone still loses the job.
Where it livesThe capture modules, the CLI backstop, and the watchdog script.

Re-running a job to chase a better number

Capture is not deterministic. Fonts, animation timing and lazy loading land differently run to run, and the fidelity score moves by around two points for reasons that have nothing to do with the clone being better or worse.

What it costHours spent re-running jobs whose score was already inside the noise.
The fixRead the band, not the digit. A score that moves inside the noise is the same score, and a re-run is only justified by a diagnosed cause.
Where it livesA rule, not a code path. This one is only ever enforced by the person running it.

The second copy of the same page

Many sites serve mobile from the same document as desktop. Capturing a separate mobile tree on one of those produces a duplicate that immediately starts to drift, and then the diff compares against the wrong baseline.

What it costA doubled tree and a fidelity number measured against something that was never the page.
The fixDecide the architecture before capturing: compare element counts between what the two user agents return, and when the site is one document, delete the mobile tree by design.
Where it livesThe detection ratio in the config, and the architecture verdict written into the job.

Screenshots that lie on very tall pages

Past a certain rendered height the browser hands back stale or blank frames instead of the page. The diff then compares two mostly empty images and reports an excellent score.

What it costA passing gate that meant nothing, which is worse than a failing one.
The fixCap the screenshot height and tile the comparison. Never verify a tall page in one frame.
Where it livesThe screenshot height ceiling in the config, read by the capture module.

The optimizer quietly outranking the gate

The heading rewrite runs by default, because it is usually right. It also moves pixels, which is exactly what the fidelity gate exists to catch. Two correct systems disagreeing looks identical to a capture bug.

What it costFidelity failures investigated as capture problems, more than once.
The fixWrite a sidecar copy of the page before the mutation, let the pixel gate arbitrate, revert from the sidecar automatically when it fails, and put every revert on the audit list so a person sees the disagreement instead of the system resolving it silently.
Where it livesThe Tier 2 attempt and gate in the optimization passes, arbitrated in the job runner.
The order

Sixteen stages, and the order is the argument

You cannot select pages you have not surveyed, price a job you have not sized, or verify a page you have not captured. The sequence is a dependency chain, not a preference.

1 SURVEY 2 SELECT 3 ESTIMATE 4 CAPTURE 5 TRANSFORM 6 OPTIMIZE 7 INTERACT 8 REFRESH 9 REDESIGN 10 VERIFY 11 TIER2 12 BEHAVIOR 13 SPEED 14 PACKAGE 15 PATTERNS 16 DONE

blocked-budget and crashed are not stages. They are the two ways a job exits early, and counting them as steps teaches a pipeline that does not exist. A crash writes the phase it died in so a resume knows where to pick up.

The verification step, live

Run the comparison in this page

This is the arithmetic the pipeline runs at the verify stage, executing in your browser on two real capture screenshots from the run above. Nothing is fetched and nothing is precomputed.

Read what these two images are before you read the number. They are captures of two different pages of the test site, not an original and its clone. That is deliberate, because it gives the demo both controls a measurement needs: comparing a capture with itself must return exactly 100, and comparing two genuinely different pages must return something poor. A tool that cannot produce both answers is not measuring anything.

Both images are downscaled here to keep this page's weight sane, so the number this demo computes is the arithmetic, not the official score from the run. The official score is in the first section and it came from the full resolution frames.

Pixel comparisonNot run
Capture of the test site home page
Home page capture, 1440 by 2588 at full size
Capture of the test site services page
Services page capture, 1440 by 1664 at full size
The difference map appears here. Changed pixels paint red.

A live pixel comparison of two captured screenshots, computed in the browser.

The pass threshold in the shipped config is 99 out of 100. Run both buttons: one result must land exactly on 100 and the other must land far below the threshold. If a comparison tool cannot do both, its passing scores mean nothing.
Stage by stage

Each stage leads with the rule it exists to enforce

Every stage below carries the same five fields, filled in every time. A blank in a table like this is where a system stops being explainable.

1SURVEY
You cannot clone what you have not counted.
Purpose
Walk the site from its entry point and discover every reachable page, classifying each one by type.
In
One start URL.
Out
A page list with type, depth and link graph.
Fails when
An unbounded crawl. Without a page ceiling and a depth ceiling a calendar widget or a faceted filter generates URLs forever.
Numbers
survey.maxPages 10000, survey.maxDepth 4, survey.requestDelayMs 350, survey.requestTimeoutMs 15000, and 2 more in the table below
2SELECT
A bounded page set is a promise you can keep.
Purpose
Cut the surveyed list down to the pages the offer actually covers, excluding pagination, feeds and archive noise.
In
The survey page list.
Out
The selected core pages.
Fails when
Selecting by count instead of by pattern. The first N pages of a blog are not the core pages of a business.
Numbers
None. This stage is governed by the stages around it.
3ESTIMATE
Price the job before the job prices you.
Purpose
Estimate the AI spend for the chosen optimization level from the real page count, and refuse to start if it breaks the budget.
In
Page count and level.
Out
A cost estimate per level and a budget verdict.
Fails when
Estimating after the spend. A budget gate that runs at the end is a receipt, not a gate.
Numbers
pricePerMTokIn 3, pricePerMTokOut 15, levels.1.label "Verbatim + optimization", levels.1.tokensInPerPage 0, and 11 more in the table below
4CAPTURE
Capture the rendered page, not the source.
Purpose
Open each page in a real browser, wait for fonts and hydration, scroll it to trigger lazy loading, then serialize the settled DOM and download every asset it references.
In
The selected pages.
Out
A local tree of HTML and assets, plus screenshots at each viewport.
Fails when
Serializing too early. A framework site captured before hydration is a page of empty containers that still scores as a successful capture.
Numbers
capture.concurrency 4, capture.perHostDelayMs 500, capture.navTimeoutMs 30000, capture.settleExtraMs 800, and 12 more in the table below
5TRANSFORM
Remove what phones home. Change nothing that shows.
Purpose
Strip third-party trackers and neutralize forms that post to somebody else, under a contract that no visible pixel may move.
In
The captured tree.
Out
The same tree with tracking and live form actions removed.
Fails when
Stripping a script that was also doing layout. The no-visual-change contract is what separates this stage from vandalism.
Numbers
trackerDomains ["google-analytics.com","googletagmanager.com","connect.facebook.net","hotjar.com","clarity.ms"], keepEmbedDomains ["youtube.com","youtube-nocookie.com","player.vimeo.com","google.com/maps"], bannerSelectors ["#cookie-banner",".cookie-consent","[id*=\"gdpr\"]","[class*=\"consent\"]"], residualScriptPatterns ["dataLayer","gtag(","fbq(","_paq.push"]
6OPTIMIZE
A page that machines cannot read is invisible to the machines people now ask.
Purpose
Add the machine-readable layer: structured data, metadata, crawler rules, an agent surface and markdown twins, then score the result.
In
The transformed tree.
Out
The same pages plus schema, metadata, robots rules, agent files and a readiness score.
Fails when
Treating every recommendation as equally proven. Each pass here carries an evidence label, and the ones marked opinion are labelled opinion.
Numbers
meta.section "Metadata and Open Graph", meta.evidence "DATA", meta.note "Complete titles, descriptions and OG tags feed classic snippets and AI answer cards. Titles are never rewritten; over-60-character titles become audit items.", schema.section "Structured Data", and 41 more in the table below
7INTERACT
A clone that looks right and does nothing is a screenshot.
Purpose
Re-attach behaviour to the widgets whose original JavaScript was stripped or died with the origin: menus, dropdowns, accordions, tabs.
In
The optimized tree.
Out
The same tree with self-contained behaviour restored and dead scripts made inert.
Fails when
Leaving dead scripts loaded. A script that throws on load can stop every later script on the page, including the ones you just added.
Numbers
None. This stage is governed by the stages around it.
8REFRESH
Rewriting words is cheaper than rewriting layout, and safer.
Purpose
Optional AI pass that rewrites copy block by block while leaving the DOM structure and layout exactly where they are.
In
The tree plus a copy brief.
Out
The same structure with new words, graded against a rubric.
Fails when
Letting the model return prose instead of the block contract. Structure survives only if the output shape is enforced.
Numbers
levels.2.label "Refresh", levels.2.tokensInPerPage 6000, levels.2.tokensOutPerPage 2500
9REDESIGN
Keep the facts, replace the frame.
Purpose
Optional AI pass that keeps the content (headings, copy, images, links, contact details) and rebuilds the layout around it.
In
The tree plus a theme.
Out
A re-laid-out site carrying the same facts.
Fails when
Inventing facts. Everything the model may state has to be extracted from the source first and handed to it as a fixed list.
Numbers
levels.3.label "Full redesign", levels.3.tokensInPerPage 12000, levels.3.tokensOutPerPage 8000
10VERIFY
The clone is only as good as the number that compares it.
Purpose
Serve the clone locally, re-render every page in the same browser at the same viewport, and diff it pixel by pixel against the capture screenshot.
In
The built tree and the capture screenshots.
Out
A fidelity percentage per page, with pass, warn and fail bands.
Fails when
Comparing against the live site instead of the capture. Live pages change under you and the diff then measures the internet, not your work.
Numbers
detection.sameDocElementRatio 0.85, detection.sameDocTagSimilarity 0.9, detection.sameDocTextSimilarity 0.8, detection.ambiguousBand 0.03, and 5 more in the table below
11TIER2
A fix that moves pixels is not a fix. It is a redesign nobody asked for.
Purpose
Apply the queued repairs, then re-diff. Any fix that drops fidelity below the gate is reverted and escalated to a human instead.
In
The verified tree and the fix queue.
Out
Fixes kept, fixes reverted, and items flagged for a person.
Fails when
Letting the optimizer outrank the gate. When the two disagree the gate wins and the disagreement is reported, never quietly resolved.
Numbers
verify.passThreshold 99
12BEHAVIOR
Click it. A widget that renders is not a widget that works.
Purpose
Serve the finished clone offline and actually drive its interactive elements at every viewport, asserting that each one changes state.
In
The packaged tree.
Out
Interactions attempted and interactions passed, per viewport.
Fails when
Detecting widget families by a different marker set than the one the restore pass writes. The two halves must agree or the verifier reports zero of zero and reads like success.
Numbers
capture.viewports.desktop.width 1440, capture.viewports.desktop.height 900, capture.viewports.mobile.width 390, capture.viewports.mobile.height 844
13SPEED
Fast is a feature agents measure.
Purpose
Run a real performance audit against a sample of pages at desktop and mobile and require green core web vitals.
In
The packaged tree.
Out
Performance, accessibility and SEO scores per sampled page.
Fails when
Sampling only the home page. The home page is the one page somebody already optimized.
Numbers
None. This stage is governed by the stages around it.
14PACKAGE
Ship a folder someone else can open without you.
Purpose
Emit the publishable artifacts: sitemap, robots, a human-readable report and a zip of the whole tree.
In
The verified tree and every stage report.
Out
A zip and a report page.
Fails when
A sitemap listing pages that were never captured. An honest sitemap contains what shipped, not what was surveyed.
Numbers
package.zipName "{jobId}-{domain}-clone.zip"
15PATTERNS
Every job should make the next job cheaper.
Purpose
Deposit a structured record of what this site looked like and what worked on it, so recognition improves with volume.
In
The finished job.
Out
One record per page in a pattern library.
Fails when
Storing the pages instead of the patterns. The library is for shapes, not for content.
Numbers
None. This stage is governed by the stages around it.
16DONE
Done is a state the machine writes, not a feeling the operator has.
Purpose
Terminal state. Every earlier stage wrote its own report, so the job can be audited without rerunning anything.
In
A completed pipeline.
Out
A job marked done with its full report trail.
Fails when
Treating a crash as done. Failure exits are their own states and are never counted as pipeline stages.
Numbers
None. This stage is governed by the stages around it.
Every number

All 106 thresholds, and what each one defends

Where these came from, and where they do not apply. Every number here was tuned on brochure style sites: a marketing site of tens to low hundreds of pages, server rendered or lightly hydrated, with a normal amount of imagery. Other classes of site behave differently. A heavy single page application needs a longer hydration wait and will still fail the architecture check. A media site will hit the asset ceilings long before the page ceiling. A store is gated out at intake rather than tuned for.

How to check them against your own site, without guessing. Run one job with the defaults and read three things: the survey count against what you believe the site has, the per page fidelity spread rather than the average, and the asset byte total against the ceiling. A ceiling you never reach is the wrong ceiling to tune. Change one number, re-run the same site, and compare the same three readings. Changing two at once tells you nothing about either.

One rule outranks all of them: never raise a threshold to clear a gate. The threshold is the product. Raising it converts a known failure into an unknown one.

cloner.json37 values
KeyValueStageWhat it protects
version 1 Structural. Not a tuning knob.
port 3434 Structural. Not a tuning knob.
survey.maxPages 10000 SURVEY The machine. A faceted filter or a calendar generates URLs forever; this is the stop.
survey.maxDepth 4 SURVEY Relevance. Past four hops from the home page you are crawling archives, not the business.
survey.requestDelayMs 350 SURVEY Somebody else's server. This is the politeness budget and it is not a performance setting.
survey.requestTimeoutMs 15000 SURVEY The queue. One hanging request must not stall the crawl.
survey.userAgent "YourCloner/0.1 (+https://example.com/crawler; site rebuild tool)" SURVEY Your reputation. Identify yourself and point at a page explaining what you are doing.
survey.quickPreviewPages 5 SURVEY Serves the SURVEY stage. You cannot clone what you have not counted.
capture.concurrency 4 CAPTURE Your own machine. Each unit is a browser tab holding a full page in memory.
capture.perHostDelayMs 500 CAPTURE The origin server, again, this time under parallel load.
capture.navTimeoutMs 30000 CAPTURE The job. A page that will not load is a page you skip, not a job you lose.
capture.settleExtraMs 800 CAPTURE Fidelity. Animations and late layout land in this window.
capture.maxHydrationWaitMs 5000 CAPTURE Correctness on framework sites. Serialize before hydration and you capture empty containers.
capture.viewports.desktop.width 1440 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.viewports.desktop.height 900 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.viewports.mobile.width 390 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.viewports.mobile.height 844 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.tabletHarvest.width 834 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.tabletHarvest.height 1112 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.tabletHarvest.settleMs 400 CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
capture.maxAssetBytes 26214400 CAPTURE Disk, per asset. A single video can outweigh an entire site.
capture.maxTotalAssetBytes 524288000 CAPTURE Disk, per job. The ceiling that actually binds.
capture.maxScreenshotHeightPx 12000 CAPTURE The diff. Beyond this height the browser returns stale or blank frames and the comparison silently lies.
capture.retryLadder [0,1500] CAPTURE Serves the CAPTURE stage. Capture the rendered page, not the source.
detection.sameDocElementRatio 0.85 VERIFY The architecture verdict: whether mobile is the same document or a separate one.
detection.sameDocTagSimilarity 0.9 VERIFY Serves the VERIFY stage. The clone is only as good as the number that compares it.
detection.sameDocTextSimilarity 0.8 VERIFY Serves the VERIFY stage. The clone is only as good as the number that compares it.
detection.ambiguousBand 0.03 VERIFY Serves the VERIFY stage. The clone is only as good as the number that compares it.
detection.enforce true VERIFY Whether the verdict blocks or merely advises.
verify.passThreshold 99 VERIFY The promise. Below this a page is not a clone, and this number outranks every optimizer.
verify.warnThreshold 95 VERIFY The escalation line. Between warn and pass a human looks.
verify.pixelmatchThreshold 0.1 VERIFY Signal. Too tight and antialiasing reads as failure; too loose and real breakage reads as success.
verify.tileHeightPx 2000 VERIFY Memory during the diff of a tall page.
package.zipName "{jobId}-{domain}-clone.zip" PACKAGE Serves the PACKAGE stage. Ship a folder someone else can open without you.
booking.enabled false Structural. Not a tuning knob.
booking.endpoint "" Structural. Not a tuning knob.
booking.successMessage "Thanks. We got your request and will call you back shortly." Structural. Not a tuning knob.
pricing.json18 values
KeyValueStageWhat it protects
version 1 Structural. Not a tuning knob.
note "AI spend model per optimization level. Level 1 uses no AI. Token estimates per page; prices per million tokens." Structural. Not a tuning knob.
model "claude-sonnet-5" Structural. Not a tuning knob.
pricePerMTokIn 3 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
pricePerMTokOut 15 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.1.label "Verbatim + optimization" ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.1.tokensInPerPage 0 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.1.tokensOutPerPage 0 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.2.label "Refresh" ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.2.tokensInPerPage 6000 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.2.tokensOutPerPage 2500 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.3.label "Full redesign" ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.3.tokensInPerPage 12000 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
levels.3.tokensOutPerPage 8000 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
phase2Level1.tokensInPerPage 3000 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
phase2Level1.tokensOutPerPage 900 ESTIMATE Serves the ESTIMATE stage. Price the job before the job prices you.
defaultBudgetUsd 10 ESTIMATE The invoice. The gate runs before the spend, not after.
warnAtBudgetRatio 0.8 ESTIMATE Warning lead time before the budget gate fires.
strip-lists.json5 values
KeyValueStageWhat it protects
version 1 Structural. Not a tuning knob.
trackerDomains ["google-analytics.com","googletagmanager.com","connect.facebook.net","hotjar.com","clarity.ms"] TRANSFORM Serves the TRANSFORM stage. Remove what phones home. Change nothing that shows.
keepEmbedDomains ["youtube.com","youtube-nocookie.com","player.vimeo.com","google.com/maps"] TRANSFORM Serves the TRANSFORM stage. Remove what phones home. Change nothing that shows.
bannerSelectors ["#cookie-banner",".cookie-consent","[id*=\"gdpr\"]","[class*=\"consent\"]"] TRANSFORM Serves the TRANSFORM stage. Remove what phones home. Change nothing that shows.
residualScriptPatterns ["dataLayer","gtag(","fbq(","_paq.push"] TRANSFORM Serves the TRANSFORM stage. Remove what phones home. Change nothing that shows.
playbook-map.json46 values
KeyValueStageWhat it protects
_source "https://[redacted]/ (SwarmSystem SEO + AI-visibility playbook). Evidence labels: DATA = measured correlation or platform documentation; MIXED = partial evidence; OPINION = forward-looking convention." Structural. Not a tuning knob.
meta.section "Metadata and Open Graph" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
meta.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
meta.note "Complete titles, descriptions and OG tags feed classic snippets and AI answer cards. Titles are never rewritten; over-60-character titles become audit items." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
schema.section "Structured Data" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
schema.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
schema.note "Does not directly cause citations; feeds rich results, the local pack and the knowledge graph. One connected @graph per page, fact-gated fields only, no FAQPage (dead for general sites, May 2026)." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
semantic.section "Canonical and Semantics" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
semantic.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
semantic.note "Canonical hygiene prevents duplicate-content splits; lang and landmarks help parsers." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
robots.section "AI Crawler Access" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
robots.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
robots.note "Named Allow blocks for search and AI assistant crawlers; Bytespider blocked (scraper, no citation value)." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
llms.section "Not Recommended" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
llms.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
llms.note "Zero citation correlation measured; emitted as zero-cost bonus surface only. Scores 0 in readiness v2." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
agentsJson.section "Agent Surface" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
agentsJson.evidence "OPINION" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
agentsJson.note "Emerging convention; low cost, forward-looking capability manifest." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
mdTwins.section "Agent-Readable Content" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
mdTwins.evidence "MIXED" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
mdTwins.note "Markdown twins give agents a clean text surface; adoption evidence still early." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
webmcp.section "Agentic Actions (WebMCP)" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
webmcp.evidence "OPINION" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
webmcp.note "Google I/O 2026 direction; declarative form tools so agents know what actions the site supports." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
iconFonts.section "Icon Font Repair" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
iconFonts.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
iconFonts.note "Origin-absolute font-face URLs break glyph fonts offline and CORS-fail online; repaired to captured local assets so hamburger, social and detail icons render. Unresolved fonts (never fetched by the origin page) are audit items." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
images.section "Media Performance" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
images.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
images.note "Intrinsic dimensions remove layout shift; lazy below-fold plus hero preload move LCP. Core Web Vitals are ranking signals." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
links.section "Internal Linking" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
links.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
links.note "Orphan and deep pages crawl poorly; descriptive anchors carry relevance. Audit-only: visible changes need a human." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
headings.section "Heading Structure" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
headings.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
headings.note "Exactly one H1 per page; fixes are attempted and kept only when the pixel gate passes, auto-reverted otherwise." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
sitemap.section "Honest Sitemap" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
sitemap.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
sitemap.note "Real pages only, lastmod from capture time, no m/ duplicates, no priority or changefreq noise." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
canonical.section "Mobile Canonical" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
canonical.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
canonical.note "m/ pages canonicalize to the desktop URL so the duplicate tree never competes with the primary." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
architecture.section "Site Architecture" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
architecture.evidence "DATA" OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
architecture.note "Per-site single-document vs ua-split verdict from structural comparison of what the origin serves desktops and phones. One document ships as one file per page; two documents stay faithfully mirrored and loudly labeled, with Level 3 as the one-file conversion path." OPTIMIZE Serves the OPTIMIZE stage. A page that machines cannot read is invisible to the machines people now ask.
The parts

40 modules, grouped by the stage they serve

A flat list of file names teaches nothing. Grouped by stage, the same list shows you where the weight sits: the optimize stage carries the most code because it is doing the most different jobs, and the four capture modules exist because desktop, mobile, harvest and extraction are genuinely different problems.

Each contract below is the module's own opening docblock, taken from source rather than written for this page. Where one reads oddly, that is the real state of the comment.

What the tests defend

The full build ships 24 test files. They are listed here by what each one holds in place rather than by what it calls, because the second list is the one that goes stale. The kit carries the same list with a note on which are worth writing first.

Test files24
FileWhat it defends
behavior-verify.test.jsbehavior verify
behaviors-runtime.test.jsbehaviors runtime
copy.test.jscopy
core-pages.test.jscore pages
cost-package.test.jscost package
crawler.test.jscrawler
describe.test.jsdescribe
detection.test.jsdetection
directory-mode.test.jsdirectory mode
doc-compare.test.jsdoc compare
geometry.test.jsgeometry
icon-fix.test.jsicon fix
integration.test.jsintegration
interaction.test.jsinteraction
media-links.test.jsmedia links
mobile-parity.test.jsmobile parity
optimize.test.jsoptimize
phase3.test.jsphase3
scorer.test.jsscorer
seo.test.jsseo
srcset.test.jssrcset
tablet-harvest.test.jstablet harvest
tier2-gate.test.jstier2 gate
widget-registry.test.jswidget registry
Run with the platform test runner, no framework. A pipeline this long needs tests that fail loudly on the seam between two stages, which is where the real breakage lives.
Skills and agents

There is no agent driving this engine, and that matters

The honest answer first. No dedicated skill and no dedicated agent runs this pipeline. It is run three ways and only three ways: a command line entry point, a local server with a browser interface on top of the same pipeline, and a dashboard module that calls the same server. Anyone telling you a swarm of agents clones the site is describing something else.

The word agent is doing three different jobs in this space, and conflating them is how people end up building the wrong thing. Here are all three, separated.

1. The runner

What executes the pipeline. Here that is plain code with a stage loop. Deterministic, resumable, and boring on purpose. This is the part people imagine is an agent. It is not.

2. The model call inside a stage

Two optional stages hand a page to a language model and take structured output back. That is the only place a model touches the work, it is bounded by a prompt contract, and its output is still subject to the same pixel gate as everything else.

3. The surfaces the output emits

The finished site carries machine readable files so that other people's agents can read it. This is the opposite direction: not an agent running the system, but the system feeding agents.

The model call, with its prompt contract

Both optional stages use the same shape: a fixed list of facts the model may not invent, a block contract that says what structure must come back, and a rubric the output is graded against before it is accepted. The prompts below are templates carrying that shape, not our production prompts.

prompts/copy-rewrite.md, Copy rewrite prompt template (the REFRESH pass)
This is a TEMPLATE, not a production prompt. It carries the shape that matters and leaves
the voice to you. The shape is the transferable part: a block contract, a fixed fact list, and a
rubric the output is graded against before it is allowed to land.

## Why it is shaped this way

The refresh pass rewrites words while leaving layout alone. That only holds if the model returns
the same blocks it was given. Ask for prose and you get prose, and the layout is gone. So the
prompt hands over an array of blocks and demands the same array back.

Every fact the model is allowed to state is extracted from the source page first and passed in as
a closed list. A model with no fact list invents phone numbers.

## The template

    ROLE
    You rewrite website copy. You do not design, you do not restructure, and you do not add facts.

    INPUT
    blocks: [{ id, type, text }]        the page, one entry per editable block
    facts:  { name, phone, address, services[], hours }   the ONLY facts you may state
    brief:  { audience, tone, readingLevel, banned[] }

    HARD CONSTRAINTS
    1. Return exactly one entry per input block, same ids, same order.
    2. Never state a fact that is not in `facts`. If a block needs one you do not have, keep the
       original text for that block and set `kept: true`.
    3. Stay within {minRatio} and {maxRatio} of the original character count per block

[ ... ] The full template ships in the kit. Use the copy button above for all of it.
prompts/redesign.md, Redesign prompt template (the REDESIGN pass)
This is a TEMPLATE, not a production prompt. Same reasoning as the copy prompt: the shape
transfers, the taste does not.

## Why it is shaped this way

The redesign pass keeps the content and replaces the frame. The failure it exists to prevent is a
beautiful page that says something untrue, so the model never sees the original HTML. It sees an
extracted content model and a theme, and it renders from those.

Handing over the original markup invites the model to copy its structure, which defeats the point,
and to keep its stale facts, which is worse.

## The template

    ROLE
    You lay out a page from a content model and a theme. You render, you do not write.

    INPUT
    model: {
      title, headings[], paragraphs[], images[{src,alt,width,height}],
      links[{href,text}], nap: { name, address, phone }
    }
    theme: { palette[], displayFont, bodyFont, density, radius }
    page:  { type, purpose }

    HARD CONSTRAINTS
    1. Every string you output comes from `model`. You may reorder and you may omit. You may not
       invent, and you may not paraphrase the NAP.
    2. Use only colours in `theme.palette`. The palette is closed.
    3. Every image keeps its width and height attributes. Layout shift is a scored defect.
    4. Exactly one top level heading.
    5. Self-contained output: no external stylesheets, fonts or scripts.

    OUTPUT
    One complete HTML docume

[ ... ] The full template ships in the kit. Use the copy button above for all of it.

The surfaces the finished site emits

Every clone ships these so that a machine reading it does not have to infer structure from layout. This page emits the same three, because a page that teaches this and does not do it is not worth reading.

JSON-LD

Typed structured data in the head, describing what the page is. Present in this page's head. Open the source and read it.

llms.txt

A plain text summary at a known path, for readers that want the shape of a site without crawling it. Served at /llms.txt and printed in full below.

agents.json

A machine readable statement of what is here and what may be done with it. Served at /agents.json and printed in full below.

These are not screenshots of a good idea. They are the exact bytes served at those two paths, printed here from the same source that writes the files, plus a robots.txt that allows the readers this page keeps talking about. A page that scores sites on machine access and then blocks it would not be worth the reading.

llms.txt, byte for byte as served
# The Website Clone System

> How a website cloning and agentic optimization pipeline works, stage by stage, with every threshold, every module contract, the failures that shaped it, and the whole starter kit downloadable from the page. Nothing gated.

Home: https://clone-system.swarmsystem.ai/

A complete, ungated explanation of a website cloning and agentic optimization pipeline, plus a
downloadable starter kit carried inside the page itself.

## Contents
- The pipeline: 16 stages in dependency order, each with the principle it enforces
- Thresholds: 106 configured values, each with what it protects
- Modules: 40 library contracts grouped by the stage they serve
- Tests: 24 test files with what each defends
- Failures: five published failures with their cost and their fix
- Operations: order states, concurrency governor, gates, delivery clock, alert types
- The kit: 70 files, 184.4 KB, downloadable with no signup

## Boundaries
- The kit is a templatized starter kit. Engine source is not included.
- Four of 16 stages ship implemented; the rest ship as declared contracts.
- No client data of any kind appears on this page or in the kit.
- The tool contains no detection evasion and defaults to polite crawling.

## Author
SwarmSystem
agents.json, byte for byte as served
{
  "version": "1.0",
  "name": "The Website Clone System",
  "description": "How a website cloning and agentic optimization pipeline works, stage by stage, with every threshold, every module contract, the failures that shaped it, and the whole starter kit downloadable from the page. Nothing gated.",
  "url": "https://clone-system.swarmsystem.ai/",
  "author": "SwarmSystem",
  "license": "Documentation and starter kit are free to use, adapt and redistribute.",
  "gated": false,
  "contents": {
    "stages": 16,
    "thresholds": 106,
    "modules": 40,
    "tests": 24,
    "kitFiles": 70,
    "kitBytes": 188823
  },
  "downloads": [
    {
      "name": "clone-system-kit.zip",
      "type": "application/zip",
      "mechanism": "assembled in the browser from text embedded in this page"
    },
    {
      "name": "clone-system.md",
      "type": "text/markdown",
      "mechanism": "assembled in the browser from text embedded in this page"
    }
  ],
  "boundaries": [
    "Engine source is not included. This is a starter kit.",
    "Four of sixteen stages ship implemented; twelve ship as declared contracts.",
    "No client data appears anywhere on this page or in the kit.",
    "No detection evasion features. Polite crawl defaults are in the shipped config."
  ],
  "usage": "Rebuild sites you are authorized to rebuild. The tool does not decide that for you."
}

The two definition files the kit ships

If you do want to drive this from an assistant, the kit carries a skill definition and an agent definition as templates. They are starting points shaped like the real thing, and they are in the file list below under skills-and-agents/. What they are not is a claim that we run it that way.

Running it at scale

One job is a script. Many jobs need a governor

The moment more than one of these runs at a time you are no longer running a tool, you are running a queue. This is the layer above the pipeline: what state an order is in, what stops too many at once, and what has to be true before a person sees the result.

Order states9
StatePlain wordWhat it means
RECEIVED WAITINGA paid order has arrived from your funnel. Nothing has been spent on it yet.
SCANNED WAITINGIt passed intake checks and is queued, waiting for a free clone slot.
CLONING WORKINGA dedicated process is capturing and optimizing the site.
QA_READY WORKINGThe clone finished and passed the readiness gate. It is ready for a person to look at.
TEAM_REVIEW IN REVIEWIt is live on an internal, non-indexed preview host and posted to your team channel for review.
APPROVED APPROVEDA reviewer signed off. It is waiting to be delivered.
DELIVERED DONEIt went to the customer and the evidence was written down.
HELD HELDThe machine stopped it on purpose and said why. This one needs a human decision.
ERROR ERRORSomething broke. Retry and escalation rules take over from here.
Two of these are exits rather than steps: one is the machine stopping on purpose and asking for a decision, the other is something breaking. Both are visible states, and neither is a silent retry loop.
The governor, three ceilings3
CeilingValueWhat it protects
Machine ceiling4 clones at once The whole machine, across all offers. The hard bound.
Per-offer concurrency4 (offer-a), 4 (offer-b) One offer can never starve another
Daily cap8/day (offer-a), 20/day (offer-b) The human QA and delivery side of the pipeline
The offer names are generic here. The shape is what transfers: one hard machine bound, one per stream bound so no stream can starve another, and one daily bound that protects the human side rather than the machine.
Readiness floor
80
Plus four hard checks. Below the floor nothing reaches review.
Delivery clock
48h
72h on the second stream, warning at 12h left
Alert types
8
A closed list. An unnamed alert is a surprise, not a signal.

Two gates sit on this path: E-commerce gate at intake, and AI-readiness gate at clone complete. The first refuses work the pipeline is not honest about doing. The second refuses to show a person a result that has not cleared the floor, which is the difference between a review queue and a slush pile.

Honest limits

What this does not do

Every one of these is a thing the system will not do, stated before you find out the expensive way.

It is not instant

A site of roughly two hundred pages takes about 45 to 55 minutes end to end on one machine, and most of that is capture waiting for real pages to settle. A handful of pages is minutes. Anyone promising a large site in seconds is not doing the verification step.

It does not clone applications

Anything behind a login, a cart, a checkout, or a session belongs to the application and not to the page. Those are gated out at intake on purpose rather than half captured.

Restored behaviour covers named families only

Navigation, accordions, tabs, dropdowns and galleries are recognized and re-attached. A bespoke widget outside those families ships inert, and the report says so rather than leaving you to discover it.

Forms are neutralized, not rewired

The original's server is not yours. Submissions are stopped rather than pointed somewhere new, and pointing them somewhere new is your job.

Fidelity is measured against the capture

The score compares the clone to the pictures taken at capture time, not to the live site as it is today. If the original changes afterwards the number is stale rather than wrong, and the only fix is to capture again.

The readiness score is a rubric, not a standard

It is our weighting of things machines look for. It is useful because it is consistent and because every axis is visible, not because anyone else recognizes the number.

It does not decide whether you are allowed to do this

The tool has no opinion about permission. That question is yours, it has real answers, and the use policy in the kit states where we draw the line.

Take it

The whole kit, from this page, with no form

Files
70
Every one listed below by name and size
Total size
184.4
Kilobytes, carried inside this page as text
Cost
0
No signup, no email, no tracking on this page
The ZIP is assembled in your browser when you click, from the text already in this file. Nothing is fetched.

What is in the kit. The architecture in full, the four real config files with the real numbers, a runnable skeleton that walks the real stage order and genuinely implements four of the sixteen stages, 40 library stubs carrying the real function signatures and the real contract in each header, the test list with what each test defends, the two prompt templates, the operating policy, the skill and agent definitions, and a four page test site with a deliberate defect in it.

What is not in the kit, said plainly. The engine's own source is not included. This is a templatized starter kit, not a release of our implementation. Twelve of the sixteen stages ship as declared stubs with their contracts, not as working code. Saying "nothing is gated" is only honest if that boundary is stated out loud, so there it is: the knowledge is complete and ungated, the implementation of twelve stages is yours to write.

What that means in practice. A cold copy of this kit runs on the first try and produces a real scored report against the bundled test site, with zero configuration edits and zero dependencies to install. It is a working thing you extend, not a diagram.

Every file in the kit70
PathBytesGet it
ARCHITECTURE.md24,331
LICENSE-AND-USE.md1,581
QUICKSTART.md2,165
README.md2,411
TESTS.md1,825
configs/README.md14,432
configs/cloner.json1,339
configs/playbook-map.json3,577
configs/pricing.json711
configs/strip-lists.json502
fixture/assets/badge-400x300.png4,606 binary
fixture/assets/hero-1200x630.png30,276 binary
fixture/assets/site.css4,360
fixture/assets/site.js2,089
fixture/contact.html4,049
fixture/gutter-guards.html5,238
fixture/index.html5,028
fixture/services.html4,514
generate-doc.cjs4,705
policy/README.md3,293
policy/policy.json1,344
prompts/copy-rewrite.md2,237
prompts/redesign.md2,018
scaffold/cli.js4,518
scaffold/lib/affiliate-gate.js857
scaffold/lib/agent-surfaces.js735
scaffold/lib/behavior-verify.js1,099
scaffold/lib/booking-adapter.js847
scaffold/lib/capture-extract.js1,927
scaffold/lib/capture-harvest.js1,309
scaffold/lib/capture-mobile.js793
scaffold/lib/capturer.js1,507
scaffold/lib/config.js924
scaffold/lib/core-pages.js690
scaffold/lib/cost-tracker.js1,080
scaffold/lib/crawler.js1,152
scaffold/lib/deploy-manifest-gate.js1,009
scaffold/lib/describe-clone.js769
scaffold/lib/detect-archetype.js716
scaffold/lib/doc-compare.js709
scaffold/lib/em-dash-scan.js597
scaffold/lib/extract-listings.js846
scaffold/lib/extract-taxonomy.js1,524
scaffold/lib/feature-parity.js680
scaffold/lib/fuzzy.js732
scaffold/lib/icon-fix.js702
scaffold/lib/interaction-detect.js799
scaffold/lib/interaction-pass.js1,139
scaffold/lib/job-runner.js1,232
scaffold/lib/llm.js958
scaffold/lib/optimization-links.js884
scaffold/lib/optimization-media.js715
scaffold/lib/optimization-passes.js1,873
scaffold/lib/packager.js1,474
scaffold/lib/pattern-store.js937
scaffold/lib/readiness-score.js1,247
scaffold/lib/redesign-level3.js1,201
scaffold/lib/redesign.js1,424
scaffold/lib/schema-directory.js724
scaffold/lib/speed-proof.js860
scaffold/lib/transformer.js808
scaffold/lib/utils.js1,935
scaffold/lib/verifier.js1,406
scaffold/lib/widget-registry.js838
scaffold/package.json611
scaffold/serve.cjs2,353
scaffold/stages.js7,636
skills-and-agents/README.md2,046
skills-and-agents/clone-operator.agent.md1,785
skills-and-agents/clone-system.skill.md1,585
If your browser refuses the assembled ZIP, every file above downloads and copies on its own. That is the fallback, and it is tested rather than assumed.
The commands

In order, with the reason each one exists

The first two are the whole quickstart. If step two does not produce a scored report on your machine, stop there and fix that before going further, because everything after it assumes a working loop.

1Get the kit onto disk
unzip clone-system-kit.zip && cd clone-system-kit

Everything below runs from the kit root.

2Run the demo, offline
cd scaffold && npm run demo

Serves the bundled test site on a free port, walks all sixteen stages, and writes a scored report. No network, no dependencies.

3Read the generated document
node generate-doc.cjs

Renders the kit's own markdown into a single self contained HTML file.

4Point it at a real site
node cli.js clone https://example.com --out=job1

Only against a site you are authorized to rebuild. Read the use policy first.

5Install the browser, for real capture
npm install && npx playwright install chromium

Needed once you replace the scaffold capture with a real browser capture.

6Run the tests
node --test tests/*.test.js

The full build ships 24 test files. The kit lists every one and what it defends.

Node >=20 is the only requirement for the demo. A full build additionally needs 11 packages, and the kit lists them by name with what each one is for.

Intended use

What this is for, and what it is not for

The tool has no opinion about permission and this page will not pretend otherwise. It is built for rebuilding sites you are authorized to rebuild: your own, a client's with their agreement, an archive of something you own, or a local test fixture. Pointing it at a site you have no relationship with is not a technical question and the answer does not come from us.

Three things are deliberately absent from the kit and will stay absent. There is no evasion of any kind: no rotating identities, no anti detection behaviour, no working around a block. The crawl defaults are polite and they are in the config where you can see them, including a request delay that is a courtesy budget rather than a performance setting. And the user agent string is a template that asks you to identify yourself and point at a page explaining what you are doing.

If a site tells you not to, the correct behaviour is to stop. A tool that makes that easy to ignore is a different tool than this one.

The use policy, as shipped in the kit
Everything in this directory is published for you to take, change and build on, for any purpose,
commercial included. No attribution required. No warranty of any kind.


A templatized starter kit. It is the architecture, the thresholds, the stage contracts, the policy
shape and a runnable scaffold. It is enough to build your own system and it is not a copy of ours.


It is not the production engine source. The scaffold's module bodies are stubs with real signatures
and real contracts and a TODO where the implementation goes. That boundary is stated here, on the
page, and in the README, because "nothing is gated" is only honest when the edge is named out loud.


This tooling exists to rebuild sites you are authorized to rebuild: your own, or a client's with
their permission. That is the whole intended use.

The crawl defaults that ship in `configs/cloner.json` are polite on purpose: a request delay, a
per-host delay, a page ceiling and a depth ceiling. Leave them alone unless you have a reason, and
if you raise them, raise them on a site you own.

There are no evasion features here and none will be added. No proxy rotation, no fingerprint
spoofing, no robots.txt bypass. If a site does not want to be crawled, that is an answer.

Set `survey.userAgent` to a string that identifies YOU and points at a page explaining what you
are doing. The template ships with a placeholder for exactly that reason. Running someone else's
user agent is not anonymity, it is impersonation.
The receipt

This page runs the same check it asks you to run

Everything above is a claim. This is where the claims get checked. The table is written by a verifier script, not by hand, and when the verifier has not run the table says so rather than showing green.

External verification ALL GATES PASSED
GateWhat it checksResultDetail
G1Runs from a local file with the network blocked PASS Standards mode, 70 file controls live, archive and twin enabled, live self check PASSED, 0 script errors, 0 network requests beyond the font sheet (1 blocked, page falls back to its declared faces); demo controls both correct (self 100.00, different pages 74.50 against a 99 threshold)
G2Every teaching claim readable with JavaScript off PASS 72,857 characters of teaching content readable with scripting off, 0 elements left invisible
G3The browser assembled archive is a valid ZIP PASS 195.4 KB archive assembled in the browser, python zipfile reports no bad entry, 70 members
G4Unpacked archive is byte identical to the kit PASS all 70 files byte identical to the kit on disk, no extras
G5Per file download and copy work as a fallback PASS 13 of 70 per file downloads sampled byte identical (both binaries included), copy confirms
G6No client data anywhere on the page PASS Zero hits across 440,549 characters of text; 2 embedded images are byte identical to the downscale of the synthetic fixture captures; own published host clone-system.swarmsystem.ai masked as an exact literal, every other swarmsystem host still banned. Scope: 485 patterns: 27 client folders, 8 registry domains, 40 job ids, 189 secret values, plus the standing internal list
G7Brand law: dashes, rules, tokens, one field, footer PASS 0 dashes, 0 rules, 13 token colours only, exactly 1 ambient field, centered footer, no horizontal scroll at 390 or 1440px, rail orb inside the viewport and descending, nothing lost under reduced motion
G8Every stage, module, test and threshold present PASS 16 stages, 40 modules, 24 tests, 106 thresholds, 0 blanks
G9Agent surfaces parse and the markdown twin downloads PASS JSON-LD parses as TechArticle, llms.txt block 1251 characters and byte identical to the file served, agents.json parses at version 1.0 and matches the file served, robots.txt allows all, deploy dir holds exactly 6 named files, markdown twin downloads at 45.3 KB
G10Keyboard operation, focus, and contrast PASS 159 controls, all keyboard reachable, first tab lands on A:Get the kit, focus-visible styled; 111 text nodes under the contrast floor (lowest 3.46:1, the inherited --dim token WARN recorded in brand canon)
G11The receipt matches real source state PASS manifest read 2026-08-06T16:33:44.347Z; 40 modules and 24 tests still on disk, all 16 stages still named in the entry point
Source state at build time: 16 stages, 40 modules, 24 tests, 106 configured values, read from the engine at 2026-08-06T16:33:44.347Z. Verified 2026-08-06T17:34:12.600Z.

6 strings were removed from the extracted source before it reached this page, in 4 classes. The manifest records where each removal happened and what class it was, and deliberately does not record the string itself, because a redaction log that prints what it removed has not redacted anything.

SELF CHECK: 0 TOKENS · 0 EM DASHES · 0 CONSOLE ERRORS · 0 FILES CARRIED · PASSED