@domandigital/craft 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +17 -5
  2. package/CHARACTER.md +98 -97
  3. package/COPY.md +3 -2
  4. package/PRINCIPLES.md +5 -5
  5. package/README.md +8 -8
  6. package/REGISTERS.md +3 -3
  7. package/design-review.schema.json +1 -1
  8. package/dist/{audit-DESBVHQJ.js → audit-Q73WGKMS.js} +3 -3
  9. package/dist/audit.cjs +88 -23
  10. package/dist/audit.js +88 -23
  11. package/dist/{chunk-GA3AJN67.js → chunk-2CCL5CO7.js} +17 -15
  12. package/dist/{chunk-M5QSMIT6.js → chunk-4HPAMB52.js} +4 -4
  13. package/dist/{chunk-LRWKKJIW.js → chunk-6TOY3FAT.js} +5 -5
  14. package/dist/{chunk-GDDBCHQR.js → chunk-GJZ4Y5PT.js} +5 -5
  15. package/dist/{chunk-ZV3FPQPM.js → chunk-OA2MBUJJ.js} +1 -1
  16. package/dist/{chunk-V3GJSISR.js → chunk-OOT4QLO3.js} +14 -14
  17. package/dist/{chunk-7DPB5G4G.js → chunk-PXJKYMXF.js} +2 -2
  18. package/dist/{chunk-EHMEMSM2.js → chunk-R4KPE4G5.js} +72 -9
  19. package/dist/{cli-FCFRPPHZ.js → cli-766R2BUR.js} +5 -5
  20. package/dist/{cli-3PFEOEQI.js → cli-CE7ENNNG.js} +6 -6
  21. package/dist/{cli-SOH4QMMW.js → cli-DTJOOTNM.js} +3 -3
  22. package/dist/{cli-36YQA6BP.js → cli-EQJITFVE.js} +4 -4
  23. package/dist/{cli-RXXGSKD6.js → cli-SD2BJSGP.js} +6 -6
  24. package/dist/{cli-TP5ZMJOL.js → cli-TBBXUECM.js} +5 -5
  25. package/dist/{cli-YOSHHLIV.js → cli-TV2IJ5TV.js} +2 -3
  26. package/dist/{cli-7IBKMUMM.js → cli-U3SPFILJ.js} +9 -9
  27. package/dist/cli.js +3 -3
  28. package/dist/index.cjs +89 -25
  29. package/dist/index.d.cts +10 -10
  30. package/dist/index.d.ts +10 -10
  31. package/dist/index.js +89 -25
  32. package/dist/{viewports-cli-ET664I2Y.js → viewports-cli-SOOHAD5D.js} +3 -3
  33. package/package.json +1 -1
  34. package/word-lists.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @domandigital/craft
2
2
 
3
+ ## 0.24.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 472408d: The calibration captures and the reviewer corpus move to a private repository, and craft names no client, client person, staff member or reviewer. `calibration/` and `reviews/` now live in Doman-Digital/dd-craft-corpus; the tests that read them find it through `CRAFT_CORPUS_DIR` or a `dd-craft-corpus` checkout beside dd-packages, and skip with a note when it is absent. The shape calibration scripts find it the same way and stop, saying where to put it, when it is missing, and `scripts/blind/prepare.mjs` reads each site's null-model brief from the run's config (`nullBrief`). The docs that ship (README, PRINCIPLES, COPY, CHARACTER, REGISTERS, CHANGELOG) describe clients and reviewers by trade and role instead of by name. A new guard, `scripts/deny-check.mjs`, checks every shipped file, the rest of the package and the packed tarball against salted hashes of the names, and goes red on a canary to prove it works. No API changes.
8
+
9
+ ## 0.23.2
10
+
11
+ ### Patch Changes
12
+
13
+ - 1e4bcb5: <!-- copy-ok: names the shapes the release starts reporting --> A new review-tier copy tell, `absolute-negation` (catalogue 2026.10.9), reports a verbless fragment that opens on never, nothing, nobody or "no" + noun after a clause break: "A guardian consents by email; never pre-ticked", "Pay per user per month; no servers", "nothing to buy or run", "Nothing on-site to join", "no duplicates". A 92EL deck passed the gate with them. It never blocks. A sentence with a subject and a verb ("Players never open the lists", "Nothing is copied by hand"), an instruction ("Never share your password"), a Harvard citation with no date ("ICO, no date") and a "No" form answer pass, and a fragment the blocking `no-x-no-y`, `no-x-badge` or `negative-reassurance` already reports is not reported twice.
14
+
3
15
  ## 0.23.1
4
16
 
5
17
  ### Patch Changes
@@ -16,13 +28,13 @@
16
28
 
17
29
  ### Patch Changes
18
30
 
19
- - 68f65c3: <!-- copy-ok: names the phrases the release starts catching --> craft learns from Eunice Ordor's design and copy reviews (catalogue 2026.10.5). Her 73-note review of the new Doman Digital site is the first record in a reviewer corpus (`reviews/` in the repository; the schema test keeps each record to `design-review.schema.json`), and CHARACTER.md writes up the principles it teaches. `design-review.schema.json` gains optional fields for a reviewer's own record: `reviewer`, `date`, `source` and `rulings` on the review, and `source`, `verdict`, `founderRuling`, `principle` and `tells` on a note; `REVIEW_VERDICTS` is exported. Two new review-tier tells: `hero-cta-pair` (source and rendered) reports two buttons side by side in a hero, found in 140 of 140 null-build heroes, and `confession-line` reports copy that scopes a business by what it has not done or will not do ("What this is and is not", "we have not yet built", "our experience so far is one practice"). `plain-english`, already blocking, now covers the whole family the founder banned on 20 October 2026: bare "plainly" and "in plain terms/language/words", with licence text ("plainly marked") let through. `review-phrase` adds "plain" as a self-description ("a plain recommendation").
31
+ - 68f65c3: <!-- copy-ok: names the phrases the release starts catching --> craft learns from a studio reviewer's design and copy reviews (catalogue 2026.10.5). A 73-note review of the new Doman Digital site is the first record in a reviewer corpus (`reviews/` in the private corpus repository since 0.24.0; the schema test keeps each record to `design-review.schema.json`), and CHARACTER.md writes up the principles it teaches. `design-review.schema.json` gains optional fields for a reviewer's own record: `reviewer`, `date`, `source` and `rulings` on the review, and `source`, `verdict`, `founderRuling`, `principle` and `tells` on a note; `REVIEW_VERDICTS` is exported. Two new review-tier tells: `hero-cta-pair` (source and rendered) reports two buttons side by side in a hero, found in 140 of 140 null-build heroes, and `confession-line` reports copy that scopes a business by what it has not done or will not do ("What this is and is not", "we have not yet built", "our experience so far is one practice"). `plain-english`, already blocking, now covers the whole family the founder banned on 20 October 2026: bare "plainly" and "in plain terms/language/words", with licence text ("plainly marked") let through. `review-phrase` adds "plain" as a self-description ("a plain recommendation").
20
32
 
21
33
  ## 0.22.0
22
34
 
23
35
  ### Minor Changes
24
36
 
25
- - 3902169: The every-viewport measure counts phone screens to the footer (DOM-1052, part of DOM-772): page height at 375 x 667 over 667, with lazy images loaded. `screens` sets a length budget per route, route pattern or prefix (`{ "/": 6.5, "/services/*": 6, "/areas/[town]": 5, "*": 9 }`, the most specific wins), on `measureViewports`, `measureRoute`, `measureSite` and `viewports.json`. A route over its budget fails a new `screens` check ("page too long for a phone"), baselined like the others; with no budget the count is only reported. `ViewportsResult.screens` and the measured file carry the count, `craft viewports` and `craft phone-first --measured` print it for every route, and `screenBudgetFor`, `checkScreenBudgets` and `formatScreens` are exported. The Bellerose home page ran 12.7 phone screens against a target of 6.5.
37
+ - 3902169: The every-viewport measure counts phone screens to the footer (DOM-1052, part of DOM-772): page height at 375 x 667 over 667, with lazy images loaded. `screens` sets a length budget per route, route pattern or prefix (`{ "/": 6.5, "/services/*": 6, "/areas/[town]": 5, "*": 9 }`, the most specific wins), on `measureViewports`, `measureRoute`, `measureSite` and `viewports.json`. A route over its budget fails a new `screens` check ("page too long for a phone"), baselined like the others; with no budget the count is only reported. `ViewportsResult.screens` and the measured file carry the count, `craft viewports` and `craft phone-first --measured` print it for every route, and `screenBudgetFor`, `checkScreenBudgets` and `formatScreens` are exported. One client home page ran 12.7 phone screens against a target of 6.5.
26
38
 
