Skip to content

fix: add bounded OpenAlex and arXiv HTML fallbacks - #278

Open
djimit wants to merge 1 commit into
advaitpaliwal:mainfrom
djimit:codex/openalex-arxiv-fallback
Open

djimit wants to merge 1 commit into
advaitpaliwal:mainfrom
djimit:codex/openalex-arxiv-fallback

Conversation

@djimit

@djimit djimit commented Sep 9, 2026

Copy link
Copy Markdown

Summary\n\n- add bounded retry/backoff for transient OpenAlex 429/5xx responses\n- honor Retry-After with a capped delay\n- fall back to official arXiv HTML when PDF/full text is unavailable\n- sanitize HTML to usable research text and select preferred full-text candidates explicitly\n- add focused regression coverage\n\n## Validation\n\n- TAP version 13

Subtest: abstractFromInvertedIndex reconstructs OpenAlex abstracts

ok 1 - abstractFromInvertedIndex reconstructs OpenAlex abstracts

duration_ms: 0.561208
type: 'test'
...

Subtest: fetchOpenAlexWorks bounds provider calls with an abort signal

ok 2 - fetchOpenAlexWorks bounds provider calls with an abort signal

duration_ms: 8.071958
type: 'test'
...

Subtest: fetchOpenAlexWorks retries a rate-limited provider once with bounded backoff

ok 3 - fetchOpenAlexWorks retries a rate-limited provider once with bounded backoff

duration_ms: 2.869834
type: 'test'
...

Subtest: PaperRank slug and limit parsing are stable

ok 4 - PaperRank slug and limit parsing are stable

duration_ms: 0.457334
type: 'test'
...

Subtest: computePageRank gives cited papers more local graph prestige

ok 5 - computePageRank gives cited papers more local graph prestige

duration_ms: 0.2395
type: 'test'
...

Subtest: extractEvidenceSpans returns marker offsets and surrounding source text

ok 6 - extractEvidenceSpans returns marker offsets and surrounding source text

duration_ms: 0.357125
type: 'test'
...

Subtest: extractEvidenceSpans requires marker boundaries

ok 7 - extractEvidenceSpans requires marker boundaries

duration_ms: 0.143875
type: 'test'
...

Subtest: extractPaperContentText normalizes common alphaXiv content payload shapes

ok 8 - extractPaperContentText normalizes common alphaXiv content payload shapes

duration_ms: 0.070209
type: 'test'
...

Subtest: fetchArxivPaperContent converts official HTML into bounded text

ok 9 - fetchArxivPaperContent converts official HTML into bounded text

duration_ms: 1.037958
type: 'test'
...

Subtest: extractFullTextSections preserves canonical section offsets

ok 10 - extractFullTextSections preserves canonical section offsets

duration_ms: 0.548917
type: 'test'
...

Subtest: evaluatePaperRubric answers checklist items from extracted sections

ok 11 - evaluatePaperRubric answers checklist items from extracted sections

duration_ms: 0.361083
type: 'test'
...

Subtest: buildFullTextAccessPlan records legal source-specific candidates

ok 12 - buildFullTextAccessPlan records legal source-specific candidates

duration_ms: 1.325709
type: 'test'
...

Subtest: normalizeOpenAlexWorks keeps repository PDFs from all OpenAlex locations

ok 13 - normalizeOpenAlexWorks keeps repository PDFs from all OpenAlex locations

duration_ms: 0.168208
type: 'test'
...

Subtest: normalizeOpenAlexWorks drops non-http provider URLs and canonicalizes DOI links

ok 14 - normalizeOpenAlexWorks drops non-http provider URLs and canonicalizes DOI links

duration_ms: 0.154083
type: 'test'
...

Subtest: resolvePaperAccess writes Markdown-safe provider titles and links

ok 15 - resolvePaperAccess writes Markdown-safe provider titles and links

duration_ms: 2.157542
type: 'test'
...

Subtest: normalizeOpenAlexWorks extracts arXiv ids from secondary OpenAlex access locations

ok 16 - normalizeOpenAlexWorks extracts arXiv ids from secondary OpenAlex access locations

duration_ms: 0.109958
type: 'test'
...

Subtest: fetchEuropePmcPaperContent discovers PMCID from DOI before fetching XML

