psyclaw 0.27.22 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -5
- package/dist/apps/panel/index.html +2 -2
- package/dist/src/adapters/pi/extension.js +225 -92
- package/dist/src/adapters/pi/extension.js.map +1 -1
- package/dist/src/agents/import.js +44 -32
- package/dist/src/agents/import.js.map +1 -1
- package/dist/src/analysis/hooks.d.ts +1 -0
- package/dist/src/analysis/hooks.js +20 -1
- package/dist/src/analysis/hooks.js.map +1 -1
- package/dist/src/ars/bridge.d.ts +20 -0
- package/dist/src/ars/bridge.js +132 -0
- package/dist/src/ars/bridge.js.map +1 -0
- package/dist/src/ars/contracts.d.ts +55 -0
- package/dist/src/ars/contracts.js +2 -0
- package/dist/src/ars/contracts.js.map +1 -0
- package/dist/src/ars/panel-plan.d.ts +4 -0
- package/dist/src/ars/panel-plan.js +11 -0
- package/dist/src/ars/panel-plan.js.map +1 -0
- package/dist/src/ars/pi-panel-executor.d.ts +30 -0
- package/dist/src/ars/pi-panel-executor.js +140 -0
- package/dist/src/ars/pi-panel-executor.js.map +1 -0
- package/dist/src/ars/profile.d.ts +36 -0
- package/dist/src/ars/profile.js +119 -0
- package/dist/src/ars/profile.js.map +1 -0
- package/dist/src/ars/re-review.d.ts +22 -0
- package/dist/src/ars/re-review.js +172 -0
- package/dist/src/ars/re-review.js.map +1 -0
- package/dist/src/branding.d.ts +2 -4
- package/dist/src/branding.js +3 -5
- package/dist/src/branding.js.map +1 -1
- package/dist/src/bundled-tools.d.ts +3 -0
- package/dist/src/bundled-tools.js +21 -0
- package/dist/src/bundled-tools.js.map +1 -0
- package/dist/src/chat.js +6 -5
- package/dist/src/chat.js.map +1 -1
- package/dist/src/creation/contracts.d.ts +38 -0
- package/dist/src/creation/contracts.js +2 -0
- package/dist/src/creation/contracts.js.map +1 -0
- package/dist/src/creation/service.d.ts +7 -0
- package/dist/src/creation/service.js +196 -0
- package/dist/src/creation/service.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/install/installer.js +32 -10
- package/dist/src/install/installer.js.map +1 -1
- package/dist/src/orchestration/personas.d.ts +15 -0
- package/dist/src/orchestration/personas.js +51 -0
- package/dist/src/orchestration/personas.js.map +1 -0
- package/dist/src/orchestration/pi-executor.d.ts +1 -0
- package/dist/src/orchestration/pi-executor.js +1 -1
- package/dist/src/orchestration/pi-executor.js.map +1 -1
- package/dist/src/panel/extension.js +29 -8
- package/dist/src/panel/extension.js.map +1 -1
- package/dist/src/panel/server.js +14 -5
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/project/paths.d.ts +3 -0
- package/dist/src/project/paths.js +7 -0
- package/dist/src/project/paths.js.map +1 -1
- package/dist/src/rules/user-rules.d.ts +8 -0
- package/dist/src/rules/user-rules.js +36 -0
- package/dist/src/rules/user-rules.js.map +1 -0
- package/dist/src/skills/contracts.d.ts +4 -4
- package/dist/src/skills/recommended.js +1 -1
- package/dist/src/skills/registry.js +49 -28
- package/dist/src/skills/registry.js.map +1 -1
- package/dist/src/style/cli-ui.js +0 -1
- package/dist/src/style/cli-ui.js.map +1 -1
- package/package.json +14 -3
- package/scripts/rebrand-pi.mjs +6 -0
- package/skills/recommended/catalog.json +2 -11
- package/vendor/ars/.claude/CLAUDE.md +371 -0
- package/vendor/ars/.command-invariants.toml +24 -0
- package/vendor/ars/CITATION.cff +35 -0
- package/vendor/ars/LICENSE +417 -0
- package/vendor/ars/MODE_REGISTRY.md +76 -0
- package/vendor/ars/NOTICE.md +26 -0
- package/vendor/ars/POSITIONING.md +99 -0
- package/vendor/ars/PSYCLAW_SOURCE.json +10 -0
- package/vendor/ars/README.md +751 -0
- package/vendor/ars/SECURITY.md +52 -0
- package/vendor/ars/THIRD_PARTY.md +70 -0
- package/vendor/ars/academic-paper/SKILL.md +542 -0
- package/vendor/ars/academic-paper/agents/abstract_bilingual_agent.md +171 -0
- package/vendor/ars/academic-paper/agents/argument_builder_agent.md +276 -0
- package/vendor/ars/academic-paper/agents/citation_compliance_agent.md +422 -0
- package/vendor/ars/academic-paper/agents/draft_writer_agent.md +656 -0
- package/vendor/ars/academic-paper/agents/formatter_agent.md +999 -0
- package/vendor/ars/academic-paper/agents/intake_agent.md +393 -0
- package/vendor/ars/academic-paper/agents/literature_strategist_agent.md +626 -0
- package/vendor/ars/academic-paper/agents/peer_reviewer_agent.md +516 -0
- package/vendor/ars/academic-paper/agents/revision_coach_agent.md +334 -0
- package/vendor/ars/academic-paper/agents/socratic_mentor_agent.md +527 -0
- package/vendor/ars/academic-paper/agents/structure_architect_agent.md +401 -0
- package/vendor/ars/academic-paper/agents/visualization_agent.md +441 -0
- package/vendor/ars/academic-paper/examples/chinese_paper_example.md +278 -0
- package/vendor/ars/academic-paper/examples/clinical_citation_verification_checklist.md +95 -0
- package/vendor/ars/academic-paper/examples/clinical_epistemic_status_example.md +100 -0
- package/vendor/ars/academic-paper/examples/commitment_ledger_example.md +147 -0
- package/vendor/ars/academic-paper/examples/imrad_hei_example.md +234 -0
- package/vendor/ars/academic-paper/examples/literature_review_example.md +260 -0
- package/vendor/ars/academic-paper/examples/plan_mode_guided_writing.md +600 -0
- package/vendor/ars/academic-paper/examples/revision_mode_example.md +344 -0
- package/vendor/ars/academic-paper/examples/revision_recovery_example.md +506 -0
- package/vendor/ars/academic-paper/examples/version_family_reconciliation_example.md +89 -0
- package/vendor/ars/academic-paper/references/abstract_writing_guide.md +169 -0
- package/vendor/ars/academic-paper/references/academic_writing_style.md +188 -0
- package/vendor/ars/academic-paper/references/anti_leakage_protocol.md +83 -0
- package/vendor/ars/academic-paper/references/apa7_chinese_citation_guide.md +364 -0
- package/vendor/ars/academic-paper/references/apa7_extended_guide.md +198 -0
- package/vendor/ars/academic-paper/references/changelog.md +11 -0
- package/vendor/ars/academic-paper/references/citation_format_switcher.md +228 -0
- package/vendor/ars/academic-paper/references/committee_correspondence_protocol.md +158 -0
- package/vendor/ars/academic-paper/references/credit_authorship_guide.md +308 -0
- package/vendor/ars/academic-paper/references/disclosure_mode_protocol.md +478 -0
- package/vendor/ars/academic-paper/references/domain_evidence_profiles.md +38 -0
- package/vendor/ars/academic-paper/references/failure_paths.md +349 -0
- package/vendor/ars/academic-paper/references/funding_statement_guide.md +319 -0
- package/vendor/ars/academic-paper/references/hei_domain_glossary.md +169 -0
- package/vendor/ars/academic-paper/references/intro_title_rhetoric_guide.md +114 -0
- package/vendor/ars/academic-paper/references/journal_submission_guide.md +249 -0
- package/vendor/ars/academic-paper/references/latex_template_reference.md +378 -0
- package/vendor/ars/academic-paper/references/mode_selection_guide.md +378 -0
- package/vendor/ars/academic-paper/references/paper_structure_patterns.md +330 -0
- package/vendor/ars/academic-paper/references/plan_mode_protocol.md +112 -0
- package/vendor/ars/academic-paper/references/policy_anchor_disclosure_protocol.md +200 -0
- package/vendor/ars/academic-paper/references/policy_anchor_table.md +157 -0
- package/vendor/ars/academic-paper/references/revision_patch_protocol.md +173 -0
- package/vendor/ars/academic-paper/references/statistical_visualization_standards.md +750 -0
- package/vendor/ars/academic-paper/references/venue_disclosure_policies.md +259 -0
- package/vendor/ars/academic-paper/references/vlm_figure_verification.md +126 -0
- package/vendor/ars/academic-paper/references/workflow_phase_details.md +135 -0
- package/vendor/ars/academic-paper/references/writing_judgment_framework.md +59 -0
- package/vendor/ars/academic-paper/references/writing_quality_check.md +173 -0
- package/vendor/ars/academic-paper/templates/bilingual_abstract_template.md +78 -0
- package/vendor/ars/academic-paper/templates/case_study_template.md +129 -0
- package/vendor/ars/academic-paper/templates/conference_paper_template.md +108 -0
- package/vendor/ars/academic-paper/templates/credit_statement_template.md +132 -0
- package/vendor/ars/academic-paper/templates/funding_statement_template.md +290 -0
- package/vendor/ars/academic-paper/templates/imrad_template.md +183 -0
- package/vendor/ars/academic-paper/templates/latex_article_template.tex +199 -0
- package/vendor/ars/academic-paper/templates/literature_review_template.md +135 -0
- package/vendor/ars/academic-paper/templates/policy_brief_template.md +139 -0
- package/vendor/ars/academic-paper/templates/revision_tracking_template.md +199 -0
- package/vendor/ars/academic-paper/templates/theoretical_paper_template.md +119 -0
- package/vendor/ars/academic-paper-reviewer/SKILL.md +491 -0
- package/vendor/ars/academic-paper-reviewer/agents/devils_advocate_reviewer_agent.md +443 -0
- package/vendor/ars/academic-paper-reviewer/agents/domain_reviewer_agent.md +412 -0
- package/vendor/ars/academic-paper-reviewer/agents/editorial_synthesizer_agent.md +478 -0
- package/vendor/ars/academic-paper-reviewer/agents/eic_agent.md +339 -0
- package/vendor/ars/academic-paper-reviewer/agents/field_analyst_agent.md +221 -0
- package/vendor/ars/academic-paper-reviewer/agents/methodology_reviewer_agent.md +449 -0
- package/vendor/ars/academic-paper-reviewer/agents/perspective_reviewer_agent.md +427 -0
- package/vendor/ars/academic-paper-reviewer/examples/hei_paper_review_example.md +391 -0
- package/vendor/ars/academic-paper-reviewer/examples/interdisciplinary_review_example.md +299 -0
- package/vendor/ars/academic-paper-reviewer/examples/subclaim_decomposition_example.md +80 -0
- package/vendor/ars/academic-paper-reviewer/references/calibration_mode_protocol.md +256 -0
- package/vendor/ars/academic-paper-reviewer/references/changelog.md +10 -0
- package/vendor/ars/academic-paper-reviewer/references/editorial_decision_standards.md +236 -0
- package/vendor/ars/academic-paper-reviewer/references/guided_mode_protocol.md +34 -0
- package/vendor/ars/academic-paper-reviewer/references/integration_guide.md +15 -0
- package/vendor/ars/academic-paper-reviewer/references/quality_rubrics.md +84 -0
- package/vendor/ars/academic-paper-reviewer/references/re_review_mode_protocol.md +340 -0
- package/vendor/ars/academic-paper-reviewer/references/review_criteria_framework.md +98 -0
- package/vendor/ars/academic-paper-reviewer/references/review_panel_provenance_protocol.md +197 -0
- package/vendor/ars/academic-paper-reviewer/references/review_quality_thinking.md +58 -0
- package/vendor/ars/academic-paper-reviewer/references/reviewer_sprint_prompt_source.md +324 -0
- package/vendor/ars/academic-paper-reviewer/references/sprint_contract_protocol.md +296 -0
- package/vendor/ars/academic-paper-reviewer/references/statistical_reporting_standards.md +505 -0
- package/vendor/ars/academic-paper-reviewer/references/top_journals_by_field.md +206 -0
- package/vendor/ars/academic-paper-reviewer/templates/editorial_decision_template.md +235 -0
- package/vendor/ars/academic-paper-reviewer/templates/peer_review_report_template.md +305 -0
- package/vendor/ars/academic-paper-reviewer/templates/revision_response_template.md +248 -0
- package/vendor/ars/academic-pipeline/SKILL.md +736 -0
- package/vendor/ars/academic-pipeline/agents/claim_ref_alignment_audit_agent.md +382 -0
- package/vendor/ars/academic-pipeline/agents/collaboration_depth_agent.md +164 -0
- package/vendor/ars/academic-pipeline/agents/integrity_verification_agent.md +870 -0
- package/vendor/ars/academic-pipeline/agents/pipeline_orchestrator_agent.md +1379 -0
- package/vendor/ars/academic-pipeline/agents/state_tracker_agent.md +622 -0
- package/vendor/ars/academic-pipeline/examples/full_pipeline_example.md +482 -0
- package/vendor/ars/academic-pipeline/examples/integrity_failure_recovery.md +389 -0
- package/vendor/ars/academic-pipeline/examples/mid_entry_example.md +414 -0
- package/vendor/ars/academic-pipeline/references/adapters/.gitkeep +0 -0
- package/vendor/ars/academic-pipeline/references/adapters/overview.md +153 -0
- package/vendor/ars/academic-pipeline/references/ai_research_failure_modes.md +185 -0
- package/vendor/ars/academic-pipeline/references/changelog.md +14 -0
- package/vendor/ars/academic-pipeline/references/claim_audit_calibration_protocol.md +175 -0
- package/vendor/ars/academic-pipeline/references/claim_verification_protocol.md +282 -0
- package/vendor/ars/academic-pipeline/references/external_review_protocol.md +131 -0
- package/vendor/ars/academic-pipeline/references/integrity_review_protocol.md +110 -0
- package/vendor/ars/academic-pipeline/references/literature_corpus_consumers.md +193 -0
- package/vendor/ars/academic-pipeline/references/mode_advisor.md +135 -0
- package/vendor/ars/academic-pipeline/references/passport_as_reset_boundary.md +132 -0
- package/vendor/ars/academic-pipeline/references/pipeline_state_machine.md +405 -0
- package/vendor/ars/academic-pipeline/references/plagiarism_detection_protocol.md +239 -0
- package/vendor/ars/academic-pipeline/references/process_summary_protocol.md +209 -0
- package/vendor/ars/academic-pipeline/references/progress_dashboard_template.md +38 -0
- package/vendor/ars/academic-pipeline/references/reinforcement_content.md +15 -0
- package/vendor/ars/academic-pipeline/references/reproducibility_audit.md +55 -0
- package/vendor/ars/academic-pipeline/references/score_trajectory_protocol.md +78 -0
- package/vendor/ars/academic-pipeline/references/team_collaboration_protocol.md +261 -0
- package/vendor/ars/academic-pipeline/references/two_stage_review_protocol.md +27 -0
- package/vendor/ars/academic-pipeline/templates/pipeline_status_template.md +146 -0
- package/vendor/ars/agents/report_compiler_agent.md +341 -0
- package/vendor/ars/agents/research_architect_agent.md +298 -0
- package/vendor/ars/agents/synthesis_agent.md +356 -0
- package/vendor/ars/commands/ars-3w.md +10 -0
- package/vendor/ars/commands/ars-abstract.md +10 -0
- package/vendor/ars/commands/ars-cache-invalidate.md +20 -0
- package/vendor/ars/commands/ars-citation-check.md +10 -0
- package/vendor/ars/commands/ars-disclosure.md +10 -0
- package/vendor/ars/commands/ars-format-convert.md +10 -0
- package/vendor/ars/commands/ars-full.md +9 -0
- package/vendor/ars/commands/ars-lit-review.md +12 -0
- package/vendor/ars/commands/ars-mark-read.md +18 -0
- package/vendor/ars/commands/ars-outline.md +10 -0
- package/vendor/ars/commands/ars-plan.md +10 -0
- package/vendor/ars/commands/ars-rebuttal-audit.md +12 -0
- package/vendor/ars/commands/ars-reviewer.md +9 -0
- package/vendor/ars/commands/ars-revision-coach.md +9 -0
- package/vendor/ars/commands/ars-revision.md +10 -0
- package/vendor/ars/commands/ars-unmark-read.md +16 -0
- package/vendor/ars/deep-research/SKILL.md +600 -0
- package/vendor/ars/deep-research/agents/bibliography_agent.md +473 -0
- package/vendor/ars/deep-research/agents/devils_advocate_agent.md +192 -0
- package/vendor/ars/deep-research/agents/editor_in_chief_agent.md +167 -0
- package/vendor/ars/deep-research/agents/ethics_review_agent.md +267 -0
- package/vendor/ars/deep-research/agents/meta_analysis_agent.md +325 -0
- package/vendor/ars/deep-research/agents/monitoring_agent.md +209 -0
- package/vendor/ars/deep-research/agents/report_compiler_agent.md +341 -0
- package/vendor/ars/deep-research/agents/research_architect_agent.md +298 -0
- package/vendor/ars/deep-research/agents/research_question_agent.md +216 -0
- package/vendor/ars/deep-research/agents/risk_of_bias_agent.md +231 -0
- package/vendor/ars/deep-research/agents/socratic_mentor_agent.md +764 -0
- package/vendor/ars/deep-research/agents/source_verification_agent.md +219 -0
- package/vendor/ars/deep-research/agents/synthesis_agent.md +356 -0
- package/vendor/ars/deep-research/agents/timeline_extraction_agent.md +99 -0
- package/vendor/ars/deep-research/examples/exploratory_research.md +157 -0
- package/vendor/ars/deep-research/examples/fact_check_mode.md +173 -0
- package/vendor/ars/deep-research/examples/handoff_to_paper.md +318 -0
- package/vendor/ars/deep-research/examples/idea_diversity_coverage_gap_advisory.md +64 -0
- package/vendor/ars/deep-research/examples/policy_analysis.md +161 -0
- package/vendor/ars/deep-research/examples/review_mode.md +253 -0
- package/vendor/ars/deep-research/examples/socratic_guided_research.md +331 -0
- package/vendor/ars/deep-research/examples/systematic_review.md +133 -0
- package/vendor/ars/deep-research/references/apa7_style_guide.md +162 -0
- package/vendor/ars/deep-research/references/argumentation_reasoning_framework.md +68 -0
- package/vendor/ars/deep-research/references/arxiv_api_protocol.md +76 -0
- package/vendor/ars/deep-research/references/changelog.md +22 -0
- package/vendor/ars/deep-research/references/chinese_literature_api_protocol.md +317 -0
- package/vendor/ars/deep-research/references/cross_agent_quality_definitions.md +14 -0
- package/vendor/ars/deep-research/references/crossref_api_protocol.md +84 -0
- package/vendor/ars/deep-research/references/equator_reporting_guidelines.md +482 -0
- package/vendor/ars/deep-research/references/ethics_checklist.md +282 -0
- package/vendor/ars/deep-research/references/failure_paths.md +355 -0
- package/vendor/ars/deep-research/references/interdisciplinary_bridges.md +292 -0
- package/vendor/ars/deep-research/references/irb_decision_tree.md +315 -0
- package/vendor/ars/deep-research/references/literature_monitoring_strategies.md +263 -0
- package/vendor/ars/deep-research/references/logical_fallacies.md +192 -0
- package/vendor/ars/deep-research/references/methodology_patterns.md +462 -0
- package/vendor/ars/deep-research/references/mode_selection_guide.md +331 -0
- package/vendor/ars/deep-research/references/openalex_api_protocol.md +82 -0
- package/vendor/ars/deep-research/references/preregistration_guide.md +324 -0
- package/vendor/ars/deep-research/references/semantic_scholar_api_protocol.md +107 -0
- package/vendor/ars/deep-research/references/socratic_mode_protocol.md +99 -0
- package/vendor/ars/deep-research/references/socratic_questioning_framework.md +232 -0
- package/vendor/ars/deep-research/references/source_quality_hierarchy.md +188 -0
- package/vendor/ars/deep-research/references/systematic_review_protocol.md +95 -0
- package/vendor/ars/deep-research/references/systematic_review_toolkit.md +353 -0
- package/vendor/ars/deep-research/templates/evidence_assessment_template.md +127 -0
- package/vendor/ars/deep-research/templates/literature_matrix_template.md +85 -0
- package/vendor/ars/deep-research/templates/preregistration_template.md +318 -0
- package/vendor/ars/deep-research/templates/prisma_protocol_template.md +248 -0
- package/vendor/ars/deep-research/templates/prisma_report_template.md +415 -0
- package/vendor/ars/deep-research/templates/research_brief_template.md +93 -0
- package/vendor/ars/package.json +24 -0
- package/vendor/ars/pi/README.md +161 -0
- package/vendor/ars/pi/package.json +26 -0
- package/vendor/ars/pi/wrapper.js +193 -0
- package/vendor/ars/pi/wrapper.test.mjs +201 -0
- package/vendor/ars/pyproject.toml +2 -0
- package/vendor/ars/requirements-pdf-content-classifier.txt +5 -0
- package/vendor/ars/scripts/_block_parser.py +396 -0
- package/vendor/ars/scripts/_ci_pytest_manifest.toml +661 -0
- package/vendor/ars/scripts/_claim_audit_constants.py +268 -0
- package/vendor/ars/scripts/_e4_evidence.py +110 -0
- package/vendor/ars/scripts/_eval_threshold_gate.py +73 -0
- package/vendor/ars/scripts/_markdown_lint_util.py +224 -0
- package/vendor/ars/scripts/_next_verified_at_ms.py +176 -0
- package/vendor/ars/scripts/_passport_yaml.py +53 -0
- package/vendor/ars/scripts/_skill_lint.py +254 -0
- package/vendor/ars/scripts/_text_similarity.py +141 -0
- package/vendor/ars/scripts/adapters/README.md +89 -0
- package/vendor/ars/scripts/adapters/_common.py +209 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/expected_passport.yaml +25 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/expected_rejection_log.yaml +18 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Chen2024_AIAssessment.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/Wang_2023_formative_feedback.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture/paper1.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/folder_scan/input_fixture//344/270/255/346/226/207/346/252/224/345/220/215_2024.pdf +0 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/expected_passport.yaml +40 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/expected_rejection_log.yaml +13 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/.obsidian/app.json +1 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/_templates/tmpl.md +7 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/chen2024ai.md +13 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/invalid.md +1 -0
- package/vendor/ars/scripts/adapters/examples/obsidian/input_fixture/vault/wang2023formative.md +10 -0
- package/vendor/ars/scripts/adapters/examples/zotero/expected_passport.yaml +34 -0
- package/vendor/ars/scripts/adapters/examples/zotero/expected_rejection_log.yaml +34 -0
- package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/examples/zotero/input_fixture/export.json +43 -0
- package/vendor/ars/scripts/adapters/folder_scan.py +214 -0
- package/vendor/ars/scripts/adapters/obsidian.py +336 -0
- package/vendor/ars/scripts/adapters/tests/.gitkeep +0 -0
- package/vendor/ars/scripts/adapters/tests/conftest.py +77 -0
- package/vendor/ars/scripts/adapters/tests/test_check_corpus_consumer_protocol.py +632 -0
- package/vendor/ars/scripts/adapters/tests/test_check_literature_corpus_schema.py +631 -0
- package/vendor/ars/scripts/adapters/tests/test_common.py +365 -0
- package/vendor/ars/scripts/adapters/tests/test_conftest.py +96 -0
- package/vendor/ars/scripts/adapters/tests/test_folder_scan.py +260 -0
- package/vendor/ars/scripts/adapters/tests/test_literature_corpus_entry_schema.py +745 -0
- package/vendor/ars/scripts/adapters/tests/test_obsidian.py +357 -0
- package/vendor/ars/scripts/adapters/tests/test_rejection_log_schema.py +271 -0
- package/vendor/ars/scripts/adapters/tests/test_sync_adapter_docs.py +88 -0
- package/vendor/ars/scripts/adapters/tests/test_zotero.py +454 -0
- package/vendor/ars/scripts/adapters/zotero.py +318 -0
- package/vendor/ars/scripts/adjudication_activity.py +1592 -0
- package/vendor/ars/scripts/announce-ars-loaded.sh +144 -0
- package/vendor/ars/scripts/ars_anchorize_draft.py +170 -0
- package/vendor/ars/scripts/ars_apply_revision_patch.py +912 -0
- package/vendor/ars/scripts/ars_cache_invalidate.py +40 -0
- package/vendor/ars/scripts/ars_mark_read.py +521 -0
- package/vendor/ars/scripts/ars_phase_scope_manifest.json +33 -0
- package/vendor/ars/scripts/ars_update_check.sh +215 -0
- package/vendor/ars/scripts/ars_write_scope_guard.py +506 -0
- package/vendor/ars/scripts/arxiv_client.py +222 -0
- package/vendor/ars/scripts/audit_snapshot.py +572 -0
- package/vendor/ars/scripts/bibliographic_integrity_signals.py +800 -0
- package/vendor/ars/scripts/bootstrap_timeline_yaml.py +146 -0
- package/vendor/ars/scripts/build_claim_standing_candidate_ledger.py +1238 -0
- package/vendor/ars/scripts/build_claim_standing_query_plan.py +643 -0
- package/vendor/ars/scripts/build_content_coverage_advisory.py +1205 -0
- package/vendor/ars/scripts/build_cross_document_consistency_advisory.py +2332 -0
- package/vendor/ars/scripts/build_review_pathway_rule_trace.py +830 -0
- package/vendor/ars/scripts/build_submission_packet_manifest.py +2310 -0
- package/vendor/ars/scripts/check_215_field_norm.py +173 -0
- package/vendor/ars/scripts/check_216_surface_form.py +250 -0
- package/vendor/ars/scripts/check_268_nested_commitment_ledger.py +180 -0
- package/vendor/ars/scripts/check_390_revision_patch_discipline.py +296 -0
- package/vendor/ars/scripts/check_392_citation_verification_intake.py +126 -0
- package/vendor/ars/scripts/check_394_submission_policy.py +178 -0
- package/vendor/ars/scripts/check_439_format_profile.py +307 -0
- package/vendor/ars/scripts/check_619_disclosure_closeout.py +237 -0
- package/vendor/ars/scripts/check_630_codex_subscription_transport.py +456 -0
- package/vendor/ars/scripts/check_669_review_pathway_rule_trace.py +662 -0
- package/vendor/ars/scripts/check_670_revision_roadmap_integration.py +518 -0
- package/vendor/ars/scripts/check_673_adjudication_activity.py +684 -0
- package/vendor/ars/scripts/check_684_review_criteria_binding.py +557 -0
- package/vendor/ars/scripts/check_agents_mirror_sync.py +115 -0
- package/vendor/ars/scripts/check_audit_artifact_consistency.py +2313 -0
- package/vendor/ars/scripts/check_benchmark_report.py +79 -0
- package/vendor/ars/scripts/check_bibliographic_integrity_signals.py +831 -0
- package/vendor/ars/scripts/check_calibration_tiers.py +235 -0
- package/vendor/ars/scripts/check_changelog_covers_merges.py +289 -0
- package/vendor/ars/scripts/check_ci_pytest_manifest.py +204 -0
- package/vendor/ars/scripts/check_claim_audit_consistency.py +1664 -0
- package/vendor/ars/scripts/check_claim_standing_candidate_ledger_integration.py +500 -0
- package/vendor/ars/scripts/check_claim_standing_freshness.py +253 -0
- package/vendor/ars/scripts/check_claim_standing_transmissions.py +449 -0
- package/vendor/ars/scripts/check_collaboration_depth_rubric.py +180 -0
- package/vendor/ars/scripts/check_command_frontmatter_name.py +116 -0
- package/vendor/ars/scripts/check_committee_correspondence.py +333 -0
- package/vendor/ars/scripts/check_compliance_report.py +108 -0
- package/vendor/ars/scripts/check_content_coverage_advisory_integration.py +796 -0
- package/vendor/ars/scripts/check_control_availability.py +172 -0
- package/vendor/ars/scripts/check_corpus_consumer_protocol.py +404 -0
- package/vendor/ars/scripts/check_cross_document_consistency_advisory_integration.py +1191 -0
- package/vendor/ars/scripts/check_cross_model_handoff_contract.py +234 -0
- package/vendor/ars/scripts/check_cross_model_verification_sync.py +261 -0
- package/vendor/ars/scripts/check_data_access_level.py +131 -0
- package/vendor/ars/scripts/check_data_flows.py +252 -0
- package/vendor/ars/scripts/check_decision_contract.py +464 -0
- package/vendor/ars/scripts/check_degradation_registry.py +326 -0
- package/vendor/ars/scripts/check_distribution_surface_claims.py +226 -0
- package/vendor/ars/scripts/check_domain_evidence_profile.py +538 -0
- package/vendor/ars/scripts/check_e4_promotion.py +195 -0
- package/vendor/ars/scripts/check_evals_gold_set.py +279 -0
- package/vendor/ars/scripts/check_evidence_row_integration.py +396 -0
- package/vendor/ars/scripts/check_experiment_provenance.py +117 -0
- package/vendor/ars/scripts/check_field_norm_severity.py +144 -0
- package/vendor/ars/scripts/check_firm_rules_sync.py +375 -0
- package/vendor/ars/scripts/check_heldout_measurement_report.py +1179 -0
- package/vendor/ars/scripts/check_human_subjects_output_contract.py +139 -0
- package/vendor/ars/scripts/check_human_subjects_reference_migration.py +844 -0
- package/vendor/ars/scripts/check_indirect_prompt_injection_no_call.py +328 -0
- package/vendor/ars/scripts/check_instruction_data_boundary.py +236 -0
- package/vendor/ars/scripts/check_judge_prompt_version.py +125 -0
- package/vendor/ars/scripts/check_literature_corpus_schema.py +402 -0
- package/vendor/ars/scripts/check_model_tiering.py +223 -0
- package/vendor/ars/scripts/check_panel_synthesis.py +1331 -0
- package/vendor/ars/scripts/check_passport_reset_contract.py +214 -0
- package/vendor/ars/scripts/check_pattern_eval_manifest.py +422 -0
- package/vendor/ars/scripts/check_persuasion_invariance_fixtures.py +637 -0
- package/vendor/ars/scripts/check_phase_conformance.py +2180 -0
- package/vendor/ars/scripts/check_pipeline_boundary_semantics.py +600 -0
- package/vendor/ars/scripts/check_pipeline_integrity.py +340 -0
- package/vendor/ars/scripts/check_policy_anchor_protocol.py +159 -0
- package/vendor/ars/scripts/check_policy_anchor_table.py +286 -0
- package/vendor/ars/scripts/check_preprint_venues_consistency.py +123 -0
- package/vendor/ars/scripts/check_prisma_trAIce_freshness.py +84 -0
- package/vendor/ars/scripts/check_promotion_bakeoff_preregistration.py +1303 -0
- package/vendor/ars/scripts/check_ranking_lift.py +323 -0
- package/vendor/ars/scripts/check_re_review_synthesis.py +2719 -0
- package/vendor/ars/scripts/check_receipt_enum_sync.py +203 -0
- package/vendor/ars/scripts/check_repro_lock.py +85 -0
- package/vendor/ars/scripts/check_review_pathway_output.py +276 -0
- package/vendor/ars/scripts/check_reviewer_data_fences.py +224 -0
- package/vendor/ars/scripts/check_reviewer_finding_contract.py +783 -0
- package/vendor/ars/scripts/check_reviewer_role_label.py +447 -0
- package/vendor/ars/scripts/check_reviewer_scoring_honesty.py +292 -0
- package/vendor/ars/scripts/check_reviewer_sprint_prompt_sync.py +409 -0
- package/vendor/ars/scripts/check_revision_claim_drift_suite_v2.py +1622 -0
- package/vendor/ars/scripts/check_revision_token_conservation.py +263 -0
- package/vendor/ars/scripts/check_risk_register.py +280 -0
- package/vendor/ars/scripts/check_role_scoped_contract.py +702 -0
- package/vendor/ars/scripts/check_rq_framing_patterns.py +184 -0
- package/vendor/ars/scripts/check_rubric_weight_consistency.py +32 -0
- package/vendor/ars/scripts/check_seeded_defect_fixtures.py +425 -0
- package/vendor/ars/scripts/check_setup_cross_model_parity.py +139 -0
- package/vendor/ars/scripts/check_spec_consistency.py +1249 -0
- package/vendor/ars/scripts/check_sprint_contract.py +371 -0
- package/vendor/ars/scripts/check_stage_capability_matrix.py +784 -0
- package/vendor/ars/scripts/check_submission_packet_manifest_integration.py +358 -0
- package/vendor/ars/scripts/check_surface_form_parity.py +445 -0
- package/vendor/ars/scripts/check_task_type.py +22 -0
- package/vendor/ars/scripts/check_tools_allowlist.py +538 -0
- package/vendor/ars/scripts/check_tortured_phrase_screening_integration.py +1974 -0
- package/vendor/ars/scripts/check_v3_10_134_write_scope.py +286 -0
- package/vendor/ars/scripts/check_v3_10_policy.py +656 -0
- package/vendor/ars/scripts/check_v3_6_6_ab_manifest.py +364 -0
- package/vendor/ars/scripts/check_v3_6_7_pattern_protection.py +1366 -0
- package/vendor/ars/scripts/check_v3_6_8_audit_scope_block.py +464 -0
- package/vendor/ars/scripts/check_v3_6_8_cite_provenance_pipeline.py +231 -0
- package/vendor/ars/scripts/check_v3_6_8_frontmatter_trust_schema.py +248 -0
- package/vendor/ars/scripts/check_v3_6_8_mark_read_commands.py +79 -0
- package/vendor/ars/scripts/check_v3_6_8_pattern_protection.py +941 -0
- package/vendor/ars/scripts/check_v3_7_3_three_layer_citation.py +318 -0
- package/vendor/ars/scripts/check_v3_8_annotation_literal_sync.py +228 -0
- package/vendor/ars/scripts/check_v3_9_0_triangulation.py +366 -0
- package/vendor/ars/scripts/check_v3_9_2_phase_boundary.py +270 -0
- package/vendor/ars/scripts/check_v3_9_4_temporal_verification.py +139 -0
- package/vendor/ars/scripts/check_venue_disclosure_policies.py +63 -0
- package/vendor/ars/scripts/check_version_consistency.py +826 -0
- package/vendor/ars/scripts/check_workflow_classification.py +223 -0
- package/vendor/ars/scripts/chinese_literature_client.py +1938 -0
- package/vendor/ars/scripts/citation_verification_summary.py +85 -0
- package/vendor/ars/scripts/claim_audit_calibration.py +517 -0
- package/vendor/ars/scripts/claim_audit_finalizer.py +456 -0
- package/vendor/ars/scripts/claim_audit_pipeline.py +1594 -0
- package/vendor/ars/scripts/claim_registry_coverage.py +493 -0
- package/vendor/ars/scripts/claim_standing_discovery.py +784 -0
- package/vendor/ars/scripts/claim_standing_stance_runner.py +758 -0
- package/vendor/ars/scripts/claim_standing_stance_scorer.py +239 -0
- package/vendor/ars/scripts/claim_strength_drift_disposition.py +666 -0
- package/vendor/ars/scripts/contamination_signals.py +689 -0
- package/vendor/ars/scripts/corpus_consumer_manifest.json +19 -0
- package/vendor/ars/scripts/cross_model_codex_transport.py +1374 -0
- package/vendor/ars/scripts/cross_model_codex_verify.sh +6 -0
- package/vendor/ars/scripts/cross_model_handoff.py +359 -0
- package/vendor/ars/scripts/cross_model_smoke_test.sh +183 -0
- package/vendor/ars/scripts/cross_model_smoke_test_codex.sh +35 -0
- package/vendor/ars/scripts/cross_model_verification/gemini_is_grounded.jq +45 -0
- package/vendor/ars/scripts/cross_model_verification/gemini_sources.jq +45 -0
- package/vendor/ars/scripts/cross_model_verification/normalize_compat_verdict.py +57 -0
- package/vendor/ars/scripts/cross_model_verification/openai_has_completed_web_search.jq +15 -0
- package/vendor/ars/scripts/cross_model_verification/openai_sources.jq +17 -0
- package/vendor/ars/scripts/cross_model_verification/openai_text.jq +11 -0
- package/vendor/ars/scripts/crossref_client.py +225 -0
- package/vendor/ars/scripts/dispatch_e4_panel.py +2731 -0
- package/vendor/ars/scripts/evidence_rows.py +2043 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3.json +32 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_input.json +27 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime.json +32 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/author_stage3_prime_input.json +27 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override.json +50 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_override_action.json +14 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/compliance_pass.json +44 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/explicit_user_request_log.json +26 -0
- package/vendor/ars/scripts/fixtures/adjudication_activity/mandatory_checkpoint_log.json +116 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/README.md +56 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +24 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a1_pass_with_p1/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/negative/a7_orphan_completion/2026-04-30T15-22-04Z-d8f3.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +26 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/persisted_minor/2026-04-30T15-22-04Z-d8f3.verdict.yaml +19 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.audit_artifact_entry.json +24 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.meta.json +43 -0
- package/vendor/ars/scripts/fixtures/audit_artifact_consistency/positive/proposal_pass/2026-04-30T15-22-04Z-d8f3.verdict.yaml +12 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction.json +46 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/retraction_check_attestation.json +44 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase.json +44 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_abstract_missing.json +107 -0
- package/vendor/ars/scripts/fixtures/bibliographic_integrity_signals/tortured_phrase_v1_2_detected.json +124 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/expected_outcomes.json +77 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/manifest.yaml +37 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/001-valid-doi-test.json +20 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/002-valid-arxiv-test.json +19 -0
- package/vendor/ars/scripts/fixtures/check_evals_gold_set/clean/tuples/003-fabricated-test.json +20 -0
- package/vendor/ars/scripts/fixtures/claim_audit_calibration/gold_set.json +344 -0
- package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/query_plan.json +108 -0
- package/vendor/ars/scripts/fixtures/claim_standing_candidate_ledger/retrieval_input.json +179 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/concern_tracker.json +129 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/response_skeleton.md +19 -0
- package/vendor/ars/scripts/fixtures/committee_correspondence/16fd83f6aec7/source_letter.txt +9 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_draft.json +48 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/base_inventory.json +38 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/packet/consent.txt +1 -0
- package/vendor/ars/scripts/fixtures/content_coverage_advisory/session_sources.json +3 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/README.md +6 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/accepted_draft.md +35 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/cases.json +75 -0
- package/vendor/ars/scripts/fixtures/cross_document_consistency/preregistration.md +5 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/forbidden_event.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/grounded_verified.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/malformed.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/missing_search.jsonl +2 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/multiple_finals.jsonl +4 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/not_found.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/unbound_source.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/cross_model_codex_transport/wrong_search_shape.jsonl +3 -0
- package/vendor/ars/scripts/fixtures/evidence_rows/phase_e_inputs.json +114 -0
- package/vendor/ars/scripts/fixtures/evidence_rows/session_sources.json +5 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/cross-border-us-tw-gdpr.json +71 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/gdpr-member-state-unresolved.json +62 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/missing-data-axis.json +45 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/no-profile.json +33 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/tw-gdpr-two-axis.json +74 -0
- package/vendor/ars/scripts/fixtures/human_subjects_authority/us-gdpr-two-axis.json +74 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/lint-near-misses.json +72 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/no-profile-request.json +18 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/tw-candidates-request.json +63 -0
- package/vendor/ars/scripts/fixtures/review_pathway_rule_trace/us-candidates-request.json +77 -0
- package/vendor/ars/scripts/fixtures/review_target_context/exact-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/field-general-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/msr-2027-technical-full-declaration.json +24 -0
- package/vendor/ars/scripts/fixtures/review_target_context/synthetic-registry.json +92 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/README.md +21 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_attested_only.json +55 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_machine_supported.json +49 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_not_isolated.json +56 -0
- package/vendor/ars/scripts/fixtures/revision_claim_drift_v2/subject_context_unknown.json +49 -0
- package/vendor/ars/scripts/fixtures/submission_package/clean/paper.md +16 -0
- package/vendor/ars/scripts/fixtures/submission_package/clean/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/paper.md +11 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_authoryear/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/paper.tex +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/fallback_latex/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/marker_no_join/paper.md +7 -0
- package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/paper.md +8 -0
- package/vendor/ars/scripts/fixtures/submission_package/orphan_intext/references.bib +6 -0
- package/vendor/ars/scripts/fixtures/submission_package/passports/corpus_only.yaml +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/passports/summary_join.yaml +16 -0
- package/vendor/ars/scripts/fixtures/submission_package/profiles/full.yaml +15 -0
- package/vendor/ars/scripts/fixtures/submission_package/profiles/tight.yaml +15 -0
- package/vendor/ars/scripts/fixtures/submission_package/summary_join/paper.md +7 -0
- package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/paper.md +9 -0
- package/vendor/ars/scripts/fixtures/submission_package/uncited_reference/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_clean/paper.md +26 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_clean/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_violations/paper.md +20 -0
- package/vendor/ars/scripts/fixtures/submission_package/venue_violations/references.bib +13 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/base_inventory.json +101 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/consent-materials.txt +3 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/training-certificate.txt +2 -0
- package/vendor/ars/scripts/fixtures/submission_packet_manifest/packet/tw-consent-materials.txt +3 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/corpus_input.yaml +30 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.md +36 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/own_draft.tex +21 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/seed_expectations.json +218 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot.json +164 -0
- package/vendor/ars/scripts/fixtures/tortured_phrase_screening/snapshot_manifest.json +29 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/README.md +55 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/empty_feed.xml +10 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/error_5xx.html +7 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/arxiv/id_hit.xml +26 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/README.md +69 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/cnki_landing_page.html +13 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/error_5xx.html +2 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_ambiguous.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_hit.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coordinate_zero.json +14 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_hit.json +15 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esearch_coverage_zero.json +13 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_hit.json +43 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_issn_mismatch.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_no_doi.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_unknown_ra.json +34 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/esummary_year_mismatch.json +31 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_absent.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_exists.json +16 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/handle_internal_error.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_hit.json +25 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/istic_csl_other_title.json +18 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_cnki.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_crossref.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_istic.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/chinese_literature/ra_unknown_prefix.json +6 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/doi_hit.json +24 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/error_5xx.html +7 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/crossref/title_search_miss.json +15 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/doi_hit.json +29 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/error_5xx.json +4 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/openalex/title_search_miss.json +11 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/doi_hit.json +14 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/error_5xx.json +3 -0
- package/vendor/ars/scripts/fixtures/transport_bodies/semantic_scholar/title_search_miss.json +5 -0
- package/vendor/ars/scripts/human_read_attestation_resolver.py +467 -0
- package/vendor/ars/scripts/ideation_diversity_assignment_gate.py +430 -0
- package/vendor/ars/scripts/inquiry_branch_ledger.py +2540 -0
- package/vendor/ars/scripts/legacy/ars_apply_revision_patch_v1_0.py +715 -0
- package/vendor/ars/scripts/legacy/check_re_review_synthesis_v1_0.py +2215 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_10.py +223 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_7_3.py +277 -0
- package/vendor/ars/scripts/migrate_literature_corpus_to_v3_9_0.py +304 -0
- package/vendor/ars/scripts/model_tiering_manifest.json +46 -0
- package/vendor/ars/scripts/openalex_client.py +232 -0
- package/vendor/ars/scripts/parse_audit_verdict.py +802 -0
- package/vendor/ars/scripts/pdf_content_classifier_worker.py +176 -0
- package/vendor/ars/scripts/pdf_read_preflight.py +1455 -0
- package/vendor/ars/scripts/policy_anchor_disclosure_referee.py +354 -0
- package/vendor/ars/scripts/recompute_receipts.py +1414 -0
- package/vendor/ars/scripts/render_claim_standing_view.py +374 -0
- package/vendor/ars/scripts/render_eval_comment.py +130 -0
- package/vendor/ars/scripts/render_harness_retirement_issue.py +167 -0
- package/vendor/ars/scripts/repro_lock_validation.py +90 -0
- package/vendor/ars/scripts/research_workflow_profile.py +1079 -0
- package/vendor/ars/scripts/resolve_human_subjects_authority.py +1158 -0
- package/vendor/ars/scripts/resolve_review_target_context.py +683 -0
- package/vendor/ars/scripts/resume_e4_record.py +509 -0
- package/vendor/ars/scripts/retraction_status.py +484 -0
- package/vendor/ars/scripts/review_criteria_binding.py +889 -0
- package/vendor/ars/scripts/review_panel_provenance.py +744 -0
- package/vendor/ars/scripts/revision_roadmap.py +1967 -0
- package/vendor/ars/scripts/run_ci_pytest_manifest.py +116 -0
- package/vendor/ars/scripts/run_codex_audit.sh +1191 -0
- package/vendor/ars/scripts/run_evals.py +513 -0
- package/vendor/ars/scripts/run_ideation_diversity_no_call.py +3505 -0
- package/vendor/ars/scripts/run_indirect_prompt_injection_no_call.py +3330 -0
- package/vendor/ars/scripts/run_indirect_prompt_injection_probe.py +399 -0
- package/vendor/ars/scripts/run_review_criteria_constructive_value.py +1895 -0
- package/vendor/ars/scripts/run_role_topology_utility_dry_run.py +606 -0
- package/vendor/ars/scripts/score_review_criteria_constructive_value.py +617 -0
- package/vendor/ars/scripts/semantic_scholar_client.py +291 -0
- package/vendor/ars/scripts/slr_lineage.py +59 -0
- package/vendor/ars/scripts/sync_adapter_docs.py +118 -0
- package/vendor/ars/scripts/temporal_integrity_audit.py +840 -0
- package/vendor/ars/scripts/test_431_exact_or_bust.py +253 -0
- package/vendor/ars/scripts/test__eval_threshold_gate.py +125 -0
- package/vendor/ars/scripts/test__markdown_lint_util.py +129 -0
- package/vendor/ars/scripts/test__next_verified_at_ms.py +256 -0
- package/vendor/ars/scripts/test_adjacent_framing_probe_lint.py +171 -0
- package/vendor/ars/scripts/test_adjudication_activity.py +1515 -0
- package/vendor/ars/scripts/test_ars_anchorize_draft.py +178 -0
- package/vendor/ars/scripts/test_ars_apply_revision_patch.py +1335 -0
- package/vendor/ars/scripts/test_ars_cache_invalidate.py +51 -0
- package/vendor/ars/scripts/test_ars_mark_read.py +910 -0
- package/vendor/ars/scripts/test_ars_update_check.py +816 -0
- package/vendor/ars/scripts/test_ars_write_scope_guard.py +790 -0
- package/vendor/ars/scripts/test_arxiv_client.py +374 -0
- package/vendor/ars/scripts/test_audit_schemas.py +560 -0
- package/vendor/ars/scripts/test_audit_snapshot_render_section_0.py +105 -0
- package/vendor/ars/scripts/test_block_parser.py +259 -0
- package/vendor/ars/scripts/test_bootstrap_timeline_yaml.py +148 -0
- package/vendor/ars/scripts/test_build_claim_standing_candidate_ledger.py +1203 -0
- package/vendor/ars/scripts/test_build_claim_standing_query_plan.py +791 -0
- package/vendor/ars/scripts/test_build_submission_packet_manifest.py +2644 -0
- package/vendor/ars/scripts/test_check_215_field_norm.py +238 -0
- package/vendor/ars/scripts/test_check_216_surface_form.py +341 -0
- package/vendor/ars/scripts/test_check_268_nested_commitment_ledger.py +194 -0
- package/vendor/ars/scripts/test_check_390_revision_patch_discipline.py +279 -0
- package/vendor/ars/scripts/test_check_392_citation_verification_intake.py +144 -0
- package/vendor/ars/scripts/test_check_394_submission_policy.py +200 -0
- package/vendor/ars/scripts/test_check_439_format_profile.py +252 -0
- package/vendor/ars/scripts/test_check_619_disclosure_closeout.py +158 -0
- package/vendor/ars/scripts/test_check_630_codex_subscription_transport.py +245 -0
- package/vendor/ars/scripts/test_check_669_review_pathway_rule_trace.py +304 -0
- package/vendor/ars/scripts/test_check_670_revision_roadmap_integration.py +260 -0
- package/vendor/ars/scripts/test_check_673_adjudication_activity.py +367 -0
- package/vendor/ars/scripts/test_check_684_review_criteria_binding.py +274 -0
- package/vendor/ars/scripts/test_check_agents_mirror_sync.py +137 -0
- package/vendor/ars/scripts/test_check_audit_artifact_consistency.py +2133 -0
- package/vendor/ars/scripts/test_check_benchmark_report.py +117 -0
- package/vendor/ars/scripts/test_check_bibliographic_integrity_signals.py +609 -0
- package/vendor/ars/scripts/test_check_calibration_tiers.py +376 -0
- package/vendor/ars/scripts/test_check_changelog_covers_merges.py +509 -0
- package/vendor/ars/scripts/test_check_ci_pytest_manifest.py +425 -0
- package/vendor/ars/scripts/test_check_claim_standing_candidate_ledger_integration.py +256 -0
- package/vendor/ars/scripts/test_check_claim_standing_freshness.py +277 -0
- package/vendor/ars/scripts/test_check_collaboration_depth_rubric.py +239 -0
- package/vendor/ars/scripts/test_check_command_frontmatter_name.py +178 -0
- package/vendor/ars/scripts/test_check_committee_correspondence.py +298 -0
- package/vendor/ars/scripts/test_check_compliance_report.py +381 -0
- package/vendor/ars/scripts/test_check_content_coverage_advisory_integration.py +308 -0
- package/vendor/ars/scripts/test_check_control_availability.py +361 -0
- package/vendor/ars/scripts/test_check_cross_document_consistency_advisory_integration.py +698 -0
- package/vendor/ars/scripts/test_check_cross_model_handoff_contract.py +301 -0
- package/vendor/ars/scripts/test_check_cross_model_verification_sync.py +203 -0
- package/vendor/ars/scripts/test_check_data_access_level.py +227 -0
- package/vendor/ars/scripts/test_check_data_flows.py +382 -0
- package/vendor/ars/scripts/test_check_decision_contract.py +387 -0
- package/vendor/ars/scripts/test_check_degradation_registry.py +270 -0
- package/vendor/ars/scripts/test_check_distribution_surface_claims.py +225 -0
- package/vendor/ars/scripts/test_check_domain_evidence_profile.py +439 -0
- package/vendor/ars/scripts/test_check_e4_promotion.py +163 -0
- package/vendor/ars/scripts/test_check_evals_gold_set.py +312 -0
- package/vendor/ars/scripts/test_check_evidence_row_integration.py +187 -0
- package/vendor/ars/scripts/test_check_field_norm_severity.py +173 -0
- package/vendor/ars/scripts/test_check_firm_rules_sync.py +342 -0
- package/vendor/ars/scripts/test_check_heldout_measurement_report.py +1508 -0
- package/vendor/ars/scripts/test_check_human_subjects_output_contract.py +129 -0
- package/vendor/ars/scripts/test_check_human_subjects_reference_migration.py +756 -0
- package/vendor/ars/scripts/test_check_instruction_data_boundary.py +204 -0
- package/vendor/ars/scripts/test_check_judge_prompt_version.py +90 -0
- package/vendor/ars/scripts/test_check_model_tiering.py +236 -0
- package/vendor/ars/scripts/test_check_panel_synthesis.py +1658 -0
- package/vendor/ars/scripts/test_check_passport_reset_contract.py +249 -0
- package/vendor/ars/scripts/test_check_pattern_eval_manifest.py +381 -0
- package/vendor/ars/scripts/test_check_persuasion_invariance_fixtures.py +591 -0
- package/vendor/ars/scripts/test_check_phase_conformance.py +4366 -0
- package/vendor/ars/scripts/test_check_pipeline_boundary_semantics.py +931 -0
- package/vendor/ars/scripts/test_check_pipeline_integrity.py +243 -0
- package/vendor/ars/scripts/test_check_policy_anchor_protocol.py +236 -0
- package/vendor/ars/scripts/test_check_policy_anchor_table.py +295 -0
- package/vendor/ars/scripts/test_check_prisma_trAIce_freshness.py +68 -0
- package/vendor/ars/scripts/test_check_promotion_bakeoff_preregistration.py +799 -0
- package/vendor/ars/scripts/test_check_ranking_lift.py +377 -0
- package/vendor/ars/scripts/test_check_re_review_synthesis.py +3398 -0
- package/vendor/ars/scripts/test_check_receipt_enum_sync.py +176 -0
- package/vendor/ars/scripts/test_check_repro_lock.py +107 -0
- package/vendor/ars/scripts/test_check_reviewer_data_fences.py +334 -0
- package/vendor/ars/scripts/test_check_reviewer_finding_contract.py +1107 -0
- package/vendor/ars/scripts/test_check_reviewer_role_label.py +491 -0
- package/vendor/ars/scripts/test_check_reviewer_scoring_honesty.py +222 -0
- package/vendor/ars/scripts/test_check_reviewer_sprint_prompt_sync.py +373 -0
- package/vendor/ars/scripts/test_check_revision_claim_drift_suite_v2.py +1925 -0
- package/vendor/ars/scripts/test_check_revision_token_conservation.py +398 -0
- package/vendor/ars/scripts/test_check_risk_register.py +336 -0
- package/vendor/ars/scripts/test_check_role_scoped_contract.py +1104 -0
- package/vendor/ars/scripts/test_check_rq_framing_patterns.py +110 -0
- package/vendor/ars/scripts/test_check_rubric_weight_consistency.py +32 -0
- package/vendor/ars/scripts/test_check_seeded_defect_fixtures.py +392 -0
- package/vendor/ars/scripts/test_check_setup_cross_model_parity.py +121 -0
- package/vendor/ars/scripts/test_check_spec_consistency.py +1081 -0
- package/vendor/ars/scripts/test_check_sprint_contract.py +458 -0
- package/vendor/ars/scripts/test_check_stage_capability_matrix.py +698 -0
- package/vendor/ars/scripts/test_check_submission_packet_manifest_integration.py +177 -0
- package/vendor/ars/scripts/test_check_surface_form_parity.py +417 -0
- package/vendor/ars/scripts/test_check_task_type.py +116 -0
- package/vendor/ars/scripts/test_check_tools_allowlist.py +835 -0
- package/vendor/ars/scripts/test_check_tortured_phrase_screening_integration.py +1306 -0
- package/vendor/ars/scripts/test_check_v3_10_134_write_scope.py +251 -0
- package/vendor/ars/scripts/test_check_v3_10_policy.py +547 -0
- package/vendor/ars/scripts/test_check_v3_6_7_pattern_protection.py +960 -0
- package/vendor/ars/scripts/test_check_v3_6_8_audit_scope_block.py +1000 -0
- package/vendor/ars/scripts/test_check_v3_6_8_cite_provenance_pipeline.py +454 -0
- package/vendor/ars/scripts/test_check_v3_6_8_frontmatter_trust_schema.py +581 -0
- package/vendor/ars/scripts/test_check_v3_6_8_mark_read_commands.py +120 -0
- package/vendor/ars/scripts/test_check_v3_6_8_pattern_protection.py +1138 -0
- package/vendor/ars/scripts/test_check_v3_7_3_three_layer_citation.py +566 -0
- package/vendor/ars/scripts/test_check_v3_8_annotation_literal_sync.py +262 -0
- package/vendor/ars/scripts/test_check_v3_9_0_triangulation.py +321 -0
- package/vendor/ars/scripts/test_check_v3_9_2_phase_boundary.py +190 -0
- package/vendor/ars/scripts/test_check_v3_9_4_temporal_verification.py +471 -0
- package/vendor/ars/scripts/test_check_version_consistency.py +1462 -0
- package/vendor/ars/scripts/test_check_workflow_classification.py +225 -0
- package/vendor/ars/scripts/test_chinese_literature_client.py +1889 -0
- package/vendor/ars/scripts/test_citation_existence_policy.py +480 -0
- package/vendor/ars/scripts/test_citation_verification_summary.py +342 -0
- package/vendor/ars/scripts/test_claim_audit_calibration.py +882 -0
- package/vendor/ars/scripts/test_claim_audit_finalizer.py +979 -0
- package/vendor/ars/scripts/test_claim_audit_pipeline.py +2398 -0
- package/vendor/ars/scripts/test_claim_audit_schema.py +1778 -0
- package/vendor/ars/scripts/test_claim_intent_manifest.py +666 -0
- package/vendor/ars/scripts/test_claim_registry_coverage.py +246 -0
- package/vendor/ars/scripts/test_claim_standing_discovery.py +579 -0
- package/vendor/ars/scripts/test_claim_standing_pipeline_wiring.py +290 -0
- package/vendor/ars/scripts/test_claim_standing_stance_assets.py +399 -0
- package/vendor/ars/scripts/test_claim_standing_stance_contracts.py +383 -0
- package/vendor/ars/scripts/test_claim_standing_stance_runner.py +349 -0
- package/vendor/ars/scripts/test_claim_standing_transmissions.py +605 -0
- package/vendor/ars/scripts/test_claim_strength_drift_disposition.py +517 -0
- package/vendor/ars/scripts/test_claim_verification_coverage_contract.py +104 -0
- package/vendor/ars/scripts/test_contamination_signals.py +1086 -0
- package/vendor/ars/scripts/test_content_coverage_advisory.py +1767 -0
- package/vendor/ars/scripts/test_cross_document_consistency_advisory.py +1270 -0
- package/vendor/ars/scripts/test_cross_model_codex_transport.py +1152 -0
- package/vendor/ars/scripts/test_cross_model_handoff.py +571 -0
- package/vendor/ars/scripts/test_cross_model_verification_guards.py +792 -0
- package/vendor/ars/scripts/test_crossref_client.py +393 -0
- package/vendor/ars/scripts/test_dispatch_e4_panel.py +4235 -0
- package/vendor/ars/scripts/test_e2e_claim_audit.py +540 -0
- package/vendor/ars/scripts/test_eval_harness_workflow.py +140 -0
- package/vendor/ars/scripts/test_evals_citation_extraction.py +150 -0
- package/vendor/ars/scripts/test_evals_lift_report_schema.py +108 -0
- package/vendor/ars/scripts/test_evidence_rows.py +2593 -0
- package/vendor/ars/scripts/test_experiment_provenance.py +915 -0
- package/vendor/ars/scripts/test_human_read_attestation_resolver.py +477 -0
- package/vendor/ars/scripts/test_ideation_diversity_assignment_gate.py +615 -0
- package/vendor/ars/scripts/test_indirect_prompt_injection_behavior_probe.py +250 -0
- package/vendor/ars/scripts/test_inquiry_branch_ledger.py +2296 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_10.py +248 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_7_3.py +545 -0
- package/vendor/ars/scripts/test_migrate_literature_corpus_to_v3_9_0.py +497 -0
- package/vendor/ars/scripts/test_normalize_compat_verdict.py +149 -0
- package/vendor/ars/scripts/test_openalex_client.py +490 -0
- package/vendor/ars/scripts/test_passport_yaml.py +104 -0
- package/vendor/ars/scripts/test_pattern_eval_runtime.py +1295 -0
- package/vendor/ars/scripts/test_pdf_read_preflight.py +1943 -0
- package/vendor/ars/scripts/test_policy_anchor_disclosure.py +666 -0
- package/vendor/ars/scripts/test_reading_probe_lint.py +218 -0
- package/vendor/ars/scripts/test_recompute_receipts.py +778 -0
- package/vendor/ars/scripts/test_render_claim_standing_view.py +192 -0
- package/vendor/ars/scripts/test_render_eval_comment.py +162 -0
- package/vendor/ars/scripts/test_render_harness_retirement_issue.py +110 -0
- package/vendor/ars/scripts/test_repro_lock_validation_drift.py +100 -0
- package/vendor/ars/scripts/test_research_workflow_profile.py +734 -0
- package/vendor/ars/scripts/test_resolve_human_subjects_authority.py +1219 -0
- package/vendor/ars/scripts/test_resolve_review_target_context.py +703 -0
- package/vendor/ars/scripts/test_resume_e4_record.py +315 -0
- package/vendor/ars/scripts/test_retraction_status.py +456 -0
- package/vendor/ars/scripts/test_review_criteria_binding.py +629 -0
- package/vendor/ars/scripts/test_review_panel_provenance.py +565 -0
- package/vendor/ars/scripts/test_review_pathway_rule_trace.py +821 -0
- package/vendor/ars/scripts/test_revision_roadmap.py +1255 -0
- package/vendor/ars/scripts/test_run_ci_pytest_manifest.py +186 -0
- package/vendor/ars/scripts/test_run_codex_audit_e2e.py +369 -0
- package/vendor/ars/scripts/test_run_evals.py +430 -0
- package/vendor/ars/scripts/test_run_guard_launcher.py +500 -0
- package/vendor/ars/scripts/test_run_ideation_diversity_no_call.py +1833 -0
- package/vendor/ars/scripts/test_run_indirect_prompt_injection_no_call.py +1889 -0
- package/vendor/ars/scripts/test_run_review_criteria_constructive_value.py +586 -0
- package/vendor/ars/scripts/test_run_role_topology_utility_dry_run.py +428 -0
- package/vendor/ars/scripts/test_score_review_criteria_constructive_value.py +340 -0
- package/vendor/ars/scripts/test_semantic_scholar_client.py +554 -0
- package/vendor/ars/scripts/test_slr_lineage_emission.py +230 -0
- package/vendor/ars/scripts/test_socratic_rq_non_generation_contract.py +173 -0
- package/vendor/ars/scripts/test_temporal_integrity_audit.py +438 -0
- package/vendor/ars/scripts/test_text_similarity.py +95 -0
- package/vendor/ars/scripts/test_title_fuzzy_false_positive.py +111 -0
- package/vendor/ars/scripts/test_tortured_phrase_screening.py +2959 -0
- package/vendor/ars/scripts/test_transport_fixture_citation_gate.py +338 -0
- package/vendor/ars/scripts/test_uncited_assertion.py +558 -0
- package/vendor/ars/scripts/test_v3_6_7_phase_6_6.py +1279 -0
- package/vendor/ars/scripts/test_validate_compliance_fixtures.py +36 -0
- package/vendor/ars/scripts/test_validate_ideation_diversity_assets.py +230 -0
- package/vendor/ars/scripts/test_venue_disclosure_contract.py +755 -0
- package/vendor/ars/scripts/test_verification_cache.py +280 -0
- package/vendor/ars/scripts/test_verification_gate.py +461 -0
- package/vendor/ars/scripts/test_verify_passport_cli.py +123 -0
- package/vendor/ars/scripts/test_verify_submission_package.py +1407 -0
- package/vendor/ars/scripts/test_version_records_schema.py +211 -0
- package/vendor/ars/scripts/tortured_phrase_screening.py +3502 -0
- package/vendor/ars/scripts/uncited_assertion_detector.py +254 -0
- package/vendor/ars/scripts/v3_6_7_inversion_manifest.json +9 -0
- package/vendor/ars/scripts/v3_6_8_inversion_manifest.json +10 -0
- package/vendor/ars/scripts/validate_claim_standing_stance_assets.py +249 -0
- package/vendor/ars/scripts/validate_compliance_fixtures.py +56 -0
- package/vendor/ars/scripts/validate_ideation_diversity_assets.py +303 -0
- package/vendor/ars/scripts/venue_disclosure_contract_harness.py +837 -0
- package/vendor/ars/scripts/verification_cache.py +276 -0
- package/vendor/ars/scripts/verification_gate/__init__.py +345 -0
- package/vendor/ars/scripts/verify_passport.py +133 -0
- package/vendor/ars/scripts/verify_submission_package.py +1657 -0
- package/vendor/ars/shared/agents/compliance_agent.md +136 -0
- package/vendor/ars/shared/artifact_reproducibility_pattern.md +173 -0
- package/vendor/ars/shared/benchmark_report.schema.json +81 -0
- package/vendor/ars/shared/benchmark_report_pattern.md +180 -0
- package/vendor/ars/shared/bibliographic_integrity_signals.md +142 -0
- package/vendor/ars/shared/collaboration_depth_rubric.md +154 -0
- package/vendor/ars/shared/compliance_checkpoint_protocol.md +162 -0
- package/vendor/ars/shared/compliance_report.schema.json +187 -0
- package/vendor/ars/shared/contracts/README.md +938 -0
- package/vendor/ars/shared/contracts/activity/adjudication_activity_input.schema.json +555 -0
- package/vendor/ars/shared/contracts/activity/adjudication_activity_store.schema.json +560 -0
- package/vendor/ars/shared/contracts/audit/audit_jsonl.schema.json +128 -0
- package/vendor/ars/shared/contracts/audit/audit_sidecar.schema.json +169 -0
- package/vendor/ars/shared/contracts/audit/audit_verdict.schema.json +133 -0
- package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory.schema.json +480 -0
- package/vendor/ars/shared/contracts/audit/cross_document_consistency_advisory_draft.schema.json +564 -0
- package/vendor/ars/shared/contracts/audit/cross_document_source_manifest.schema.json +202 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_advisory.schema.json +1362 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot.schema.json +208 -0
- package/vendor/ars/shared/contracts/audit/tortured_phrase_snapshot_manifest.schema.json +335 -0
- package/vendor/ars/shared/contracts/capability/stage_capability_matrix.json +434 -0
- package/vendor/ars/shared/contracts/claim_standing/candidate_ledger.schema.json +705 -0
- package/vendor/ars/shared/contracts/claim_standing/query_plan.schema.json +389 -0
- package/vendor/ars/shared/contracts/claim_standing/query_plan_v1_1.schema.json +782 -0
- package/vendor/ars/shared/contracts/claim_standing/retrieval_input.schema.json +440 -0
- package/vendor/ars/shared/contracts/claim_standing/stance_record.schema.json +460 -0
- package/vendor/ars/shared/contracts/claim_standing/transmission_ledger.schema.json +282 -0
- package/vendor/ars/shared/contracts/cross_model/codex_citation_receipt.schema.json +157 -0
- package/vendor/ars/shared/contracts/cross_model/codex_citation_request.schema.json +23 -0
- package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_commitment.schema.json +55 -0
- package/vendor/ars/shared/contracts/cross_model/promotion_bakeoff_sealed_reveal.schema.json +50 -0
- package/vendor/ars/shared/contracts/degradation_registry.json +428 -0
- package/vendor/ars/shared/contracts/evaluator/full.json +126 -0
- package/vendor/ars/shared/contracts/evidence/claim_registry.schema.json +50 -0
- package/vendor/ars/shared/contracts/evidence/claim_registry_coverage_report.schema.json +79 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row.schema.json +504 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_1.schema.json +364 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_2.schema.json +714 -0
- package/vendor/ars/shared/contracts/evidence/evidence_row_v1_3.schema.json +524 -0
- package/vendor/ars/shared/contracts/human_subjects/authority_profile_registry.schema.json +497 -0
- package/vendor/ars/shared/contracts/human_subjects/committee_correspondence.schema.json +253 -0
- package/vendor/ars/shared/contracts/human_subjects/content_coverage_advisory.schema.json +620 -0
- package/vendor/ars/shared/contracts/human_subjects/irb_context_record.schema.json +329 -0
- package/vendor/ars/shared/contracts/human_subjects/resolved_authority_context.schema.json +347 -0
- package/vendor/ars/shared/contracts/human_subjects/review_pathway_rule_trace.schema.json +265 -0
- package/vendor/ars/shared/contracts/human_subjects/review_pathway_trace_request.schema.json +127 -0
- package/vendor/ars/shared/contracts/human_subjects/submission_packet_inventory.schema.json +240 -0
- package/vendor/ars/shared/contracts/human_subjects/submission_packet_manifest.schema.json +999 -0
- package/vendor/ars/shared/contracts/passport/audit_artifact_entry.schema.json +266 -0
- package/vendor/ars/shared/contracts/passport/bibliographic_integrity_signal.schema.json +1676 -0
- package/vendor/ars/shared/contracts/passport/citation_provenance.schema.json +107 -0
- package/vendor/ars/shared/contracts/passport/citation_verification_summary.schema.json +164 -0
- package/vendor/ars/shared/contracts/passport/claim_audit_result.schema.json +124 -0
- package/vendor/ars/shared/contracts/passport/claim_drift.schema.json +58 -0
- package/vendor/ars/shared/contracts/passport/claim_intent_manifest.schema.json +107 -0
- package/vendor/ars/shared/contracts/passport/constraint_violation.schema.json +65 -0
- package/vendor/ars/shared/contracts/passport/experiment_alignment_result.schema.json +69 -0
- package/vendor/ars/shared/contracts/passport/experiment_provenance_entry.schema.json +169 -0
- package/vendor/ars/shared/contracts/passport/human_read_log.schema.json +86 -0
- package/vendor/ars/shared/contracts/passport/inquiry_ledger_ref.schema.json +22 -0
- package/vendor/ars/shared/contracts/passport/literature_corpus_entry.schema.json +650 -0
- package/vendor/ars/shared/contracts/passport/preregistration_artifact.schema.json +132 -0
- package/vendor/ars/shared/contracts/passport/rejection_log.schema.json +89 -0
- package/vendor/ars/shared/contracts/passport/reset_ledger_entry.schema.json +158 -0
- package/vendor/ars/shared/contracts/passport/temporal_audit_results.schema.json +208 -0
- package/vendor/ars/shared/contracts/passport/terminal_policies.schema.json +50 -0
- package/vendor/ars/shared/contracts/passport/timeline.schema.json +102 -0
- package/vendor/ars/shared/contracts/passport/uncited_assertion.schema.json +56 -0
- package/vendor/ars/shared/contracts/passport/uncited_audit_failure.schema.json +72 -0
- package/vendor/ars/shared/contracts/passport/user_attested_read_resolution.schema.json +87 -0
- package/vendor/ars/shared/contracts/passport/version_records.schema.json +138 -0
- package/vendor/ars/shared/contracts/patch/block_manifest.schema.json +45 -0
- package/vendor/ars/shared/contracts/patch/legacy/v1_0/revision_patch.schema.json +110 -0
- package/vendor/ars/shared/contracts/patch/revision_patch.schema.json +250 -0
- package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_diagnostic.schema.json +39 -0
- package/vendor/ars/shared/contracts/pdf/pdf_content_classifier_worker.schema.json +88 -0
- package/vendor/ars/shared/contracts/pdf/pdf_read_preflight.schema.json +227 -0
- package/vendor/ars/shared/contracts/re_review/input_manifest.schema.json +161 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/input_manifest.schema.json +134 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/precommitment.schema.json +193 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/traceability.schema.json +841 -0
- package/vendor/ars/shared/contracts/re_review/legacy/v1_0/verdict_record.schema.json +244 -0
- package/vendor/ars/shared/contracts/re_review/precommitment.schema.json +193 -0
- package/vendor/ars/shared/contracts/re_review/traceability.schema.json +916 -0
- package/vendor/ars/shared/contracts/re_review/verdict_record.schema.json +245 -0
- package/vendor/ars/shared/contracts/research_workflow/inquiry_branch_ledger.schema.json +449 -0
- package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile.schema.json +222 -0
- package/vendor/ars/shared/contracts/research_workflow/research_workflow_profile_selection_receipt.schema.json +111 -0
- package/vendor/ars/shared/contracts/review_target/constructive_review_findings.schema.json +172 -0
- package/vendor/ars/shared/contracts/review_target/criteria_registry.schema.json +97 -0
- package/vendor/ars/shared/contracts/review_target/review_criteria_binding_manifest.schema.json +235 -0
- package/vendor/ars/shared/contracts/review_target/review_criteria_source_receipt.schema.json +158 -0
- package/vendor/ars/shared/contracts/review_target/review_target_context.schema.json +106 -0
- package/vendor/ars/shared/contracts/review_target/review_target_declaration.schema.json +118 -0
- package/vendor/ars/shared/contracts/reviewer/full.json +114 -0
- package/vendor/ars/shared/contracts/reviewer/methodology_focus.json +75 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance.schema.json +263 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_carrier.schema.json +122 -0
- package/vendor/ars/shared/contracts/reviewer/review_panel_provenance_input.schema.json +120 -0
- package/vendor/ars/shared/contracts/revision/author_adjudication.schema.json +251 -0
- package/vendor/ars/shared/contracts/revision/author_adjudication_input.schema.json +25 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition.schema.json +97 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_disposition_input.schema.json +80 -0
- package/vendor/ars/shared/contracts/revision/claim_strength_drift_findings.schema.json +139 -0
- package/vendor/ars/shared/contracts/revision/claim_surface_manifest.schema.json +99 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_authorization.schema.json +140 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_authorization_input.schema.json +28 -0
- package/vendor/ars/shared/contracts/revision/integrity_correction_list.schema.json +48 -0
- package/vendor/ars/shared/contracts/revision/integrity_pass_receipt.schema.json +16 -0
- package/vendor/ars/shared/contracts/revision/revision_evidence_bundle.schema.json +134 -0
- package/vendor/ars/shared/contracts/revision/revision_roadmap.schema.json +334 -0
- package/vendor/ars/shared/contracts/submission/format_profile.example.yaml +33 -0
- package/vendor/ars/shared/contracts/submission/format_profile.schema.json +102 -0
- package/vendor/ars/shared/contracts/submission/submission_verification_report.schema.json +233 -0
- package/vendor/ars/shared/contracts/submission/venue_profile.schema.json +114 -0
- package/vendor/ars/shared/contracts/writer/full.json +87 -0
- package/vendor/ars/shared/cross_model_verification.md +714 -0
- package/vendor/ars/shared/evals_lift_report.schema.json +141 -0
- package/vendor/ars/shared/ground_truth_isolation_pattern.md +275 -0
- package/vendor/ars/shared/handoff_schemas.md +1209 -0
- package/vendor/ars/shared/human_subjects_authority_registry.json +1278 -0
- package/vendor/ars/shared/mode_spectrum.md +57 -0
- package/vendor/ars/shared/model_tiering.md +83 -0
- package/vendor/ars/shared/policy_data/nature_policy.md +56 -0
- package/vendor/ars/shared/prisma_trAIce_protocol.md +157 -0
- package/vendor/ars/shared/raise_framework.md +129 -0
- package/vendor/ars/shared/references/authority_content_coverage_advisory_protocol.md +275 -0
- package/vendor/ars/shared/references/claim_standing_candidate_ledger_protocol.md +66 -0
- package/vendor/ars/shared/references/claim_strength_ladder.md +93 -0
- package/vendor/ars/shared/references/cross_document_consistency_advisory_protocol.md +263 -0
- package/vendor/ars/shared/references/evidence_row_protocol.md +260 -0
- package/vendor/ars/shared/references/firm_rules.md +90 -0
- package/vendor/ars/shared/references/human_subjects_authority_protocol.md +274 -0
- package/vendor/ars/shared/references/intent_clarification_protocol.md +168 -0
- package/vendor/ars/shared/references/irb_terminology_glossary.md +229 -0
- package/vendor/ars/shared/references/protected_hedging_phrases.md +118 -0
- package/vendor/ars/shared/references/psychometric_terminology_glossary.md +109 -0
- package/vendor/ars/shared/references/review_criteria_consumer_protocol.md +238 -0
- package/vendor/ars/shared/references/review_pathway_rule_trace_protocol.md +166 -0
- package/vendor/ars/shared/references/submission_packet_manifest_protocol.md +292 -0
- package/vendor/ars/shared/references/word_count_conventions.md +124 -0
- package/vendor/ars/shared/research_workflow_profiles/field_general.json +1 -0
- package/vendor/ars/shared/review_criteria_registry.json +207 -0
- package/vendor/ars/shared/review_criteria_sources/msr-2027-technical-papers.2026-08-24.json +46 -0
- package/vendor/ars/shared/review_criteria_sources/sigsoft-empirical-standards.2026-08-24.json +31 -0
- package/vendor/ars/shared/sprint_contract.schema.json +482 -0
- package/vendor/ars/shared/style_calibration_protocol.md +151 -0
- package/vendor/ars/shared/templates/codex_audit_multifile_template.md +263 -0
- package/vendor/ars/tools/release-discipline/.toolkit-version +1 -0
- package/vendor/ars/tools/release-discipline/README.md +4 -0
- package/vendor/ars/tools/release-discipline/scripts/_release_doc_alignment_schema.py +1011 -0
- package/vendor/ars/tools/release-discipline/scripts/check_command_invariants.py +497 -0
- package/vendor/ars/tools/release-discipline/scripts/check_release_doc_alignment.py +263 -0
- package/vendor/ars/tools/release-discipline/scripts/sync-toolkit.sh +147 -0
- package/vendor/windows/NOTICE.md +12 -0
- package/vendor/windows/arm64/fd.exe +0 -0
- package/vendor/windows/arm64/licenses/fd/LICENSE-APACHE +201 -0
- package/vendor/windows/arm64/licenses/fd/LICENSE-MIT +21 -0
- package/vendor/windows/arm64/licenses/ripgrep/COPYING +3 -0
- package/vendor/windows/arm64/licenses/ripgrep/LICENSE-MIT +21 -0
- package/vendor/windows/arm64/licenses/ripgrep/UNLICENSE +24 -0
- package/vendor/windows/arm64/rg.exe +0 -0
- package/vendor/windows/x64/fd.exe +0 -0
- package/vendor/windows/x64/licenses/fd/LICENSE-APACHE +201 -0
- package/vendor/windows/x64/licenses/fd/LICENSE-MIT +21 -0
- package/vendor/windows/x64/licenses/ripgrep/COPYING +3 -0
- package/vendor/windows/x64/licenses/ripgrep/LICENSE-MIT +21 -0
- package/vendor/windows/x64/licenses/ripgrep/UNLICENSE +24 -0
- package/vendor/windows/x64/rg.exe +0 -0
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""#105 v3.7.3 contamination_signals resolvers.
|
|
3
|
+
|
|
4
|
+
Pure functions implementing v3.7.3 spec §3.2 Vector 1 + Vector 2 for use
|
|
5
|
+
by the migration tool. bibliography_agent computes these at ingest time;
|
|
6
|
+
this module gives the migration tool the equivalent computation for
|
|
7
|
+
post-hoc backfill on pre-v3.7.3 entries.
|
|
8
|
+
|
|
9
|
+
Design: docs/design/2026-05-15-issue-105-contamination-signals-backfill-design.md
|
|
10
|
+
Spec: docs/design/2026-05-12-ars-v3.7.3-claim-faithfulness-and-contaminated-source-spec.md §3.2
|
|
11
|
+
|
|
12
|
+
Omission reason-provenance (#511 Part A): wherever a resolver's contract below
|
|
13
|
+
says "caller MUST omit field" because of API DEGRADATION (an *Unavailable
|
|
14
|
+
exception), the caller additionally records the omission on the entry as
|
|
15
|
+
`contamination_signal_omissions: {<field>: "api_degraded"}` so a degraded
|
|
16
|
+
lookup stays distinguishable from "never computed". Derivable omissions are
|
|
17
|
+
NOT recorded (manual exemption ← obtained_via='manual'; arXiv skip ← absent
|
|
18
|
+
arxiv_id). Schema + mutual-exclusion rules:
|
|
19
|
+
shared/contracts/passport/literature_corpus_entry.schema.json; registry row
|
|
20
|
+
`contamination_signal_api_degradation` in
|
|
21
|
+
shared/contracts/degradation_registry.json.
|
|
22
|
+
"""
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from typing import Any, Mapping, MutableMapping, Protocol
|
|
26
|
+
|
|
27
|
+
# Re-export ArxivUnavailable so callers (and tests) can reference it from the
|
|
28
|
+
# signals module alongside the other resolver exceptions. Dual-path import
|
|
29
|
+
# mirrors the client modules' own import guard.
|
|
30
|
+
try:
|
|
31
|
+
from arxiv_client import ArxivUnavailable
|
|
32
|
+
except ImportError:
|
|
33
|
+
from scripts.arxiv_client import ArxivUnavailable
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# #431 §0.12.3b — the resolver-decision logic version, stored under the
|
|
37
|
+
# "decision_version" key in each cached verdict value (spec-preferred form: no
|
|
38
|
+
# cache-key / schema migration; pre-v5 rows simply re-resolve once under v5).
|
|
39
|
+
# Bump it whenever the accept/reject logic changes so a verdict produced by a
|
|
40
|
+
# DIFFERENT logic is not silently reused. v5 is the exact-title-or-bust pivot: a
|
|
41
|
+
# pre-v5 row (written under the v3/v4 author-agree tiers, e.g. a `Study 1` /
|
|
42
|
+
# `Study 2` same-author pair stored as `matched_by=title`) would otherwise be
|
|
43
|
+
# returned as `matched` with `client.title_search` never called, bypassing the
|
|
44
|
+
# v5 loop entirely — a dangerous false-positive surviving the pivot for up to the
|
|
45
|
+
# 90-day TTL. A row whose stored version is absent or != this constant is a MISS.
|
|
46
|
+
RESOLVER_DECISION_VERSION = "431-v5"
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# 10-venue closed list per v3.7.3 spec §3.2 + schema description.
|
|
50
|
+
# This list is intentionally redundant with the bibliography_agent's
|
|
51
|
+
# in-prose list — adapters and migration tools both need the literal set.
|
|
52
|
+
PREPRINT_VENUES = frozenset({
|
|
53
|
+
"arXiv",
|
|
54
|
+
"bioRxiv",
|
|
55
|
+
"medRxiv",
|
|
56
|
+
"SSRN",
|
|
57
|
+
"Research Square",
|
|
58
|
+
"Preprints.org",
|
|
59
|
+
"ChemRxiv",
|
|
60
|
+
"EarthArXiv",
|
|
61
|
+
"OSF Preprints",
|
|
62
|
+
"TechRxiv",
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
# source_pointer → venue inference table. Per v3.7.3 spec §3.2 + schema
|
|
67
|
+
# rule, when `venue` is absent the resolver must check `source_pointer`
|
|
68
|
+
# for a preprint-server URL/identifier. Substring match against
|
|
69
|
+
# lower-cased pointer; keys must be lower-cased and unambiguous.
|
|
70
|
+
_POINTER_VENUE_HINTS: tuple[tuple[str, str], ...] = (
|
|
71
|
+
("arxiv.org", "arXiv"),
|
|
72
|
+
("biorxiv.org", "bioRxiv"),
|
|
73
|
+
("medrxiv.org", "medRxiv"),
|
|
74
|
+
("ssrn.com", "SSRN"),
|
|
75
|
+
("papers.ssrn.com", "SSRN"),
|
|
76
|
+
("researchsquare.com", "Research Square"),
|
|
77
|
+
("preprints.org", "Preprints.org"),
|
|
78
|
+
("chemrxiv.org", "ChemRxiv"),
|
|
79
|
+
("eartharxiv.org", "EarthArXiv"),
|
|
80
|
+
("osf.io/preprints", "OSF Preprints"),
|
|
81
|
+
("techrxiv.org", "TechRxiv"),
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _infer_venue_from_pointer(source_pointer: str) -> str | None:
|
|
86
|
+
"""Return the preprint venue inferred from the source_pointer URL,
|
|
87
|
+
or None if no preprint-server hint is present. Per v3.7.3 spec §3.2
|
|
88
|
+
Vector 1: 'venue field (or, when venue is absent, inference from
|
|
89
|
+
source_pointer)'."""
|
|
90
|
+
pointer = source_pointer.lower()
|
|
91
|
+
for hint, venue in _POINTER_VENUE_HINTS:
|
|
92
|
+
if hint in pointer:
|
|
93
|
+
return venue
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class SemanticScholarUnavailable(Exception):
|
|
98
|
+
"""SS API degraded (network failure / rate limit exhausted / 5xx).
|
|
99
|
+
|
|
100
|
+
Per spec §3.2 emission rules, this triggers OMIT of the
|
|
101
|
+
`semantic_scholar_unmatched` field rather than setting it to False.
|
|
102
|
+
Absence ≠ negative confirmation."""
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class SemanticScholarClient(Protocol):
|
|
106
|
+
"""Minimal contract for the SS API client passed into Signal 2.
|
|
107
|
+
|
|
108
|
+
Production callers pass a real client implementing the protocol at
|
|
109
|
+
`deep-research/references/semantic_scholar_api_protocol.md`
|
|
110
|
+
(429 → 2s backoff × 3, DOI-first then title-similarity fallback).
|
|
111
|
+
Tests pass a MagicMock returning whatever shape the test specifies."""
|
|
112
|
+
|
|
113
|
+
def lookup(self, entry: Mapping[str, Any]) -> Mapping[str, Any]:
|
|
114
|
+
"""Return {"matched": bool, ...}. Raise SemanticScholarUnavailable
|
|
115
|
+
on transient API failures (after the protocol's retry budget is
|
|
116
|
+
exhausted)."""
|
|
117
|
+
...
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def reset_client_outage_latch(client: SemanticScholarClient) -> None:
|
|
121
|
+
"""Best-effort latch reset (#115 R5-3): production clients implementing
|
|
122
|
+
the outage-latch pattern expose `reset_outage_latch()`; minimal mocks
|
|
123
|
+
in tests may not. This helper invokes it when present, no-ops when
|
|
124
|
+
absent. Long-running tools call this between passport batches."""
|
|
125
|
+
reset = getattr(client, "reset_outage_latch", None)
|
|
126
|
+
if callable(reset):
|
|
127
|
+
reset()
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def compute_preprint_signal(entry: Mapping[str, Any]) -> bool:
|
|
131
|
+
"""Signal 1 per v3.7.3 spec §3.2 Vector 1.
|
|
132
|
+
|
|
133
|
+
True iff `year >= 2024 AND venue resolves to a preprint server`.
|
|
134
|
+
Venue resolution per spec: prefer the explicit `venue` field; when
|
|
135
|
+
absent, infer from `source_pointer` (e.g., 'https://arxiv.org/abs/...'
|
|
136
|
+
→ arXiv). Missing year, or venue that resolves to neither a preprint
|
|
137
|
+
server nor an inferable pointer, returns False.
|
|
138
|
+
|
|
139
|
+
Source-pointer inference: legacy entries that schema-validly omit
|
|
140
|
+
`venue` but carry a preprint URL in `source_pointer` must still surface
|
|
141
|
+
the CONTAMINATED-PREPRINT signal (per v3.7.3 §3.2 Vector 1 — `venue`
|
|
142
|
+
absence is not a negative).
|
|
143
|
+
"""
|
|
144
|
+
year = entry.get("year")
|
|
145
|
+
if not isinstance(year, int) or year < 2024:
|
|
146
|
+
return False
|
|
147
|
+
venue = entry.get("venue")
|
|
148
|
+
if venue in PREPRINT_VENUES:
|
|
149
|
+
return True
|
|
150
|
+
if not isinstance(venue, str):
|
|
151
|
+
pointer = entry.get("source_pointer")
|
|
152
|
+
if isinstance(pointer, str):
|
|
153
|
+
return _infer_venue_from_pointer(pointer) in PREPRINT_VENUES
|
|
154
|
+
return False
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def compute_ss_unmatched_signal(
|
|
158
|
+
entry: Mapping[str, Any],
|
|
159
|
+
client: SemanticScholarClient,
|
|
160
|
+
*,
|
|
161
|
+
cache=None,
|
|
162
|
+
) -> bool | None:
|
|
163
|
+
"""Signal 2 per v3.7.3 spec §3.2 Vector 2.
|
|
164
|
+
|
|
165
|
+
Returns:
|
|
166
|
+
- None if `obtained_via='manual'` (spec exemption) OR API degradation
|
|
167
|
+
- True if SS lookup returns no match
|
|
168
|
+
- False if SS lookup returns a match
|
|
169
|
+
|
|
170
|
+
Per spec emission rules, None means OMIT the field from the
|
|
171
|
+
contamination_signals object (NOT set to False — that would imply
|
|
172
|
+
"checked and found", which is not what happened).
|
|
173
|
+
|
|
174
|
+
cache: optional VerificationCache (spec §2 Delta 2). The S2 wrapper is the
|
|
175
|
+
resolver layer for S2 (its `lookup` is the lone entry-keyed client method),
|
|
176
|
+
so it shares the same `_cached_verdict` path as the other three resolvers.
|
|
177
|
+
A degradation returns None and is NEVER cached (absent != false): the
|
|
178
|
+
SemanticScholarUnavailable raised by `lookup` propagates out of `compute`
|
|
179
|
+
(uncached, since the put runs only on success) and is caught here to yield
|
|
180
|
+
None. cache=None is byte-equivalent to no caching.
|
|
181
|
+
"""
|
|
182
|
+
if entry.get("obtained_via") == "manual":
|
|
183
|
+
return None
|
|
184
|
+
try:
|
|
185
|
+
return _cached_verdict(
|
|
186
|
+
cache=cache,
|
|
187
|
+
citation_key=entry.get("citation_key"),
|
|
188
|
+
resolver_name="semantic_scholar",
|
|
189
|
+
query_form=_query_form(
|
|
190
|
+
id_label="doi",
|
|
191
|
+
id_value=entry.get("doi"),
|
|
192
|
+
title=entry.get("title", ""),
|
|
193
|
+
),
|
|
194
|
+
# S2's lookup() does DOI-first then title internally, so queried_by
|
|
195
|
+
# follows the same has-an-id rule as the other resolvers (C-V6(a)).
|
|
196
|
+
compute=lambda: (
|
|
197
|
+
not bool(client.lookup(entry).get("matched", False)),
|
|
198
|
+
None,
|
|
199
|
+
queried_by_for(entry, id_field="doi"),
|
|
200
|
+
),
|
|
201
|
+
)
|
|
202
|
+
except SemanticScholarUnavailable:
|
|
203
|
+
return None # degradation → omit field, never cached
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def queried_by_for(entry: Mapping[str, Any], *, id_field: str) -> str:
|
|
207
|
+
"""The C-V6(a) queried_by value for an entry: 'id' when the entry carries the
|
|
208
|
+
resolver's exact identifier (so an ID-keyed lookup is attempted), else
|
|
209
|
+
'title'. The SINGLE definition of this rule — all resolver paths (DOI-keyed,
|
|
210
|
+
arXiv-keyed, and S2's entry-keyed lookup) derive queried_by through here so
|
|
211
|
+
the narrowed-false signal can never drift across layers."""
|
|
212
|
+
return "id" if entry.get(id_field) else "title"
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def _query_form(*, id_label: str, id_value: str | None, title: str) -> str:
|
|
216
|
+
"""Canonical cache query_form keying the WHOLE resolver attempt.
|
|
217
|
+
|
|
218
|
+
A resolver may try the exact ID, miss, then fall through to title search;
|
|
219
|
+
keying only on the ID would cache a title-hit verdict under the ID and
|
|
220
|
+
falsely imply the ID resolved. So the query_form captures both inputs of
|
|
221
|
+
the attempt: e.g. "doi:10.5/x|title:Attention...".
|
|
222
|
+
The cache key already namespaces by citation_key + resolver_name, so this
|
|
223
|
+
string never needs to disambiguate across citations or resolvers."""
|
|
224
|
+
return f"{id_label}:{id_value or ''}|title:{title}"
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _cached_verdict_detailed(
|
|
228
|
+
*,
|
|
229
|
+
cache,
|
|
230
|
+
citation_key,
|
|
231
|
+
resolver_name: str,
|
|
232
|
+
query_form: str,
|
|
233
|
+
compute,
|
|
234
|
+
bypass_stale: bool = False,
|
|
235
|
+
require_queried_by: bool = True,
|
|
236
|
+
) -> tuple[bool, str | None, str | None, bool]:
|
|
237
|
+
"""#541 detailed form of `_cached_verdict`: returns
|
|
238
|
+
(unmatched, matched_by, queried_by, served_from_cache) so the
|
|
239
|
+
verification-gate layer keeps the C-V6(a) queried_by signal on cache hits.
|
|
240
|
+
|
|
241
|
+
Hit criteria are `_cached_verdict`'s (payload has `matched`, decision
|
|
242
|
+
version matches) PLUS — for gate callers (`require_queried_by=True`, the
|
|
243
|
+
default) — `queried_by` present: a foreign row without it cannot feed the
|
|
244
|
+
gate's outcome contract, so it is a miss there. The bool-only signal layer
|
|
245
|
+
(`_cached_verdict`) passes `require_queried_by=False`, preserving its
|
|
246
|
+
historical hit criteria byte-for-byte. When
|
|
247
|
+
`bypass_stale` is True (#541 `ARS_CACHE_REVALIDATE`), a hit whose OWN row
|
|
248
|
+
age exceeds the stale-advisory threshold is treated as a miss — forcing a
|
|
249
|
+
live re-verification that then re-populates the row. cache=None runs live.
|
|
250
|
+
"""
|
|
251
|
+
if cache is None:
|
|
252
|
+
unmatched, matched_by, queried_by = compute()
|
|
253
|
+
return unmatched, matched_by, queried_by, False
|
|
254
|
+
cached = cache.get(citation_key, resolver_name, query_form)
|
|
255
|
+
if (
|
|
256
|
+
cached is not None
|
|
257
|
+
and "matched" in cached
|
|
258
|
+
and cached.get("decision_version") == RESOLVER_DECISION_VERSION
|
|
259
|
+
and (
|
|
260
|
+
not require_queried_by
|
|
261
|
+
# Gate callers additionally require TYPED payload values: matched
|
|
262
|
+
# must be a real bool (a string "false" is truthy and would launder
|
|
263
|
+
# into lookup_verified="true") and queried_by must be a valid
|
|
264
|
+
# C-V6(a) value. The bool signal wrapper keeps the looser
|
|
265
|
+
# historical criteria (require_queried_by=False).
|
|
266
|
+
or (
|
|
267
|
+
isinstance(cached.get("matched"), bool)
|
|
268
|
+
and cached.get("queried_by") in ("id", "title")
|
|
269
|
+
)
|
|
270
|
+
)
|
|
271
|
+
):
|
|
272
|
+
stale_bypassed = False
|
|
273
|
+
if bypass_stale:
|
|
274
|
+
threshold = _stale_advisory_days()
|
|
275
|
+
age = cache.row_age_days(citation_key, resolver_name, query_form)
|
|
276
|
+
stale_bypassed = bool(
|
|
277
|
+
threshold and age is not None and age > threshold
|
|
278
|
+
)
|
|
279
|
+
if not stale_bypassed:
|
|
280
|
+
return (
|
|
281
|
+
not cached["matched"],
|
|
282
|
+
cached.get("matched_by"),
|
|
283
|
+
cached.get("queried_by"),
|
|
284
|
+
True,
|
|
285
|
+
)
|
|
286
|
+
unmatched, matched_by, queried_by = compute()
|
|
287
|
+
cache.put(
|
|
288
|
+
citation_key,
|
|
289
|
+
resolver_name,
|
|
290
|
+
query_form,
|
|
291
|
+
{"matched": not unmatched, "matched_by": matched_by,
|
|
292
|
+
"queried_by": queried_by,
|
|
293
|
+
"decision_version": RESOLVER_DECISION_VERSION},
|
|
294
|
+
)
|
|
295
|
+
return unmatched, matched_by, queried_by, False
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _stale_advisory_days() -> int:
|
|
299
|
+
"""Lazy import of the #541 threshold (avoids a hard import cycle)."""
|
|
300
|
+
try:
|
|
301
|
+
from verification_cache import stale_advisory_days
|
|
302
|
+
except ImportError: # pragma: no cover - dual-path import
|
|
303
|
+
from scripts.verification_cache import stale_advisory_days
|
|
304
|
+
return stale_advisory_days()
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _cached_verdict(
|
|
308
|
+
*,
|
|
309
|
+
cache,
|
|
310
|
+
citation_key,
|
|
311
|
+
resolver_name: str,
|
|
312
|
+
query_form: str,
|
|
313
|
+
compute,
|
|
314
|
+
) -> bool | None:
|
|
315
|
+
"""Wrap a verdict computation with the persistent cache (spec §2 Delta 2).
|
|
316
|
+
|
|
317
|
+
`compute()` returns `(unmatched: bool, matched_by: str | None,
|
|
318
|
+
queried_by: str)`. On a cache hit the network call is skipped and the stored
|
|
319
|
+
verdict is returned. On a miss the live `compute()` runs and the verdict is
|
|
320
|
+
persisted (negatives included, so repeat runs don't re-hammer the API).
|
|
321
|
+
`cache=None` is byte-equivalent to no caching. Degradation exceptions
|
|
322
|
+
propagate from `compute()` and are NEVER cached (the caller omits the field).
|
|
323
|
+
|
|
324
|
+
The stored payload carries `matched_by` + `queried_by` so a cached negative
|
|
325
|
+
keeps the C-V6(a) ID-keyed signal the narrowed-false reducer needs.
|
|
326
|
+
"""
|
|
327
|
+
# #431 §0.12.3b hit-reuse rule + #541 queried_by requirement live in the
|
|
328
|
+
# detailed form — single logic path; this wrapper keeps the historical
|
|
329
|
+
# bool-only return for the signal-layer callers.
|
|
330
|
+
unmatched, _, _, _ = _cached_verdict_detailed(
|
|
331
|
+
cache=cache,
|
|
332
|
+
citation_key=citation_key,
|
|
333
|
+
resolver_name=resolver_name,
|
|
334
|
+
query_form=query_form,
|
|
335
|
+
compute=compute,
|
|
336
|
+
require_queried_by=False,
|
|
337
|
+
)
|
|
338
|
+
return unmatched
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def _resolve_doi_then_title(
|
|
342
|
+
entry: Mapping[str, Any], client,
|
|
343
|
+
) -> tuple[bool, str | None, str]:
|
|
344
|
+
"""Run the DOI-then-title resolver flow, returning
|
|
345
|
+
(unmatched, matched_by, queried_by).
|
|
346
|
+
|
|
347
|
+
matched_by ∈ {'doi', 'title', None}: which channel produced a match.
|
|
348
|
+
queried_by ∈ {'id', 'title'}: what the resolver ACTUALLY queried by —
|
|
349
|
+
'id' when a DOI was present (so an exact-key lookup was attempted, even
|
|
350
|
+
if it then fell through to title), 'title' when no DOI was available to
|
|
351
|
+
key on. This is the C-V6(a) signal: an `unmatched` with queried_by='id'
|
|
352
|
+
is fabrication evidence (a provably-bogus identifier); queried_by='title'
|
|
353
|
+
is a coverage gap (reduce to unresolvable, not false). It reflects
|
|
354
|
+
execution, not entry shape — see #182 Delta 4 / C-V6(a).
|
|
355
|
+
|
|
356
|
+
Exception-type differentiation stays at the wrapper — this helper never
|
|
357
|
+
catches."""
|
|
358
|
+
title = entry.get("title", "")
|
|
359
|
+
doi = entry.get("doi")
|
|
360
|
+
queried_by = queried_by_for(entry, id_field="doi")
|
|
361
|
+
if doi:
|
|
362
|
+
hit = client.doi_lookup_with_title_check(doi, title)
|
|
363
|
+
if hit is not None:
|
|
364
|
+
return False, "doi", queried_by
|
|
365
|
+
# DOI miss or MISMATCH — fall through to title search.
|
|
366
|
+
hit = client.title_search(title)
|
|
367
|
+
if hit is not None:
|
|
368
|
+
return False, "title", queried_by
|
|
369
|
+
return True, None, queried_by
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
def _resolve_by_doi_then_title(
|
|
373
|
+
entry: Mapping[str, Any], client, *, resolver_name: str, cache=None,
|
|
374
|
+
) -> bool | None:
|
|
375
|
+
"""Shared body for resolve_openalex_unmatched / resolve_crossref_unmatched.
|
|
376
|
+
See those wrappers for the spec contract."""
|
|
377
|
+
if entry.get("obtained_via") == "manual":
|
|
378
|
+
return None
|
|
379
|
+
title = entry.get("title", "")
|
|
380
|
+
return _cached_verdict(
|
|
381
|
+
cache=cache,
|
|
382
|
+
citation_key=entry.get("citation_key"),
|
|
383
|
+
resolver_name=resolver_name,
|
|
384
|
+
query_form=_query_form(
|
|
385
|
+
id_label="doi", id_value=entry.get("doi"), title=title
|
|
386
|
+
),
|
|
387
|
+
compute=lambda: _resolve_doi_then_title(entry, client),
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
def resolve_openalex_unmatched(
|
|
392
|
+
entry: Mapping[str, Any], client, *, cache=None,
|
|
393
|
+
) -> bool | None:
|
|
394
|
+
"""Compute openalex_unmatched per spec v3.9.0 §3.4.
|
|
395
|
+
|
|
396
|
+
Mirrors resolve_semantic_scholar_unmatched semantics:
|
|
397
|
+
- Manual entry → return None (caller MUST omit field).
|
|
398
|
+
- API down → re-raise OpenAlexUnavailable (caller MUST omit field).
|
|
399
|
+
- DOI present + DOI hit (passes title cross-check) → return False.
|
|
400
|
+
- DOI present + DOI miss/MISMATCH → fall through to title search.
|
|
401
|
+
- DOI absent → title search only.
|
|
402
|
+
- No hit anywhere → return True (unmatched).
|
|
403
|
+
|
|
404
|
+
Returns:
|
|
405
|
+
True: OpenAlex returned no match by DOI (with title cross-check) or title.
|
|
406
|
+
False: OpenAlex found a match.
|
|
407
|
+
None: obtained_via='manual' → exempt, caller must omit field.
|
|
408
|
+
|
|
409
|
+
Raises:
|
|
410
|
+
OpenAlexUnavailable: API degraded, caller must omit field per R-L3-2-C.
|
|
411
|
+
|
|
412
|
+
cache: optional VerificationCache (spec §2 Delta 2). cache=None is
|
|
413
|
+
byte-equivalent to no caching.
|
|
414
|
+
"""
|
|
415
|
+
return _resolve_by_doi_then_title(
|
|
416
|
+
entry, client, resolver_name="openalex", cache=cache
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def resolve_crossref_unmatched(
|
|
421
|
+
entry: Mapping[str, Any], client, *, cache=None,
|
|
422
|
+
) -> bool | None:
|
|
423
|
+
"""Compute crossref_unmatched per spec v3.9.0 §3.5.
|
|
424
|
+
|
|
425
|
+
Mirrors resolve_openalex_unmatched / resolve_semantic_scholar_unmatched
|
|
426
|
+
semantics. See those functions for return / raise contract.
|
|
427
|
+
|
|
428
|
+
Returns:
|
|
429
|
+
True / False / None per the same contract as resolve_openalex_unmatched.
|
|
430
|
+
|
|
431
|
+
Raises:
|
|
432
|
+
CrossrefUnavailable: API degraded, caller must omit field per R-L3-2-C.
|
|
433
|
+
|
|
434
|
+
cache: optional VerificationCache (spec §2 Delta 2). cache=None is
|
|
435
|
+
byte-equivalent to no caching.
|
|
436
|
+
"""
|
|
437
|
+
return _resolve_by_doi_then_title(
|
|
438
|
+
entry, client, resolver_name="crossref", cache=cache
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
def _resolve_arxiv_id_then_title(
|
|
443
|
+
entry: Mapping[str, Any], client,
|
|
444
|
+
) -> tuple[bool, str | None, str]:
|
|
445
|
+
"""arXiv-specific resolver flow (ID-keyed, not DOI-keyed), returning
|
|
446
|
+
(unmatched, matched_by, queried_by). matched_by ∈ {'arxiv', 'title', None};
|
|
447
|
+
queried_by ∈ {'id', 'title'} per the C-V6(a) signal (see
|
|
448
|
+
_resolve_doi_then_title). 'id' when an arXiv ID was present. Never catches —
|
|
449
|
+
exception differentiation stays at the wrapper.
|
|
450
|
+
|
|
451
|
+
Precondition: only called for entries carrying an arxiv_id — both callers
|
|
452
|
+
(`resolve_arxiv_unmatched` and verification_gate `_run_arxiv`) skip the
|
|
453
|
+
resolver when arxiv_id is absent (#331), so the ID lookup always runs and a
|
|
454
|
+
title search is only the ID-miss fallback."""
|
|
455
|
+
title = entry.get("title", "")
|
|
456
|
+
queried_by = queried_by_for(entry, id_field="arxiv_id")
|
|
457
|
+
hit = client.arxiv_id_lookup(entry.get("arxiv_id"), title)
|
|
458
|
+
if hit is not None:
|
|
459
|
+
return False, "arxiv", queried_by
|
|
460
|
+
# ID miss or MISMATCH — fall through to title search.
|
|
461
|
+
hit = client.title_search(title)
|
|
462
|
+
if hit is not None:
|
|
463
|
+
return False, "title", queried_by
|
|
464
|
+
return True, None, queried_by
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
def resolve_arxiv_unmatched(
|
|
468
|
+
entry: Mapping[str, Any], client, *, cache=None,
|
|
469
|
+
) -> bool | None:
|
|
470
|
+
"""Compute arxiv_unmatched per spec v3.11 #182 Delta 1.
|
|
471
|
+
|
|
472
|
+
Differs from resolve_crossref_unmatched / resolve_openalex_unmatched in
|
|
473
|
+
its exact-key channel: arXiv is keyed by `entry['arxiv_id']` (not 'doi'),
|
|
474
|
+
and the client's exact-key method is `arxiv_id_lookup` (not
|
|
475
|
+
`doi_lookup_with_title_check`). The title fallback is identical.
|
|
476
|
+
|
|
477
|
+
- Manual entry → return None (caller MUST omit field).
|
|
478
|
+
- arXiv ID absent → SKIP the resolver, return None (caller MUST omit field).
|
|
479
|
+
A non-arXiv citation is not title-searched against arXiv: a title miss
|
|
480
|
+
there is a coverage gap, not non-existence evidence (#331). The spec keys
|
|
481
|
+
the arXiv index on arxiv_id and states arxiv_unmatched is absent on
|
|
482
|
+
citations with no arXiv ID ('arXiv resolver skipped on a non-arXiv
|
|
483
|
+
citation per Delta 1', spec §4; orchestrator k_max rule).
|
|
484
|
+
- arXiv ID present + ID hit (passes title cross-check) → return False.
|
|
485
|
+
- arXiv ID present + ID miss/MISMATCH → fall through to title search.
|
|
486
|
+
- No hit anywhere → return True (unmatched).
|
|
487
|
+
|
|
488
|
+
Returns:
|
|
489
|
+
True: arXiv returned no match by ID (with title cross-check) or title.
|
|
490
|
+
False: arXiv found a match.
|
|
491
|
+
None: obtained_via='manual' OR no arxiv_id → skipped, caller omits field.
|
|
492
|
+
|
|
493
|
+
Raises:
|
|
494
|
+
ArxivUnavailable: API degraded, caller must omit field per R-L3-2-C.
|
|
495
|
+
|
|
496
|
+
cache: optional VerificationCache (spec §2 Delta 2). cache=None is
|
|
497
|
+
byte-equivalent to no caching.
|
|
498
|
+
"""
|
|
499
|
+
if entry.get("obtained_via") == "manual":
|
|
500
|
+
return None
|
|
501
|
+
# #331: no arXiv ID → resolver is skipped (no network, not cached — a skip
|
|
502
|
+
# is resolver applicability, not an adjudication, so it never persists).
|
|
503
|
+
if not entry.get("arxiv_id"):
|
|
504
|
+
return None
|
|
505
|
+
return _cached_verdict(
|
|
506
|
+
cache=cache,
|
|
507
|
+
citation_key=entry.get("citation_key"),
|
|
508
|
+
resolver_name="arxiv",
|
|
509
|
+
query_form=_query_form(
|
|
510
|
+
id_label="arxiv",
|
|
511
|
+
id_value=entry.get("arxiv_id"),
|
|
512
|
+
title=entry.get("title", ""),
|
|
513
|
+
),
|
|
514
|
+
compute=lambda: _resolve_arxiv_id_then_title(entry, client),
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def build_signals_object(
|
|
519
|
+
entry: Mapping[str, Any],
|
|
520
|
+
client: SemanticScholarClient,
|
|
521
|
+
arxiv_client=None,
|
|
522
|
+
*,
|
|
523
|
+
cache=None,
|
|
524
|
+
) -> dict[str, bool]:
|
|
525
|
+
"""Construct the `contamination_signals` object for `entry`.
|
|
526
|
+
|
|
527
|
+
Per v3.7.3 spec §3.2 emission rules:
|
|
528
|
+
- Both signals computed → emit both fields (even when both False:
|
|
529
|
+
"computed and found clean" is distinct from "not computed")
|
|
530
|
+
- Manual entry → omit `semantic_scholar_unmatched` field
|
|
531
|
+
- API degradation → omit `semantic_scholar_unmatched` field
|
|
532
|
+
|
|
533
|
+
cache: optional VerificationCache (spec §2 Delta 2), threaded into both the
|
|
534
|
+
S2 and arXiv resolvers. cache=None is byte-equivalent to no caching.
|
|
535
|
+
"""
|
|
536
|
+
return build_signals_with_omissions(
|
|
537
|
+
entry, client, arxiv_client, cache=cache)[0]
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
# ---------------------------------------------------------------------------
|
|
541
|
+
# #511 Part A — omission reason-provenance writer API
|
|
542
|
+
# ---------------------------------------------------------------------------
|
|
543
|
+
|
|
544
|
+
OMISSION_API_DEGRADED = "api_degraded"
|
|
545
|
+
_OMISSIONS_FIELD = "contamination_signal_omissions"
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def build_signals_with_omissions(
|
|
549
|
+
entry: Mapping[str, Any],
|
|
550
|
+
client: SemanticScholarClient,
|
|
551
|
+
arxiv_client=None,
|
|
552
|
+
*,
|
|
553
|
+
cache=None,
|
|
554
|
+
) -> tuple[dict[str, bool], dict[str, str]]:
|
|
555
|
+
"""`build_signals_object` plus the #511 Part A omission reasons.
|
|
556
|
+
|
|
557
|
+
Returns `(signals, omissions)`. `omissions` carries a
|
|
558
|
+
`{field: "api_degraded"}` row for every lookup field absent BECAUSE the
|
|
559
|
+
API degraded — the distinction `compute_ss_unmatched_signal`'s None return
|
|
560
|
+
collapses (manual vs degraded), surfaced here by checking the manual
|
|
561
|
+
exemption upstream. Derivable omissions are never recorded: manual entries
|
|
562
|
+
return `({preprint...}, {})` (no lookup ran), and a missing arxiv_id skips
|
|
563
|
+
the arXiv row entirely (#331). Callers persist a non-empty `omissions` as
|
|
564
|
+
the entry's `contamination_signal_omissions` object (schema forbids empty).
|
|
565
|
+
"""
|
|
566
|
+
obj: dict[str, bool] = {
|
|
567
|
+
"preprint_post_llm_inflection": compute_preprint_signal(entry),
|
|
568
|
+
}
|
|
569
|
+
omissions: dict[str, str] = {}
|
|
570
|
+
if entry.get("obtained_via") == "manual":
|
|
571
|
+
return obj, omissions # all lookups skipped by design — derivable
|
|
572
|
+
ss = compute_ss_unmatched_signal(entry, client, cache=cache)
|
|
573
|
+
if ss is None:
|
|
574
|
+
# Manual is excluded above, so None here means exactly one thing:
|
|
575
|
+
# the S2 lookup degraded.
|
|
576
|
+
omissions["semantic_scholar_unmatched"] = OMISSION_API_DEGRADED
|
|
577
|
+
else:
|
|
578
|
+
obj["semantic_scholar_unmatched"] = ss
|
|
579
|
+
# v3.11 #182 Delta 1: arxiv signal is opt-in via an explicit client so the
|
|
580
|
+
# v3.7.3 caller (migrate_literature_corpus_to_v3_7_3) stays byte-equivalent
|
|
581
|
+
# (no client → no field).
|
|
582
|
+
if arxiv_client is not None and entry.get("arxiv_id"):
|
|
583
|
+
try:
|
|
584
|
+
ax = resolve_arxiv_unmatched(entry, arxiv_client, cache=cache)
|
|
585
|
+
except ArxivUnavailable:
|
|
586
|
+
omissions["arxiv_unmatched"] = OMISSION_API_DEGRADED
|
|
587
|
+
else:
|
|
588
|
+
if ax is not None:
|
|
589
|
+
obj["arxiv_unmatched"] = ax
|
|
590
|
+
return obj, omissions
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
def record_signal_omission(entry: MutableMapping[str, Any], field: str) -> bool:
|
|
594
|
+
"""Record `{field: "api_degraded"}` on the entry. Returns True iff the
|
|
595
|
+
entry changed (idempotent re-runs return False). The caller has already
|
|
596
|
+
established the omission is degradation-caused — this helper never
|
|
597
|
+
records derivable omissions itself."""
|
|
598
|
+
omissions = entry.setdefault(_OMISSIONS_FIELD, {})
|
|
599
|
+
if omissions.get(field) == OMISSION_API_DEGRADED:
|
|
600
|
+
return False
|
|
601
|
+
omissions[field] = OMISSION_API_DEGRADED
|
|
602
|
+
return True
|
|
603
|
+
|
|
604
|
+
|
|
605
|
+
def clear_signal_omission(entry: MutableMapping[str, Any], field: str) -> bool:
|
|
606
|
+
"""Recovery: a later run computed the signal, so the recorded omission is
|
|
607
|
+
stale — remove it (and the object when it empties: the schema's
|
|
608
|
+
minProperties forbids an empty omissions object). Returns True iff the
|
|
609
|
+
entry changed."""
|
|
610
|
+
omissions = entry.get(_OMISSIONS_FIELD)
|
|
611
|
+
if not isinstance(omissions, dict) or field not in omissions:
|
|
612
|
+
return False
|
|
613
|
+
del omissions[field]
|
|
614
|
+
if not omissions:
|
|
615
|
+
del entry[_OMISSIONS_FIELD]
|
|
616
|
+
return True
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
# ---------------------------------------------------------------------------
|
|
621
|
+
# #541 gate-facing detailed wrappers (verification_gate cache-through)
|
|
622
|
+
# ---------------------------------------------------------------------------
|
|
623
|
+
|
|
624
|
+
def resolve_doi_then_title_detailed(
|
|
625
|
+
entry: Mapping[str, Any], client, *, resolver_name: str, cache=None,
|
|
626
|
+
bypass_stale: bool = False,
|
|
627
|
+
) -> tuple[bool, str | None, str | None, bool]:
|
|
628
|
+
"""Cache-through detailed form of the crossref/openalex flow for the
|
|
629
|
+
verification gate (#541): same cache key as `_resolve_by_doi_then_title`
|
|
630
|
+
(interoperable rows), returns (unmatched, matched_by, queried_by,
|
|
631
|
+
served_from_cache). No manual exemption here — the gate short-circuits
|
|
632
|
+
manual entries upstream. Degradation exceptions propagate uncaught.
|
|
633
|
+
"""
|
|
634
|
+
return _cached_verdict_detailed(
|
|
635
|
+
cache=cache,
|
|
636
|
+
citation_key=entry.get("citation_key"),
|
|
637
|
+
resolver_name=resolver_name,
|
|
638
|
+
query_form=_query_form(
|
|
639
|
+
id_label="doi", id_value=entry.get("doi"),
|
|
640
|
+
title=entry.get("title", ""),
|
|
641
|
+
),
|
|
642
|
+
compute=lambda: _resolve_doi_then_title(entry, client),
|
|
643
|
+
bypass_stale=bypass_stale,
|
|
644
|
+
)
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
def resolve_arxiv_detailed(
|
|
648
|
+
entry: Mapping[str, Any], client, *, cache=None, bypass_stale: bool = False,
|
|
649
|
+
) -> tuple[bool, str | None, str | None, bool]:
|
|
650
|
+
"""Cache-through detailed arXiv flow for the verification gate (#541).
|
|
651
|
+
Same cache key as `resolve_arxiv_unmatched` (interoperable rows).
|
|
652
|
+
Precondition: entry carries arxiv_id (the gate skips otherwise).
|
|
653
|
+
"""
|
|
654
|
+
return _cached_verdict_detailed(
|
|
655
|
+
cache=cache,
|
|
656
|
+
citation_key=entry.get("citation_key"),
|
|
657
|
+
resolver_name="arxiv",
|
|
658
|
+
query_form=_query_form(
|
|
659
|
+
id_label="arxiv", id_value=entry.get("arxiv_id"),
|
|
660
|
+
title=entry.get("title", ""),
|
|
661
|
+
),
|
|
662
|
+
compute=lambda: _resolve_arxiv_id_then_title(entry, client),
|
|
663
|
+
bypass_stale=bypass_stale,
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
def resolve_s2_detailed(
|
|
668
|
+
entry: Mapping[str, Any], client, *, cache=None, bypass_stale: bool = False,
|
|
669
|
+
) -> tuple[bool, str | None, str | None, bool]:
|
|
670
|
+
"""Cache-through detailed S2 flow for the verification gate (#541).
|
|
671
|
+
Same cache key as `compute_ss_unmatched_signal` (interoperable rows).
|
|
672
|
+
SemanticScholarUnavailable propagates (the gate maps it to unreachable);
|
|
673
|
+
degradations are never cached (put runs only on compute success).
|
|
674
|
+
"""
|
|
675
|
+
return _cached_verdict_detailed(
|
|
676
|
+
cache=cache,
|
|
677
|
+
citation_key=entry.get("citation_key"),
|
|
678
|
+
resolver_name="semantic_scholar",
|
|
679
|
+
query_form=_query_form(
|
|
680
|
+
id_label="doi", id_value=entry.get("doi"),
|
|
681
|
+
title=entry.get("title", ""),
|
|
682
|
+
),
|
|
683
|
+
compute=lambda: (
|
|
684
|
+
not bool(client.lookup(entry).get("matched", False)),
|
|
685
|
+
None,
|
|
686
|
+
queried_by_for(entry, id_field="doi"),
|
|
687
|
+
),
|
|
688
|
+
bypass_stale=bypass_stale,
|
|
689
|
+
)
|