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,1081 @@
|
|
|
1
|
+
"""Unit tests for check_spec_consistency.py.
|
|
2
|
+
|
|
3
|
+
Pre-#171, check_spec_consistency.py uses module-level ROOT + ERRORS state.
|
|
4
|
+
These tests monkey-patch ROOT into a TemporaryDirectory containing a minimal
|
|
5
|
+
fixture README, drive a specific checker directly, and read ERRORS. When
|
|
6
|
+
#171 lands the schema-driven manifest, these tests rewrite to call the
|
|
7
|
+
manifest runner instead.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import unittest
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from tempfile import TemporaryDirectory
|
|
14
|
+
|
|
15
|
+
from scripts import check_spec_consistency as csc
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class TestRelativeMarkdownLinkGrammar(unittest.TestCase):
|
|
19
|
+
"""#794: rendered-link grammar, with the old lint scope retained."""
|
|
20
|
+
|
|
21
|
+
def setUp(self) -> None:
|
|
22
|
+
self._old_root = csc.ROOT
|
|
23
|
+
csc.ERRORS.clear()
|
|
24
|
+
self._tmp = TemporaryDirectory()
|
|
25
|
+
csc.ROOT = Path(self._tmp.name)
|
|
26
|
+
(csc.ROOT / "docs").mkdir()
|
|
27
|
+
|
|
28
|
+
def tearDown(self) -> None:
|
|
29
|
+
csc.ROOT = self._old_root
|
|
30
|
+
csc.ERRORS.clear()
|
|
31
|
+
self._tmp.cleanup()
|
|
32
|
+
|
|
33
|
+
def _check(self, text: str) -> list[str]:
|
|
34
|
+
(csc.ROOT / "docs/PAGE.md").write_text(text, encoding="utf-8")
|
|
35
|
+
csc.check_relative_markdown_links("docs/PAGE.md")
|
|
36
|
+
return list(csc.ERRORS)
|
|
37
|
+
|
|
38
|
+
def test_rendered_dead_link_still_fires(self) -> None:
|
|
39
|
+
errors = self._check("[dead](MISSING.md)\n")
|
|
40
|
+
self.assertTrue(any("MISSING.md" in error for error in errors))
|
|
41
|
+
|
|
42
|
+
def test_non_rendering_and_image_targets_do_not_fire(self) -> None:
|
|
43
|
+
errors = self._check(
|
|
44
|
+
"\n"
|
|
45
|
+
"`[example](missing-inline.md)`\n"
|
|
46
|
+
"<!-- [commented](missing-comment.md) -->\n"
|
|
47
|
+
"```markdown\n[fenced](missing-fenced.md)\n```\n"
|
|
48
|
+
)
|
|
49
|
+
self.assertEqual(errors, [])
|
|
50
|
+
|
|
51
|
+
def test_titled_link_checks_only_its_destination(self) -> None:
|
|
52
|
+
errors = self._check('[dead](MISSING.md "optional title")\n')
|
|
53
|
+
self.assertEqual(
|
|
54
|
+
errors,
|
|
55
|
+
["docs/PAGE.md: broken relative markdown link 'MISSING.md'"],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
def test_existing_file_with_unknown_fragment_remains_out_of_scope(self) -> None:
|
|
59
|
+
(csc.ROOT / "docs/TARGET.md").write_text("# Real Heading\n", encoding="utf-8")
|
|
60
|
+
errors = self._check("[pointer](TARGET.md#not-a-real-heading)\n")
|
|
61
|
+
self.assertEqual(errors, [])
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Minimal ja-JP README capturing the version-bearing surfaces the lint needs
|
|
65
|
+
# to police: badge, release tag link, three release blocks (current + two
|
|
66
|
+
# prior so the symmetric structure with check_readme_zh_sections is visible),
|
|
67
|
+
# four localized mode headings, four skill-detail headings, and the DOCX line.
|
|
68
|
+
JA_README_TEMPLATE = """\
|
|
69
|
+
# Academic Research Skills
|
|
70
|
+
|
|
71
|
+
[](https://github.com/Imbad0202/academic-research-skills/releases/tag/v{ver})
|
|
72
|
+
|
|
73
|
+
## クイックスタート
|
|
74
|
+
|
|
75
|
+
#### Deep Research(8 モード)
|
|
76
|
+
- outline-only モード
|
|
77
|
+
- abstract-only モード
|
|
78
|
+
- disclosure モード
|
|
79
|
+
- review モード
|
|
80
|
+
|
|
81
|
+
#### Academic Paper(11 モード)
|
|
82
|
+
|
|
83
|
+
#### Academic Paper Reviewer(6 モード)
|
|
84
|
+
- calibration モード
|
|
85
|
+
|
|
86
|
+
#### Academic Pipeline(オーケストレーター)
|
|
87
|
+
|
|
88
|
+
### Deep Research(v2.12.1)
|
|
89
|
+
### Academic Paper(v3.3.1)
|
|
90
|
+
### Academic Paper Reviewer(v1.11.1)
|
|
91
|
+
### Academic Pipeline(v{ver})
|
|
92
|
+
|
|
93
|
+
### サポートされる出力フォーマット
|
|
94
|
+
|
|
95
|
+
- DOCX(利用可能な場合 Pandoc 経由)
|
|
96
|
+
|
|
97
|
+
## Changelog
|
|
98
|
+
|
|
99
|
+
### v3.12.0 (2026-06-08) — latest entry
|
|
100
|
+
### v3.11.1 (2026-06-06) — prior patch
|
|
101
|
+
### v3.11.0 (2026-06-04) — prior patch
|
|
102
|
+
### v3.10.0 (2026-06-01) — prior minor
|
|
103
|
+
### v3.9.4.2 (2026-05-19) — CI discipline hotfix
|
|
104
|
+
### v3.9.4.1 (2026-05-19) — previous hotfix
|
|
105
|
+
### v3.9.4 (2026-05-18) — temporal verification
|
|
106
|
+
### v3.9.1 (2026-05-18) — client hardening
|
|
107
|
+
### v3.9.0 (2026-05-17) — triangulation
|
|
108
|
+
### v3.8.0 (2026-05-16) — L3 audit
|
|
109
|
+
### v3.7.0 (2026-05-05) — plugin packaging
|
|
110
|
+
### v3.6.8 (2026-05-03) — generator-evaluator
|
|
111
|
+
### v3.6.7 (2026-04-30) — pattern protection
|
|
112
|
+
### v3.6.5 (2026-04-27) — corpus consumer
|
|
113
|
+
### v3.6.4 (2026-04-25) — corpus input port
|
|
114
|
+
### v3.6.3 (2026-04-23) — passport reset
|
|
115
|
+
### v3.6.2 (2026-04-23) — reviewer sprint
|
|
116
|
+
### v3.5.1 (2026-04-22) — reading-check probe
|
|
117
|
+
### v3.5.0 (2026-04-21) — collaboration depth
|
|
118
|
+
### v3.4.0 (2026-04-20) — compliance agent
|
|
119
|
+
### v3.3.6 (2026-04-15) — README streamlining
|
|
120
|
+
### v3.3.5 (2026-04-15)
|
|
121
|
+
### v3.3.4 (2026-04-15) — changelog sync
|
|
122
|
+
### v3.3.3 (2026-04-15) — release prep
|
|
123
|
+
### v3.3.2 (2026-04-15) — data access levels
|
|
124
|
+
|
|
125
|
+
## Version Info
|
|
126
|
+
- **Suite version**: {ver}
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _write_ja_readme(root: Path, version: str) -> None:
|
|
131
|
+
(root / "README.ja-JP.md").write_text(
|
|
132
|
+
JA_README_TEMPLATE.format(ver=version), encoding="utf-8"
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Minimal ko-KR README capturing the version-bearing surfaces check_readme_ko_sections
|
|
137
|
+
# polices: badge, release tag link, the same release-block list as the other locales,
|
|
138
|
+
# four localized mode headings ("N개 모드" with ASCII parens — Korean typographic norm
|
|
139
|
+
# matching English/ja, NOT the full-width zh form), four skill-detail headings (English
|
|
140
|
+
# ASCII-paren form reused verbatim), and the Korean DOCX line.
|
|
141
|
+
KO_README_TEMPLATE = """\
|
|
142
|
+
# Academic Research Skills
|
|
143
|
+
|
|
144
|
+
[](https://github.com/Imbad0202/academic-research-skills/releases/tag/v{ver})
|
|
145
|
+
|
|
146
|
+
## 빠른 시작
|
|
147
|
+
|
|
148
|
+
#### Deep Research (8개 모드)
|
|
149
|
+
- outline-only 모드
|
|
150
|
+
- abstract-only 모드
|
|
151
|
+
- disclosure 모드
|
|
152
|
+
- review 모드
|
|
153
|
+
|
|
154
|
+
#### Academic Paper (11개 모드)
|
|
155
|
+
|
|
156
|
+
#### Academic Paper Reviewer (6개 모드)
|
|
157
|
+
- calibration 모드
|
|
158
|
+
|
|
159
|
+
#### Academic Pipeline (오케스트레이터)
|
|
160
|
+
|
|
161
|
+
### Deep Research (v2.12.1)
|
|
162
|
+
### Academic Paper (v3.3.1)
|
|
163
|
+
### Academic Paper Reviewer (v1.11.1)
|
|
164
|
+
### Academic Pipeline (v{ver})
|
|
165
|
+
|
|
166
|
+
### 지원되는 출력 형식
|
|
167
|
+
|
|
168
|
+
- DOCX (가능한 경우 Pandoc 경유)
|
|
169
|
+
|
|
170
|
+
## 변경 이력
|
|
171
|
+
|
|
172
|
+
### v3.21.1 (2026-08-24) — current release
|
|
173
|
+
### v3.18.0 (2026-07-18) — prior minor
|
|
174
|
+
### v3.12.0 (2026-06-08) — prior release
|
|
175
|
+
### v3.11.1 (2026-06-06) — prior patch
|
|
176
|
+
### v3.11.0 (2026-06-04) — prior patch
|
|
177
|
+
### v3.10.0 (2026-06-01) — prior minor
|
|
178
|
+
### v3.9.4.2 (2026-05-19) — CI discipline hotfix
|
|
179
|
+
### v3.9.4.1 (2026-05-19) — previous hotfix
|
|
180
|
+
### v3.9.4 (2026-05-18) — temporal verification
|
|
181
|
+
### v3.9.1 (2026-05-18) — client hardening
|
|
182
|
+
### v3.9.0 (2026-05-17) — triangulation
|
|
183
|
+
### v3.8.0 (2026-05-16) — L3 audit
|
|
184
|
+
### v3.7.0 (2026-05-05) — plugin packaging
|
|
185
|
+
### v3.6.8 (2026-05-03) — generator-evaluator
|
|
186
|
+
### v3.6.7 (2026-04-30) — pattern protection
|
|
187
|
+
### v3.6.5 (2026-04-27) — corpus consumer
|
|
188
|
+
### v3.6.4 (2026-04-25) — corpus input port
|
|
189
|
+
### v3.6.3 (2026-04-23) — passport reset
|
|
190
|
+
### v3.6.2 (2026-04-23) — reviewer sprint
|
|
191
|
+
### v3.5.1 (2026-04-22) — reading-check probe
|
|
192
|
+
### v3.5.0 (2026-04-21) — collaboration depth
|
|
193
|
+
### v3.4.0 (2026-04-20) — compliance agent
|
|
194
|
+
### v3.3.6 (2026-04-15) — README streamlining
|
|
195
|
+
### v3.3.5 (2026-04-15)
|
|
196
|
+
### v3.3.4 (2026-04-15) — changelog sync
|
|
197
|
+
### v3.3.3 (2026-04-15) — release prep
|
|
198
|
+
### v3.3.2 (2026-04-15) — data access levels
|
|
199
|
+
"""
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _write_ko_readme(root: Path, version: str) -> None:
|
|
203
|
+
(root / "README.ko-KR.md").write_text(
|
|
204
|
+
KO_README_TEMPLATE.format(ver=version), encoding="utf-8"
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# Minimal zh-CN README capturing the version-bearing surfaces the lint needs
|
|
209
|
+
# to police via ZH_README_CONFIGS[1]: badge, release tag link, the same
|
|
210
|
+
# release-block list as zh-TW, four Simplified-Chinese localized mode
|
|
211
|
+
# headings, four skill-detail headings, and the Simplified-Chinese DOCX line.
|
|
212
|
+
ZH_CN_README_TEMPLATE = """\
|
|
213
|
+
# Academic Research Skills
|
|
214
|
+
|
|
215
|
+
[](https://github.com/Imbad0202/academic-research-skills/releases/tag/v{ver})
|
|
216
|
+
|
|
217
|
+
#### Deep Research(深度研究,8 种模式)
|
|
218
|
+
- review mode
|
|
219
|
+
|
|
220
|
+
#### Academic Paper(学术论文撰写,11 种模式)
|
|
221
|
+
- outline-only mode
|
|
222
|
+
- abstract-only mode
|
|
223
|
+
- disclosure mode
|
|
224
|
+
|
|
225
|
+
#### Academic Paper Reviewer(论文审查,6 种模式)
|
|
226
|
+
- calibration mode
|
|
227
|
+
|
|
228
|
+
#### Academic Pipeline(全流程调度器)
|
|
229
|
+
|
|
230
|
+
### Deep Research (v2.12.1)
|
|
231
|
+
### Academic Paper (v3.3.1)
|
|
232
|
+
### Academic Paper Reviewer (v1.11.1)
|
|
233
|
+
### Academic Pipeline (v{ver})
|
|
234
|
+
|
|
235
|
+
### 支持的输出格式
|
|
236
|
+
|
|
237
|
+
- DOCX(Pandoc 可用时)
|
|
238
|
+
|
|
239
|
+
## 更新纪录
|
|
240
|
+
|
|
241
|
+
### v3.12.0(2026-06-08)— latest entry
|
|
242
|
+
### v3.11.1(2026-06-06)— prior patch
|
|
243
|
+
### v3.11.0(2026-06-04)— prior patch
|
|
244
|
+
### v3.10.0(2026-06-01)— prior minor
|
|
245
|
+
### v3.9.4.2(2026-05-19)— CI discipline hotfix
|
|
246
|
+
### v3.9.4.1(2026-05-19)— previous hotfix
|
|
247
|
+
### v3.9.4(2026-05-18)— temporal verification
|
|
248
|
+
### v3.9.1(2026-05-18)— client hardening
|
|
249
|
+
### v3.9.0(2026-05-17)— triangulation
|
|
250
|
+
### v3.8.0(2026-05-16)— L3 audit
|
|
251
|
+
### v3.7.0(2026-05-05)— plugin packaging
|
|
252
|
+
### v3.6.8(2026-05-03)— generator-evaluator
|
|
253
|
+
### v3.6.7(2026-04-30)— pattern protection
|
|
254
|
+
### v3.6.5(2026-04-27)— corpus consumer
|
|
255
|
+
### v3.6.4(2026-04-25)— corpus input port
|
|
256
|
+
### v3.6.3(2026-04-23)— passport reset
|
|
257
|
+
### v3.6.2(2026-04-23)— reviewer sprint
|
|
258
|
+
### v3.5.1(2026-04-22)— reading-check probe
|
|
259
|
+
### v3.5.0(2026-04-21)— collaboration depth
|
|
260
|
+
### v3.4.0(2026-04-20)— compliance agent
|
|
261
|
+
### v3.3.6 (2026-04-15) — README streamlining
|
|
262
|
+
### v3.3.5 (2026-04-15)
|
|
263
|
+
### v3.3.4 (2026-04-15) — changelog sync
|
|
264
|
+
### v3.3.3 (2026-04-15) — release prep
|
|
265
|
+
### v3.3.2 (2026-04-15) — data access levels
|
|
266
|
+
"""
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def _write_zh_cn_readme(root: Path, version: str) -> None:
|
|
270
|
+
(root / "README.zh-CN.md").write_text(
|
|
271
|
+
ZH_CN_README_TEMPLATE.format(ver=version), encoding="utf-8"
|
|
272
|
+
)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
# zh-TW fixture matching ZH_README_CONFIGS[0]. check_readme_zh_sections
|
|
276
|
+
# iterates BOTH configs, so to test the zh-CN branch in isolation we still
|
|
277
|
+
# need a passing zh-TW companion (or vice versa). The minimal zh-TW fixture
|
|
278
|
+
# below uses the same shape with Traditional-Chinese localized strings.
|
|
279
|
+
ZH_TW_README_TEMPLATE = """\
|
|
280
|
+
# Academic Research Skills
|
|
281
|
+
|
|
282
|
+
[](https://github.com/Imbad0202/academic-research-skills/releases/tag/v{ver})
|
|
283
|
+
|
|
284
|
+
#### Deep Research(深度研究,8 種模式)
|
|
285
|
+
- review mode
|
|
286
|
+
|
|
287
|
+
#### Academic Paper(學術論文撰寫,11 種模式)
|
|
288
|
+
- outline-only mode
|
|
289
|
+
- abstract-only mode
|
|
290
|
+
- disclosure mode
|
|
291
|
+
|
|
292
|
+
#### Academic Paper Reviewer(論文審查,6 種模式)
|
|
293
|
+
- calibration mode
|
|
294
|
+
|
|
295
|
+
#### Academic Pipeline(全流程調度器)
|
|
296
|
+
|
|
297
|
+
### Deep Research (v2.12.1)
|
|
298
|
+
### Academic Paper (v3.3.1)
|
|
299
|
+
### Academic Paper Reviewer (v1.11.1)
|
|
300
|
+
### Academic Pipeline (v{ver})
|
|
301
|
+
|
|
302
|
+
### 支援的輸出格式
|
|
303
|
+
|
|
304
|
+
- DOCX(Pandoc 可用時)
|
|
305
|
+
|
|
306
|
+
## 更新紀錄
|
|
307
|
+
|
|
308
|
+
### v3.12.0(2026-06-08)— latest entry
|
|
309
|
+
### v3.11.1(2026-06-06)— prior patch
|
|
310
|
+
### v3.11.0(2026-06-04)— prior patch
|
|
311
|
+
### v3.10.0(2026-06-01)— prior minor
|
|
312
|
+
### v3.9.4.2(2026-05-19)— CI discipline hotfix
|
|
313
|
+
### v3.9.4.1(2026-05-19)— previous hotfix
|
|
314
|
+
### v3.9.4(2026-05-18)— temporal verification
|
|
315
|
+
### v3.9.1(2026-05-18)— client hardening
|
|
316
|
+
### v3.9.0(2026-05-17)— triangulation
|
|
317
|
+
### v3.8.0(2026-05-16)— L3 audit
|
|
318
|
+
### v3.7.0(2026-05-05)— plugin packaging
|
|
319
|
+
### v3.6.8(2026-05-03)— generator-evaluator
|
|
320
|
+
### v3.6.7(2026-04-30)— pattern protection
|
|
321
|
+
### v3.6.5(2026-04-27)— corpus consumer
|
|
322
|
+
### v3.6.4(2026-04-25)— corpus input port
|
|
323
|
+
### v3.6.3(2026-04-23)— passport reset
|
|
324
|
+
### v3.6.2(2026-04-23)— reviewer sprint
|
|
325
|
+
### v3.5.1(2026-04-22)— reading-check probe
|
|
326
|
+
### v3.5.0(2026-04-21)— collaboration depth
|
|
327
|
+
### v3.4.0(2026-04-20)— compliance agent
|
|
328
|
+
### v3.3.6 (2026-04-15) — README streamlining
|
|
329
|
+
### v3.3.5 (2026-04-15)
|
|
330
|
+
### v3.3.4 (2026-04-15) — changelog sync
|
|
331
|
+
### v3.3.3 (2026-04-15) — release prep
|
|
332
|
+
### v3.3.2 (2026-04-15) — data access levels
|
|
333
|
+
"""
|
|
334
|
+
|
|
335
|
+
|
|
336
|
+
def _write_zh_tw_readme(root: Path, version: str) -> None:
|
|
337
|
+
(root / "README.zh-TW.md").write_text(
|
|
338
|
+
ZH_TW_README_TEMPLATE.format(ver=version), encoding="utf-8"
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
class TestReadmeJaSections(unittest.TestCase):
|
|
343
|
+
def setUp(self) -> None:
|
|
344
|
+
# check_spec_consistency uses module-level ROOT and ERRORS. Reset and
|
|
345
|
+
# restore around each test so state does not leak between cases.
|
|
346
|
+
self._orig_root = csc.ROOT
|
|
347
|
+
self._orig_errors = list(csc.ERRORS)
|
|
348
|
+
csc.ERRORS.clear()
|
|
349
|
+
|
|
350
|
+
def tearDown(self) -> None:
|
|
351
|
+
csc.ROOT = self._orig_root
|
|
352
|
+
csc.ERRORS.clear()
|
|
353
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
354
|
+
|
|
355
|
+
def test_aligned_ja_readme_passes(self) -> None:
|
|
356
|
+
"""A README.ja-JP.md whose badge / tag link / release headings all
|
|
357
|
+
agree with the suite version v3.9.4.2 must pass without errors."""
|
|
358
|
+
with TemporaryDirectory() as tmp:
|
|
359
|
+
root = Path(tmp)
|
|
360
|
+
csc.ROOT = root
|
|
361
|
+
_write_ja_readme(root, version="3.21.1")
|
|
362
|
+
|
|
363
|
+
csc.check_readme_ja_sections()
|
|
364
|
+
|
|
365
|
+
self.assertEqual(
|
|
366
|
+
csc.ERRORS, [],
|
|
367
|
+
msg=f"unexpected errors on aligned fixture: {csc.ERRORS!r}",
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
def test_stale_ja_badge_fails(self) -> None:
|
|
371
|
+
"""Regression for #170: if README.ja-JP.md keeps a stale v3.9.4.0
|
|
372
|
+
badge while CHANGELOG has moved to v3.9.4.2, the lint must surface
|
|
373
|
+
the drift instead of silently passing (pre-fix behavior: this file
|
|
374
|
+
was outside the lint's needle list and the drift never surfaced)."""
|
|
375
|
+
with TemporaryDirectory() as tmp:
|
|
376
|
+
root = Path(tmp)
|
|
377
|
+
csc.ROOT = root
|
|
378
|
+
# Write the "current" v3.9.4.2 release block but downgrade only
|
|
379
|
+
# the badge and tag link to v3.9.4.0. This is the realistic shape
|
|
380
|
+
# of drift when one place gets forgotten during a release.
|
|
381
|
+
stale = JA_README_TEMPLATE.format(ver="3.21.1").replace(
|
|
382
|
+
"version-v3.21.1-blue", "version-v3.9.4.0-blue"
|
|
383
|
+
).replace(
|
|
384
|
+
"releases/tag/v3.21.1", "releases/tag/v3.9.4.0"
|
|
385
|
+
)
|
|
386
|
+
(root / "README.ja-JP.md").write_text(stale, encoding="utf-8")
|
|
387
|
+
|
|
388
|
+
csc.check_readme_ja_sections()
|
|
389
|
+
|
|
390
|
+
self.assertTrue(
|
|
391
|
+
any("README.ja-JP.md" in e and "v3.21.1" in e for e in csc.ERRORS),
|
|
392
|
+
msg=f"expected ja-JP drift error in: {csc.ERRORS!r}",
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
class TestReadmeKoSections(unittest.TestCase):
|
|
397
|
+
def setUp(self) -> None:
|
|
398
|
+
# check_spec_consistency uses module-level ROOT and ERRORS. Reset and
|
|
399
|
+
# restore around each test so state does not leak between cases.
|
|
400
|
+
self._orig_root = csc.ROOT
|
|
401
|
+
self._orig_errors = list(csc.ERRORS)
|
|
402
|
+
csc.ERRORS.clear()
|
|
403
|
+
|
|
404
|
+
def tearDown(self) -> None:
|
|
405
|
+
csc.ROOT = self._orig_root
|
|
406
|
+
csc.ERRORS.clear()
|
|
407
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
408
|
+
|
|
409
|
+
def test_aligned_ko_readme_passes(self) -> None:
|
|
410
|
+
"""A README.ko-KR.md whose badge / tag link / release headings / Korean
|
|
411
|
+
mode + skill headings all agree with the suite version must pass."""
|
|
412
|
+
with TemporaryDirectory() as tmp:
|
|
413
|
+
root = Path(tmp)
|
|
414
|
+
csc.ROOT = root
|
|
415
|
+
_write_ko_readme(root, version="3.21.1")
|
|
416
|
+
|
|
417
|
+
csc.check_readme_ko_sections()
|
|
418
|
+
|
|
419
|
+
self.assertEqual(
|
|
420
|
+
csc.ERRORS, [],
|
|
421
|
+
msg=f"unexpected errors on aligned ko fixture: {csc.ERRORS!r}",
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
def test_stale_ko_badge_fails(self) -> None:
|
|
425
|
+
"""Symmetric to the ja drift regression: a stale badge / tag link on
|
|
426
|
+
README.ko-KR.md must surface the drift rather than silently passing."""
|
|
427
|
+
with TemporaryDirectory() as tmp:
|
|
428
|
+
root = Path(tmp)
|
|
429
|
+
csc.ROOT = root
|
|
430
|
+
stale = KO_README_TEMPLATE.format(ver="3.21.1").replace(
|
|
431
|
+
"version-v3.21.1-blue", "version-v3.9.4.0-blue"
|
|
432
|
+
).replace(
|
|
433
|
+
"releases/tag/v3.21.1", "releases/tag/v3.9.4.0"
|
|
434
|
+
)
|
|
435
|
+
(root / "README.ko-KR.md").write_text(stale, encoding="utf-8")
|
|
436
|
+
|
|
437
|
+
csc.check_readme_ko_sections()
|
|
438
|
+
|
|
439
|
+
self.assertTrue(
|
|
440
|
+
any("README.ko-KR.md" in e and "v3.21.1" in e for e in csc.ERRORS),
|
|
441
|
+
msg=f"expected ko-KR drift error in: {csc.ERRORS!r}",
|
|
442
|
+
)
|
|
443
|
+
|
|
444
|
+
def test_missing_korean_mode_heading_fails(self) -> None:
|
|
445
|
+
"""If a localized mode heading is dropped (e.g. the "N개 모드" form is
|
|
446
|
+
accidentally written in the English "(8 modes)" shape), the lint must
|
|
447
|
+
catch it — proving the heading checks are load-bearing, not vacuous."""
|
|
448
|
+
with TemporaryDirectory() as tmp:
|
|
449
|
+
root = Path(tmp)
|
|
450
|
+
csc.ROOT = root
|
|
451
|
+
broken = KO_README_TEMPLATE.format(ver="3.21.1").replace(
|
|
452
|
+
"#### Deep Research (8개 모드)", "#### Deep Research (8 modes)"
|
|
453
|
+
)
|
|
454
|
+
(root / "README.ko-KR.md").write_text(broken, encoding="utf-8")
|
|
455
|
+
|
|
456
|
+
csc.check_readme_ko_sections()
|
|
457
|
+
|
|
458
|
+
self.assertTrue(
|
|
459
|
+
any("README.ko-KR.md" in e and "8개 모드" in e for e in csc.ERRORS),
|
|
460
|
+
msg=f"expected missing-heading error in: {csc.ERRORS!r}",
|
|
461
|
+
)
|
|
462
|
+
|
|
463
|
+
def test_full_width_korean_changelog_parentheses_fail(self) -> None:
|
|
464
|
+
"""Korean changelog headings use ASCII parentheses, not full-width forms."""
|
|
465
|
+
with TemporaryDirectory() as tmp:
|
|
466
|
+
root = Path(tmp)
|
|
467
|
+
csc.ROOT = root
|
|
468
|
+
broken = KO_README_TEMPLATE.format(ver="3.21.1").replace(
|
|
469
|
+
"### v3.18.0 (2026-07-18)",
|
|
470
|
+
"### v3.18.0(2026-07-18)",
|
|
471
|
+
)
|
|
472
|
+
(root / "README.ko-KR.md").write_text(broken, encoding="utf-8")
|
|
473
|
+
|
|
474
|
+
csc.check_readme_ko_sections()
|
|
475
|
+
|
|
476
|
+
self.assertTrue(
|
|
477
|
+
any(
|
|
478
|
+
"README.ko-KR.md" in e
|
|
479
|
+
and "### v3.18.0 (2026-07-18)" in e
|
|
480
|
+
for e in csc.ERRORS
|
|
481
|
+
),
|
|
482
|
+
msg=f"expected Korean parenthesis-style error in: {csc.ERRORS!r}",
|
|
483
|
+
)
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
class TestReadmeZhSections(unittest.TestCase):
|
|
487
|
+
"""Coverage for the ZH_README_CONFIGS tuple branch added when zh-CN
|
|
488
|
+
joined zh-TW under check_readme_zh_sections. check_readme_zh_sections
|
|
489
|
+
iterates both configs, so both fixtures must exist on every test path."""
|
|
490
|
+
|
|
491
|
+
def setUp(self) -> None:
|
|
492
|
+
self._orig_root = csc.ROOT
|
|
493
|
+
self._orig_errors = list(csc.ERRORS)
|
|
494
|
+
csc.ERRORS.clear()
|
|
495
|
+
|
|
496
|
+
def tearDown(self) -> None:
|
|
497
|
+
csc.ROOT = self._orig_root
|
|
498
|
+
csc.ERRORS.clear()
|
|
499
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
500
|
+
|
|
501
|
+
def test_aligned_zh_cn_readme_passes(self) -> None:
|
|
502
|
+
"""Both zh-TW and zh-CN fixtures aligned to v3.9.4.2 produce no
|
|
503
|
+
lint errors. Locks the new ZH_README_CONFIGS[1] branch."""
|
|
504
|
+
with TemporaryDirectory() as tmp:
|
|
505
|
+
root = Path(tmp)
|
|
506
|
+
csc.ROOT = root
|
|
507
|
+
_write_zh_tw_readme(root, version="3.21.1")
|
|
508
|
+
_write_zh_cn_readme(root, version="3.21.1")
|
|
509
|
+
|
|
510
|
+
csc.check_readme_zh_sections()
|
|
511
|
+
|
|
512
|
+
self.assertEqual(
|
|
513
|
+
csc.ERRORS, [],
|
|
514
|
+
msg=f"unexpected errors on aligned zh fixtures: {csc.ERRORS!r}",
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
def test_stale_zh_cn_badge_fails(self) -> None:
|
|
518
|
+
"""Regression symmetric with #170 ja-JP: if README.zh-CN.md keeps
|
|
519
|
+
a stale v3.9.4.0 badge while the rest of the file moved to v3.9.4.2,
|
|
520
|
+
the lint must surface the drift on the zh-CN branch specifically."""
|
|
521
|
+
with TemporaryDirectory() as tmp:
|
|
522
|
+
root = Path(tmp)
|
|
523
|
+
csc.ROOT = root
|
|
524
|
+
_write_zh_tw_readme(root, version="3.21.1")
|
|
525
|
+
stale = ZH_CN_README_TEMPLATE.format(ver="3.21.1").replace(
|
|
526
|
+
"version-v3.21.1-blue", "version-v3.9.4.0-blue"
|
|
527
|
+
).replace(
|
|
528
|
+
"releases/tag/v3.21.1", "releases/tag/v3.9.4.0"
|
|
529
|
+
)
|
|
530
|
+
(root / "README.zh-CN.md").write_text(stale, encoding="utf-8")
|
|
531
|
+
|
|
532
|
+
csc.check_readme_zh_sections()
|
|
533
|
+
|
|
534
|
+
self.assertTrue(
|
|
535
|
+
any("README.zh-CN.md" in e and "v3.21.1" in e for e in csc.ERRORS),
|
|
536
|
+
msg=f"expected zh-CN drift error in: {csc.ERRORS!r}",
|
|
537
|
+
)
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
# Minimal docs/ARCHITECTURE.md fixture carrying the THREE marker kinds the invariant-4 check (#345)
|
|
541
|
+
# must distinguish: current-component markers (mermaid node + component/stage rows, which MUST equal
|
|
542
|
+
# the suite version), a feature-history timeline marker (`vX.Y.Z : <feature>`, which must NOT be
|
|
543
|
+
# policed), and a prose mention of `academic-pipeline vX.Y.Z` (provenance narrative, which must also
|
|
544
|
+
# NOT be policed — it is excluded by the table-row anchor). `{comp}` = current-component version;
|
|
545
|
+
# `{hist}` = timeline version; `{prose}` = the version named in the narrative provenance line.
|
|
546
|
+
ARCHITECTURE_TEMPLATE = """\
|
|
547
|
+
# Architecture
|
|
548
|
+
|
|
549
|
+
```mermaid
|
|
550
|
+
flowchart TD
|
|
551
|
+
Pipeline[academic-pipeline<br/>orchestrator<br/>v{comp}<br/>Agent Team: 5]
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
| Stage | Gate | ... |
|
|
555
|
+
|-------|------|-----|
|
|
556
|
+
| **2.5 INTEGRITY** | `academic-pipeline` v{comp} (gate) | VERIFIED_ONLY |
|
|
557
|
+
| **6. PROCESS SUMMARY** | `academic-pipeline` v{comp} | VERIFIED_ONLY |
|
|
558
|
+
|
|
559
|
+
| Component | Role |
|
|
560
|
+
|-----------|------|
|
|
561
|
+
| `academic-pipeline` v{comp} | orchestrator (delegates to sub-skill modes) |
|
|
562
|
+
|
|
563
|
+
The `academic-pipeline` v{prose} release first introduced the integrity gate (narrative provenance).
|
|
564
|
+
|
|
565
|
+
```mermaid
|
|
566
|
+
timeline
|
|
567
|
+
title ARS evolution timeline
|
|
568
|
+
v{hist} : deterministic citation verification gate (#182)
|
|
569
|
+
```
|
|
570
|
+
"""
|
|
571
|
+
|
|
572
|
+
|
|
573
|
+
def _write_architecture_fixture(
|
|
574
|
+
root: Path, *, suite: str, comp: str, hist: str, prose: str | None = None
|
|
575
|
+
) -> None:
|
|
576
|
+
"""Write `.claude/CLAUDE.md` (suite version source) + a docs/ARCHITECTURE.md fixture.
|
|
577
|
+
|
|
578
|
+
`prose` defaults to the suite version so the narrative line is innocuous unless a test
|
|
579
|
+
deliberately sets it to a stale version to assert the prose mention is not policed.
|
|
580
|
+
"""
|
|
581
|
+
(root / ".claude").mkdir(parents=True, exist_ok=True)
|
|
582
|
+
(root / ".claude" / "CLAUDE.md").write_text(
|
|
583
|
+
f"# ARS\n\n- **Suite version**: {suite} (per CHANGELOG.md)\n", encoding="utf-8"
|
|
584
|
+
)
|
|
585
|
+
(root / "docs").mkdir(parents=True, exist_ok=True)
|
|
586
|
+
(root / "docs" / "ARCHITECTURE.md").write_text(
|
|
587
|
+
ARCHITECTURE_TEMPLATE.format(comp=comp, hist=hist, prose=prose or suite),
|
|
588
|
+
encoding="utf-8",
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
class TestArchitectureComponentVersion(unittest.TestCase):
|
|
593
|
+
"""#345: invariant-4 lint for docs/ARCHITECTURE.md current-component version markers."""
|
|
594
|
+
|
|
595
|
+
def setUp(self) -> None:
|
|
596
|
+
self._orig_root = csc.ROOT
|
|
597
|
+
self._orig_errors = list(csc.ERRORS)
|
|
598
|
+
csc.ERRORS.clear()
|
|
599
|
+
|
|
600
|
+
def tearDown(self) -> None:
|
|
601
|
+
csc.ROOT = self._orig_root
|
|
602
|
+
csc.ERRORS.clear()
|
|
603
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
604
|
+
|
|
605
|
+
def test_aligned_passes(self) -> None:
|
|
606
|
+
"""All component markers at the suite version → no errors (timeline at an older version
|
|
607
|
+
is fine — it records history)."""
|
|
608
|
+
with TemporaryDirectory() as tmp:
|
|
609
|
+
root = Path(tmp)
|
|
610
|
+
csc.ROOT = root
|
|
611
|
+
_write_architecture_fixture(root, suite="3.11.1", comp="3.11.1", hist="3.11.0")
|
|
612
|
+
|
|
613
|
+
csc.check_architecture_component_version()
|
|
614
|
+
|
|
615
|
+
self.assertEqual(
|
|
616
|
+
csc.ERRORS, [], msg=f"unexpected errors on aligned fixture: {csc.ERRORS!r}"
|
|
617
|
+
)
|
|
618
|
+
|
|
619
|
+
def test_stale_component_marker_fails(self) -> None:
|
|
620
|
+
"""A current-component marker left at the prior version (the exact #343/#344 drift) must
|
|
621
|
+
fail — both the mermaid node and the rows carry the stale version here."""
|
|
622
|
+
with TemporaryDirectory() as tmp:
|
|
623
|
+
root = Path(tmp)
|
|
624
|
+
csc.ROOT = root
|
|
625
|
+
_write_architecture_fixture(root, suite="3.11.1", comp="3.11.0", hist="3.11.0")
|
|
626
|
+
|
|
627
|
+
csc.check_architecture_component_version()
|
|
628
|
+
|
|
629
|
+
self.assertTrue(
|
|
630
|
+
any("ARCHITECTURE.md" in e and "3.11.0" in e and "3.11.1" in e for e in csc.ERRORS),
|
|
631
|
+
msg=f"expected stale-component drift error in: {csc.ERRORS!r}",
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
def test_stale_timeline_marker_does_not_fail(self) -> None:
|
|
635
|
+
"""The critical distinction: a timeline `vX.Y.Z : <feature>` node at a DIFFERENT version
|
|
636
|
+
from the suite must NOT fail — it records which version shipped a feature, and a
|
|
637
|
+
naive `v3.x` scan would wrongly flag it. Component markers are aligned here."""
|
|
638
|
+
with TemporaryDirectory() as tmp:
|
|
639
|
+
root = Path(tmp)
|
|
640
|
+
csc.ROOT = root
|
|
641
|
+
# Component markers all at the suite version; only the timeline records an old version.
|
|
642
|
+
_write_architecture_fixture(root, suite="3.11.1", comp="3.11.1", hist="3.9.4")
|
|
643
|
+
|
|
644
|
+
csc.check_architecture_component_version()
|
|
645
|
+
|
|
646
|
+
self.assertEqual(
|
|
647
|
+
csc.ERRORS, [],
|
|
648
|
+
msg=f"timeline marker must not be policed, but got: {csc.ERRORS!r}",
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
def test_missing_component_marker_fails(self) -> None:
|
|
652
|
+
"""If the component markers vanish entirely (e.g. a refactor removes them), the check must
|
|
653
|
+
surface that rather than silently passing on an empty match."""
|
|
654
|
+
with TemporaryDirectory() as tmp:
|
|
655
|
+
root = Path(tmp)
|
|
656
|
+
csc.ROOT = root
|
|
657
|
+
(root / ".claude").mkdir(parents=True, exist_ok=True)
|
|
658
|
+
(root / ".claude" / "CLAUDE.md").write_text(
|
|
659
|
+
"- **Suite version**: 3.11.1 (per CHANGELOG.md)\n", encoding="utf-8"
|
|
660
|
+
)
|
|
661
|
+
(root / "docs").mkdir(parents=True, exist_ok=True)
|
|
662
|
+
(root / "docs" / "ARCHITECTURE.md").write_text(
|
|
663
|
+
"# Architecture\n\nNo component markers here.\n", encoding="utf-8"
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
csc.check_architecture_component_version()
|
|
667
|
+
|
|
668
|
+
self.assertTrue(
|
|
669
|
+
any("no mermaid" in e or "no `academic-pipeline" in e for e in csc.ERRORS),
|
|
670
|
+
msg=f"expected missing-marker error in: {csc.ERRORS!r}",
|
|
671
|
+
)
|
|
672
|
+
|
|
673
|
+
def test_four_component_aligned_passes(self) -> None:
|
|
674
|
+
"""#352 P2: the repo's own grammar ships 4-component versions (v3.9.4.2). A suite and
|
|
675
|
+
component markers both at a 4-component version must pass — the version regex must capture
|
|
676
|
+
the FULL token, not truncate to three components."""
|
|
677
|
+
with TemporaryDirectory() as tmp:
|
|
678
|
+
root = Path(tmp)
|
|
679
|
+
csc.ROOT = root
|
|
680
|
+
_write_architecture_fixture(root, suite="3.9.4.2", comp="3.9.4.2", hist="3.9.4")
|
|
681
|
+
|
|
682
|
+
csc.check_architecture_component_version()
|
|
683
|
+
|
|
684
|
+
self.assertEqual(
|
|
685
|
+
csc.ERRORS, [],
|
|
686
|
+
msg=f"unexpected errors on aligned 4-component fixture: {csc.ERRORS!r}",
|
|
687
|
+
)
|
|
688
|
+
|
|
689
|
+
def test_four_component_marker_against_three_component_suite_fails(self) -> None:
|
|
690
|
+
"""#352 P2 (the silent-pass this fix closes): suite is the 3-component `3.9.4` but a
|
|
691
|
+
component marker carries the 4-component `3.9.4.2`. A truncating `\\d+\\.\\d+\\.\\d+`
|
|
692
|
+
would capture `3.9.4` from the marker and falsely pass (3.9.4 == 3.9.4). The full-token
|
|
693
|
+
capture must instead see `3.9.4.2` and fail it against the suite."""
|
|
694
|
+
with TemporaryDirectory() as tmp:
|
|
695
|
+
root = Path(tmp)
|
|
696
|
+
csc.ROOT = root
|
|
697
|
+
_write_architecture_fixture(root, suite="3.9.4", comp="3.9.4.2", hist="3.9.4")
|
|
698
|
+
|
|
699
|
+
csc.check_architecture_component_version()
|
|
700
|
+
|
|
701
|
+
# The error must name the FULL 4-component marker as != the 3-component suite. Asserting
|
|
702
|
+
# on `!= suite v3.9.4` (not just substring `3.9.4`, which is contained in `3.9.4.2`)
|
|
703
|
+
# proves the captured marker was the full `3.9.4.2`, i.e. the truncation was closed.
|
|
704
|
+
self.assertTrue(
|
|
705
|
+
any("v3.9.4.2" in e and "!= suite v3.9.4 " in e for e in csc.ERRORS),
|
|
706
|
+
msg=f"expected 4-vs-3-component drift error in: {csc.ERRORS!r}",
|
|
707
|
+
)
|
|
708
|
+
|
|
709
|
+
def test_prose_provenance_mention_does_not_fail(self) -> None:
|
|
710
|
+
"""#352 P3: a narrative line naming `academic-pipeline v<old>` (feature provenance) must
|
|
711
|
+
NOT be policed against the suite version — only markdown table-row component cells are.
|
|
712
|
+
Component markers + timeline are aligned/innocuous; only the prose line is stale."""
|
|
713
|
+
with TemporaryDirectory() as tmp:
|
|
714
|
+
root = Path(tmp)
|
|
715
|
+
csc.ROOT = root
|
|
716
|
+
_write_architecture_fixture(
|
|
717
|
+
root, suite="3.11.1", comp="3.11.1", hist="3.9.4", prose="3.9.4"
|
|
718
|
+
)
|
|
719
|
+
|
|
720
|
+
csc.check_architecture_component_version()
|
|
721
|
+
|
|
722
|
+
self.assertEqual(
|
|
723
|
+
csc.ERRORS, [],
|
|
724
|
+
msg=f"prose provenance mention must not be policed, but got: {csc.ERRORS!r}",
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
# --- #377: SKILL.md frontmatter↔table consistency (all 4) + suite-skill date sanity ---
|
|
729
|
+
|
|
730
|
+
# Minimal SKILL.md carrying the version-bearing surfaces the #377 check polices: a
|
|
731
|
+
# `metadata:` frontmatter block with `version` / `last_updated`, and a Version-Info table
|
|
732
|
+
# with `| Skill Version |` / `| Last Updated |` rows. Mirrors the real four SKILL.md shape.
|
|
733
|
+
SKILL_TEMPLATE = """\
|
|
734
|
+
---
|
|
735
|
+
name: {name}
|
|
736
|
+
metadata:
|
|
737
|
+
version: "{fm_ver}"
|
|
738
|
+
last_updated: "{fm_date}"
|
|
739
|
+
---
|
|
740
|
+
|
|
741
|
+
# {name}
|
|
742
|
+
|
|
743
|
+
Body.
|
|
744
|
+
|
|
745
|
+
## Version Info
|
|
746
|
+
|
|
747
|
+
| Field | Value |
|
|
748
|
+
|-------|-------|
|
|
749
|
+
| Skill Version | {tbl_ver} |
|
|
750
|
+
| Last Updated | {tbl_date} |
|
|
751
|
+
"""
|
|
752
|
+
|
|
753
|
+
# The four SKILL.md paths the generalized check must cover, with their real independent
|
|
754
|
+
# versions/dates. `academic-pipeline` tracks the suite; the other three move independently.
|
|
755
|
+
_SKILL_FIXTURES = {
|
|
756
|
+
"academic-pipeline": ("3.12.0", "2026-06-08"),
|
|
757
|
+
"academic-paper": ("3.2.0", "2026-06-01"),
|
|
758
|
+
"academic-paper-reviewer": ("1.10.0", "2026-06-01"),
|
|
759
|
+
"deep-research": ("2.9.4", "2026-05-18"),
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
def _write_skill_fixtures(root: Path, overrides: dict | None = None) -> None:
|
|
764
|
+
"""Write all four SKILL.md with frontmatter == table by default. `overrides` maps a
|
|
765
|
+
skill dir to a partial dict of {fm_ver, fm_date, tbl_ver, tbl_date} to introduce drift."""
|
|
766
|
+
overrides = overrides or {}
|
|
767
|
+
for skill, (ver, date) in _SKILL_FIXTURES.items():
|
|
768
|
+
fields = {"fm_ver": ver, "fm_date": date, "tbl_ver": ver, "tbl_date": date}
|
|
769
|
+
fields.update(overrides.get(skill, {}))
|
|
770
|
+
(root / skill).mkdir(parents=True, exist_ok=True)
|
|
771
|
+
(root / skill / "SKILL.md").write_text(
|
|
772
|
+
SKILL_TEMPLATE.format(name=skill, **fields), encoding="utf-8"
|
|
773
|
+
)
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
class TestSkillVersionTableConsistency(unittest.TestCase):
|
|
777
|
+
"""#377(a): frontmatter version/last_updated ↔ Version-Info table for ALL FOUR SKILL.md
|
|
778
|
+
(pre-#377 only academic-paper-reviewer was checked)."""
|
|
779
|
+
|
|
780
|
+
def setUp(self) -> None:
|
|
781
|
+
self._orig_root = csc.ROOT
|
|
782
|
+
self._orig_errors = list(csc.ERRORS)
|
|
783
|
+
csc.ERRORS.clear()
|
|
784
|
+
|
|
785
|
+
def tearDown(self) -> None:
|
|
786
|
+
csc.ROOT = self._orig_root
|
|
787
|
+
csc.ERRORS.clear()
|
|
788
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
789
|
+
|
|
790
|
+
def test_all_four_aligned_passes(self) -> None:
|
|
791
|
+
"""All four SKILL.md with frontmatter matching their table → no errors."""
|
|
792
|
+
with TemporaryDirectory() as tmp:
|
|
793
|
+
root = Path(tmp)
|
|
794
|
+
csc.ROOT = root
|
|
795
|
+
_write_skill_fixtures(root)
|
|
796
|
+
|
|
797
|
+
csc.check_skill_version_blocks()
|
|
798
|
+
|
|
799
|
+
self.assertEqual(
|
|
800
|
+
csc.ERRORS, [], msg=f"unexpected errors on aligned fixtures: {csc.ERRORS!r}"
|
|
801
|
+
)
|
|
802
|
+
|
|
803
|
+
def test_table_date_drift_in_non_reviewer_skill_fails(self) -> None:
|
|
804
|
+
"""The exact #377 root cause: a SKILL whose frontmatter date is bumped but whose table
|
|
805
|
+
date is left stale must fail — and crucially for a skill OTHER than reviewer (which is
|
|
806
|
+
the only one the pre-#377 check covered)."""
|
|
807
|
+
with TemporaryDirectory() as tmp:
|
|
808
|
+
root = Path(tmp)
|
|
809
|
+
csc.ROOT = root
|
|
810
|
+
_write_skill_fixtures(
|
|
811
|
+
root, overrides={"academic-pipeline": {"tbl_date": "2026-06-01"}}
|
|
812
|
+
)
|
|
813
|
+
|
|
814
|
+
csc.check_skill_version_blocks()
|
|
815
|
+
|
|
816
|
+
self.assertTrue(
|
|
817
|
+
any(
|
|
818
|
+
"academic-pipeline/SKILL.md" in e and "2026-06-08" in e and "2026-06-01" in e
|
|
819
|
+
for e in csc.ERRORS
|
|
820
|
+
),
|
|
821
|
+
msg=f"expected frontmatter↔table date drift error in: {csc.ERRORS!r}",
|
|
822
|
+
)
|
|
823
|
+
|
|
824
|
+
def test_table_version_drift_fails(self) -> None:
|
|
825
|
+
"""A version (not date) drift between frontmatter and table also fails — for a third
|
|
826
|
+
skill (deep-research) to prove the check is not reviewer-specific."""
|
|
827
|
+
with TemporaryDirectory() as tmp:
|
|
828
|
+
root = Path(tmp)
|
|
829
|
+
csc.ROOT = root
|
|
830
|
+
_write_skill_fixtures(
|
|
831
|
+
root, overrides={"deep-research": {"tbl_ver": "2.9.3"}}
|
|
832
|
+
)
|
|
833
|
+
|
|
834
|
+
csc.check_skill_version_blocks()
|
|
835
|
+
|
|
836
|
+
self.assertTrue(
|
|
837
|
+
any(
|
|
838
|
+
"deep-research/SKILL.md" in e and "2.9.4" in e and "2.9.3" in e
|
|
839
|
+
for e in csc.ERRORS
|
|
840
|
+
),
|
|
841
|
+
msg=f"expected frontmatter↔table version drift error in: {csc.ERRORS!r}",
|
|
842
|
+
)
|
|
843
|
+
|
|
844
|
+
def test_missing_table_rows_fails(self) -> None:
|
|
845
|
+
"""A SKILL.md that loses its Version-Info table rows must surface rather than silently
|
|
846
|
+
pass on an empty match."""
|
|
847
|
+
with TemporaryDirectory() as tmp:
|
|
848
|
+
root = Path(tmp)
|
|
849
|
+
csc.ROOT = root
|
|
850
|
+
_write_skill_fixtures(root)
|
|
851
|
+
(root / "academic-paper" / "SKILL.md").write_text(
|
|
852
|
+
'---\nname: academic-paper\nmetadata:\n version: "3.2.0"\n'
|
|
853
|
+
' last_updated: "2026-06-01"\n---\n\nNo version table here.\n',
|
|
854
|
+
encoding="utf-8",
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
csc.check_skill_version_blocks()
|
|
858
|
+
|
|
859
|
+
self.assertTrue(
|
|
860
|
+
any("academic-paper/SKILL.md" in e and "Version Info" in e for e in csc.ERRORS),
|
|
861
|
+
msg=f"expected missing-table-rows error in: {csc.ERRORS!r}",
|
|
862
|
+
)
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
# Minimal CHANGELOG whose latest entry date is the parameter; the suite-date-sanity check
|
|
866
|
+
# compares academic-pipeline/SKILL.md last_updated against this. Two prior entries so the
|
|
867
|
+
# "latest" selection (first `## [X.Y.Z]` after [Unreleased]) is exercised, not just sole-entry.
|
|
868
|
+
CHANGELOG_TEMPLATE = """\
|
|
869
|
+
# Changelog
|
|
870
|
+
|
|
871
|
+
## [Unreleased]
|
|
872
|
+
|
|
873
|
+
## [{latest_ver}] - {latest_date} — latest real entry
|
|
874
|
+
|
|
875
|
+
## [3.11.1] - 2026-06-06 — prior patch
|
|
876
|
+
|
|
877
|
+
## [3.11.0] - 2026-06-04 — prior minor
|
|
878
|
+
"""
|
|
879
|
+
|
|
880
|
+
|
|
881
|
+
def _write_date_sanity_fixtures(
|
|
882
|
+
root: Path, *, changelog_date: str, pipeline_date: str, changelog_ver: str = "3.12.0"
|
|
883
|
+
) -> None:
|
|
884
|
+
"""Write a CHANGELOG with a known latest-entry date + four SKILL.md where only
|
|
885
|
+
academic-pipeline's last_updated is the variable under test."""
|
|
886
|
+
(root / "CHANGELOG.md").write_text(
|
|
887
|
+
CHANGELOG_TEMPLATE.format(latest_ver=changelog_ver, latest_date=changelog_date),
|
|
888
|
+
encoding="utf-8",
|
|
889
|
+
)
|
|
890
|
+
_write_skill_fixtures(
|
|
891
|
+
root,
|
|
892
|
+
overrides={
|
|
893
|
+
"academic-pipeline": {"fm_date": pipeline_date, "tbl_date": pipeline_date}
|
|
894
|
+
},
|
|
895
|
+
)
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
class TestSuiteSkillDateSanity(unittest.TestCase):
|
|
899
|
+
"""#377(b): academic-pipeline/SKILL.md last_updated must be >= the latest CHANGELOG entry
|
|
900
|
+
date. The other three SKILL.md version independently and are NOT date-policed here."""
|
|
901
|
+
|
|
902
|
+
def setUp(self) -> None:
|
|
903
|
+
self._orig_root = csc.ROOT
|
|
904
|
+
self._orig_errors = list(csc.ERRORS)
|
|
905
|
+
csc.ERRORS.clear()
|
|
906
|
+
|
|
907
|
+
def tearDown(self) -> None:
|
|
908
|
+
csc.ROOT = self._orig_root
|
|
909
|
+
csc.ERRORS.clear()
|
|
910
|
+
csc.ERRORS.extend(self._orig_errors)
|
|
911
|
+
|
|
912
|
+
def test_pipeline_date_equal_to_changelog_passes(self) -> None:
|
|
913
|
+
"""last_updated == latest CHANGELOG date → fine (the normal aligned-release case)."""
|
|
914
|
+
with TemporaryDirectory() as tmp:
|
|
915
|
+
root = Path(tmp)
|
|
916
|
+
csc.ROOT = root
|
|
917
|
+
_write_date_sanity_fixtures(
|
|
918
|
+
root, changelog_date="2026-06-08", pipeline_date="2026-06-08"
|
|
919
|
+
)
|
|
920
|
+
|
|
921
|
+
csc.check_suite_skill_date_sanity()
|
|
922
|
+
|
|
923
|
+
self.assertEqual(
|
|
924
|
+
csc.ERRORS, [], msg=f"unexpected errors on aligned date: {csc.ERRORS!r}"
|
|
925
|
+
)
|
|
926
|
+
|
|
927
|
+
def test_pipeline_date_after_changelog_passes(self) -> None:
|
|
928
|
+
"""last_updated strictly AFTER the latest CHANGELOG date is allowed — a post-release
|
|
929
|
+
doc touch legitimately advances the date past the release entry."""
|
|
930
|
+
with TemporaryDirectory() as tmp:
|
|
931
|
+
root = Path(tmp)
|
|
932
|
+
csc.ROOT = root
|
|
933
|
+
_write_date_sanity_fixtures(
|
|
934
|
+
root, changelog_date="2026-06-08", pipeline_date="2026-06-10"
|
|
935
|
+
)
|
|
936
|
+
|
|
937
|
+
csc.check_suite_skill_date_sanity()
|
|
938
|
+
|
|
939
|
+
self.assertEqual(
|
|
940
|
+
csc.ERRORS, [], msg=f"a later last_updated must pass, got: {csc.ERRORS!r}"
|
|
941
|
+
)
|
|
942
|
+
|
|
943
|
+
def test_pipeline_date_before_changelog_fails(self) -> None:
|
|
944
|
+
"""The exact v3.12.0 drift: suite version bumped, last_updated left at the prior release
|
|
945
|
+
date (earlier than the latest CHANGELOG entry) → must fail."""
|
|
946
|
+
with TemporaryDirectory() as tmp:
|
|
947
|
+
root = Path(tmp)
|
|
948
|
+
csc.ROOT = root
|
|
949
|
+
_write_date_sanity_fixtures(
|
|
950
|
+
root, changelog_date="2026-06-08", pipeline_date="2026-06-01"
|
|
951
|
+
)
|
|
952
|
+
|
|
953
|
+
csc.check_suite_skill_date_sanity()
|
|
954
|
+
|
|
955
|
+
self.assertTrue(
|
|
956
|
+
any(
|
|
957
|
+
"academic-pipeline/SKILL.md" in e
|
|
958
|
+
and "2026-06-01" in e
|
|
959
|
+
and "2026-06-08" in e
|
|
960
|
+
for e in csc.ERRORS
|
|
961
|
+
),
|
|
962
|
+
msg=f"expected stale-suite-date error in: {csc.ERRORS!r}",
|
|
963
|
+
)
|
|
964
|
+
|
|
965
|
+
def test_date_check_is_bound_to_suite_path_only(self) -> None:
|
|
966
|
+
"""Out-of-scope guard (#377): the date check polices ONLY `_SUITE_SKILL_PATH`. To prove
|
|
967
|
+
this is genuine scoping and not a vacuous pass, the test demonstrates that the SAME early
|
|
968
|
+
date is ignored when carried by an independent skill but flagged when carried by whatever
|
|
969
|
+
path `_SUITE_SKILL_PATH` names — i.e. repointing the constant repoints the policing.
|
|
970
|
+
|
|
971
|
+
Fixture: pipeline date is current (2026-06-08, == CHANGELOG); academic-paper carries an
|
|
972
|
+
early date (2026-06-01 < CHANGELOG). With the real constant the early academic-paper date
|
|
973
|
+
is NOT flagged; after repointing the constant AT academic-paper, that exact same early
|
|
974
|
+
date IS flagged. If the check ever fanned out across all four skills, the first assertion
|
|
975
|
+
would already fail."""
|
|
976
|
+
orig_suite_path = csc._SUITE_SKILL_PATH
|
|
977
|
+
try:
|
|
978
|
+
with TemporaryDirectory() as tmp:
|
|
979
|
+
root = Path(tmp)
|
|
980
|
+
csc.ROOT = root
|
|
981
|
+
_write_date_sanity_fixtures(
|
|
982
|
+
root, changelog_date="2026-06-08", pipeline_date="2026-06-08"
|
|
983
|
+
)
|
|
984
|
+
# academic-paper keeps its default early date (2026-06-01) from _write_skill_fixtures.
|
|
985
|
+
|
|
986
|
+
# Real constant → only pipeline policed; academic-paper's early date is ignored.
|
|
987
|
+
csc.check_suite_skill_date_sanity()
|
|
988
|
+
self.assertEqual(
|
|
989
|
+
csc.ERRORS, [],
|
|
990
|
+
msg=f"independent-skill early date must not be policed, got: {csc.ERRORS!r}",
|
|
991
|
+
)
|
|
992
|
+
|
|
993
|
+
# Repoint the constant at academic-paper → its early date is now the policed one.
|
|
994
|
+
csc.ERRORS.clear()
|
|
995
|
+
csc._SUITE_SKILL_PATH = "academic-paper/SKILL.md"
|
|
996
|
+
csc.check_suite_skill_date_sanity()
|
|
997
|
+
self.assertTrue(
|
|
998
|
+
any(
|
|
999
|
+
"academic-paper/SKILL.md" in e and "2026-06-01" in e and "2026-06-08" in e
|
|
1000
|
+
for e in csc.ERRORS
|
|
1001
|
+
),
|
|
1002
|
+
msg=f"repointed suite path must police academic-paper's early date: {csc.ERRORS!r}",
|
|
1003
|
+
)
|
|
1004
|
+
finally:
|
|
1005
|
+
csc._SUITE_SKILL_PATH = orig_suite_path
|
|
1006
|
+
|
|
1007
|
+
def test_malformed_suite_skill_does_not_double_report(self) -> None:
|
|
1008
|
+
"""When the suite SKILL.md is unparseable, check_skill_version_blocks() already records the
|
|
1009
|
+
error; check_suite_skill_date_sanity() must NOT re-report the same root cause from its own
|
|
1010
|
+
re-parse. Drives both checks in order (as main() does) and asserts a single pipeline error."""
|
|
1011
|
+
with TemporaryDirectory() as tmp:
|
|
1012
|
+
root = Path(tmp)
|
|
1013
|
+
csc.ROOT = root
|
|
1014
|
+
_write_date_sanity_fixtures(
|
|
1015
|
+
root, changelog_date="2026-06-08", pipeline_date="2026-06-08"
|
|
1016
|
+
)
|
|
1017
|
+
# Strip the suite SKILL's Version-Info table rows so it fails to parse.
|
|
1018
|
+
pipeline_skill = root / "academic-pipeline" / "SKILL.md"
|
|
1019
|
+
text = pipeline_skill.read_text(encoding="utf-8")
|
|
1020
|
+
pipeline_skill.write_text(
|
|
1021
|
+
text.replace("| Skill Version | 3.12.0 |", "").replace(
|
|
1022
|
+
"| Last Updated | 2026-06-08 |", ""
|
|
1023
|
+
),
|
|
1024
|
+
encoding="utf-8",
|
|
1025
|
+
)
|
|
1026
|
+
|
|
1027
|
+
csc.check_skill_version_blocks()
|
|
1028
|
+
csc.check_suite_skill_date_sanity()
|
|
1029
|
+
|
|
1030
|
+
pipeline_errors = [e for e in csc.ERRORS if "academic-pipeline/SKILL.md" in e]
|
|
1031
|
+
self.assertEqual(
|
|
1032
|
+
len(pipeline_errors), 1,
|
|
1033
|
+
msg=f"expected exactly one pipeline error, got {len(pipeline_errors)}: {pipeline_errors!r}",
|
|
1034
|
+
)
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
class RebuttalAuditGuardTest(unittest.TestCase):
|
|
1038
|
+
"""check_rebuttal_audit_guard() must enforce the integrity-boundary language
|
|
1039
|
+
in the academic-paper Rebuttal-Audit Mode section. Mutation tests prove the
|
|
1040
|
+
guard actually fails when the suppression language is dropped — otherwise the
|
|
1041
|
+
check would be a vacuous pass that lets the false-certification risk back in."""
|
|
1042
|
+
|
|
1043
|
+
_GOOD = (
|
|
1044
|
+
"## Rebuttal-Audit Mode\n\n"
|
|
1045
|
+
"Advisory QA of an existing rebuttal draft.\n\n"
|
|
1046
|
+
"**IRON RULE:** standalone, so it MUST NOT emit a Schema 11 ledger, "
|
|
1047
|
+
"MUST NOT write the Material Passport, and MUST NOT mark ready_to_submit.\n\n"
|
|
1048
|
+
"## Next Section\n"
|
|
1049
|
+
)
|
|
1050
|
+
|
|
1051
|
+
def _run_guard_with(self, skill_text: str) -> list:
|
|
1052
|
+
orig_read = csc.read
|
|
1053
|
+
csc.ERRORS.clear()
|
|
1054
|
+
try:
|
|
1055
|
+
csc.read = lambda rel: skill_text if rel == "academic-paper/SKILL.md" else orig_read(rel)
|
|
1056
|
+
csc.check_rebuttal_audit_guard()
|
|
1057
|
+
return list(csc.ERRORS)
|
|
1058
|
+
finally:
|
|
1059
|
+
csc.read = orig_read
|
|
1060
|
+
csc.ERRORS.clear()
|
|
1061
|
+
|
|
1062
|
+
def test_guard_passes_with_full_suppression_language(self) -> None:
|
|
1063
|
+
self.assertEqual(self._run_guard_with(self._GOOD), [])
|
|
1064
|
+
|
|
1065
|
+
def test_guard_fails_when_section_missing(self) -> None:
|
|
1066
|
+
errs = self._run_guard_with("## Some Other Mode\n\nno rebuttal section here\n")
|
|
1067
|
+
self.assertTrue(any("missing" in e and "Rebuttal-Audit" in e for e in errs), errs)
|
|
1068
|
+
|
|
1069
|
+
def test_guard_fails_when_schema11_suppression_dropped(self) -> None:
|
|
1070
|
+
mutated = self._GOOD.replace("Schema 11", "the tracker")
|
|
1071
|
+
errs = self._run_guard_with(mutated)
|
|
1072
|
+
self.assertTrue(any("Schema 11" in e for e in errs), errs)
|
|
1073
|
+
|
|
1074
|
+
def test_guard_fails_when_must_not_dropped(self) -> None:
|
|
1075
|
+
mutated = self._GOOD.replace("MUST NOT", "should avoid")
|
|
1076
|
+
errs = self._run_guard_with(mutated)
|
|
1077
|
+
self.assertTrue(any("MUST NOT" in e for e in errs), errs)
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
if __name__ == "__main__":
|
|
1081
|
+
unittest.main()
|