We are part of the{' '}
diff --git a/app/page.jsx b/app/page.jsx
index 753601f..d785947 100644
--- a/app/page.jsx
+++ b/app/page.jsx
@@ -133,7 +133,7 @@ export default function Home() {
- Support From
+ Past and present support
{sponsors.map((s) => (
diff --git a/app/sitemap.js b/app/sitemap.js
index bc93a75..78a8963 100644
--- a/app/sitemap.js
+++ b/app/sitemap.js
@@ -1,4 +1,4 @@
-import { papers, people, site } from '@/lib/content';
+import { papers, people, site, projects, gallery, pageContent } from '@/lib/content';
export const dynamic = 'force-static';
export default function sitemap() {
return [
@@ -8,7 +8,9 @@ export default function sitemap() {
'/news/',
'/awards/',
'/join/',
- '/research/',
+ ...(projects.length || pageContent.research.trim() ? ['/research/'] : []),
+ ...(gallery.length || pageContent.pictures.trim() ? ['/pictures/'] : []),
+ ...(pageContent.about.trim() ? ['/aboutwebsite/'] : []),
'/idiofid/',
...papers.map((p) => `/publications/${p.id}/`),
...people.map((p) => `/people/${p.id}/`),
diff --git a/content/pages.json b/content/pages.json
index b2b1b10..ca96ead 100644
--- a/content/pages.json
+++ b/content/pages.json
@@ -1,5 +1,5 @@
{
- "home": "We study how people interact with AI and use data to understand and support human behavior. Based at the [Paul G. Allen School of Computer Science & Engineering](https://www.cs.washington.edu/) at the University of Washington, our research spans psychosocial AI, mental health, and human–AI collaboration.",
+ "home": "We are a research group at the [Paul G. Allen School of Computer Science & Engineering](https://www.cs.washington.edu/). Our aim is to explore and understand behavior through the lens of data science.\n\nThe Behavioral Data Science Group develops computational methods that leverage large-scale behavioral data to extract actionable insights about our lives, health and happiness through combining techniques from data science, social network analysis, and natural language processing.\n\nWe currently work on psychosocial AI, mental health, and human–AI collaboration.",
"recruitment": "Current opportunities are maintained in the structured opportunities collection.",
"idiofid": "IdioFid-A is a benchmark for evaluating how well AI agents can infer a specific person’s attitudes from their real social media history. Leave your email to get a one-time notification when the benchmark, dataset, and code are public.",
"research": "",
diff --git a/content/publications.json b/content/publications.json
index 26cd960..5be16ed 100644
--- a/content/publications.json
+++ b/content/publications.json
@@ -409,6 +409,10 @@
"Andrew Campell",
"Anind K. Dey",
"Jennifer C. Mankoff"
+ ],
+ "personIds": [
+ "yasamansefidgar",
+ "timalthoff"
]
},
{
@@ -449,6 +453,10 @@
"Ludwig Schmidt",
"Luca Foshchini",
"Tim Althoff"
+ ],
+ "personIds": [
+ "mikemerrill",
+ "timalthoff"
]
},
{
@@ -530,6 +538,9 @@
"Boris Litvin",
"Jerilyn Wu",
"Patricia A Areán"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -713,6 +724,9 @@
"Jeff Hancock",
"Steven M Asch",
"others"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -840,6 +854,9 @@
"Ernesto Ramirez",
"Tim Althoff",
"Luca Foschini"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -925,6 +942,9 @@
"Hamed Nilforoshan",
"Jenna Hua",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -965,6 +985,9 @@
"Michael P Snyder",
"Abby C King",
"others"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1175,6 +1198,9 @@
"Tal August",
"Qisheng Li",
"Tim Althoff"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1384,6 +1410,9 @@
"Yang Liu",
"Tim Althoff",
"Jeffrey Heer"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1424,6 +1453,9 @@
"Mitchell Gordon",
"Tim Althoff",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1475,6 +1507,9 @@
"J. David Creswell",
"Jennifer Mankoff",
"Anind K. Dey"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1523,6 +1558,10 @@
"Paula S. Nurius",
"Anind K. Dey",
"Jennifer Mankoff"
+ ],
+ "personIds": [
+ "yasamansefidgar",
+ "timalthoff"
]
},
{
@@ -1557,6 +1596,9 @@
"Takeshi Kurashima",
"Tim Althoff",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1591,6 +1633,9 @@
"Tim Althoff",
"Eric Horvitz",
"Ryen W White"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1624,6 +1669,9 @@
"Eric Horvitz",
"Ryen W White",
"Jamie Zeitzer"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1658,6 +1706,9 @@
"Tim Althoff",
"Amin Saberi",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1692,6 +1743,9 @@
"Abby C King",
"Scott L Delp",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1722,6 +1776,9 @@
"Tim Althoff",
"Pranav Jindal",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1754,6 +1811,9 @@
},
"authorNames": [
"Tim Althoff"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1793,6 +1853,9 @@
"Tim Althoff",
"Ryen W White",
"Eric Horvitz"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1824,6 +1887,9 @@
"Tim Althoff",
"Kevin Clark",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1856,6 +1922,9 @@
"authorNames": [
"Tim Althoff",
"Jure Leskovec"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
@@ -1886,6 +1955,9 @@
"Tim Althoff",
"Cristian Danescu-Niculescu-Mizil",
"Dan Jurafsky"
+ ],
+ "personIds": [
+ "timalthoff"
]
},
{
diff --git a/docs/CONTENT_MODEL.md b/docs/CONTENT_MODEL.md
index 2d8fbc0..0654a43 100644
--- a/docs/CONTENT_MODEL.md
+++ b/docs/CONTENT_MODEL.md
@@ -7,7 +7,7 @@ All public page data lives in `content/`. JSON strings may contain Markdown wher
| `pages.json` | Markdown strings: `home`, `recruitment`, `idiofid`, `research`, `pictures`, `about` | Empty strings render no prose. Existing words have only been moved out of JSX. |
| `site.json` | `name`, `url`, `repository`, `signupUrl`, `description` | Canonical site URL and IdioFid endpoint are configured here. |
| `people.json` | `id`, `name`, `role`, `status`, `priority`, `topics` | `website`, local `image`, optional `photoCrop: {scale, x, y}`, `aliases`, `memberships: [{start, end?}]`, `reviewedOn`; status is member/visitor/alumni. |
-| `publications.json` | `id`, `title`, `authors`, integer `year` | Ordered `authorNames`, explicit `personIds`, `venue`, optional `venueShort`, DOI, `openalexId`, `arxivId`, `status`, `type`, `topics`, `description` (Markdown), `highlight`, local/external `pdf`, local `image`, `url`, `code`, `dataset`, `reviewedOn`, preserved `legacy`. |
+| `publications.json` | `id`, `title`, `authors`, integer `year`, explicit `personIds` | Ordered `authorNames`, `venue`, optional `venueShort`, DOI, `openalexId`, `arxivId`, `status`, `type`, `topics`, `description` (Markdown), `highlight`, local/external `pdf`, local `image`, `url`, `code`, `dataset`, `reviewedOn`, preserved `legacy`. |
| `awards.json` | `id`, `title`, `organization`, `date`, `sourceUrl`, at least one recipient or paper | `personIds`, `publicationIds`, `recipientNames` for alumni without profiles, `recipientLabel` for team attribution, `kind`, `highlight` for an explicitly selected people honor, and `dateLabel` for a verified year range; one record supplies award labels and related profile, publication, and news views. |
| `news.json` | `id`, `headline` (Markdown), `date` | `personIds`, `publicationIds`, `projectIds`, `awardIds`, `sourceUrl`. Related profiles and paper pages display linked news. |
| `projects.json` | `id`, `title` | `description` (Markdown), local `image`, `personIds`, `publicationIds`, `url`, `code`, `dataset`. Appears on Research and linked profile/paper pages. |
@@ -18,13 +18,13 @@ All public page data lives in `content/`. JSON strings may contain Markdown wher
The validator in `lib/content-validation.mjs` enforces dates, IDs, links, assets and relationships. Cross-record references must point to existing records. Public content requires no API key, database or server.
-`maintenance/membership-evidence.json` records source-backed membership research separately from exact-day `people.memberships`. Evidence dates use inclusive `YYYY` ranges at the maintainer's request, preserve unresolved boundaries and conflicting claims, and distinguish an unknown departure from ongoing membership. Direct maintainer confirmations take precedence over public profiles; `omitted` records have no selected range. It is a review artifact, not an input to automatic relevance assessment. Differences within the same year do not block reconstruction. Do not convert years into invented calendar days. See [Membership review](../_planning/MEMBERSHIP_REVIEW.md).
+`maintenance/membership-evidence.json` is the source for automatic membership screening. The pipeline loads its reviewed ranges directly without copying dates into public profiles. Dates use inclusive `YYYY` ranges, preserve unresolved boundaries and conflicting claims, and distinguish an unknown departure from ongoing membership. Direct maintainer confirmations take precedence over public profiles; `omitted` records have no selected range. Differences within the same year do not block screening. Do not convert years into invented calendar days. See [Membership review](../_planning/MEMBERSHIP_REVIEW.md) and [attribution completion](../_planning/ATTRIBUTION_REVIEW.md).
`photoCrop` applies the same CSS framing on the homepage, Team, and profile pages, preserving original image assets. When present, it requires `scale` (1–2) and transform-origin percentages `x` and `y` (0–100). Without `photoCrop`, framing defaults to scale 1 and origin 50%, 50%.
Publication cards and venue filters use known short venue labels, or an explicit `venueShort` when the journal name alone does not identify the conference. Full `venue` values remain on detail pages and in citations. Search accepts both full names and displayed abbreviations. Phone filters expand from a disclosure button; selected filters remain visible as removable controls when collapsed.
-Publication status: `preprint`, `accepted`, `published`, `withdrawn`, `retracted`. Type: `article`, `conference`, `preprint`, `book`, `dataset`, `other`. These fields are optional for imported records; verify them during backfill. Explicit `personIds`, including an empty list, supersede legacy name matching. Do not generate those links solely from names.
+Publication status: `preprint`, `accepted`, `published`, `withdrawn`, `retracted`. Type: `article`, `conference`, `preprint`, `book`, `dataset`, `other`. These fields are optional for imported records; verify them during backfill. Explicit `personIds` are required; use an empty list for a paper that belongs to no profile. Profiles never fall back to name matching. Verify author identity against primary evidence before adding a link.
News and Awards have separate archive routes with shared navigation. The Awards archive groups all records by year and provides year jump links; stable individual award anchors remain available. News omits a redundant related-person link when the headline already links to that profile. Awards are not converted into invented news text. An approved news record can link to an award; its title and organization are shown where related. The three imported paper-level `award` strings have been migrated into the structured collection; original wording remains in each publication's `legacy.award`. The rendered award label comes from the shared record. Avoid duplicating an award across old and new records.
@@ -38,7 +38,11 @@ Verified award tenures and academic-year ranges use `dateLabel: "YYYY–YYYY"`,
`opportunities.json` is the sole source for the Join us page. Closed, draft, and expired entries remain in the data but are hidden. If none are open, the page renders a neutral empty state rather than a historical recruitment claim. `reviewedOn` is the last human verification date; `reviewOn` is the next date the listing owner should check the record. Expiration is evaluated when the static site is built, so changing a date or reaching a deadline requires a rebuild; the deployment runbook covers this.
-Research and Pictures navigation entries appear when their respective collections contain records. Their routes remain valid while empty. No example record is shipped in public content; synthetic test records are isolated under `tests/fixtures/` or temporary directories.
+Research and Pictures navigation entries appear when their respective collections contain records. While empty, the static export redirects Research to Publications, Pictures to Team, and About website to Home, with canonical URLs and visible fallback links. Empty sections are omitted from the sitemap; populated future sections retain their own content. Template attribution remains in repository documentation. No example record is shipped in public content; synthetic test records are isolated under `tests/fixtures/` or temporary directories.
+
+The homepage describes the seven sponsor records as **Past and present support**, confirmed by the maintainer on September 10, 2026. Their presence does not assert that every sponsor is funding the lab currently.
+
+The homepage hero retains the original two-paragraph group description in `pages.json` (`home`), followed by the maintainer-requested sentence naming current work in psychosocial AI, mental health, and human–AI collaboration. The maintainer requested restoration on September 10 and clarified that broader changes to the research description require Tim’s approval. Keep copy edits separate from layout changes.
## Verified discovery identities
diff --git a/docs/MAINTENANCE.md b/docs/MAINTENANCE.md
index f6a586d..a20e122 100644
--- a/docs/MAINTENANCE.md
+++ b/docs/MAINTENANCE.md
@@ -2,10 +2,14 @@
## Status
-The React site is live at from the `master` branch. The current roster, initial Scholar profiles, author identities, and first reviewed OpenAlex batch are configured. Scheduled discovery remains disabled pending reviewer ownership and the maintenance pilot. No live IdioFid signup test has been submitted.
+The React site is live at from the `master` branch. The nine current discovery identities and reviewed inclusive membership years are configured. The isolated live pilot passed; scheduled discovery remains disabled pending review safeguards, alert routing, and independent monitoring. No live IdioFid signup test has been submitted.
The site stays static: React/Next.js renders JSON and Markdown at build time. Python's standard library handles discovery and decisions. GitHub provides contribution forms, review branches, checks, artifacts, and deployment. There is no admin service or database to maintain.
+Primary maintainer: [advaitmb](https://github.com/advaitmb), confirmed September 10, 2026. Backup maintainer and failure-alert destination are not yet assigned. Production deployment remains manual. The maintainer has deferred the live IdioFid signup test; do not submit a test address until that task is resumed.
+
+Current evidence: [issue status](../_planning/NEXT_STEPS.md), [final QA](../_planning/FINAL_QA.md), and [isolated pilot / weekly log](../_planning/MAINTENANCE_PILOT.md).
+
## Normal development
Use Node 24 (`nvm use`) and Python 3.12 (CI's version; helpers also work on current local Python). Then:
@@ -34,8 +38,8 @@ The repository skill at `.agents/skills/publication-review/SKILL.md` defines the
python3 scripts/publication_pipeline.py status
```
-1. Review the initial identities in `maintenance/authors.json` and resolve mixed/split author records and historical membership dates. The attribution rule requires Tim plus at least one other lab author. Qualifying preprints are included with visible preprint labels. See [Publication policy](PUBLICATION_POLICY.md).
-2. Set `enabled: true` in `maintenance/config.json` in a reviewed PR. Keep it false during the skeleton/content preparation phase.
+1. Review the identities in `maintenance/authors.json` and use `maintenance/membership-evidence.json` for inclusive year-level membership. Do not infer omitted dates or current affiliation from a null end. Reassess after evidence changes; the pipeline preserves historical decision receipts. The attribution rule requires Tim plus at least one other lab author. Qualifying preprints are included with visible preprint labels. See [Publication policy](PUBLICATION_POLICY.md).
+2. Set `enabled: true` in `maintenance/config.json` in a reviewed PR after completing the activation checklist in the pilot log. Keep the repository gate false during isolated tests; enable only the temporary copy for those runs.
3. Run `python3 scripts/publication_pipeline.py collect` locally. `OPENALEX_API_KEY` is optional and read only from the environment. Check current provider access/budget before enabling scheduled retrieval.
4. Start with `maintenance/recent-review.md` for recent potentially relevant papers, then inspect `maintenance/batch.md` and `maintenance/review.json`. Candidates show public evidence, matched identities, proposed fields, possible duplicates and manual/source conflicts. The site content has not changed.
5. Record decisions with the CLI. Substitute actual candidate and person IDs:
@@ -66,7 +70,7 @@ After the content and identity pass, merge the infrastructure to the default bra
- `maintenance/config.json`: `enabled: true`, lookback, monthly reconciliation interval, per-run request budget, and age thresholds.
- Repository variable `WEBSITE_MAINTENANCE_ENABLED=true` to enable the collection and health jobs. Both are currently gated off.
- Optional repository secret `OPENALEX_API_KEY` from a lab-owned account.
-- GitHub repository Actions permission allowing the workflow to create pull requests. Apply branch protection requiring human review and successful checks on the production branch.
+- GitHub repository Actions permission allowing the workflow to create pull requests. Apply branch protection requiring human review and the successful `check` job on the production branch. As of September 10, existing protection has neither required status checks nor required PR reviews. Name an eligible reviewer before requiring approval on maintainer-authored PRs; GitHub does not allow an author to approve their own PR.
- A primary maintainer and backup to review each weekly batch and receive actionable workflow failures using their GitHub notification settings.
The collector is scheduled weekly and can also be dispatched manually. It starts from the default branch, continues `codex/weekly-publication-review` if it exists, and merges in the default branch without force-pushing or overwriting reviewer edits. Merge conflicts or concurrent remote edits fail visibly rather than discarding work. There is at most one open review PR. It includes both the complete batch and concise recent-review sheet, is created as a draft, and the bot never merges it.
@@ -83,6 +87,8 @@ Configure that external scheduler to alert the primary/backup maintainer on fail
Run two weekly cycles before calling maintenance operational. Record false matches, missed papers, duplicate/version conflicts, failed-provider recovery, and review effort. Keep automatic publication disabled; enabling it would require a new policy decision.
+The September 10 isolated pilot retrieved 402 unique works across nine current-member identities and repeated without queue changes. All prior decisions and the approved bibliography remained unchanged. The [pilot log](../_planning/MAINTENANCE_PILOT.md) records exact counts, provider limitations, and the two still-pending actual weekly cycles.
+
## Production switch and rollback
`deploy.yml` remains manual. Creating or pushing a migration or review branch does not deploy it.
@@ -92,7 +98,7 @@ Run two weekly cycles before calling maintenance operational. Record false match
- First React deployment: September 9, 2026, commit [`655d927`](https://github.com/behavioral-data/behavioral-data.github.io/commit/655d92724cf2bccc17adb5324ee4dcb7efcee3ff), [Actions run 34403337235](https://github.com/behavioral-data/behavioral-data.github.io/actions/runs/34403337235).
- Current Pages mode: GitHub Actions (`build_type: workflow`) on the canonical HTTPS domain .
- Known-good pre-migration revision: [`d6a7b92`](https://github.com/behavioral-data/behavioral-data.github.io/commit/d6a7b92de79642aee11c2c5bfe60c94588beae79). The prior Pages setting was the legacy publisher using `master` at `/`.
-- Launch verification covered the home, team, publications, one preprint detail, IdioFid, and legacy `allnews.html` and `/vacancies/` routes. A representative publication PDF, the lab logo, `robots.txt`, `sitemap.xml`, and the custom 404 response were also checked on production. The IdioFid form itself still needs one separately authorized live submission.
+- Launch verification covered the home, team, publications, one preprint detail, IdioFid, and legacy `allnews.html` and `/vacancies/` routes. A representative publication PDF, the lab logo, `robots.txt`, `sitemap.xml`, and the custom 404 response were also checked on production. The maintainer deferred the live IdioFid submission on September 10.
1. Run `npm run check` from a clean checkout of the approved `master` commit.
2. Run **Deploy React website** on `master` and wait for its GitHub Pages deployment job to succeed.
diff --git a/docs/PUBLICATION_POLICY.md b/docs/PUBLICATION_POLICY.md
index 695feec..746cbb2 100644
--- a/docs/PUBLICATION_POLICY.md
+++ b/docs/PUBLICATION_POLICY.md
@@ -4,6 +4,10 @@ Confirmed direction from the lab maintainer, clarified September 9, 2026: Tim mu
For historical attribution, use membership when the work was published, rather than someone's current role. Past members count during their recorded membership interval. Tim is counted as the PI when his verified author identity appears, but never qualifies a paper alone. Unknown membership dates require human review; current status does not establish historical membership. Publication date is a screening proxy for when the work happened. Continuing collaborations after departure, publication delays, and work predating the lab require a documented reviewer judgment.
+Screening uses inclusive calendar years from `maintenance/membership-evidence.json`. Joining and leaving years both count; Jina’s separate 2019–2022 and 2026–present periods retain the intervening gap. Omitted ranges, unknown starts, and unknown departure years require review. A null end is open only when explicitly marked ongoing. Source records with only a publication year can be screened without inventing a month or day.
+
+All 66 approved archive entries have explicit profile author links. The 23 remaining imported records were checked against paper title pages and author evidence; see [attribution review](../_planning/ATTRIBUTION_REVIEW.md). Their existing inclusion is preserved, including Tim’s earlier work and historical collaborations. The new-candidate rule does not retrospectively remove approved records. Current screening assessments can change as evidence improves; a recorded human decision retains its original assessment, reason, sources, date, and selected authors.
+
`maintenance/publication-policy.json` configures the rule. Each discovery candidate receives a `labRelevance` assessment:
- `meets-rule`: Tim and at least one other distinct lab author have supported publication-time membership.
@@ -22,7 +26,7 @@ Google Scholar profiles are identity references, recorded in `maintenance/schola
`requiresWorkVerification: true` flags a profile for per-paper checks. Candidates outside its known-paper anchors list `identityReviewPersonIds`; a relevance label does not override that warning. A person counts only once even when multiple OpenAlex IDs map to them.
-The initial registry fetches the eight current members' primary records. It also recognizes anchored identities for seven past members (Ashish Sharma, Galen Weld, Joy He-Yueya, Ken Gu, Mike Merrill, Xinyi Zhou, and Yasaman Sefidgar). These entries use `discover: false`: they match coauthors in retrieved papers without fetching their entire subsequent careers. Additional past members and split IDs still need verification. Coverage is preliminary, so papers with too few matches remain visible in the full durable queue, but only candidates containing Tim can enter the focused review set.
+The registry fetches the nine current members’ primary records. Rongwu was added on September 10 with his website-linked Scholar identity and two ACL Anthology paper anchors; unanchored work still needs identity review. It also recognizes anchored identities for past members, including Ashish Sharma, Galen Weld, Joy He-Yueya, Ken Gu, Mike Merrill, Xinyi Zhou, Yasaman Sefidgar, Mickel Liu, and Vinayak Gupta. These entries use `discover: false`: they match coauthors in retrieved papers without fetching their entire subsequent careers. Additional past members and split IDs still need verification. Coverage is preliminary, so papers with too few matches remain visible in the full durable queue, but only candidates containing Tim can enter the focused review set.
## First local batch
@@ -34,10 +38,14 @@ Start with `maintenance/recent-review.md`; the full queue is in `maintenance/bat
The maintainer approved seven further papers: five published records and Margaret Li’s two preprints, bringing the local site to 66 publications. Prefer a verified journal record over its preprint; if the journal record cannot be verified, include the verified preprint and upgrade that same site entry when the final record is confirmed. Conflicting journal claims on author profiles are not sufficient to invent a journal year or DOI.
-The queue retains 390 observations grouped into 321 canonical candidates: 18 accepted, 302 pending and one rejected, plus one accepted manual supplement. Pending screening labels are 38 membership-review and 264 does-not-meet-rule. The Cognitive Reframing preprint is now grouped under its accepted ACL record. Vinayak Gupta’s identity is anchored to the forecasting paper and its preprint, with career-wide discovery disabled. Acceptance audits use the maintainer-approved year-level membership evidence; this does not change the exact-date screening model. Full evidence and remaining work are in `_planning/PUBLICATION_BACKFILL_REVIEW.md`.
+The queue retains 390 observations grouped into 321 canonical candidates: 18 accepted, 302 pending and one rejected, plus one accepted manual supplement. Pending screening labels are 38 membership-review and 264 does-not-meet-rule. The Cognitive Reframing preprint is now grouped under its accepted ACL record. Vinayak Gupta’s identity is anchored to the forecasting paper and its preprint, with career-wide discovery disabled. Acceptance audits used the maintainer-approved year-level membership evidence. Screening itself was subsequently updated to consume that evidence in the September 10 attribution pass. Full evidence and remaining work are in `_planning/PUBLICATION_BACKFILL_REVIEW.md`.
## Existing-record reconciliation
The subsequent September 9 pass updates 24 existing entries without adding pages: 20 missing DOIs, complete author lists, verified final PDF links and five preprint/final groups. The bibliography remains at 66 papers. The queue retains 390 observations in 316 canonical items: 42 accepted, 273 pending and one rejected, plus the accepted manual supplement. Nine pending canonical items need membership/version review; 264 retain the other screening label. `_planning/PUBLICATION_RECONCILIATION_REVIEW.md` records the sources, decisions and unresolved cases. The original metadata and all alternate source observations remain available for audit.
The maintainer subsequently declined all nine remaining membership/version cases. Their candidate additions/updates are recorded as rejected, with existing approved site entries preserved. Current canonical decisions: 42 accepted, 264 pending and ten rejected, plus one accepted manual supplement. This closes the current focused review pass, not an exhaustive audit of the remaining provider matches.
+
+## September 10 readiness check
+
+All 66 archive records now carry explicit profile author links, and the screening pipeline consumes reviewed inclusive membership years. The isolated live pilot covered all nine current discovery identities, retrieved 402 unique works, and produced an identical queue on both incremental and cached repeat runs. The website bibliography, production review queue, and all prior decisions stayed unchanged. See [maintenance pilot](../_planning/MAINTENANCE_PILOT.md) for provider access, request counts, identity limitations, and activation requirements.
diff --git a/lib/content-validation.mjs b/lib/content-validation.mjs
index b62569a..e9a4ebb 100644
--- a/lib/content-validation.mjs
+++ b/lib/content-validation.mjs
@@ -95,6 +95,8 @@ export function validateContent(data, assetExists = () => true) {
};
const dois = new Set();
for (const p of data.publications) {
+ if (!Array.isArray(p.personIds))
+ fail(p.id, 'expected explicit personIds (use [] for no profiles)');
for (const field of ['title', 'authors']) text(p[field], `${p.id}.${field}`);
if (!Number.isInteger(p.year) || p.year < 1900 || p.year > new Date().getFullYear() + 2)
fail(p.id, 'invalid year');
diff --git a/lib/publications.mjs b/lib/publications.mjs
index 724e410..381df9a 100644
--- a/lib/publications.mjs
+++ b/lib/publications.mjs
@@ -24,10 +24,8 @@ export function matchesPerson(paper, name) {
);
}
-// An explicit list, including [], always takes precedence over legacy name matching.
export function paperBelongsTo(paper, person) {
- if (Array.isArray(paper.personIds)) return paper.personIds.includes(person.id);
- return [person.name, ...(person.aliases || [])].some((name) => matchesPerson(paper, name));
+ return Array.isArray(paper.personIds) && paper.personIds.includes(person.id);
}
export function filterPapers(
diff --git a/maintenance/authors.json b/maintenance/authors.json
index 16eb5df..a05c61f 100644
--- a/maintenance/authors.json
+++ b/maintenance/authors.json
@@ -86,6 +86,20 @@
],
"requiresWorkVerification": false
},
+ {
+ "personId": "rongwudannyxu",
+ "openalexId": "A5101295876",
+ "verified": true,
+ "verifiedOn": "2026-09-10",
+ "sourceUrl": "https://rongwuxu.com/",
+ "evidenceWorkIds": [
+ "W4402671159",
+ "W4389821167",
+ "W4404782813",
+ "W4392822502"
+ ],
+ "requiresWorkVerification": true
+ },
{
"personId": "margaretli",
"openalexId": "A5001224830",
diff --git a/maintenance/membership-evidence.json b/maintenance/membership-evidence.json
index 5cd1e5d..44529be 100644
--- a/maintenance/membership-evidence.json
+++ b/maintenance/membership-evidence.json
@@ -1,7 +1,7 @@
{
"version": 3,
"checkedOn": "2026-09-09",
- "purpose": "Source-backed reconstruction for issue #22; evidence only, not an automatic publication-policy input.",
+ "purpose": "Reviewed year-level membership evidence for issue #22 and automatic publication screening.",
"datePrecision": "year",
"conventions": {
"dates": "YYYY uses the maintainer-requested year precision. Joining and leaving years are inclusive. Null means an unresolved year; differences within the same year do not block reconstruction.",
@@ -11,7 +11,7 @@
"conflict": "Competing accounts retained in conflictingClaims; contested boundaries remain null or absent.",
"unresolved": "No usable lab appointment boundary established; revisit only when better evidence is available.",
"personId": "Matches content/people.json. Null denotes an alumni-only entry; this file does not create a new public profile.",
- "policy": "Year-level research evidence; not an automatic publication-policy input. Do not expand years into invented calendar dates. Existing decisions, roster roles, and current/past status are preserved.",
+ "policy": "Consumed directly by publication screening as inclusive calendar years. Do not expand years into invented dates. Existing decisions, roster roles, and current/past status are preserved.",
"confirmed": "A timeline completed or corrected by direct maintainer confirmation; this governs conflicting public profiles.",
"omitted": "Membership range intentionally omitted at the maintainer\u2019s request; historical source claims are not selected ranges."
},
diff --git a/maintenance/review.json b/maintenance/review.json
index d5ebd1a..246956e 100644
--- a/maintenance/review.json
+++ b/maintenance/review.json
@@ -69,9 +69,7 @@
],
"publicationDate": "2014-09-16",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -324,9 +322,7 @@
],
"publicationDate": "2012-09-13",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -456,9 +452,7 @@
],
"publicationDate": "2006-01-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -649,9 +643,7 @@
],
"publicationDate": "2012-05-31",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -722,9 +714,7 @@
],
"publicationDate": "2006-08-21",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -783,9 +773,7 @@
],
"publicationDate": "2013-11-15",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -844,9 +832,7 @@
],
"publicationDate": "2009-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -907,9 +893,7 @@
],
"publicationDate": "1961-07-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -974,9 +958,7 @@
],
"publicationDate": "2015-04-17",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1031,9 +1013,7 @@
],
"publicationDate": "2009-12-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1154,9 +1134,7 @@
],
"publicationDate": "2016-06-12",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1219,9 +1197,7 @@
],
"publicationDate": "2016-06-24",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1280,9 +1256,7 @@
],
"publicationDate": "2016-06-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1408,9 +1382,7 @@
],
"publicationDate": "2016-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1473,9 +1445,7 @@
],
"publicationDate": "2016-08-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1870,9 +1840,7 @@
],
"publicationDate": "2017-07-21",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -1933,9 +1901,7 @@
],
"publicationDate": "2017-09-04",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2063,9 +2029,7 @@
],
"publicationDate": "2017-04-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2315,9 +2279,7 @@
],
"publicationDate": "2018-03-05",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2441,9 +2403,7 @@
],
"publicationDate": "2018-06-08",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2506,9 +2466,7 @@
],
"publicationDate": "2018-06-21",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2571,9 +2529,7 @@
],
"publicationDate": "2018-09-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -2698,9 +2654,7 @@
],
"publicationDate": "2019-01-04",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2770,10 +2724,10 @@
"jinasuh"
],
"publicationDate": "2019-04-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2851,10 +2805,10 @@
"jinasuh"
],
"publicationDate": "2019-04-29",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -2917,9 +2871,7 @@
],
"publicationDate": "2019-03-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -3302,9 +3254,7 @@
],
"publicationDate": "2019-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -3700,10 +3650,10 @@
"jinasuh"
],
"publicationDate": "2019-08-09",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -3768,9 +3718,7 @@
],
"publicationDate": "2018-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -3831,9 +3779,7 @@
],
"publicationDate": "2019-09-06",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -4021,11 +3967,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "yasamansefidgar"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"reconciliationReview": {
"checkedOn": "2026-09-09",
@@ -4103,9 +4047,7 @@
],
"publicationDate": "2019-11-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -4246,9 +4188,7 @@
],
"publicationDate": "2019-09-25",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -4312,10 +4252,10 @@
"jinasuh"
],
"publicationDate": "2019-12-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -4383,10 +4323,10 @@
"margaretli"
],
"publicationDate": "2020-02-07",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -4451,10 +4391,10 @@
"jinasuh"
],
"publicationDate": "2020-03-04",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -4578,13 +4518,12 @@
],
"publicationDate": "2020-05-26",
"memberPersonIds": [
+ "ashishsharma",
"timalthoff"
],
- "uncertainPersonIds": [
- "ashishsharma"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -4685,13 +4624,12 @@
],
"publicationDate": "2020-05-18",
"memberPersonIds": [
+ "jinasuh",
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -4767,9 +4705,7 @@
],
"publicationDate": "2020-04-23",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -4831,10 +4767,10 @@
"jinasuh"
],
"publicationDate": "2020-04-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -4966,10 +4902,10 @@
"jinasuh"
],
"publicationDate": "2020-05-28",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5027,10 +4963,10 @@
"jinasuh"
],
"publicationDate": "2020-07-03",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5094,10 +5030,10 @@
"jinasuh"
],
"publicationDate": "2020-05-20",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5239,13 +5175,12 @@
],
"publicationDate": "2020-04-10",
"memberPersonIds": [
+ "ashishsharma",
"timalthoff"
],
- "uncertainPersonIds": [
- "ashishsharma"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3015278215"
},
@@ -5310,10 +5245,10 @@
"margaretli"
],
"publicationDate": "2020-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -5380,10 +5315,10 @@
"jinasuh"
],
"publicationDate": "2020-04-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5446,9 +5381,7 @@
],
"publicationDate": "2020-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5534,10 +5467,10 @@
"margaretli"
],
"publicationDate": "2020-06-22",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5672,10 +5605,10 @@
"jinasuh"
],
"publicationDate": "2020-07-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5740,13 +5673,12 @@
],
"publicationDate": "2020-08-17",
"memberPersonIds": [
+ "jinasuh",
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3114914047"
},
@@ -5807,10 +5739,10 @@
"jinasuh"
],
"publicationDate": "2020-08-03",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -5877,13 +5809,12 @@
],
"publicationDate": "2022-03-18",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -5960,13 +5891,12 @@
],
"publicationDate": "2020-01-01",
"memberPersonIds": [
+ "ashishsharma",
"timalthoff"
],
- "uncertainPersonIds": [
- "ashishsharma"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -6065,13 +5995,12 @@
],
"publicationDate": "2022-05-31",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -6153,10 +6082,10 @@
"margaretli"
],
"publicationDate": "2021-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -6288,10 +6217,10 @@
"innalin"
],
"publicationDate": "2020-10-09",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"innalin"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -6357,10 +6286,10 @@
"margaretli"
],
"publicationDate": "2020-10-14",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -6478,9 +6407,7 @@
],
"publicationDate": "2020-10-26",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -6692,13 +6619,12 @@
],
"publicationDate": "2021-03-06",
"memberPersonIds": [
+ "jinasuh",
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -6797,14 +6723,13 @@
],
"publicationDate": "2021-04-19",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -6956,10 +6881,10 @@
"jinasuh"
],
"publicationDate": "2021-05-06",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -7087,13 +7012,12 @@
],
"publicationDate": "2021-05-22",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -7164,9 +7088,7 @@
],
"publicationDate": "2015-07-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -7228,10 +7150,10 @@
"jinasuh"
],
"publicationDate": "2021-04-14",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -7293,9 +7215,7 @@
],
"publicationDate": "2021-04-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -7361,10 +7281,10 @@
"jinasuh"
],
"publicationDate": "2021-04-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -7429,13 +7349,12 @@
],
"publicationDate": "2021-01-01",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -7582,13 +7501,12 @@
],
"publicationDate": "2021-08-12",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -7922,10 +7840,10 @@
"margaretli"
],
"publicationDate": "2021-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8052,13 +7970,12 @@
],
"publicationDate": "2021-07-09",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"exclusionReview": {
"reviewedOn": "2026-09-09",
@@ -8123,10 +8040,10 @@
"margaretli"
],
"publicationDate": "2021-07-26",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8184,10 +8101,10 @@
"innalin"
],
"publicationDate": "2021-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"innalin"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8257,10 +8174,10 @@
"jinasuh"
],
"publicationDate": "2021-09-28",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8328,10 +8245,10 @@
"innalin"
],
"publicationDate": "2021-08-16",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"innalin"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8390,9 +8307,7 @@
],
"publicationDate": "2016-06-23",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8460,13 +8375,12 @@
],
"publicationDate": "2024-05-28",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -8547,13 +8461,12 @@
],
"publicationDate": "2021-09-17",
"memberPersonIds": [
+ "jinasuh",
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4309564255"
},
@@ -8616,10 +8529,10 @@
"jinasuh"
],
"publicationDate": "2021-09-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8691,10 +8604,10 @@
"jinasuh"
],
"publicationDate": "2021-10-22",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8758,13 +8671,12 @@
],
"publicationDate": "2022-05-31",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -8909,9 +8821,7 @@
],
"publicationDate": "2021-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -8982,14 +8892,13 @@
],
"publicationDate": "2022-03-28",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4317757464"
},
@@ -9060,10 +8969,10 @@
"jinasuh"
],
"publicationDate": "2022-04-28",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -9284,13 +9193,12 @@
],
"publicationDate": "2021-11-10",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3213416073"
},
@@ -9355,10 +9263,10 @@
"innalin"
],
"publicationDate": "2020-08-23",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"innalin"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -9491,10 +9399,10 @@
"jinasuh"
],
"publicationDate": "2022-05-11",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -9558,13 +9466,12 @@
],
"publicationDate": "2022-05-26",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -9644,13 +9551,12 @@
],
"publicationDate": "2022-07-01",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reconciliationReview": {
"checkedOn": "2026-09-09",
@@ -9724,13 +9630,12 @@
],
"publicationDate": "2021-09-11",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3199811133"
},
@@ -9858,13 +9763,12 @@
],
"publicationDate": "2021-04-27",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3158487127"
},
@@ -9928,13 +9832,12 @@
],
"publicationDate": "2021-02-16",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3131477973"
},
@@ -10000,13 +9903,12 @@
],
"publicationDate": "2021-01-19",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3125287435"
},
@@ -10071,10 +9973,10 @@
"margaretli"
],
"publicationDate": "2020-10-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -10146,13 +10048,12 @@
],
"publicationDate": "2020-09-21",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3088597222"
},
@@ -10216,13 +10117,12 @@
],
"publicationDate": "2020-09-17",
"memberPersonIds": [
+ "ashishsharma",
"timalthoff"
],
- "uncertainPersonIds": [
- "ashishsharma"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3084867291"
},
@@ -10279,10 +10179,10 @@
"margaretli"
],
"publicationDate": "2022-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -10350,10 +10250,10 @@
"margaretli"
],
"publicationDate": "2020-02-07",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -10415,9 +10315,7 @@
],
"publicationDate": "2019-09-06",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -10556,9 +10454,7 @@
],
"publicationDate": "2018-10-31",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "margaretli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -10624,9 +10520,7 @@
],
"publicationDate": "2022-08-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -10764,10 +10658,10 @@
"margaretli"
],
"publicationDate": "2022-09-09",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -10832,13 +10726,12 @@
],
"publicationDate": "2020-08-28",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3082736604"
},
@@ -10907,10 +10800,10 @@
"jinasuh"
],
"publicationDate": "2022-08-16",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -10979,13 +10872,12 @@
],
"publicationDate": "2022-08-05",
"memberPersonIds": [
+ "margaretli",
"timalthoff"
],
- "uncertainPersonIds": [
- "margaretli"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -11196,13 +11088,12 @@
],
"publicationDate": "2022-10-07",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4366547794"
},
@@ -11266,13 +11157,12 @@
],
"publicationDate": "2021-11-10",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w3213416073"
},
@@ -11346,14 +11236,13 @@
],
"publicationDate": "2022-10-27",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4385572715"
},
@@ -11415,9 +11304,7 @@
],
"publicationDate": "2022-10-28",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -11544,9 +11431,7 @@
],
"publicationDate": "2022-10-08",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -11662,14 +11547,12 @@
],
"publicationDate": "2022-11-04",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"mikemerrill",
- "yasamansefidgar"
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -11739,13 +11622,12 @@
],
"publicationDate": "2022-11-19",
"memberPersonIds": [
+ "jinasuh",
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -11826,9 +11708,7 @@
],
"publicationDate": "2022-11-16",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -11900,10 +11780,10 @@
"jinasuh"
],
"publicationDate": "2022-10-18",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -12149,14 +12029,13 @@
],
"publicationDate": "2023-01-23",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -12236,9 +12115,7 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -12301,9 +12178,7 @@
],
"publicationDate": "2023-04-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -12398,11 +12273,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "yasamansefidgar"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"reconciliationReview": {
"checkedOn": "2026-09-09",
@@ -12480,9 +12353,7 @@
],
"publicationDate": "2022-11-20",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -12551,9 +12422,7 @@
],
"publicationDate": "2023-02-23",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -12695,9 +12564,7 @@
],
"publicationDate": "2023-03-13",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -12763,9 +12630,7 @@
],
"publicationDate": "2023-03-13",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -12835,9 +12700,7 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -12903,9 +12766,7 @@
],
"publicationDate": "2023-03-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -12975,10 +12836,7 @@
],
"publicationDate": "2023-03-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh",
- "yasamansefidgar"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13047,13 +12905,12 @@
],
"publicationDate": "2023-03-24",
"memberPersonIds": [
+ "margaretli",
"timalthoff"
],
- "uncertainPersonIds": [
- "margaretli"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -13142,9 +12999,7 @@
],
"publicationDate": "2023-04-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13208,13 +13063,12 @@
],
"publicationDate": "2023-04-19",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -13301,10 +13155,7 @@
],
"publicationDate": "2023-04-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh",
- "yasamansefidgar"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13375,9 +13226,7 @@
],
"publicationDate": "2023-05-03",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13448,13 +13297,12 @@
],
"publicationDate": "2023-05-04",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4385572158"
},
@@ -13518,9 +13366,7 @@
],
"publicationDate": "2023-05-13",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13646,9 +13492,7 @@
],
"publicationDate": "2023-06-12",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -13720,9 +13564,7 @@
],
"publicationDate": "2023-05-25",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -13805,10 +13647,10 @@
"margaretli"
],
"publicationDate": "2023-06-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13878,10 +13720,10 @@
"margaretli"
],
"publicationDate": "2023-07-11",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -13950,9 +13792,7 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -14028,14 +13868,13 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -14141,14 +13980,13 @@
],
"publicationDate": "2022-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -14234,13 +14072,12 @@
],
"publicationDate": "2023-09-18",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4396832182"
},
@@ -14308,13 +14145,12 @@
],
"publicationDate": "2023-09-19",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4396832076"
},
@@ -14380,9 +14216,7 @@
],
"publicationDate": "2023-09-28",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -14526,10 +14360,10 @@
"margaretli"
],
"publicationDate": "2023-10-16",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -14594,9 +14428,7 @@
],
"publicationDate": "2023-10-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -14662,10 +14494,10 @@
"margaretli"
],
"publicationDate": "2023-10-24",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -14732,13 +14564,12 @@
],
"publicationDate": "2023-10-24",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4396832979"
},
@@ -14792,9 +14623,7 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "deniznazarova"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -14876,10 +14705,10 @@
"margaretli"
],
"publicationDate": "2023-11-21",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -14940,9 +14769,7 @@
],
"publicationDate": "2023-11-20",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15007,9 +14834,7 @@
],
"publicationDate": "2023-11-25",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15076,9 +14901,7 @@
],
"publicationDate": "2023-11-24",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -15152,9 +14975,7 @@
],
"publicationDate": "2023-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15223,9 +15044,7 @@
],
"publicationDate": "2023-12-12",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15306,14 +15125,13 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -15396,9 +15214,7 @@
],
"publicationDate": "2024-01-11",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15467,9 +15283,7 @@
],
"publicationDate": "2023-09-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15538,9 +15352,7 @@
],
"publicationDate": "2023-09-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15609,9 +15421,7 @@
],
"publicationDate": "2023-09-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15684,9 +15494,7 @@
],
"publicationDate": "2024-01-17",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -15754,10 +15562,10 @@
"margaretli"
],
"publicationDate": "2024-01-19",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -15958,13 +15766,12 @@
],
"publicationDate": "2024-01-29",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4415250179"
},
@@ -16184,9 +15991,7 @@
],
"publicationDate": "2024-02-09",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -16261,15 +16066,13 @@
],
"publicationDate": "2024-02-19",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
"innalin",
- "jinasuh"
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4402667122"
},
@@ -16332,10 +16135,10 @@
"advaitbhat"
],
"publicationDate": "2024-03-15",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -16489,14 +16292,13 @@
],
"publicationDate": "2024-03-17",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
+ "timalthoff",
"xinyizhou"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -16572,10 +16374,10 @@
"margaretli"
],
"publicationDate": "2024-03-21",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -16644,9 +16446,7 @@
],
"publicationDate": "2024-03-24",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -16712,9 +16512,7 @@
],
"publicationDate": "2024-03-26",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -16780,9 +16578,7 @@
],
"publicationDate": "2024-04-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -16869,9 +16665,7 @@
],
"publicationDate": "2024-04-15",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -16942,14 +16736,13 @@
],
"publicationDate": "2024-04-17",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"mikemerrill",
+ "timalthoff",
"vinayakgupta"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4404782449"
},
@@ -17009,9 +16802,7 @@
],
"publicationDate": "2024-04-29",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17082,10 +16873,7 @@
],
"publicationDate": "2024-04-17",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh",
- "yasamansefidgar"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17213,9 +17001,7 @@
],
"publicationDate": "2024-04-17",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17312,14 +17098,12 @@
],
"publicationDate": "2024-05-03",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "jinasuh"
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -17397,13 +17181,12 @@
],
"publicationDate": "2024-05-11",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -17501,13 +17284,12 @@
],
"publicationDate": "2024-05-11",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -17607,14 +17389,13 @@
],
"publicationDate": "2024-05-11",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
- "innalin"
+ "innalin",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -17694,9 +17475,7 @@
],
"publicationDate": "2024-05-11",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17782,10 +17561,10 @@
"margaretli"
],
"publicationDate": "2022-11-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17851,10 +17630,10 @@
"margaretli"
],
"publicationDate": "2023-11-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -17921,9 +17700,7 @@
],
"publicationDate": "2024-05-24",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -18210,13 +17987,12 @@
],
"publicationDate": "2024-06-10",
"memberPersonIds": [
+ "mikemerrill",
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w7122726170"
},
@@ -18435,14 +18211,13 @@
],
"publicationDate": "2024-06-22",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"mikemerrill",
+ "timalthoff",
"vinayakgupta"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4415797292"
},
@@ -18509,10 +18284,10 @@
"advaitbhat"
],
"publicationDate": "2024-07-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -18576,10 +18351,10 @@
"margaretli"
],
"publicationDate": "2024-07-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -18656,9 +18431,7 @@
],
"publicationDate": "2024-11-11",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -18729,11 +18502,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"exclusionReview": {
"reviewedOn": "2026-09-09",
@@ -18813,9 +18584,7 @@
],
"publicationDate": "2024-07-21",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -19315,11 +19084,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "yasamansefidgar"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"reconciliationReview": {
"checkedOn": "2026-09-09",
@@ -19397,9 +19164,7 @@
],
"publicationDate": "2024-08-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -19461,10 +19226,10 @@
"deniznazarova"
],
"publicationDate": "2024-08-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"deniznazarova"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -19535,11 +19300,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"exclusionReview": {
"reviewedOn": "2026-09-09",
@@ -19633,15 +19396,13 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"ashishsharma",
"innalin",
- "jinasuh"
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -19723,9 +19484,7 @@
],
"publicationDate": "2024-06-16",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -19799,9 +19558,7 @@
],
"publicationDate": "2024-10-14",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -19870,9 +19627,7 @@
],
"publicationDate": "2024-10-12",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -19939,9 +19694,7 @@
],
"publicationDate": "2024-10-14",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -20096,11 +19849,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "jinasuh"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"exclusionReview": {
"reviewedOn": "2026-09-09",
@@ -20225,9 +19976,7 @@
],
"publicationDate": "2024-10-24",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20292,9 +20041,7 @@
],
"publicationDate": "2024-10-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20357,9 +20104,7 @@
],
"publicationDate": "2024-11-03",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20432,9 +20177,7 @@
],
"publicationDate": "2024-10-18",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20511,9 +20254,7 @@
],
"publicationDate": "2024-11-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20586,9 +20327,7 @@
],
"publicationDate": "2024-11-22",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20656,10 +20395,10 @@
"margaretli"
],
"publicationDate": "2024-11-26",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -20769,14 +20508,13 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"kengu",
- "mikemerrill"
+ "mikemerrill",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -20877,14 +20615,13 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"mikemerrill",
+ "timalthoff",
"vinayakgupta"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -21042,9 +20779,7 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -21115,10 +20850,10 @@
"margaretli"
],
"publicationDate": "2024-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -21196,9 +20931,7 @@
],
"publicationDate": "2024-12-10",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -21292,14 +21025,13 @@
],
"publicationDate": "2024-08-19",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"kengu",
- "mikemerrill"
+ "mikemerrill",
+ "timalthoff"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4404781154"
},
@@ -21358,10 +21090,10 @@
"jinasuh"
],
"publicationDate": "2026-01-21",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -21443,10 +21175,10 @@
"margaretli"
],
"publicationDate": "2024-12-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -21511,9 +21243,7 @@
],
"publicationDate": "2024-12-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -21579,13 +21309,12 @@
],
"publicationDate": "2025-01-24",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w4411121032"
},
@@ -21653,9 +21382,7 @@
],
"publicationDate": "2025-02-02",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -21742,13 +21469,12 @@
],
"publicationDate": "2025-02-11",
"memberPersonIds": [
+ "advaitbhat",
"timalthoff"
],
- "uncertainPersonIds": [
- "advaitbhat"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -21825,10 +21551,10 @@
"advaitbhat"
],
"publicationDate": "2025-02-21",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -21892,9 +21618,7 @@
],
"publicationDate": "2024-09-15",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -21970,9 +21694,7 @@
],
"publicationDate": "2025-04-25",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22051,9 +21773,7 @@
],
"publicationDate": "2025-05-02",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22130,9 +21850,7 @@
],
"publicationDate": "2025-05-06",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22196,10 +21914,10 @@
"advaitbhat"
],
"publicationDate": "2025-05-19",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -22265,9 +21983,7 @@
],
"publicationDate": "2025-05-02",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22332,13 +22048,12 @@
],
"publicationDate": "2025-06-07",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -22415,9 +22130,7 @@
],
"publicationDate": "2025-06-20",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -22491,9 +22204,7 @@
],
"publicationDate": "2025-06-23",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -22571,9 +22282,7 @@
],
"publicationDate": "2025-06-23",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22638,9 +22347,7 @@
],
"publicationDate": "2025-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -22793,10 +22500,10 @@
"margaretli"
],
"publicationDate": "2025-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23063,9 +22770,7 @@
],
"publicationDate": "2025-08-08",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23126,9 +22831,7 @@
],
"publicationDate": "2025-04-27",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23186,10 +22889,10 @@
"advaitbhat"
],
"publicationDate": "2025-08-07",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -23252,10 +22955,10 @@
"jinasuh"
],
"publicationDate": "2026-04-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23324,9 +23027,7 @@
],
"publicationDate": "2025-09-19",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23399,9 +23100,7 @@
],
"publicationDate": "2025-10-16",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23466,13 +23165,12 @@
],
"publicationDate": "2025-10-16",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -23557,9 +23255,7 @@
],
"publicationDate": "2025-10-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23628,9 +23324,7 @@
],
"publicationDate": "2025-10-17",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23693,9 +23387,7 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -23761,9 +23453,7 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "chengli"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -23832,14 +23522,13 @@
],
"publicationDate": "2024-01-01",
"memberPersonIds": [
- "timalthoff"
- ],
- "uncertainPersonIds": [
"mikemerrill",
+ "timalthoff",
"vinayakgupta"
],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -24062,9 +23751,7 @@
],
"publicationDate": "2025-11-05",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24191,10 +23878,10 @@
"margaretli"
],
"publicationDate": "2025-02-26",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24314,10 +24001,10 @@
"deniznazarova"
],
"publicationDate": "2025-05-28",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"deniznazarova"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24424,13 +24111,12 @@
],
"publicationDate": "2025-06-05",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -24543,10 +24229,10 @@
"margaretli"
],
"publicationDate": "2025-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24621,9 +24307,7 @@
],
"publicationDate": "2025-03-06",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24684,9 +24368,7 @@
],
"publicationDate": "2025-03-28",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -24755,10 +24437,10 @@
"chengli"
],
"publicationDate": "2025-09-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"chengli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -24977,13 +24659,12 @@
],
"publicationDate": "2026-05-25",
"memberPersonIds": [
+ "galenweld",
"timalthoff"
],
- "uncertainPersonIds": [
- "galenweld"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -25139,10 +24820,10 @@
"margaretli"
],
"publicationDate": "2025-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -25213,13 +24894,12 @@
],
"publicationDate": "2025-12-02",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -25305,9 +24985,7 @@
],
"publicationDate": "2025-04-29",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -25403,13 +25081,12 @@
],
"publicationDate": "2025-01-01",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -25599,9 +25276,7 @@
],
"publicationDate": "2025-12-18",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -25671,10 +25346,10 @@
"jinasuh"
],
"publicationDate": "2026-07-15",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -25738,10 +25413,10 @@
"advaitbhat"
],
"publicationDate": "2025-12-23",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -25806,10 +25481,10 @@
"advaitbhat"
],
"publicationDate": "2025-12-24",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -25873,10 +25548,10 @@
"advaitbhat"
],
"publicationDate": "2025-12-24",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -25940,10 +25615,10 @@
"advaitbhat"
],
"publicationDate": "2025-12-23",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26017,9 +25692,7 @@
],
"publicationDate": "2025-12-29",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26093,9 +25766,7 @@
],
"publicationDate": "2025-12-29",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "jinasuh"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26156,10 +25827,10 @@
"jinasuh"
],
"publicationDate": "2026-01-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -26256,11 +25927,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -26339,9 +26008,7 @@
],
"publicationDate": "2025-12-14",
"memberPersonIds": [],
- "uncertainPersonIds": [
- "yigeyuan"
- ],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -26401,10 +26068,10 @@
"jinasuh"
],
"publicationDate": "2026-01-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26500,13 +26167,12 @@
],
"publicationDate": "2026-01-23",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w7170643724"
},
@@ -26575,10 +26241,10 @@
"jinasuh"
],
"publicationDate": "2026-02-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26651,10 +26317,10 @@
"jinasuh"
],
"publicationDate": "2026-02-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26719,10 +26385,10 @@
"yigeyuan"
],
"publicationDate": "2026-02-04",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"yigeyuan"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -26790,10 +26456,10 @@
"jinasuh"
],
"publicationDate": "2026-02-16",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -26859,10 +26525,10 @@
"margaretli"
],
"publicationDate": "2026-03-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -26931,10 +26597,10 @@
"margaretli"
],
"publicationDate": "2026-03-02",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27015,10 +26681,10 @@
"jinasuh"
],
"publicationDate": "2026-03-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27101,10 +26767,10 @@
"jinasuh"
],
"publicationDate": "2026-03-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27165,10 +26831,10 @@
"advaitbhat"
],
"publicationDate": "2026-03-11",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27233,10 +26899,10 @@
"advaitbhat"
],
"publicationDate": "2026-03-11",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27302,10 +26968,10 @@
"advaitbhat"
],
"publicationDate": "2026-03-11",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27424,10 +27090,10 @@
"jinasuh"
],
"publicationDate": "2026-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -27491,10 +27157,10 @@
"jinasuh"
],
"publicationDate": "2026-04-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -27560,10 +27226,10 @@
"jinasuh"
],
"publicationDate": "2026-04-09",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27632,10 +27298,10 @@
"jinasuh"
],
"publicationDate": "2026-04-09",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27696,10 +27362,10 @@
"advaitbhat"
],
"publicationDate": "2026-04-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"advaitbhat"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27767,10 +27433,10 @@
"jinasuh"
],
"publicationDate": "2026-04-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -27837,10 +27503,10 @@
"jinasuh"
],
"publicationDate": "2026-04-13",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -28037,13 +27703,12 @@
],
"publicationDate": "2026-05-20",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -28263,13 +27928,12 @@
],
"publicationDate": "2026-05-20",
"memberPersonIds": [
+ "innalin",
"timalthoff"
],
- "uncertainPersonIds": [
- "innalin"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"duplicateOf": "openalex-w7162039229"
},
@@ -28545,10 +28209,10 @@
"jinasuh"
],
"publicationDate": "2026-01-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -28623,10 +28287,10 @@
"jinasuh"
],
"publicationDate": "2026-06-23",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -28700,10 +28364,10 @@
"jinasuh"
],
"publicationDate": "2026-06-23",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -28772,11 +28436,9 @@
"memberPersonIds": [
"timalthoff"
],
- "uncertainPersonIds": [
- "mikemerrill"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "does-not-meet-rule",
+ "reason": "Fewer than 2 matching authors with possible publication-time lab membership; Tim alone does not qualify."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -28886,13 +28548,12 @@
],
"publicationDate": "2026-07-24",
"memberPersonIds": [
+ "kengu",
"timalthoff"
],
- "uncertainPersonIds": [
- "kengu"
- ],
- "status": "needs-membership-review",
- "reason": "Enough lab identities match, but publication-time membership needs confirmation."
+ "uncertainPersonIds": [],
+ "status": "meets-rule",
+ "reason": "At least 2 distinct coauthors were lab members in the publication year."
},
"reviewedOn": "2026-09-09",
"policyReview": {
@@ -28972,10 +28633,10 @@
"yigeyuan"
],
"publicationDate": "2026-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"yigeyuan"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -29043,10 +28704,10 @@
"jinasuh"
],
"publicationDate": "2026-07-27",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -29121,10 +28782,10 @@
"jinasuh"
],
"publicationDate": "2026-07-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -29199,10 +28860,10 @@
"jinasuh"
],
"publicationDate": "2026-07-30",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -29271,10 +28932,10 @@
"jinasuh"
],
"publicationDate": "2026-07-27",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
},
@@ -29348,11 +29009,11 @@
"mickelliu"
],
"publicationDate": "2025-01-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"margaretli",
"mickelliu"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -29416,10 +29077,10 @@
"jinasuh"
],
"publicationDate": "2026-08-05",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -29491,10 +29152,10 @@
"jinasuh"
],
"publicationDate": "2026-08-25",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -29566,10 +29227,10 @@
"jinasuh"
],
"publicationDate": "2026-08-25",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
@@ -29635,10 +29296,10 @@
"jinasuh"
],
"publicationDate": "2026-09-01",
- "memberPersonIds": [],
- "uncertainPersonIds": [
+ "memberPersonIds": [
"jinasuh"
],
+ "uncertainPersonIds": [],
"status": "does-not-meet-rule",
"reason": "The required PI author is not on this paper."
}
diff --git a/maintenance/scholar-profiles.json b/maintenance/scholar-profiles.json
index d9a0ba5..ce1a146 100644
--- a/maintenance/scholar-profiles.json
+++ b/maintenance/scholar-profiles.json
@@ -69,6 +69,16 @@
"sourceUrl": "https://innalin.notion.site/Inna-Wanyin-Lin-0f659924dd034fb18a1059393459a25e",
"evidence": "Linked from personal Notion homepage under Inna Wanyin Lin."
},
+ {
+ "personId": "rongwudannyxu",
+ "name": "Rongwu Danny Xu",
+ "googleScholarId": "HyjNrDMAAAAJ",
+ "googleScholarUrl": "https://scholar.google.com/citations?user=HyjNrDMAAAAJ",
+ "status": "verified",
+ "checkedOn": "2026-09-10",
+ "sourceUrl": "https://rongwuxu.com/",
+ "evidence": "Linked from personal homepage. OpenAlex identity anchored to the ACL 2024 Earth is Flat paper and EMNLP 2024 Knowledge Conflicts survey (including their arXiv versions); retain per-paper verification for other provider matches. Scholar retrieval was stale, so this confirms identity, not current publication coverage."
+ },
{
"personId": "margaretli",
"name": "Margaret Li",
diff --git a/scripts/check-export.py b/scripts/check-export.py
index 856d0d9..65207d9 100644
--- a/scripts/check-export.py
+++ b/scripts/check-export.py
@@ -14,6 +14,8 @@ def check(root=ROOT):
fragment_links = []
class Links(HTMLParser):
def handle_starttag(self, tag, attrs):
+ if tag == 'main' and dict(attrs).get('id') == 'main' and dict(attrs).get('tabindex') != '-1':
+ errors.add(f'{self.file.relative_to(exported)}: skip-link target must accept keyboard focus')
if tag in ('h1','h2','h3','h4','h5','h6'):
level = int(tag[1])
if self.heading_level and level > self.heading_level + 1:
@@ -50,6 +52,16 @@ def handle_starttag(self, tag, attrs):
for name in required:
if not (exported / name).is_file():
errors.add('Missing required export: ' + name)
+ pages = json.loads((root / 'content/pages.json').read_text())
+ for route, field, collection, destination in [
+ ('research', 'research', 'projects', '/publications/'),
+ ('pictures', 'pictures', 'gallery', '/team/'),
+ ('aboutwebsite', 'about', None, '/')]:
+ records = json.loads((root / f'content/{collection}.json').read_text()) if collection else []
+ page = exported / route / 'index.html'
+ if not pages[field].strip() and not records:
+ if not page.exists() or f'content="0;url={destination}"' not in page.read_text():
+ errors.add(f'Empty legacy page must lead to useful content: /{route}/')
signup = exported / 'idiofid/index.html'
if signup.exists():
settings = json.loads((root / 'content/site.json').read_text())
diff --git a/scripts/discovery.py b/scripts/discovery.py
index c3c282b..ef06c46 100644
--- a/scripts/discovery.py
+++ b/scripts/discovery.py
@@ -12,7 +12,7 @@
from urllib.error import HTTPError, URLError
from urllib.parse import urlencode
from urllib.request import Request, urlopen
-from publication_policy import assess, validate_policy
+from publication_policy import assess, load_people, validate_policy
from review_duplicates import group_duplicates
from render_recent_review import render as render_recent
@@ -270,7 +270,7 @@ def run(root=ROOT, fixture=None, today=None, client=None):
print('Discovery is disabled. Configure verified identities before enabling it.')
return
authors = read(root / 'maintenance/authors.json')
- people = read(root / 'content/people.json')
+ people = load_people(root)
validate_authors(authors, people)
policy_path = root / 'maintenance/publication-policy.json'
policy = read(policy_path) if policy_path.exists() else None
diff --git a/scripts/export-aliases.mjs b/scripts/export-aliases.mjs
index 9ea5daa..0959d67 100644
--- a/scripts/export-aliases.mjs
+++ b/scripts/export-aliases.mjs
@@ -1,10 +1,18 @@
// Next's static export cannot use server redirects. Preserve legacy .html entry points.
import fs from 'node:fs';
const site = JSON.parse(fs.readFileSync('content/site.json', 'utf8'));
+const pages = JSON.parse(fs.readFileSync('content/pages.json', 'utf8'));
+const projects = JSON.parse(fs.readFileSync('content/projects.json', 'utf8'));
+const gallery = JSON.parse(fs.readFileSync('content/gallery.json', 'utf8'));
const aliases = {
- '/aboutwebsite.html': '/aboutwebsite/',
+ '/aboutwebsite.html': pages.about.trim() ? '/aboutwebsite/' : '/',
'/allnews.html': '/allnews/',
'/vacancies.html': '/vacancies/',
+ ...(!pages.research.trim() && !projects.length
+ ? { '/research/index.html': '/publications/' }
+ : {}),
+ ...(!pages.pictures.trim() && !gallery.length ? { '/pictures/index.html': '/team/' } : {}),
+ ...(!pages.about.trim() ? { '/aboutwebsite/index.html': '/' } : {}),
};
for (const [from, to] of Object.entries(aliases)) {
if (!fs.existsSync(`out${to}index.html`)) throw new Error(`Missing alias target ${to}`);
diff --git a/scripts/publication_pipeline.py b/scripts/publication_pipeline.py
index 82dec69..1a83848 100644
--- a/scripts/publication_pipeline.py
+++ b/scripts/publication_pipeline.py
@@ -6,7 +6,7 @@
import subprocess
from discovery import ROOT, read, report, run as collect, save
-from publication_policy import assess, validate_policy
+from publication_policy import assess, load_people, validate_policy
from review import decide
from review_duplicates import group_duplicates
from render_recent_review import render as render_recent
@@ -80,7 +80,7 @@ def print_summary(root=ROOT, as_json=False):
def reassess(root=ROOT):
"""Apply the current policy to saved observations without contacting a provider."""
queue = read(root / 'maintenance/review.json')
- people = read(root / 'content/people.json')
+ people = load_people(root)
policy = read(root / 'maintenance/publication-policy.json')
validate_policy(policy, people)
outdated_accepted = [c['id'] for c in queue['candidates']
diff --git a/scripts/publication_policy.py b/scripts/publication_policy.py
index 9fb6977..88d35d6 100644
--- a/scripts/publication_policy.py
+++ b/scripts/publication_policy.py
@@ -1,8 +1,74 @@
"""Explain and enforce lab relevance using verified identities, never name guesses."""
from datetime import date
+import json
import re
+def load_people(root):
+ """Use the reviewed year evidence without copying it into public profile data."""
+ people = json.loads((root / 'content/people.json').read_text())
+ path = root / 'maintenance/membership-evidence.json'
+ if not path.exists():
+ return people
+ evidence = json.loads(path.read_text())
+ if evidence.get('datePrecision') != 'year':
+ raise ValueError('Membership evidence must use year precision')
+ by_id = {p['id']: p for p in people}
+ seen = set()
+ for record in evidence['records']:
+ pid = record.get('personId')
+ if pid is None:
+ continue # Alumni-only evidence does not create a public identity.
+ if pid not in by_id or pid in seen:
+ raise ValueError('Unknown or duplicate membership identity: ' + pid)
+ seen.add(pid)
+ periods = record.get('periods', [])
+ for period in periods:
+ for field in ('start', 'end'):
+ value = period.get(field)
+ if value is not None and (not isinstance(value, str)
+ or not re.fullmatch(r'[1-9]\d{3}', value)):
+ raise ValueError('Membership boundaries must be YYYY or null: ' + pid)
+ start, end = period.get('start'), period.get('end')
+ state = period.get('endStatus')
+ if (state not in ('known', 'ongoing', 'unknown')
+ or (state == 'known') != (end is not None)
+ or (start and end and start > end)):
+ raise ValueError('Invalid membership interval: ' + pid)
+ if not period.get('sourceIds') or not set(period['sourceIds']) <= evidence['sources'].keys():
+ raise ValueError('Membership interval needs recorded evidence: ' + pid)
+ # Omitted or disputed source claims must not be promoted to selected dates.
+ by_id[pid]['memberships'] = (periods if record.get('status') in
+ ('confirmed', 'reconstructed', 'partial') else [])
+ return people
+
+
+def publication_year(value):
+ if isinstance(value, int) and not isinstance(value, bool) and 1000 <= value <= 9999:
+ return value
+ if isinstance(value, str) and re.fullmatch(r'[1-9]\d{3}', value):
+ return int(value)
+ try:
+ return date.fromisoformat(value).year
+ except (TypeError, ValueError):
+ return None
+
+
+def membership_in_year(period, year):
+ """Return True, False or None (unresolved); a missing end is not proof of continuity."""
+ start, end = publication_year(period.get('start')), publication_year(period.get('end'))
+ if (start is not None and year < start) or (end is not None and year > end):
+ return False
+ if start is None:
+ return None
+ if end is not None or period.get('endStatus') == 'ongoing':
+ return True
+ # Retain support for the original exact-date schema's open intervals.
+ if 'endStatus' not in period and len(str(period.get('start', ''))) == 10:
+ return True
+ return None
+
+
def validate_policy(policy, people):
if (type(policy.get('version')) is not int
or policy['version'] < 1
@@ -18,13 +84,12 @@ def validate_policy(policy, people):
def assess(work, matched, people, policy):
matched = sorted(set(matched))
+ published_value = work.get('publication_date') or work.get('publication_year')
result = {'policyVersion': policy['version'], 'matchedPersonIds': matched,
- 'publicationDate': work.get('publication_date'), 'memberPersonIds': [],
+ 'publicationDate': str(published_value) if published_value is not None else None,
+ 'memberPersonIds': [],
'uncertainPersonIds': []}
- try:
- published = date.fromisoformat(work.get('publication_date') or '')
- except ValueError:
- published = None
+ published = publication_year(published_value)
by_id = {p['id']: p for p in people}
for pid in matched:
if pid == policy['piPersonId']:
@@ -33,17 +98,19 @@ def assess(work, matched, people, policy):
periods = by_id.get(pid, {}).get('memberships')
if not periods or published is None:
result['uncertainPersonIds'].append(pid)
- elif any(date.fromisoformat(m['start']) <= published
- and (not m.get('end') or published <= date.fromisoformat(m['end']))
- for m in periods):
- result['memberPersonIds'].append(pid)
+ else:
+ states = [membership_in_year(m, published) for m in periods]
+ if True in states:
+ result['memberPersonIds'].append(pid)
+ elif None in states:
+ result['uncertainPersonIds'].append(pid)
confirmed = len(result['memberPersonIds'])
possible = confirmed + len(result['uncertainPersonIds'])
minimum = policy['minimumLabAuthors']
if policy['requirePiAuthor'] and policy['piPersonId'] not in matched:
status, reason = 'does-not-meet-rule', 'The required PI author is not on this paper.'
elif confirmed >= minimum:
- status, reason = 'meets-rule', f'At least {minimum} distinct coauthors were lab members on the publication date.'
+ status, reason = 'meets-rule', f'At least {minimum} distinct coauthors were lab members in the publication year.'
elif possible >= minimum:
status, reason = 'needs-membership-review', 'Enough lab identities match, but publication-time membership needs confirmation.'
else:
@@ -90,3 +157,20 @@ def acceptance_review(candidate, person_ids, policy, override_reason=None, evide
if override_reason:
review['overrideReason'] = override_reason.strip()
return review
+
+
+def validate_recorded_review(candidate, policy):
+ """A historical human decision keeps its original assessment when evidence improves."""
+ recorded = candidate.get('policyReview') or {}
+ status = recorded.get('labRelevanceStatus')
+ if status not in ('meets-rule', 'needs-membership-review', 'does-not-meet-rule'):
+ raise ValueError('Accepted candidate has an invalid historical assessment')
+ reviewed_candidate = {**candidate, 'labRelevance': {
+ 'policyVersion': recorded.get('policyVersion'), 'status': status}}
+ expected = acceptance_review(reviewed_candidate, recorded.get('personIds'), policy,
+ recorded.get('overrideReason'), recorded.get('evidenceUrls'))
+ if any(recorded.get(field) != value for field, value in expected.items()):
+ raise ValueError('Accepted candidate has an invalid policy review')
+ if recorded.get('reviewedOn') != candidate.get('reviewedOn'):
+ raise ValueError('Accepted candidate policy review date does not match its decision')
+ date.fromisoformat(recorded['reviewedOn'])
diff --git a/scripts/review.py b/scripts/review.py
index 084a2af..210d404 100644
--- a/scripts/review.py
+++ b/scripts/review.py
@@ -7,7 +7,7 @@
from discovery import ROOT, MANAGED_FIELDS, read, save, doi, fingerprint, report
from review_duplicates import group_duplicates
from render_recent_review import render as render_recent
-from publication_policy import acceptance_review, validate_assessment, validate_policy
+from publication_policy import acceptance_review, load_people, validate_assessment, validate_policy
def decide(root, cid, decision, person_ids=None, target_id=None, until=None,
@@ -39,7 +39,7 @@ def decide(root, cid, decision, person_ids=None, target_id=None, until=None,
'observed': candidate['observed'], 'personIds': candidate['matchedPersonIds']})
if candidate['fingerprint'] != expected_fingerprint:
raise ValueError('Candidate source or identity matches were edited; collect again before accepting')
- people = read(root / 'content/people.json')
+ people = load_people(root)
known = {p['id'] for p in people}
if not person_ids or len(person_ids) != len(set(person_ids)) or not set(person_ids) <= known:
raise ValueError('Acceptance requires explicitly reviewed --person IDs')
diff --git a/scripts/test-skeleton.py b/scripts/test-skeleton.py
index 717f52e..dd15df5 100644
--- a/scripts/test-skeleton.py
+++ b/scripts/test-skeleton.py
@@ -41,6 +41,7 @@ def main():
write(root,'gallery',[{'id':'fixture-photo','image':people[0]['image'],'alt':'Fixture photo','caption':'Fixture caption'}])
# Webpack supports a shared dependency symlink outside this temporary project root.
build(root)
+ subprocess.run(['node', 'scripts/export-aliases.mjs'], cwd=root, check=True)
checks = {
'news/index.html':['Fixture news','Fixture award'],
'awards/index.html':['Fixture award'],
@@ -57,6 +58,12 @@ def main():
if value not in html: raise SystemExit(f'{name}: missing {value}')
if 'Hidden closed opening' in (root/'out/join/index.html').read_text():
raise SystemExit('Closed opportunity rendered')
+ sitemap = (root/'out/sitemap.xml').read_text()
+ for route in ['research', 'pictures']:
+ if f'/{route}/' not in sitemap:
+ raise SystemExit(f'Populated {route} page missing from sitemap')
+ if 'http-equiv="refresh"' in (root/f'out/{route}/index.html').read_text():
+ raise SystemExit(f'Populated {route} page was replaced with a redirect')
if (root/'out/maintenance').exists():
raise SystemExit('Review queue leaked to export')
write(root,'opportunities',[{'id':'fixture-closed','title':'Hidden closed opening','url':'https://example.org/closed',**common_opportunity,'status':'closed'}])
diff --git a/scripts/validate-maintenance.py b/scripts/validate-maintenance.py
index de4e988..f459800 100644
--- a/scripts/validate-maintenance.py
+++ b/scripts/validate-maintenance.py
@@ -2,7 +2,8 @@
from datetime import date
import re
from discovery import ROOT, MANAGED_FIELDS, fingerprint, read, validate_authors, work_id
-from publication_policy import acceptance_review, validate_assessment, validate_policy
+from publication_policy import (acceptance_review, load_people, validate_assessment,
+ validate_policy, validate_recorded_review)
def validate(root=ROOT):
@@ -12,7 +13,7 @@ def validate(root=ROOT):
for field, maximum in [('maxRequests',1000),('lookbackDays',365),('reconcileDays',365),('maxRunAgeDays',365),('maxReviewAgeDays',365)]:
if type(config[field]) is not int or not 1 <= config[field] <= maximum:
raise ValueError('Invalid maintenance setting: ' + field)
- people = read(root / 'content/people.json')
+ people = load_people(root)
policy_path = root / 'maintenance/publication-policy.json'
if not policy_path.exists():
raise ValueError('Missing maintenance/publication-policy.json')
@@ -55,14 +56,7 @@ def validate(root=ROOT):
if not set(c['changes']) <= set(MANAGED_FIELDS) or not set(c['conflicts']) <= set(MANAGED_FIELDS):
raise ValueError('Unsupported proposed fields')
if c['status'] == 'accepted':
- recorded = c.get('policyReview') or {}
- expected = acceptance_review(c, recorded.get('personIds'), policy,
- recorded.get('overrideReason'), recorded.get('evidenceUrls'))
- if any(recorded.get(field) != value for field, value in expected.items()):
- raise ValueError('Accepted candidate has an invalid policy review')
- if recorded.get('reviewedOn') != c.get('reviewedOn'):
- raise ValueError('Accepted candidate policy review date does not match its decision')
- date.fromisoformat(recorded['reviewedOn'])
+ validate_recorded_review(c, policy)
by_id = {c['id']: c for c in queue['candidates']}
for c in queue['candidates']:
if c.get('duplicateOf'):
diff --git a/tests/content-model.test.mjs b/tests/content-model.test.mjs
index d317b2a..11c85a6 100644
--- a/tests/content-model.test.mjs
+++ b/tests/content-model.test.mjs
@@ -135,10 +135,10 @@ test('paper highlights use award dates, deduplicate papers and ignore individual
'Updated award title',
);
});
-test('explicit person links override name matching, including an empty list', () => {
+test('profile attribution requires explicit person links even when a name matches', () => {
const person = { id: 'p1', name: 'Ada Example' };
const paper = { authors: 'Ada Example' };
- assert.equal(paperBelongsTo(paper, person), true);
+ assert.equal(paperBelongsTo(paper, person), false);
assert.equal(paperBelongsTo({ ...paper, personIds: [] }, person), false);
assert.equal(filterPapers([{ ...paper, personIds: [] }], { person }).length, 0);
assert.equal(paperBelongsTo({ authors: 'Different Name', personIds: ['p1'] }, person), true);
@@ -233,14 +233,27 @@ test('article, conference and preprint types produce correct citation entries wi
);
});
-test('name aliases preserve legacy attribution without overriding explicit person links', () => {
+test('renamed people retain explicit attribution without guessing from aliases', () => {
const person = { id: 'deniznazarova', name: 'Deniz Nazar', aliases: ['Deniz Nazarova'] };
- const paper = { title: 'Test', authors: 'Deniz Nazarova', year: 2024 };
+ const paper = {
+ title: 'Test',
+ authors: 'Deniz Nazarova',
+ year: 2024,
+ personIds: ['deniznazarova'],
+ };
assert.equal(paperBelongsTo(paper, person), true);
assert.equal(filterPapers([paper], { person }).length, 1);
assert.equal(paperBelongsTo({ ...paper, personIds: [] }, person), false);
});
+test('publications cannot silently fall back to name-based profile attribution', () => {
+ const data = fixture();
+ delete data.publications[0].personIds;
+ assert.match(validateContent(data).join(), /explicit personIds/);
+ data.publications[0].personIds = [];
+ assert.deepEqual(validateContent(data), []);
+});
+
test('people highlights exclude paper and team awards and select the latest honors', () => {
const awards = [
{ id: 'old', date: '2024', title: 'Older honor', personIds: ['p'] },
diff --git a/tests/test_publication_policy.py b/tests/test_publication_policy.py
index 0c6a73b..01b2a3e 100644
--- a/tests/test_publication_policy.py
+++ b/tests/test_publication_policy.py
@@ -1,9 +1,13 @@
import sys
+import copy
+import json
from pathlib import Path
+import tempfile
import unittest
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / 'scripts'))
-from publication_policy import acceptance_review, assess, validate_assessment
+from publication_policy import (acceptance_review, assess, load_people,
+ validate_assessment, validate_recorded_review)
POLICY = {'version': 2, 'piPersonId': 'tim', 'requirePiAuthor': True,
'minimumLabAuthors': 2, 'preprintPolicy': 'include-labeled'}
@@ -17,6 +21,73 @@
class PolicyTests(unittest.TestCase):
+ def test_inclusive_year_boundaries_and_returning_membership_gap(self):
+ people = [{'id': 'returning', 'memberships': [
+ {'start': '2019', 'end': '2022', 'endStatus': 'known'},
+ {'start': '2026', 'end': None, 'endStatus': 'ongoing'}]}]
+ for published, expected in [('2018-12-31', 'does-not-meet-rule'),
+ ('2019-01-01', 'meets-rule'),
+ ('2022-12-31', 'meets-rule'),
+ ('2023', 'does-not-meet-rule'),
+ ('2025-12-31', 'does-not-meet-rule'),
+ ('2026', 'meets-rule')]:
+ with self.subTest(published=published):
+ self.assertEqual(assess({'publication_date': published},
+ ['tim', 'returning'], people, POLICY)['status'], expected)
+ self.assertEqual(assess({'publication_year': 2026}, ['tim', 'returning'],
+ people, POLICY)['status'], 'meets-rule')
+
+ def test_unknown_end_does_not_mean_ongoing_and_missing_year_requires_review(self):
+ people = [{'id': 'past', 'status': 'member', 'memberships': [
+ {'start': '2019', 'end': None, 'endStatus': 'unknown'}]}]
+ self.assertEqual(assess(WORK, ['tim', 'past'], people, POLICY)['status'],
+ 'needs-membership-review')
+ self.assertEqual(assess({'publication_date': '2018'}, ['tim', 'past'], people,
+ POLICY)['status'], 'does-not-meet-rule')
+ self.assertEqual(assess({'publication_date': '2025-02-30'}, ['tim', 'past'], people,
+ POLICY)['status'], 'needs-membership-review')
+
+ def test_reviewed_evidence_overrides_unselected_historical_claims(self):
+ with tempfile.TemporaryDirectory() as directory:
+ root = Path(directory)
+ (root / 'content').mkdir()
+ (root / 'maintenance').mkdir()
+ (root / 'content/people.json').write_text(json.dumps([
+ {'id': 'known'}, {'id': 'omitted', 'memberships': [{'start': '2019-01-01'}]}]))
+ evidence = {'datePrecision': 'year', 'sources': {'cv': {'url': 'https://example.org/cv'}},
+ 'records': [
+ {'personId': 'known', 'status': 'confirmed', 'periods': [
+ {'start': '2019', 'end': '2022', 'endStatus': 'known',
+ 'sourceIds': ['cv']}]},
+ {'personId': 'omitted', 'status': 'omitted', 'periods': [],
+ 'historicalSourceClaims': [{'reportedPeriod': '2019–2022'}]}]}
+ path = root / 'maintenance/membership-evidence.json'
+ path.write_text(json.dumps(evidence))
+ people = load_people(root)
+ self.assertEqual(people[0]['memberships'][0]['start'], '2019')
+ self.assertEqual(people[1]['memberships'], [])
+ self.assertEqual(assess(WORK, ['tim', 'omitted'], people, POLICY)['status'],
+ 'needs-membership-review')
+ evidence['records'][0]['periods'][0]['sourceIds'] = ['unknown-source']
+ path.write_text(json.dumps(evidence))
+ with self.assertRaisesRegex(ValueError, 'recorded evidence'):
+ load_people(root)
+
+ def test_reassessment_preserves_a_valid_historical_human_decision(self):
+ candidate = {'matchedPersonIds': ['one', 'tim'], 'identityReviewPersonIds': [],
+ 'labRelevance': {'policyVersion': 2, 'status': 'needs-membership-review'},
+ 'reviewedOn': '2026-09-09'}
+ candidate['policyReview'] = {**acceptance_review(
+ candidate, ['one', 'tim'], POLICY, 'Membership confirmed by maintainer',
+ ['https://example.org/evidence']), 'reviewedOn': candidate['reviewedOn']}
+ before = copy.deepcopy(candidate['policyReview'])
+ candidate['labRelevance']['status'] = 'meets-rule'
+ validate_recorded_review(candidate, POLICY)
+ self.assertEqual(candidate['policyReview'], before)
+ candidate['policyReview']['personIds'] = ['one']
+ with self.assertRaises(ValueError):
+ validate_recorded_review(candidate, POLICY)
+
def status(self, ids, work=WORK):
return assess(work, ids, PEOPLE, POLICY)['status']