27
39
  ## 0.21.0
28
40
 
@@ -51,14 +63,14 @@
51
63
 
52
64
  ### Patch Changes
53
65
 
54
- - cc6c0b4: Document opening-photo selection using the Bellerose follow-up: compare photographic strength, crop and sequence before service variety or slide count, with stakeholder preference kept separate from unmeasured customer outcomes.
66
+ - cc6c0b4: Document opening-photo selection using the follow-up on one client's opening photographs: compare photographic strength, crop and sequence before service variety or slide count, with stakeholder preference kept separate from unmeasured customer outcomes.
55
67
 
56
68
  ## 0.20.3
57
69
 
58
70
  ### Patch Changes
59
71
 
60
72
  - 6800957: Compare carousel purposes before diagnosing duplication, avoid selecting a design by edit size alone, and allow explicit protected-staging placeholders while retaining outstanding publication requirements.
61
- - d0d9234: Decision confidence: reviewing a proposed change, with attribution to Eunice Ordor and the provenance of the principle (a phone-layout review on 15 October 2026) in CHARACTER.md and PRINCIPLES.md. New `craft direction review --notes design-review.json` weighs feedback against the visitor's job in `art-direction.json`. Each note keeps the observation, the visitor problem under it, the proposed solution, the evidence and the smallest defensible change apart, and judges the suggestion and the recommendation separately. The problem is observed, inferred, preference or unknown: only something inspected (a screenshot, rendered behaviour, source, a measurement, the page's content) makes it observed, a report from an audit, stakeholder or customer makes it inferred, and a claim at a width nobody looked at stays unknown. A recommendation is a confirmed correction, a design hypothesis, an optional refinement or no change, and a review can end on "no change is recommended". Changes climb a ladder from copy to restructure; a structural step or an addition (carousel, script, dependency, animation, testimonial, call to action, repeated content) has to say why every smaller step was not enough. A second carousel is not supported where a gallery exists, information is not removed without an observed cost, a reasoned section order is not overridden by a preference, repetition and similarity to other sites are not defects without a stated cost to the visitor, and a change that needs a fact nobody supplied is held rather than written in. `craft direction validate` also raises an inferred identity finding when a job that worries about who the visitor would deal with first meets a person after three or more sections, and asks for a name and a line, not a biography moved up or a portrait. New `differentiation` lens, `design-review.schema.json`, and exports `assessReview`, `isStructural` and the review types. Fixtures: a calibration review of a plumbing homepage plus clinic and salon reviews, which reach different outcomes for different reasons.
73
+ - d0d9234: Decision confidence: reviewing a proposed change, with attribution to a studio reviewer and the provenance of the principle (a phone-layout review on 15 October 2026) in CHARACTER.md and PRINCIPLES.md. New `craft direction review --notes design-review.json` weighs feedback against the visitor's job in `art-direction.json`. Each note keeps the observation, the visitor problem under it, the proposed solution, the evidence and the smallest defensible change apart, and judges the suggestion and the recommendation separately. The problem is observed, inferred, preference or unknown: only something inspected (a screenshot, rendered behaviour, source, a measurement, the page's content) makes it observed, a report from an audit, stakeholder or customer makes it inferred, and a claim at a width nobody looked at stays unknown. A recommendation is a confirmed correction, a design hypothesis, an optional refinement or no change, and a review can end on "no change is recommended". Changes climb a ladder from copy to restructure; a structural step or an addition (carousel, script, dependency, animation, testimonial, call to action, repeated content) has to say why every smaller step was not enough. A second carousel is not supported where a gallery exists, information is not removed without an observed cost, a reasoned section order is not overridden by a preference, repetition and similarity to other sites are not defects without a stated cost to the visitor, and a change that needs a fact nobody supplied is held rather than written in. `craft direction validate` also raises an inferred identity finding when a job that worries about who the visitor would deal with first meets a person after three or more sections, and asks for a name and a line, not a biography moved up or a portrait. New `differentiation` lens, `design-review.schema.json`, and exports `assessReview`, `isStructural` and the review types. Fixtures: a calibration review of a plumbing homepage plus clinic and salon reviews, which reach different outcomes for different reasons.
62
74
  - bb9b233: Decision confidence. A page in `art-direction.json` can now record `confidence`: the widths its decisions were examined at (`mobile`, `tablet`, `desktop`) and the evidence it offers (`proof`: work, people, credentials, reviews, experience or outcomes, each with a section, `first-look` or `on-request` depth, and a reason tied to the customer's job). `craft direction validate` reads it and prints findings tagged observed, inferred or unknown, each with the lens it belongs to (relevance, hierarchy, evidence, identity, action, disclosure, mobile) and why it matters to that visitor. There is no score and no conversion claim, and nothing is required: a file without `confidence` validates and reports exactly as before, and no evidence kind, founder portrait, slideshow, phone number or section order is ever demanded. A finding made on one width is never carried to another; widths nobody examined are reported as unknown. `craft direction research` asks where the visitor looks, what would settle it and what the next step is, without assuming a phone or a portrait. Exports `assessConfidence`, `validateConfidence`, `viewportOf` and the new types; the JSON Schema gains `confidence`. CHARACTER.md, PRINCIPLES.md, STANDARD.md section 10 and the README describe it, and three fixtures (sole-trader plumber, private physiotherapy practice, appointment-based salon) show one principle giving three different answers.
63
75
  - 0dba997: Sites made with create-site deploy their preview to Cloudflare only. `scripts/gates/deploy-preview.mjs` no longer has a Vercel branch or looks for `.vercel/project.json`, `preview.host` in `site.programme.json` is `cloudflare` or null, the `host` answer prompt suggests `cloudflare`, and `docs/site-programme.md` and the README say so. A site that still sets `preview.host` to `vercel` now stops at Stage 06 with a message naming the host; remove the key or set it to `cloudflare`. The synthetic README and a craft comment no longer name Vercel; no behaviour changes in those two.
64
76
 
@@ -105,7 +117,7 @@
105
117
 
106
118
  ### Minor Changes
107
119
 
108
- - 09b49ac: Fingerprint version 3: the estate comparison now measures ground temperature and section structure (DOM-637). A warm cream and a cool porcelain page used to score as the same "grey ground" because hue barely counts at a ground's chroma; `groundDistance` adds a temperature gap (warm, neutral, cool from hue, scaled by chroma) on top of ΔE, and shared grounds are named with it ("cream ground", "cool grey ground", "warm dark ground"). Two new distance parts, `rhythm` (the page's bands of light and dark in running order, the opening counted twice) and `hero` (text placement and width, headline class and size, which side the picture sits), give structure a quarter of the weight; `DISTANCE_WEIGHTS` is now accent 0.2, type 0.2, ground 0.1, shape 0.1, motion 0.05, effects 0.1, layout 0.1, rhythm 0.1, hero 0.05, and a part only one side measures is left out rather than counted as different, so version 1 and 2 fingerprints in a register or null model compare without being re-snapshotted. Shared traits name the structure too: "light hero then dark band", "left-aligned serif hero, photo right", "same running order". `craft snapshot` and `craft audit` take `--scheme light|dark` to ask the page for one colour scheme, and a snapshot's images record `left`. New exports: `groundDistance`, `groundTemperature`, `temperatureName`, `groundLabel`, `rhythmOf`, `rhythmDistance`, `heroDistance`, `bandOf`, `TEMPERATURE_FULL`, `TEMPERATURE_NAMED`, `TEMPERATURE_WEIGHT`, `OPENING_BANDS` and the `FingerprintHero`, `HeroImage`, `LightnessBand` and `Temperature` types. Calibrated on RMP Electrical against Bellerose Plumbing's stone and porcelain light modes (`calibration/estate/2026-10-09-temperature/`); the existing register's pair ordering keeps a Kendall tau of 0.83 and no pair crosses the sibling line.
120
+ - 09b49ac: Fingerprint version 3: the estate comparison now measures ground temperature and section structure (DOM-637). A warm cream and a cool porcelain page used to score as the same "grey ground" because hue barely counts at a ground's chroma; `groundDistance` adds a temperature gap (warm, neutral, cool from hue, scaled by chroma) on top of ΔE, and shared grounds are named with it ("cream ground", "cool grey ground", "warm dark ground"). Two new distance parts, `rhythm` (the page's bands of light and dark in running order, the opening counted twice) and `hero` (text placement and width, headline class and size, which side the picture sits), give structure a quarter of the weight; `DISTANCE_WEIGHTS` is now accent 0.2, type 0.2, ground 0.1, shape 0.1, motion 0.05, effects 0.1, layout 0.1, rhythm 0.1, hero 0.05, and a part only one side measures is left out rather than counted as different, so version 1 and 2 fingerprints in a register or null model compare without being re-snapshotted. Shared traits name the structure too: "light hero then dark band", "left-aligned serif hero, photo right", "same running order". `craft snapshot` and `craft audit` take `--scheme light|dark` to ask the page for one colour scheme, and a snapshot's images record `left`. New exports: `groundDistance`, `groundTemperature`, `temperatureName`, `groundLabel`, `rhythmOf`, `rhythmDistance`, `heroDistance`, `bandOf`, `TEMPERATURE_FULL`, `TEMPERATURE_NAMED`, `TEMPERATURE_WEIGHT`, `OPENING_BANDS` and the `FingerprintHero`, `HeroImage`, `LightnessBand` and `Temperature` types. Calibrated on a UK electrician's site against a UK plumber's stone and porcelain light modes (`calibration/estate/2026-10-09-temperature/`); the existing register's pair ordering keeps a Kendall tau of 0.83 and no pair crosses the sibling line.
109
121
 
