You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Strip leading H1 marker + emoji/whitespace + trailing dashes to detect
199
-
# the bare-boilerplate `# Executive Brief` case.
192
+
# Strip leading H1 marker + emoji/whitespace + trailing dashes to detect bare-boilerplate `# Executive Brief`.
200
193
EB_H1_PLAIN="$(printf '%s'"$EB_H1_LOWER" \
201
194
| sed -E 's/^#[[:space:]]+//' \
202
195
| sed -E 's/<[^>]+>//g' \
@@ -206,11 +199,7 @@ if [ -s "$ANALYSIS_DIR/executive-brief.md" ]; then
206
199
echo"❌ executive-brief.md: H1 is bare boilerplate ('Executive Brief') — write a publishable story-oriented title (actor + active verb + instrument or number)"
207
200
FAIL=1
208
201
fi
209
-
# Date-in-H1 guard (seo-metadata-contract.md §2.1) — title must not
210
-
# contain a literal publication date. Catches ISO YYYY-MM-DD,
211
-
# English day-first ("15 May 2026") + US-order ("May 15, 2026") +
212
-
# Swedish long-form months. Mirrors scripts/agentic/analysis-gate.ts
# scripts/agentic/analysis-gate.ts checkExecutiveBrief; this bash
247
-
# check is a fast pre-flight that compares the raw H1 line against
248
-
# the prior 7 sibling daily folders for the same subfolder.
231
+
# Across-days uniqueness check (Phase 2 dup-card guard); full normalised comparison in analysis-gate.ts.
249
232
EB_DAILY_DIR="$(dirname "$ANALYSIS_DIR")"
250
233
EB_DAILY_ROOT="$(dirname "$EB_DAILY_DIR")"
251
234
EB_CURR_DATE="$(basename "$EB_DAILY_DIR")"
@@ -268,8 +251,7 @@ if [ -s "$ANALYSIS_DIR/executive-brief.md" ]; then
268
251
fi
269
252
fi
270
253
else
271
-
# No H1 at all — the renderer has nothing to seed the SERP <title>
272
-
# from and will silently fall back to a BLUF-sentence fragment.
254
+
# No H1 — renderer has nothing to seed SERP <title> and falls back to a BLUF-sentence fragment.
273
255
echo"❌ executive-brief.md: no '# H1' heading found — the H1 is the SERP <title> source across all 14 languages; add a publishable story-oriented title"
274
256
FAIL=1
275
257
fi
@@ -338,9 +320,8 @@ if [ -s "$ANALYSIS_DIR/coalition-mathematics.md" ]; then
@@ -448,7 +424,7 @@ Same-day re-runs are **improvement runs** (not skip runs) when `03-data-download
448
424
449
425
### Check 12 ordering note
450
426
451
-
Check 12 (`scripts/validate-article.ts`) is the **editorial QA gate**and runs on the aggregated `article.md`. The blocking branch in §Implementation only fires when `article.md` is already on disk; the inline gate runs before aggregation, so on a first pass the article validator is **informational** (the gate logs `ℹ️ Check 12 (editorial QA): … skipped (run after aggregator)`). Workflows MUST re-invoke the gate (or call `npx tsx scripts/validate-article.ts $ANALYSIS_DIR/article.md` directly) **after**`scripts/aggregate-analysis.ts` writes `article.md` so the editorial checks (banned phrases, citation density, `economicProvenance` vintage) become blocking before staging. See `06-article-generation.md §Step 1b — Editorial QA re-check (post-aggregation)` for the post-aggregation invocation pattern.
427
+
Check 12 (`scripts/validate-article.ts`) is the **editorial QA gate** on aggregated `article.md`. The blocking branch in §Implementation only fires when `article.md` is on disk; the inline gate runs before aggregation, so on first pass the validator is **informational** (logs `ℹ️ Check 12 (editorial QA): … skipped (run after aggregator)`). Workflows MUST re-invoke the gate (or call `npx tsx scripts/validate-article.ts $ANALYSIS_DIR/article.md` directly) **after**`scripts/aggregate-analysis.ts` writes `article.md`. See `06-article-generation.md §Step 1b — Editorial QA re-check (post-aggregation)`.
0 commit comments