A research briefing that calls every recently indexed record a new paper can quietly change the selection rule. Another small error is to turn a year/month date into the first day of that month.

Here is a small, offline Python example for preserving the evidence before giving metadata to an AI assistant. It uses only the standard library. It does not fetch full text, decide a systematic review's eligibility or infer a paper's first publication from a database timestamp.

We are the RigorMed team. The code below is a metadata teaching example, not a new scientific analysis or a customer result.

The source and the question

The excerpt is from the Crossref record for DOI 10.1198/000313006X152649, retrieved on November 3, 2026. The record title is The Difference Between “Significant” and “Not Significant” is not Itself Statistically Significant. This article examines its metadata, not its statistical argument.

That snapshot contains published, published-print and issued date-parts [2006, 11], and an indexed timestamp of 2026-11-03T01:54:07Z. The published-online field was absent. A live record may change after this snapshot.

Crossref documents separate from-pub-date and from-index-date filters. A publication window and an index-update window answer different questions. Choose one before collecting records, and preserve the other dates for review.

Run this locally

Save the following as date_evidence.py and run python3 date_evidence.py. The embedded excerpt avoids a network dependency. created, deposited and indexed are retained as separate metadata events; none is relabeled as publication.

import calendar import json record = { "DOI": "10.1198/000313006x152649", "published": {"date-parts": [[2006, 11]]}, "published-print": {"date-parts": [[2006, 11]]}, "issued": {"date-parts": [[2006, 11]]}, "created": {"date-parts": [[2006, 10, 11]], "date-time": "2006-10-11T19:51:43Z"}, "deposited": {"date-parts": [[2019, 4, 21]], "date-time": "2019-04-21T13:02:48Z"}, "indexed": {"date-parts": [[2026, 11, 3]], "date-time": "2026-11-03T01:54:07Z"}, } def describe(value): if value is None: return "missing", "unknown" parts = value.get("date-parts") if (not isinstance(parts, list) or len(parts) != 1 or not isinstance(parts[0], list)): raise ValueError("Expected one date-parts array; review other shapes") p = parts[0] if (not 1 <= len(p) <= 3 or any(type(n) is not int for n in p) or not 1 <= p[0] <= 9999): raise ValueError("Invalid date components") if len(p) >= 2 and not 1 <= p[1] <= 12: raise ValueError("Invalid month") if len(p) == 3 and not 1 <= p[2] <= calendar.monthrange(p[0], p[1])[1]: raise ValueError("Invalid day") precision = ("year", "month", "day")[len(p) - 1] label = str(p[0]) + "".join(f"-{n:02d}" for n in p[1:]) return label, precision fields = ("published", "published-print", "published-online", "issued", "created", "deposited", "indexed") print("field | date | precision | supplied timestamp") for field in fields: raw = record.get(field) label, precision = describe(raw) timestamp = raw.get("date-time", "not supplied") if raw else "not supplied" print(f"{field} | {label} | {precision} | {timestamp}") # Keep a machine-readable companion with the unmodified excerpt. with open("date-evidence.json", "w", encoding="utf-8") as output: json.dump({ "source": "https://api.crossref.org/works/10.1198%2F000313006X152649", "retrieved_date": "2026-11-03", "scope": "selected metadata fields, not the full API record", "record_excerpt": record, }, output, indent=2) 

Expected console output:

field | date | precision | supplied timestamp published | 2006-11 | month | not supplied published-print | 2006-11 | month | not supplied published-online | missing | unknown | not supplied issued | 2006-11 | month | not supplied created | 2006-10-11 | day | 2006-10-11T19:51:43Z deposited | 2019-04-21 | day | 2019-04-21T13:02:48Z indexed | 2026-11-03 | day | 2026-11-03T01:54:07Z 

The formatter preserves month precision. It rejects malformed dates instead of silently correcting them. It deliberately rejects date ranges or multiple date-parts arrays, which need a different, explicitly reviewed treatment. It prints supplied timestamps without inventing a time zone or deriving a publication date from them.

Hand the evidence to an AI assistant

Supply the raw excerpt, source, retrieval date and the actual briefing question. For example:

I need a briefing of papers published in the specified week, not records indexed in that week. Preserve date precision and distinguish publication fields from created, deposited and indexed. Return an evidence table with the raw field, value, supported interpretation and unresolved check. Do not add a missing day. Flag conflicting or missing dates for a publisher-page check; do not infer full-text access or study quality.

The output to review is the evidence table and its proposed inclusion decision. Check the raw field names first, then inspect the publisher's article/version history when first-publication timing matters. A missing online date in this record does not prove that no online edition existed. Nor do three matching publication-related fields constitute three independent sources.

For an incremental metadata synchronizer, the objective is different: Crossref recommends the index-date filter for catching record changes. Old works in such a feed are expected, not necessarily collection errors. Keep that technical synchronization rule separate from a literature review's publication window.

Limits and sources

This short script handles a declared subset of date-parts shapes. It does not reconcile online/print conflicts, validate timestamp consistency, distinguish corrections and retractions, or identify which study a changed record describes. Those checks need explicit rules and source review.

Sources read for the November 3 snapshot: