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,826 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Lint: version labels stay aligned across .claude/CLAUDE.md, SKILL.md frontmatter, and CHANGELOG.md.
|
|
3
|
+
|
|
4
|
+
Invariants enforced:
|
|
5
|
+
1. Every skill listed in .claude/CLAUDE.md Skills Overview table has a version
|
|
6
|
+
equal to its own SKILL.md metadata.version.
|
|
7
|
+
2. .claude/CLAUDE.md "**Suite version**: X.Y.Z" equals the most recent
|
|
8
|
+
"## [X.Y.Z]" entry in CHANGELOG.md.
|
|
9
|
+
3. academic-pipeline version in the table equals the suite version (pipeline
|
|
10
|
+
= orchestrator, by convention tracks the suite release).
|
|
11
|
+
4. The plugin manifests (.claude-plugin/plugin.json "version" and
|
|
12
|
+
.claude-plugin/marketplace.json plugins[].version) equal the suite version.
|
|
13
|
+
These are the repo's OUTWARD-FACING package metadata — a user updating the
|
|
14
|
+
plugin sees them — and were the one surface a v3.10.0 release-doc pass missed
|
|
15
|
+
because no lint covered them (marketplace had silently sat at 3.7.0).
|
|
16
|
+
5. The README.md shields.io version badge (`badge/version-vX.Y.Z`) equals the
|
|
17
|
+
suite version — the most outward-facing surface of all.
|
|
18
|
+
6. No docs/*.md cites a `vX.Y.Z` ABOVE the suite version (a forward/unknown
|
|
19
|
+
reference misleads readers). Equal-to-suite is allowed.
|
|
20
|
+
7. Every version-bearing H2 heading in docs/<name>.md has a matching
|
|
21
|
+
version-bearing H2 (same version) in docs/<name>.zh-TW.md and vice versa.
|
|
22
|
+
Plain headings may differ — only version TAGS must stay in lockstep.
|
|
23
|
+
8. The plugin.json description's agent-count claim (when present; both the
|
|
24
|
+
legacy "N-agent" and the #753 "N prompt roles" spellings) equals the
|
|
25
|
+
number of unique *_agent.md files in the tree (#414: the advertised
|
|
26
|
+
number had silently drifted from the tree). The plugin-root agents/
|
|
27
|
+
mirror dir is excluded from the count — real byte-identical copies of
|
|
28
|
+
deep-research agents since #413 (symlinks before that), pinned as pure
|
|
29
|
+
aliases by check_agents_mirror_sync.py, never a source of new agents.
|
|
30
|
+
9. The latest CHANGELOG entry's body is >= 100 characters (#487) — a bare
|
|
31
|
+
heading or one-line stub is not release notes. Only the LATEST entry is
|
|
32
|
+
gated; historical entries may be terse.
|
|
33
|
+
10. .claude/CLAUDE.md "Last Updated" lies within ±7 days of the latest
|
|
34
|
+
CHANGELOG entry's date (#487). The CHANGELOG date is the baseline (not
|
|
35
|
+
"today") so re-running the lint later cannot flip the result.
|
|
36
|
+
11. The newest "## vX.Y… Key Additions" heading in .claude/CLAUDE.md matches
|
|
37
|
+
the suite version (#487), compared at the heading's own precision —
|
|
38
|
+
`## v3.14 Key Additions` matches suite 3.14.0.
|
|
39
|
+
12. The citation surfaces track the release (#754): CITATION.cff `version`
|
|
40
|
+
equals the suite version and its `date-released` lies within ±7 days of
|
|
41
|
+
the latest CHANGELOG entry's date; every `(Version X.Y.Z)` token in
|
|
42
|
+
POSITIONING.md equals the suite version.
|
|
43
|
+
|
|
44
|
+
Tag gate (#487): `--tag <ref>` additionally requires the given git tag
|
|
45
|
+
(leading `v` optional) to equal the suite version — the one comparison
|
|
46
|
+
nothing else performs at tag time. Wired via tag-version-match.yml.
|
|
47
|
+
|
|
48
|
+
Runs from repo root by default; `--path` lets tests point at a fake tree.
|
|
49
|
+
"""
|
|
50
|
+
from __future__ import annotations
|
|
51
|
+
|
|
52
|
+
import argparse
|
|
53
|
+
import json
|
|
54
|
+
import re
|
|
55
|
+
import sys
|
|
56
|
+
from collections import Counter
|
|
57
|
+
from datetime import date, datetime
|
|
58
|
+
from pathlib import Path
|
|
59
|
+
|
|
60
|
+
import yaml
|
|
61
|
+
|
|
62
|
+
from _skill_lint import parse_frontmatter, FrontmatterError
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# Broad token captures: anything that looks like an identifier inside the
|
|
66
|
+
# expected position. The strict validator below then decides whether the raw
|
|
67
|
+
# token is a canonical semver. Using the regex as a filter (the pre-#169
|
|
68
|
+
# pattern) silently dropped invalid tokens and hid the very drift this lint
|
|
69
|
+
# is meant to surface; see dual-track review on PR for that class of bug.
|
|
70
|
+
TABLE_TOKEN_RE = re.compile(
|
|
71
|
+
r"^\|\s*`([a-z0-9-]+)`\s+v([A-Za-z0-9.\-_+]+)\s*\|", re.MULTILINE
|
|
72
|
+
)
|
|
73
|
+
SUITE_TOKEN_RE = re.compile(
|
|
74
|
+
r"^\s*-\s*\*\*Suite version\*\*:\s*([A-Za-z0-9.\-_+]+)", re.MULTILINE
|
|
75
|
+
)
|
|
76
|
+
CHANGELOG_TOKEN_RE = re.compile(r"^##\s*\[([A-Za-z0-9.\-_+]+)\]", re.MULTILINE)
|
|
77
|
+
SEMVER_STRICT_RE = re.compile(r"^\d+(?:\.\d+){2,3}$") # exactly 3 or 4 segments (N.N.N or N.N.N.N)
|
|
78
|
+
|
|
79
|
+
# Invariant 5: shields.io version badge label, e.g. `badge/version-v3.11.1-blue`.
|
|
80
|
+
# `_VSEG` = 3-or-4 numeric segments. The trailing `(?!\.?\d)` stops a 5th
|
|
81
|
+
# segment (`3.11.1.2.3` would otherwise yield `3.11.1.2`); the label's own
|
|
82
|
+
# `-<color>` separator already bounds the token on the right, so no broader
|
|
83
|
+
# suffix lookahead is needed here. Keyed off the label, not the release URL.
|
|
84
|
+
_VSEG = r"(\d+(?:\.\d+){2,3})"
|
|
85
|
+
README_BADGE_RE = re.compile(r"badge/version-v" + _VSEG + r"(?!\.?\d)", re.IGNORECASE)
|
|
86
|
+
# Invariant 6 only: a CANONICAL `vX.Y.Z(.W)` token in docs prose. The leading
|
|
87
|
+
# `(?<![\w.])` blocks mid-identifier matches; the trailing `(?![\d.\-+A-Za-z])`
|
|
88
|
+
# drops prerelease/build/5-segment tokens ENTIRELY (`v3.12.0-alpha`,
|
|
89
|
+
# `v3.11.1.2.3`) rather than partial-matching them (review finding). `_VSEG` is
|
|
90
|
+
# 3-or-4 segments, so a 2-segment `v3.10` never matches and is silently
|
|
91
|
+
# ignored (inv 6 gates only on full release tokens; a partial like `v3.10`
|
|
92
|
+
# is not a version this lint adjudicates). Invariant 7 uses H2_VERSION_RE.
|
|
93
|
+
DOCS_VERSION_RE = re.compile(r"(?<![\w.])v" + _VSEG + r"(?![\d.\-+A-Za-z])")
|
|
94
|
+
# Invariant 7: version tag inside an H2 heading, e.g. `## Corpus (v3.6.4+)`.
|
|
95
|
+
# Same canonical-token shape, but a trailing `+` IS allowed (the repo's
|
|
96
|
+
# "vX.Y.Z and later" heading convention, e.g. `(v3.6.4+)`); only `-`/letters/
|
|
97
|
+
# extra `.N` segments disqualify.
|
|
98
|
+
H2_RE = re.compile(r"^##\s+(.*?)\s*$", re.MULTILINE)
|
|
99
|
+
H2_VERSION_RE = re.compile(r"(?<![\w.])v" + _VSEG + r"(?![\d.\-A-Za-z])")
|
|
100
|
+
|
|
101
|
+
NON_VERSION_CHANGELOG_TOKENS = frozenset({"Unreleased"})
|
|
102
|
+
|
|
103
|
+
# Invariant 8: the outward-facing agent-count claim. Two licensed spellings:
|
|
104
|
+
# the legacy "38-agent" form and the #753 evidence-aligned "39 prompt roles"
|
|
105
|
+
# form (exact plural). Both bind the stated number to the tree's *_agent.md
|
|
106
|
+
# count, so a reworded claim surface cannot detach the number from the
|
|
107
|
+
# inventory. Trailing \b keeps near-miss spellings ("39-agentic",
|
|
108
|
+
# "39 prompt role") from counting as bound — check_distribution_surface_claims
|
|
109
|
+
# D4 then flags them as unbindable.
|
|
110
|
+
AGENT_CLAIM_RE = re.compile(r"(\d+)(?:-agent\b|\s+prompt\s+roles\b)")
|
|
111
|
+
|
|
112
|
+
# Invariant 9: minimum body length (chars, after strip) for the latest entry.
|
|
113
|
+
CHANGELOG_BODY_MIN_CHARS = 100
|
|
114
|
+
# Invariant 10: the release date on a `## [X.Y.Z] - YYYY-MM-DD` heading (ARS
|
|
115
|
+
# headings may append an em-dash summary after the date) and the
|
|
116
|
+
# `- **Last Updated**: YYYY-MM-DD` line in .claude/CLAUDE.md. The trailing
|
|
117
|
+
# `(?!\d)` blocks prefix-capturing a longer run (`2026-04-222` must not read
|
|
118
|
+
# as `2026-04-22`, codex re-review P3); the day field then fails the strict
|
|
119
|
+
# ISO gate downstream.
|
|
120
|
+
CHANGELOG_DATE_RE = re.compile(r"\]\s*-\s*(\d{4}-\d{2}-\d{2})(?!\d)")
|
|
121
|
+
LAST_UPDATED_RE = re.compile(
|
|
122
|
+
r"^\s*-\s*\*\*Last Updated\*\*:\s*(\S+)", re.MULTILINE
|
|
123
|
+
)
|
|
124
|
+
LAST_UPDATED_MAX_DAYS = 7
|
|
125
|
+
# Invariant 11: a version-tagged Key Additions H2, e.g. `## v3.14 Key
|
|
126
|
+
# Additions (...)`. 2-4 segments — headings cite major.minor or a full patch.
|
|
127
|
+
KEY_ADDITIONS_RE = re.compile(
|
|
128
|
+
r"^##\s+v(\d+(?:\.\d+){1,3})\s+Key Additions", re.MULTILINE
|
|
129
|
+
)
|
|
130
|
+
# A release-entry heading (`## [X.Y.Z]`). Applied per-line by _next_entry_offset
|
|
131
|
+
# (fence-aware), so no MULTILINE — the latest entry's body ends at the next
|
|
132
|
+
# such heading OUTSIDE a code fence, never at a `## ` inside one (codex P2-1).
|
|
133
|
+
# `[Unreleased]` never appears below the latest release entry, so keying on the
|
|
134
|
+
# `[` bracket is sufficient.
|
|
135
|
+
NEXT_ENTRY_RE = re.compile(r"##\s+\[")
|
|
136
|
+
# Strict YYYY-MM-DD guard: date.fromisoformat() accepts compact 20260422 and
|
|
137
|
+
# ISO week dates, so a shape check gates before parsing (codex P2-2).
|
|
138
|
+
ISO_DATE_RE = re.compile(r"^\d{4}-\d{2}-\d{2}$")
|
|
139
|
+
# Invariant 12: the POSITIONING.md citation-prose token, e.g. `(Version 3.20.1)`.
|
|
140
|
+
# Captures the WHOLE parenthesized payload, then strip + strict-validate (the
|
|
141
|
+
# post-#169 idiom above): a non-canonical spelling (`v3.20.1`, `3.20.1-rc1`,
|
|
142
|
+
# bare `3.20`) or a malformed clause (`3.14.0 ` with a stray space, `3.14.0
|
|
143
|
+
# draft`) surfaces as an error instead of the clause dropping out of a
|
|
144
|
+
# narrower character class and silently passing (codex round-3 P2).
|
|
145
|
+
# CITATION.cff has no regex — it is YAML and is parsed as YAML.
|
|
146
|
+
POSITIONING_VERSION_RE = re.compile(r"\(Version\s+([^)]*)\)")
|
|
147
|
+
|
|
148
|
+
PIPELINE_SKILL_NAME = "academic-pipeline"
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _parse_iso_date(raw: str) -> date | None:
|
|
152
|
+
"""Strict YYYY-MM-DD → date, else None (bad shape OR impossible date like
|
|
153
|
+
2026-02-30). Never raises — a release lint reports drift, never crashes."""
|
|
154
|
+
if not ISO_DATE_RE.match(raw):
|
|
155
|
+
return None
|
|
156
|
+
try:
|
|
157
|
+
return date.fromisoformat(raw)
|
|
158
|
+
except ValueError:
|
|
159
|
+
return None
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _version_tuple(token: str) -> tuple[int, ...]:
|
|
163
|
+
"""Parse a canonical N.N.N(.N) into an int tuple for ordering."""
|
|
164
|
+
return tuple(int(p) for p in token.split("."))
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def _version_le(a: str, b: str) -> bool:
|
|
168
|
+
"""a <= b by segment-wise numeric compare (pads shorter with zeros)."""
|
|
169
|
+
ta, tb = _version_tuple(a), _version_tuple(b)
|
|
170
|
+
n = max(len(ta), len(tb))
|
|
171
|
+
return ta + (0,) * (n - len(ta)) <= tb + (0,) * (n - len(tb))
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _is_strict_semver(token: str) -> bool:
|
|
175
|
+
return bool(SEMVER_STRICT_RE.match(token))
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _parse_table_versions(
|
|
179
|
+
claude_md_text: str,
|
|
180
|
+
) -> tuple[dict[str, str], list[tuple[str, str]]]:
|
|
181
|
+
"""Return (valid_versions, invalid_rows) from the Skills Overview table.
|
|
182
|
+
|
|
183
|
+
`valid_versions` maps skill_name -> version for rows whose v-token is a
|
|
184
|
+
canonical N.N.N(.N)+ string. `invalid_rows` collects (skill_name, raw_token)
|
|
185
|
+
for rows where the v-token is present but not a canonical version; the
|
|
186
|
+
caller surfaces these as errors so a malformed table row does not silently
|
|
187
|
+
drop out of downstream invariants.
|
|
188
|
+
"""
|
|
189
|
+
valid: dict[str, str] = {}
|
|
190
|
+
invalid: list[tuple[str, str]] = []
|
|
191
|
+
for skill, raw in TABLE_TOKEN_RE.findall(claude_md_text):
|
|
192
|
+
if _is_strict_semver(raw):
|
|
193
|
+
valid[skill] = raw
|
|
194
|
+
else:
|
|
195
|
+
invalid.append((skill, raw))
|
|
196
|
+
return valid, invalid
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _parse_suite_version(claude_md_text: str) -> tuple[str | None, str | None]:
|
|
200
|
+
"""Return (valid_version, invalid_raw_token).
|
|
201
|
+
|
|
202
|
+
Exactly one of the two is non-None when a Suite version line is present.
|
|
203
|
+
Both are None when the line is missing entirely.
|
|
204
|
+
"""
|
|
205
|
+
m = SUITE_TOKEN_RE.search(claude_md_text)
|
|
206
|
+
if m is None:
|
|
207
|
+
return None, None
|
|
208
|
+
raw = m.group(1)
|
|
209
|
+
if _is_strict_semver(raw):
|
|
210
|
+
return raw, None
|
|
211
|
+
return None, raw
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _parse_changelog_latest(
|
|
215
|
+
changelog_text: str,
|
|
216
|
+
) -> tuple[str | None, str | None, str | None, str]:
|
|
217
|
+
"""Return (valid_latest, invalid_raw_token, latest_date, latest_body).
|
|
218
|
+
|
|
219
|
+
Walks `## [TOKEN]` headings in document order, skipping pseudo-entries
|
|
220
|
+
like `[Unreleased]`. The first remaining heading is the latest release.
|
|
221
|
+
If that heading's token is not a canonical version, it is returned as
|
|
222
|
+
`invalid_raw_token` so the caller flags it instead of silently falling
|
|
223
|
+
through to a predecessor and hiding the malformed release entry.
|
|
224
|
+
|
|
225
|
+
For a valid latest entry, `latest_date` is the heading's YYYY-MM-DD (None
|
|
226
|
+
when absent — invariant 10 flags that) and `latest_body` is the text up to
|
|
227
|
+
the next release heading (invariant 9); `### ` sub-headings and any `## `
|
|
228
|
+
line inside a fenced code block stay INSIDE the body.
|
|
229
|
+
"""
|
|
230
|
+
for m in CHANGELOG_TOKEN_RE.finditer(changelog_text):
|
|
231
|
+
raw = m.group(1)
|
|
232
|
+
if raw in NON_VERSION_CHANGELOG_TOKENS:
|
|
233
|
+
continue
|
|
234
|
+
if not _is_strict_semver(raw):
|
|
235
|
+
return None, raw, None, ""
|
|
236
|
+
line_end = changelog_text.find("\n", m.end())
|
|
237
|
+
if line_end == -1:
|
|
238
|
+
line_end = len(changelog_text)
|
|
239
|
+
heading_line = changelog_text[m.start():line_end]
|
|
240
|
+
date_m = CHANGELOG_DATE_RE.search(heading_line)
|
|
241
|
+
body = changelog_text[line_end : _next_entry_offset(changelog_text, line_end)]
|
|
242
|
+
return raw, None, date_m.group(1) if date_m else None, body
|
|
243
|
+
return None, None, None, ""
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _next_entry_offset(text: str, start: int) -> int:
|
|
247
|
+
"""Offset of the next release heading (`## [`) at or after `start`, skipping
|
|
248
|
+
any that fall inside a ``` fenced code block. A code sample in the release
|
|
249
|
+
notes can contain a line that looks exactly like a release heading (even
|
|
250
|
+
`## [example] - 2020-01-01`), which must NOT truncate the entry body
|
|
251
|
+
(codex P2-1 + re-review). Returns len(text) when none remains."""
|
|
252
|
+
in_fence = False
|
|
253
|
+
i = start
|
|
254
|
+
n = len(text)
|
|
255
|
+
while i < n:
|
|
256
|
+
line_end = text.find("\n", i)
|
|
257
|
+
if line_end == -1:
|
|
258
|
+
line_end = n
|
|
259
|
+
line = text[i:line_end]
|
|
260
|
+
stripped = line.lstrip()
|
|
261
|
+
if stripped.startswith("```") or stripped.startswith("~~~"):
|
|
262
|
+
in_fence = not in_fence
|
|
263
|
+
elif not in_fence and NEXT_ENTRY_RE.match(line):
|
|
264
|
+
return i
|
|
265
|
+
i = line_end + 1
|
|
266
|
+
return n
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def check(root: Path, tag: str | None = None) -> list[str]:
|
|
270
|
+
errors: list[str] = []
|
|
271
|
+
|
|
272
|
+
claude_md = root / ".claude" / "CLAUDE.md"
|
|
273
|
+
if not claude_md.is_file():
|
|
274
|
+
errors.append(f"{claude_md}: not found")
|
|
275
|
+
return errors
|
|
276
|
+
claude_text = claude_md.read_text(encoding="utf-8")
|
|
277
|
+
|
|
278
|
+
table_versions, invalid_table_rows = _parse_table_versions(claude_text)
|
|
279
|
+
if not table_versions and not invalid_table_rows:
|
|
280
|
+
errors.append(
|
|
281
|
+
f"{claude_md}: Skills Overview table has no parseable "
|
|
282
|
+
"`<skill>` vX.Y.Z rows"
|
|
283
|
+
)
|
|
284
|
+
for skill, raw in invalid_table_rows:
|
|
285
|
+
errors.append(
|
|
286
|
+
f"{claude_md}: table row {skill!r} has invalid version "
|
|
287
|
+
f"token v{raw!r} (expected canonical N.N.N or N.N.N.N)"
|
|
288
|
+
)
|
|
289
|
+
|
|
290
|
+
suite_version, invalid_suite_token = _parse_suite_version(claude_text)
|
|
291
|
+
if suite_version is None and invalid_suite_token is None:
|
|
292
|
+
errors.append(
|
|
293
|
+
f"{claude_md}: missing '**Suite version**: X.Y.Z' line"
|
|
294
|
+
)
|
|
295
|
+
elif invalid_suite_token is not None:
|
|
296
|
+
errors.append(
|
|
297
|
+
f"{claude_md}: Suite version token {invalid_suite_token!r} is "
|
|
298
|
+
"not a canonical N.N.N or N.N.N.N version"
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
changelog = root / "CHANGELOG.md"
|
|
302
|
+
latest_date: str | None = None
|
|
303
|
+
latest: str | None = None
|
|
304
|
+
if not changelog.is_file():
|
|
305
|
+
errors.append(f"{changelog}: not found")
|
|
306
|
+
else:
|
|
307
|
+
latest, invalid_latest, latest_date, latest_body = (
|
|
308
|
+
_parse_changelog_latest(changelog.read_text(encoding="utf-8"))
|
|
309
|
+
)
|
|
310
|
+
if latest is None and invalid_latest is None:
|
|
311
|
+
errors.append(f"{changelog}: no '## [X.Y.Z]' entry found")
|
|
312
|
+
elif invalid_latest is not None:
|
|
313
|
+
errors.append(
|
|
314
|
+
f"{changelog}: latest entry token {invalid_latest!r} is "
|
|
315
|
+
"not a canonical N.N.N or N.N.N.N version"
|
|
316
|
+
)
|
|
317
|
+
elif suite_version is not None and latest != suite_version:
|
|
318
|
+
errors.append(
|
|
319
|
+
f"{claude_md}: Suite version {suite_version!r} does not match "
|
|
320
|
+
f"CHANGELOG latest entry {latest!r}"
|
|
321
|
+
)
|
|
322
|
+
# Invariant 9: the latest entry must carry real release notes.
|
|
323
|
+
if latest is not None:
|
|
324
|
+
body_len = len(latest_body.strip())
|
|
325
|
+
if body_len < CHANGELOG_BODY_MIN_CHARS:
|
|
326
|
+
errors.append(
|
|
327
|
+
f"{changelog}: latest entry [{latest}] body is {body_len} "
|
|
328
|
+
f"chars — release notes must be >= "
|
|
329
|
+
f"{CHANGELOG_BODY_MIN_CHARS} chars"
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
# Invariant 10: .claude/CLAUDE.md "Last Updated" within ±7 days of the
|
|
333
|
+
# latest CHANGELOG entry's date. Skipped while the CHANGELOG itself is
|
|
334
|
+
# missing/malformed — those already errored above.
|
|
335
|
+
if latest is not None:
|
|
336
|
+
errors.extend(
|
|
337
|
+
_check_last_updated_freshness(
|
|
338
|
+
claude_md, claude_text, changelog, latest_date
|
|
339
|
+
)
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
for skill_name, table_version in sorted(table_versions.items()):
|
|
343
|
+
skill_md = root / skill_name / "SKILL.md"
|
|
344
|
+
if not skill_md.is_file():
|
|
345
|
+
errors.append(
|
|
346
|
+
f"{claude_md}: table lists {skill_name!r} v{table_version} "
|
|
347
|
+
f"but {skill_md} does not exist"
|
|
348
|
+
)
|
|
349
|
+
continue
|
|
350
|
+
try:
|
|
351
|
+
fm = parse_frontmatter(skill_md)
|
|
352
|
+
except FrontmatterError as exc:
|
|
353
|
+
errors.append(str(exc))
|
|
354
|
+
continue
|
|
355
|
+
if fm is None:
|
|
356
|
+
errors.append(f"{skill_md}: missing YAML frontmatter")
|
|
357
|
+
continue
|
|
358
|
+
metadata = fm.get("metadata") or {}
|
|
359
|
+
declared = metadata.get("version")
|
|
360
|
+
if declared is None:
|
|
361
|
+
errors.append(f"{skill_md}: metadata.version is missing")
|
|
362
|
+
continue
|
|
363
|
+
declared_str = str(declared)
|
|
364
|
+
if declared_str != table_version:
|
|
365
|
+
errors.append(
|
|
366
|
+
f"{claude_md}: {skill_name!r} listed as v{table_version} but "
|
|
367
|
+
f"{skill_md} metadata.version is {declared_str!r}"
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
if suite_version is not None:
|
|
371
|
+
pipeline_in_table = table_versions.get(PIPELINE_SKILL_NAME)
|
|
372
|
+
if pipeline_in_table is not None and pipeline_in_table != suite_version:
|
|
373
|
+
errors.append(
|
|
374
|
+
f"{claude_md}: {PIPELINE_SKILL_NAME} listed as "
|
|
375
|
+
f"v{pipeline_in_table} but suite version is {suite_version!r} "
|
|
376
|
+
"(pipeline tracks the suite release)"
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
# Invariant 4: plugin manifests track the suite version (outward-facing
|
|
380
|
+
# package metadata). Only checked when a suite version is known.
|
|
381
|
+
if suite_version is not None:
|
|
382
|
+
errors.extend(_check_plugin_manifests(root, suite_version))
|
|
383
|
+
# Invariant 5: README version badge tracks the suite version.
|
|
384
|
+
errors.extend(_check_readme_badge(root, suite_version))
|
|
385
|
+
# Invariant 6: docs/ must not cite a version above the suite version.
|
|
386
|
+
errors.extend(_check_docs_versions(root, suite_version))
|
|
387
|
+
# Invariant 11: newest Key Additions heading matches the suite version.
|
|
388
|
+
errors.extend(_check_key_additions(claude_md, claude_text, suite_version))
|
|
389
|
+
# Invariant 12: citation surfaces (CITATION.cff / POSITIONING.md)
|
|
390
|
+
# track the suite version + release date.
|
|
391
|
+
errors.extend(_check_citation_surfaces(root, suite_version, latest_date))
|
|
392
|
+
|
|
393
|
+
# Tag gate: the pushed tag (when given) must equal the suite version. This
|
|
394
|
+
# runs OUTSIDE the `suite_version is not None` block on purpose: `--tag`
|
|
395
|
+
# promises the tag is verified at tag time, so a missing/malformed suite
|
|
396
|
+
# version must surface as "tag uncheckable" (a hard error naming the tag),
|
|
397
|
+
# never a silent pass — otherwise a garbage tag co-occurring with a broken
|
|
398
|
+
# CLAUDE.md would slip through the one gate meant to catch it.
|
|
399
|
+
if tag is not None:
|
|
400
|
+
tag_version = tag[1:] if tag.startswith("v") else tag
|
|
401
|
+
if suite_version is None:
|
|
402
|
+
errors.append(
|
|
403
|
+
f"tag {tag!r} cannot be verified: .claude/CLAUDE.md has no "
|
|
404
|
+
"usable Suite version to compare against (fix the suite "
|
|
405
|
+
"version before tagging)"
|
|
406
|
+
)
|
|
407
|
+
elif tag_version != suite_version:
|
|
408
|
+
errors.append(
|
|
409
|
+
f"tag {tag!r} does not match suite version "
|
|
410
|
+
f"{suite_version!r} (CHANGELOG latest entry / "
|
|
411
|
+
".claude/CLAUDE.md must be promoted before tagging)"
|
|
412
|
+
)
|
|
413
|
+
|
|
414
|
+
# Invariant 7: en<->zh-TW version-bearing-heading parity (independent of
|
|
415
|
+
# suite version; pairs each docs/*.md with its docs/*.zh-TW.md sibling).
|
|
416
|
+
errors.extend(_check_zhtw_heading_parity(root))
|
|
417
|
+
|
|
418
|
+
# Invariant 8: plugin.json "N-agent" description claim equals the tree's
|
|
419
|
+
# unique *_agent.md count (independent of suite version).
|
|
420
|
+
errors.extend(_check_agent_count_claim(root))
|
|
421
|
+
|
|
422
|
+
return errors
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def _check_plugin_manifests(root: Path, suite_version: str) -> list[str]:
|
|
426
|
+
"""Invariant 4: .claude-plugin/plugin.json "version" and every
|
|
427
|
+
.claude-plugin/marketplace.json plugins[].version equal the suite version.
|
|
428
|
+
Missing files / malformed JSON / missing version keys are surfaced, never
|
|
429
|
+
crash (a release lint must report drift, not blow up on it)."""
|
|
430
|
+
errors: list[str] = []
|
|
431
|
+
|
|
432
|
+
plugin_json = root / ".claude-plugin" / "plugin.json"
|
|
433
|
+
if not plugin_json.is_file():
|
|
434
|
+
errors.append(f"{plugin_json}: not found")
|
|
435
|
+
else:
|
|
436
|
+
try:
|
|
437
|
+
data = json.loads(plugin_json.read_text(encoding="utf-8"))
|
|
438
|
+
except (json.JSONDecodeError, ValueError) as exc:
|
|
439
|
+
errors.append(f"{plugin_json}: invalid JSON ({exc})")
|
|
440
|
+
else:
|
|
441
|
+
v = data.get("version")
|
|
442
|
+
if v is None:
|
|
443
|
+
errors.append(f"{plugin_json}: missing 'version' key")
|
|
444
|
+
elif str(v) != suite_version:
|
|
445
|
+
errors.append(
|
|
446
|
+
f"{plugin_json}: version {str(v)!r} does not match suite "
|
|
447
|
+
f"version {suite_version!r}"
|
|
448
|
+
)
|
|
449
|
+
|
|
450
|
+
marketplace = root / ".claude-plugin" / "marketplace.json"
|
|
451
|
+
if not marketplace.is_file():
|
|
452
|
+
errors.append(f"{marketplace}: not found")
|
|
453
|
+
else:
|
|
454
|
+
try:
|
|
455
|
+
data = json.loads(marketplace.read_text(encoding="utf-8"))
|
|
456
|
+
except (json.JSONDecodeError, ValueError) as exc:
|
|
457
|
+
errors.append(f"{marketplace}: invalid JSON ({exc})")
|
|
458
|
+
else:
|
|
459
|
+
plugins = data.get("plugins")
|
|
460
|
+
if not isinstance(plugins, list) or not plugins:
|
|
461
|
+
errors.append(f"{marketplace}: 'plugins' is missing or empty")
|
|
462
|
+
else:
|
|
463
|
+
for i, entry in enumerate(plugins):
|
|
464
|
+
v = (entry or {}).get("version") if isinstance(entry, dict) else None
|
|
465
|
+
if v is None:
|
|
466
|
+
errors.append(
|
|
467
|
+
f"{marketplace}: plugins[{i}] missing 'version' key"
|
|
468
|
+
)
|
|
469
|
+
elif str(v) != suite_version:
|
|
470
|
+
errors.append(
|
|
471
|
+
f"{marketplace}: plugins[{i}] version {str(v)!r} does "
|
|
472
|
+
f"not match suite version {suite_version!r}"
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
return errors
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def _check_readme_badge(root: Path, suite_version: str) -> list[str]:
|
|
479
|
+
"""Invariant 5: README.md shields.io version badge equals the suite version.
|
|
480
|
+
|
|
481
|
+
The badge is outward-facing — the first thing a reader sees. A v3.10.0
|
|
482
|
+
release-doc pass can miss it the same way it missed the marketplace
|
|
483
|
+
manifest (invariant 4). Missing file / no badge surfaced, never crash."""
|
|
484
|
+
errors: list[str] = []
|
|
485
|
+
readme = root / "README.md"
|
|
486
|
+
if not readme.is_file():
|
|
487
|
+
errors.append(f"{readme}: not found")
|
|
488
|
+
return errors
|
|
489
|
+
text = readme.read_text(encoding="utf-8")
|
|
490
|
+
matches = README_BADGE_RE.findall(text)
|
|
491
|
+
if not matches:
|
|
492
|
+
errors.append(f"{readme}: no `badge/version-vX.Y.Z` version badge found")
|
|
493
|
+
return errors
|
|
494
|
+
for raw in matches:
|
|
495
|
+
if raw != suite_version:
|
|
496
|
+
errors.append(
|
|
497
|
+
f"{readme}: version badge v{raw} does not match suite "
|
|
498
|
+
f"version {suite_version!r}"
|
|
499
|
+
)
|
|
500
|
+
return errors
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
def _check_docs_versions(root: Path, suite_version: str) -> list[str]:
|
|
504
|
+
"""Invariant 6: no docs/*.md cites a version ABOVE the suite version.
|
|
505
|
+
|
|
506
|
+
A doc that references a not-yet-released (or deleted) version is a forward
|
|
507
|
+
reference that misleads readers. Equal-to-suite is fine (<=). Non-canonical
|
|
508
|
+
tokens are surfaced, not silently dropped."""
|
|
509
|
+
errors: list[str] = []
|
|
510
|
+
docs = root / "docs"
|
|
511
|
+
if not docs.is_dir():
|
|
512
|
+
return errors # docs/ optional; absence is not drift
|
|
513
|
+
for md in sorted(docs.rglob("*.md")):
|
|
514
|
+
# docs/superpowers/ holds skill working files (specs/plans) that
|
|
515
|
+
# deliberately plan the NEXT release — forward references are their
|
|
516
|
+
# job, not a published-doc drift. Invariant 6 gates published docs.
|
|
517
|
+
if "superpowers" in md.relative_to(docs).parts:
|
|
518
|
+
continue
|
|
519
|
+
text = md.read_text(encoding="utf-8")
|
|
520
|
+
for raw in DOCS_VERSION_RE.findall(text):
|
|
521
|
+
if not _is_strict_semver(raw):
|
|
522
|
+
continue # 2-segment etc. — not a release token we gate on
|
|
523
|
+
if not _version_le(raw, suite_version):
|
|
524
|
+
errors.append(
|
|
525
|
+
f"{md}: cites v{raw} which is ABOVE suite version "
|
|
526
|
+
f"{suite_version!r} (forward/unknown reference)"
|
|
527
|
+
)
|
|
528
|
+
return errors
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
def _version_bearing_headings(text: str) -> Counter:
|
|
532
|
+
"""Count version tokens across H2s that carry a vX.Y.Z tag.
|
|
533
|
+
|
|
534
|
+
Returns a multiset {version: count}. Comparison is by version token, not
|
|
535
|
+
heading text, so an en heading and its zh-TW translation match despite
|
|
536
|
+
different wording. A MULTISET (not a set/dict) is load-bearing: two H2s in
|
|
537
|
+
one doc tagged the same version count as two, so a translator dropping one
|
|
538
|
+
of a duplicated pair surfaces as a count mismatch (review finding — a
|
|
539
|
+
{version: heading} dict silently collapsed duplicates and passed)."""
|
|
540
|
+
out: Counter = Counter()
|
|
541
|
+
for h in H2_RE.findall(text):
|
|
542
|
+
m = H2_VERSION_RE.search(h)
|
|
543
|
+
if m:
|
|
544
|
+
out[m.group(1)] += 1
|
|
545
|
+
return out
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
def _check_zhtw_heading_parity(root: Path) -> list[str]:
|
|
549
|
+
"""Invariant 7: every version-bearing H2 in docs/<name>.md has a matching
|
|
550
|
+
version-bearing H2 in docs/<name>.zh-TW.md (same version), and vice versa.
|
|
551
|
+
|
|
552
|
+
Plain (no-version) headings may differ freely — translation asymmetry is
|
|
553
|
+
allowed; only version TAGS must stay in lockstep. Compares by version-token
|
|
554
|
+
MULTISET, so wording differences don't false-flag but a dropped/added/
|
|
555
|
+
drifted version tag (including one of a same-version pair) does."""
|
|
556
|
+
errors: list[str] = []
|
|
557
|
+
docs = root / "docs"
|
|
558
|
+
if not docs.is_dir():
|
|
559
|
+
return errors
|
|
560
|
+
for zh in sorted(docs.rglob("*.zh-TW.md")):
|
|
561
|
+
en = zh.with_name(zh.name.replace(".zh-TW.md", ".md"))
|
|
562
|
+
if not en.is_file():
|
|
563
|
+
errors.append(f"{zh}: no English sibling {en.name}")
|
|
564
|
+
continue
|
|
565
|
+
en_vers = _version_bearing_headings(en.read_text(encoding="utf-8"))
|
|
566
|
+
zh_vers = _version_bearing_headings(zh.read_text(encoding="utf-8"))
|
|
567
|
+
# Counter subtraction keeps only positive surpluses; doing it both ways
|
|
568
|
+
# surfaces under- and over-translation, and a 2-vs-1 same-version
|
|
569
|
+
# mismatch shows as a residual count of 1.
|
|
570
|
+
for v, n in sorted((en_vers - zh_vers).items()):
|
|
571
|
+
errors.append(
|
|
572
|
+
f"{zh.name}: missing {n} version-bearing heading(s) for v{v} "
|
|
573
|
+
f"present in {en.name}"
|
|
574
|
+
)
|
|
575
|
+
for v, n in sorted((zh_vers - en_vers).items()):
|
|
576
|
+
errors.append(
|
|
577
|
+
f"{zh.name}: has {n} heading(s) citing v{v} not present in "
|
|
578
|
+
f"{en.name} — version drift"
|
|
579
|
+
)
|
|
580
|
+
return errors
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
def _check_last_updated_freshness(
|
|
584
|
+
claude_md: Path,
|
|
585
|
+
claude_text: str,
|
|
586
|
+
changelog: Path,
|
|
587
|
+
latest_date: str | None,
|
|
588
|
+
) -> list[str]:
|
|
589
|
+
"""Invariant 10: the "Last Updated" date in .claude/CLAUDE.md lies within
|
|
590
|
+
±7 days of the latest CHANGELOG entry's date. The CHANGELOG date is the
|
|
591
|
+
baseline — never "today" — so the same commit checks identically whenever
|
|
592
|
+
the lint re-runs."""
|
|
593
|
+
m = LAST_UPDATED_RE.search(claude_text)
|
|
594
|
+
if m is None:
|
|
595
|
+
return [
|
|
596
|
+
f"{claude_md}: missing '- **Last Updated**: YYYY-MM-DD' line"
|
|
597
|
+
]
|
|
598
|
+
raw = m.group(1)
|
|
599
|
+
last_updated = _parse_iso_date(raw)
|
|
600
|
+
if last_updated is None:
|
|
601
|
+
return [
|
|
602
|
+
f"{claude_md}: Last Updated {raw!r} is not a valid YYYY-MM-DD date"
|
|
603
|
+
]
|
|
604
|
+
if latest_date is None:
|
|
605
|
+
return [
|
|
606
|
+
f"{changelog}: latest entry has no '- YYYY-MM-DD' date — cannot "
|
|
607
|
+
"check Last Updated freshness against it"
|
|
608
|
+
]
|
|
609
|
+
changelog_date = _parse_iso_date(latest_date)
|
|
610
|
+
if changelog_date is None:
|
|
611
|
+
return [
|
|
612
|
+
f"{changelog}: latest entry date {latest_date!r} is not a valid "
|
|
613
|
+
"YYYY-MM-DD date"
|
|
614
|
+
]
|
|
615
|
+
delta = abs((last_updated - changelog_date).days)
|
|
616
|
+
if delta > LAST_UPDATED_MAX_DAYS:
|
|
617
|
+
return [
|
|
618
|
+
f"{claude_md}: Last Updated {raw} is {delta} days from the "
|
|
619
|
+
f"CHANGELOG latest entry date {latest_date} (must be within "
|
|
620
|
+
f"±{LAST_UPDATED_MAX_DAYS} days)"
|
|
621
|
+
]
|
|
622
|
+
return []
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def _check_key_additions(
|
|
626
|
+
claude_md: Path, claude_text: str, suite_version: str
|
|
627
|
+
) -> list[str]:
|
|
628
|
+
"""Invariant 11: the newest version-tagged "Key Additions" H2 in
|
|
629
|
+
.claude/CLAUDE.md matches the suite version. Newest = max by version
|
|
630
|
+
tuple (the sections are not guaranteed document-ordered). Comparison is
|
|
631
|
+
at the heading's own precision, so `## v3.14 Key Additions` matches suite
|
|
632
|
+
3.14.0 while a stale `## v3.13 ...` as the maximum fails. Historical
|
|
633
|
+
headings below the newest are untouched."""
|
|
634
|
+
versions = KEY_ADDITIONS_RE.findall(claude_text)
|
|
635
|
+
if not versions:
|
|
636
|
+
return [
|
|
637
|
+
f"{claude_md}: no '## vX.Y… Key Additions' heading found — the "
|
|
638
|
+
"release's Key Additions section is missing"
|
|
639
|
+
]
|
|
640
|
+
newest = max(versions, key=_version_tuple)
|
|
641
|
+
newest_t = _version_tuple(newest)
|
|
642
|
+
if _version_tuple(suite_version)[: len(newest_t)] != newest_t:
|
|
643
|
+
return [
|
|
644
|
+
f"{claude_md}: newest Key Additions heading cites v{newest} but "
|
|
645
|
+
f"the suite version is {suite_version!r}"
|
|
646
|
+
]
|
|
647
|
+
return []
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
def _check_agent_count_claim(root: Path) -> list[str]:
|
|
651
|
+
"""Invariant 8 (#414): when plugin.json's description advertises an
|
|
652
|
+
agent count ("N-agent" or, since #753, "N prompt roles"), every such N
|
|
653
|
+
must equal the number of unique *_agent.md files in the tree. The
|
|
654
|
+
plugin-root agents/ mirror dir is excluded — its files are
|
|
655
|
+
byte-identical aliases of deep-research agents (real copies since #413,
|
|
656
|
+
symlinks before; check_agents_mirror_sync.py pins the byte-equality), so
|
|
657
|
+
counting them would double-count. resolve() additionally dedups any
|
|
658
|
+
remaining symlink alias. Missing/malformed manifest or a description
|
|
659
|
+
without a count claim is NOT an invariant-8 error — the manifest
|
|
660
|
+
problems are invariant 4's to report, and here the claim is optional
|
|
661
|
+
(only a stated number must be true; check_distribution_surface_claims
|
|
662
|
+
D4 is where the presence of a bindable count fails closed)."""
|
|
663
|
+
plugin_json = root / ".claude-plugin" / "plugin.json"
|
|
664
|
+
if not plugin_json.is_file():
|
|
665
|
+
return []
|
|
666
|
+
try:
|
|
667
|
+
data = json.loads(plugin_json.read_text(encoding="utf-8"))
|
|
668
|
+
except (json.JSONDecodeError, ValueError):
|
|
669
|
+
return []
|
|
670
|
+
description = data.get("description")
|
|
671
|
+
if not isinstance(description, str):
|
|
672
|
+
return []
|
|
673
|
+
claims = [int(m.group(1)) for m in AGENT_CLAIM_RE.finditer(description)]
|
|
674
|
+
if not claims:
|
|
675
|
+
return []
|
|
676
|
+
actual = len({
|
|
677
|
+
p.resolve()
|
|
678
|
+
for p in root.rglob("*_agent.md")
|
|
679
|
+
if ".git" not in p.parts
|
|
680
|
+
and p.relative_to(root).parts[0] != "agents" # plugin-root mirror = aliases (#413)
|
|
681
|
+
})
|
|
682
|
+
return [
|
|
683
|
+
f"{plugin_json}: description claims an agent count of {claimed} "
|
|
684
|
+
f"but the tree has {actual} unique *_agent.md files (agents/ "
|
|
685
|
+
f"mirror aliases excluded, symlinks deduplicated)"
|
|
686
|
+
for claimed in claims
|
|
687
|
+
if claimed != actual
|
|
688
|
+
]
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
def _check_citation_surfaces(
|
|
692
|
+
root: Path, suite_version: str, latest_date: str | None
|
|
693
|
+
) -> list[str]:
|
|
694
|
+
"""Invariant 12: citation surfaces track the release (#754: both surfaces
|
|
695
|
+
had silently drifted six minor releases behind — the file was added
|
|
696
|
+
2026-06-15, after this lint existed, and never entered its coverage).
|
|
697
|
+
|
|
698
|
+
CITATION.cff is outward-facing release metadata like README.md, so its
|
|
699
|
+
ABSENCE is an error — a deleted/renamed file must not silently disable
|
|
700
|
+
the invariant (the invariant-4 marketplace-manifest lesson). It is YAML
|
|
701
|
+
and is parsed as YAML: a regex scrape would misread legitimate spellings
|
|
702
|
+
(`version: "3.20.1"`, trailing comments) as drift. `date-released` is
|
|
703
|
+
required — an absent/null field errors rather than silently disabling
|
|
704
|
+
the freshness half — and is compared against the latest CHANGELOG
|
|
705
|
+
entry's date with the invariant-10 ±LAST_UPDATED_MAX_DAYS window
|
|
706
|
+
(window skipped only when the CHANGELOG date is unavailable — that
|
|
707
|
+
already errored upstream).
|
|
708
|
+
|
|
709
|
+
POSITIONING.md is repo-specific prose: absence or a token-free file is a
|
|
710
|
+
skip (the token is the claim; no claim, no drift), but a present token
|
|
711
|
+
must be canonical and equal to the suite version.
|
|
712
|
+
|
|
713
|
+
Known limitation (accepted, 2026-08-17 threat-model adjudication):
|
|
714
|
+
duplicate YAML keys resolve last-wins, the same semantics every CFF
|
|
715
|
+
consumer applies (GitHub's cite widget, Zenodo, cffconvert), so a
|
|
716
|
+
duplicate-key file renders the identical citation everywhere —
|
|
717
|
+
untidiness, not drift. Guarding it would require a custom
|
|
718
|
+
duplicate-rejecting loader whose complexity the harm does not pay for."""
|
|
719
|
+
errors: list[str] = []
|
|
720
|
+
cff = root / "CITATION.cff"
|
|
721
|
+
if not cff.is_file():
|
|
722
|
+
errors.append(f"{cff}: not found")
|
|
723
|
+
else:
|
|
724
|
+
try:
|
|
725
|
+
data = yaml.safe_load(cff.read_text(encoding="utf-8"))
|
|
726
|
+
except (yaml.YAMLError, ValueError):
|
|
727
|
+
# ValueError: PyYAML's timestamp constructor raises it (not
|
|
728
|
+
# YAMLError) on impossible dates like 2026-02-30 (codex P2) —
|
|
729
|
+
# a lint reports drift, never crashes.
|
|
730
|
+
data = None
|
|
731
|
+
if not isinstance(data, dict):
|
|
732
|
+
errors.append(f"{cff}: not parseable as a YAML mapping")
|
|
733
|
+
else:
|
|
734
|
+
raw = data.get("version")
|
|
735
|
+
if raw is None:
|
|
736
|
+
errors.append(f"{cff}: no 'version' key found")
|
|
737
|
+
else:
|
|
738
|
+
token = str(raw)
|
|
739
|
+
if not _is_strict_semver(token):
|
|
740
|
+
errors.append(
|
|
741
|
+
f"{cff}: version token {token!r} is not a canonical "
|
|
742
|
+
"N.N.N or N.N.N.N version"
|
|
743
|
+
)
|
|
744
|
+
elif token != suite_version:
|
|
745
|
+
errors.append(
|
|
746
|
+
f"{cff}: version {token!r} does not match suite "
|
|
747
|
+
f"version {suite_version!r}"
|
|
748
|
+
)
|
|
749
|
+
released = data.get("date-released")
|
|
750
|
+
if released is None:
|
|
751
|
+
# Absent or null must error, not skip — deleting the field
|
|
752
|
+
# would otherwise disable the freshness half of the invariant
|
|
753
|
+
# (codex round-2 P2; same posture as file absence).
|
|
754
|
+
errors.append(f"{cff}: no 'date-released' key found")
|
|
755
|
+
elif latest_date is not None:
|
|
756
|
+
base = _parse_iso_date(latest_date)
|
|
757
|
+
if isinstance(released, datetime):
|
|
758
|
+
# CFF requires a bare YYYY-MM-DD. An unquoted timestamp
|
|
759
|
+
# parses as datetime — a date SUBCLASS that would
|
|
760
|
+
# TypeError against the date baseline below (codex P2) —
|
|
761
|
+
# so it routes to the not-strict error, never a crash.
|
|
762
|
+
rel = None
|
|
763
|
+
elif isinstance(released, date):
|
|
764
|
+
rel = released
|
|
765
|
+
else:
|
|
766
|
+
rel = _parse_iso_date(str(released))
|
|
767
|
+
if rel is None:
|
|
768
|
+
errors.append(
|
|
769
|
+
f"{cff}: date-released {str(released)!r} is not a "
|
|
770
|
+
"strict YYYY-MM-DD date"
|
|
771
|
+
)
|
|
772
|
+
elif (
|
|
773
|
+
base is not None
|
|
774
|
+
and abs((rel - base).days) > LAST_UPDATED_MAX_DAYS
|
|
775
|
+
):
|
|
776
|
+
errors.append(
|
|
777
|
+
f"{cff}: date-released {rel.isoformat()} is more than "
|
|
778
|
+
f"{LAST_UPDATED_MAX_DAYS} days from the latest "
|
|
779
|
+
f"CHANGELOG entry date {latest_date} (stale release "
|
|
780
|
+
"metadata)"
|
|
781
|
+
)
|
|
782
|
+
positioning = root / "POSITIONING.md"
|
|
783
|
+
if positioning.is_file():
|
|
784
|
+
for raw_token in POSITIONING_VERSION_RE.findall(
|
|
785
|
+
positioning.read_text(encoding="utf-8")
|
|
786
|
+
):
|
|
787
|
+
token = raw_token.strip()
|
|
788
|
+
if not _is_strict_semver(token):
|
|
789
|
+
errors.append(
|
|
790
|
+
f"{positioning}: citation prose token {token!r} is not a "
|
|
791
|
+
"canonical N.N.N or N.N.N.N version"
|
|
792
|
+
)
|
|
793
|
+
elif token != suite_version:
|
|
794
|
+
errors.append(
|
|
795
|
+
f"{positioning}: citation prose cites Version {token} but "
|
|
796
|
+
f"suite version is {suite_version!r}"
|
|
797
|
+
)
|
|
798
|
+
return errors
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
def main() -> int:
|
|
802
|
+
parser = argparse.ArgumentParser()
|
|
803
|
+
parser.add_argument(
|
|
804
|
+
"--path",
|
|
805
|
+
type=Path,
|
|
806
|
+
default=Path(__file__).resolve().parent.parent,
|
|
807
|
+
)
|
|
808
|
+
parser.add_argument(
|
|
809
|
+
"--tag",
|
|
810
|
+
help="git tag ref (e.g. v3.14.0, leading 'v' optional); must equal "
|
|
811
|
+
"the suite version — used by the tag-version-match workflow",
|
|
812
|
+
)
|
|
813
|
+
args = parser.parse_args()
|
|
814
|
+
|
|
815
|
+
errors = check(args.path, tag=args.tag)
|
|
816
|
+
if errors:
|
|
817
|
+
print("Version consistency check failed:")
|
|
818
|
+
for err in errors:
|
|
819
|
+
print(f"- {err}")
|
|
820
|
+
return 1
|
|
821
|
+
print("Version consistency check passed.")
|
|
822
|
+
return 0
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
if __name__ == "__main__":
|
|
826
|
+
sys.exit(main())
|