Decisions log

2026-08-02 — Migration into the skill-suite structure (phase-1 test run)

(index.html, styles.css, script.js) deployed to silvia-jayet-reflexologie-preview.pages.dev.

deploy/ added; legacy files untouched at root so the existing preview deploy keeps working).

The future site/ build will replace the root deploy at publish time.

identity.md curated from the site itself + its source files.

deliberate deviation from the spec sitemap for now (see category-mapping.md).

The site publishes its tokens as CSS custom properties — adopted as the basis for design-tokens.json.

close to the suite's known convergence style. Kept faithful in v1 tokens (source-site fidelity);

the styleguide flags the terracotta + deep-green pill CTA as the distinctive anchors and lists

review options for Pat at the styleguide gate.

2026-08-02 — Styleguide gate: v2 "sharpened" identity proposed

demote sage to details, body font Inter → Karla; deep-green pill CTA and Cormorant stay.

2026-08-02 — Phase 2 draft-first: full draft site live on v2

minor copy fixes: FR reflexP1/history typos cleaned, t1 price display normalized to EN pattern).

HealthAndBeautyBusiness schema (hours carried from the old site's own schema — to confirm),

llms.txt, self-hosted fonts, hreflang, sitemap. check-tokens: 0 violations.

2026-08-02 — Suite v0.9.0 applied (specs 121–126)

linked from the draft ribbon; mechanically removed at DRAFT=false (preflight-enforced).

legacy flat site moved to content/sources/legacy-site/ (its deploy untouched, rule 118).

2026-08-02 — Dossier v2: working-copy surface (suite spec 127)

cross-linked; TODO items carry stable [T1..T30] IDs; answer box (mailto to Pat until a

Web3Forms key exists). Reply pattern: "T4 done, T2: …" → agent edits files → rebuild.

2026-08-10 — Content pass: testimonials, hero photo, trigger points, disclaimer

Consent is NOT yet on file for either; tracked in content/reviews.md, blocker before go-live.

served via astro:assets → responsive webp (56–289 kB vs 337 kB original). Casual outdoor

shot, kept deliberately after review. placeholderNature → heroPhotoAlt; placeholderStream

still [TBD:], so T24 stays open.

to match. Earlier edit had landed in content/sources/ (an extraction archive) — reverted

there; sources/ is a snapshot and is never hand-edited.

un suivi médical," / "Without ever replacing medical care,") — Silvia's call, 2026-08-10.

reflexP2 still carries "ne remplace pas un suivi médical" in both locales; left in place.

If Silvia registers with ASCA/RME, recheck their advertising wording rules against this.

2026-08-10 — Silvia's fact answers (T1–T10) + naming/pricing decisions

closed, T10 partially (hero done; cabinet photos not possible for now → deferred).

regular price — expectation management for when the offer ends. Silvia ties the offer's end to

ASCA recognition, so no printed end date ("valable jusqu'à nouvel avis"); removal trigger

moved into T29. Note: Silvia's own wording could read as "all sessions CHF 70"; Pat decided to

keep the launch-offer framing.

service-first French convention, é accent kept, must be identical on GBP / header / signage /

impressum. Header currently "Silvia Jayet — Réflexologie · Lausanne" → align (T19.7).

Jayet · Silvia Jayet, Chemin de Bérée 22b, 1010 Lausanne". "Entreprise individuelle" label

dropped as implied (Pat) — the visible personal name + address satisfy the requirement.

folds into T23 (rebuild + preview recheck).

2026-08-10 — T19 applied: Silvia's facts into both copy decks

HealthAndBeautyBusiness schema (was Tu-Fr 13:00-19:30, inherited from the old site).

treatmentsFine; the other two would have contradicted it).

(wheelchair access possible but difficult) — rendered in the contact list.

banner; reopening date 01.09.2026 and "valable jusqu'à nouvel avis" in offerSubtitle;

no printed end date per Silvia. CHF 110 already visible as the regular price.

config.mjs → header, meta titles, schema name, legal-page titles, impressum, privacy.

brandTag demoted to "Réflexologie thérapeutique · Lausanne" to avoid repeating the name.

