EU Parliament Monitor โ€” API Documentation - v1.0.6
    Preparing search index...

    Module Aggregator/ArticleMetadata

    Resolve per-language {title, description} for an article rendered by the aggregator pipeline. The resolver follows a strict priority ladder that prefers real editorial highlights over boring, repeated templates โ€” satisfying the core SEO requirement that every published article carry a unique, content-reflective headline and description in every language variant.

    Priority ladder (per language, highest wins) โ€” matches the editorial contract documented in .github/prompts/04-article-generation.md ยง 6.2:

    1. Manifest override โ€” manifest.title / manifest.description on the analysis-run manifest, either as a plain string (applied to every language) or a LanguageMap<string> object for explicit per-language values.
    2. Localized executive brief โ€” for non-English <lang>, the translated sibling executive-brief_<lang>.md (or extended/executive-brief_<lang>.md) under the run directory. Resolved via editorial-brief-resolver.ts. This is the authoritative localized source produced by the news-translate workflow.
    3. English executive brief, verbatim โ€” the English brief (executive-brief.md / extended/executive-brief.md) used as a fall-through when a locale has no translated brief yet.
    4. Artefact editorial H1 โ€” first # โ€ฆ heading from the first substantive artefact under the run directory.
    5. Aggregated-markdown H1 โ€” the first # โ€ฆ heading in the aggregator output, accepted under the same non-generic rule.
    6. First strong prose paragraph โ€” the first line of the aggregated Markdown that survives shouldSkipDescriptionLine.
    7. Localized template โ€” the per-article-type *_TITLES generator from src/constants/language-articles.ts. Last resort.

    --- IMPLEMENTATION NOTE ---

    Following Refactor 6/8 (issue #2034) this file holds the resolver orchestrator (resolveArticleMetadata) plus per-language dispatch (resolveOneLanguage, resolvePerLanguageEditorial) that depend on resolveLocalizedBriefHighlight from editorial-brief-resolver.ts. Pure leaf helpers live in src/aggregator/metadata/:

    • metadata/types.ts โ€” ResolvedMetadata{Entry}, MetadataManifest, ResolveMetadataOptions.
    • metadata/h1-extractor.ts โ€” first-H1 extraction.
    • metadata/lede-extractor.ts โ€” strong-prose + lede-after-heading.
    • metadata/heading-rules.ts โ€” generic/category/lede heading rules.
    • metadata/slug.ts โ€” humanizeSlug.
    • metadata/artifact-highlight.ts โ€” editorial-artefact highlight ladder + priority-finding extractor.
    • metadata/template-fallback.ts โ€” buildTemplateFallback + SEO_CONTEXT_LABELS.
    • metadata/text-utils.ts โ€” truncation + skip filters.
    • metadata/date-labels.ts โ€” week/month/quarter/year/term labels.
    • metadata/resolve-helpers.ts โ€” pure resolver helpers (manifest override, editorial-content, contextual title/description, SEO keywords).

    New code should import directly from the leaf modules. This barrel is preserved for backward compatibility with existing call sites.

    Functions

    resolveArticleMetadata
    shouldSkipDescriptionLineย โ†’ย shouldSkipDescriptionLine
    stripLeadingProseLabelย โ†’ย stripLeadingProseLabel
    stripInlineMarkdownย โ†’ย stripInlineMarkdown
    truncateDescriptionย โ†’ย truncateDescription
    truncateExtendedDescriptionย โ†’ย truncateExtendedDescription
    truncateTitleย โ†’ย truncateTitle
    extractFirstSentenceย โ†’ย extractFirstSentence
    isArtifactCategoryHeadingย โ†’ย isArtifactCategoryHeading
    stripArtifactCategoryAffixย โ†’ย stripArtifactCategoryAffix
    isGenericHeadingย โ†’ย isGenericHeading
    humanizeSlugย โ†’ย humanizeSlug
    extractFirstH1ย โ†’ย extractFirstH1
    extractStrongProseLineย โ†’ย extractStrongProseLine
    extractLedeAfterHeadingย โ†’ย extractLedeAfterHeading
    extractExtendedLedeAfterHeadingย โ†’ย extractExtendedLedeAfterHeading
    extractArtifactHighlightย โ†’ย extractArtifactHighlight
    extractPriorityFindingHighlightย โ†’ย extractPriorityFindingHighlight
    isTranslatedSiblingBriefย โ†’ย isTranslatedSiblingBrief
    buildTemplateFallbackย โ†’ย buildTemplateFallback
    deriveWeekRangeย โ†’ย deriveWeekRange
    deriveReportingWindowForWeekInReviewย โ†’ย deriveReportingWindowForWeekInReview
    deriveMonthLabelย โ†’ย deriveMonthLabel
    deriveQuarterLabelย โ†’ย deriveQuarterLabel
    deriveYearLabelย โ†’ย deriveYearLabel
    deriveTermLabelย โ†’ย deriveTermLabel
    deriveElectionCycleLabelย โ†’ย deriveElectionCycleLabel
    buildSeoKeywordsย โ†’ย buildSeoKeywords

    Interfaces

    MetadataManifestย โ†’ย MetadataManifest
    ResolvedMetadataEntryย โ†’ย ResolvedMetadataEntry
    ResolveMetadataOptionsย โ†’ย ResolveMetadataOptions

    Type Aliases

    ResolvedMetadataย โ†’ย ResolvedMetadata