110
122
  ## 0.18.2
111
123
 
package/CHARACTER.md CHANGED
@@ -286,7 +286,7 @@ the licensor's own page. It is not a shortlist, and nothing proposes from it.
286
286
 
287
287
  `craft direction init` writes what the site does today with every reason
288
288
  empty, so the first thing it produces is the list of things nobody decided.
289
- Run on RMP's live home page (2026-09-23) it records Fraunces, Manrope, a cream
289
+ Run on an electrician client's live home page (2026-09-23) it records Fraunces, Manrope, a cream
290
290
  ground and pill buttons, three of them on the catalogue, and zero of seven
291
291
  choices decided.
292
292
 
@@ -302,8 +302,8 @@ A file from phase A that holds only exceptions stays valid.
302
302
 
303
303
  ### Decision confidence
304
304
 
305
- Attributed to Eunice Ordor, Client Relations & Operations at Doman Digital
306
- ("Eunice's Lens"). The question it asks of every page:
305
+ From a reviewer on the studio's team, whose question became the lens. The
306
+ question it asks of every page:
307
307
 
308
308
  > What does this visitor need to see, understand and believe before they are
309
309
  > comfortable taking the next appropriate action?
@@ -409,15 +409,15 @@ slideshow; two have no phone action; none has a founder portrait; all validate.
409
409
 
410
410
  #### Where it came from
411
411
 
412
- On 15 October 2026 Eunice reviewed the phone layout of a UK plumbing
413
- business's homepage. She did not review the desktop. Four things came out of
412
+ On 15 October 2026 a reviewer on the studio's team reviewed the phone layout
413
+ of a UK plumbing business's homepage. The desktop was not reviewed. Four things came out of
414
414
  it, and they are kept apart on purpose:
415
415
 
416
- 1. **Her observations.** The owner was introduced late. Information about the
416
+ 1. **The reviewer's observations.** The owner was introduced late. Information about the
417
417
  work, services, reviews and the owner felt fragmented. Visitors should be
418
418
  able to feel confident without searching. The site could show more
419
419
  personality. Trust signals should read as a set.
420
- 2. **Her proposed solutions.** A hero slideshow. Removing some project
420
+ 2. **The reviewer's proposed solutions.** A hero slideshow. Removing some project
421
421
  captions.
422
422
  3. **An independent audit's conclusions.** It agreed with the underlying
423
423
  concerns, that the owner should be met earlier and credibility shown sooner.
@@ -526,7 +526,7 @@ A note in a review:
526
526
  "id": "owner-late",
527
527
  "lens": "identity",
528
528
  "observation": "The owner is introduced too far down the page.",
529
- "raisedBy": "Eunice Ordor (stakeholder), agreed by the independent audit",
529
+ "raisedBy": "The reviewer (stakeholder), agreed by the independent audit",
530
530
  "problem": "A homeowner letting a stranger into the house cannot tell who is coming until well down the page.",
531
531
  "basis": "observed",
