diff --git a/backend/rudder-engine/main.go b/backend/rudder-engine/main.go index 8ce37c51f..ee0b61c3c 100644 --- a/backend/rudder-engine/main.go +++ b/backend/rudder-engine/main.go @@ -423,7 +423,7 @@ func (e *engine) startWith(lang, device string, src *recorderProc, sink func(eve recMu.Unlock() writeMu.Lock() // The streaming model holds back the last fraction of a second (its right context) until more audio - // or a pause arrives, and a commit alone does not flush it (rega: a Stop mid-sentence lost "what + // or a pause arrives, and a commit alone does not flush it (measured: a Stop mid-sentence lost "what // your country…"). 1.2 s of silence first lets it finish the words already spoken. silence := make([]byte, 3200) for i := 0; i < 12; i++ { @@ -750,7 +750,7 @@ func (e *engine) startWith(lang, device string, src *recorderProc, sink func(eve e.logs.add("speech server error: %s", string(msg)) emit(event{"type": "error", "message": string(msg)}) case t == "input_audio_buffer.committed": - // The commit acknowledges Stop; the words for the audio before it can still follow (rega: a + // The commit acknowledges Stop; the words for the audio before it can still follow (measured: a // Stop mid-word lost "what your country…"). Keep reading until the final text or 6 s of quiet (a loaded server can take seconds per backlog chunk). committed = true e.logs.add("speech server committed the stream; reading its last words") diff --git a/data/posters/andean-caribbean.html b/data/posters/andean-caribbean.html index 9d2eefa3d..9efb4229a 100644 --- a/data/posters/andean-caribbean.html +++ b/data/posters/andean-caribbean.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-china-tibet-autonomous-region.html b/data/posters/asia-china-tibet-autonomous-region.html index a0d84ed55..99e928c93 100644 --- a/data/posters/asia-china-tibet-autonomous-region.html +++ b/data/posters/asia-china-tibet-autonomous-region.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-china-yunnan-province.html b/data/posters/asia-china-yunnan-province.html index a2d332d98..99da2dbef 100644 --- a/data/posters/asia-china-yunnan-province.html +++ b/data/posters/asia-china-yunnan-province.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-andhra-pradesh.html b/data/posters/asia-india-andhra-pradesh.html index ed9d5690f..3c9a418f9 100644 --- a/data/posters/asia-india-andhra-pradesh.html +++ b/data/posters/asia-india-andhra-pradesh.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-gujarat.html b/data/posters/asia-india-gujarat.html index 2ae53480b..bddadca4a 100644 --- a/data/posters/asia-india-gujarat.html +++ b/data/posters/asia-india-gujarat.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-karnataka.html b/data/posters/asia-india-karnataka.html index a83823f0e..8327e9a71 100644 --- a/data/posters/asia-india-karnataka.html +++ b/data/posters/asia-india-karnataka.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-kerala.html b/data/posters/asia-india-kerala.html index f7fd6443b..a4e62aae5 100644 --- a/data/posters/asia-india-kerala.html +++ b/data/posters/asia-india-kerala.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-madhya-pradesh.html b/data/posters/asia-india-madhya-pradesh.html index 05290b99c..384eb3b93 100644 --- a/data/posters/asia-india-madhya-pradesh.html +++ b/data/posters/asia-india-madhya-pradesh.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-odisha.html b/data/posters/asia-india-odisha.html index 65b63bdc0..6dbe5fb49 100644 --- a/data/posters/asia-india-odisha.html +++ b/data/posters/asia-india-odisha.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-rajasthan.html b/data/posters/asia-india-rajasthan.html index 4bc19803c..90dac85a9 100644 --- a/data/posters/asia-india-rajasthan.html +++ b/data/posters/asia-india-rajasthan.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-tamil-nadu.html b/data/posters/asia-india-tamil-nadu.html index 6e5799b64..c31d78e8b 100644 --- a/data/posters/asia-india-tamil-nadu.html +++ b/data/posters/asia-india-tamil-nadu.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-uttarakhand.html b/data/posters/asia-india-uttarakhand.html index 36c1c8088..edb6bcbf9 100644 --- a/data/posters/asia-india-uttarakhand.html +++ b/data/posters/asia-india-uttarakhand.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/asia-india-west-bengal.html b/data/posters/asia-india-west-bengal.html index 21571eee4..bf86f019d 100644 --- a/data/posters/asia-india-west-bengal.html +++ b/data/posters/asia-india-west-bengal.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/brazil.html b/data/posters/brazil.html index c5d034725..f57ef2e18 100644 --- a/data/posters/brazil.html +++ b/data/posters/brazil.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/central-africa.html b/data/posters/central-africa.html index 0ff9d1b97..dbcc4d1e7 100644 --- a/data/posters/central-africa.html +++ b/data/posters/central-africa.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/deaf.html b/data/posters/deaf.html index d292aec1b..895714e6c 100644 --- a/data/posters/deaf.html +++ b/data/posters/deaf.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/east-africa.html b/data/posters/east-africa.html index 3529c1c23..18be09e8c 100644 --- a/data/posters/east-africa.html +++ b/data/posters/east-africa.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/europe.html b/data/posters/europe.html index 395879d04..e3bfd8127 100644 --- a/data/posters/europe.html +++ b/data/posters/europe.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/laos.html b/data/posters/laos.html index 81dc0802b..99120598a 100644 --- a/data/posters/laos.html +++ b/data/posters/laos.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/maghreb-egypt.html b/data/posters/maghreb-egypt.html index 9bf1142dd..36940361e 100644 --- a/data/posters/maghreb-egypt.html +++ b/data/posters/maghreb-egypt.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/mainland-se-asia-philippines.html b/data/posters/mainland-se-asia-philippines.html index c78e2f383..ef3f148f8 100644 --- a/data/posters/mainland-se-asia-philippines.html +++ b/data/posters/mainland-se-asia-philippines.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/middle-east-core.html b/data/posters/middle-east-core.html index c15d889d5..66dc9d16f 100644 --- a/data/posters/middle-east-core.html +++ b/data/posters/middle-east-core.html @@ -194,7 +194,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -214,8 +214,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -286,15 +286,13 @@ - - - - diff --git a/data/posters/oceania-indonesia.html b/data/posters/oceania-indonesia.html index 3479edbe8..148ffbf3a 100644 --- a/data/posters/oceania-indonesia.html +++ b/data/posters/oceania-indonesia.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/southern-africa-islands.html b/data/posters/southern-africa-islands.html index 1b519f434..818b284c1 100644 --- a/data/posters/southern-africa-islands.html +++ b/data/posters/southern-africa-islands.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/sudan.html b/data/posters/sudan.html index 4fad73687..a7375e018 100644 --- a/data/posters/sudan.html +++ b/data/posters/sudan.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/uncovered-nas-a.html b/data/posters/uncovered-nas-a.html index e3ad15a9c..fe0e0896e 100644 --- a/data/posters/uncovered-nas-a.html +++ b/data/posters/uncovered-nas-a.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/uncovered-scatter.html b/data/posters/uncovered-scatter.html index 3cc3eea59..3deb99bdb 100644 --- a/data/posters/uncovered-scatter.html +++ b/data/posters/uncovered-scatter.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/data/posters/west-africa.html b/data/posters/west-africa.html index 261e2c041..7e5b5f253 100644 --- a/data/posters/west-africa.html +++ b/data/posters/west-africa.html @@ -184,7 +184,7 @@ .hseries{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:14px;fill:#7E7562;letter-spacing:.01em} .hseries-em{font-weight:700;fill:#6B4A78} .hseries-dim{fill:#A79E8A} - /* The site reference on its OWN line — Brief: "so that it is less wide". A + /* The site reference on its OWN line, so the series block is less wide. A single long line was forcing the series block wider than the map. */ .hseries-dim2{font-family:Lato,'Segoe UI',system-ui,sans-serif;font-size:12px; fill:#A79E8A;letter-spacing:.02em} @@ -204,8 +204,8 @@ the map's width (~1100px); the band is now 1388px, so the type follows. 15px measures ~1263px — fills the band while keeping headroom over the width estimator's error rather than sitting one glyph from overflow. */ - /* 13.5px bold. Brief: "this is too large, it should not span full width — - there needs to be gaps." At 15px bold it measured 1396px of the 1448px band, + /* 13.5px bold. At full width it was too large: the line needs gaps at both + ends. At 15px bold it measured 1396px of the 1448px band, i.e. touching both rules; 13.5 measures ~1256px and leaves ~96px of paper at each end, so the line reads as SET INSIDE the band rather than filling it. Bold + dark ink still carry the weight. */ @@ -276,15 +276,13 @@ - - - - diff --git a/internal/backend-dev-plugin.mjs b/internal/backend-dev-plugin.mjs index b1ad5554b..1fa3f1a62 100644 --- a/internal/backend-dev-plugin.mjs +++ b/internal/backend-dev-plugin.mjs @@ -194,7 +194,7 @@ export function backendDevPlugin(root, env = process.env) { name: 'dx-backend-dev', apply: 'serve', configureServer(server) { - // ENGINE NOT RUNNING, QUIETLY (dx-shepherd, R500): with no backend process the proxy answered + // ENGINE NOT RUNNING, QUIETLY (R500): with no backend process the proxy answered // 500 ECONNREFUSED, which every page showed as console errors. While a backend is down its routes get // well-formed answers instead: /events streams ONE status event saying the engine is offline (the // plugin renders its own "engine not running" state from it), anything else returns an empty JSON diff --git a/internal/browser-slot.sh b/internal/browser-slot.sh index 8ba711cbc..19a7a475f 100755 --- a/internal/browser-slot.sh +++ b/internal/browser-slot.sh @@ -168,7 +168,7 @@ done # Everything busy: keep POLLING EVERY SLOT until the deadline, and report a timeout as UNMEASURED # rather than as a verdict. This used to queue on slot 1 alone (flock -w on slot 1), so a slot that -# freed up was never taken: measured 2026-09-25 (dx-shepherd), ten waiters were piled on slot 1 while +# freed up was never taken: measured 2026-09-25, ten waiters were piled on slot 1 while # slot 2 sat free, and with slot 1 held 12 s and slot 2 freed at ~3 s a caller waited 11.5 s — the # two-slot semaphore had collapsed into ONE queue. Polling takes the first slot that frees (~4 s in # the same test). Trade-off, accepted: polling is not first-come-first-served, so under heavy diff --git a/internal/check-approx-pin-note.mjs b/internal/check-approx-pin-note.mjs index e6f3bd90c..007a5a18f 100644 --- a/internal/check-approx-pin-note.mjs +++ b/internal/check-approx-pin-note.mjs @@ -30,7 +30,7 @@ check('a GeoJSON feature is matched to rows on the same point', colocatedWith(id check('a lone point shares with nobody', colocatedWith(idx, rows[3]).length === 0, colocatedWith(idx, rows[3])) check('a row without a position is ignored', colocatedWith(idx, rows[4]).length === 0, colocatedWith(idx, rows[4])) // A click hands over the RENDERED feature: the engine rebuilt its geometry from tile coordinates, so it is -// near the roster point but not equal to it: ~0.001 degree at low zoom (rega, row 46, a shared point that never matched). +// near the roster point but not equal to it: ~0.001 degree at low zoom (a browser check, row 46: a shared point that never matched). const rendered = { type: 'Feature', properties: { name: 'Koraga' }, geometry: { type: 'Point', coordinates: [75.2486, 12.8431] } } check('a rendered (tile-rounded) feature still finds its co-located groups', colocatedWith(idx, rendered).sort().join() === 'Godda,Maila', colocatedWith(idx, rendered)) // The same people in two countries: the nearest roster row wins, not the first. @@ -39,7 +39,7 @@ const renderedFar = { type: 'Feature', properties: { name: 'Koraga' }, geometry: check('a repeated name resolves to the nearest roster point', colocatedWith(twin, renderedFar).join() === 'Other', colocatedWith(twin, renderedFar)) // The rows a map DRAWS are normalized people groups (name + latitude/longitude, no geometry), and every // map built on useMapData must offer them to its legends: the prayer map did not, so its legends read the -// raw API cache and neither the shared-point sentence nor the standing note appeared (rega, row 46 at 835ec1ac). +// raw API cache and neither the shared-point sentence nor the standing note appeared (a browser check, row 46 at 835ec1ac). const drawn = [{ name: 'A', latitude: 12.85, longitude: 75.25 }, { name: 'B', latitude: '12.85', longitude: '75.25' }] const clickedA = { type: 'Feature', properties: { name: 'A' }, geometry: { type: 'Point', coordinates: [75.2504, 12.8497] } } check('normalized rows (no geometry) index and match a clicked pin', colocatedWith(buildColocationIndex(drawn), clickedA).join() === 'B', colocatedWith(buildColocationIndex(drawn), clickedA)) diff --git a/internal/check-composite-embed-knobs.mjs b/internal/check-composite-embed-knobs.mjs index 150ef38bd..d1f5d233a 100644 --- a/internal/check-composite-embed-knobs.mjs +++ b/internal/check-composite-embed-knobs.mjs @@ -111,8 +111,8 @@ if (!targets.length) { // The token to hand the partner page is the one the tree already bakes into its own leaves: this // gate must not invent a key, and a token that is not this tree's would 401 and look like our bug. // The tree bakes no token since the auto engine (the repo ships none), so every tk case SKIPPED and every -// provider case went UNMEASURED: a hollow PASS (rega, ded4b3c1). A seat that has a real public token passes -// it as TEST_MAPBOX_TOKEN (as rega's checks do); otherwise a baked one is still used if a tree has it. +// provider case went UNMEASURED: a hollow PASS (measured at ded4b3c1). A seat that has a real public token passes +// it as TEST_MAPBOX_TOKEN (as the browser checks do); otherwise a baked one is still used if a tree has it. const bakedToken = process.env.TEST_MAPBOX_TOKEN || (() => { for (const b of manifest.bundles || []) { for (const p of b.profiles || []) { @@ -170,10 +170,10 @@ try { lines.push(` · ${t.element} [${c.knob}] SKIPPED — no baked token in this tree to hand the host`) continue } - // The composite's OWN profile rides with the knob under test (rega, 1a761741: gospel-resources, + // The composite's OWN profile rides with the knob under test (measured at 1a761741: gospel-resources, // my-upg-100-list, regions-dashboard and two more drew no map under a knob-only config, because a // multi-profile element needs to be told which profile is the composite). A knob still wins. - // A composite that opens on a non-map view must be told to show its map (exp-shepherd: country-posters-mfe + // A composite that opens on a non-map view must be told to show its map (country-posters-mfe // reads profile-config `view`), or there is no canvas to measure. const VIEW = { 'country-posters-mfe': { view: 'map' } } const cfg = JSON.stringify({ profile: t.profile, ...(VIEW[t.element] || {}), ...c.config(bakedToken) }).replace(/'/g, ''') diff --git a/internal/check-composite-freshness.mjs b/internal/check-composite-freshness.mjs index eb28a3513..41c431c11 100644 --- a/internal/check-composite-freshness.mjs +++ b/internal/check-composite-freshness.mjs @@ -11,7 +11,7 @@ * * ★ WHY IT NOW REBUILDS AND COMPARES BYTES, NOT MTIMES (2026-09-25). The first version compared * the newest child SOURCE mtime with the parent BUNDLE mtime. File times are not build facts: - * a git merge or checkout rewrites sources with checkout-time mtimes, so rega's publish of + * a git merge or checkout rewrites sources with checkout-time mtimes, so a publish of * beb13da3 stopped on "doxa-maps-spa / plugin-studio / stack-demo STALE vs gospel-resources / * research-dashboard" although a rebuild reproduced the committed bytes exactly — and two of * those parents mount their children BY TAG at runtime, so they compile none of the child in @@ -61,7 +61,7 @@ const TREE = join(ROOT, 'public', TREE_NAME) const argv = process.argv.slice(2) const oi = argv.indexOf('--only') const ONLY = oi >= 0 && argv[oi + 1] ? new Set(argv[oi + 1].split(',')) : null -// NOT ONLY COMPOSITES (rega, 2026-09-25): a library change merged into main reached prayer-walk-planner, +// NOT ONLY COMPOSITES (measured 2026-09-25): a library change merged into main reached prayer-walk-planner, // which composes nothing, so this gate could not see it was stale. --all checks EVERY bundle; --bundles a,b // checks those (the landing precondition passes the ones a landing can have changed). const ALL = argv.includes('--all') diff --git a/internal/check-composite-interop.mjs b/internal/check-composite-interop.mjs index 33248dea6..291fbac11 100644 --- a/internal/check-composite-interop.mjs +++ b/internal/check-composite-interop.mjs @@ -26,7 +26,7 @@ * * NOT A SUBSTITUTE FOR A BROWSER. Both ends existing is necessary, not sufficient: UPG-100's * select-zone listener exists and still loses the first click, because the lazy Map pane attaches it - * too late (rega, 2026-09-26). The runtime half is check:gallery-embed's `linked` phase. + * too late (measured 2026-09-26). The runtime half is check:gallery-embed's `linked` phase. * * NEGATIVE-TESTED (2026-09-26, main 521f8b18, PASS with 17 links and the 3 LATE_KNOWN sites), each FAILS: * a receiver renamed in source ('map-filtered' -> 'map-filter' in research-map-plus-grid.vue); diff --git a/internal/check-composite-token-url.mjs b/internal/check-composite-token-url.mjs index 3495c1187..1757c7843 100644 --- a/internal/check-composite-token-url.mjs +++ b/internal/check-composite-token-url.mjs @@ -19,7 +19,7 @@ * `tk` to a baked-in child, at production stage. See the comment at the scan below. * * Source-level and headless BY DESIGN: the behavioural twin (check:composite-embed-knobs) needs a - * browser and only rega may run one. Exit 0 pass · 1 fail. + * browser, and this gate runs without one. Exit 0 pass · 1 fail. */ import { readFileSync, existsSync } from 'node:fs' import { resolve, dirname, join } from 'node:path' diff --git a/internal/check-composites-mount.mjs b/internal/check-composites-mount.mjs index 656135e59..ebcfb7cf7 100644 --- a/internal/check-composites-mount.mjs +++ b/internal/check-composites-mount.mjs @@ -10,7 +10,7 @@ * and Simple Research, both in the Research Gallery). Every structural gate passed. This gate runs * the thing that failed: the composite's own setup, and its mounted hooks. * - * HOW. No browser (fleet policy: only rega launches one). Vite loads each composite .vue through + * HOW. No browser (by design: this gate runs headless). Vite loads each composite .vue through * ssrLoadModule with the repo's alias and the same vue({ customElement: true }) plugin, and * @vue/runtime-core mounts it on a no-op renderer. The SSR compile gives the component an * ssrRender rather than a render, so the renderer draws nothing and no CHILD is set up: this diff --git a/internal/check-element-bootstrap.mjs b/internal/check-element-bootstrap.mjs index 0880c25f4..f8336281d 100644 --- a/internal/check-element-bootstrap.mjs +++ b/internal/check-element-bootstrap.mjs @@ -12,7 +12,7 @@ * * Nothing throws, because the t() shim falls back to its key. So it reads as "a few strings not * translated yet" and it survived in country-posters, key-cities, gospel-resources, cities-internet and - * my-upg-100-list simultaneously — confirmed independently by regions-plugin, who censused all 19 entry + * my-upg-100-list simultaneously — confirmed independently by a census of all 19 entry * files and found the same five and no sixth. * * ★ AND A CENSUS THAT COUNTED FUNCTION BODIES SAW FOUR OF SIXTEEN. That is why this gate greps for the diff --git a/internal/check-embed-url-absolute.mjs b/internal/check-embed-url-absolute.mjs index bb0f2546d..b18a2bb6d 100644 --- a/internal/check-embed-url-absolute.mjs +++ b/internal/check-embed-url-absolute.mjs @@ -4,7 +4,7 @@ * * THE DEFECT (2026-09-28, found testing live): the link copied from Simple Research was * `research-map-plus-grid/research-map-plus-grid/index.html` while the page was - * `http://127.0.0.1:5192/#f=…` — "the perfect example of how embeddability is not working". + * `http://127.0.0.1:5192/#f=…`, a clear case of an embed that could not work. * * WHY IT SURVIVED SO LONG, and it is the reason this is a gate rather than a fix: a relative share link * WORKS WHEN CLICKED. The browser resolves it against the page you copied it from, so the person testing diff --git a/internal/check-facet-changes-map.mjs b/internal/check-facet-changes-map.mjs index ee9af37fb..40194f67a 100644 --- a/internal/check-facet-changes-map.mjs +++ b/internal/check-facet-changes-map.mjs @@ -196,7 +196,7 @@ const run = async () => { const f = __srcFeatures(m, 'rd-bubbles'); return !!(f && f.length > 0); })()`, { timeout: 90000 }) } catch (e) { - // ★ DISTINGUISH "I CANNOT MEASURE THIS ENGINE" FROM "THE PRODUCT IS BROKEN". + // ★ DISTINGUISH "THIS ENGINE CANNOT BE MEASURED HERE" FROM "THE PRODUCT IS BROKEN". // This gate reads the source's CURRENT GeoJSON off `_data`, a private Mapbox internal. MEASURED // on one dashboard, one build, only the engine differing, by calling the app's own setData() to // shrink 2107 features to 5: diff --git a/internal/check-frozen-labels.mjs b/internal/check-frozen-labels.mjs index a7e3b7893..c01c6f64a 100644 --- a/internal/check-frozen-labels.mjs +++ b/internal/check-frozen-labels.mjs @@ -38,7 +38,7 @@ import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs' import { join, relative, resolve, dirname } from 'node:path' import { fileURLToPath } from 'node:url' import { TREE_NAME } from './_tree-name.mjs' -// ★ SHARED WITH check:hardcoded-english (regions-plugin). Two gates must agree about WHICH files are +// ★ SHARED WITH check:hardcoded-english (the same file list). Two gates must agree about WHICH files are // in scope even when they disagree about what they find in them; a second copy would drift on exactly // the pair-form / transitive / cycle details below, and the drift would be silent. import { effectiveStages, stageReason } from './lib/effective-stage.mjs' @@ -73,7 +73,7 @@ function findFrozen(ast, aliases) { if (name && (TRANSLATORS.has(name) || aliases.has(name))) { // tStatic(path, EXPLICIT_LOCALE) — the caller pinned it deliberately. const pinned = name === 'tStatic' && node.arguments.length > 1 - // ★ tStatic IS NEVER LIVE, WHEREVER IT SITS (exp, 2026-09-28). It resolves the locale via + // ★ tStatic IS NEVER LIVE, WHEREVER IT SITS (2026-09-28). It resolves the locale via // getRuntimeLocale(), which reads a PLAIN window property — not a Vue ref — so a computed() // wrapping it has NO reactive dependency and never invalidates. computed(() => tStatic(x)) // is strictly WORSE than the naked call: it looks like the fix, so nobody looks again. @@ -153,7 +153,7 @@ const DEAD_LOCALE_GETTER = /\b(getRuntimeLocale|detectLocale|localeFromUrl)\s*\( /** * Is offset `at` inside the parentheses of a computed()/watch()/watchEffect() that tracks the locale? * - * ⚠ BRACE DEPTH, NOT A LOOKBACK WINDOW (gospel, GOS-FROZEN-SR). The first version of this asked + * ⚠ BRACE DEPTH, NOT A LOOKBACK WINDOW (GOS-FROZEN-SR). The first version of this asked * whether a wrapper appeared in the preceding 260 characters. gospel hit exactly this in GiDrawer.vue * — the enclosing `computed(` opens at line 35 and the call sites are at 95-100 — and reported SIX * false positives on working code, nearly "fixing" it. Measured on the same shape here: 2,600 @@ -206,7 +206,7 @@ function findStoredTreeFreeze(code) { // function RETURNS A STRUCTURE whose values come from the translator — an options object or a // node list — which a caller then stores. So require the translator call to sit inside a // returned object/array literal, not merely somewhere in the body. - // ★ THE MECHANISM IS "BUILT CORRECTLY, THEN PARKED", not "built once at setup" (gospel, on + // ★ THE MECHANISM IS "BUILT CORRECTLY, THEN PARKED", not "built once at setup" (found on // upg100's legendOpts). That function re-reads t() correctly on EVERY call — its own comment // says the function shape is deliberate — and the freeze is one level out: the RESULT is // assigned into a ref and nothing re-fills it. A rule that only looked for a translator outside @@ -282,7 +282,7 @@ function findDeadGetterComputed(code) { } /** - * SHAPE 3 — labels evaluated inside a provide() literal (gospel, GOS-FROZEN-SR; real in GiCombos.vue). + * SHAPE 3 — labels evaluated inside a provide() literal (GOS-FROZEN-SR; real in GiCombos.vue). * * provide('dashboardConfig', { facets: { access_level: { label: T('…') } } }) * @@ -388,7 +388,7 @@ const CASES = [ ['GOOD inside an arrow', () => scanSource("const { t } = useI18n()\nconst f = () => t('a.b')").length, 0], ['GOOD tStatic with explicit locale', () => scanSource("const x = tStatic('a.b', 'en')").length, 0], ['GOOD watch(() => t())', () => scanSource("const { t } = useI18n()\nwatch(src, () => t('a.b'))").length, 0], - // ★ exp's false negative: a computed cannot make tStatic live. + // ★ A known false negative: a computed cannot make tStatic live. ['BAD computed(() => tStatic()) is STILL frozen', () => scanSource("const X = computed(() => tStatic('a.b'))").length, 1], // A function BODY re-reads the global on every call (useOptionalT:74 returns such an arrow), // so it is NOT frozen. Only a reactive wrapper caches it. I had this case backwards at first. diff --git a/internal/check-gospel-embed-contract.mjs b/internal/check-gospel-embed-contract.mjs index 460568b55..999ff235c 100644 --- a/internal/check-gospel-embed-contract.mjs +++ b/internal/check-gospel-embed-contract.mjs @@ -171,7 +171,7 @@ try { the data was right and the feature was dead. */ /* ⚠ THE NAME, CASE-FOLDED, ANYWHERE IN THE CARD. This asserted `text.includes(slug.split('-')[0])` — "abai" against a rendered "Abai Sungai" — and reported a false negative on a card that was - rendering correctly, which cost rega a round. A slug fragment is not the name; the roster has + rendering correctly, which cost a review round. A slug fragment is not the name; the roster has the name, so the roster is what it compares. */ const anyRow = (JSON.parse(readFileSync(resolve(PUBLIC, TREE_NAME, 'assets/tables/doxa-people-groups.json'), 'utf8')).rows || []) .find((r) => r.slug && r.mapped) diff --git a/internal/check-gospel-engine-contract.mjs b/internal/check-gospel-engine-contract.mjs index 050f5db62..2af07629d 100644 --- a/internal/check-gospel-engine-contract.mjs +++ b/internal/check-gospel-engine-contract.mjs @@ -2,7 +2,7 @@ * check-gospel-engine-contract.mjs — the map must use the engine it was ASKED for, or say nothing * at all. Never a different one. * - * THE DEFECT THIS IS WRITTEN AGAINST (regions' C3 read + upg100's addendum, 2026-09-26). + * THE DEFECT THIS IS WRITTEN AGAINST (the C3 review and its addendum, 2026-09-26). * resources-map resolved its engine as `engineGlobal(provider) || window.mapboxgl`. engineGlobal * already defaults to mapbox, so that fallback could only fire for provider 'maplibre' — and then * it returned MAPBOX. A page that chose the keyless engine silently got the one that needs a diff --git a/internal/check-gospel-english-leaks.mjs b/internal/check-gospel-english-leaks.mjs index 06428bf12..96b9a3eb2 100644 --- a/internal/check-gospel-english-leaks.mjs +++ b/internal/check-gospel-english-leaks.mjs @@ -1,7 +1,7 @@ /** * check-gospel-english-leaks.mjs — a translated key must not render in English. * - * THE METHOD, from rega by way of dx-shepherd. A string is a LEAK when the catalogue has a + * THE METHOD, taken from the browser review. A string is a LEAK when the catalogue has a * DIFFERENT value for the locale and the page still shows the English one. That is a render * or wiring fault, and it is a different thing from an untranslated string, which is a * catalogue gap. Only the first is this check's business. @@ -75,7 +75,7 @@ try { /* ═══ WHOLE LABELS, NOT SUBSTRINGS — the third correction, and the last ═══════════ * Substring matching over the rendered blob reported keys that were never rendered at * all: "Language" matched inside the DATA — the people-group language "Sign Language" — - * and "Region" inside a region name. Those are exactly the data strings rega's method + * and "Region" inside a region name. Those are exactly the data strings the method * excludes, and no amount of length filtering separates a label from a word that * happens to sit inside one. * So the unit is an ELEMENT'S OWN LABEL: the trimmed text a leaf element renders. A diff --git a/internal/check-gospel-rtl-shaping.mjs b/internal/check-gospel-rtl-shaping.mjs index 302360830..5b5c08c00 100644 --- a/internal/check-gospel-rtl-shaping.mjs +++ b/internal/check-gospel-rtl-shaping.mjs @@ -39,7 +39,7 @@ import { fileURLToPath } from 'node:url' const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..') const PORT = Number(process.env.RTL_SHAPE_PORT || 5393) const POISON = process.argv.includes('--poison') -// ⚠ PARAMETERISED, not forked. dx-shepherd routed this gate to the other RAW-map owners +// ⚠ PARAMETERISED, not forked. This gate was routed to the other RAW-map owners // (cities-internet, key-cities, upg-100-list, RegionCountryMap) — copying it would give each of // them their own drifting copy of the pan-first logic and the poison arm, which are the two parts // that took corrections to get right. The leaf is the only thing that differs. diff --git a/internal/check-gospel-set-fit.mjs b/internal/check-gospel-set-fit.mjs index 733b07cbc..a9a58c6ae 100644 --- a/internal/check-gospel-set-fit.mjs +++ b/internal/check-gospel-set-fit.mjs @@ -6,7 +6,7 @@ * to zoom out past the point where ONE WORLD fills the canvas WIDTH. That puts a hard floor under the * zoom at log2(canvasWidth/512) — and on a WIDE, SHORT figure that floor is too close for the * drawing's own height, so the outermost groups fall outside the frame. minZoom does not help; the - * width constraint wins. rega measured it at 1440: 54 groups outside in ar and 97 in en, which is + * width constraint wins. A browser check measured it at 1440: 54 groups outside in ar and 97 in en, which is * what proved it was the WIDTH and never RTL. * * WHAT IT ASSERTS. For every layout the charts actually get, the drawing's vertical extent at the @@ -45,11 +45,11 @@ export function neededHeightPx(extent, fraction, canvasWidth) { return worldFraction * 512 * Math.pow(2, floorZoom(canvasWidth)) } -// The canvases the charts are actually given: rega's measured figures at 1440 and 1280, the embed +// The canvases the charts are actually given: the measured figures at 1440 and 1280, the embed // card, and two narrow ones so a phone cannot regress unnoticed. const LAYOUTS = [ - { name: '1440 board (rega measured)', w: 796, h: 249 }, - { name: '1280 board (rega measured)', w: 636, h: 220 }, + { name: '1440 board (measured)', w: 796, h: 249 }, + { name: '1280 board (measured)', w: 636, h: 220 }, { name: 'embed card', w: 1198, h: 560 }, { name: 'tablet', w: 380, h: 300 }, { name: 'phone', w: 340, h: 240 }, @@ -77,13 +77,13 @@ for (const chart of CHARTS) { } // ★ NEGATIVE CONTROL. The 0.17 default is the value that was measured FAILING on the page, so if -// this arm does not fail the calculation is not measuring what rega measured and a pass means +// this arm does not fail the calculation is not measuring what the browser measured and a pass means // nothing. Asserted on the tightest real layout. const poison = neededHeightPx(CENTERED_EXTENT, 0.17, 796) ok( 'NEG CONTROL: the old 0.17 fraction still does NOT fit 796x249', poison > 249 - 2 * FIT_PADDING, - `0.17 needs ${poison.toFixed(0)}px of ${249 - 2 * FIT_PADDING}px — the defect rega measured`, + `0.17 needs ${poison.toFixed(0)}px of ${249 - 2 * FIT_PADDING}px — the measured defect`, ) // The two charts must share one footprint, or the same population reads as a different size when a diff --git a/internal/check-grid-image-loading.mjs b/internal/check-grid-image-loading.mjs index 24158d752..e7f4c8b86 100644 --- a/internal/check-grid-image-loading.mjs +++ b/internal/check-grid-image-loading.mjs @@ -2,13 +2,13 @@ /** * check-grid-image-loading — the people-group cards must not fetch 24 photos during boot. * - * THE MEASUREMENT (rega, SR-LOAD on 21ebb4f26): a cold load of Simple Research downloaded 24 + * THE MEASUREMENT (SR-LOAD on 21ebb4f26): a cold load of Simple Research downloaded 24 * people-group photos, 5.3 MB, DURING BOOT — competing with the map engine and the API data on the * same connection. Nothing was wrong with any single image; there was simply no instruction about * WHEN to fetch them, so the browser fetched them all at once. * * ★ WHY A GATE AND NOT JUST THE FIX. This component is being MERGED with the regions list right now - * (a settled decision, regions-plugin building it), and a merge rewrites markup. Four attributes on + * (a settled decision, built by the regions plugin), and a merge rewrites markup. Four attributes on * one are exactly the kind of thing that survives a review and not a rewrite — and losing them * is invisible: the page still works, it just costs 5.3 MB again on every cold load. * @@ -36,7 +36,7 @@ if (!m) { const tag = m[0] if (!/:loading=/.test(tag)) { fails.push('the card image has no loading attribute, so every photo is fetched during boot — ' - + 'rega measured 24 of them, 5.3 MB, competing with the map and the API data.') + + 'a cold load measured 24 of them, 5.3 MB, competing with the map and the API data.') } if (!/decoding="async"/.test(tag)) fails.push('the card image does not decode off the main thread (decoding="async").') if (!/\bwidth=/.test(tag) || !/\bheight=/.test(tag)) { diff --git a/internal/check-hardcoded-english.mjs b/internal/check-hardcoded-english.mjs index 0a1a6b7c5..bb5830c52 100644 --- a/internal/check-hardcoded-english.mjs +++ b/internal/check-hardcoded-english.mjs @@ -24,8 +24,8 @@ * by whether the lookup it guards actually works. `msg !== 'messages.engineMissing' ? msg : 'English'` * is treated as a fallback — but if the key is looked up with the wrong prefix, the lookup ALWAYS * misses and the English arm becomes the NORMAL path, in every locale, while this gate stays quiet. - * That is exactly what exp-shepherd found in cities-internet after I triaged the same line as "not a - * leak". A hardcoded-English scan cannot see a misconfigured lookup; check:i18n-keys-exist and a + * That is exactly what a later review found in cities-internet after the same line had been triaged as + * "not a leak". A hardcoded-English scan cannot see a misconfigured lookup; check:i18n-keys-exist and a * locale render are what catch that. Treat a guarded fallback as "not a leak HERE", never as "this * string is not reaching users". * @@ -59,7 +59,7 @@ const ALLOW = [ { why: 'HTML fragments: these plugins build popup markup in template literals, so a quasi is often ' + 'a tag, or the seam between two attributes ("\" alt=\"" / "\" loading=\"lazy\">")', test: (s) => /<\/?[a-zA-Z][^>]*>?/.test(s) - // dir and lang join the list (exp, END-EXP-SR-DIRLANG): `'" dir="'` is the seam between two + // dir and lang join the list (SR-DIRLANG): `'" dir="'` is the seam between two // attributes in a print page assembled by concatenation, and every RTL-aware page writes both. // They are the same class as class= and href= — attribute NAMES, not text a reader sees. || /\b(class|href|src|alt|loading|width|height|style|id|target|rel|dir|lang)\s*=/.test(s) @@ -91,7 +91,7 @@ const ALLOW = [ test: (s) => /^[a-z-]+\($/.test(s) || /^[,)\s]*[a-z-]+\([^)]*\)[,)\s]*$/.test(s) || /^[,)\s]+$/.test(s) }, - // ★ DECLARATION SEAMS, the other half of the same split (exp, I18N-EXP-PLAN). Splitting + // ★ DECLARATION SEAMS, the other half of the same split (I18N-EXP-PLAN). Splitting // `width:${w}px;height:${h}px` leaves the quasi "px;height:" — a seam BETWEEN two declarations, // carrying the tail of one value and the head of the next property. It has a colon but no value // and no brace, so every CSS shape above misses it. exp measured these as false leaks in @@ -351,7 +351,7 @@ function isDataComparison(node, parent) { // resource not found means NOT FOUND in the pools checked" is a sentence that happens to be used as // a key, and that is a real leak — gospel found twelve defects hiding in exactly that kind of // already-classified bucket. Anything with sentence punctuation stays loud whatever its value is. -// ★ REGION IDENTITIES, EXEMPT ONLY WHILE THEY ARE TRANSLATABLE (studio's judgement, R26). +// ★ REGION IDENTITIES, EXEMPT ONLY WHILE THEY ARE TRANSLATABLE (R26). // legend-tree's REGION_OF maps a zone slug to a region NAME, and that name is an identity: node ids // derive from it, and every surface that shows one translates it at render through REGION_KEY — // upg-100-list.vue:440 `REGION_KEY[english] ? t(\`poster.${…}\`) : english`, poster-wall.vue:129 the @@ -1009,7 +1009,7 @@ const RENDERED = { africa: 'A sentence the reader actually sees here', asia: 'An // names, values that are prose a reader sees: the keys must STILL count, because this is a // label table, not a join table. Without this case the allData guard can be removed and every // test still passes — measured by poisoning it. - // ★ REGION IDENTITIES (studio, R26): exempt ONLY while REGION_KEY names them. A region added + // ★ REGION IDENTITIES (R26): exempt ONLY while REGION_KEY names them. A region added // without a key falls through `|| english` and renders English in eleven locales — the defect // upg100 already shipped once with Americas and Europe. The conditional IS the rule. { @@ -1068,7 +1068,7 @@ const a = greeting + 'Welcome to the prayer map' ` ok(scanSfc(CAT, 'concat.vue').some((f) => f.text === 'Welcome to the prayer map'), 'COUNTS a sentence built by CONCATENATION — only an equality test means "compared against data"') - // ★ exp's CSS DECLARATION SEAMS (I18N-EXP-PLAN), tested on the SHAPE rather than through a fixture. + // ★ CSS DECLARATION SEAMS (I18N-EXP-PLAN), tested on the SHAPE rather than through a fixture. // A seam like "px;height:" only exists as a separate string if a quasi is judged alone, and this // gate deliberately judges a split template literal as ONE string — so a .vue fixture can never // produce one, and an assertion written that way passes whether or not the rule exists. I wrote @@ -1081,7 +1081,7 @@ const a = greeting + 'Welcome to the prayer map' 'prose ending in a colon is NOT — the seam shape needs a semicolon-separated declaration') ok(!allowedBy('Pools checked; nothing found:'), 'prose with a semicolon AND a colon is NOT — the segments must be property:value pairs') - // ★ exp's HTML ATTRIBUTE SEAM (END-EXP-SR-DIRLANG). `''` + // ★ HTML ATTRIBUTE SEAM (SR-DIRLANG). `''` // leaves the quasi `" dir="`, an attribute seam rather than a declaration seam. dir and lang were // the only standard attributes missing from the HTML shape. Asserted on the shape for the same // reason as the CSS seam: the gate judges a split literal as ONE string, so no fixture reaches it. diff --git a/internal/check-instance-config-keys.mjs b/internal/check-instance-config-keys.mjs index 90e280dfd..18c7639c3 100644 --- a/internal/check-instance-config-keys.mjs +++ b/internal/check-instance-config-keys.mjs @@ -1,7 +1,7 @@ /** * check-instance-config-keys.mjs — a preset's profile-config keys must be keys the profile READS. * - * ★ THE DEFECT (rega RQ20): people-groups-grid's "driven" preset declares "show-search":"false" and + * ★ THE DEFECT (RQ20): people-groups-grid's "driven" preset declares "show-search":"false" and * "show-filters":"false", and the page renders the search box and the filters bar anyway. Nothing * errored — 0 console errors — because nothing was wrong at runtime. The key simply never reached * the component: diff --git a/internal/check-leaf-engine-per-provider.mjs b/internal/check-leaf-engine-per-provider.mjs index 3fb82dbb9..ed9dde948 100644 --- a/internal/check-leaf-engine-per-provider.mjs +++ b/internal/check-leaf-engine-per-provider.mjs @@ -2,7 +2,7 @@ /** * check-leaf-engine-per-provider — a leaf loads the engine its PROVIDER asks for, and no other. * - * THE BUG (card BUG-LEAF-PAGES-PRELOAD-MAPBOX-EVEN-UNDER-MAPLIBRE; measured by exp-shepherd at + * THE BUG (card BUG-LEAF-PAGES-PRELOAD-MAPBOX-EVEN-UNDER-MAPLIBRE; measured at * 577149af). generate-tree chose a leaf's engine peer at BUILD time, from the instance config, and * baked it into as static tags: mapbox-gl.css, the geocoder css, mapbox-gl.js and the geocoder * js, all from api.mapbox.com. The provider is chosen at RUNTIME (resolveMapProvider: diff --git a/internal/check-leaf-english-leaks.mjs b/internal/check-leaf-english-leaks.mjs index 527215966..0b2b6ab62 100644 --- a/internal/check-leaf-english-leaks.mjs +++ b/internal/check-leaf-english-leaks.mjs @@ -2,7 +2,7 @@ /** * check-leaf-english-leaks — a translated key must not render in English, on ANY leaf. * - * THE METHOD is rega's, by way of dx-shepherd, and is already proven in + * THE METHOD comes from the browser review and is already proven in * check-gospel-english-leaks.mjs. A string is a LEAK when the catalogue has a DIFFERENT value * for the locale and the page still shows the English one. That is a render or wiring fault, * and it is a different thing from an untranslated string, which is a catalogue gap. @@ -145,7 +145,7 @@ for (const t of TARGETS) { // {value:'unengaged', label:'Unengaged'}, 2 distinct values, 100% populated, and // dashboard.config.js:132 counts 2,081 Unengaged / 27 Engaged. They are API VALUES // that happen to equal a catalogue string. - // That is the population rega's method excludes by name ("DATA, the people-group and + // That is the population the method excludes by name ("DATA, the people-group and // place names that come from the publishers"). Whole-label matching stops a substring // impersonating a label; it cannot stop a DATA CELL rendering the same text. So the // table body is excluded by ROLE, the way prose already is. diff --git a/internal/check-legend-data-contract.mjs b/internal/check-legend-data-contract.mjs index c17822cb3..21eb505cd 100644 --- a/internal/check-legend-data-contract.mjs +++ b/internal/check-legend-data-contract.mjs @@ -7,7 +7,7 @@ * fmtCount }. There is no `rows`. Two plugins independently read `legend.rows` anyway, and because * JavaScript answers `undefined` rather than complaining, each failure wore a different costume: * - * - countries-map: Export poster THREW (exp-shepherd's NE-17, fixed in d6916e05e) + * - countries-map: Export poster THREW (NE-17, fixed in d6916e05e) * - research-map: provide('legendRows', legend.rows) provided undefined; the poster fallback * `legend?.rows?.value || []` could only ever be []; and the packet's legend slot was * `rows: legend?.rows?.value || []` with no second source, so that poster printed NO legend at diff --git a/internal/check-legend-logical-insets.mjs b/internal/check-legend-logical-insets.mjs index b365b4484..d8c1cfdf4 100644 --- a/internal/check-legend-logical-insets.mjs +++ b/internal/check-legend-logical-insets.mjs @@ -5,7 +5,7 @@ * WHY: the shared legend (.stl-panel, its reopen button, the detail buttons, the tree-guide hairlines) used * `left: 8px`. MapToolbar uses `inset-inline-end`, which mirrors under dir="rtl"; a physical `left` does not. * So in Arabic the controls moved left onto a legend that stayed left, on three production maps at once - * (Simple Research, Prayer Progress, UPG-100; rega's survey at 52eeb0db). The fix is inset-inline-start / + * (Simple Research, Prayer Progress, UPG-100; a browser survey at 52eeb0db). The fix is inset-inline-start / * inset-inline-end; this gate keeps a physical left/right from coming back. * * WHAT IT READS: every CSS declaration in library/components/legends/*.vue (comments stripped). A diff --git a/internal/check-legend-top-offset.mjs b/internal/check-legend-top-offset.mjs index 42140d365..8c93c48c1 100644 --- a/internal/check-legend-top-offset.mjs +++ b/internal/check-legend-top-offset.mjs @@ -12,7 +12,7 @@ * * ★ BUT showsFlyTools() DESCRIBES THE LEGEND TYPE, NOT WHETHER THE TOOLBAR EXISTS. Fly + Clusters are * leaf-only: the composite — which is what a reader calls "Simple Research" — passes legendTools:false, - * so the toolbar is never drawn there and the 56px reserved a slot for nothing. rega measured it at + * so the toolbar is never drawn there and the 56px reserved a slot for nothing. A browser check measured it at * 1440x900 on main e1d0bc20: the band from the map's top edge (y 44) to the legend card (y 100) is 56px * of empty map on both tabs, no toolbar anywhere in the strip. * diff --git a/internal/check-list-selection.mjs b/internal/check-list-selection.mjs index e3514afc1..390a2b170 100644 --- a/internal/check-list-selection.mjs +++ b/internal/check-list-selection.mjs @@ -44,11 +44,11 @@ const MISSING = [ 'asia-china-xinjiang-uyghur-autonomous-region', 'asia-india-bihar', ] -// asia-india-madhya-pradesh WAS here and is now FILED. upg100 hit this arm while filing it, and -// did the right thing with it: they reported the red instead of editing my expectation to make -// their change green — "editing someone else's pinned expectation to make my own change green is -// precisely the move that hollows out a guard". dx-shepherd then ruled that their data and this -// fixture land TOGETHER, which is the only ordering where neither of us is red in between. +// asia-india-madhya-pradesh WAS here and is now FILED. The filing change hit this arm, and the +// red was reported instead of the pinned expectation being edited to turn the change green: editing +// another owner's pinned expectation to make one's own change green is precisely the move that hollows +// out a guard. The data and this fixture landed TOGETHER, the only ordering where neither side is red +// in between. ok(leavesOf(TREE[0]).map((l) => l.id).join(',') === 'z1,z2,z3', 'leavesOf walks NESTED children, not one level') @@ -85,7 +85,7 @@ const naive = TREE // what a region-grouped tree gives you, unaugmented ok(!zoneIdsIn(naive).has('asia-china-xinjiang-uyghur-autonomous-region'), 'NEG CONTROL: the unaugmented tree really does omit xinjiang, so the bucket is not decoration') -// ── a region sweep is NOT a zone sweep (gospel, END-GOS-VLG2) ─────────────────────────────────── +// ── a region sweep is NOT a zone sweep (gospel-resources) ─────────────────────────────────── // ★ The consequence of the bucket that neither of us should leave implicit: ticking every REGION // still does not select every ZONE, because the unfiled zones have no region BY DEFINITION. // Nothing on screen would say so — the reader just gets a smaller total, which is the exact @@ -113,7 +113,7 @@ ok(selectedId(leavesOf(EMPTYZONE[0])[0]) === 'z9', 'and it still emits its own i ok(withUnassigned(EMPTYZONE, ['z9']).length === EMPTYZONE.length, 'presence is by ID, not by member count, so an unresolvable zone is not ALSO dumped in the bucket') -// ── the gap is REAL TODAY, not just real in my fixture (gospel, END-GOS-VLG3) ─────────────────── +// ── the gap is REAL TODAY, not just real in a fixture (gospel-resources) ─────────────────── // ★ EVERY ASSERTION ABOVE RUNS AGAINST A FIXTURE. That proves the MODULE behaves, and it proves the // fixture models a gap — it does not prove the gap still exists in the data we ship. So the negative // control above could stay green forever while the bucket quietly became dead code, or while a FIFTH @@ -148,7 +148,7 @@ ok(realGap.join(',') === MISSING.join(','), realGap.join(',') === MISSING.join(',') ? 'and it is exactly the four this check names, so the fixture above models the shipped data rather than a story about it' : `THE GAP MOVED — re-derive. shipped now: [${realGap.join(', ')}] but this check asserts: [${MISSING.join(', ')}]. A zone ADDED here is groups that just became unreachable; a zone REMOVED got filed and the fixture is stale. Either way the numbers in the commit body are no longer true.`) -// ── the zones that got FILED stay filed (dx-shepherd RG12) ───────────────────────────────────── +// ── the zones that got FILED stay filed (RG12) ───────────────────────────────────── // The gap arms watch the BAD direction. Filing is the good one, and it is exactly as revertible: // drop a key from zone-regions and those groups leave the region tree again, silently, with the // bucket the only thing still carrying them. Two of these three were never visible to the gap arms @@ -163,7 +163,7 @@ for (const z of FILED) { ok(joinable.has('asia-china-xinjiang-uyghur-autonomous-region') && !filed.has('asia-china-xinjiang-uyghur-autonomous-region'), 'xinjiang specifically: joinable in admin-to-list, absent from zone-regions — its 100 groups are reachable ONLY through the bucket') -// ── the id ambiguity that is masked by a data coincidence (gospel, END-GOS-VLGC) ──────────────── +// ── the id ambiguity that is masked by a data coincidence (gospel-resources) ──────────────── // ★ REGION IDS AND ZONE IDS SHARE ONE NAMESPACE. selectedId emits one bare string with no kind, and // the two sets OVERLAP in the shipped data. gospel found it while wiring and I re-measured it here // rather than taking the report: 33 zone ids, 7 region ids, intersection exactly {europe}, whose diff --git a/internal/check-map-attribution.mjs b/internal/check-map-attribution.mjs index 285817f5f..4d8c15335 100644 --- a/internal/check-map-attribution.mjs +++ b/internal/check-map-attribution.mjs @@ -2,7 +2,7 @@ /** * check-map-attribution — the credit line names the basemap of the engine that actually drew the map. * - * WHY (licence credit, rega's row 28 at ccc2b1bb): addMapAttribution always credited "Mapbox · + * WHY (licence credit, row 28 at ccc2b1bb): addMapAttribution always credited "Mapbox · * © OpenStreetMap". Under MapLibre the tiles are OpenFreeMap's (OpenMapTiles on OpenStreetMap), so * gospel-resources, key-cities and cities-internet credited Mapbox, which served nothing, and omitted * the OpenMapTiles credit. Headless: the real module against stand-in map classes and a minimal DOM. diff --git a/internal/check-map-unmount-guard.mjs b/internal/check-map-unmount-guard.mjs index f5e6a9fa7..d8d8c95f4 100644 --- a/internal/check-map-unmount-guard.mjs +++ b/internal/check-map-unmount-guard.mjs @@ -1,4 +1,4 @@ -/* check-map-unmount-guard — the fast, browser-free half of the unmount-race proof (by gospel-plugin, +/* check-map-unmount-guard — the fast, browser-free half of the unmount-race proof (by the gospel-resources owner, adopted into internal/ by the studio lane; the end-to-end half is check-map-unmount-mid-init.mjs). Proves the guard by REPRODUCING the race against the real file: take the shipped source, diff --git a/internal/check-mobile-gating.mjs b/internal/check-mobile-gating.mjs index d3a52acfe..cdbbf5ac1 100644 --- a/internal/check-mobile-gating.mjs +++ b/internal/check-mobile-gating.mjs @@ -17,7 +17,7 @@ * (f) ProfileLoader stops mounting the notice, or the rule stops staying quiet inside the Gallery; * (g) a flagged profile's element is mounted by neither ProfileLoader nor its own useScreenGate — * dashboard-plus-grid defines its element without ProfileLoader, so its leaf carried - * "desktop-only" and mounted the map on a phone anyway (rega, 390px). + * "desktop-only" and mounted the map on a phone anyway (measured at 390px). * `--self-test` plants one bad case per rule and proves each can fail before a pass is trusted. */ import { readFileSync, existsSync, readdirSync } from 'node:fs' diff --git a/internal/check-no-credentials-omit.mjs b/internal/check-no-credentials-omit.mjs index e71ef1d7d..c69226460 100644 --- a/internal/check-no-credentials-omit.mjs +++ b/internal/check-no-credentials-omit.mjs @@ -2,7 +2,7 @@ /** * check-no-credentials-omit.mjs — no data fetch in library/ or plugin-designs/ may use credentials:'omit'. * - * WHY (dx-shepherd, 2026-09-27): behind any login gate (basic auth, a session cookie, OIDC) the Research + * WHY (2026-09-27): behind any login gate (basic auth, a session cookie, OIDC) the Research * Gallery said "Could not load Big Picture", because doxa-maps-spa fetched its SAME-ORIGIN manifest with * credentials:'omit', so the gate's cookie never went and the request was refused. 'same-origin' (the fetch * default) sends credentials only to the page's own origin: a cross-origin CDN or token service still diff --git a/internal/check-no-silent-engine-substitution.mjs b/internal/check-no-silent-engine-substitution.mjs index 9bdc45a99..c790343da 100644 --- a/internal/check-no-silent-engine-substitution.mjs +++ b/internal/check-no-silent-engine-substitution.mjs @@ -3,7 +3,7 @@ * check-no-silent-engine-substitution — a profile must never fall back to a DIFFERENT map engine than * the one its provider asked for. * - * THE DEFECT, found by regions' C3 read and routed by dx-shepherd (END-SHEP-C3C, 2026-09-26): + * THE DEFECT, found by the C3 review (2026-09-26): * * const gl = engineGlobal(provider) || window.mapboxgl * @@ -72,7 +72,7 @@ function scan(text) { // documented what they removed in a /* */ block whose second line begins with a BACKTICK: // `engineGlobal(grProvider) || window.mapboxgl`. engineGlobal already defaults to mapbox, so // The prefix test saw no comment marker, matched the quoted pattern, and reported gospel as the last - // remaining offender at main 9df086e5. I relayed that to dx-shepherd as fact and it was wrong: the + // remaining offender at main 9df086e5. That was relayed as fact and it was wrong: the // line number had also moved three times (1490 -> 1505 -> 1509) purely because their file grew, which // is what made a stale card look like a live defect. // ★ A GATE THAT FAILS ON THE EXPLANATION OF A FIX IS WORSE THAN NO GATE. It tells the one person who diff --git a/internal/check-one-scroll-container.mjs b/internal/check-one-scroll-container.mjs index 47a75dd77..8aa4c0214 100644 --- a/internal/check-one-scroll-container.mjs +++ b/internal/check-one-scroll-container.mjs @@ -21,7 +21,7 @@ * (2) is the half that matters over time: a fixed shell plus a plugin that adds .foo{min-height:700px} * next month is the same bug again, and nobody would connect it to this. * - * Source-level and headless BY DESIGN. Only rega runs a browser here, and the browser proof is rega's + * Source-level and headless BY DESIGN. This gate runs no browser, and the browser proof is a separate * scroll-container count. This is the cheap guard that keeps the class from coming back between runs. * ★ THIS GATE IS RED ON PURPOSE AT LANDING, and is NOT wired into gates:pre yet. gospel-internet's * .gb still carries min-height:640px; that fix belongs to its owner, not to me, and wiring a red gate @@ -103,7 +103,7 @@ for (const bundle of readdirSync(DESIGNS)) { // // ★ THIS IS GATED BECAUSE IT WAS ALREADY PORTED ONCE AND ARRIVED SHORT. doxa-maps-spa's .dms-pane was // copied from VerticalTabsLayout's .vtl-host -- its own comment says "porting the same proven shape" -- -// and took the first two lines. rega measured the result: 12 of 16 gallery tabs overflowing by exactly +// and took the first two lines. A browser check measured the result: 12 of 16 gallery tabs overflowing by exactly // the DX-life header height, on plugins with no floor of their own. Two thirds of a fix reads as a // whole one in review, which is precisely why a reviewer cannot be the check. for (const [file, label] of [ diff --git a/internal/check-optional-t-equivalence.mjs b/internal/check-optional-t-equivalence.mjs index 46b09f5e6..5780922c8 100644 --- a/internal/check-optional-t-equivalence.mjs +++ b/internal/check-optional-t-equivalence.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /* check-optional-t-equivalence.mjs — `bun run check:optional-t-equivalence`. Source-only, headless. - EVERY LATER C4 WAVE EXTENDS THIS FILE (dx-shepherd, REGC4G): a wave that migrates a site without + EVERY LATER C4 WAVE EXTENDS THIS FILE (REGC4G): a wave that migrates a site without adding its row here is a wave whose behaviour nobody re-checks. Sections 1-6 are the helper's own contract; section 7 is the per-site register. */ // C4: does useOptionalT() behave like the twenty hand-written guarded translators it replaces? @@ -122,11 +122,11 @@ const SITES = [ ['library/components/hints/PinHint.vue', 'useOptionalI18n', 'PINHINT_FALLBACK[key]'], ['plugin-designs/pplr-data-maps/src/composables/usePplrT.js', 'useOptionalT', null], ['plugin-designs/upg-neighbor/src/composables/useNeighborT.js', 'useOptionalT', null], - // wave 3a — gospel-resources (owner: gospel-plugin). All four fell back to enLookup, i.e. the + // wave 3a — gospel-resources. All four fell back to enLookup, i.e. the // SHIPPED ENGLISH, not the locale-aware catalogue; each passes that enLookup in, so a bare host // still renders English. Switching them to the catalogue default would make a bare host honour - // ?lang=ar — a real improvement, and gospel-plugin's to make, not this migration's. - // ★ gospel-plugin CHOSE the locale-honouring catalogue fallback (2026-09-26) rather than keeping + // ?lang=ar — a real improvement, and its owner's to make, not this migration's. + // ★ gospel-resources' owner CHOSE the locale-honouring catalogue fallback (2026-09-26) rather than keeping // enLookup's English: "most partners will drop a custom element or an iframe and never install // vue-i18n ... an Arabic ministry site embedding this map serves its readers English while the // bundle already carries all 11 catalogues. That is a bug, not a decision." So these four take NO @@ -143,13 +143,13 @@ const SITES = [ // wave 3b — cities-internet. All three were byte-identical in the guard block; each keeps its own // enLookup fallback, so a bare host renders the same English. Their local fill() used `k in params`, // so the shared fillParams also removes a way for them to print the literal "null". - // ★ exp-shepherd, as cities-internet's owner, took the locale-honouring default (2026-09-26): "the - // bundle already carries all 11 catalogues, so a bare host getting English would be a bug". So these + // ★ cities-internet's owner took the locale-honouring default (2026-09-26): the bundle already + // carries all 11 catalogues, so a bare host getting English would be a bug. So these // three pass NO fallback, and their English-only enLookup + per-area catalogue import are deleted. ['plugin-designs/cities-internet/connectivity-list.vue', 'useOptionalT', null], ['plugin-designs/cities-internet/connectivity-map.vue', 'useOptionalT', null], ['plugin-designs/cities-internet/data-tables.vue', 'useOptionalT', null], - // wave 3d — all-people-groups. Treated as UNOWNED (studio agreed), so the conservative reading wins: + // wave 3d — all-people-groups. Treated as UNOWNED, so the conservative reading wins: // its inline EN map stays the fallback rather than switching to the catalogue, because nobody is // available to decide that this bundle should start honouring the locale on a bare host -- THEN // the locale-honouring fallback was RULED for everywhere (2026-09-27; the goal: a bare-host @@ -162,11 +162,11 @@ const SITES = [ // the inline EN map. Taking a SITES array wholesale from another branch re-asserts ITS view of every // file in it, including the ones you changed; the gate caught it, which is the only reason it is right. ['plugin-designs/all-people-groups/all-people-groups.vue', 'useOptionalI18n', null], - // wave 3c — my-upg-100-list (owner: upg100-plugin). No namespace, since callers pass full keys. + // wave 3c — my-upg-100-list. No namespace, since callers pass full keys. // ⚠ THE THIRD COLUMN IS null, NOT 'humanizeKey(k)', and that is a DEPARTURE from 4c05e589, which - // kept the fallback. Correct as regions-plugin wrote it; wrong the moment dx-shepherd took the + // kept the fallback. Correct as first written; wrong the moment the owner took the // product call (UPGHK, 2026-09-27) to delete it. A row asserting a fallback the code no longer - // passes fails by design — the same hole regions flagged to me in the opposite direction. + // passes fails by design — the same hole flagged earlier in the opposite direction. // ★ WHY IT WAS DELETED. humanizeKey rendered a key's last segment title-cased, failing two ways: on // the messages keys it printed "Upg100 Wall Intro" where a whole sentence exists (wrong even in // English), and on the tabs keys it printed the RIGHT English by coincidence — those keys are named @@ -175,7 +175,7 @@ const SITES = [ // someone changes locale. // The premise for keeping it ("these keys are not fully catalogued") was MINE and was FALSE: seven // keys across both files, all string literals, every one present in all eleven locales, 0 gaps. - // Same class of decision gospel-plugin took for its four sites above, and the OPPOSITE of the 3d + // Same class of decision gospel-resources' owner took for its four sites above, and the OPPOSITE of the 3d // reading directly above — which is right, because that file is unowned and these two are not. ['plugin-designs/my-upg-100-list/poster-wall.vue', 'useOptionalT', null], ['plugin-designs/my-upg-100-list/upg-100-mfe.vue', 'useOptionalT', null], @@ -188,11 +188,11 @@ const SITES = [ // third bare call — a new unguarded translator — still fails this gate. // ★ DELIBERATELY NOT IN THIS REGISTER, so nobody "completes" C4 by converting it: // plugin-designs/pplr-data-maps/src/components/SemanticTreeLegend.vue -// It still hand-rolls the guard, and exp-shepherd asked for it to stay that way: the file is carded for +// It still hand-rolls the guard, and its owner asked for it to stay that way: the file is carded for // retirement (RETIRE-PPLR-SEMANTICTREELEGEND) in favour of the library component, so converting it is // work that gets thrown away. A migration whose value expires before it lands is not worth the diff. // Two more sites are their owners' to cut, not absent by oversight: country-posters-mfe.vue -// (exp-shepherd, into its single posters landing) and key-cities/cities-map.vue (exp-shepherd, gated). +// (into its single posters landing) and key-cities/cities-map.vue (gated). const ALLOWED_BARE = { 'plugin-designs/gospel-resources/resources-map.vue': 2 } for (const [file, helper, fallbackFrag] of SITES) { @@ -221,13 +221,13 @@ for (const [file, helper, fallbackFrag] of SITES) { // Which sites were MOVED to the catalogue by a decision, vs which always resolved there. Saying "as it // always did" about a moved file is a false statement inside a gate message, the one place a reader has // no reason to doubt. gospel-resources and cities-internet moved by their owners' decisions, - // my-upg-100-list by dx-shepherd's product call (UPGHK) deleting humanizeKey, and all-people-groups by + // my-upg-100-list by a product call (UPGHK) deleting humanizeKey, and all-people-groups by // the embed-contract ruling (locale-honouring everywhere, 2026-09-27). const MOVED_BY = { - 'gospel-resources': "gospel-plugin moved it here from enLookup's English", - 'cities-internet': "exp-shepherd moved it here from enLookup's English", - 'my-upg-100-list': 'upg100-plugin moved it here from humanizeKey, a title-cased key segment', - 'all-people-groups': "dx-shepherd's embed-contract ruling moved it here from its inline English map", + 'gospel-resources': "its owner moved it here from enLookup's English", + 'cities-internet': "its owner moved it here from enLookup's English", + 'my-upg-100-list': 'its owner moved it here from humanizeKey, a title-cased key segment', + 'all-people-groups': "the embed contract moved it here from its inline English map", } const mover = Object.keys(MOVED_BY).find((d) => file.includes(d)) ok(!/fallback:/.test(code), mover @@ -236,7 +236,7 @@ for (const [file, helper, fallbackFrag] of SITES) { } } -// ── 7b. gospel-plugin's ASKED-FOR ROW, against the REAL catalogue ─────────────────────────────── +// ── 7b. gospel-resources' ASKED-FOR ROW, against the REAL catalogue ─────────────────────────────── // Their words: "a BARE host (no vue-i18n) with ?lang=ar must render pins.approximate in Arabic — not // the key, not gospel.pins.approximate, not English." It covers their conditions 1 and 2 together: a // namespace would corrupt the key, and an EN-only fallback would serve English to an Arabic reader. diff --git a/internal/check-package-json-unique-keys.mjs b/internal/check-package-json-unique-keys.mjs index a9cf62eec..2118f889d 100644 --- a/internal/check-package-json-unique-keys.mjs +++ b/internal/check-package-json-unique-keys.mjs @@ -5,7 +5,7 @@ * WHY: JSON.parse keeps the LAST of two equal keys and says nothing, so a duplicate silently kills the * first entry. "check:religion-label-not-value" sat twice in //scripts, one description dead, while * check:doc-scripts passed (it reads the parsed object, where only one survives). It was a merge artifact: - * the landing tooling unions both sides' package.json additions. Found by regions-plugin; only Bun's parser + * the landing tooling unions both sides' package.json additions. Found during a landing; only Bun's parser * warned, while running something unrelated. * * HOW: a small JSON scanner that tracks every object's keys by position, so it sees what JSON.parse diff --git a/internal/check-packet-charts.mjs b/internal/check-packet-charts.mjs index e96094e73..17b8b7fc7 100644 --- a/internal/check-packet-charts.mjs +++ b/internal/check-packet-charts.mjs @@ -129,7 +129,7 @@ ok(Math.round(per / 100) * 100 === 40200, // it: 32 contiguous cells fill most of row 1 of 52, so the page printed as one solid bar across the // header — the ordinary chart the life grid exists to avoid — and the existing gate asserts only // that the shaded COUNT is between 0 and 5,200, which is equally true of a bar and of a scatter. -// A count cannot distinguish a distribution. rega's eyes caught it; nothing else could have. +// A count cannot distinguish a distribution. A visual review caught it; nothing else could have. const picked = scatterCells(5200, 32, 'upg-100') const spread = scatterSpread(picked, 52) ok(spread.cells === 32, '32 shaded cells are picked, distinct') diff --git a/internal/check-packet-render.mjs b/internal/check-packet-render.mjs index 722832dbd..a4a734752 100644 --- a/internal/check-packet-render.mjs +++ b/internal/check-packet-render.mjs @@ -33,7 +33,7 @@ import { pathToFileURL, fileURLToPath } from 'node:url' import { requirePathInThisCheckout } from './_serves-this-tree.mjs' // ★ --expect-funnel TURNS AN OPTIONAL PAGE INTO A DECLARED REQUIREMENT, and it exists because of a -// real near-miss (regions-plugin, 2026-09-26, reported unprompted). A merge resolved with +// real near-miss (2026-09-26, reported unprompted). A merge resolved with // `git checkout --ours` silently deleted the printPacket call site that supplies the funnel data — // 60 lines — AND EVERY GATE STAYED GREEN. It had to: the funnel page is optional by design // (buildPacket omits it when the arg is null), so a packet with no page 2 is not malformed, just @@ -274,8 +274,8 @@ const r = await page.evaluate(() => { })(), funnelEq: document.querySelectorAll('.funnel-eq').length, funnelSteps: document.querySelectorAll('.funnel-mine').length, - // ★ MEASURED SO THE GATE CAN REPORT WHAT IT ASSERTED. rega: "the gate prints no funnel line, even - // with --expect-funnel ... a reader cannot see WHAT it asserted about page 2." A silent pass is + // ★ MEASURED SO THE GATE CAN REPORT WHAT IT ASSERTED. A review found the gate printed no funnel line, even + // with --expect-funnel, so a reader could not see WHAT it asserted about page 2. A silent pass is // the mirror of a printed-but-unasserted number: the check is real and the evidence is invisible. // ⚠ ZERO POPULATION IS COUNTED ON PURPOSE. The reader's row printed "0 people" in every packet // (Number(null) is 0, so the finite-number guard admitted a deliberate no-data marker). Fixed in @@ -302,10 +302,10 @@ const r = await page.evaluate(() => { .filter((d) => /^0(\.0+)?\s+\D/.test(d.textContent.trim())).length })(), funnelShare: (document.querySelector('.funnel-share')?.textContent || '').trim().slice(0, 80), - // ★ LATIN RUNS ON A NON-LATIN SHEET, which is the one gap rega named and I left open: "the gate - // passed: it counts rows, not the row's language." It asserted the funnel page's STRUCTURE and - // nothing about whether its prose reached the reader's language — my own standing rule turned on - // my own gate. + // ★ LATIN RUNS ON A NON-LATIN SHEET, the one gap a review named and that was left open: the gate + // passed because it counted rows, not the rows' language. It asserted the funnel page's STRUCTURE + // and nothing about whether its prose reached the reader's language, the standing rule turned on + // this gate itself. // // ⚠ IT ONLY WORKS IN A NON-LATIN-SCRIPT LOCALE, and that is why it is worth having rather than // aspiring to a general "is this translated?" test, which is not decidable. On a hi/ar/ru/zh sheet @@ -749,7 +749,7 @@ if (r.lifeSheets) { } } // ⚠ AND THE SHADE MUST BE SCATTERED, NOT STACKED — the assertion that would have caught what three gates -// and a passing suite did not. rega's contact sheet (2026-09-28) showed page 3 reading as ONE SOLID BAR: +// and a passing suite did not. A contact sheet (2026-09-28) showed page 3 reading as ONE SOLID BAR: // 32 contiguous cells fill most of row 1 of 52, so the page said "a big green block" where the // intent is 32 boxes lost in 5,200. Every assertion passed, because they all measured the COUNT. // Half the grid height is a deliberately loose floor: a genuine scatter of even a few cells spans most of @@ -793,7 +793,7 @@ if (r.funnel && !r.funnelSteps) { // ★ AND IF THE CALLER DECLARED IT, ITS ABSENCE IS A FAILURE. See the --expect-funnel note at the top: // a lost call site produces a packet that is CORRECT but missing page 2, which is why nothing caught // a merge deleting one. -// ★ EVERY FUNNEL ROW MUST HAVE A BAR. rega measured the first version: the reader's step had no bar, +// ★ EVERY FUNNEL ROW MUST HAVE A BAR. A browser check measured the first version: the reader's step had no bar, // so the funnel never visibly narrowed to "yours" — a funnel whose final term is not drawn as part of // the funnel fails at the one thing it is for. Rows and bars are counted separately so the next // regression is a mismatch rather than an invisible omission. @@ -805,8 +805,8 @@ if (r.funnel && r.funnelRows !== r.funnelBars) { // because Number(null) is 0 and the renderer's guard tested finiteness rather than PRESENCE. A people // group with no people is not a fact; it is missing data wearing a number's clothes. // ★ AND ON A NON-LATIN SHEET, THE FUNNEL'S PROSE MUST BE IN THE READER'S SCRIPT. See funnelLatinRuns -// above for why this is only meaningful in hi/ar/ru/zh. This is the gap rega named after the ?list= -// render: "the gate passed: it counts rows, not the row's language", and it was right — the English +// above for why this is only meaningful in hi/ar/ru/zh. This is the gap a review named after the ?list= +// render (the gate passed because it counted rows, not the rows' language), and it was right — the English // list label sat among Devanagari and every assertion here was green. // // ⚠ THE ALLOWLIST IS TWO ENTRIES AND BOTH ARE DECISIONS, NOT BOOKMARKS: diff --git a/internal/check-packet-variants.mjs b/internal/check-packet-variants.mjs index 1d4375d1c..87d3db713 100644 --- a/internal/check-packet-variants.mjs +++ b/internal/check-packet-variants.mjs @@ -189,7 +189,7 @@ ok(count(light, /sheet-sets-(bounded|centered)/g) === 0, 'lightweight still carr // "rows close on the bottom margin" one already deleted from check-profile-table. A printed sheet // is simply much taller than gospel's constrained pane, which is why their bug is not ours. // The real protection is the empty-ring filter asserted above (ten rows is the ceiling) plus - // rega's rendered check; a headless budget with 790px of slack would be decoration. + // the rendered browser check; a headless budget with 790px of slack would be decoration. } // An unknown variant must print the FULL packet. A typo that printed a SHORTER packet would look @@ -204,7 +204,7 @@ ok(/printPacketAs[\s\S]{0,600}prints\.printPacket\(/.test(WALL), 'printPacketAs does not call prints.printPacket — the Prayer List caret would print the columnar LIST again, not the packet') ok(/variant/.test(PRINTS.match(/async function printPacket\([^)]*\)/)?.[0] || ''), 'usePosterPrints.printPacket does not accept a variant — the caret\'s choice would be silently dropped') -// printList itself STAYS (dx-shepherd: don't delete it, just stop the button calling it). +// printList itself STAYS (by decision: keep it, just stop the button calling it). ok(/function printList\(/.test(PRINTS) && /printList,/.test(PRINTS), 'printList was removed — it must remain exported for any surface that still wants the columnar list') diff --git a/internal/check-packets-all.mjs b/internal/check-packets-all.mjs index 52f4af07a..6cc0fda48 100644 --- a/internal/check-packets-all.mjs +++ b/internal/check-packets-all.mjs @@ -132,7 +132,7 @@ const gate = join(HERE, 'check-packet-render.mjs') // ★ THE FUNNEL PAGE IS REQUIRED HERE, and this line is the half of the fix that was missing. // check-packet-render gained --expect-funnel after a merge deleted the call site supplying the funnel -// data and every gate stayed green (regions-plugin, 2026-09-26). But a DECLARABLE expectation that +// data and every gate stayed green (2026-09-26). But a DECLARABLE expectation that // nothing declares is not a closed hole — it is an invisible defect traded for a visible obligation. // I said as much to regions and then owed the second half. // diff --git a/internal/check-pane-config-reforward.mjs b/internal/check-pane-config-reforward.mjs index 745ebcb63..82f64da64 100644 --- a/internal/check-pane-config-reforward.mjs +++ b/internal/check-pane-config-reforward.mjs @@ -3,7 +3,7 @@ * check-pane-config-reforward — a composite's panes keep following the outer config for the whole * session, and a locale change never rewrites a filter into a display name. * - * ★ THE BUG THIS GUARDS, measured by rega on development 92ca8b6e6 across FOUR composites + * ★ THE BUG THIS GUARDS, measured on development 92ca8b6e6 across FOUR composites * (regions-mfe, upg-100-mfe, country-posters-mfe, research-map-plus-grid). The outer element's * profile-config reached locale 'ar' by +1.5 s — attribute AND property, same node — while every * NESTED host carried NO locale key at boot and still none at +15 s. Text per composite at +15 s: @@ -15,7 +15,7 @@ * ★ IT RUNS THE SHIPPED HELPER WITH REAL VUE. usePaneConfig is imported, not re-typed, and driven * by real refs through a real watchEffect — the dependency-tracking hole this gate's case 3 covers * (a plain array leaves a LATER entry's getter untracked) is invisible to any test that fakes - * reactivity, and it was found by studio only because their test used real Vue. + * reactivity, and it was found only because a test used real Vue. * * ★ AND IT ASSERTS THE DOM, NOT THE RETURN VALUE. Every case reads the attribute back off the * element, because "the helper decided to write" and "the pane was told" are different claims and @@ -76,7 +76,7 @@ const cfgOf = (el) => { paneConfig.dispose() } -// ── 1b. NO LOCALE KEY AT BOOT IS THE REAL BEFORE-STATE, not a stale one. rega measured the nested +// ── 1b. NO LOCALE KEY AT BOOT IS THE REAL BEFORE-STATE, not a stale one. A browser check measured the nested // hosts carrying no locale key at all, so the first re-forward is absent -> 'ar'. { const outer = ref({ apiBaseUrl: '/api' }) @@ -225,7 +225,7 @@ const cfgOf = (el) => { // gridLanguage() falls back to `linked.language.value || linked.language.label`, and `label` is a // DISPLAY NAME. The grid's valueMatches() compares whole normalised values, so a name fetched in // one language matches no row in another — the failure that took the grid 2,107 -> 0 and read as -// "no results" (rega, 2026-09-26). This asserts the CLASS, not today's instance. +// "no results" (measured 2026-09-26). This asserts the CLASS, not today's instance. { const locale = ref('en') // A language whose display label follows the locale, as the API returns it, but whose code does not. diff --git a/internal/check-pin-selection.mjs b/internal/check-pin-selection.mjs index 2985faec1..5c5dd59a0 100644 --- a/internal/check-pin-selection.mjs +++ b/internal/check-pin-selection.mjs @@ -11,7 +11,7 @@ * this._data = typeof options.data === 'string' ? { url: options.data } : { geojson: options.data } * * so `data.features` was undefined and the reader returned an EMPTY LIST on MapLibre — the keyless - * engine the public builds use. Measured by rega on 2026-09-28: a language-family selection and a + * engine the public builds use. Measured on 2026-09-28: a language-family selection and a * prayer selection both logged "0 pin(s) selected" with the pins plainly on screen. * * ★ THE FAILURE MODE IS WHY A TEST IS THE ONLY GUARD. Every caller is written to NO-OP when it finds no @@ -79,7 +79,7 @@ for (const [label, src] of [['mapbox', { _data: COLLECTION }], ['maplibre', { _d eq('expressions are ANDed', matchesExpression(['all', ['==', ['get', 'uniqueId'], 'a'], ['==', ['get', 'languageFamily'], 'Indo-European']], FEATURES[0].properties), false) // ── PACKETSEL: the prayer count is LIVE, so the packet must read feature-state ────────────────── -// rega, RQ3(b): the packet's "Has Prayer" selection showed 50 of 997 where the legend row said 699. +// RQ3(b): the packet's "Has Prayer" selection showed 50 of 997 where the legend row said 699. // The legend is right. Polling writes each pin's current count with setFeatureState() and // prayer-progress.js:94 colours from ['feature-state','peoplePraying']; the GeoJSON property is // whatever was true at page load. Reading the property selects the wrong people to pray for, which is diff --git a/internal/check-poster-card-fits.mjs b/internal/check-poster-card-fits.mjs index 3f9f08936..98edc6d40 100644 --- a/internal/check-poster-card-fits.mjs +++ b/internal/check-poster-card-fits.mjs @@ -108,9 +108,9 @@ async function measure(width, lang) { await page.waitForTimeout(10000) // ★ HOVER IS INVISIBLE TO A STATIC PROBE, which is exactly how the blue outline stayed - // unbuilt for so long. Repeated reports asked to "restore the blue outline around the poster"; + // unbuilt for so long. A blue outline around the hovered poster was reported missing more than once; // measuring the loaded page found `outline:none` on all 136 framed elements and concluded it had - // never existed — true, and useless, because the affordance being asked for only exists WHILE + // never existed — true, and useless, because the affordance in question only exists WHILE // THE POINTER IS OVER THE CARD. The pointer has to actually move. // // ⚠ AND IT MUST NOT MOVE ANYTHING. The whole rest of this gate asserts where the print row sits. diff --git a/internal/check-poster-layout-optin.mjs b/internal/check-poster-layout-optin.mjs index 8414ad6d8..01408da11 100644 --- a/internal/check-poster-layout-optin.mjs +++ b/internal/check-poster-layout-optin.mjs @@ -3,7 +3,7 @@ * check-poster-layout-optin — the composed poster layout is OPT-IN, and every caller that does not * ask for it gets byte-for-byte what it got before. * - * WHY THE OPT-IN EXISTS (dx-shepherd's ruling, from upg100's check). The renderer used to raster the + * WHY THE OPT-IN EXISTS (a decision that followed upg-100-list's check). The renderer used to raster the * map at FULL PAGE size and composite the title, legend and footer on top of it, so the legend lay * over the map it describes. usePosterLayout had always computed the correct geometry and nothing * consumed it. Fixing that unconditionally would have broken a different product: country-posters diff --git a/internal/check-poster-render-pinned.mjs b/internal/check-poster-render-pinned.mjs index 9f2c0c05b..682ededf2 100644 --- a/internal/check-poster-render-pinned.mjs +++ b/internal/check-poster-render-pinned.mjs @@ -83,7 +83,7 @@ ok(typeof html === 'string' && html.length > 10000 && /): pinned, served as the tree // writes it, and — run as a real classic script — the SAME generator: its sheet is byte-identical to the -// module's for the same inputs. (The