> **Public edition.** Generated from the study's internal codebook by `qa/public-edition.mjs`. The names of websites the paper anonymises, and the internal Agency-NN and Unnamed-NN numbers, are replaced by [agency] or [unnamed website]; nothing else is changed.

> **Public edition note.** By the owner's decision of 5 October 2026 (D5), every agency appears in the public dataset as `[agency]` and every unnamed website as `[unnamed]` (in these documents, [agency] and [unnamed website]); the `Agency-NN` numbering described below is internal only.

# Codebook (derived from protocol §7 at coding time, 2026-09-27)

This is the only document the second reader uses (protocol §8). It restates §7. It does not change the taxonomy.
Where §7 leaves a case open, the decision taken is written here under **Resolved cases**, dated, before any
row was coded under it.

## What is coded where

Coding happens on two sheets and is combined per (trial, cited URL) by `build.mjs`:

| Sheet | Unit | Fields |
|---|---|---|
| `domains.csv` | one registrable domain | `sourceType` (publisher class or platform code, below), `publisherCountry`, `basis`, `notes` |
| `urls.csv` | one normalised URL | `pageType`, `isListicle` (yes/no), `notes` (`sponsored` for a labelled sponsored news article), and from 2026-10-04 `country` + `countryBasis`: a page's own publisher country where it differs from its website's (R11, R12); blank = the website's |

### `domains.csv` → `sourceType` (one value per domain)

**Platform codes.** The host decides, and these are applied first, in this order:

| Value | Use when |
|---|---|
| `press-release` | Newswire host (EIN Presswire, PR Newswire…), or the page is labelled a press release. Set per URL in `notes` when a normal site carries one. |
| `social-profile` | Social network: Facebook, Instagram, TikTok, X, YouTube, Reddit, Quora, Medium, Threads, Xiaohongshu, Lemon8, LinkedIn posts and articles |
| `directory-review` | Directory or review platform: Clutch, GoodFirms, Sortlist, DesignRush, The Manifest, Listing.my, TechBehemoths… |
| `marketplace` | Freelance or services marketplace: Upwork, Fiverr, Kaodim, Recommend.my… |
| `government-association` | `.gov.my`, `.edu.my`, other government or education domains, a recognised industry association, a university |
| `google-property` | A Google-owned host |
| `company-profile` | Job board, professional network company page, business registry: Hiredly, LinkedIn `/company/`, JobStreet, Crunchbase… |
| `news-media` | Editorial news or industry media with bylines: The Star, Marketing-Interactive, Vulcan Post… |
| `vendor-docs` | A software or platform vendor that does not sell agency services: HubSpot, Semrush, Shopify, Mailchimp, a hosting company, OpenAI… |

**Publisher classes**, used when no platform code applies:

| Value | Use when | Decision rule |
|---|---|---|
| `agency` | A company whose primary offer is marketing, web, creative, advertising, SEO, social media, content, video or photo production, or branding services | Its own homepage, about or services page shows it sells such services to clients |
| `freelancer` | An individual selling such services | A personal name or personal brand, "I" voice, no company team |
| `independent` | A site that does not sell those services and fits no platform code: a consumer blog, a comparison site, a business-ideas blog, a portfolio platform for others | Fails the agency test |
| `other-unresolvable` | Nothing can be determined: dead, blocked and unknown from the domain, empty | Record the HTTP status in `basis` |

### Combination rule (in `build.mjs`)

| Domain `sourceType` | URL `isListicle` | Final code |
|---|---|---|
| `agency` | yes | `agency-owned-listicle` |
| `agency` | no | `agency-owned-service` (§7: "an agency's SEO service page, homepage, case study"; its non-listicle blog posts land here too) |
| `freelancer` | any | `freelancer-site` |
| `independent` | yes | `independent-listicle` |
| `independent` | no | `other-unresolvable`, sub-labelled `other: independent non-listicle page` (see Resolved cases, R1) |
| any platform code | any | that code; `news-media` carries `sponsored` from the URL notes |

## `isListicle` (urls.csv)

`yes` when the page ranks, lists or compares multiple providers: "top N", "best … agencies", "X vs Y",
"companies in Malaysia" roundups. It is judged from the title, the H1 and, when needed, the page. A single
provider's service page is `no` even when it says "best".

## `pageType` (urls.csv, used for A7 among agency-owned citations only)

`homepage` (empty path or a locale root) · `service-or-industry-page` (title or H1 names a service or an
industry: a service page, pricing page, industry page, case study) · `article-listicle` (a blog post, guide,
ranking or insight) · `profile-listing` (a platform profile) · `other`.

## `publisherCountry` (domains.csv)

- `MY`: the domain ends in `.my`, OR the site states a Malaysian address or legal entity (Sdn Bhd, SSM number, a
  Malaysian office address) on its contact or about page, OR the platform page profiles a Malaysian entity.
- `foreign`: the site states a non-Malaysian base.
- `unknown`: neither can be established.
- `platform`: for a platform code where the profiled entity is not clear from the URL (a whole Clutch category
  page, a Reddit thread).
- A multi-country agency with a Malaysian office and a Malaysian page (`/my/`) is `MY` for its Malaysian pages. Code
  the domain by where the cited pages are aimed and say so in `notes`.

## `basis` (domains.csv)

What the code rests on: `home` (fetched homepage title, description and signals), `page` (the cited page),
`about` (an about or contact page read by hand; `about (R13 re-check 2026-10-05)` for the re-check, evidence in `recheck/`), `reviewer` (the second reader's resolution of a disagreement, protocol §8.4; the reason is in `notes`), `domain-only` (blocked or dead; coded from the host and platform
knowledge), `rule` (a host rule from `rules.mjs`, confirmed).