532
532
  "evidence": [
@@ -562,7 +562,7 @@ register numbers; a founder biography declined because booking comes first.
562
562
  #### Context and learning from a later result
563
563
 
564
564
  The 15 October calibration records the earlier audit's recommendation, not a
565
- permanent verdict. The later Bellerose mobile comparison on 18 October preferred
565
+ permanent verdict. The later mobile comparison on the same plumbing site on 18 October preferred
566
566
  work photographs followed by a compact owner introduction, then trust and contact.
567
567
  The useful test is whether each alternative answers the visitor's question.
568
568
  Considering smaller edits remains required; fewer edits alone do not establish
@@ -597,7 +597,7 @@ Compare clarity, framing, visible completion, distracting surroundings and the
597
597
  visual standard set by the lead image. A technically sound carousel can still
598
598
  weaken the page when its later slides are noticeably poorer.
599
599
 
600
- On 18 October 2026, after approving Bellerose's mobile flow, Dmitri pointed out
600
+ On 18 October 2026, after approving the plumbing site's mobile flow, the founder pointed out
601
601
  that the radiator and kitchen-tap slides did not compare with the first bathroom
602
602
  photograph. The initial selection had favoured showing different services. A
603
603
  review of the available photographs found that the radiator's unfinished edge
@@ -632,24 +632,23 @@ back as `change`, ask for what is `hold`, find out what is `gather-evidence`,
632
632
  and leave what is `no-change`. When a note names something that was not
633
633
  inspected, look before you act on it.
634
634
 
635
- ### Eunice's review of the DD site, 2026-10-19
635
+ ### Review of the studio's own site, 2026-10-19
636
636
 
637
- Eunice Ordor reviewed the preview of Doman Digital's own new site on Pastel
638
- (canvas 986559) on 18 and 19 October 2026: 73 comments across the home,
639
- services, work, Sensphere case, clinics, who-we-help, process, pricing, plans
640
- and contact pages. The whole review is kept, note by note, in
641
- [`reviews/eunice-ordor/2026-10-19-dd-site.json`](https://github.com/Doman-Digital/dd-packages/blob/main/packages/craft/reviews/eunice-ordor/2026-10-19-dd-site.json)
642
- in the repository:
643
- her words as she wrote them, what she proposed, what was done with it, the
644
- founder's ruling where one was needed, and the principle each note teaches. The
637
+ A reviewer on the studio's team reviewed the preview of the studio's own new
638
+ site on Pastel (canvas 986559) on 18 and 19 October 2026: 73 comments across
639
+ the home, services, work, a client case, clinics, who-we-help, process,
640
+ pricing, plans and contact pages. The whole review is kept, note by note, in
641
+ the studio's private reviewer corpus: the reviewer's words as written, what
642
+ was proposed, what was done with it, the founder's ruling where one was
643
+ needed, and the principle each note teaches. The
645
644
  founder went through it on 20 October 2026. As in "Where it came from" above,
646
645
  four things are kept apart.
647
646
 
648
- #### What she saw
647
+ #### What the reviewer saw
649
648
 
650
649
  Twelve notes are praise, and they are a record of what to keep: the structure
651
650
  and type, the four routes in, the who-we-help page ("a site that reads as a van
652
- roof"), the Chair and Blade case, the six-step process and the responsibility
651
+ roof"), a barber client's case, the six-step process and the responsibility
653
652
  matrix. The rest name problems. These matter beyond this one site:
654
653
 
655
654
  - Two equal buttons in the hero (#5), and again on the process page (#36).
@@ -669,17 +668,17 @@ matrix. The rest name problems. These matter beyond this one site:
669
668
  care and £70 of website (#43).
670
669
  - Closed lists where the work is open: the hero sub-line and route 3 narrowed
671
670
  to bookings and enquiries (#2, #6, #25).
672
- - A page that contradicts itself: the Sensphere form said both that enquiries
671
+ - A page that contradicts itself: a client case's form said both that enquiries
673
672
  reach the inbox and that details stay out of one (#15), and a process step
674
673
  said "paid" for a product that had been retired (#22).
675
674
  - On a phone, the hero image crops badly (#55).
676
675
 
677
- #### What she proposed
676
+ #### What the reviewer proposed
678
677
 
679
678
  Specific wording for most notes, and three larger changes: a hero slideshow of
680
679
  client systems (#3), a call to action after several sections (#50, #51, #70),
681
- and a social media card (#72). Her diagnoses were nearly all right. Her wording
682
- often used the patterns COPY.md blocks. Four of her comments blocked at
680
+ and a social media card (#72). The diagnoses were nearly all right. The wording
681
+ often used the patterns COPY.md blocks. Four of the comments blocked at
683
682
  <!-- copy-ok: quoting the reviewer's draft line -->
684
683
  catalogue 2026.10.4 ("No licence, no lock-in" in #42 is one), and eight do once
685
684
  the plain-English family is widened.
@@ -696,12 +695,12 @@ the plain-English family is widened.
696
695
  <!-- copy-ok: naming the banned adverb -->
697
696
  - The adverb "plainly" and its kin are banned, with "plain English".
698
697
  - Cut "Our clinic experience so far is one practice" (#8). On the clinics page
699
- keep "Built and run by us", and describe what Sensphere is: a growing
700
- practice whose clinicians work remotely (#13).
698
+ keep "Built and run by us", and describe what the client practice is: a
699
+ growing practice whose clinicians work remotely (#13).
701
700
  - A testimonial (#9) is reworded only once its author approves the new words.
702
701
  - Held for their own decisions: e-commerce as a sector (#27), a clinic
703
702
  subscription with its own price (#49), response times (#54) and social media
704
- (#72). Verqan stays off /work (#59). Quarterly packs are declined for the
703
+ (#72). One product stays off /work (#59). Quarterly packs are declined for the
705
704
  site (#53).
706
705
 
707
706
  #### The principles
@@ -709,7 +708,7 @@ the plain-English family is widened.
709
708
  Each id is what a note's `principle` field names in the record.
710
709
 
711
710
  - `open-shop`: precise, never confessional or absolute. Scope is shown by
712
- exact claims ("the portal we run for Sensphere"), and a contractual fact is
711
+ exact claims ("the portal we run for a children's therapy practice"), and a contractual fact is
713
712
  said as what the buyer gets. `confession-line` reports the shapes for
714
713
  review.
715
714
  - `summary-pages-carry-substance`: a page that summarises carries a sentence
@@ -739,27 +738,28 @@ Each id is what a note's `principle` field names in the record.
739
738
 
740
739
  #### The counter-lesson
741
740
 
742
- Her diagnoses beat Claude's defaults. Claude's first pass on this review would
741
+ The reviewer's diagnoses beat Claude's defaults. Claude's first pass on this review would
743
742
  have kept the "What this is and is not" sentence, the two hero buttons, the
744
743
  noun-list service cards and three proof numbers in a row. Each is a default
745
744
  craft names (`confession-line`, `hero-cta-pair`, the summary-card pattern,
746
745
  `stats-row`). Where the question is "does this read as decided and generous to
747
- the buyer", she was right. Where it is "is it true, and is it allowed", the
748
- proof ledger and the house rules held: she asked for promises that are not
749
- live yet (#53, #54, #72), and her replacement wording goes through copy-check
750
- like anyone's. A reviewer's diagnosis is taken on its merits; her
751
- words are copy, and copy is checked.
746
+ the buyer", the reviewer was right. Where it is "is it true, and is it
747
+ allowed", the proof ledger and the house rules held: the review asked for
748
+ promises that are not live yet (#53, #54, #72), and its replacement wording
749
+ goes through copy-check like anyone's. A reviewer's diagnosis is taken on its
750
+ merits; a reviewer's words are copy, and copy is checked.
752
751
 
753
752
  #### Feeding later reviews in
754
753
 
755
- Every later review, hers or another reviewer's, goes through the
754
+ Every later review, from this reviewer or another, goes through the
756
755
  `reviewer-intake` skill in claude-kit: pull the canvas, keep each note whole,
757
756
  classify it, check its facts against the proof ledger, brand facts and Linear,
758
- write the record under `reviews/<reviewer>/`, and propose tells or fixtures for
759
- what recurs. `src/__tests__/reviews.test.ts` holds each record to the schema
760
- and to this file, and fires every tell a note taught on the words it flagged.
761
- See [reviews/README.md](https://github.com/Doman-Digital/dd-packages/blob/main/packages/craft/reviews/README.md);
762
- the corpus stays in the repository and is left out of the npm package.
757
+ write the record in the studio's private reviewer corpus, and propose tells or
758
+ fixtures for what recurs. `src/__tests__/reviews.test.ts` holds each record to
759
+ the schema and to this file, and fires every tell a note taught on the words
760
+ it flagged. This file names no reviewer and no client: a section is headed for
761
+ what was reviewed and the date. The corpus is private and is not part of the
762
+ npm package.
763
763
 
764
764
  ## Declaring an exception
765
765
 
@@ -864,7 +864,7 @@ rest are weighed over what remains, so older registers and null models
864
864
  compare without being re-snapshotted.
865
865
 
866
866
  **Ground temperature.** ΔE alone files every light neutral page as one
867
- paper: RMP's cream (`oklch(0.96 0.010 82)`) and Bellerose's porcelain
867
+ paper: an electrician's cream (`oklch(0.96 0.010 82)`) and a plumber's porcelain
868
868
  (`#F1F3F4`, `oklch(0.96 0.003 229)`) are ΔE 0.013 apart, a tenth of the
869
869
  ground scale, and nobody takes them for the same page. A page ground is the
870
870
  largest area on the page and the eye adapts to it, so a tint far below what
@@ -1001,8 +1001,8 @@ A list of tells goes stale; the model does not. So signal 2 asks the model
1001
1001
  directly: given this brief and nothing else, what would you build?
1002
1002
 
1003
1003
  ```bash
1004
- craft null build --brief "RMP Electrical, electricians based in Uxbridge ..." --out null/rmp
1005
- craft audit https://www.rmp-electrical.co.uk --null null/rmp
1004
+ craft null build --brief "Example Electrical, electricians based in Reading ..." --out null/electrician
1005
+ craft audit https://www.example-electrical.co.uk --null null/electrician
1006
1006
  ```
1007
1007
 
1008
1008
  `null build` runs `claude -p` about 20 times (`--runs`), from an empty folder
@@ -1042,9 +1042,9 @@ The agency's biggest tell is not on any one site. It is its clients looking
1042
1042
  like each other. `estate.json` holds one fingerprint per shipped site:
1043
1043
 
1044
1044
  ```bash
1045
- craft estate add https://www.rmp-electrical.co.uk --id rmp --client "RMP Electrical"
1046
- craft estate compare # every pair, closest first
1047
- craft estate compare rmp # one site against the rest
1045
+ craft estate add https://www.example-electrical.co.uk --id electrician --client "Example Electrical"
1046
+ craft estate compare # every pair, closest first
1047
+ craft estate compare electrician # one site against the rest
1048
1048
  craft estate compare https://staging.example.test # a new build before it ships
1049
1049
  ```
1050
1050
 
@@ -1071,13 +1071,13 @@ Sites that share one component are rarer than siblings and easier to fix:
1071
1071
  ```bash
1072
1072
  craft estate compare --component cta-band # every pair's closest CTA bands
1073
1073
  craft estate compare --component pricing --json
1074
- craft estate compare rmp --component cta-band # one site against the rest
1074
+ craft estate compare electrician --component cta-band # one site against the rest
1075
1075
  ```
1076
1076
 
1077
1077
  Each pair lists what its two components share ("centred", "1 button", "same
1078
1078
  coloured band"), closest first. There is no sibling line for components yet:
1079
1079
  it needs a calibration set of real components (see the CTA collection in
1080
- `calibration/idiom/cta/` once it exists), so this ranks and names, and judges
1080
+ `calibration/idiom/cta/` in the private corpus once it exists), so this ranks and names, and judges
1081
1081
  nothing. Only sites added with snapshot v2 have components to compare, and
1082
1082
  the command says so when fewer than two have the role. `--component` takes
1083
1083
  one of `cta-band`, `footer-cta`, `pricing`, `testimonials`, `faq`, `process`,
@@ -1094,8 +1094,8 @@ says so rather than printing nothing.
1094
1094
  `craft report` reads one site against everything above and gives a verdict:
1095
1095
 
1096
1096
  ```bash
1097
- craft report https://www.rmp-electrical.co.uk --repo . --null null/rmp --estate ../estate.json
1098
- craft retrofit https://www.rmp-electrical.co.uk --repo . --null null/rmp --estate ../estate.json --out RETROFIT.md
1097
+ craft report https://www.example-electrical.co.uk --repo . --null null/electrician --estate ../estate.json
1098
+ craft retrofit https://www.example-electrical.co.uk --repo . --null null/electrician --estate ../estate.json --out RETROFIT.md
1099
1099
  ```
1100
1100
 
1101
1101
  | Verdict | When |
@@ -1165,7 +1165,7 @@ measured colour only.
1165
1165
  Cells read *source findings / R if seen on the rendered page*. Nothing here
1166
1166
  blocks; it is for a person to read.
1167
1167
 
1168
- | Tell | DD | MMM | Sensphere | Harrison James | HJ Beauty | Chair and Blade | RMP |
1168
+ | Tell | DD | Salon | Therapy | Accountant | Skincare | Barber | Electrician |
1169
1169
  |---|---|---|---|---|---|---|---|
1170
1170
  | `reflex-font` | 15 / · | 2 / · | 3 / R | 2 / R | 2 / · | 1 / · | |
1171
1171
  | `reflex-font-2` | 7 / R | 34 / R | 2 / · | 1 / R | 3 / R | 4 / R | 12 / R |
@@ -1189,16 +1189,16 @@ blocks; it is for a person to read.
1189
1189
 
1190
1190
  What it shows:
1191
1191
 
1192
- - **The three survey findings reproduce where they can.** Sensphere's violet
1193
- is found in source (18) and on its buttons; MMM's intro, glows and glass are
1194
- in source and its intro and glows on the page; MMM reveals 60% of the
1192
+ - **The three survey findings reproduce where they can.** Therapy's violet
1193
+ is found in source (18) and on its buttons; Salon's intro, glows and glass are
1194
+ in source and its intro and glows on the page; Salon reveals 60% of the
1195
1195
  sections below its fold on scroll, all three of them, one short of the
1196
- four the rendered rule needs, and its source is over the reveal limit. Rise & Bloom's glass
1196
+ four the rendered rule needs, and its source is over the reveal limit. A journal client's glass
1197
1197
  hero and icon grid could not be checked: that repo is not attached to this
1198
1198
  session.
1199
1199
  - **Every site ships a reflex face.** Twelve of fourteen site-face pairs are
1200
- on one of the two lists. Fraunces sets the headline on DD, HJ Beauty and RMP.
1201
- - **DD and RMP were read as the closest pair** (0.46) on the first run, with
1200
+ on one of the two lists. Fraunces sets the headline on DD, Skincare and Electrician.
1201
+ - **DD and Electrician were read as the closest pair** (0.46) on the first run, with
1202
1202
  a green accent in common. DD's "green" was its floating WhatsApp button,
1203
1203
  48px square, the only saturated paint on a near-black and white page. The
1204
1204
  fingerprint now needs a panel's worth of area before a painted colour
@@ -1219,12 +1219,12 @@ False positives found and fixed in this run:
1219
1219
  - The rendered reveal check read only a section and its direct children.
1220
1220
  Found through the null models (below): a reveal on the cards two levels
1221
1221
  down read as a still page. It now reads the text blocks inside a section
1222
- too, ignoring anything fixed. Re-run the same day: Chair and Blade, which
1222
+ too, ignoring anything fixed. Re-run the same day: Barber, which
1223
1223
  has a `RevealWrapper`, now shows `reveal-everywhere` on the page (six of
1224
1224
  nine sections below the fold).
1225
1225
 
1226
- Not yet read by a person: the source counts for `icon-tile-stack` (MMM 93)
1227
- and `glass-panel` (MMM 45) look high and are the first to check.
1226
+ Not yet read by a person: the source counts for `icon-tile-stack` (Salon 93)
1227
+ and `glass-panel` (Salon 45) look high and are the first to check.
1228
1228
 
1229
1229
  ### Signal 2 first read, 2026-09-23
1230
1230
 
@@ -1262,18 +1262,18 @@ most of the null.
1262
1262
  | Site | Score | Typical | Shares with the null |
1263
1263
  |---|---|---|---|
1264
1264
  | DD | 0.15 | yes | pill buttons (19 of 20), Fraunces headline (13 of 20) |
1265
- | Harrison James | 0.10 | yes, at the line | Inter body (18 of 20), yellow accent (16 of 20), white ground |
1266
- | MMM | 0.05 | no | white ground, radial glow (13 of 20), Cormorant Garamond (9 of 20) |
1267
- | HJ Beauty | 0.05 | no | white ground, Fraunces (5 of 20), marquee (5 of 20) |
1268
- | Chair and Blade | 0.05 | no | square buttons (18 of 20), Bebas Neue (9 of 20), dark ground |
1269
- | RMP | 0.05 | no | eyebrow chip (14 of 20), Manrope body |
1270
- | Sensphere | 0.00 | no | radial glow (10 of 20), Inter body |
1265
+ | Accountant | 0.10 | yes, at the line | Inter body (18 of 20), yellow accent (16 of 20), white ground |
1266
+ | Salon | 0.05 | no | white ground, radial glow (13 of 20), Cormorant Garamond (9 of 20) |
1267
+ | Skincare | 0.05 | no | white ground, Fraunces (5 of 20), marquee (5 of 20) |
1268
+ | Barber | 0.05 | no | square buttons (18 of 20), Bebas Neue (9 of 20), dark ground |
1269
+ | Electrician | 0.05 | no | eyebrow chip (14 of 20), Manrope body |
1270
+ | Therapy | 0.00 | no | radial glow (10 of 20), Inter body |
1271
1271
 
1272
1272
  Read with care: "not typical" says the site is not what Claude builds from
1273
- the brief today. It does not say the site was decided. Sensphere scores 0.00
1273
+ the brief today. It does not say the site was decided. Therapy scores 0.00
1274
1274
  and still carries five catalogue tells on the page, violet among them: Claude
1275
1275
  no longer builds that look for this brief, but it is still a known tell. That
1276
- is what signal 1 is for. DD and Harrison James are the
1276
+ is what signal 1 is for. DD and Accountant are the
1277
1277
  two a model would most nearly have built unprompted.
1278
1278
 
1279
1279
  **The harvest** (`calibration/null/harvest.txt`). No face outside the two
@@ -1302,11 +1302,11 @@ in `calibration/estate/`.
1302
1302
 
1303
1303
  | Pair | Distance | Shares |
1304
1304
  |---|---|---|
1305
- | DD + HJ Beauty | **0.28, siblings** | no accent, Fraunces headline, no reveals |
1306
- | DD + RMP | 0.49 | Fraunces headline, grey ground, pill buttons |
1307
- | Harrison James + Sensphere | 0.50 | white ground, square buttons, no reveals |
1308
- | HJ Beauty + RMP | 0.56 | Fraunces headline |
1309
- | Chair and Blade + anything | 0.60 to 0.86 | at most a marquee (with HJ Beauty) |
1305
+ | DD + Skincare | **0.28, siblings** | no accent, Fraunces headline, no reveals |
1306
+ | DD + Electrician | 0.49 | Fraunces headline, grey ground, pill buttons |
1307
+ | Accountant + Therapy | 0.50 | white ground, square buttons, no reveals |
1308
+ | Skincare + Electrician | 0.56 | Fraunces headline |
1309
+ | Barber + anything | 0.60 to 0.86 | at most a marquee (with Skincare) |
1310
1310
 
1311
1311
  One sibling pair in twenty-one, and it is the agency's own site with one of
1312
1312
  its clients: the same Fraunces headline over a near-black and white page with
@@ -1400,13 +1400,13 @@ the register. Reports and retrofit plans are in `calibration/report/`.
1400
1400
 
1401
1401
  | Site | Verdict | Raised | Actions |
1402
1402
  |---|---|---|---|
1403
- | DD | default | tells (12), typical (0.15), sibling of HJ Beauty | 26 |
1404
- | HJ Beauty | default | tells (6), sibling of DD | 18 |
1405
- | MMM | mixed | tells (18) | 27 |
1406
- | Sensphere | mixed | tells (9) | 18 |
1407
- | Chair and Blade | mixed | tells (7) | 11 |
1408
- | RMP | mixed | tells (8) | 18 |
1409
- | Harrison James | mixed | typical (0.10) | 9 |
1403
+ | DD | default | tells (12), typical (0.15), sibling of Skincare | 26 |
1404
+ | Skincare | default | tells (6), sibling of DD | 18 |
1405
+ | Salon | mixed | tells (18) | 27 |
1406
+ | Therapy | mixed | tells (9) | 18 |
1407
+ | Barber | mixed | tells (7) | 11 |
1408
+ | Electrician | mixed | tells (8) | 18 |
1409
+ | Accountant | mixed | typical (0.10) | 9 |
1410
1410
 
1411
1411
  No site has an `art-direction.json`, so the reasons are not measured on any of
1412
1412
  them and none can be *decided* yet. The first change after deciding is the
@@ -1420,15 +1420,15 @@ The estate and the seven null models were still on snapshot v1 (the AI set and t
1420
1420
 
1421
1421
  | Measure | Before (v1) | After (v2) |
1422
1422
  |---|---|---|
1423
- | Estate typicality against its own brief's null (own): dd, mmm, sensphere, harrison-james, hj-beauty, chair-and-blade, rmp | 0.15, 0.05, 0.00, 0.10, 0.05, 0.05, 0.05 | 0.10, 0.05, 0.00, 0.10, 0.05, 0.05, 0.05 |
1423
+ | Estate typicality against its own brief's null (own): dd, salon, therapy, accountant, skincare, barber, electrician | 0.15, 0.05, 0.00, 0.10, 0.05, 0.05, 0.05 | 0.10, 0.05, 0.00, 0.10, 0.05, 0.05, 0.05 |
1424
1424
  | Estate typicality against all seven pooled (same order) | 0.01, 0.00, 0.00, 0.09, 0.00, 0.01, 0.26 | 0.01, 0.00, 0.00, 0.10, 0.00, 0.01, 0.21 |
1425
1425
  | Distance to own null (same order) | 0.340, 0.450, 0.503, 0.277, 0.442, 0.361, 0.518 | 0.443, 0.420, 0.530, 0.304, 0.479, 0.381, 0.558 |
1426
- | Sibling pairs in the estate (below 0.31) | 1 (dd + hjbeauty, 0.28) | 0 (dd + hjbeauty is now 0.58; closest pair is dd + rmp, 0.48) |
1427
- | Null pages flagged when scored against the other six briefs (dd, mmm, sensphere, harrison-james, hj-beauty, chair-and-blade, rmp) | 20, 20, 19, 20, 19, 18, 15 of 20 | 20, 20, 20, 20, 20, 18, 18 of 20 |
1426
+ | Sibling pairs in the estate (below 0.31) | 1 (dd + skincare, 0.28) | 0 (dd + skincare is now 0.58; closest pair is dd + electrician, 0.48) |
1427
+ | Null pages flagged when scored against the other six briefs (dd, salon, therapy, accountant, skincare, barber, electrician) | 20, 20, 19, 20, 19, 18, 15 of 20 | 20, 20, 20, 20, 20, 18, 18 of 20 |
1428
1428
  | Null pages typical against the other six (same order) | 13, 10, 10, 12, 10, 4, 2 | 14, 8, 9, 13, 6, 7, 3 |
1429
1429
  | AI set flagged against the pooled v2 null | 19 of 20 | 20 of 20 (typical 15, tell-heavy 20) |
1430
1430
 
1431
- What moved: the estate is still atypical of what the model builds for its own brief (own typicality 0.10 or lower on all seven), and only RMP Electrical is close to the pooled null (0.21, down from 0.26; its shared traits are a hero eyebrow chip and pill buttons). The one sibling pair, Doman Digital and Harrisons Beauty, is no longer one; the pair that stays closest is Doman Digital and RMP Electrical (0.48). The AI set gained one flagged page (the 20 of 20 the flagged-rule decision records). Because the live sites were not frozen, the estate movement mixes the snapshot version with site changes, and this run cannot separate them.
1431
+ What moved: the estate is still atypical of what the model builds for its own brief (own typicality 0.10 or lower on all seven), and only Electrician is close to the pooled null (0.21, down from 0.26; its shared traits are a hero eyebrow chip and pill buttons). The one sibling pair, the studio's own site and the skincare shop, is no longer one; the pair that stays closest is the studio's own site and the electrician (0.48). The AI set gained one flagged page (the 20 of 20 the flagged-rule decision records). Because the live sites were not frozen, the estate movement mixes the snapshot version with site changes, and this run cannot separate them.
1432
1432
 
1433
1433
  `craft tells harvest` on the v2 models gives the same three candidates as before (red accent #e77a63, 66 of 140; square shape, 47 of 140; the opening `hero > hero > cards`, 54 of 140) and 40 recurring phrases (the same count as before; the list was not diffed line by line). The only difference is in the already-caught list, which now includes `no-real-imagery` (117 of 140), `hero-eyebrow-chip` (53), `stats-row` (42) and `unproven-claim` (35): tells that came in with snapshot v2 and later phases, which the v1 harvest could not see. Nothing was added to the catalogue, and no tell or threshold changed.
1434
1434
 
@@ -1450,19 +1450,19 @@ The board in question is the DD redesign's Stage 05 artefact (DOM-397, CRO-21);
1450
1450
 
1451
1451
  ### Ground temperature and structure, 2026-10-09
1452
1452
 
1453
- Bellerose Plumbing's light mode looked, to the founder, too much like RMP Electrical, and craft gave the pair 0.59 sharing only "grey ground". Bellerose then moved its light page from warm stone (`#EEEDE8`) to cool porcelain (`#F1F3F4`, bellerose-plumbing#32), and craft scored the two Bellerose pages 0.01 apart. Two things were missing: hue barely counts at a ground's chroma, and structure moved the score by a tenth at most. Fingerprint version 3 (DOM-637) adds ground temperature to the ground part, a rhythm part and a hero part, with the weights in *The rendered page* above. Measured on RMP live (2026-10-09) and Bellerose built locally at `c62590c` (stone, before #32) and `47f9d79` (porcelain), each snapshotted with `--scheme light` and `--scheme dark`; snapshots, a copy of the redesign workstream's register and the full tables are in `calibration/estate/2026-10-09-temperature/`. "Before" is craft 0.18.1's distance on the same snapshots.
1453
+ Plumber's light mode looked, to the founder, too much like Electrician, and craft gave the pair 0.59 sharing only "grey ground". Plumber then moved its light page from warm stone (`#EEEDE8`) to cool porcelain (`#F1F3F4`, the plumber's change), and craft scored the two Plumber pages 0.01 apart. Two things were missing: hue barely counts at a ground's chroma, and structure moved the score by a tenth at most. Fingerprint version 3 (DOM-637) adds ground temperature to the ground part, a rhythm part and a hero part, with the weights in *The rendered page* above. Measured on Electrician live (2026-10-09) and Plumber built locally at `c62590c` (stone, before #32) and `47f9d79` (porcelain), each snapshotted with `--scheme light` and `--scheme dark`; snapshots, a copy of the redesign workstream's register and the full tables are in `calibration/estate/2026-10-09-temperature/`. "Before" is craft 0.18.1's distance on the same snapshots.
1454
1454
 
1455
1455
  | Pair | Before | After | Shares after |
1456
1456
  |---|---|---|---|
1457
- | RMP + Bellerose light on stone | 0.59 (cream ground) | **0.54** | warm ground, left-aligned serif hero, photo right, light hero then dark band |
1458
- | RMP + Bellerose light on porcelain | 0.59 (cream ground) | 0.58 | left-aligned serif hero, photo right, light hero then dark band |
1459
- | RMP + Bellerose dark (either) | 0.77 | 0.72 | left-aligned serif hero, photo right |
1460
- | Bellerose stone light + porcelain light | 0.01 | 0.06 | everything but the ground |
1461
- | RMP + RMP | 0.00 | 0.00 | |
1457
+ | Electrician + Plumber light on stone | 0.59 (cream ground) | **0.54** | warm ground, left-aligned serif hero, photo right, light hero then dark band |
1458
+ | Electrician + Plumber light on porcelain | 0.59 (cream ground) | 0.58 | left-aligned serif hero, photo right, light hero then dark band |
1459
+ | Electrician + Plumber dark (either) | 0.77 | 0.72 | left-aligned serif hero, photo right |
1460
+ | Plumber stone light + porcelain light | 0.01 | 0.06 | everything but the ground |
1461
+ | Electrician + Electrician | 0.00 | 0.00 | |
1462
1462
 
1463
- Against the register as it stands (stored version 2 fingerprints, not re-added), the stone page's nearest site is RMP (0.54) and the porcelain page's is Harrison James (0.52) with RMP second (0.58): the move away from RMP that the founder made by eye now shows in the numbers, and both Bellerose light pages still share the opening with RMP, which is the next thing to pull apart. Neither pair is a sibling; the faces, the accent and the button shape are their own.
1463
+ Against the register as it stands (stored version 2 fingerprints, not re-added), the stone page's nearest site is Electrician (0.54) and the porcelain page's is Accountant (0.52) with Electrician second (0.58): the move away from Electrician that the founder made by eye now shows in the numbers, and both Plumber light pages still share the opening with Electrician, which is the next thing to pull apart. Neither pair is a sibling; the faces, the accent and the button shape are their own.
1464
1464
 
1465
- The seven register pairs reshuffle little: Kendall tau 0.83 between the before and after orderings over 21 pairs, the closest pair is still DD + RMP (0.48 to 0.52, now "warm ground" rather than "grey ground"), and no pair crosses the sibling line. Pairs that shared "white ground" and little else move apart by 0.02 to 0.06 as the temperature counts (MMM + Sensphere keep "cool white ground"); Chair and Blade + HJ Beauty move closer (0.74 to 0.66) because both open dark then light. The sibling line measured again on the seven v2 null models is 0.337 with the old distance and 0.339 with the new, so the weights do not move it; `SIBLING_AT` stays at the 0.31 measured on the v1 models in September, and moving it to the v2 line is a separate decision.
1465
+ The seven register pairs reshuffle little: Kendall tau 0.83 between the before and after orderings over 21 pairs, the closest pair is still DD + Electrician (0.48 to 0.52, now "warm ground" rather than "grey ground"), and no pair crosses the sibling line. Pairs that shared "white ground" and little else move apart by 0.02 to 0.06 as the temperature counts (Salon + Therapy keep "cool white ground"); Barber + Skincare move closer (0.74 to 0.66) because both open dark then light. The sibling line measured again on the seven v2 null models is 0.337 with the old distance and 0.339 with the new, so the weights do not move it; `SIBLING_AT` stays at the 0.31 measured on the v1 models in September, and moving it to the v2 line is a separate decision.
1466
1466
 
1467
1467
  ## The catalogue
1468
1468
 
@@ -1470,7 +1470,7 @@ Generated from the package. Run `pnpm --filter @domandigital/craft run docs`
1470
1470
  after changing an entry; a test fails until you do.
1471
1471
 
1472
1472
  <!-- craft:catalogue:start -->
1473
- Catalogue version `2026.10.8`, 76 tells.
1473
+ Catalogue version `2026.10.9`, 77 tells.
1474
1474
 
1475
1475
  | Id | Gen | Surface | Severity | Tell | Why it is a default |
1476
1476
  | --- | --- | --- | --- | --- | --- |
@@ -1482,9 +1482,9 @@ Catalogue version `2026.10.8`, 76 tells.
1482
1482
  | `glass-panel` | 1 | source + rendered | warn | Glass panel | A translucent blurred card over a busy background is the stock way to put text on a hero image. It costs contrast and says nothing about the client. |
1483
1483
  | `hero-then-proof` | 1 | source + rendered | warn | Hero straight into a trust strip | Six of seven estate sites go hero, then logos or stats. It is the landing-page template's order, not the client's story. |
1484
1484
  | `icon-tile-grid` | 1 | source + rendered | warn | Three-column icon-card grid | Three cards, each an icon, a heading and two lines, is what a model builds for any list of services. |
1485
- | `reveal-everywhere` | 1 | source + rendered | warn | Reveal on every section | When every block fades up on scroll, the motion stops meaning anything and the page feels slow. MMM had 70, DD 40, sen-sphere 27. |
1486
- | `pill-everything` | 1 | source + rendered | warn | Pills everywhere | rounded-full on every button, badge and tag is the framework's friendliest default. MMM had 162, DD 125. A shape used everywhere is not a shape language. |
1487
- | `shadcn-dump` | 1 | source | warn | Stock component dump | A generator exports the whole shadcn/ui kit whether the site uses it or not. Rise & Bloom ships a full set under its own book, vine and petal assets. |
1485
+ | `reveal-everywhere` | 1 | source + rendered | warn | Reveal on every section | When every block fades up on scroll, the motion stops meaning anything and the page feels slow. One salon client's site had 70, the studio's own 40, a therapy practice's 27. |
1486
+ | `pill-everything` | 1 | source + rendered | warn | Pills everywhere | rounded-full on every button, badge and tag is the framework's friendliest default. One salon client's site had 162, the studio's own 125. A shape used everywhere is not a shape language. |
1487
+ | `shadcn-dump` | 1 | source | warn | Stock component dump | A generator exports the whole shadcn/ui kit whether the site uses it or not. One client's journal site ships a full set under its own book, vine and petal assets. |
1488
1488
  | `shadcn-card-stock` | 1 | source | warn | Stock shadcn Card | The registry Card (bg-card, a plain border, rounded-lg or rounded-xl, shadow-sm) is the container every generated page is built from. Left as shipped, every card on the site looks like every other shadcn site's. |
1489
1489
  | `cream-palette` | 2 | source + rendered | warn | Cream ground | Once white-and-violet was named, models moved to a warm off-white: parchment, linen, oat. It reads as 'tasteful' in the same way everywhere. |
1490
1490
  | `italic-serif-display` | 2 | source + rendered | warn | Italic serif display | A serif heading with one italic word ('Beauty, reimagined') is the second wave's signature move. |
@@ -1520,6 +1520,7 @@ Catalogue version `2026.10.8`, 76 tells.
1520
1520
  | `no-x-badge` | 2 | copy | warn | 'No X' badge | 'No catch.', 'NO JARGON GUIDE': a short standalone 'No X' reads as a slapped-on kicker, and worse when the same one is reused across pieces. |
1521
1521
  | `staccato-triplet` | 2 | copy | warn | Staccato triplet | Three fragments in a row ('Fast. Friendly. Local.' or 'No fuss. No jargon. Just results.') (a tricolon in asyndeton: see COPY.md) is the second wave's favourite rhythm. |
1522
1522
  | `parallel-pair` | 2 | copy | warn | Verbless parallel pair | 'One form, seven workflows', 'Same site, same £8,000': two matched fragments with no verb (isocolon, often with anaphora or asyndeton: see COPY.md), the staccato triplet's two-part cousin. It sounds decided and says less than a sentence would. |
1523
+ | `absolute-negation` | 2 | copy | warn | Absolute negation fragment | 'never pre-ticked', 'no servers', 'nothing to buy or run': a verbless fragment that opens on never, nothing, nobody or 'no' + noun. Read aloud it sounds rigid, it promises an absolute the copy rarely means, and it defines the thing by what it is not. |
1523
1524
  | `where-x-meets-y` | 2 | copy | warn | 'Where X meets Y' | 'Where luxury meets comfort' is a tagline shape that fits every business and so describes none. |
1524
1525
  | `chatbot-residue` | 1 | copy | warn | Chatbot residue | 'Certainly! Here's a revised version', 'as an AI language model', a citeturn0search0 token, a link tracked utm_source=chatgpt.com: text that exists only because a chat reply was pasted whole. This is evidence, not style. |
1525
1526
  | `stock-email-line` | 1 | copy | warn | Stock email line | 'I hope this email finds you well', 'let me know if you have any questions', 'don't hesitate to contact us': the opener and closer of a form email. A client reads past them, and a model drafting an email writes them every time. |
package/COPY.md CHANGED
@@ -99,8 +99,9 @@ person reading decides which instance earns its place.
99
99
  | `review-phrase` | truly, genuinely, deeply, ultimately, clear and clearly ("a clear next step", "clear pricing": say what the reader actually gets), plain as a self-description ("plain answers", "a plain recommendation"), great question, absolutely, one-size-fits-all, and superlative over-claiming: "the single most", "by far the most", "hands down the", "arguably the best", "bar none" |
100
100
  | `sales-tagline` | advert lines that say nothing a reader can check: "so your budget goes where it counts", "real results", "results that matter", "work harder for you", "pages that convert" |
101
101
  | `matey-register` | the put-on British voice: "Alright Dave,", "cheers mate", "no worries", "we'll get you sorted", "proper good", "give me a shout", "chuffed", "Right then,"; and clipped speech that drops the small words: "have look at", "give it go", "Quick one:", "built you a site". Write plain, complete British English |
102
- | `confession-line` | scoping the business by what it has not done, will not do or is not: "What this is and is not", "we have not yet built", "our clinic experience so far is one practice", "what we would and wouldn't take on", "who we don't work with". It's an open shop: be honest by being precise ("the portal we run for Sensphere") and keep the door open. Contractual facts (eligibility, who runs what) stay, said as what the buyer gets |
102
+ | `confession-line` | scoping the business by what it has not done, will not do or is not: "What this is and is not", "we have not yet built", "our clinic experience so far is one practice", "what we would and wouldn't take on", "who we don't work with". It's an open shop: be honest by being precise ("the portal we run for a children's therapy practice") and keep the door open. Contractual facts (eligibility, who runs what) stay, said as what the buyer gets |
103
103
  | `trailing-contrast` | the softer contrast template: a noun or phrase after ", not" closing a sentence ("Edge matters for game servers, not registration"), "not a legal one", and "renting computing instead of owning it". A genuine disclaimer has the same shape ("general information, not a recommendation"), so it is reported, never blocked. Say the positive claim; keep the contrast only where the reader would otherwise assume the other thing |
104
+ | `absolute-negation` | a verbless fragment that opens on never, nothing, nobody or "no" + noun, after a clause break: "A guardian consents by email; never pre-ticked", "Pay per user per month; no servers", "nothing to buy or run", "Nothing on-site to join", "no duplicates". Read aloud it sounds rigid and promises an absolute. A sentence with a subject and a verb ("Players never open the lists", "Nothing is copied by hand"), an instruction ("Never share your password"), a citation with no date ("ICO, no date") and a "No" form answer pass. Say what happens as a sentence; keep the absolute only where it is literally true and the reader needs it |
104
105
  | `outcome-promise` | a hoped-for result written as delivered: "we'll turn that into enquiries", "once the first areas are working", "competitors you can outdo", "exactly what convinces", "guaranteed rankings", "you'll get more". Promise the work; measure and report the results |
105
106
  | `ai-vocabulary` | tapestry, testament, realm, elevate, nestled, meticulous, unparalleled, moreover; and underscore, showcasing, pivotal, measured 10 to 14 times over-used in post-2022 text |
106
107
  | `stock-email-line` | the form-email opener and closer: "I hope this email finds you well", "hope you're having a great week", "let me know if you have any questions", "don't hesitate to contact us". Start with the reason for writing; end with the next step and who to ask |
@@ -285,7 +286,7 @@ that ships from the repo is ours to fix; copy the owner typed is theirs.
285
286
  ## Rendered social assets: no raw links
286
287
 
287
288
  A carousel slide, Story, Reel or caption never shows a raw URL: no `https://`,
288
- no `www.`, no path. Show a bare domain (`RMP-ELECTRICAL.CO.UK`) or a plain
289
+ no `www.`, no path. Show a bare domain (`EXAMPLE-ELECTRICAL.CO.UK`) or a plain
289
290
  call to action ("Link in bio"). Keep the full address in source data and let
290
291
  the render step transform it. craft cannot enforce this, because raw URLs are
291
292
  legitimate almost everywhere else in a repo. The social generator's own render
package/PRINCIPLES.md CHANGED
@@ -121,7 +121,7 @@ the client or a test, and at which widths each was looked at. The phone is
121
121
  where this is examined first; a finding made there is not assumed to hold on a
122
122
  desktop. See [CHARACTER.md](./CHARACTER.md#decision-confidence).
123
123
 
124
- The principle is Eunice Ordor's, from a review of a phone layout on 15 October 2026,
124
+ The principle comes from a studio reviewer's review of a phone layout on 15 October 2026,
125
125
  and its question is: what does this visitor need to see, understand and believe
126
126
  before they are comfortable taking the next appropriate action? It adds to the
127
127
  standards above and replaces none of them. It also sets how a change is chosen:
@@ -130,11 +130,11 @@ the evidence are judged apart, and the smallest change that answers the problem
130
130
  wins. "The existing design is already appropriate" is a result. See
131
131
  [Reviewing a proposed change](./CHARACTER.md#reviewing-a-proposed-change).
132
132
 
133
- Her review of Doman Digital's own new site (18 and 19 October 2026, 73 notes)
133
+ A review of Doman Digital's own new site (18 and 19 October 2026, 73 notes)
134
134
  is kept whole in the reviewer corpus, with the founder's rulings of 20 October,
135
135
  and it adds eleven principles and two tells. The main ones: an open shop is honest
136
136
  by being precise, never by confessing what it has not done; a summary page
137
137
  carries the substance; a case line ends on its result; a hero has one button;
138
- and the first screen on a phone belongs to the business. Every later review of
139
- hers feeds craft the same way. See
140
- [Eunice's review of the DD site](./CHARACTER.md#eunices-review-of-the-dd-site-2026-10-19).
138
+ and the first screen on a phone belongs to the business. Every later review
139
+ feeds craft the same way. See
140
+ [Review of the studio's own site](./CHARACTER.md#review-of-the-studios-own-site-2026-10-19).