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
SPS External-source publications: SPS ingest + render (#101 downstream) #1670 — key external Publication rows on article_id; render gating via a single pubSource() helper (source label, no dead pubmed.ncbi.nlm.nih.gov/-N link). CI green (build + cdk). Currently a DRAFT and BLOCKED — see the hazard below.
Design outcome
No SPS schema migration.article_id (source-prefixed, ≤32 chars for every current source) fits the existing Publication.pmidVarChar(32) and encodes the source in its prefix, so external-ness derives from the pmid (numeric = PubMed). Stable identity comes from article_id rather than the synthetic pmid, which reciterdb recomputes every nightly.
SPS #1670 adds article_id to the SELECT ... FROM analysis_summary_article in the reciter ETL. If that column does not exist in the reciterdb the SPS ETL reads, the query fails with MySQL 1054 Unknown column 'article_id' in 'field list' and the nightly reciter ETL breaks. It does not degrade gracefully. Merging #1670 auto-deploys to staging, so it would break the staging nightly.
Note the feature is dormant (0 external rows until cutover) but this schema dependency is not — the ETL reads the column on every run regardless.
Spot-check an external pub renders correctly on a profile once rows exist (post-cutover): DOI link works, source label shows, no PubMed link, stable URL, no crash on null authors.
Goal
Surface manually-added external-source publications (Scopus / OpenAlex / WOS, added by curators in Publication Manager — ReCiter #659/#661) in SPS scholar profiles alongside PubMed pubs, without breaking bibliometrics or publication identity.
How it flows
ExternalArticle(DynamoDB) → reciterdbexternal_article→ STEP 6b unions intoanalysis_summary_article/analysis_summary_author(ReCiterDB #101, shipped) → SPS reciter ETL ingests intoPublication.Work
master(09ef4a6).article_idinanalysis_summary_article. MERGED tomaster(30147ab). The v1.7 ALTER is not applied by merging — see below.Publicationrows onarticle_id; render gating via a singlepubSource()helper (source label, no deadpubmed.ncbi.nlm.nih.gov/-Nlink). CI green (build + cdk). Currently a DRAFT and BLOCKED — see the hazard below.Design outcome
No SPS schema migration.
article_id(source-prefixed, ≤32 chars for every current source) fits the existingPublication.pmidVarChar(32)and encodes the source in its prefix, so external-ness derives from the pmid (numeric = PubMed). Stable identity comes fromarticle_idrather than the synthetic pmid, which reciterdb recomputes every nightly.⛔ Hazard — #1670 is NOT safe to merge yet
SPS #1670 adds
article_idto theSELECT ... FROM analysis_summary_articlein the reciter ETL. If that column does not exist in the reciterdb the SPS ETL reads, the query fails with MySQL 1054Unknown column 'article_id' in 'field list'and the nightly reciter ETL breaks. It does not degrade gracefully. Merging #1670 auto-deploys to staging, so it would break the staging nightly.Note the feature is dormant (0 external rows until cutover) but this schema dependency is not — the ETL reads the column on every run regardless.
Deploy order (must hold)
master(30147ab) — column added to the DDL, populated in STEP 6b.alter_add_article_id_analysis_summary_article_v1.7.sqlto the reciterdb instance the SPS ETL reads. Merging B19 — Reciter → DynamoDB consistency-window UI placeholder #118 does not apply it — manual operator step.masterordev. B19 — Reciter → DynamoDB consistency-window UI placeholder #118 targetedmasteronly (the B02 — /api/edit authorization predicate + 403 telemetry #101 union went to bothmasterB17 — VPC endpoints for Secrets Manager / S3 / OpenSearch #116 anddevB18 — OpenSearch alias-swap pattern (scholars_v{N}) #117). If SPS reads adev-built reciterdb, adevcounterpart of B19 — Reciter → DynamoDB consistency-window UI placeholder #118 is also required.analysis_summary_articlewitharticle_idpopulated.The feature stays dormant until the upstream ReCiter #626 / PM #719 cutover — 0 external rows until then.
Remaining
Refs
ReCiterDB #101 / #116 / #117 / #118; SPS #1670; ReCiter #659 / #660 / #661 / #662 / #665; PM #771 / #772; upstream cutover ReCiter #626 + PM #719.