UID line — Silvia is not in the commercial register, T9). Privacy still has two open

[TBD:]: e-mail retention period and go-live date — neither is decided yet.

"The Bayly School of Reflexology" (was "École Bayly"), "Ecovie Sàrl" (was "Ecovie").

confirmed ~1h30 with anamnesis; footer note still announced placeholder imagery.

2026-08-10 — Image licence cleared + privacy retention decided

(1280×717), so the 16/9 crop and layout are unchanged. Licence confirmed held by Alexia — [T31]

closed. The licence reference itself is not recorded; SOURCES.md flags that gap.

health concerns, i.e. sensitive personal data under nDSG art. 5 — a stated, bounded retention

is the point, and 12 months is short enough to be defensible while covering a season of

follow-up. What matters now is that the mailbox is actually emptied on that cadence.

go-live date — the [TBD:] label misnamed it. Bump it whenever the privacy text changes;

it does not need to wait for publication. No [TBD:] left anywhere in the copy deck.

2026-08-10 — aiwww.ch webcheck (84/100) → round-1 fixes [T32]

Scores: Tempo 98, Cookies 100, Links 100, Technik 88, Recht 88, Google 89 — top finding

("noindex") is our deliberate draft setting; ribbon contrast + sitemap findings likewise

draft artifacts that resolve at go-live.

info" — the JSON-LD already carries name/address/phone/hours/priceRange; checker apparently

only recognizes literal LocalBusiness/Organization, not the valid HealthAndBeautyBusiness

subtype. Kept the more specific type. (2) "privacy unspecific" — deck already names hosting,

logs, retention, contact; checker hit the pre-deploy cache. → both worth reporting to Martin.

skip-link / faq summary via padding-block + negative margin (hit area grows, layout pixel-

identical — verified 48–51px in browser, typography unchanged); public/_headers with HSTS,

X-Frame-Options SAMEORIGIN, Permissions-Policy, nosniff, referrer-policy and 1-year immutable

