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,835 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Tests for check_tools_allowlist.py (#524).
|
|
3
|
+
|
|
4
|
+
Mutation discipline: every invariant branch has a passing case (green fixture
|
|
5
|
+
tree + the real repo tree) and a failing case proving the check fires when
|
|
6
|
+
the guarded property is broken. Two load-bearing families:
|
|
7
|
+
|
|
8
|
+
* The SYMMETRIC source+mirror edit re-adding Bash — it passes
|
|
9
|
+
check_agents_mirror_sync.py (byte-equal pair) and the name-keyed runtime
|
|
10
|
+
guard lint, so before #524 it sailed through CI green (the drift the
|
|
11
|
+
issue documents).
|
|
12
|
+
* YAML-form bypasses of the semantic checks — quoted/flow/block/escaped
|
|
13
|
+
spellings that a raw line scan cannot see. These were found by the codex
|
|
14
|
+
xhigh review; the node-tree parse closes them and each has a witness
|
|
15
|
+
here.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import json
|
|
20
|
+
import sys
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
from check_tools_allowlist import (
|
|
24
|
+
ALLOWLISTED_FILES,
|
|
25
|
+
CANONICAL_TOOLS,
|
|
26
|
+
MANIFEST,
|
|
27
|
+
PINNED_TOOLS_LINE,
|
|
28
|
+
REPO_ROOT,
|
|
29
|
+
check,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def make_tree(tmp_path: Path) -> Path:
|
|
34
|
+
"""A green fixture tree: six allowlisted files carrying the pinned line,
|
|
35
|
+
a minimal Bucket A manifest, a fenced no-tools agent, and an unfenced
|
|
36
|
+
Bash-holding agent."""
|
|
37
|
+
for rel in ALLOWLISTED_FILES:
|
|
38
|
+
p = tmp_path / rel
|
|
39
|
+
p.parent.mkdir(parents=True, exist_ok=True)
|
|
40
|
+
p.write_text(
|
|
41
|
+
f"---\nname: {p.stem}\ndescription: \"x\"\nmodel: inherit\n"
|
|
42
|
+
f"{PINNED_TOOLS_LINE}\n---\n\nbody\n",
|
|
43
|
+
encoding="utf-8",
|
|
44
|
+
)
|
|
45
|
+
manifest = tmp_path / MANIFEST
|
|
46
|
+
manifest.parent.mkdir(parents=True, exist_ok=True)
|
|
47
|
+
manifest.write_text(json.dumps({"agents": {
|
|
48
|
+
"report_compiler_agent": {},
|
|
49
|
+
"research_architect_agent": {},
|
|
50
|
+
"synthesis_agent": {},
|
|
51
|
+
"eic_agent": {},
|
|
52
|
+
}}), encoding="utf-8")
|
|
53
|
+
# A Bucket A agent with NO tools key (inherit) — must pass untouched.
|
|
54
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
55
|
+
eic.parent.mkdir(parents=True, exist_ok=True)
|
|
56
|
+
eic.write_text("---\nname: eic_agent\n---\n\nbody\n", encoding="utf-8")
|
|
57
|
+
# A NON-Bucket-A agent advertising Bash — allowed (invariant 2 is
|
|
58
|
+
# scoped to fenced agents; the orchestrator legitimately holds shell).
|
|
59
|
+
orch = tmp_path / "academic-pipeline/agents/pipeline_orchestrator_agent.md"
|
|
60
|
+
orch.parent.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
orch.write_text(
|
|
62
|
+
"---\nname: pipeline_orchestrator_agent\ntools: Read, Bash\n---\n\nbody\n",
|
|
63
|
+
encoding="utf-8",
|
|
64
|
+
)
|
|
65
|
+
return tmp_path
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def first_pair() -> tuple[str, str]:
|
|
69
|
+
"""One (source, mirror) pair for symmetric-edit mutations."""
|
|
70
|
+
return ("deep-research/agents/research_architect_agent.md",
|
|
71
|
+
"agents/research_architect_agent.md")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def rewrite_tools_line(path: Path, new_line: str) -> None:
|
|
75
|
+
text = path.read_text(encoding="utf-8")
|
|
76
|
+
path.write_text(text.replace(PINNED_TOOLS_LINE, new_line),
|
|
77
|
+
encoding="utf-8")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def errs_for(tmp_path: Path, rel: str) -> list[str]:
|
|
81
|
+
return [e for e in check(tmp_path) if rel in e]
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# --- invariant 0: the real tree is green --------------------------------------
|
|
85
|
+
|
|
86
|
+
def test_real_repo_passes():
|
|
87
|
+
assert check(REPO_ROOT) == []
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# --- green fixture -------------------------------------------------------------
|
|
91
|
+
|
|
92
|
+
def test_green_tree_passes(tmp_path):
|
|
93
|
+
make_tree(tmp_path)
|
|
94
|
+
assert check(tmp_path) == []
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# --- invariant 1: exact value + semantic parse ---------------------------------
|
|
98
|
+
|
|
99
|
+
def test_symmetric_bash_readd_fails_on_both_files(tmp_path):
|
|
100
|
+
# THE #524 drift scenario: source+mirror edited together to re-add Bash.
|
|
101
|
+
# Mirror-sync stays green (byte-equal pair); this lint must fire on BOTH,
|
|
102
|
+
# via the semantic value check AND the byte-exact witness.
|
|
103
|
+
make_tree(tmp_path)
|
|
104
|
+
src, mirror = first_pair()
|
|
105
|
+
for rel in (src, mirror):
|
|
106
|
+
rewrite_tools_line(tmp_path / rel, PINNED_TOOLS_LINE + ", Bash")
|
|
107
|
+
assert any("diverges from the canonical" in e for e in errs_for(tmp_path, src))
|
|
108
|
+
assert any("diverges from the canonical" in e for e in errs_for(tmp_path, mirror))
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_dropped_tool_fails(tmp_path):
|
|
112
|
+
make_tree(tmp_path)
|
|
113
|
+
src, _ = first_pair()
|
|
114
|
+
rewrite_tools_line(tmp_path / src, "tools: Read, Write, Edit, Glob")
|
|
115
|
+
assert any("diverges from the canonical" in e for e in errs_for(tmp_path, src))
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def test_typoed_tool_name_fails(tmp_path):
|
|
119
|
+
make_tree(tmp_path)
|
|
120
|
+
src, _ = first_pair()
|
|
121
|
+
rewrite_tools_line(tmp_path / src, "tools: Read, Write, Edit, Gerp, Glob")
|
|
122
|
+
assert any("diverges from the canonical" in e for e in errs_for(tmp_path, src))
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_trailing_whitespace_is_byte_drift(tmp_path):
|
|
126
|
+
# A trailing space keeps the semantic value intact but breaks the
|
|
127
|
+
# byte-exact witness — the exact-form pin must still fire.
|
|
128
|
+
make_tree(tmp_path)
|
|
129
|
+
src, _ = first_pair()
|
|
130
|
+
rewrite_tools_line(tmp_path / src, PINNED_TOOLS_LINE + " ")
|
|
131
|
+
assert any("not byte-equal" in e for e in errs_for(tmp_path, src))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def test_crlf_conversion_is_byte_drift(tmp_path):
|
|
135
|
+
# A symmetric LF->CRLF conversion leaves YAML semantics intact, so only
|
|
136
|
+
# the CR-sensitive byte witness catches it (codex round-1 P2).
|
|
137
|
+
make_tree(tmp_path)
|
|
138
|
+
src, mirror = first_pair()
|
|
139
|
+
for rel in (src, mirror):
|
|
140
|
+
p = tmp_path / rel
|
|
141
|
+
p.write_bytes(p.read_bytes().replace(b"\n", b"\r\n"))
|
|
142
|
+
assert any("not byte-equal" in e for e in errs_for(tmp_path, src))
|
|
143
|
+
assert any("not byte-equal" in e for e in errs_for(tmp_path, mirror))
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def test_missing_tools_key_fails_as_widening(tmp_path):
|
|
147
|
+
# Dropping the key silently widens capability (agent inherits ALL tools).
|
|
148
|
+
make_tree(tmp_path)
|
|
149
|
+
src, _ = first_pair()
|
|
150
|
+
p = tmp_path / src
|
|
151
|
+
p.write_text(p.read_text(encoding="utf-8").replace(
|
|
152
|
+
PINNED_TOOLS_LINE + "\n", ""), encoding="utf-8")
|
|
153
|
+
assert any("no `tools:` key" in e for e in errs_for(tmp_path, src))
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def test_escaped_duplicate_key_fails(tmp_path):
|
|
157
|
+
# The sharpest round-2 bypass: keep the pinned bare line AND add a
|
|
158
|
+
# `s`-escaped `"tools":` duplicate. safe_load collapses the two
|
|
159
|
+
# to the last-wins canonical value; the duplicate-preserving node tree
|
|
160
|
+
# sees TWO `tools` keys and fires.
|
|
161
|
+
make_tree(tmp_path)
|
|
162
|
+
src, _ = first_pair()
|
|
163
|
+
rewrite_tools_line(
|
|
164
|
+
tmp_path / src,
|
|
165
|
+
'"tool\\u0073": Read, Write, Edit, Grep, Glob, Bash\n'
|
|
166
|
+
+ PINNED_TOOLS_LINE,
|
|
167
|
+
)
|
|
168
|
+
assert any("2 `tools` keys" in e for e in errs_for(tmp_path, src))
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def test_quoted_duplicate_key_fails(tmp_path):
|
|
172
|
+
make_tree(tmp_path)
|
|
173
|
+
src, _ = first_pair()
|
|
174
|
+
rewrite_tools_line(tmp_path / src,
|
|
175
|
+
f'{PINNED_TOOLS_LINE}\n"tools": Read, Bash')
|
|
176
|
+
assert any("2 `tools` keys" in e for e in errs_for(tmp_path, src))
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def test_missing_allowlisted_file_fails(tmp_path):
|
|
180
|
+
make_tree(tmp_path)
|
|
181
|
+
src, _ = first_pair()
|
|
182
|
+
(tmp_path / src).unlink()
|
|
183
|
+
assert any("missing" in e for e in errs_for(tmp_path, src))
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def test_no_frontmatter_fails(tmp_path):
|
|
187
|
+
make_tree(tmp_path)
|
|
188
|
+
src, _ = first_pair()
|
|
189
|
+
(tmp_path / src).write_text("body only\n", encoding="utf-8")
|
|
190
|
+
assert any("no YAML frontmatter" in e for e in errs_for(tmp_path, src))
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_uncomposable_frontmatter_fails_closed(tmp_path):
|
|
194
|
+
make_tree(tmp_path)
|
|
195
|
+
src, _ = first_pair()
|
|
196
|
+
p = tmp_path / src
|
|
197
|
+
p.write_text(p.read_text(encoding="utf-8").replace(
|
|
198
|
+
PINNED_TOOLS_LINE, "tools: [unclosed"), encoding="utf-8")
|
|
199
|
+
assert any("does not compose" in e for e in errs_for(tmp_path, src))
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def test_body_tools_line_does_not_satisfy_pin(tmp_path):
|
|
203
|
+
# The pinned line must live in FRONTMATTER; a body mention is not a grant.
|
|
204
|
+
make_tree(tmp_path)
|
|
205
|
+
src, _ = first_pair()
|
|
206
|
+
p = tmp_path / src
|
|
207
|
+
p.write_text(p.read_text(encoding="utf-8").replace(
|
|
208
|
+
PINNED_TOOLS_LINE + "\n", "") + f"\n{PINNED_TOOLS_LINE}\n",
|
|
209
|
+
encoding="utf-8")
|
|
210
|
+
assert any("no `tools:` key" in e for e in errs_for(tmp_path, src))
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
# --- invariant 2: Bucket A frontmatter must not declare Bash --------------------
|
|
214
|
+
|
|
215
|
+
def bash_fixture(tmp_path, frontmatter_body: str) -> list[str]:
|
|
216
|
+
"""Write a Bucket A agent with the given frontmatter body and return the
|
|
217
|
+
errors mentioning it."""
|
|
218
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
219
|
+
eic.write_text(f"---\n{frontmatter_body}\n---\n\nbody\n",
|
|
220
|
+
encoding="utf-8")
|
|
221
|
+
return [e for e in check(tmp_path) if "eic_agent" in e]
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def test_bucket_a_agent_advertising_bash_fails(tmp_path):
|
|
225
|
+
make_tree(tmp_path)
|
|
226
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
227
|
+
assert any("declares Bash" in e for e in errs)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def test_quoted_string_value_bash_fails(tmp_path):
|
|
231
|
+
make_tree(tmp_path)
|
|
232
|
+
errs = bash_fixture(tmp_path, 'name: eic_agent\ntools: "Read, Bash"')
|
|
233
|
+
assert any("declares Bash" in e for e in errs)
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def test_quoted_name_with_bash_fails(tmp_path):
|
|
237
|
+
make_tree(tmp_path)
|
|
238
|
+
errs = bash_fixture(tmp_path, 'name: "eic_agent"\ntools: Read, Bash')
|
|
239
|
+
assert any("declares Bash" in e for e in errs)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def test_flow_list_bash_fails(tmp_path):
|
|
243
|
+
make_tree(tmp_path)
|
|
244
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: [Read, Bash]")
|
|
245
|
+
assert any("declares Bash" in e for e in errs)
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def test_block_list_bash_fails(tmp_path):
|
|
249
|
+
make_tree(tmp_path)
|
|
250
|
+
errs = bash_fixture(tmp_path,
|
|
251
|
+
"name: eic_agent\ntools:\n - Read\n - Bash")
|
|
252
|
+
assert any("declares Bash" in e for e in errs)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
def test_inline_comment_bash_fails(tmp_path):
|
|
256
|
+
make_tree(tmp_path)
|
|
257
|
+
errs = bash_fixture(tmp_path,
|
|
258
|
+
"name: eic_agent\ntools: Read, Bash # reviewed")
|
|
259
|
+
assert any("declares Bash" in e for e in errs)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def test_permission_specifier_bash_fails(tmp_path):
|
|
263
|
+
make_tree(tmp_path)
|
|
264
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash(git:*)")
|
|
265
|
+
assert any("declares Bash" in e for e in errs)
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def test_bashoutput_is_a_different_tool_and_passes(tmp_path):
|
|
269
|
+
# Exact base-name match: BashOutput grants no shell; a prefix match
|
|
270
|
+
# would false-fire on it.
|
|
271
|
+
make_tree(tmp_path)
|
|
272
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, BashOutput")
|
|
273
|
+
assert errs == []
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def test_lowercase_bash_is_a_different_tool_and_passes(tmp_path):
|
|
277
|
+
# Tool names are exact: `bash` (lowercase) is not the shell-granting
|
|
278
|
+
# `Bash` tool. Case-folding would false-fire on a legitimate value.
|
|
279
|
+
make_tree(tmp_path)
|
|
280
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, bash")
|
|
281
|
+
assert errs == []
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def test_bom_padded_bash_fails(tmp_path):
|
|
285
|
+
# #524 r9: a BOM (U+FEFF) is NOT stripped by str.strip(), so `Bash`
|
|
286
|
+
# would survive as a token != `Bash` and slip the membership test.
|
|
287
|
+
# _fold drops Cf format chars so it collapses back to Bash.
|
|
288
|
+
make_tree(tmp_path)
|
|
289
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
290
|
+
assert any("declares Bash" in e for e in errs)
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def test_zero_width_space_padded_bash_fails(tmp_path):
|
|
294
|
+
# #524 r9: zero-width space (U+200B) — a Cf format char str.strip() leaves.
|
|
295
|
+
make_tree(tmp_path)
|
|
296
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
297
|
+
assert any("declares Bash" in e for e in errs)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def test_zero_width_non_joiner_padded_bash_fails(tmp_path):
|
|
301
|
+
# #524 r9: zero-width non-joiner (U+200C) — another Cf format char.
|
|
302
|
+
make_tree(tmp_path)
|
|
303
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
304
|
+
assert any("declares Bash" in e for e in errs)
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def test_fullwidth_bash_fails(tmp_path):
|
|
308
|
+
# #524 r9: fullwidth "Bash" (U+FF22 etc.) is a compatibility homoglyph;
|
|
309
|
+
# NFKC in _fold folds it onto ASCII "Bash".
|
|
310
|
+
make_tree(tmp_path)
|
|
311
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
312
|
+
assert any("declares Bash" in e for e in errs)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def test_fullwidth_paren_permission_specifier_bash_fails(tmp_path):
|
|
316
|
+
# #524 r10: fullwidth parens U+FF08/U+FF09 in a permission specifier. The
|
|
317
|
+
# ASCII "(" split misses them, so folding must happen BEFORE the split —
|
|
318
|
+
# otherwise NFKC leaves the whole "Bash(git:*)" as one token != "Bash".
|
|
319
|
+
make_tree(tmp_path)
|
|
320
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash(git:*)")
|
|
321
|
+
assert any("declares Bash" in e for e in errs)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def test_fullwidth_bash_and_paren_specifier_fails(tmp_path):
|
|
325
|
+
# #524 r10: both the tool name AND its parens fullwidth — the whole thing
|
|
326
|
+
# must fold to ASCII "Bash" and be caught.
|
|
327
|
+
make_tree(tmp_path)
|
|
328
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash(git:*)")
|
|
329
|
+
assert any("declares Bash" in e for e in errs)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def test_fullwidth_comma_separated_bash_fails(tmp_path):
|
|
333
|
+
# #524 r11: fullwidth comma U+FF0C. split(",") misses it, so "Read,Bash"
|
|
334
|
+
# stays one token — folding must happen on the WHOLE value BEFORE the comma
|
|
335
|
+
# split (the r11 corollary of r10), or "Read,Bash" folds to "Read,Bash"
|
|
336
|
+
# (one token != "Bash") and slips.
|
|
337
|
+
make_tree(tmp_path)
|
|
338
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read,Bash")
|
|
339
|
+
assert any("declares Bash" in e for e in errs)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def test_small_comma_separated_bash_fails(tmp_path):
|
|
343
|
+
# #524 r11: small comma U+FE50 — another compatibility comma NFKC folds to
|
|
344
|
+
# ASCII "," only if the fold precedes the split.
|
|
345
|
+
make_tree(tmp_path)
|
|
346
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read﹐Bash")
|
|
347
|
+
assert any("declares Bash" in e for e in errs)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def test_fullwidth_comma_and_name_and_paren_bash_fails(tmp_path):
|
|
351
|
+
# #524 r11: fullwidth comma + fullwidth name + fullwidth parens all at once
|
|
352
|
+
# — the whole-value fold must reduce it to Read + Bash.
|
|
353
|
+
make_tree(tmp_path)
|
|
354
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read,Bash(git:*)")
|
|
355
|
+
assert any("declares Bash" in e for e in errs)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def test_nfkc_stable_alt_separator_is_not_a_bash_grant(tmp_path):
|
|
359
|
+
# #524 r12 (convergence boundary, documented as a NON-bug): an alternate
|
|
360
|
+
# separator that NFKC does NOT fold to ASCII "," — e.g. an ideographic comma
|
|
361
|
+
# U+3001, an Arabic comma U+060C, or a semicolon — keeps "Read、Bash" as ONE
|
|
362
|
+
# token for EVERYONE: the string is a single YAML scalar, this lint splits
|
|
363
|
+
# only on ASCII "," (and any NFKC-normalizing consumer would too), so no
|
|
364
|
+
# consumer extracts a bare "Bash" from it and no shell is granted. The
|
|
365
|
+
# fullwidth comma/paren cases fail (above) precisely because NFKC DOES fold
|
|
366
|
+
# them into the ASCII separators the split honors; these do not. Not
|
|
367
|
+
# flagging this is correct — flagging it would be a false positive a future
|
|
368
|
+
# maintainer might "fix" by over-broadening the separator set.
|
|
369
|
+
make_tree(tmp_path)
|
|
370
|
+
assert bash_fixture(tmp_path, "name: eic_agent\ntools: Read、Bash") == []
|
|
371
|
+
assert bash_fixture(tmp_path, "name: eic_agent\ntools: Read؍Bash") == []
|
|
372
|
+
assert bash_fixture(tmp_path, "name: eic_agent\ntools: Read;Bash") == []
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
def test_bom_canonical_allowlist_value_still_fires_byte_witness(tmp_path):
|
|
376
|
+
# #524 r9 companion: folding the SEMANTIC check must not weaken invariant 1.
|
|
377
|
+
# A plugin agent whose tools value is BOM-padded canonical now folds to the
|
|
378
|
+
# five canonical tools semantically — but the additive byte-witness must
|
|
379
|
+
# STILL fire (the raw line is not byte-equal to PINNED_TOOLS_LINE).
|
|
380
|
+
make_tree(tmp_path)
|
|
381
|
+
target = tmp_path / sorted(ALLOWLISTED_FILES)[0]
|
|
382
|
+
target.write_text(
|
|
383
|
+
"---\nname: report_compiler_agent\n"
|
|
384
|
+
"tools: Read, Write, Edit, Grep, Glob\n---\n\nbody\n",
|
|
385
|
+
encoding="utf-8")
|
|
386
|
+
errs = [e for e in check(tmp_path) if "byte-equal" in e]
|
|
387
|
+
assert errs, "byte-witness must still fire on an invisible-char canonical value"
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
def test_repeated_identical_scalars_are_not_aliases(tmp_path):
|
|
391
|
+
# False-positive guard for the alias-by-shared-identity detector:
|
|
392
|
+
# `yaml.compose` does NOT intern identical scalar values (each gets a
|
|
393
|
+
# distinct node), so a clean file repeating a value must still pass.
|
|
394
|
+
make_tree(tmp_path)
|
|
395
|
+
errs = bash_fixture(
|
|
396
|
+
tmp_path,
|
|
397
|
+
"name: eic_agent\ntools: Read, Read, Grep\ndescription: Read Read")
|
|
398
|
+
assert errs == []
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def test_non_string_manifest_agent_key_still_reconciles(tmp_path):
|
|
402
|
+
# A manifest whose `agents` mapping carries a non-string key alongside
|
|
403
|
+
# the real ones must not break reconciliation of the real Bucket A agent.
|
|
404
|
+
make_tree(tmp_path)
|
|
405
|
+
(tmp_path / MANIFEST).write_text(
|
|
406
|
+
'{"agents": {"123": {}, "report_compiler_agent": {}, '
|
|
407
|
+
'"research_architect_agent": {}, "synthesis_agent": {}, '
|
|
408
|
+
'"eic_agent": {}}}', encoding="utf-8")
|
|
409
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Read, Bash")
|
|
410
|
+
assert any("declares Bash" in e for e in errs)
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
def test_nested_list_member_fails_closed(tmp_path):
|
|
414
|
+
# A non-scalar list member is an unrecognized shape — must not be
|
|
415
|
+
# silently stringified into a passing value (codex round-2 P2).
|
|
416
|
+
make_tree(tmp_path)
|
|
417
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: [Read, [Bash]]")
|
|
418
|
+
assert any("unrecognized shape" in e for e in errs)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
def test_mapping_list_member_fails_closed(tmp_path):
|
|
422
|
+
make_tree(tmp_path)
|
|
423
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: [Read, {Bash: 1}]")
|
|
424
|
+
assert any("unrecognized shape" in e for e in errs)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def test_mapping_tools_value_fails_closed(tmp_path):
|
|
428
|
+
make_tree(tmp_path)
|
|
429
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: {Read: yes}")
|
|
430
|
+
assert any("unrecognized shape" in e for e in errs)
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
def test_typed_scalar_tools_on_bucket_a_fails_closed(tmp_path):
|
|
434
|
+
# A Bucket A `tools` that is an int/bool/null/timestamp scalar is an
|
|
435
|
+
# unrecognized shape — the reconciliation cannot confirm it excludes
|
|
436
|
+
# Bash, so it fails closed (scoped to Bucket A; out-of-scope agents with
|
|
437
|
+
# a nonsense tools value are not this lint's concern).
|
|
438
|
+
make_tree(tmp_path)
|
|
439
|
+
for val in ("5", "true", "null", "2020-01-01"):
|
|
440
|
+
errs = bash_fixture(tmp_path, f"name: eic_agent\ntools: {val}")
|
|
441
|
+
assert any("unrecognized shape" in e for e in errs), val
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def test_bare_bash_scalar_fails_closed(tmp_path):
|
|
445
|
+
# Bash as the whole scalar value (not a list member) still resolves to
|
|
446
|
+
# the `Bash` base name.
|
|
447
|
+
make_tree(tmp_path)
|
|
448
|
+
errs = bash_fixture(tmp_path, "name: eic_agent\ntools: Bash")
|
|
449
|
+
assert any("declares Bash" in e for e in errs)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
def test_merge_nested_in_sequence_fails_closed(tmp_path):
|
|
453
|
+
# The merge/alias walk must recurse into sequence values, not only
|
|
454
|
+
# mapping values — a `<<`/alias buried in a list still fails closed.
|
|
455
|
+
make_tree(tmp_path)
|
|
456
|
+
errs = bash_fixture(
|
|
457
|
+
tmp_path,
|
|
458
|
+
"name: eic_agent\n_a: &a {tools: [Read, Bash]}\nx: [<<, *a]")
|
|
459
|
+
assert any("merge key / alias" in e for e in errs)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def test_merge_tagged_complex_key_fails_closed(tmp_path):
|
|
463
|
+
# codex round-5 P1: the merge tag can land on a non-scalar KEY
|
|
464
|
+
# (`? !!merge [x]` is a merge-tagged sequence key). safe_load applies
|
|
465
|
+
# merge semantics and injects `tools: [Read, Bash]`; the tag check must
|
|
466
|
+
# fire on any node type, not just scalars.
|
|
467
|
+
make_tree(tmp_path)
|
|
468
|
+
for key in ("!!merge [x]", "!!merge {a: 1}"):
|
|
469
|
+
errs = bash_fixture(
|
|
470
|
+
tmp_path,
|
|
471
|
+
f"name: eic_agent\n? {key}\n: {{tools: [Read, Bash]}}")
|
|
472
|
+
assert any("merge key / alias" in e for e in errs), key
|
|
473
|
+
|
|
474
|
+
|
|
475
|
+
def test_deeply_nested_frontmatter_does_not_crash(tmp_path):
|
|
476
|
+
# codex round-5 P2: a pathologically deep flow sequence must never crash
|
|
477
|
+
# the lint with an unhandled traceback — check() must RETURN. Whether a
|
|
478
|
+
# given depth trips RecursionError is Python-version-dependent (3.14
|
|
479
|
+
# tolerates far deeper nesting than 3.11), so the version-independent
|
|
480
|
+
# contract is "returns, does not raise", not "fails at depth N". A
|
|
481
|
+
# depth that does NOT recurse past the limit is a harmless (if odd) file
|
|
482
|
+
# and legitimately passes; the fail-closed path is exercised
|
|
483
|
+
# deterministically by test_recursion_error_fails_closed below.
|
|
484
|
+
make_tree(tmp_path)
|
|
485
|
+
deep = "name: eic_agent\ntools: Read, Grep\nx: " + "[" * 400 + "]" * 400
|
|
486
|
+
errs = bash_fixture(tmp_path, deep) # must not raise
|
|
487
|
+
assert isinstance(errs, list)
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def test_compose_recursion_error_maps_to_none():
|
|
491
|
+
# _mapping_node must turn a RecursionError from yaml.compose into None
|
|
492
|
+
# (→ the caller emits a fail-closed "does not compose" error), not let it
|
|
493
|
+
# escape. Driven by monkeypatching compose to raise, so it is
|
|
494
|
+
# deterministic and Python-version-independent (unlike relying on a
|
|
495
|
+
# specific nesting depth tripping the interpreter's own limit).
|
|
496
|
+
import check_tools_allowlist as m
|
|
497
|
+
|
|
498
|
+
def boom(*a, **k):
|
|
499
|
+
raise RecursionError("maximum recursion depth exceeded")
|
|
500
|
+
|
|
501
|
+
orig = m.yaml.compose
|
|
502
|
+
m.yaml.compose = boom
|
|
503
|
+
try:
|
|
504
|
+
assert m._mapping_node("name: x\n") is None
|
|
505
|
+
finally:
|
|
506
|
+
m.yaml.compose = orig
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
def test_walk_recursion_error_fails_closed():
|
|
510
|
+
# _uses_merge_or_alias must treat a RecursionError in the walk as True
|
|
511
|
+
# (fail closed — the tree could not be proven clean). Forced
|
|
512
|
+
# deterministically: a MappingNode whose `.value` is an iterable that
|
|
513
|
+
# raises RecursionError on iteration (standing in for a walk that
|
|
514
|
+
# recurses past the interpreter limit), so the test does not depend on
|
|
515
|
+
# any Python-version recursion depth.
|
|
516
|
+
import check_tools_allowlist as m
|
|
517
|
+
import yaml as y
|
|
518
|
+
|
|
519
|
+
class ExplodingValue:
|
|
520
|
+
def __iter__(self):
|
|
521
|
+
raise RecursionError("maximum recursion depth exceeded")
|
|
522
|
+
|
|
523
|
+
node = y.MappingNode("tag:yaml.org,2002:map", [])
|
|
524
|
+
node.value = ExplodingValue()
|
|
525
|
+
assert m._uses_merge_or_alias(node) is True
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
def test_uncomposable_bucket_a_frontmatter_fails_closed(tmp_path):
|
|
529
|
+
# Frontmatter that won't compose can't be cleared by name — fail closed
|
|
530
|
+
# (codex round-2 P2: a quoted/indented name under malformed YAML must
|
|
531
|
+
# not be silently skipped).
|
|
532
|
+
make_tree(tmp_path)
|
|
533
|
+
errs = bash_fixture(tmp_path, 'name: "eic_agent"\ndescription: [unclosed')
|
|
534
|
+
assert any("does not compose" in e for e in errs)
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
def test_merge_key_injecting_bash_fails_closed(tmp_path):
|
|
538
|
+
# codex round-3: `<<: *base` merges a `tools: [..., Bash]` the
|
|
539
|
+
# duplicate-preserving node scan never sees (the top level only shows a
|
|
540
|
+
# literal `<<` key). The composed node tree carries the `merge` tag —
|
|
541
|
+
# detected there, not by text, and failed closed.
|
|
542
|
+
make_tree(tmp_path)
|
|
543
|
+
errs = bash_fixture(
|
|
544
|
+
tmp_path,
|
|
545
|
+
"_base: &b {tools: [Read, Bash]}\n<<: *b\nname: eic_agent")
|
|
546
|
+
assert any("merge key / alias" in e for e in errs)
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
def test_flow_merge_with_quoted_hash_key_fails_closed(tmp_path):
|
|
550
|
+
# codex round-3 P1-2: a `#` inside a quoted flow key fooled the old
|
|
551
|
+
# text-scan comment strip; the node-tree merge-tag detector is immune.
|
|
552
|
+
make_tree(tmp_path)
|
|
553
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
554
|
+
eic.write_text(
|
|
555
|
+
'---\n{ "x#": y, name: eic_agent, <<: &b {tools: "Read, Bash"} }\n'
|
|
556
|
+
"---\n\nbody\n", encoding="utf-8")
|
|
557
|
+
assert any("merge key / alias" in e
|
|
558
|
+
for e in check(tmp_path) if "eic_agent" in e)
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
def test_alias_value_bash_fails_closed(tmp_path):
|
|
562
|
+
# An alias makes `tools` share another node's value — the node tree sees
|
|
563
|
+
# the SAME node object twice (shared identity). Fail closed.
|
|
564
|
+
make_tree(tmp_path)
|
|
565
|
+
errs = bash_fixture(tmp_path,
|
|
566
|
+
"name: eic_agent\n_x: &a [Read, Bash]\ntools: *a")
|
|
567
|
+
assert any("merge key / alias" in e for e in errs)
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
def test_ampersand_in_quoted_value_is_not_an_anchor(tmp_path):
|
|
571
|
+
# False-positive guard: a literal `&`/`*` inside a quoted scalar is not a
|
|
572
|
+
# YAML anchor/alias (the node carries a plain str value) and must NOT
|
|
573
|
+
# fail the clean file — the node-tree detector, unlike a text scan, sees
|
|
574
|
+
# this correctly.
|
|
575
|
+
make_tree(tmp_path)
|
|
576
|
+
errs = bash_fixture(tmp_path,
|
|
577
|
+
'name: eic_agent\ndescription: "A & B, 3 * 4"\n'
|
|
578
|
+
"tools: Read, Grep")
|
|
579
|
+
assert errs == []
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
def test_allowlisted_file_with_alias_fails_closed(tmp_path):
|
|
583
|
+
# Invariant 1 also fails closed on aliases (a `<<`/alias could inject the
|
|
584
|
+
# pinned value from elsewhere, defeating the value lock).
|
|
585
|
+
make_tree(tmp_path)
|
|
586
|
+
src, _ = first_pair()
|
|
587
|
+
p = tmp_path / src
|
|
588
|
+
p.write_text(
|
|
589
|
+
"---\nname: research_architect_agent\n_t: &t Read, Write, Edit, "
|
|
590
|
+
"Grep, Glob\ntools: *t\n---\n\nbody\n", encoding="utf-8")
|
|
591
|
+
assert any("merge key / alias" in e for e in errs_for(tmp_path, src))
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
def test_indented_fence_in_block_scalar_does_not_truncate(tmp_path):
|
|
595
|
+
# codex round-3 P1-1: an indented `---` inside a `description: |` block
|
|
596
|
+
# scalar must NOT be read as the closing fence — doing so truncated the
|
|
597
|
+
# block and hid a Bucket A `name` + `tools: Read, Bash` below it. Only a
|
|
598
|
+
# column-0 `---` closes frontmatter.
|
|
599
|
+
make_tree(tmp_path)
|
|
600
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
601
|
+
eic.write_text(
|
|
602
|
+
"---\ndescription: |\n ---\nname: eic_agent\ntools: Read, Bash\n"
|
|
603
|
+
"---\n\nbody\n", encoding="utf-8")
|
|
604
|
+
assert any("declares Bash" in e
|
|
605
|
+
for e in check(tmp_path) if "eic_agent" in e)
|
|
606
|
+
|
|
607
|
+
|
|
608
|
+
def test_bom_prefixed_bucket_a_bash_fails_closed(tmp_path):
|
|
609
|
+
# A leading UTF-8 BOM makes `---` fail the column-0 fence match, so
|
|
610
|
+
# the file would read as frontmatter-less and skip invariant 2 — while a
|
|
611
|
+
# real YAML reader strips the BOM and sees `tools: Read, Bash`. _read_raw
|
|
612
|
+
# strips the BOM so the two agree; the smuggled Bash fails closed.
|
|
613
|
+
make_tree(tmp_path)
|
|
614
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
615
|
+
eic.write_bytes(
|
|
616
|
+
"---\nname: eic_agent\ntools: Read, Bash\n---\n\nbody\n"
|
|
617
|
+
.encode("utf-8"))
|
|
618
|
+
assert any("declares Bash" in e
|
|
619
|
+
for e in check(tmp_path) if "eic_agent" in e)
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
def test_bom_prefixed_clean_file_passes(tmp_path):
|
|
623
|
+
make_tree(tmp_path)
|
|
624
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
625
|
+
eic.write_bytes(
|
|
626
|
+
"---\nname: eic_agent\ntools: Read, Grep\n---\n\nbody\n"
|
|
627
|
+
.encode("utf-8"))
|
|
628
|
+
assert not [e for e in check(tmp_path) if "eic_agent" in e]
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
def test_block_scalar_containing_tools_text_no_false_positive(tmp_path):
|
|
632
|
+
# codex round-6 P2: a `description: |` block scalar whose body contains a
|
|
633
|
+
# `tools: ...` line must NOT trip the byte-witness — that line is not the
|
|
634
|
+
# `tools` KEY. The witness is anchored to the composed key's own line, so
|
|
635
|
+
# a clean allowlisted file with such documentation passes.
|
|
636
|
+
make_tree(tmp_path)
|
|
637
|
+
src, _ = first_pair()
|
|
638
|
+
p = tmp_path / src
|
|
639
|
+
p.write_text(
|
|
640
|
+
f"---\nname: research_architect_agent\n{PINNED_TOOLS_LINE}\n"
|
|
641
|
+
"description: |\n tools: this is documentation, not the key\n"
|
|
642
|
+
"---\n\nbody\n", encoding="utf-8")
|
|
643
|
+
assert errs_for(tmp_path, src) == []
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
def test_block_scalar_containing_triple_dash_is_not_a_fence(tmp_path):
|
|
647
|
+
# The companion false-positive: a block scalar that legitimately contains
|
|
648
|
+
# an indented `---` line must still parse the real keys below it and PASS
|
|
649
|
+
# a clean file.
|
|
650
|
+
make_tree(tmp_path)
|
|
651
|
+
errs = bash_fixture(
|
|
652
|
+
tmp_path,
|
|
653
|
+
"name: eic_agent\ndescription: |\n intro\n --- not a fence\n"
|
|
654
|
+
"tools: Read, Grep")
|
|
655
|
+
assert errs == []
|
|
656
|
+
|
|
657
|
+
|
|
658
|
+
def test_escaped_tools_key_fires_byte_witness_on_allowlisted(tmp_path):
|
|
659
|
+
# codex round-3 P2-1: replacing the pinned line with an escaped-key
|
|
660
|
+
# spelling makes raw_lines empty; the byte witness must still fire
|
|
661
|
+
# (require the verbatim pinned line), and the semantic check fires too.
|
|
662
|
+
make_tree(tmp_path)
|
|
663
|
+
src, _ = first_pair()
|
|
664
|
+
p = tmp_path / src
|
|
665
|
+
p.write_text(
|
|
666
|
+
'---\nname: research_architect_agent\n"tool\\u0073": Read, Write, '
|
|
667
|
+
"Edit, Grep, Glob\n---\n\nbody\n", encoding="utf-8")
|
|
668
|
+
assert any("not byte-equal" in e for e in errs_for(tmp_path, src))
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
def test_duplicate_tools_on_bucket_a_fails_closed(tmp_path):
|
|
672
|
+
# codex round-4 P2: last-wins would pick `Read, Grep` and pass, but a
|
|
673
|
+
# first-wins parser would grant Bash. Duplicate-key resolution is
|
|
674
|
+
# parser-dependent, so invariant 2 fails closed (as invariant 1 does).
|
|
675
|
+
make_tree(tmp_path)
|
|
676
|
+
errs = bash_fixture(tmp_path,
|
|
677
|
+
"name: eic_agent\ntools: Read, Bash\ntools: Read, Grep")
|
|
678
|
+
assert any("`tools` keys" in e and "parser-dependent" in e for e in errs)
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
def test_duplicate_tools_first_wins_bash_fails_closed(tmp_path):
|
|
682
|
+
make_tree(tmp_path)
|
|
683
|
+
errs = bash_fixture(tmp_path,
|
|
684
|
+
"name: eic_agent\ntools: Read, Grep\ntools: Read, Bash")
|
|
685
|
+
assert any("`tools` keys" in e and "parser-dependent" in e for e in errs)
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
def test_duplicate_name_one_bucket_a_fails_closed(tmp_path):
|
|
689
|
+
# A duplicate `name` where one resolution is Bucket A: a non-Bucket-A
|
|
690
|
+
# last-wins name would skip the file, hiding a Bucket A first-wins name +
|
|
691
|
+
# Bash. Fail closed.
|
|
692
|
+
make_tree(tmp_path)
|
|
693
|
+
errs = bash_fixture(tmp_path,
|
|
694
|
+
"name: safe_agent\nname: eic_agent\ntools: Read, Bash")
|
|
695
|
+
assert any("`name` keys" in e and "parser-dependent" in e for e in errs)
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def test_duplicate_name_neither_bucket_a_passes(tmp_path):
|
|
699
|
+
# If NO resolution is a Bucket A name, the file is out of scope whichever
|
|
700
|
+
# way a parser resolves it — no need to fail closed.
|
|
701
|
+
make_tree(tmp_path)
|
|
702
|
+
errs = bash_fixture(tmp_path,
|
|
703
|
+
"name: safe_one\nname: safe_two\ntools: Read, Bash")
|
|
704
|
+
assert errs == []
|
|
705
|
+
|
|
706
|
+
|
|
707
|
+
def test_nested_bucket_a_agent_declaring_bash_fails_closed(tmp_path):
|
|
708
|
+
# codex round-7 P1: invariant 2 must reach nested agent files (rglob, not
|
|
709
|
+
# glob) — the runtime guard keys on `name` regardless of path, so a
|
|
710
|
+
# `agents/subdir/x.md` with a Bucket A name + Bash is a real exposure.
|
|
711
|
+
make_tree(tmp_path)
|
|
712
|
+
nested = (tmp_path
|
|
713
|
+
/ "academic-paper-reviewer/agents/subdir/eic_agent.md")
|
|
714
|
+
nested.parent.mkdir(parents=True, exist_ok=True)
|
|
715
|
+
nested.write_text("---\nname: eic_agent\ntools: Read, Bash\n---\nbody\n",
|
|
716
|
+
encoding="utf-8")
|
|
717
|
+
assert any("declares Bash" in e for e in check(tmp_path)
|
|
718
|
+
if "eic_agent" in e)
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
def test_directory_symlink_under_agent_dir_fails_closed(tmp_path):
|
|
722
|
+
# codex round-8 P1: rglob does not descend into directory symlinks, so a
|
|
723
|
+
# tracked `agents/nested -> ../payload` could hide a Bucket A agent
|
|
724
|
+
# declaring Bash. Fail closed on the symlink itself.
|
|
725
|
+
make_tree(tmp_path)
|
|
726
|
+
agents = tmp_path / "academic-paper-reviewer/agents"
|
|
727
|
+
agents.mkdir(parents=True, exist_ok=True)
|
|
728
|
+
payload = tmp_path / "payload"
|
|
729
|
+
payload.mkdir()
|
|
730
|
+
(payload / "eic_agent.md").write_text(
|
|
731
|
+
"---\nname: eic_agent\ntools: Read, Bash\n---\nbody\n",
|
|
732
|
+
encoding="utf-8")
|
|
733
|
+
try:
|
|
734
|
+
(agents / "nested").symlink_to(payload, target_is_directory=True)
|
|
735
|
+
except (OSError, NotImplementedError):
|
|
736
|
+
import pytest
|
|
737
|
+
pytest.skip("symlinks unavailable on this platform")
|
|
738
|
+
assert any("directory symlink" in e for e in check(tmp_path))
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
def test_bare_cr_frontmatter_bucket_a_bash_fails_closed(tmp_path):
|
|
742
|
+
# codex round-8 P1: bare `\r` (old-Mac) is a YAML line break, but a
|
|
743
|
+
# split-on-`\n` fence scan reads the file as frontmatter-less and skips
|
|
744
|
+
# it, hiding a Bucket A `tools: Bash`. splitlines() recognizes bare CR so
|
|
745
|
+
# the declaration is caught.
|
|
746
|
+
make_tree(tmp_path)
|
|
747
|
+
eic = tmp_path / "academic-paper-reviewer/agents/eic_agent.md"
|
|
748
|
+
eic.write_bytes(
|
|
749
|
+
"---\rname: eic_agent\rtools: Read, Bash\r---\r".encode("utf-8"))
|
|
750
|
+
assert any("declares Bash" in e for e in check(tmp_path)
|
|
751
|
+
if "eic_agent" in e)
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
def test_unicode_line_break_before_tools_no_false_positive(tmp_path):
|
|
755
|
+
# codex round-7 P2: YAML counts NEL (U+0085) / LS (U+2028) / PS (U+2029)
|
|
756
|
+
# as line breaks but str.split("\n") does not. Placed in a quoted value
|
|
757
|
+
# BEFORE the tools key, they shift YAML's start_mark.line off the
|
|
758
|
+
# split("\n") index, so a line-based anchor would read the WRONG physical
|
|
759
|
+
# line. The byte witness anchors via start_mark.index (byte offset), so
|
|
760
|
+
# the clean allowlisted file is not falsely rejected and no non-verbatim
|
|
761
|
+
# key line slips past.
|
|
762
|
+
make_tree(tmp_path)
|
|
763
|
+
src, _ = first_pair()
|
|
764
|
+
p = tmp_path / src
|
|
765
|
+
p.write_text(
|
|
766
|
+
f"---\nname: research_architect_agent\n"
|
|
767
|
+
'description: "a
b
c
d"\n'
|
|
768
|
+
f"{PINNED_TOOLS_LINE}\n---\n\nbody\n",
|
|
769
|
+
encoding="utf-8")
|
|
770
|
+
assert errs_for(tmp_path, src) == []
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
def test_non_bucket_a_agent_with_bash_passes(tmp_path):
|
|
775
|
+
# Baked into the green fixture (pipeline_orchestrator_agent declares
|
|
776
|
+
# Bash); assert it raises nothing on its own.
|
|
777
|
+
make_tree(tmp_path)
|
|
778
|
+
assert check(tmp_path) == []
|
|
779
|
+
|
|
780
|
+
|
|
781
|
+
def test_bucket_a_agent_without_tools_key_passes(tmp_path):
|
|
782
|
+
# eic_agent in the green fixture has no tools key — inherit is fine;
|
|
783
|
+
# the runtime guard still fences it.
|
|
784
|
+
make_tree(tmp_path)
|
|
785
|
+
assert not [e for e in check(tmp_path) if "eic_agent" in e]
|
|
786
|
+
|
|
787
|
+
|
|
788
|
+
def test_missing_manifest_fails_closed(tmp_path):
|
|
789
|
+
make_tree(tmp_path)
|
|
790
|
+
(tmp_path / MANIFEST).unlink()
|
|
791
|
+
errs = check(tmp_path)
|
|
792
|
+
assert any(MANIFEST in e and "failing closed" in e for e in errs)
|
|
793
|
+
|
|
794
|
+
|
|
795
|
+
def test_unparseable_manifest_fails_closed(tmp_path):
|
|
796
|
+
make_tree(tmp_path)
|
|
797
|
+
(tmp_path / MANIFEST).write_text("{not json", encoding="utf-8")
|
|
798
|
+
errs = check(tmp_path)
|
|
799
|
+
assert any(MANIFEST in e and "failing closed" in e for e in errs)
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
def test_valid_json_non_object_manifest_fails_closed(tmp_path):
|
|
803
|
+
# A JSON array parses fine but has no `agents` mapping — must be a
|
|
804
|
+
# curated diagnostic, not a traceback (codex round-1 P2).
|
|
805
|
+
make_tree(tmp_path)
|
|
806
|
+
(tmp_path / MANIFEST).write_text("[]", encoding="utf-8")
|
|
807
|
+
errs = check(tmp_path)
|
|
808
|
+
assert any(MANIFEST in e and "no `agents` mapping" in e for e in errs)
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
def test_non_mapping_agents_value_fails_closed(tmp_path):
|
|
812
|
+
make_tree(tmp_path)
|
|
813
|
+
(tmp_path / MANIFEST).write_text('{"agents": []}', encoding="utf-8")
|
|
814
|
+
errs = check(tmp_path)
|
|
815
|
+
assert any(MANIFEST in e and "no `agents` mapping" in e for e in errs)
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
# --- lock shape ------------------------------------------------------------------
|
|
819
|
+
|
|
820
|
+
def test_pinned_line_is_the_frozen_514_value():
|
|
821
|
+
# Editing the allowlist is a deliberate security-surface change: it must
|
|
822
|
+
# touch this lint in the same commit. This test is the second witness.
|
|
823
|
+
assert PINNED_TOOLS_LINE == "tools: Read, Write, Edit, Grep, Glob"
|
|
824
|
+
assert CANONICAL_TOOLS == ("Read", "Write", "Edit", "Grep", "Glob")
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
def test_allowlisted_files_are_the_three_pairs():
|
|
828
|
+
assert set(ALLOWLISTED_FILES) == {
|
|
829
|
+
"deep-research/agents/report_compiler_agent.md",
|
|
830
|
+
"deep-research/agents/research_architect_agent.md",
|
|
831
|
+
"deep-research/agents/synthesis_agent.md",
|
|
832
|
+
"agents/report_compiler_agent.md",
|
|
833
|
+
"agents/research_architect_agent.md",
|
|
834
|
+
"agents/synthesis_agent.md",
|
|
835
|
+
}
|