ok 17 - fetchEuropePmcPaperContent discovers PMCID from DOI before fetching XML

duration_ms: 0.896833
type: 'test'
...

Subtest: runPaperRank full-text enrichment discovers Europe PMC content from DOI-only OpenAlex papers

ok 18 - runPaperRank full-text enrichment discovers Europe PMC content from DOI-only OpenAlex papers

duration_ms: 11.351916
type: 'test'
...

Subtest: scorePapers separates impact, graph, methodology, and reproducibility

ok 19 - scorePapers separates impact, graph, methodology, and reproducibility

duration_ms: 0.652542
type: 'test'
...

Subtest: scorePapers excludes graph prestige when local citation edges are absent

ok 20 - scorePapers excludes graph prestige when local citation edges are absent

duration_ms: 0.655
type: 'test'
...

Subtest: expandCitationNeighborhood adds outgoing references and incoming citations

ok 21 - expandCitationNeighborhood adds outgoing references and incoming citations

duration_ms: 0.526333
type: 'test'
...

Subtest: generatePaperCritiques creates span-grounded review questions

ok 22 - generatePaperCritiques creates span-grounded review questions

duration_ms: 0.900208
type: 'test'
...

Subtest: generateFieldMap identifies clusters and paper roles

ok 23 - generateFieldMap identifies clusters and paper roles

duration_ms: 0.522875
type: 'test'
...

Subtest: generateRankSensitivity records rank movement across weighting profiles

ok 24 - generateRankSensitivity records rank movement across weighting profiles

duration_ms: 1.164708
type: 'test'
...

Subtest: generateScoreCalibration evaluates researcher read-order preferences

ok 25 - generateScoreCalibration evaluates researcher read-order preferences

duration_ms: 0.929292
type: 'test'
...

Subtest: generateReproductionEvidenceLedger records completed reproduction notes separately

ok 26 - generateReproductionEvidenceLedger records completed reproduction notes separately

duration_ms: 0.627875
type: 'test'
...

Subtest: buildModelSynthesisPacket creates a bounded auditable model handoff

ok 27 - buildModelSynthesisPacket creates a bounded auditable model handoff

duration_ms: 1.332708
type: 'test'
...

Subtest: resolvePaperAccess writes bounded paper-access artifacts

ok 28 - resolvePaperAccess writes bounded paper-access artifacts

duration_ms: 1.137917
type: 'test'
...

Subtest: resolvePaperAccess escapes provider full-text source labels in Markdown reports

ok 29 - resolvePaperAccess escapes provider full-text source labels in Markdown reports

duration_ms: 0.681084
type: 'test'
...

Subtest: enrichPapersWithFullText redacts fetcher failure messages

ok 30 - enrichPapersWithFullText redacts fetcher failure messages

duration_ms: 0.347375
type: 'test'
...

Subtest: resolvePaperAccess rejects unrelated OpenAlex hits for arXiv identifiers

ok 31 - resolvePaperAccess rejects unrelated OpenAlex hits for arXiv identifiers

duration_ms: 1.867541
type: 'test'
...

Subtest: resolvePaperAccess enriches arXiv fallback records from the arXiv API

ok 32 - resolvePaperAccess enriches arXiv fallback records from the arXiv API

duration_ms: 1.688042
type: 'test'
...

Subtest: resolvePaperAccess accepts OpenAlex hits whose arXiv id is only in secondary locations

ok 33 - resolvePaperAccess accepts OpenAlex hits whose arXiv id is only in secondary locations

duration_ms: 0.770292
type: 'test'
...

Subtest: resolvePaperAccess checks multiple OpenAlex candidates for arXiv identifiers

ok 34 - resolvePaperAccess checks multiple OpenAlex candidates for arXiv identifiers

duration_ms: 0.525542
type: 'test'
...

Subtest: resolvePaperAccess treats title-like arXiv-shaped numbers as title search text

ok 35 - resolvePaperAccess treats title-like arXiv-shaped numbers as title search text

duration_ms: 0.462083
type: 'test'
...

Subtest: resolvePaperAccess checks multiple OpenAlex candidates for title searches

ok 36 - resolvePaperAccess checks multiple OpenAlex candidates for title searches

duration_ms: 0.895791
type: 'test'
...

Subtest: resolvePaperAccess rejects unrelated OpenAlex title search results