caching for hashed /_astro/* assets; FAQ questions now real <h3> inside <summary> (font:

inherit → identical look) + FAQPage JSON-LD from the same deck strings (schema.mjs policy:

FAQs are visible page text).

e-mail obfuscation (moot once T17 brings a domain address), SPF/DMARC/DNSSEC/CAA (impossible

on pages.dev — folded into T17/T26 go-live checklist).

2026-08-10 — Suite spec 162 ported: brand favicon

ported by re-syncing site/scripts/generate-tokens.mjs from the starter template (only diff).

name identical everywhere); favicon generates as "R" in Cormorant on primary #2a302a.

is safe (the tokens step never touches a file without the marker).

2026-08-11 — Kit drift fixed + suite spec 165 (fact-propagation sweep)

are generated once and never regenerate on build — Silvia's T1–T10 answers reached decks and

schema (T19) but not the kits. Swept: gbp-setup.md + listings-kit.md now carry hours

14:30–18:30, espèces/TWINT, FR/EN/DE/ES, wheelchair attribute «non», opening 01.09.2026,

launch-offer wording, and the T8 name (also fixed in README/TODO/styleguide titles).

mandatory propagation sweep; publish-preflight warns on leftover intake markers in deploy/*.md.

2026-08-11 — Logo integrated (header lockup + favicon)

"adasil" in script). brand/logo-adasil-sketch.svg — blobby circles + Cormorant text — is a

rough sketch of the same idea, NOT the logo; kept only for reference, nothing renders it.

white knocked out to alpha with a soft ramp (>=246 fully clear, 200–246 ramped, so the

anti-aliased edges leave no halo on the cream header) and trimmed to content (737×882).

So the header uses a horizontal recomposition built from two crops of the master —

site/src/assets/logo-mark.png (circle, 737×796) and logo-word.png (script, 394×72) —

laid out side by side, served through astro:assets as responsive webp (mark 2 kB at 1x).

Its placeholder marker is deliberately absent so the tokens step no longer rewrites it.

Caution: that generator matches the marker as a plain substring, so the file must not

contain it even inside a comment — a first attempt was silently overwritten that way.

opaque pixels of the real artwork. (An earlier #3f6b52 came from the sketch and was wrong.)

It sits outside the existing palette — sage #93a08a, terracotta #8a5e48, ink #2a302a.

next to the wordmark) and the wordmark carries alt="adasil".

impressum, privacy and the GBP kit all still read "Réflexologie Silvia Jayet" (T8, Pat,

2026-08-10). SITE_NAME was deliberately NOT changed: renaming would rewrite the impressum's

trading name and the Google listing kits, which is Pat's and Silvia's call, not a styling

change. The site currently presents two brands; that has to be resolved before go-live.

2026-08-11 — Copy pass from Silvia's corrections (via Alexia)

burnout/dépression), session steps 4 → 5 (integration & possible reactions), "Bon à savoir"

4 → 6 items. Home.astro now maps these lists instead of hard-coding indices, and the steps

grid switched to auto-fit (a fixed repeat(4) stranded the fifth step alone on a row).

contradicts [T1], where Silvia confirmed 14:30–18:30 through Pat on 2026-08-10. Applied on

Alexia's instruction; Pat should confirm which is right before the GBP is created (T11),

since the kit carries the old figure.

2026-08-10; Italian is new and equally needs confirming before it reaches GBP attributes.

This is the wording the 2026-08-10 pass had corrected (it parses as "the body of

self-healing"); her phrasing wins, noted here so it is not "fixed" again by mistake.

footerRole → "Réflexothérapeute"; aboutEyebrow → "Qui suis-je ?"; trigger-points closing

sentence dropped; trustLine and training6 now credit Prana Formation.

native pass before go-live, especially reflexP1/P2 and the new step 5.

2026-08-12 — Medical disclaimers removed site-wide (Silvia, via Alexia)

reflexP2's closing sentence, the last "Bon à savoir" bullet (policy6), the FAQ answer on

pregnancy/medical follow-up (faq4A), and the italic line on both impressum pages. The

indicationsLead disclaimer had already been dropped on 2026-08-10.

2026-08-11) and the instruction was reaffirmed each time — recorded here as the client's

decision, not an oversight.

medical follow-up or ongoing treatment when booking, and the "Bon à savoir" list still

asks for the reason for the visit. Those are intake questions, deliberately kept.

expect complementary-therapy wording, and the site now carries none.

2026-08-11 — Kit sweep for the hours correction + Italian

updated but the deploy kits drifted again (18:30, no italien). Swept per change-requests.md

fact-propagation rule (suite spec 165); both kits now match identity.md.

2026-08-11 — WhatsApp becomes the primary booking channel

sticky mobile bar) is now "Prendre rendez-vous sur WhatsApp" → wa.me/41765457586 with a

locale-specific pre-filled message ("Bonjour, je souhaite prendre rendez-vous…" / EN).

Brand-pill styling with an inline WhatsApp glyph (currentColor — token discipline holds).

hero secondary button now anchors to the contact section.

enable profile WhatsApp chat). ⚠️ Open: Silvia to confirm the number runs WhatsApp

(WhatsApp Business app suggested).

2026-08-12 — Go-live staged, then paused on the brand conflict (T34)

13 token waivers annotated, draft-ribbon CSS moved behind the DRAFT flag, _redirects

generated, publish-preflight fully green. Production Pages project

silvia-jayet-reflexologie deployed (canonical https://reflexologie.com, 6 routes 200).

OAuth insufficient), and Pat filed the adasil-vs-"Réflexologie Silvia Jayet" brand conflict

as a go-live blocker mid-deploy (now [T34]; was a duplicate [T33]). reflexologie.com serves

nothing yet; the staged build is only on the pages.dev URL.

go-live can proceed same day; (b) rename to "adasil" — reopens T8, impressum, GBP/listings

kits, schema, privacy; days not hours.

2026-08-12 — T34 resolved: the brand is "Adasil" — go-live unblocked

impressum + privacy ("Adasil · Silvia Jayet, …" — the person stays, an unregistered trade name

alone would not satisfy the impressum identification requirement), SITE_NAME → "Adasil"

(header aria, legal-page headers), schema name, meta titles now "Adasil | Réflexologie

thérapeutique à Lausanne" (descriptive tail keeps the SEO term + her name in content),

GBP + listings kits (NAP name + duplicate-check search links). T8 superseded.

context; hero/about copy unchanged (they speak about Silvia, correctly).

2026-08-12 — Post-launch webcheck round (prod scored 89/100)

production and failed contrast — now DRAFT-gated (draft surface keeps it). robots.txt Sitemap

line made absolute (https://reflexologie.com/sitemap-index.xml).

new zone — must be allowed (repo robots.txt already welcomes them); SPF/DMARC/CAA/DNSSEC +

email routing pending; schema sameAs waits on T11–T15 profiles.

2026-08-12 — go-live orchestrator retro-fit (suite spec 182) + www cutover

canonical apex) — the machine-readable production config go-live.mjs runs from.

A www → 94.130.154.187 (Hetzner — Silvia's pre-suite site "Réflexologie Silvia Adamez",

HTTP-only; also explains the "adasil" brand: ADAmez SILvia). domain-attach's safety gate

caught it; record deleted deliberately (rollback: recreate that A record), www attached to

the Pages project — HTTP 525 on www is gone.

Zone | Dynamic Redirect | Edit (Pages _redirects cannot match hosts; a briefly-shipped

full-URL _redirects line was removed as ineffective). Until then www serves the site

directly with correct canonical tags — harmless, not ideal.

2026-08-15 — T35: brand reverted to "Réflexologie Silvia Jayet", header wordmark becomes text

name again — T8's name, restored. The trigger was the header still reading "adasil" in

production while everything the client says about herself carries her name.

(the file is kept, and brand/logo-adasil.png remains its source); the name renders as live

text in --font-headline (Cormorant Garamond), body size on mobile → h3 size at ≥560px, and

wraps to two lines against the mark on very narrow screens. The circular tree mark is

unchanged and still supplies the favicon — the Adasil origin (ADAmez SILvia) leaves the words

but not the mark.

identity.md, gbp-setup.md, listings-kit.md. The legal-page and 404 titles had hardcoded the

name in six places despite the config comment claiming a single source — they now interpolate

SITE_NAME, so the next rename really is one line.

Lausanne" (EN: "…| Reflexologist in Lausanne"). The old tail repeated "Réflexologie" straight

after the new name — bad in a SERP, and the local keyword survives either way. The header

tagline still carries the old wording and still stutters; left as a copy decision (T35 sub-item).

so the rename costs nothing outside the repo. Both kits' duplicate checks now search both

names, since a stray entry under the old name would still get the new one suspended.

(silvia-jayet-reflexologie-preview.pages.dev) as the website to paste into local.ch and

search.ch — now https://reflexologie.com.

2026-08-15 — T36: scroll reveal + price count-up (the site's first JavaScript)

FAQ rows, and both columns of every two-col section. One IntersectionObserver, one-shot

(unobserve on reveal), threshold 0.15 with an -8% bottom rootMargin so the motion reads as

the page arriving rather than catching up. Only opacity and transform animate, so no CLS.

would push LCP out for a block that is on screen from the first paint anyway.

lists (steps, FAQ, testimonials) already arrive one at a time; a delay there reads as lag.

the regular CHF 110 and promotes the CHF 70 actually charged, so the counter sits on the

<b>, not the <strong> — animating the price nobody pays would have been backwards.

No class, nothing hidden — and being inline in <head> means no flash of revealed-then-

hidden content. Every price is real text in the HTML, so the no-JS page is the old page.

observe(), intersecting or not; if nothing comes back within 2.5s the script reveals

everything. Losing the animation is cosmetic, leaving the page blank is not.

still fires, which stranded prices at "CHF 4" mid-count in testing. The count now settles

to the real number instead of animating whenever document.hidden — a correct price beats

an animation nobody is watching. Every exit path goes through one settle().

to it, then restores the original string verbatim, so currency, spacing and any later copy

edit survive. Width is frozen (tabular figures + a measured min-width) so climbing digits

cannot reflow the line.

the token rather than keeping a second copy — mind the unit, getComputedStyle normalises

"900ms" to ".9s" and a bare parseFloat gives 0.9 (caught in testing).

prices are never touched.