# SPEC: Signal Quality homepage
spec-version: 9
lens: Is the conversion signal your spend is trained on telling the truth, who checks, and does every team read it the same way?
level: L2
data-mode: synthetic
skin: signal-quality design system, 2026-09-22 zip, third pass; nesting layer 2026-09-24, rounds two to five the same day
## Structure
Most marketing stacks check that the conversion signal arrives, almost none check that it is true or write down what it means, so bidders spend against whatever arrives and every team rebuilds its own version of the number.
test: Without it, a brand reads a green dashboard as a true number and five matching dashboards as a settled one, and a colleague files Erich under tag management instead of the person who owns the signal and the seam between the teams who build it and the teams who spend against it.
## Audiences
- growth-lead | reads-to: R2 | decides: whether their conversion signal is true, and what to check first
- agency-lead | reads-to: R2 | decides: which faults to check first in a client's measurement
- colleague | reads-to: R3 | decides: whether Erich can own the signal end to end and the seam between engineering and marketing
- engineer | reads-to: R3 | decides: whether Erich knows their stack well enough to hand him the pipes
- outsider | reads-to: R1 | decides: whether they understand what Erich does well enough to explain it
- next-context | reads-to: L1 | decides: what the next revision of this page keeps
## Elements
- hero | Display couplet and plain-language lede; six of its phrases stretch in place, each one click from the part that proves it | fate: surface | rank: R0 | move: register-stack | prov: asserted | src: feedback round 2026-09-23
- contents | The folded page: eight parts and the source, each opening in place, with the six toys as a row of gems to collect | fate: surface | rank: R0 | move: nest | prov: asserted | src: nesting round 2026-09-24
- foot | Email with a copy button, LinkedIn, Erich's role at Mixbook, the page in one line | fate: surface | rank: R0 | prov: asserted | src: nesting round 2026-09-24; chat 2026-10-09
- truth | The shared source of truth: three names for one purchase, then its shared row, read three ways across Seamwork's five columns and derived from Seamwork's model between markers (seamwork/scripts/render-public-section.mjs); each signal column answers as a short list of results, with its payload or queries one click down; then the toy | fate: fold | rank: R1 | move: register-stack | prov: asserted | src: field work 2021-2026; chat 2026-10-13; chat 2026-10-14
- chain | Every light is green: the chain and its stream open with the part, the controls one level down | fate: fold | rank: R1 | move: stage-chain | prov: computed | src: payload-green
- ladder | The vocabulary, a part of its own between Convergence and the chain: live, observed, verified, intent | fate: fold | rank: R1 | move: encoded-key | prov: asserted | src: lexicon session 2026-09-22; chat 2026-10-09; chat 2026-10-14
- intent | The fourth rung, above verified: is this the signal we meant to send, checked against a written-down goal, not the data; who can answer it and its lineage in one line; holds the consent/intent duality as its deepest layer | fate: fold | rank: R1 | move: encoded-key | prov: asserted | src: chat 2026-10-09; prune pass 2026-10-14
- consent-intent | Nested inside intent: consent and intent as one primitive declared in opposite directions at a receptor; four states; generalized, no scanner or client internals | fate: fold | rank: R1 | move: nest | prov: asserted | src: chat 2026-10-09
- toy-bidder | Fidelity: the six faults I check first, and where the budget goes | fate: fold | rank: R2 | move: repeated-base | prov: computed | src: payload-bidder
- notes | Field notes as first-hand composites, client names and numbers removed; the consent story open with the part, the rest one row each | fate: fold | rank: R2 | move: repeated-base | prov: asserted | src: first-hand
- toy-race | The consent race | fate: fold | rank: R2 | move: callout-seq | prov: computed | src: payload-race
- toy-source | Find the second source; six of six unlocks a seventh card, and the score can be shared | fate: fold | rank: R2 | move: repeated-base | prov: asserted | src: payload-source
- toy-models | Five models on one floor | fate: fold | rank: R2 | move: encoded-key | prov: asserted | src: payload-models
- toy-converge | Convergence: one purchase, five definitions, one release | fate: fold | rank: R2 | move: repeated-base | prov: computed | src: payload-converge
- about | About: the portrait, at a glance, toolbox, certifications, beyond the desk | fate: fold | rank: R3 | move: register-stack | prov: asserted | src: first-hand
- sources | Sources S1 to S35, each independent of Erich; vendor sources marked | fate: fold | rank: R4 | move: repeated-base | prov: derived | src: second-source review 2026-09-23; lineage sources S32 to S35, chat 2026-10-09; prune pass 2026-10-14
- data | Every payload as a tree, with how it is made, its stamp, and what its toy computes from it; generators re-run from their seeds | fate: fold | rank: R4 | move: register-stack | prov: computed | src: this file
- spec | The structure sentence, this spec and the key | fate: fold | rank: R4 | move: register-stack | prov: computed | src: this file
- phone | Phone number | fate: cut | src: resume 2026-09
- veridity | Veridity, the deeper term | fate: cut | src: lexicon session 2026-09-22
- the-why | The land, the orchard and the wildfire work behind the practice | fate: cut | src: chat 2026-09-22
- axes-7-14 | The agentic axes | fate: cut | src: agentic measurement loop, 2026-05
- links | Links to the blog, the models map and articles; each slot is an HTML comment | fate: cut | src: chat 2026-09-23
- registers | One finding written for three readers, replaced by the row's three views | fate: cut | src: feedback round 2026-09-23
- pillars | The three-pillar strip in the hero | fate: cut | src: feedback round 2026-09-23
- wayfinding | The docked contents, the minimap rail and the floating key | fate: cut | src: nesting round 2026-09-24
- repeats | The hero buttons, the ladder quote, the chain motif, the hiring line under the steps, the second reach line | fate: cut | src: nesting round 2026-09-24
- work | How a project runs | fate: cut | src: chat 2026-10-09
- contact | Get in touch, two paths by email; the email and LinkedIn stay in the foot | fate: cut | src: chat 2026-10-09
- prune | The Convergence stat line and closing quote, the chain caption, the ladder lede, the intent rung's who-answers, held-to and lineage rows (now one line), the three congruence checks, the field note's summary list, the rendered structure sentence (it stays in this spec and the meta description), and the lineage sources no line cites any more | fate: cut | src: prune pass 2026-10-14
## Hops
- H1 | Browser -> Tag manager | seam: unchecked | reads: live | second-source: the network log, from DevTools or a HAR | method: requests fired against events expected, page by page | checked: at launch, then rarely | prov: asserted | src: field work 2021-2026
- H2 | Tag manager -> Server container | seam: unchecked | reads: live | second-source: the server container request log | method: requests received against requests sent | checked: rarely | prov: asserted | src: field work 2021-2026
- H3 | Server container -> Ad platform | seam: unchecked | reads: live | second-source: order records, the consent log and the landing log; the comparison spans H1 to H3 | method: reconcile by order ID, consent choice and click ID | checked: rarely | prov: asserted | src: field work 2021-2026
- H4 | Ad platform -> Bidder | seam: uncheckable | second-source: none exists; the bidder training set is not visible from outside the platform | method: none; keep what enters H4 true | checked: never | prov: asserted | src: field work 2021-2026
## Decisions
- Erich in front, the practice behind | prov: asserted | src: chat 2026-09-22
- No client names or client numbers; every example is synthetic | prov: asserted | src: chat 2026-09-23
- No call to action: Erich is building at Mixbook, and the email and LinkedIn in the foot are how to reach him | prov: asserted | src: chat 2026-10-09
- The practice is the shared source of truth | prov: asserted | src: feedback round 2026-09-23
- Plain words first; toys open from a teaser | prov: asserted | src: feedback round 2026-09-23
- Six axes are a fidelity checklist | prov: asserted | src: chat 2026-09-23
- Outbound links: the source list and LinkedIn only | prov: asserted | src: chat 2026-09-23
- Derived needs an independent source; first-hand is asserted | prov: asserted | src: chat 2026-09-23
- The page arrives folded: the contents are the page, and every part opens in place | prov: asserted | src: chat 2026-09-24
- Never more than two clicks between a reader and a toy; method notes are footnotes | prov: asserted | src: nesting round 2026-09-24
- One grid at every level: a label column and a reading column; figures and toys take the full width | prov: asserted | src: nesting round 2026-09-24
- A caret marks what opens in place; a plus marks a footnote; a dotted underline marks a phrase that stretches | prov: asserted | src: nesting round 2026-09-24
- Where a claim comes from (A, D, C and every pointer) shows only when the reader turns on Sources, a global switch in the site bar | prov: asserted | src: chat 2026-09-24
- Type sits on one hand-picked scale: 11, 12.5, 13.5, 16, 18, 20, 26, 41, 65, display; spacing on 4, 8, 12, 16, 20, 24, 32, 40, 48, 56, 64, 80, 96, 112 | prov: derived | src: Refactoring UI; the design system's 1.6 scale, with 12.5, 18 and 20 added
- Gold is the one accent and it stays scarce: brand, what is open, what you can press | prov: derived | src: the 60-30-10 rule
- Tables and readouts set tabular figures so columns of numbers line up; paragraphs wrap without orphans | prov: asserted | src: round four 2026-09-24
- Play: the path remembers the parts you opened, the six toys are gems to collect, and every win gets a moment | prov: derived | src: Koster, A Theory of Fun; Jonasson and Purho, Juice it or lose it; the goal-gradient effect
- The site bar sticks with the brand and the Sources switch; it steps aside while the reader reads down and returns on the first scroll up, so it never stacks on an open part's header | prov: asserted | src: chat 2026-09-24
- Every closed row says what is inside it | prov: asserted | src: round two 2026-09-24
- The screen is always dark; the paper palette serves print only | prov: asserted | src: chat 2026-10-13
- Every value a toy reads is open to read, next to how it is made and what the toy computes from it; each toy links to its data | prov: asserted | src: chat 2026-09-24
- Every control is at least 24px; no text under 12px on phones; charts scroll sideways on phones rather than shrink | prov: derived | src: WCAG 2.2, 2.5.8 target size
- The rungs name the status of the signal, not a borrowed practice: live, observed, verified; the row's third view is the signal view | prov: asserted | src: chat 2026-10-09
- Erich names himself a signal architect; the discipline transcends marketing. The Mixbook title stays stated as the current role | prov: asserted | src: chat 2026-10-09
- The ladder stands on a lineage, cited as sources S32 to S35: Shannon, Weaver and the applied industry view | prov: asserted | src: chat 2026-10-09; prune pass 2026-10-14
- The lineage cites two primary sources: Shannon's 1948 paper, which brackets meaning out of the engineering problem (S32), and Weaver's 1949 companion essay, which names the technical/semantic/effectiveness levels (S35); intent is Weaver's effectiveness level | prov: asserted | src: chat 2026-10-09
- Weaver source is a confirmed primary text hosted on a university course server; durable enough to cite, not a publisher of record | prov: asserted | src: chat 2026-10-09
- A vendor source is marked vendor and glossed as an industry view, not a neutral one | prov: asserted | src: chat 2026-10-09
- The ladder has a fourth rung, intent, a choice not a check: measured against a stated goal, not an independent data source | prov: asserted | src: chat 2026-10-09
- Intent is one rung, pragmatic and goal-oriented, not split into semantic and pragmatic: verified already owns the semantic question | prov: asserted | src: chat 2026-10-09
- Intent names who can answer it: whoever holds the goal. The telos (horme) is off the page | prov: asserted | src: chat 2026-10-09; prune pass 2026-10-14
- Intent is positioning, vocabulary and lineage, never a computed toy metric: no toy fakes a fourth lamp | prov: asserted | src: chat 2026-10-09
- The fourth rung reads as a turn, not a taller step: a rule and a line set it apart, and it spans the ladder's width | prov: asserted | src: chat 2026-10-09
- The consent/intent duality is canonical and lives nested inside the intent rung, not as a fourth pillar | prov: asserted | src: chat 2026-10-09
- Only the generalized primitive is published: the receptor and the four states. The scanner, brands and client work stay off the site | prov: asserted | src: chat 2026-10-09
- A status is typography, never an object: a problem is a glyph and a word with a bar on its left, whose line carries the state (unchecked dashed, uncheckable dotted, diverged a heavy double; independent solid, the same source dashed), and a pass is a glyph and a word with no bar, so no status reads as a button | prov: asserted | src: chat 2026-10-13, from the birth-and-drift draft; chat 2026-10-14
- A pass is a reading, named by the rung it earns: live (it arrived), observed (it matches its own lineage), verified (an independent record agrees), and across tools, converged; a problem is a state, named by what happened: diverged, unchecked, uncheckable. Agreed is retired: at the top rung it meant verified, and below it it overclaimed. One handoff can carry both, live and unchecked | prov: asserted | src: chat 2026-10-14
- Seamwork's row is Convergence's After, not a part of its own: one purchase in five columns, each in one line of its own language, under the three views it is read by (marketing one, engineering one, the signal three); the separate Seamwork part and its key are retired from the page; the payload and the queries open one click down in their own columns | prov: asserted | src: chat 2026-10-13; chat 2026-10-14
- Seamwork's five columns take five stops of one warm-to-cool desert ramp (terracotta, gold, sand, sage, teal), so the sweep carries the reading order: a rail across the row's top and each heading in its own stop, no fill. Seams stay neutral, and a seam's state sets its line | prov: asserted | src: chat 2026-10-13
## Constraints
- No em-dashes in site copy | prov: derived | src: signalquality-blogpost-create brand rule
- One file, fonts embedded, nothing external on arrival: the portrait loads when About opens, the home-screen icon only when saved | prov: asserted | src: chat 2026-09-24, amending diagram-reasoning C1
- Every toy reads a stamped, labelled payload | prov: derived | src: diagram-reasoning C8
- Veridity stays off the page for now | prov: asserted | src: lexicon session 2026-09-22
- Other companies' internal details stay off the page | prov: asserted | src: chat 2026-09-23
- Scanner internals, their codes and any brand-level findings stay off the page; only the generalized consent/intent primitive is public | prov: asserted | src: chat 2026-10-09
## Open
- Which articles fill the link slots, and when | prov: asserted | src: chat 2026-09-23
- Whether the title, the meta description and the JSON-LD carry signal architect; the eyebrow, About and the share card already do | prov: asserted | src: chat 2026-10-09
- Whether the structure sentence should carry the fourth rung, intent | prov: asserted | src: chat 2026-10-09
## Rejected
- Any switch between reader views | because: one surface serves every reader (C4) | src: diagram-reasoning C4
- Nested text measures | because: they stranded prose | src: chat 2026-09-22
- Agreement as the pillar name | because: agreed named a checked hop, a word since retired for observed and verified | src: chat 2026-09-23; chat 2026-10-14
- One part open at a time | because: readers compare parts, and more should appear as they click | src: chat 2026-09-24
- A mode tag on every toy and example | because: the contents head says it once for all of them, and the data in Source says it per payload | src: chat 2026-09-24
- Docked contents, rail and key | because: the folded page is its own contents; the chrome repeated it | src: nesting round 2026-09-24
- A next-part line at the end of every open part | because: it distracted from the part itself | src: chat 2026-09-24
- The asserted mark always on | because: one mark without the other two confused more than it told | src: chat 2026-09-24
- Presets renamed as levels | because: the presets are cases, not a difficulty curve; renaming them would bend the copy | src: round four 2026-09-24
- A fourth computed readout in the green toy | because: intent is checked against a goal, not the payload; a fourth lamp would be fiction | src: chat 2026-10-09
- "Good" as the fourth rung's name | because: intent is truer to what the rung checks and matches the cross-domain lineage | src: chat 2026-10-09
- Splitting intent into semantic and pragmatic rungs | because: verified already carries the semantic check | src: chat 2026-10-09
- A light theme on screen, and following the reader's setting | because: the column ramp holds its contrast and stays clear of the seam marks only on the dark canvas | src: chat 2026-10-13
## Data
- payload-green | mode: synthetic | source: hand-written in this file | extracted: 2026-09-22 | seed: 11 | stale-after-days: none
- payload-bidder | mode: synthetic | source: hand-written in this file | extracted: 2026-09-22 | seed: 0 | stale-after-days: none
- payload-race | mode: synthetic | source: generator in this file | extracted: 2026-09-22 | seed: 7 | stale-after-days: none
- payload-source | mode: synthetic | source: hand-written in this file; a seventh, bonus card added 2026-09-24 | extracted: 2026-09-24 | seed: 0 | stale-after-days: none
- payload-models | mode: snapshot | source: What the models stand on, embedded spec | extracted: 2026-09-22 | stale-after-days: none
- payload-converge | mode: synthetic | source: generator in this file | extracted: 2026-09-23 | seed: 5 | stale-after-days: none
- payload-receipt | mode: synthetic | source: Seamwork's snapshot workspace, via seamwork/scripts/render-public-section.mjs | extracted: 2026-10-12 | stale-after-days: none