ReadonlytitleLocalized <title> candidate, post-cleanArticleTitle. null when the brief is missing, its H1 is template boilerplate, contains a banned phrase, or shrinks to <20 chars after cleanup.
ReadonlydescriptionLocalized <meta description> candidate, post-truncateToSentenceBoundary. Composed via composeRichDescription which combines the BLUF lede with the top headline-section bullets (bill IDs + topics) when the localized brief has a ## 60-Second Read / native equivalent. null when the brief is missing or has no usable BLUF/first paragraph.
ReadonlykeywordsStory-specific keyword tokens mined from the localized brief โ universal-Swedish identifiers (bill IDs HD03267, committee codes JuU, party codes M/SD) plus locale-script named entities. These are pre-flattened and ready to seed the keyword builder via ArticleSeoMetadataInput.briefEntities. Empty array (not null) when the brief is missing โ keeps the consumer-side spread [...localizedSeo.keywords] safe.
Output contract โ three independent optional fields. The caller (the
article-merge.tsmerger) overlays whichever fields are non-null over the per-type agent'sarticle.<lang>.mdfront-matter title / description / keywords.