## Anonymisation

Every `agency` and `freelancer` domain becomes `Agency-NN` in public artefacts, numbered by first appearance
(W1 Gemini, then W1 ChatGPT, then W2). The mapping lives only in `agency-map.internal.json` (gitignored).
ALIQ's own domain (`aliqgroup.com`) is coded by the same rules and reported only as one aggregate line (D5).

## Resolved cases

| # | Date | Case | Decision | Why |
|---|---|---|---|---|
| R1 | 2026-09-27 | An independent site's page that is not a listicle (a how-to guide on a non-agency blog) | Final code `other-unresolvable`, sub-labelled `other: independent non-listicle page`. T3 reports that sub-label as its own footnoted line, so the bucket is not read as "dead links". | §7 has no code for it, and its `other-unresolvable` definition includes "none of the above". Adding a code after pre-registration would change the taxonomy; a transparent sub-label does not. |
| R2 | 2026-09-27 | A platform vendor's blog that sells software and also agency-like services (e.g. a hosting company with a web-design package) | `vendor-docs` if the primary offer is software or hosting; `agency` if the site's main navigation leads with client services | §7 "vendor of tools, not of services"; decided on the primary offer. 2026-10-05 (Jinn): a vendor cited through its own pages selling marketing services keeps this code but is not named (`unnamed.json`, protocol §14) |
| R3 | 2026-09-27 | A LinkedIn `/pulse/` article or post | `social-profile` (rule) | Host decides first (§7 precedence); a post is not a company profile |
| R4 | 2026-09-27 | Country for a non-`.my` site with no address on the homepage | `MY` when the site states a Malaysian legal entity (Sdn Bhd) or a Malaysian phone number plus a Malaysian city, or describes itself as based in Malaysia or a Malaysian city ("a Kuala Lumpur-based studio"). The basis records which. Otherwise `unknown`. | §7 "states a Malaysian address or Malaysian legal entity"; a self-described base is the site's own statement of where it is |
| R5 | 2026-09-27 | A business selling facilities or training to creators (studio rental, photography courses), not client services | `independent` | Fails the agency test: it does not sell marketing or creative services to the business asking |
| R6 | 2026-09-27 | A lifestyle or food media group cited by its corporate homepage | `news-media` | Editorial publisher by primary offer; the paid-content side is not its primary offer |
| R7 | 2026-09-27 | A homepage that fails on the bare domain but answers on `www.` | Code from the `www.` page; basis `home (www)` | Same site; the fetcher tried the bare host only |
| R8 | 2026-09-27 | A business whose services fall outside the panel's seven categories (interior design, packaging supply, a clinic) | `independent`. A print shop that also sells design, or a design studio doing graphic design among other things, stays `agency`, because graphic design is branding work. | The agency test is about the services the panel asks for (web, SEO, social, content, ads, branding, AI visibility) |
| R9 | 2026-09-27 | A page labelled "press release" on the publisher's own site (not a newswire) | `press-release`. When all of a domain's cited URLs are such releases, code the domain `press-release`; when only some are, keep the domain's class and put `press-release` in that URL's `notes` (the combination rule then gives `press-release`). | §7 decision rule for press-release: "page is labelled press release or carries a newswire byline" |
| R10 | 2026-10-04 | A link-shortener host (t.co, bit.ly, lnkd.in) cited in place of the page it redirects to. **Widened the same day, before any such row was coded:** also a file host or CDN (cloudfront.net, amazonaws.com) or a web archive (archive.is, web.archive.org) serving someone else's document | Code the domain by the publisher of the page it resolves to, or that the document itself names, and name it in `notes` (basis `page`). If no publisher can be identified, `other-unresolvable` (basis `domain-only`) | The shortener is a redirect, not a publisher; §7 classifies who published the cited page. The host-first rule picks between platforms that publish, which a shortener does not |
| R11 | 2026-10-04 | A platform page that profiles one named business (a Clutch profile, a business's Facebook page, a listing on a booking or directory site), on a domain the first coding had set to `platform` | The profiled business's country, set per URL. `platform` stays only for pages about many businesses (a whole category page, a discussion thread) | The country rule above already said "the platform page profiles a Malaysian entity", but country was coded once per domain, so that clause could never apply. Found through the blind re-code's disagreements; decided by Jinn after the reliability check and applied to every row, not only the sample |
| R12 | 2026-10-04 | A page written by the platform company itself (Google's help and documentation pages, a directory's own price page) | The company's country, set per URL (Google: `foreign`) | Country follows whoever the page is by or about; `platform` is for pages with no single party. Decided by Jinn after the reliability check, from its disagreements; applied to every row |
| R13 | 2026-10-04 | `foreign` resting on general knowledge of where a company is based | `foreign` only when the page, or the site's about or contact page, states a base outside Malaysia (basis `about`); otherwise `unknown` | The country rule says "states"; the first coding had used general knowledge for some sites (basis `domain knowledge`) and not for others. Decided by Jinn after the reliability check, from its disagreements; applied to every row. **Narrowed by R14 (2026-10-05).** |
| R14 | 2026-10-05 | A well-known company or publisher whose own pages state no base, or could not be read (Meta, Tatler Asia, Investing.com, arXiv, StatCounter) | `foreign` by general knowledge (basis `rule (domain knowledge, R13 amended 2026-10-05)`), country named in `notes`. "Well-known" means a company or publisher whose base outside Malaysia is common knowledge; borderline cases stay `unknown` (JobStreet, founded in Malaysia and owned by Australia's SEEK; TechBehemoths; handld; archive.is) | Jinn, verbatim: "known website like meta tatler investing.com can be listed as foreign". Decided after the reliability check; applied to every row |