ok 37 - resolvePaperAccess rejects unrelated OpenAlex title search results

duration_ms: 0.471541
type: 'test'
...

Subtest: resolvePaperAccess treats title-like DOI substrings as title search text

ok 38 - resolvePaperAccess treats title-like DOI substrings as title search text

duration_ms: 0.687916
type: 'test'
...

Subtest: resolvePaperAccess keeps explicit DOI inputs on the DOI lookup path

ok 39 - resolvePaperAccess keeps explicit DOI inputs on the DOI lookup path

duration_ms: 0.734875
type: 'test'
...

Subtest: resolvePaperAccess keeps explicit OpenAlex IDs on the OpenAlex lookup path

ok 40 - resolvePaperAccess keeps explicit OpenAlex IDs on the OpenAlex lookup path

duration_ms: 0.5
type: 'test'
...

Subtest: resolvePaperAccess keeps explicit PMID inputs on the PMID lookup path

ok 41 - resolvePaperAccess keeps explicit PMID inputs on the PMID lookup path

duration_ms: 0.539375
type: 'test'
...

Subtest: resolvePaperAccess keeps explicit PMCID inputs on the PMCID lookup path

ok 42 - resolvePaperAccess keeps explicit PMCID inputs on the PMCID lookup path

duration_ms: 0.410416
type: 'test'
...

Subtest: runPaperRank writes durable report, data, graph, and provenance artifacts

ok 43 - runPaperRank writes durable report, data, graph, and provenance artifacts

duration_ms: 9.19375
type: 'test'
...

Subtest: runPaperRank writes Markdown-safe topic headings and shell snippets

ok 44 - runPaperRank writes Markdown-safe topic headings and shell snippets

duration_ms: 3.451
type: 'test'
...

Subtest: runPaperRank escapes script-breaking graph artifact data

ok 45 - runPaperRank escapes script-breaking graph artifact data

duration_ms: 2.103
type: 'test'
...

Subtest: runPaperRank redacts model synthesis failure messages from artifacts

ok 46 - runPaperRank redacts model synthesis failure messages from artifacts

duration_ms: 2.175875
type: 'test'
...

Subtest: feynman rank works end to end through the CLI with a fixture source

ok 47 - feynman rank works end to end through the CLI with a fixture source

duration_ms: 1708.422625
type: 'test'
...

Subtest: feynman rank default output is concise and decision-first

ok 48 - feynman rank default output is concise and decision-first

duration_ms: 961.6535
type: 'test'
...

Subtest: feynman rank writes default outputs under --cwd

ok 49 - feynman rank writes default outputs under --cwd

duration_ms: 1631.02725
type: 'test'
...

Subtest: feynman paper works end to end through the CLI with a fixture source

ok 50 - feynman paper works end to end through the CLI with a fixture source

duration_ms: 1587.384083
type: 'test'
...

Subtest: feynman paper default output names the best access route

ok 51 - feynman paper default output names the best access route

duration_ms: 965.927875
type: 'test'
...

Subtest: feynman paper writes default outputs under --cwd

ok 52 - feynman paper writes default outputs under --cwd

duration_ms: 1700.056875
type: 'test'
...

Subtest: feynman rank accepts a preference file through the CLI

ok 53 - feynman rank accepts a preference file through the CLI

duration_ms: 1703.431166
type: 'test'
...

Subtest: feynman rank accepts reproduction notes through the CLI

ok 54 - feynman rank accepts reproduction notes through the CLI

duration_ms: 1992.54175
type: 'test'
...
1..54

tests 54

suites 0

pass 54

fail 0

cancelled 0

skipped 0

todo 0

duration_ms 12411.798834 — 54 passed\n-

@advaitpaliwal/feynman@0.3.49 typecheck
tsc --noEmit && npm run typecheck:workbench-web

@advaitpaliwal/feynman@0.3.49 typecheck:workbench-web
tsc -p workbench-web/tsconfig.json --noEmit — passed\n- — passed\n\nThe full suite is not claimed green because unrelated provider/model environment tests require external credentials or native runtime assumptions.

@vercel

vercel Bot commented Sep 9, 2026

Copy link
Copy Markdown

@djimit is attempting to deploy a commit to the Advait Paliwal's projects Team on Vercel.

A member of the Team first needs to authorize it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant