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,1191 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# version: 1.0.0
|
|
3
|
+
#
|
|
4
|
+
# This wrapper is NOT to be invoked by an in-LLM Bash tool call from the same
|
|
5
|
+
# session producing the audited deliverable. Allowed invokers: human interactive
|
|
6
|
+
# shell, CI workflow step, SubagentStop hook, second-terminal Bash from outside
|
|
7
|
+
# the LLM session. Same-session in-LLM invocation creates Pattern C3 exposure.
|
|
8
|
+
# See spec §4.7.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# scripts/run_codex_audit.sh \
|
|
12
|
+
# --stage <1-6> \
|
|
13
|
+
# --agent <synthesis_agent|research_architect_agent|report_compiler_agent> \
|
|
14
|
+
# --deliverable <repo-relative-path> \
|
|
15
|
+
# --round <N> \
|
|
16
|
+
# [--target-rounds <N>] # default 3
|
|
17
|
+
# [--supporting <p1,p2,...>] # comma-separated repo-relative paths
|
|
18
|
+
# [--previous-findings <path>] # required when --round > 1
|
|
19
|
+
# [--bundle-id <string>]
|
|
20
|
+
# [--output-dir <dir>] # default audit_artifacts/
|
|
21
|
+
# [--dry-run] # validate inputs only; write nothing
|
|
22
|
+
#
|
|
23
|
+
# Exit codes (§4.6):
|
|
24
|
+
# 0 Audit complete; verdict is PASS / MINOR / MATERIAL
|
|
25
|
+
# 64 EX_USAGE — input validation failed (no files written)
|
|
26
|
+
# 70 EX_SOFTWARE — AUDIT_FAILED (JSONL parse error or bundle mutation)
|
|
27
|
+
# 73 EX_CANTCREAT — tee write failed; JSONL integrity not guaranteed
|
|
28
|
+
# 75 EX_TEMPFAIL — codex rate-limited / transient error (retry candidate)
|
|
29
|
+
# other codex non-zero exit (preserved as-is; AUDIT_FAILED artifact set written)
|
|
30
|
+
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
# Bash version guard — §4.1 requires Bash 4+ for indexed arrays, read -ra, <<<
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
if [[ "${BASH_VERSINFO[0]}" -lt 4 ]]; then
|
|
37
|
+
printf '[run_codex_audit] error: Bash 4+ required (found %s). On macOS: brew install bash\n' \
|
|
38
|
+
"${BASH_VERSION}" >&2
|
|
39
|
+
exit 64
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
# ---------------------------------------------------------------------------
|
|
43
|
+
# Helper functions — defined before the dependency preflight so they are
|
|
44
|
+
# available for the _sha256 check itself.
|
|
45
|
+
# ---------------------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
# SHA-256 backend selection — cached once to avoid forking `command -v` per call
|
|
48
|
+
# (Step 0b + Step 3a together produce 8+ hash calls).
|
|
49
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
50
|
+
_SHA256_CMD=(sha256sum)
|
|
51
|
+
else
|
|
52
|
+
_SHA256_CMD=(shasum -a 256)
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
# _sha256 <path>
|
|
56
|
+
# Portable SHA-256 hex digest. Prefers GNU sha256sum (Linux / coreutils);
|
|
57
|
+
# falls back to BSD shasum -a 256 (macOS stock).
|
|
58
|
+
_sha256() {
|
|
59
|
+
"${_SHA256_CMD[@]}" "$1" | awk '{print $1}'
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# _sha256_str <string>
|
|
63
|
+
# SHA-256 of an in-memory string (for the bundle manifest).
|
|
64
|
+
_sha256_str() {
|
|
65
|
+
printf '%s' "$1" | "${_SHA256_CMD[@]}" | awk '{print $1}'
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
# _atomic_write <dest-path>
|
|
69
|
+
# Reads stdin, writes to <dest>.tmp, fsyncs, then renames over <dest>.
|
|
70
|
+
# Used for sidecar, verdict, and proposal entry — the three files §4.4 §4.8
|
|
71
|
+
# guarantees orchestrator observes whole-or-not-at-all. JSONL is exempt
|
|
72
|
+
# because codex streams it over the audit's runtime; see §4.4 atomicity note.
|
|
73
|
+
#
|
|
74
|
+
# F-010 (§3.6): each sub-step (cat, fsync, mv) is explicitly error-checked.
|
|
75
|
+
# A raw cat/fsync/mv failure with set -euo pipefail would abort the wrapper
|
|
76
|
+
# before AUDIT_FAILED artifacts are written, violating §4.6 invariant E8.
|
|
77
|
+
# All three failure cases now emit a diagnostic and exit 73 (EX_CANTCREAT).
|
|
78
|
+
_atomic_write() {
|
|
79
|
+
local path="$1"
|
|
80
|
+
local tmp="${path}.tmp"
|
|
81
|
+
if ! cat > "${tmp}" 2>/dev/null; then
|
|
82
|
+
printf '[run_codex_audit] error: failed to write %s\n' "${tmp}" >&2
|
|
83
|
+
exit 73
|
|
84
|
+
fi
|
|
85
|
+
if command -v python3 >/dev/null 2>&1; then
|
|
86
|
+
if ! python3 -c "import os,sys; f=open(sys.argv[1],'rb'); os.fsync(f.fileno()); f.close()" "${tmp}" 2>/dev/null; then
|
|
87
|
+
rm -f "${tmp}"
|
|
88
|
+
printf '[run_codex_audit] error: fsync failed for %s\n' "${tmp}" >&2
|
|
89
|
+
exit 73
|
|
90
|
+
fi
|
|
91
|
+
else
|
|
92
|
+
sync
|
|
93
|
+
fi
|
|
94
|
+
if ! mv -f "${tmp}" "${path}" 2>/dev/null; then
|
|
95
|
+
rm -f "${tmp}"
|
|
96
|
+
printf '[run_codex_audit] error: rename failed for %s\n' "${path}" >&2
|
|
97
|
+
exit 73
|
|
98
|
+
fi
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
# _extract_jsonl_thread_id <jsonl-path>
|
|
102
|
+
# Returns the thread_id from the first thread.started event, or empty string
|
|
103
|
+
# when JSONL is missing / empty / lacks a parseable thread.started event.
|
|
104
|
+
# codex 0.125+ emits thread_id only on the opening thread.started event (§3.3).
|
|
105
|
+
#
|
|
106
|
+
# F-001 (§3.6): jq must be non-fatal. A SIGKILL'd or disk-full partial JSONL can
|
|
107
|
+
# make jq exit non-zero; with set -euo pipefail that would abort the wrapper BEFORE
|
|
108
|
+
# the mandatory AUDIT_FAILED sidecar/verdict/proposal trio is written, violating §4.6
|
|
109
|
+
# invariant E8. The `|| printf ''` ensures the function always returns success.
|
|
110
|
+
_extract_jsonl_thread_id() {
|
|
111
|
+
local path="$1"
|
|
112
|
+
if [[ ! -s "${path}" ]]; then
|
|
113
|
+
printf ''
|
|
114
|
+
return 0
|
|
115
|
+
fi
|
|
116
|
+
# F-015 (§3.1): jq emits the literal string "null" when thread_id is absent or
|
|
117
|
+
# non-string; a malformed thread.started event would then propagate "null" into
|
|
118
|
+
# the sidecar's stream.jsonl_thread_id, failing the schema UUID regex.
|
|
119
|
+
# Chain select(type == "string") + UUID-pattern guard to degrade gracefully to
|
|
120
|
+
# empty string (permitted by schema when companion verdict is AUDIT_FAILED).
|
|
121
|
+
jq -r '
|
|
122
|
+
select(.type == "thread.started")
|
|
123
|
+
| .thread_id
|
|
124
|
+
| select(type == "string")
|
|
125
|
+
| select(test("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"))
|
|
126
|
+
' "${path}" 2>/dev/null \
|
|
127
|
+
| head -1 \
|
|
128
|
+
|| printf ''
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
# _codex_version
|
|
132
|
+
# Extracts bare semver from `codex --version`. codex 0.125+ prints
|
|
133
|
+
# "codex-cli X.Y.Z" (e.g., "codex-cli 0.128.0"); we strip the prefix and return just the dotted-triple.
|
|
134
|
+
# Exits 64 if no semver-shaped token is found — guards against future CLI
|
|
135
|
+
# format changes silently leaking garbage into the sidecar's codex_cli_version.
|
|
136
|
+
_codex_version() {
|
|
137
|
+
local v
|
|
138
|
+
v=$(codex --version 2>/dev/null \
|
|
139
|
+
| awk 'match($0, /[0-9]+\.[0-9]+\.[0-9]+/) { print substr($0, RSTART, RLENGTH); exit }')
|
|
140
|
+
if [[ -z "${v}" ]]; then
|
|
141
|
+
printf '[run_codex_audit] error: cannot parse semver from `codex --version`\n' >&2
|
|
142
|
+
exit 64
|
|
143
|
+
fi
|
|
144
|
+
printf '%s\n' "${v}"
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# _now_rfc3339_ms
|
|
148
|
+
# UTC timestamp with millisecond precision in RFC 3339 format.
|
|
149
|
+
# Format: YYYY-MM-DDTHH:MM:SS.mmmZ (colons in time — JSON field format).
|
|
150
|
+
# This is the JSON/sidecar field format; run_id uses hyphens instead.
|
|
151
|
+
_now_rfc3339_ms() {
|
|
152
|
+
python3 -c "
|
|
153
|
+
import datetime
|
|
154
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
|
155
|
+
ms = now.strftime('%Y-%m-%dT%H:%M:%S') + '.{:03d}Z'.format(now.microsecond // 1000)
|
|
156
|
+
print(ms)
|
|
157
|
+
"
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
# _random_4hex
|
|
161
|
+
# Four random lowercase hex characters from /dev/urandom.
|
|
162
|
+
# Used as the run_id suffix to disambiguate sub-second concurrent runs.
|
|
163
|
+
_random_4hex() {
|
|
164
|
+
od -An -N2 -tx1 < /dev/urandom | tr -d ' \n'
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
# _make_run_id
|
|
168
|
+
# Generates a run_id per §3.1 / §3.7 F1 contract:
|
|
169
|
+
# <ISO-8601-Z>-<4-hex>
|
|
170
|
+
# where the date-time portion uses HYPHENS in place of colons (filename safe).
|
|
171
|
+
# Example: 2026-04-30T15-22-04Z-d8f3
|
|
172
|
+
# Note: JSON field values (started_at, ended_at) use colons per RFC 3339.
|
|
173
|
+
_make_run_id() {
|
|
174
|
+
local dt
|
|
175
|
+
dt=$(python3 -c "
|
|
176
|
+
import datetime
|
|
177
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
|
178
|
+
print(now.strftime('%Y-%m-%dT%H-%M-%SZ'))
|
|
179
|
+
")
|
|
180
|
+
printf '%s-%s\n' "${dt}" "$(_random_4hex)"
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
# _duration_seconds <started_at_rfc3339_ms> <ended_at_rfc3339_ms>
|
|
184
|
+
# Returns elapsed seconds as a float.
|
|
185
|
+
# F-009 (§3.1): clamp to minimum 0.001 — audit_sidecar.schema.json sets
|
|
186
|
+
# duration_seconds exclusiveMinimum: 0; very fast failures (codex exits before
|
|
187
|
+
# 1ms) would produce 0.000 which violates the schema constraint.
|
|
188
|
+
_duration_seconds() {
|
|
189
|
+
python3 -c "
|
|
190
|
+
import datetime, sys
|
|
191
|
+
fmt = '%Y-%m-%dT%H:%M:%S.%fZ'
|
|
192
|
+
t0 = datetime.datetime.strptime(sys.argv[1], fmt)
|
|
193
|
+
t1 = datetime.datetime.strptime(sys.argv[2], fmt)
|
|
194
|
+
secs = (t1-t0).total_seconds()
|
|
195
|
+
# Clamp to schema exclusiveMinimum: 0
|
|
196
|
+
if secs <= 0:
|
|
197
|
+
secs = 0.001
|
|
198
|
+
print('{:.3f}'.format(secs))
|
|
199
|
+
" "$1" "$2"
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# _git_dirty
|
|
203
|
+
# Prints 'true' when the working tree is dirty, 'false' otherwise.
|
|
204
|
+
# Uses `--exit-code` so diff exits non-zero on dirty state; we catch that.
|
|
205
|
+
_git_dirty() {
|
|
206
|
+
if git diff --quiet 2>/dev/null && git diff --cached --quiet 2>/dev/null; then
|
|
207
|
+
printf 'false'
|
|
208
|
+
else
|
|
209
|
+
printf 'true'
|
|
210
|
+
fi
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
# _to_repo_relative <path>
|
|
214
|
+
# If <path> is absolute, strip the leading slash (unlikely — §4.2 says
|
|
215
|
+
# deliverable is repo-relative, but belt-and-suspenders). If it starts with
|
|
216
|
+
# ./ normalize that away. Does not validate ..; that is the caller's job.
|
|
217
|
+
_to_repo_relative() {
|
|
218
|
+
local p="$1"
|
|
219
|
+
# Remove leading ./
|
|
220
|
+
p="${p#./}"
|
|
221
|
+
printf '%s' "${p}"
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
# _validate_repo_relative <path> <flag-name>
|
|
225
|
+
# F-006 (§3.1): Validates the path satisfies the audit_sidecar.schema.json
|
|
226
|
+
# repo_relative_path constraint: no leading /, no whitespace, no .. segments.
|
|
227
|
+
# Absolute paths, .. traversals, or whitespace paths fail schema validation
|
|
228
|
+
# downstream (proposal entry artifact_paths.{jsonl,sidecar,verdict} regex).
|
|
229
|
+
# Exits EX_USAGE 64 on violation.
|
|
230
|
+
_validate_repo_relative() {
|
|
231
|
+
local path="$1"
|
|
232
|
+
local flag="$2"
|
|
233
|
+
# Must not be empty
|
|
234
|
+
if [[ -z "${path}" ]]; then
|
|
235
|
+
printf '[run_codex_audit] error: %s path must not be empty\n' "${flag}" >&2
|
|
236
|
+
exit 64
|
|
237
|
+
fi
|
|
238
|
+
# Must not be absolute (leading /)
|
|
239
|
+
if [[ "${path}" == /* ]]; then
|
|
240
|
+
printf '[run_codex_audit] error: %s path must be repo-relative (no leading /): %s\n' \
|
|
241
|
+
"${flag}" "${path}" >&2
|
|
242
|
+
exit 64
|
|
243
|
+
fi
|
|
244
|
+
# Must not contain whitespace
|
|
245
|
+
if [[ "${path}" =~ [[:space:]] ]]; then
|
|
246
|
+
printf '[run_codex_audit] error: %s path must not contain whitespace: %s\n' \
|
|
247
|
+
"${flag}" "${path}" >&2
|
|
248
|
+
exit 64
|
|
249
|
+
fi
|
|
250
|
+
# Must not contain .. segments (path traversal)
|
|
251
|
+
if [[ "${path}" =~ (^|/)\.\.(/|$) ]]; then
|
|
252
|
+
printf '[run_codex_audit] error: %s path must not contain .. segments: %s\n' \
|
|
253
|
+
"${flag}" "${path}" >&2
|
|
254
|
+
exit 64
|
|
255
|
+
fi
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# _json_escape <string>
|
|
259
|
+
# Minimal JSON string escaping (backslash, double-quote, control chars).
|
|
260
|
+
_json_escape() {
|
|
261
|
+
python3 -c "import json,sys; print(json.dumps(sys.argv[1]))" "$1"
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
# _yaml_escape_oneline <string>
|
|
265
|
+
# Produce a safe single-quoted YAML scalar. Single-quotes are escaped by
|
|
266
|
+
# doubling them per YAML spec.
|
|
267
|
+
_yaml_escape_oneline() {
|
|
268
|
+
local s="$1"
|
|
269
|
+
# Replace ' with '' for YAML single-quote escaping
|
|
270
|
+
s="${s//\'/\'\'}"
|
|
271
|
+
printf "'%s'" "${s}"
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
# ---------------------------------------------------------------------------
|
|
275
|
+
# Dependency preflight — exits 64 with "missing dependency: <name>" before
|
|
276
|
+
# any artifact write. Checked: bash (version already done above), git, awk,
|
|
277
|
+
# jq, od, tr, uname, sort, head, tee, mv, python3, codex, sha256sum|shasum.
|
|
278
|
+
# ---------------------------------------------------------------------------
|
|
279
|
+
_check_dep() {
|
|
280
|
+
local cmd="$1"
|
|
281
|
+
if ! command -v "${cmd}" >/dev/null 2>&1; then
|
|
282
|
+
printf '[run_codex_audit] error: missing dependency: %s\n' "${cmd}" >&2
|
|
283
|
+
exit 64
|
|
284
|
+
fi
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
for _dep in git awk jq od tr uname sort head tee mv python3 codex; do
|
|
288
|
+
_check_dep "${_dep}"
|
|
289
|
+
done
|
|
290
|
+
|
|
291
|
+
# SHA-256 helper: need at least one of sha256sum or shasum
|
|
292
|
+
if ! command -v sha256sum >/dev/null 2>&1 && ! command -v shasum >/dev/null 2>&1; then
|
|
293
|
+
printf '[run_codex_audit] error: missing dependency: sha256sum or shasum\n' >&2
|
|
294
|
+
exit 64
|
|
295
|
+
fi
|
|
296
|
+
|
|
297
|
+
# ---------------------------------------------------------------------------
|
|
298
|
+
# Input parsing
|
|
299
|
+
# ---------------------------------------------------------------------------
|
|
300
|
+
STAGE=""
|
|
301
|
+
AGENT=""
|
|
302
|
+
DELIVERABLE=""
|
|
303
|
+
SUPPORTING_CSV=""
|
|
304
|
+
ROUND=""
|
|
305
|
+
TARGET_ROUNDS="3"
|
|
306
|
+
PREV_FINDINGS=""
|
|
307
|
+
OUT_DIR="audit_artifacts"
|
|
308
|
+
BUNDLE_ID=""
|
|
309
|
+
DRY_RUN=false
|
|
310
|
+
|
|
311
|
+
# F-005 (§3.5): require_arg guards all value-taking flags so a missing operand
|
|
312
|
+
# (e.g. `--stage --agent foo`) exits EX_USAGE 64, not set -u unbound-variable
|
|
313
|
+
# exit 1. Checks $# >= 2 AND next token doesn't look like a flag (^--).
|
|
314
|
+
_require_arg() {
|
|
315
|
+
local flag="$1"
|
|
316
|
+
# $# here is the caller's argument count after its own shift operations.
|
|
317
|
+
# We receive $# from the while-loop via the special `shift` semantics below;
|
|
318
|
+
# instead test the second positional ($2) of the calling while iteration.
|
|
319
|
+
# Because this is called from within the case block, $2 is the while-loop's $2.
|
|
320
|
+
if [[ $# -lt 3 || "$3" =~ ^-- ]]; then
|
|
321
|
+
printf '[run_codex_audit] error: %s requires a value\n' "${flag}" >&2
|
|
322
|
+
exit 64
|
|
323
|
+
fi
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
while [[ $# -gt 0 ]]; do
|
|
327
|
+
case "$1" in
|
|
328
|
+
--stage)
|
|
329
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
330
|
+
printf '[run_codex_audit] error: --stage requires a value\n' >&2; exit 64
|
|
331
|
+
fi
|
|
332
|
+
STAGE="$2"; shift 2 ;;
|
|
333
|
+
--agent)
|
|
334
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
335
|
+
printf '[run_codex_audit] error: --agent requires a value\n' >&2; exit 64
|
|
336
|
+
fi
|
|
337
|
+
AGENT="$2"; shift 2 ;;
|
|
338
|
+
--deliverable)
|
|
339
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
340
|
+
printf '[run_codex_audit] error: --deliverable requires a value\n' >&2; exit 64
|
|
341
|
+
fi
|
|
342
|
+
DELIVERABLE="$2"; shift 2 ;;
|
|
343
|
+
--supporting)
|
|
344
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
345
|
+
printf '[run_codex_audit] error: --supporting requires a value\n' >&2; exit 64
|
|
346
|
+
fi
|
|
347
|
+
SUPPORTING_CSV="$2"; shift 2 ;;
|
|
348
|
+
--round)
|
|
349
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
350
|
+
printf '[run_codex_audit] error: --round requires a value\n' >&2; exit 64
|
|
351
|
+
fi
|
|
352
|
+
ROUND="$2"; shift 2 ;;
|
|
353
|
+
--target-rounds)
|
|
354
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
355
|
+
printf '[run_codex_audit] error: --target-rounds requires a value\n' >&2; exit 64
|
|
356
|
+
fi
|
|
357
|
+
TARGET_ROUNDS="$2"; shift 2 ;;
|
|
358
|
+
--previous-findings)
|
|
359
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
360
|
+
printf '[run_codex_audit] error: --previous-findings requires a value\n' >&2; exit 64
|
|
361
|
+
fi
|
|
362
|
+
PREV_FINDINGS="$2"; shift 2 ;;
|
|
363
|
+
--output-dir)
|
|
364
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
365
|
+
printf '[run_codex_audit] error: --output-dir requires a value\n' >&2; exit 64
|
|
366
|
+
fi
|
|
367
|
+
OUT_DIR="$2"; shift 2 ;;
|
|
368
|
+
--bundle-id)
|
|
369
|
+
if [[ $# -lt 2 || "$2" =~ ^-- ]]; then
|
|
370
|
+
printf '[run_codex_audit] error: --bundle-id requires a value\n' >&2; exit 64
|
|
371
|
+
fi
|
|
372
|
+
BUNDLE_ID="$2"; shift 2 ;;
|
|
373
|
+
--dry-run) DRY_RUN=true; shift ;;
|
|
374
|
+
# Explicitly reject flags from early drafts that are NOT part of §4.2
|
|
375
|
+
--bundle)
|
|
376
|
+
printf '[run_codex_audit] error: --bundle is not a valid flag (use --bundle-id); see spec §4.2\n' >&2
|
|
377
|
+
exit 64
|
|
378
|
+
;;
|
|
379
|
+
--audit-template)
|
|
380
|
+
printf '[run_codex_audit] error: --audit-template is not a valid flag; see spec §4.2\n' >&2
|
|
381
|
+
exit 64
|
|
382
|
+
;;
|
|
383
|
+
*)
|
|
384
|
+
printf '[run_codex_audit] error: unknown flag: %s\n' "$1" >&2
|
|
385
|
+
exit 64
|
|
386
|
+
;;
|
|
387
|
+
esac
|
|
388
|
+
done
|
|
389
|
+
|
|
390
|
+
# ---------------------------------------------------------------------------
|
|
391
|
+
# Input validation (§4.2) — all failures → exit 64 EX_USAGE
|
|
392
|
+
# ---------------------------------------------------------------------------
|
|
393
|
+
|
|
394
|
+
# Required flags
|
|
395
|
+
for _flag_name in STAGE AGENT DELIVERABLE ROUND; do
|
|
396
|
+
_flag_val="${!_flag_name}"
|
|
397
|
+
if [[ -z "${_flag_val}" ]]; then
|
|
398
|
+
_flag_cli=$(printf '%s' "${_flag_name}" | tr 'A-Z_' 'a-z-')
|
|
399
|
+
printf '[run_codex_audit] error: --%s is required\n' "${_flag_cli}" >&2
|
|
400
|
+
exit 64
|
|
401
|
+
fi
|
|
402
|
+
done
|
|
403
|
+
|
|
404
|
+
# --stage: integer 1-6
|
|
405
|
+
if ! [[ "${STAGE}" =~ ^[1-6]$ ]]; then
|
|
406
|
+
printf '[run_codex_audit] error: --stage must be an integer 1-6 (got: %s)\n' "${STAGE}" >&2
|
|
407
|
+
exit 64
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
# --agent: closed enum
|
|
411
|
+
case "${AGENT}" in
|
|
412
|
+
synthesis_agent|research_architect_agent|report_compiler_agent) ;;
|
|
413
|
+
*)
|
|
414
|
+
printf '[run_codex_audit] error: --agent must be one of synthesis_agent, research_architect_agent, report_compiler_agent (got: %s)\n' "${AGENT}" >&2
|
|
415
|
+
exit 64
|
|
416
|
+
;;
|
|
417
|
+
esac
|
|
418
|
+
|
|
419
|
+
# --deliverable: must exist and be readable
|
|
420
|
+
if [[ ! -f "${DELIVERABLE}" || ! -r "${DELIVERABLE}" ]]; then
|
|
421
|
+
printf '[run_codex_audit] error: --deliverable not found or not readable: %s\n' "${DELIVERABLE}" >&2
|
|
422
|
+
exit 64
|
|
423
|
+
fi
|
|
424
|
+
|
|
425
|
+
# --round: integer >= 1
|
|
426
|
+
if ! [[ "${ROUND}" =~ ^[0-9]+$ ]] || [[ "${ROUND}" -lt 1 ]]; then
|
|
427
|
+
printf '[run_codex_audit] error: --round must be an integer >= 1 (got: %s)\n' "${ROUND}" >&2
|
|
428
|
+
exit 64
|
|
429
|
+
fi
|
|
430
|
+
|
|
431
|
+
# --target-rounds: integer >= 1
|
|
432
|
+
if ! [[ "${TARGET_ROUNDS}" =~ ^[0-9]+$ ]] || [[ "${TARGET_ROUNDS}" -lt 1 ]]; then
|
|
433
|
+
printf '[run_codex_audit] error: --target-rounds must be an integer >= 1 (got: %s)\n' "${TARGET_ROUNDS}" >&2
|
|
434
|
+
exit 64
|
|
435
|
+
fi
|
|
436
|
+
|
|
437
|
+
# --round <= --target-rounds (§3.7 A3)
|
|
438
|
+
if [[ "${ROUND}" -gt "${TARGET_ROUNDS}" ]]; then
|
|
439
|
+
printf '[run_codex_audit] error: --round (%s) must be <= --target-rounds (%s)\n' \
|
|
440
|
+
"${ROUND}" "${TARGET_ROUNDS}" >&2
|
|
441
|
+
exit 64
|
|
442
|
+
fi
|
|
443
|
+
|
|
444
|
+
# --previous-findings required when --round > 1 (audit template Section 4(a) violation)
|
|
445
|
+
if [[ "${ROUND}" -gt 1 && -z "${PREV_FINDINGS}" ]]; then
|
|
446
|
+
printf '[run_codex_audit] error: --previous-findings is required when --round > 1\n' >&2
|
|
447
|
+
exit 64
|
|
448
|
+
fi
|
|
449
|
+
|
|
450
|
+
if [[ -n "${PREV_FINDINGS}" && ! -f "${PREV_FINDINGS}" ]]; then
|
|
451
|
+
printf '[run_codex_audit] error: --previous-findings not found: %s\n' "${PREV_FINDINGS}" >&2
|
|
452
|
+
exit 64
|
|
453
|
+
fi
|
|
454
|
+
|
|
455
|
+
# --supporting: each path must exist
|
|
456
|
+
declare -a SUPPORTING=()
|
|
457
|
+
if [[ -n "${SUPPORTING_CSV}" ]]; then
|
|
458
|
+
IFS=',' read -ra SUPPORTING <<< "${SUPPORTING_CSV}"
|
|
459
|
+
for _sup_path in "${SUPPORTING[@]}"; do
|
|
460
|
+
if [[ ! -f "${_sup_path}" ]]; then
|
|
461
|
+
printf '[run_codex_audit] error: --supporting path not found: %s\n' "${_sup_path}" >&2
|
|
462
|
+
exit 64
|
|
463
|
+
fi
|
|
464
|
+
done
|
|
465
|
+
fi
|
|
466
|
+
|
|
467
|
+
# ---------------------------------------------------------------------------
|
|
468
|
+
# F-017 (§3.6): inject --previous-findings into SUPPORTING before snapshot.
|
|
469
|
+
# Multi-round audits depend on the previous-findings file as context input.
|
|
470
|
+
# If it is NOT included in the bundle manifest, it can mutate between snapshot
|
|
471
|
+
# and codex invocation without detection — codex audits against different
|
|
472
|
+
# findings than the manifest claims.
|
|
473
|
+
#
|
|
474
|
+
# Fix: treat --previous-findings as a mandatory supporting file for round > 1.
|
|
475
|
+
# Inject it into the SUPPORTING array here (dedup by path so a user who also
|
|
476
|
+
# listed it in --supporting does not see duplicate content in the prompt).
|
|
477
|
+
# This preserves the §3.6 manifest role enum (primary | supporting | template)
|
|
478
|
+
# without adding a fourth role.
|
|
479
|
+
#
|
|
480
|
+
# audit_snapshot.py reads PREV_FINDINGS as part of the supporting bundle, so
|
|
481
|
+
# its bytes are snapshotted alongside other supporting files and its SHA enters
|
|
482
|
+
# the manifest — no live cat call after snapshot phase.
|
|
483
|
+
# ---------------------------------------------------------------------------
|
|
484
|
+
if [[ -n "${PREV_FINDINGS}" ]]; then
|
|
485
|
+
_pf_already_in=0
|
|
486
|
+
for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
|
|
487
|
+
if [[ "${_s}" = "${PREV_FINDINGS}" ]]; then
|
|
488
|
+
_pf_already_in=1
|
|
489
|
+
break
|
|
490
|
+
fi
|
|
491
|
+
done
|
|
492
|
+
if [[ "${_pf_already_in}" -eq 0 ]]; then
|
|
493
|
+
SUPPORTING+=("${PREV_FINDINGS}")
|
|
494
|
+
fi
|
|
495
|
+
fi
|
|
496
|
+
|
|
497
|
+
# Audit template path — constant per §3.4 schema constraint
|
|
498
|
+
readonly AUDIT_TEMPLATE_PATH="shared/templates/codex_audit_multifile_template.md"
|
|
499
|
+
if [[ ! -f "${AUDIT_TEMPLATE_PATH}" ]]; then
|
|
500
|
+
printf '[run_codex_audit] error: audit template not found: %s\n' "${AUDIT_TEMPLATE_PATH}" >&2
|
|
501
|
+
exit 64
|
|
502
|
+
fi
|
|
503
|
+
|
|
504
|
+
# ---------------------------------------------------------------------------
|
|
505
|
+
# F-016 (§3.1): Normalize and validate all path inputs BEFORE the dry-run
|
|
506
|
+
# early-exit check. Previously the _to_repo_relative + _validate_repo_relative
|
|
507
|
+
# calls came AFTER Step 0a, so --dry-run reported "inputs valid" even when
|
|
508
|
+
# an absolute or .. path would have failed EX_USAGE 64 on a real run.
|
|
509
|
+
# These calls are pure validation (no mkdir, no file writes), so reordering
|
|
510
|
+
# is safe and preserves the "dry-run is side-effect-free" invariant.
|
|
511
|
+
# ---------------------------------------------------------------------------
|
|
512
|
+
DELIVERABLE=$(_to_repo_relative "${DELIVERABLE}")
|
|
513
|
+
# F-006 (§3.1): validate deliverable and supporting paths satisfy repo_relative_path
|
|
514
|
+
# schema constraint (no leading /, no whitespace, no .. segments) AFTER normalization.
|
|
515
|
+
# Rejects /tmp/... or ../... paths that fail audit_artifact_entry schema validation.
|
|
516
|
+
_validate_repo_relative "${DELIVERABLE}" "--deliverable"
|
|
517
|
+
_norm_supporting=()
|
|
518
|
+
for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
|
|
519
|
+
_norm_sup=$(_to_repo_relative "${_s}")
|
|
520
|
+
_validate_repo_relative "${_norm_sup}" "--supporting"
|
|
521
|
+
_norm_supporting+=("${_norm_sup}")
|
|
522
|
+
done
|
|
523
|
+
SUPPORTING=("${_norm_supporting[@]+"${_norm_supporting[@]}"}")
|
|
524
|
+
# Normalize PREV_FINDINGS to match the normalized SUPPORTING entries (F-017):
|
|
525
|
+
# audit_snapshot.py dedupes PREV_FINDINGS against SUPPORTING by path equality,
|
|
526
|
+
# so paths must agree after _to_repo_relative normalization or both will be
|
|
527
|
+
# snapshotted as separate entries.
|
|
528
|
+
if [[ -n "${PREV_FINDINGS}" ]]; then
|
|
529
|
+
PREV_FINDINGS=$(_to_repo_relative "${PREV_FINDINGS}")
|
|
530
|
+
fi
|
|
531
|
+
# F-014 (§3.1): validate --output-dir BEFORE mkdir -p to avoid creating a
|
|
532
|
+
# directory at an invalid path (absolute, .. traversal) before EX_USAGE 64 rejects it.
|
|
533
|
+
# "No side effects on input validation rejection" — mkdir must not fire first.
|
|
534
|
+
_validate_repo_relative "${OUT_DIR}" "--output-dir"
|
|
535
|
+
|
|
536
|
+
# ---------------------------------------------------------------------------
|
|
537
|
+
# Step 0a — dry-run early exit. §10 Phase 6.1 verification gate and §1.2
|
|
538
|
+
# threat model: writing artifacts at zero codex cost is Pattern C3 attack
|
|
539
|
+
# surface. --dry-run is input-validation only; nothing is written.
|
|
540
|
+
# (F-016: path validation runs above, before this check, so dry-run correctly
|
|
541
|
+
# rejects absolute/.. paths rather than reporting "inputs valid" for them.)
|
|
542
|
+
# ---------------------------------------------------------------------------
|
|
543
|
+
if [[ "${DRY_RUN}" = true ]]; then
|
|
544
|
+
printf '[run_codex_audit] dry-run: inputs valid; no files written\n'
|
|
545
|
+
exit 0
|
|
546
|
+
fi
|
|
547
|
+
|
|
548
|
+
# ---------------------------------------------------------------------------
|
|
549
|
+
# SIGTERM / SIGINT trap — F-059 closure.
|
|
550
|
+
# On termination: clean up partial artifacts (*.tmp + empty JSONL placeholder)
|
|
551
|
+
# and exit 75 (EX_TEMPFAIL). run_id may not be set yet when the trap fires,
|
|
552
|
+
# so we record it in a variable that the trap closure reads.
|
|
553
|
+
# ---------------------------------------------------------------------------
|
|
554
|
+
_CURRENT_RUN_ID=""
|
|
555
|
+
_OUT_DIR_FOR_TRAP=""
|
|
556
|
+
|
|
557
|
+
_cleanup_on_signal() {
|
|
558
|
+
local rid="${_CURRENT_RUN_ID}"
|
|
559
|
+
local odir="${_OUT_DIR_FOR_TRAP}"
|
|
560
|
+
if [[ -n "${rid}" && -n "${odir}" ]]; then
|
|
561
|
+
rm -f \
|
|
562
|
+
"${odir}/${rid}.jsonl" \
|
|
563
|
+
"${odir}/${rid}.meta.json" \
|
|
564
|
+
"${odir}/${rid}.meta.json.tmp" \
|
|
565
|
+
"${odir}/${rid}.verdict.yaml" \
|
|
566
|
+
"${odir}/${rid}.verdict.yaml.tmp" \
|
|
567
|
+
"${odir}/${rid}.audit_artifact_entry.json" \
|
|
568
|
+
"${odir}/${rid}.audit_artifact_entry.json.tmp" \
|
|
569
|
+
"${odir}/${rid}.stdout" \
|
|
570
|
+
"${odir}/${rid}.stderr" \
|
|
571
|
+
"${odir}/${rid}.manifest.txt" 2>/dev/null || true
|
|
572
|
+
fi
|
|
573
|
+
printf '[run_codex_audit] caught signal; cleaned up partial artifacts; exiting 75\n' >&2
|
|
574
|
+
exit 75
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
trap '_cleanup_on_signal' SIGTERM SIGINT
|
|
578
|
+
|
|
579
|
+
# F-010 (§3.6): EXIT trap removes partial .tmp artifacts left by any aborted
|
|
580
|
+
# _atomic_write call. Preserves final contract files (no .tmp suffix).
|
|
581
|
+
# Coexists with SIGTERM/SIGINT trap above — EXIT fires after signal handler exits.
|
|
582
|
+
_cleanup_partials_on_exit() {
|
|
583
|
+
if [[ -n "${run_id:-}" && -n "${OUT_DIR:-}" ]]; then
|
|
584
|
+
rm -f "${OUT_DIR}/${run_id}".*.tmp 2>/dev/null || true
|
|
585
|
+
fi
|
|
586
|
+
}
|
|
587
|
+
trap '_cleanup_partials_on_exit' EXIT
|
|
588
|
+
|
|
589
|
+
# ---------------------------------------------------------------------------
|
|
590
|
+
# Setup: run_id, output dir, codex version, git metadata
|
|
591
|
+
# ---------------------------------------------------------------------------
|
|
592
|
+
# Note: path normalization + validation (DELIVERABLE, SUPPORTING, OUT_DIR)
|
|
593
|
+
# was moved above Step 0a (F-016 fix) — paths are already normalized here.
|
|
594
|
+
run_id=$(_make_run_id)
|
|
595
|
+
_CURRENT_RUN_ID="${run_id}"
|
|
596
|
+
|
|
597
|
+
# F-010 (§3.6): normalize mkdir failure to EX_CANTCREAT 73.
|
|
598
|
+
# mkdir intentionally stays AFTER dry-run: dry-run must be side-effect-free.
|
|
599
|
+
if ! mkdir -p "${OUT_DIR}" 2>/dev/null; then
|
|
600
|
+
printf '[run_codex_audit] error: cannot create output dir: %s\n' "${OUT_DIR}" >&2
|
|
601
|
+
exit 73
|
|
602
|
+
fi
|
|
603
|
+
_OUT_DIR_FOR_TRAP="${OUT_DIR}"
|
|
604
|
+
|
|
605
|
+
CODEX_VERSION=$(_codex_version)
|
|
606
|
+
GIT_SHA=$(git rev-parse --short HEAD 2>/dev/null || printf 'unknown')
|
|
607
|
+
GIT_DIRTY=$(_git_dirty)
|
|
608
|
+
HOSTNAME_VAL=$(uname -n)
|
|
609
|
+
CWD_VAL=$(pwd)
|
|
610
|
+
|
|
611
|
+
# Primary deliverable array (always exactly one element)
|
|
612
|
+
declare -a PRIMARY=("${DELIVERABLE}")
|
|
613
|
+
|
|
614
|
+
# ---------------------------------------------------------------------------
|
|
615
|
+
# F-018 (§3.6): Reject binary/NUL inputs before snapshot.
|
|
616
|
+
# ---------------------------------------------------------------------------
|
|
617
|
+
# Step 0b — snapshot bundle (DELEGATED TO scripts/audit_snapshot.py).
|
|
618
|
+
#
|
|
619
|
+
# Round 5 architectural redesign: the Bash-side snapshot helper had three
|
|
620
|
+
# structural failures across rounds 1-5 of codex review:
|
|
621
|
+
#
|
|
622
|
+
# F-004 (5 rounds partial): Bash command substitution runs the helper in a
|
|
623
|
+
# subshell, so global SHA assignment didn't propagate to the parent.
|
|
624
|
+
# F-018 (Round 4 fix broke wrapper): grep -q $'\0' is empty pattern → all
|
|
625
|
+
# non-empty files rejected as binary.
|
|
626
|
+
# F-020 (trailing newline drift): $(cat file) strips \n; manifest SHA from
|
|
627
|
+
# in-memory content drifts from sha256sum(file) → Step 3a false-positive.
|
|
628
|
+
#
|
|
629
|
+
# All three are eliminated by moving byte-exact operations to Python:
|
|
630
|
+
# - Single read per file (no TOCTOU window)
|
|
631
|
+
# - Binary-safe NUL detection (b"\0" in content)
|
|
632
|
+
# - hashlib.sha256(file_bytes) matches sha256sum(file) exactly
|
|
633
|
+
#
|
|
634
|
+
# scripts/audit_snapshot.py snapshot mode:
|
|
635
|
+
# - Reads all bundle files as bytes (binary-safe)
|
|
636
|
+
# - Rejects NUL-containing files (exit 64)
|
|
637
|
+
# - Computes per-file SHA-256 + bundle manifest SHA from same bytes
|
|
638
|
+
# - Writes <run_id>.manifest.txt and <run_id>.prompt.txt
|
|
639
|
+
# - Emits JSON summary to stdout for the wrapper to consume
|
|
640
|
+
#
|
|
641
|
+
# Step 3a uses scripts/audit_snapshot.py verify mode against the same manifest;
|
|
642
|
+
# their SHAs match exactly (no trailing-newline drift).
|
|
643
|
+
# ---------------------------------------------------------------------------
|
|
644
|
+
|
|
645
|
+
# F-021 (§3.6) closure: dedup --previous-findings against SUPPORTING after
|
|
646
|
+
# normalization (which the wrapper does upstream). audit_snapshot.py also
|
|
647
|
+
# dedupes internally; doing it here too prevents the manifest from listing
|
|
648
|
+
# the same file under both --supporting and --previous-findings paths.
|
|
649
|
+
if [[ -n "${PREV_FINDINGS}" ]]; then
|
|
650
|
+
_already_in_supporting=0
|
|
651
|
+
for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
|
|
652
|
+
if [[ "${_s}" = "${PREV_FINDINGS}" ]]; then
|
|
653
|
+
_already_in_supporting=1
|
|
654
|
+
break
|
|
655
|
+
fi
|
|
656
|
+
done
|
|
657
|
+
if [[ "${_already_in_supporting}" -eq 0 ]]; then
|
|
658
|
+
SUPPORTING+=("${PREV_FINDINGS}")
|
|
659
|
+
fi
|
|
660
|
+
fi
|
|
661
|
+
|
|
662
|
+
# Build snapshot CLI args (--primary repeated, --supporting repeated)
|
|
663
|
+
_snap_args=()
|
|
664
|
+
for _p in "${PRIMARY[@]}"; do
|
|
665
|
+
_snap_args+=("--primary" "${_p}")
|
|
666
|
+
done
|
|
667
|
+
for _s in "${SUPPORTING[@]+"${SUPPORTING[@]}"}"; do
|
|
668
|
+
_snap_args+=("--supporting" "${_s}")
|
|
669
|
+
done
|
|
670
|
+
|
|
671
|
+
# Run snapshot helper. Capture JSON summary on stdout, errors on stderr.
|
|
672
|
+
SNAPSHOT_JSON_FILE="${OUT_DIR}/${run_id}.snapshot.tmp"
|
|
673
|
+
SNAPSHOT_STDERR_FILE="${OUT_DIR}/${run_id}.snapshot_stderr.tmp"
|
|
674
|
+
set +e
|
|
675
|
+
_prev_findings_arg=()
|
|
676
|
+
if [[ -n "${PREV_FINDINGS}" ]]; then
|
|
677
|
+
_prev_findings_arg=(--previous-findings "${PREV_FINDINGS}")
|
|
678
|
+
fi
|
|
679
|
+
|
|
680
|
+
python3 scripts/audit_snapshot.py snapshot \
|
|
681
|
+
"${_snap_args[@]}" \
|
|
682
|
+
"${_prev_findings_arg[@]+"${_prev_findings_arg[@]}"}" \
|
|
683
|
+
--audit-template "${AUDIT_TEMPLATE_PATH}" \
|
|
684
|
+
--output-dir "${OUT_DIR}" \
|
|
685
|
+
--run-id "${run_id}" \
|
|
686
|
+
--round "${ROUND}" \
|
|
687
|
+
--target-rounds "${TARGET_ROUNDS}" \
|
|
688
|
+
--git-sha "${GIT_SHA}" \
|
|
689
|
+
--stage "${STAGE}" \
|
|
690
|
+
--agent "${AGENT}" \
|
|
691
|
+
> "${SNAPSHOT_JSON_FILE}" \
|
|
692
|
+
2> "${SNAPSHOT_STDERR_FILE}"
|
|
693
|
+
SNAPSHOT_EXIT=$?
|
|
694
|
+
set -e
|
|
695
|
+
|
|
696
|
+
if [[ "${SNAPSHOT_EXIT}" -ne 0 ]]; then
|
|
697
|
+
# Forward Python error to user. exit 64 (NUL detection / bad args) propagates;
|
|
698
|
+
# exit 2 (file not found / OSError) we surface as exit 73 (EX_CANTCREAT).
|
|
699
|
+
cat "${SNAPSHOT_STDERR_FILE}" >&2
|
|
700
|
+
rm -f "${SNAPSHOT_JSON_FILE}" "${SNAPSHOT_STDERR_FILE}"
|
|
701
|
+
case "${SNAPSHOT_EXIT}" in
|
|
702
|
+
64) exit 64 ;;
|
|
703
|
+
2) exit 73 ;;
|
|
704
|
+
*) exit "${SNAPSHOT_EXIT}" ;;
|
|
705
|
+
esac
|
|
706
|
+
fi
|
|
707
|
+
|
|
708
|
+
# Parse JSON summary into Bash variables. Use python3 for reliable JSON access
|
|
709
|
+
# (jq might not be present; we already require python3 in §4.1 dependency table).
|
|
710
|
+
BUNDLE_MANIFEST_SHA=$(python3 -c "
|
|
711
|
+
import json, sys
|
|
712
|
+
d = json.load(open(sys.argv[1]))
|
|
713
|
+
print(d['manifest_sha'])
|
|
714
|
+
" "${SNAPSHOT_JSON_FILE}")
|
|
715
|
+
|
|
716
|
+
AUDIT_TEMPLATE_SHA_PRE=$(python3 -c "
|
|
717
|
+
import json, sys
|
|
718
|
+
d = json.load(open(sys.argv[1]))
|
|
719
|
+
print(d['audit_template_sha'])
|
|
720
|
+
" "${SNAPSHOT_JSON_FILE}")
|
|
721
|
+
|
|
722
|
+
SHA_DELIVERABLE=$(python3 -c "
|
|
723
|
+
import json, sys
|
|
724
|
+
d = json.load(open(sys.argv[1]))
|
|
725
|
+
print(d['primary_files'][0]['sha'])
|
|
726
|
+
" "${SNAPSHOT_JSON_FILE}")
|
|
727
|
+
|
|
728
|
+
SNAPSHOT_PROMPT_PATH="${OUT_DIR}/${run_id}.prompt.txt"
|
|
729
|
+
SNAPSHOT_MANIFEST_PATH="${OUT_DIR}/${run_id}.manifest.txt"
|
|
730
|
+
|
|
731
|
+
# Clean up temp files (manifest.txt and prompt.txt remain — they're contract artifacts)
|
|
732
|
+
rm -f "${SNAPSHOT_STDERR_FILE}"
|
|
733
|
+
# Keep SNAPSHOT_JSON_FILE for sidecar emission (need to enumerate primary/supporting).
|
|
734
|
+
|
|
735
|
+
# Initialize mutation state. Step 3a (post-codex SHA recompute) may set these.
|
|
736
|
+
# Declaring here ensures BUNDLE_MUTATION_FILES is always an array.
|
|
737
|
+
BUNDLE_MUTATION_DETECTED=0
|
|
738
|
+
declare -a BUNDLE_MUTATION_FILES=()
|
|
739
|
+
|
|
740
|
+
# ---------------------------------------------------------------------------
|
|
741
|
+
# Step 1 — prompt rendered by audit_snapshot.py (Step 0b above) into
|
|
742
|
+
# <run_id>.prompt.txt. The Bash wrapper feeds it to codex stdin via shell
|
|
743
|
+
# redirection in Step 2b. No template-rendering logic in Bash anymore — that
|
|
744
|
+
# moved to Python alongside the byte-exact snapshot, so the prompt embeds
|
|
745
|
+
# exactly the snapshotted bytes (no trailing-newline drift, no second cat).
|
|
746
|
+
# ---------------------------------------------------------------------------
|
|
747
|
+
|
|
748
|
+
# ---------------------------------------------------------------------------
|
|
749
|
+
# Step 0c — REMOVED in Round 5 architecture.
|
|
750
|
+
# Bash-side TOCTOU defenses (Steps 0b/0c partial across rounds 1-5) are gone.
|
|
751
|
+
# audit_snapshot.py reads each file ONCE and computes both SHA and prompt bytes
|
|
752
|
+
# from the same read — there is no second-read window to defend against.
|
|
753
|
+
# Step 3a (post-codex) still detects post-snapshot disk mutations.
|
|
754
|
+
# ---------------------------------------------------------------------------
|
|
755
|
+
PRE_CODEX_MUTATION_DETECTED=0 # no pre-codex check needed; kept for Step 2b gate
|
|
756
|
+
|
|
757
|
+
# ---------------------------------------------------------------------------
|
|
758
|
+
# Step 2a — pre-touch empty JSONL placeholder (F-059 closure).
|
|
759
|
+
# This ensures the file exists at its final path even if codex is killed before
|
|
760
|
+
# emitting any output. AUDIT_FAILED verdict referencing an empty JSONL is
|
|
761
|
+
# handled correctly by §5.6 Path B5 short-circuit without Layer 2 validation.
|
|
762
|
+
#
|
|
763
|
+
# F-010 (§3.6): guard the pre-touch; a failure here (permissions, disk full)
|
|
764
|
+
# means the JSONL path would never be created, breaking the artifact invariant
|
|
765
|
+
# E8. Exit 73 (EX_CANTCREAT) to signal the output directory is unusable.
|
|
766
|
+
# ---------------------------------------------------------------------------
|
|
767
|
+
if ! : > "${OUT_DIR}/${run_id}.jsonl" 2>/dev/null; then
|
|
768
|
+
printf '[run_codex_audit] error: cannot create jsonl placeholder: %s\n' \
|
|
769
|
+
"${OUT_DIR}/${run_id}.jsonl" >&2
|
|
770
|
+
exit 73
|
|
771
|
+
fi
|
|
772
|
+
|
|
773
|
+
# ---------------------------------------------------------------------------
|
|
774
|
+
# Step 2b — invoke codex CLI.
|
|
775
|
+
#
|
|
776
|
+
# Skipped when PRE_CODEX_MUTATION_DETECTED=1 (Step 0c, F-004): bundle was
|
|
777
|
+
# mutated between SHA snapshot and prompt render; no codex invocation needed
|
|
778
|
+
# since BUNDLE_MUTATION_DETECTED is already set and Step 4 will emit AUDIT_FAILED.
|
|
779
|
+
#
|
|
780
|
+
# We use a real pipeline + ${PIPESTATUS[@]}, NOT process substitution
|
|
781
|
+
# `> >(tee ...)`, because:
|
|
782
|
+
# 1. Process substitution hides tee's exit status (wrapper never knows if
|
|
783
|
+
# tee failed — disk full / EIO would silently corrupt the JSONL artifact).
|
|
784
|
+
# 2. Process substitution races on draining: orchestrator can read the JSONL
|
|
785
|
+
# before the tee subshell flushes.
|
|
786
|
+
# 3. PIPESTATUS captures both codex exit (pipe[0]) AND tee exit (pipe[1]).
|
|
787
|
+
#
|
|
788
|
+
# `set +e` is required because pipefail would abort on codex's non-zero exit
|
|
789
|
+
# before ${PIPESTATUS[@]} is captured. We re-enable after capture.
|
|
790
|
+
#
|
|
791
|
+
# This is `codex exec`, not `codex exec resume` — every audit run starts a
|
|
792
|
+
# fresh thread; the wrapper never resumes a prior thread.
|
|
793
|
+
# ---------------------------------------------------------------------------
|
|
794
|
+
STARTED_AT=$(_now_rfc3339_ms)
|
|
795
|
+
CODEX_EXIT=0
|
|
796
|
+
TEE_EXIT=0
|
|
797
|
+
|
|
798
|
+
if [[ "${PRE_CODEX_MUTATION_DETECTED}" -eq 0 ]]; then
|
|
799
|
+
set +e
|
|
800
|
+
codex exec \
|
|
801
|
+
-m gpt-5.5 \
|
|
802
|
+
-c 'model_reasoning_effort="xhigh"' \
|
|
803
|
+
--json \
|
|
804
|
+
- \
|
|
805
|
+
2> "${OUT_DIR}/${run_id}.stderr" \
|
|
806
|
+
< "${SNAPSHOT_PROMPT_PATH}" \
|
|
807
|
+
| tee "${OUT_DIR}/${run_id}.stdout" > "${OUT_DIR}/${run_id}.jsonl"
|
|
808
|
+
pipe=("${PIPESTATUS[@]}")
|
|
809
|
+
CODEX_EXIT="${pipe[0]}"
|
|
810
|
+
TEE_EXIT="${pipe[1]}"
|
|
811
|
+
set -e
|
|
812
|
+
fi
|
|
813
|
+
|
|
814
|
+
ENDED_AT=$(_now_rfc3339_ms)
|
|
815
|
+
|
|
816
|
+
# tee write failure → EX_CANTCREAT (73): JSONL integrity not guaranteed.
|
|
817
|
+
# Clean up all partial artifacts so orchestrator never sees a sidecar/verdict/
|
|
818
|
+
# proposal pointing at a corrupt JSONL.
|
|
819
|
+
if [[ "${TEE_EXIT}" -ne 0 ]]; then
|
|
820
|
+
rm -f \
|
|
821
|
+
"${OUT_DIR}/${run_id}.jsonl" \
|
|
822
|
+
"${OUT_DIR}/${run_id}.stdout" \
|
|
823
|
+
"${OUT_DIR}/${run_id}.stderr" \
|
|
824
|
+
"${OUT_DIR}/${run_id}.manifest.txt" 2>/dev/null || true
|
|
825
|
+
printf '[run_codex_audit] error: tee write failed (exit %s); JSONL artifact may be corrupt\n' \
|
|
826
|
+
"${TEE_EXIT}" >&2
|
|
827
|
+
exit 73
|
|
828
|
+
fi
|
|
829
|
+
|
|
830
|
+
# ---------------------------------------------------------------------------
|
|
831
|
+
# Step 3a — detect post-snapshot disk mutation via audit_snapshot.py verify.
|
|
832
|
+
# Compares each manifest entry's recorded SHA against current file content.
|
|
833
|
+
# Round 5 redesign: byte-exact comparison via Python (hashlib reads disk bytes
|
|
834
|
+
# verbatim), so manifest SHA and recompute SHA agree on trailing-newline
|
|
835
|
+
# semantics — F-020 false-positive (Bash strips \n, sha256sum doesn't) is gone.
|
|
836
|
+
#
|
|
837
|
+
# Output: list of mutated paths to stdout (one per line) on exit 1; empty
|
|
838
|
+
# stdout on exit 0 (no mutation).
|
|
839
|
+
# ---------------------------------------------------------------------------
|
|
840
|
+
VERIFY_OUT_FILE="${OUT_DIR}/${run_id}.verify_stdout.tmp"
|
|
841
|
+
set +e
|
|
842
|
+
python3 scripts/audit_snapshot.py verify \
|
|
843
|
+
--manifest "${SNAPSHOT_MANIFEST_PATH}" \
|
|
844
|
+
> "${VERIFY_OUT_FILE}" \
|
|
845
|
+
2>/dev/null
|
|
846
|
+
VERIFY_EXIT=$?
|
|
847
|
+
set -e
|
|
848
|
+
|
|
849
|
+
if [[ "${VERIFY_EXIT}" -eq 1 ]]; then
|
|
850
|
+
# Mutation detected — read mutated paths from stdout.
|
|
851
|
+
while IFS= read -r _mutated_path; do
|
|
852
|
+
if [[ -n "${_mutated_path}" ]]; then
|
|
853
|
+
BUNDLE_MUTATION_DETECTED=1
|
|
854
|
+
BUNDLE_MUTATION_FILES+=("${_mutated_path}")
|
|
855
|
+
fi
|
|
856
|
+
done < "${VERIFY_OUT_FILE}"
|
|
857
|
+
elif [[ "${VERIFY_EXIT}" -ne 0 ]]; then
|
|
858
|
+
# F-024 (P2, R6): verify internal error must NOT pass through to PASS/MINOR/MATERIAL.
|
|
859
|
+
# If we cannot run the post-snapshot freshness check, treat the audit as
|
|
860
|
+
# AUDIT_FAILED — orchestrator must not assume "no mutation" from "verify
|
|
861
|
+
# could not run". §4.6 contract: AUDIT_FAILED proposal blocks transition.
|
|
862
|
+
BUNDLE_MUTATION_DETECTED=1
|
|
863
|
+
BUNDLE_MUTATION_FILES+=("(audit_snapshot.py verify failed: exit ${VERIFY_EXIT})")
|
|
864
|
+
printf '[run_codex_audit] error: audit_snapshot verify failed (exit %s); forcing AUDIT_FAILED\n' "${VERIFY_EXIT}" >&2
|
|
865
|
+
fi
|
|
866
|
+
rm -f "${VERIFY_OUT_FILE}"
|
|
867
|
+
|
|
868
|
+
# Step 3b: bundle_manifest_sha stays pinned to the PRE-codex value (Step 0b).
|
|
869
|
+
# The orchestrator's L3-4 check compares current-state SHAs against the
|
|
870
|
+
# manifest written at audit time — updating it post-mutation would silently
|
|
871
|
+
# accept a stale audit.
|
|
872
|
+
|
|
873
|
+
# ---------------------------------------------------------------------------
|
|
874
|
+
# Step 3c — write sidecar (atomic). §3.4 / §4.3.
|
|
875
|
+
# All timestamps, versions, and bundle context captured here for Layer 3
|
|
876
|
+
# anti-fake-audit evidence.
|
|
877
|
+
# ---------------------------------------------------------------------------
|
|
878
|
+
DURATION_S=$(_duration_seconds "${STARTED_AT}" "${ENDED_AT}")
|
|
879
|
+
JSONL_THREAD_ID=$(_extract_jsonl_thread_id "${OUT_DIR}/${run_id}.jsonl")
|
|
880
|
+
|
|
881
|
+
# Build JSON arrays for primary and supporting deliverables.
|
|
882
|
+
# Sources from the SNAPSHOT_JSON_FILE (audit_snapshot.py output) — same shape
|
|
883
|
+
# the schema requires: [{path, sha}, ...].
|
|
884
|
+
_primary_deliverables_json() {
|
|
885
|
+
python3 -c "
|
|
886
|
+
import json, sys
|
|
887
|
+
d = json.load(open(sys.argv[1]))
|
|
888
|
+
print(json.dumps([{'path': f['path'], 'sha': f['sha']} for f in d['primary_files']]))
|
|
889
|
+
" "${SNAPSHOT_JSON_FILE}"
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
_supporting_context_json() {
|
|
893
|
+
python3 -c "
|
|
894
|
+
import json, sys
|
|
895
|
+
d = json.load(open(sys.argv[1]))
|
|
896
|
+
print(json.dumps([{'path': f['path'], 'sha': f['sha']} for f in d['supporting_files']]))
|
|
897
|
+
" "${SNAPSHOT_JSON_FILE}"
|
|
898
|
+
}
|
|
899
|
+
|
|
900
|
+
# stdout_path and stderr_path: repo-relative POSIX paths (no leading /, no ..)
|
|
901
|
+
# OUT_DIR may be absolute or relative; we normalise to repo-relative by
|
|
902
|
+
# stripping the CWD prefix if it matches, or using as-is if already relative.
|
|
903
|
+
_repo_relative_out_path() {
|
|
904
|
+
local full="${OUT_DIR}/${run_id}.${1}"
|
|
905
|
+
# If OUT_DIR starts with /, attempt to strip CWD prefix
|
|
906
|
+
if [[ "${full}" == /* ]]; then
|
|
907
|
+
local cwd_prefix="${CWD_VAL}/"
|
|
908
|
+
full="${full#"${cwd_prefix}"}"
|
|
909
|
+
fi
|
|
910
|
+
# Remove leading ./ if present
|
|
911
|
+
full="${full#./}"
|
|
912
|
+
printf '%s' "${full}"
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
STDOUT_PATH=$(_repo_relative_out_path "stdout")
|
|
916
|
+
STDERR_PATH=$(_repo_relative_out_path "stderr")
|
|
917
|
+
|
|
918
|
+
# Optional bundle_id field in sidecar
|
|
919
|
+
_bundle_id_sidecar_field=""
|
|
920
|
+
if [[ -n "${BUNDLE_ID}" ]]; then
|
|
921
|
+
_bundle_id_sidecar_field="\"bundle_id\":$(_json_escape "${BUNDLE_ID}"),"
|
|
922
|
+
fi
|
|
923
|
+
|
|
924
|
+
_sidecar_json() {
|
|
925
|
+
cat <<EOF
|
|
926
|
+
{
|
|
927
|
+
"run_id": $(_json_escape "${run_id}"),
|
|
928
|
+
"codex_cli_version": $(_json_escape "${CODEX_VERSION}"),
|
|
929
|
+
"runner": {
|
|
930
|
+
"hostname": $(_json_escape "${HOSTNAME_VAL}"),
|
|
931
|
+
"cwd": $(_json_escape "${CWD_VAL}"),
|
|
932
|
+
"git_sha": $(_json_escape "${GIT_SHA}"),
|
|
933
|
+
"git_dirty": ${GIT_DIRTY}
|
|
934
|
+
},
|
|
935
|
+
"timing": {
|
|
936
|
+
"started_at": $(_json_escape "${STARTED_AT}"),
|
|
937
|
+
"ended_at": $(_json_escape "${ENDED_AT}"),
|
|
938
|
+
"duration_seconds": ${DURATION_S}
|
|
939
|
+
},
|
|
940
|
+
"process": {
|
|
941
|
+
"exit_code": ${CODEX_EXIT},
|
|
942
|
+
"stdout_path": $(_json_escape "${STDOUT_PATH}"),
|
|
943
|
+
"stderr_path": $(_json_escape "${STDERR_PATH}")
|
|
944
|
+
},
|
|
945
|
+
"stream": {
|
|
946
|
+
"jsonl_thread_id": $(_json_escape "${JSONL_THREAD_ID}")
|
|
947
|
+
},
|
|
948
|
+
"prompt": {
|
|
949
|
+
"audit_template_path": $(_json_escape "${AUDIT_TEMPLATE_PATH}"),
|
|
950
|
+
"audit_template_sha": $(_json_escape "${AUDIT_TEMPLATE_SHA_PRE}"),
|
|
951
|
+
"bundle": {
|
|
952
|
+
${_bundle_id_sidecar_field}
|
|
953
|
+
"bundle_manifest_sha": $(_json_escape "${BUNDLE_MANIFEST_SHA}"),
|
|
954
|
+
"primary_deliverables": $(_primary_deliverables_json),
|
|
955
|
+
"supporting_context": $(_supporting_context_json)
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
EOF
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
_sidecar_json | _atomic_write "${OUT_DIR}/${run_id}.meta.json"
|
|
963
|
+
|
|
964
|
+
# ---------------------------------------------------------------------------
|
|
965
|
+
# Step 4 — produce verdict file.
|
|
966
|
+
# Three triggers force the AUDIT_FAILED branch:
|
|
967
|
+
# (a) codex exited non-zero
|
|
968
|
+
# (b) parse_audit_verdict.py --probe rejects the JSONL
|
|
969
|
+
# (c) bundle mutation detected in Step 3a
|
|
970
|
+
# wrapper_exit_code starts as codex's actual exit; AUDIT_FAILED path may
|
|
971
|
+
# raise it to 70 when codex itself exited 0 (cases b and c).
|
|
972
|
+
# ---------------------------------------------------------------------------
|
|
973
|
+
WRAPPER_EXIT_CODE="${CODEX_EXIT}"
|
|
974
|
+
|
|
975
|
+
# _truncate_failure_reason <string>
|
|
976
|
+
# F-008 (§3.1): failure_reason maxLength is 500 per audit_verdict.schema.json,
|
|
977
|
+
# and the schema regex rejects multi-line strings (^[^\n\r]+$). Truncate to 497
|
|
978
|
+
# chars with ellipsis and strip embedded newlines/carriage-returns.
|
|
979
|
+
_truncate_failure_reason() {
|
|
980
|
+
local s="$1"
|
|
981
|
+
# Strip newlines/CRs — schema regex ^[^\n\r]+$ rejects multi-line values
|
|
982
|
+
s=$(printf '%s' "${s}" | tr -d '\n\r')
|
|
983
|
+
if [[ "${#s}" -gt 500 ]]; then
|
|
984
|
+
printf '%s...' "${s:0:497}"
|
|
985
|
+
else
|
|
986
|
+
printf '%s' "${s}"
|
|
987
|
+
fi
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
# Helper: synthesize a failure reason from codex exit code + stderr tail
|
|
991
|
+
_synthesize_failure_reason() {
|
|
992
|
+
local exit_code="$1"
|
|
993
|
+
local stderr_path="$2"
|
|
994
|
+
local tail_msg=""
|
|
995
|
+
if [[ -s "${stderr_path}" ]]; then
|
|
996
|
+
# Take last non-empty line as context
|
|
997
|
+
tail_msg=$(grep -v '^[[:space:]]*$' "${stderr_path}" 2>/dev/null | tail -1 || true)
|
|
998
|
+
fi
|
|
999
|
+
local reason=""
|
|
1000
|
+
if [[ -n "${tail_msg}" ]]; then
|
|
1001
|
+
reason=$(printf 'codex exit %s: %s' "${exit_code}" "${tail_msg}")
|
|
1002
|
+
else
|
|
1003
|
+
reason=$(printf 'codex exit %s' "${exit_code}")
|
|
1004
|
+
fi
|
|
1005
|
+
# F-008: apply truncation and newline-strip before returning
|
|
1006
|
+
_truncate_failure_reason "${reason}"
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
# Helper: emit an AUDIT_FAILED verdict YAML.
|
|
1010
|
+
# Reuses ENDED_AT (already captured post-codex) for generated_at to avoid a
|
|
1011
|
+
# second python3 fork purely for timestamp generation.
|
|
1012
|
+
_emit_audit_failed_verdict() {
|
|
1013
|
+
local failure_reason="$1"
|
|
1014
|
+
cat <<EOF
|
|
1015
|
+
run_id: $(_yaml_escape_oneline "${run_id}")
|
|
1016
|
+
verdict_status: AUDIT_FAILED
|
|
1017
|
+
round: ${ROUND}
|
|
1018
|
+
target_rounds: ${TARGET_ROUNDS}
|
|
1019
|
+
finding_counts:
|
|
1020
|
+
p1: 0
|
|
1021
|
+
p2: 0
|
|
1022
|
+
p3: 0
|
|
1023
|
+
findings: []
|
|
1024
|
+
failure_reason: $(_yaml_escape_oneline "${failure_reason}")
|
|
1025
|
+
generated_at: $(_yaml_escape_oneline "${ENDED_AT}")
|
|
1026
|
+
generated_by: 'scripts/run_codex_audit.sh'
|
|
1027
|
+
generator_version: '1.0.0'
|
|
1028
|
+
EOF
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
# Helper: parse finding_counts from verdict YAML emitted by parse_audit_verdict.py
|
|
1032
|
+
_parse_verdict_counts_from_yaml() {
|
|
1033
|
+
local verdict_path="$1"
|
|
1034
|
+
python3 -c "
|
|
1035
|
+
import sys, re
|
|
1036
|
+
|
|
1037
|
+
content = open(sys.argv[1]).read()
|
|
1038
|
+
|
|
1039
|
+
def extract_int(key, text):
|
|
1040
|
+
m = re.search(r'^\s*' + key + r'\s*:\s*(\d+)', text, re.MULTILINE)
|
|
1041
|
+
return int(m.group(1)) if m else 0
|
|
1042
|
+
|
|
1043
|
+
p1 = extract_int('p1', content)
|
|
1044
|
+
p2 = extract_int('p2', content)
|
|
1045
|
+
p3 = extract_int('p3', content)
|
|
1046
|
+
|
|
1047
|
+
# Extract verdict_status
|
|
1048
|
+
sm = re.search(r'^\s*verdict_status\s*:\s*(\S+)', content, re.MULTILINE)
|
|
1049
|
+
status = sm.group(1).strip(\"'\") if sm else 'AUDIT_FAILED'
|
|
1050
|
+
|
|
1051
|
+
print('{} {} {} {}'.format(status, p1, p2, p3))
|
|
1052
|
+
" "${verdict_path}"
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
AUDIT_FAILED_REASON=""
|
|
1056
|
+
|
|
1057
|
+
# F-007 (§3.6): capture probe stderr explicitly so the actual parser rejection
|
|
1058
|
+
# reason (e.g. "no agent_message in stream", "stream contains error event") is
|
|
1059
|
+
# preserved in AUDIT_FAILED_REASON rather than a hardcoded fallback string.
|
|
1060
|
+
_probe_stderr=""
|
|
1061
|
+
_probe_exit=0
|
|
1062
|
+
_probe_stderr=$(python3 scripts/parse_audit_verdict.py \
|
|
1063
|
+
--probe "${OUT_DIR}/${run_id}.jsonl" 2>&1 >/dev/null) \
|
|
1064
|
+
|| _probe_exit=$?
|
|
1065
|
+
|
|
1066
|
+
if [[ "${CODEX_EXIT}" -eq 0 ]] \
|
|
1067
|
+
&& [[ "${BUNDLE_MUTATION_DETECTED}" -eq 0 ]] \
|
|
1068
|
+
&& [[ "${_probe_exit}" -eq 0 ]]; then
|
|
1069
|
+
# Clean path: codex exited 0, bundle stable, JSONL probe passed.
|
|
1070
|
+
# F-003 (§3.6): capture full parser stdout/stderr/exit BEFORE piping to
|
|
1071
|
+
# _atomic_write. If full parse fails after probe passed (cross-validation
|
|
1072
|
+
# disagreement, malformed finding entry, etc.), fall through to AUDIT_FAILED
|
|
1073
|
+
# rather than writing a partial verdict.yaml.tmp and aborting mid-rename.
|
|
1074
|
+
_verdict_yaml_content=""
|
|
1075
|
+
# F-010 (§3.6) Round 3: eliminate mktemp dependency — use a deterministic path
|
|
1076
|
+
# under OUT_DIR so the file is (a) always writable when OUT_DIR is writable and
|
|
1077
|
+
# (b) cleaned up automatically by the EXIT trap (_cleanup_partials_on_exit removes
|
|
1078
|
+
# "${OUT_DIR}/${run_id}".*.tmp). Round 2 used mktemp /tmp/... which could fail
|
|
1079
|
+
# with EX_CANTCREAT 73 when /tmp is full or permission-denied, aborting the wrapper
|
|
1080
|
+
# before AUDIT_FAILED artifacts are written — violating §4.6 invariant E8.
|
|
1081
|
+
_full_parse_stderr_file="${OUT_DIR}/${run_id}.parse_stderr.tmp"
|
|
1082
|
+
if _verdict_yaml_content=$(python3 scripts/parse_audit_verdict.py \
|
|
1083
|
+
--jsonl "${OUT_DIR}/${run_id}.jsonl" \
|
|
1084
|
+
--round "${ROUND}" \
|
|
1085
|
+
--target-rounds "${TARGET_ROUNDS}" \
|
|
1086
|
+
2>"${_full_parse_stderr_file}"); then
|
|
1087
|
+
printf '%s' "${_verdict_yaml_content}" | _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
|
|
1088
|
+
rm -f "${_full_parse_stderr_file}"
|
|
1089
|
+
else
|
|
1090
|
+
_full_parse_stderr=$(cat "${_full_parse_stderr_file}" 2>/dev/null || true)
|
|
1091
|
+
rm -f "${_full_parse_stderr_file}"
|
|
1092
|
+
# F-003: full parse failed after probe passed — fall through to AUDIT_FAILED
|
|
1093
|
+
# so proposal entry is still written (invariant E8) and orchestrator sees a
|
|
1094
|
+
# complete artifact set instead of a missing verdict. F-008 truncation applied.
|
|
1095
|
+
AUDIT_FAILED_REASON=$(_truncate_failure_reason \
|
|
1096
|
+
"JSONL parse error: ${_full_parse_stderr:-full parse failed after probe passed}")
|
|
1097
|
+
_emit_audit_failed_verdict "${AUDIT_FAILED_REASON}" \
|
|
1098
|
+
| _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
|
|
1099
|
+
if [[ "${WRAPPER_EXIT_CODE}" -eq 0 ]]; then
|
|
1100
|
+
WRAPPER_EXIT_CODE=70
|
|
1101
|
+
fi
|
|
1102
|
+
fi
|
|
1103
|
+
else
|
|
1104
|
+
# AUDIT_FAILED path: determine failure reason
|
|
1105
|
+
if [[ "${BUNDLE_MUTATION_DETECTED}" -eq 1 ]]; then
|
|
1106
|
+
AUDIT_FAILED_REASON=$(_truncate_failure_reason \
|
|
1107
|
+
"bundle file(s) mutated during audit run: ${BUNDLE_MUTATION_FILES[*]}")
|
|
1108
|
+
elif [[ "${CODEX_EXIT}" -ne 0 ]]; then
|
|
1109
|
+
AUDIT_FAILED_REASON=$(_synthesize_failure_reason \
|
|
1110
|
+
"${CODEX_EXIT}" "${OUT_DIR}/${run_id}.stderr")
|
|
1111
|
+
else
|
|
1112
|
+
# F-007: codex exit 0 but --probe rejected the JSONL — use captured stderr
|
|
1113
|
+
# for the actual rejection message rather than a hardcoded fallback string.
|
|
1114
|
+
AUDIT_FAILED_REASON=$(_truncate_failure_reason \
|
|
1115
|
+
"JSONL parse error: ${_probe_stderr:-no parseable agent_message found in JSONL stream}")
|
|
1116
|
+
fi
|
|
1117
|
+
|
|
1118
|
+
_emit_audit_failed_verdict "${AUDIT_FAILED_REASON}" \
|
|
1119
|
+
| _atomic_write "${OUT_DIR}/${run_id}.verdict.yaml"
|
|
1120
|
+
|
|
1121
|
+
# When codex exited 0 but wrapper rejects (cases b and c), raise to 70
|
|
1122
|
+
# so wrapper's process exit always agrees with the AUDIT_FAILED verdict
|
|
1123
|
+
# it just wrote (§4.6 contract: exit 0 ↔ PASS/MINOR/MATERIAL only).
|
|
1124
|
+
if [[ "${WRAPPER_EXIT_CODE}" -eq 0 ]]; then
|
|
1125
|
+
WRAPPER_EXIT_CODE=70
|
|
1126
|
+
fi
|
|
1127
|
+
fi
|
|
1128
|
+
|
|
1129
|
+
# ---------------------------------------------------------------------------
|
|
1130
|
+
# Step 5 — emit proposal entry (LAST write per invariant E8).
|
|
1131
|
+
# Verdict block mirrors the verdict.yaml just written.
|
|
1132
|
+
# verified_at and verified_by are NOT set — orchestrator fills them at merge.
|
|
1133
|
+
# Proposal entries carrying these fields are rejected at §5.6 Path B4
|
|
1134
|
+
# as Pattern C3 attack surface.
|
|
1135
|
+
# ---------------------------------------------------------------------------
|
|
1136
|
+
|
|
1137
|
+
# Read back the verdict status and finding counts from the just-written YAML
|
|
1138
|
+
_verdict_info=$(_parse_verdict_counts_from_yaml "${OUT_DIR}/${run_id}.verdict.yaml")
|
|
1139
|
+
read -r VERDICT_STATUS P1_COUNT P2_COUNT P3_COUNT <<< "${_verdict_info}"
|
|
1140
|
+
|
|
1141
|
+
_optional_bundle_id_entry_field=""
|
|
1142
|
+
if [[ -n "${BUNDLE_ID}" ]]; then
|
|
1143
|
+
_optional_bundle_id_entry_field="\"bundle_id\":$(_json_escape "${BUNDLE_ID}"),"
|
|
1144
|
+
fi
|
|
1145
|
+
|
|
1146
|
+
_optional_failure_reason_field=""
|
|
1147
|
+
if [[ "${VERDICT_STATUS}" = "AUDIT_FAILED" ]]; then
|
|
1148
|
+
_optional_failure_reason_field="\"failure_reason\":$(_json_escape "${AUDIT_FAILED_REASON}"),"
|
|
1149
|
+
fi
|
|
1150
|
+
|
|
1151
|
+
_proposal_entry_json() {
|
|
1152
|
+
cat <<EOF
|
|
1153
|
+
{
|
|
1154
|
+
"stage": ${STAGE},
|
|
1155
|
+
"agent": $(_json_escape "${AGENT}"),
|
|
1156
|
+
"deliverable_path": $(_json_escape "${DELIVERABLE}"),
|
|
1157
|
+
"deliverable_sha": $(_json_escape "${SHA_DELIVERABLE}"),
|
|
1158
|
+
"run_id": $(_json_escape "${run_id}"),
|
|
1159
|
+
${_optional_bundle_id_entry_field}
|
|
1160
|
+
"bundle_manifest_sha": $(_json_escape "${BUNDLE_MANIFEST_SHA}"),
|
|
1161
|
+
"artifact_paths": {
|
|
1162
|
+
"jsonl": $(_json_escape "$(_repo_relative_out_path "jsonl")"),
|
|
1163
|
+
"sidecar": $(_json_escape "$(_repo_relative_out_path "meta.json")"),
|
|
1164
|
+
"verdict": $(_json_escape "$(_repo_relative_out_path "verdict.yaml")")
|
|
1165
|
+
},
|
|
1166
|
+
"verdict": {
|
|
1167
|
+
"status": $(_json_escape "${VERDICT_STATUS}"),
|
|
1168
|
+
${_optional_failure_reason_field}
|
|
1169
|
+
"round": ${ROUND},
|
|
1170
|
+
"target_rounds": ${TARGET_ROUNDS},
|
|
1171
|
+
"finding_counts": {
|
|
1172
|
+
"p1": ${P1_COUNT},
|
|
1173
|
+
"p2": ${P2_COUNT},
|
|
1174
|
+
"p3": ${P3_COUNT}
|
|
1175
|
+
}
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
EOF
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
_proposal_entry_json | _atomic_write "${OUT_DIR}/${run_id}.audit_artifact_entry.json"
|
|
1182
|
+
|
|
1183
|
+
# ---------------------------------------------------------------------------
|
|
1184
|
+
# Step 6 — exit with wrapper_exit_code (§4.6 contract).
|
|
1185
|
+
# Orchestrator also reads proposal entry's verdict.status; the two signals
|
|
1186
|
+
# are independently consumed. A zero exit iff PASS/MINOR/MATERIAL.
|
|
1187
|
+
# ---------------------------------------------------------------------------
|
|
1188
|
+
printf '[run_codex_audit] run_id=%s verdict=%s exit=%s\n' \
|
|
1189
|
+
"${run_id}" "${VERDICT_STATUS}" "${WRAPPER_EXIT_CODE}" >&2
|
|
1190
|
+
|
|
1191
|
+
[[ "${WRAPPER_EXIT_CODE}" -eq 0 ]] && exit 0 || exit "${WRAPPER_EXIT_CODE}"
|