# Makefile — zhtw monorepo unified entry point

.PHONY: export export-check precision-benchmark benchmark-validate benchmark-competitor-build benchmark-competitor-probe benchmark-public-reproduce benchmark-ud-import-check benchmark-ud-report benchmark-naer-import-check benchmark-naer-report benchmark-paired-import-check benchmark-paired-report benchmark-formal-report benchmark-blind-v2-source-import-check benchmark-blind-v2-source-classification-check benchmark-blind-v2-pool-validate benchmark-blind-v2-freeze-check benchmark-blind-v2-replacements-validate benchmark-blind-v2-sample benchmark-blind-v2-sample-check benchmark-blind-v2-decisions-finalize benchmark-blind-v2-annotation-validate benchmark-blind-v2-decisions-validate benchmark-blind-v2-ledger-validate accuracy-annotation-status accuracy-blind-review-packet accuracy-gemini-advisory accuracy-promotion-gate accuracy-promote-backlog accuracy-holdout-annotation-packet accuracy-holdout-gemini-advisory accuracy-benchmark test test-all test-python test-java test-typescript test-rust test-go test-dotnet test-corpus-prepare release-gate version-check bump release help

PYTHON := uv run python
VERSION ?=
BATCH ?= it-api-cli
DATE ?= $(shell date +%F)
ISSUE ?=
MAINTAINER ?= tim
REVIEWED_AT ?=
ID_FROM ?=
ID_TO ?=
COMPETITORS ?= zhtw
REVIEWER_STAGE ?= first_human_review
HOLDOUT_BATCH ?=
COMPETITOR_ENV_HASH := $(shell jq -r '.environment.environment_sha256' benchmarks/accuracy/competitors.lock.json)
COMPETITOR_IMAGE ?= zhtw-benchmark-competitors:$(shell printf '%s' '$(COMPETITOR_ENV_HASH)' | cut -c1-12)
BLIND_V2_POOL ?= benchmarks/accuracy/blind-v2.candidate-pool.json
BLIND_V2_INPUTS ?= benchmarks/accuracy/blind-v2.inputs.json
BLIND_V2_REPLACEMENTS ?= benchmarks/accuracy/blind-v2.replacements.json
BLIND_V2_ANNOTATION_DECISIONS ?= benchmarks/accuracy/blind-v2.annotation-decisions.json
BLIND_V2_EXPECTED ?= benchmarks/accuracy/blind-v2.expected.json
BLIND_V2_FREEZE_REPORT ?= docs/reports/blind-v2-pool-freeze-2026-07-30.json
BLIND_V2_FROZEN_AT ?= 2026-07-30T08:37:49+08:00
BLIND_V2_DECISIONS ?= benchmarks/accuracy/blind-v2.final-decisions.json
BLIND_V2_LEDGER ?= benchmarks/accuracy/private/blind-v2.evaluation-ledger.jsonl
BLIND_V2_N ?= 1960
BLIND_V2_BATCH_032_PRIOR_PACKETS := $(wildcard \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-00[1-9].json \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-01[0-9].json \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-02[0-9].json \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-030.json \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-031.json)
BLIND_V2_BATCH_033_PRIOR_PACKETS := $(BLIND_V2_BATCH_032_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-032.json
BLIND_V2_BATCH_034_PRIOR_PACKETS := $(BLIND_V2_BATCH_033_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-033.json
BLIND_V2_BATCH_035_PRIOR_PACKETS := $(BLIND_V2_BATCH_034_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-034.json
BLIND_V2_BATCH_036_PRIOR_PACKETS := $(BLIND_V2_BATCH_035_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-035.json
BLIND_V2_BATCH_037_PRIOR_PACKETS := $(BLIND_V2_BATCH_036_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-036.json
BLIND_V2_BATCH_038_PRIOR_PACKETS := $(BLIND_V2_BATCH_037_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-037.json
BLIND_V2_BATCH_039_PRIOR_PACKETS := $(BLIND_V2_BATCH_038_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-038.json
BLIND_V2_BATCH_040_PRIOR_PACKETS := $(BLIND_V2_BATCH_039_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-039.json
BLIND_V2_BATCH_041_PRIOR_PACKETS := $(BLIND_V2_BATCH_040_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-040.json
BLIND_V2_BATCH_042_PRIOR_PACKETS := $(BLIND_V2_BATCH_041_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-041.json
BLIND_V2_BATCH_043_PRIOR_PACKETS := $(BLIND_V2_BATCH_042_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-042.json
BLIND_V2_BATCH_044_PRIOR_PACKETS := $(BLIND_V2_BATCH_043_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-043.json
BLIND_V2_BATCH_045_PRIOR_PACKETS := $(BLIND_V2_BATCH_044_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-044.json
BLIND_V2_BATCH_046_PRIOR_PACKETS := $(BLIND_V2_BATCH_045_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-045.json
BLIND_V2_BATCH_047_PRIOR_PACKETS := $(BLIND_V2_BATCH_046_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-046.json
BLIND_V2_BATCH_048_PRIOR_PACKETS := $(BLIND_V2_BATCH_047_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-047.json
BLIND_V2_BATCH_049_PRIOR_PACKETS := $(BLIND_V2_BATCH_048_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-048.json
BLIND_V2_BATCH_050_PRIOR_PACKETS := $(BLIND_V2_BATCH_049_PRIOR_PACKETS) \
	benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-049.json
BLIND_V2_CONFIRMED_DECISIONS := $(wildcard \
	docs/reports/blind-v2-source-classification-maintainer-decision-batch-*.json)

# === Core ===

export: ## Export SDK data (zhtw-data.json + golden-test.json)
	$(PYTHON) -m zhtw export --output sdk/data --verbose
	@mkdir -p sdk/rust/zhtw/data
	@cp sdk/data/zhtw-data.json sdk/rust/zhtw/data/zhtw-data.json
	@echo "  synced crate-local copy → sdk/rust/zhtw/data/zhtw-data.json"
	@cp sdk/data/zhtw-data.json sdk/go/zhtw/zhtw-data.json
	@echo "  synced Go embed copy → sdk/go/zhtw/zhtw-data.json"

export-check: ## Verify committed SDK data exactly matches a fresh export
	@tmp=$$(mktemp -d); \
	  trap 'rm -rf "$$tmp"' EXIT; \
	  $(PYTHON) -m zhtw export --output "$$tmp" >/dev/null; \
	  for f in zhtw-data.json golden-test.json; do \
	    if ! cmp -s "sdk/data/$$f" "$$tmp/$$f"; then \
	      echo "❌ sdk/data/$$f is stale — run 'make export'"; \
	      exit 1; \
	    fi; \
	  done; \
	  cmp -s sdk/data/zhtw-data.json sdk/rust/zhtw/data/zhtw-data.json || \
	    { echo "❌ Rust SDK data copy is stale — run 'make export'"; exit 1; }; \
	  cmp -s sdk/data/zhtw-data.json sdk/go/zhtw/zhtw-data.json || \
	    { echo "❌ Go SDK data copy is stale — run 'make export'"; exit 1; }; \
	  echo "✅ SDK data matches a fresh export"

precision-benchmark: ## Compare zhtw precision with optional competitor converters
	$(PYTHON) scripts/competitor_benchmark.py

accuracy-annotation-status: ## Report M1 annotation backlog progress
	$(PYTHON) scripts/accuracy_annotation_status.py

accuracy-blind-review-packet: ## Create a blind review packet for annotation cases
	$(PYTHON) scripts/create_blind_review_packet.py --batch $(BATCH) --generated-date $(DATE) --output docs/reports/annotation-blind-review-packet-$(BATCH)-$(DATE).md

accuracy-gemini-advisory: ## Generate Gemini Vertex advisory review for annotation cases
	$(PYTHON) scripts/generate_gemini_vertex_advisory.py --batch $(BATCH) --generated-date $(DATE) $(if $(ID_FROM),--id-from $(ID_FROM),) $(if $(ID_TO),--id-to $(ID_TO),) --output-json docs/reports/annotation-gemini-vertex-advisory-$(BATCH)-$(DATE).json --output-md docs/reports/annotation-gemini-vertex-advisory-$(BATCH)-$(DATE).md --update-backlog

accuracy-promotion-gate: ## Check approved annotation cases against current zhtw output
	$(PYTHON) scripts/check_accuracy_backlog.py --generated-date $(DATE) --output-json docs/reports/annotation-promotion-gate-$(DATE).json --output-md docs/reports/annotation-promotion-gate-$(DATE).md

accuracy-promote-backlog: ## Promote promotion-ready annotation cases into regression-v1
	$(PYTHON) scripts/promote_accuracy_backlog.py --gate docs/reports/annotation-promotion-gate-$(DATE).json

accuracy-holdout-annotation-packet: ## Create a human annotation packet for sealed holdout inputs
	$(PYTHON) scripts/create_holdout_annotation_packet.py --generated-date $(DATE) --reviewer-stage $(REVIEWER_STAGE) $(if $(HOLDOUT_BATCH),--batch $(HOLDOUT_BATCH),) $(if $(ID_FROM),--id-from $(ID_FROM),) $(if $(ID_TO),--id-to $(ID_TO),) --output docs/reports/holdout-annotation-packet-blind-v1-$(REVIEWER_STAGE)-$(DATE).md

accuracy-holdout-gemini-advisory: ## Generate Gemini Vertex advisory for sealed holdout inputs
	$(PYTHON) scripts/generate_holdout_gemini_vertex_advisory.py --generated-date $(DATE) $(if $(HOLDOUT_BATCH),--batch $(HOLDOUT_BATCH),) $(if $(ID_FROM),--id-from $(ID_FROM),) $(if $(ID_TO),--id-to $(ID_TO),) --output-json docs/reports/holdout-gemini-vertex-advisory-blind-v1-0001-0100-$(DATE).json --output-md docs/reports/holdout-gemini-vertex-advisory-blind-v1-0001-0100-$(DATE).md

benchmark-validate: ## Validate benchmark manifests, licenses, hashes, and preregistrations
	$(PYTHON) scripts/validate_benchmark_assets.py
	$(PYTHON) scripts/audit_benchmark_publication.py

benchmark-competitor-build: ## Build the digest-pinned competitor environment
	docker build --build-arg ENVIRONMENT_HASH=$(COMPETITOR_ENV_HASH) --tag $(COMPETITOR_IMAGE) --file benchmarks/accuracy/competitor-env/Dockerfile benchmarks/accuracy/competitor-env

benchmark-competitor-probe: benchmark-competitor-build ## Probe every locked competitor adapter
	$(PYTHON) scripts/validate_competitor_environment.py --image $(COMPETITOR_IMAGE)

benchmark-public-reproduce: ## Locally smoke-test the public third-party reproduction package
	$(PYTHON) scripts/reproduce_public_benchmarks.py --operator local-maintainer --local-smoke-test --output /tmp/zhtw-public-benchmark-attestation.json

benchmark-ud-import-check: ## Download pinned UD sources and verify normalized output
	$(PYTHON) scripts/import_ud_gsd_benchmark.py --check

benchmark-ud-report: ## Run the public UD GSD/GSDSimp secondary track
	$(PYTHON) scripts/run_ud_gsd_benchmark.py --generated-date $(DATE) --output-prefix docs/reports/ud-gsd-benchmark-$(DATE)

benchmark-naer-import-check: ## Download pinned NAER source and verify normalized output
	$(PYTHON) scripts/import_naer_terms_benchmark.py --check

benchmark-naer-report: ## Run the public NAER computer terminology secondary track
	$(PYTHON) scripts/run_naer_terms_benchmark.py --generated-date $(DATE) --output-prefix docs/reports/naer-terms-benchmark-$(DATE)

benchmark-paired-import-check: ## Verify pinned AOSP, VS Code, and Firefox paired datasets
	@for id in aosp-framework-paired-ui-v1 vscode-paired-ui-v1 firefox-paired-ui-v1; do \
	  $(PYTHON) scripts/import_paired_localization_benchmark.py \
	    --manifest benchmarks/accuracy/manifests/$$id.json --check || exit 1; \
	done

benchmark-paired-report: ## Run project-managed public paired localization tracks
	@for id in aosp-framework-paired-ui-v1 vscode-paired-ui-v1 firefox-paired-ui-v1; do \
	  $(PYTHON) scripts/run_paired_localization_benchmark.py \
	    --manifest benchmarks/accuracy/manifests/$$id.json \
	    --generated-date $(DATE) --output-prefix docs/reports/$$id-benchmark-$(DATE) || exit 1; \
	done

benchmark-formal-report: ## Build the scoped aggregate market report
	$(PYTHON) scripts/build_formal_benchmark_report.py

benchmark-blind-v2-source-import-check: ## Download pinned Blind-v2 source pilots and verify input-only outputs
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/flores-200-zho-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ud-chinese-cfl-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/cdc-stacks-111808-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/cdc-stacks-120024-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/cdc-stacks-116683-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-ui-i18n-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-llm-product-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-it-api-cli-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-formal-llm-semantic-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/massive-1-0-zh-cn-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ftc-small-business-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ftc-heads-up-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ftc-how-to-avoid-scam-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ftc-identity-theft-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/nps-essential-acadia-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-floods-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-hurricanes-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-earthquakes-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-drought-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-home-fires-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-landslides-debris-flow-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-radiation-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-electrical-safety-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-chainsaw-safety-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-work-zone-traffic-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-disaster-falls-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-small-business-consultation-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-disaster-cleanup-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/osha-fallen-workers-family-simplified-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/vscode-loc-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/chromium-strings-zh-cn-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/aosp-framework-zh-rcn-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-formal-entity-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-it-llm-ui-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-balanced-baseline-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-formal-llm-balance-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-llm-domain-balance-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-llm-social-baseline-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-it-llm-social-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-llm-it-ui-baseline-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-it-ui-llm-formal-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-tornadoes-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-winter-weather-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-kids-tornadoes-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-campus-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-evacuation-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-formal-llm-overconversion-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/ready-gov-cybersecurity-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/zhtw-project-formal-llm-context-guard-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/cisa-cyber-hygiene-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/cisa-personal-security-zh-hans-v1.json --check
	$(PYTHON) scripts/import_blind_v2_source_pilot.py --manifest benchmarks/accuracy/manifests/census-newsroom-zh-hans-v1.json --check

benchmark-blind-v2-permissioned-intake-check: ## Validate the collecting permissioned user-report batch
	$(PYTHON) scripts/validate_permissioned_user_reports.py benchmarks/accuracy/sources/permissioned-user-report-batch-001.json

benchmark-blind-v2-permissioned-issue-preview: ## Preview a permissioned GitHub issue (ISSUE=N)
	@test -n "$(ISSUE)" || (echo "ISSUE is required" >&2; exit 2)
	$(PYTHON) scripts/import_permissioned_user_report_issue.py --issue $(ISSUE)

benchmark-blind-v2-permissioned-issue-import: ## Import a reviewed issue (ISSUE=N REVIEWED_AT=ISO8601)
	@test -n "$(ISSUE)" || (echo "ISSUE is required" >&2; exit 2)
	@test -n "$(REVIEWED_AT)" || (echo "REVIEWED_AT is required" >&2; exit 2)
	$(PYTHON) scripts/import_permissioned_user_report_issue.py --issue $(ISSUE) --write --maintainer $(MAINTAINER) --reviewed-at $(REVIEWED_AT)

benchmark-blind-v2-permissioned-ready-check: ## Require a complete 100-case permissioned user-report batch
	$(PYTHON) scripts/validate_permissioned_user_reports.py --require-ready benchmarks/accuracy/sources/permissioned-user-report-batch-001.json

benchmark-blind-v2-source-classification-check: ## Verify deterministic input-only source classification packet
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --generated-date 2026-07-20 --batch-number 1 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-001.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-001.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-001.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-001-2026-07-20.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-001-2026-07-20.json --maintainer tim --decision-date 2026-07-21 --selected-advisory codex --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-001-2026-07-21.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-001.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-001-2026-07-20.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-001-2026-07-20.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-001-2026-07-21.json --generated-date 2026-07-20 --output docs/reports/blind-v2-source-classification-diff-batch-001-2026-07-20.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --generated-date 2026-07-21 --batch-number 2 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-002.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-002.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-002.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-002-2026-07-21.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-002-2026-07-21.json --maintainer tim --decision-date 2026-07-21 --selected-advisory codex --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-002-2026-07-21.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-002.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-002-2026-07-21.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-002-2026-07-21.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-002-2026-07-21.json --generated-date 2026-07-21 --output docs/reports/blind-v2-source-classification-diff-batch-002-2026-07-21.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/cdc-stacks-111808-v1.json --source benchmarks/accuracy/external/cdc-stacks-120024-v1.json --source benchmarks/accuracy/external/cdc-stacks-116683-v1.json --all-source-cases --batch-number 3 --generated-date 2026-07-22 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-003.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-003.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-003.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-003-2026-07-22.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-003-2026-07-22.json --maintainer tim --decision-date 2026-07-22 --selected-advisory codex --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-003-2026-07-22.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-003.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-003-2026-07-22.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-003-2026-07-22.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-003-2026-07-22.json --generated-date 2026-07-22 --output docs/reports/blind-v2-source-classification-diff-batch-003-2026-07-22.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-ui-i18n-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-product-v1.json --all-source-cases --batch-number 4 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-004.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-004.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-004.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-004-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-004-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-004-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-004-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-004.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-004-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-004-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-004-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-004-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --batch-size 100 --batch-number 5 --selection-round 1 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-005.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-005.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-005.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-005-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-005-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-005-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-005-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-005.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-005-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-005-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-005-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-005-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-it-api-cli-v1.json --all-source-cases --batch-number 6 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-006.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-006.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-006.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-006-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-006-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-006-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-006-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-006.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-006-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-006-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-006-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-006-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ftc-small-business-simplified-v1.json --all-source-cases --batch-number 7 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-007.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-007.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-007.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-007-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-007-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-007-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-007-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-007.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-007-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-007-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-007-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-007-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/nps-essential-acadia-simplified-v1.json --all-source-cases --batch-number 8 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-008.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-008.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-008.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-008-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-008-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-008-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-008-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-008.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-008-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-008-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-008-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-008-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ready-gov-floods-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-hurricanes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-earthquakes-zh-hans-v1.json --batch-size 100 --batch-number 9 --selection-round 1 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-009-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-009-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-009-2026-07-23.json --maintainer tim --decision-date 2026-07-23 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-009-2026-07-23.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-009-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-009-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-009-2026-07-23.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-009-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/osha-chainsaw-safety-simplified-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/osha-disaster-falls-simplified-v1.json --source benchmarks/accuracy/external/osha-electrical-safety-simplified-v1.json --source benchmarks/accuracy/external/osha-fallen-workers-family-simplified-v1.json --source benchmarks/accuracy/external/osha-small-business-consultation-simplified-v1.json --source benchmarks/accuracy/external/osha-work-zone-traffic-simplified-v1.json --batch-size 100 --batch-number 10 --selection-round 1 --generated-date 2026-07-23 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.md --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-010-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-010-2026-07-23.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-010-2026-07-23.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-010-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-010-2026-07-23.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-010-2026-07-23.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-010-2026-07-24.json --generated-date 2026-07-23 --output docs/reports/blind-v2-source-classification-diff-batch-010-2026-07-23.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/vscode-loc-zh-hans-v1.json --batch-size 100 --batch-number 11 --selection-round 1 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-011.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-011.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-011-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-011-2026-07-24.json --gemini-case-id vscode-loc-zh-hans-v1/entry-0e09bd6f9c17b08d --gemini-case-id vscode-loc-zh-hans-v1/entry-28115d85b27abca4 --gemini-case-id vscode-loc-zh-hans-v1/entry-3bc2558a39853869 --gemini-case-id vscode-loc-zh-hans-v1/entry-695847b5a35b3aea --overrides docs/reports/blind-v2-source-classification-maintainer-adjustments-batch-011-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-011-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-011.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-011-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-011-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-011-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-011-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-011.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-011-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-011-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-011-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-011-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ftc-heads-up-simplified-v1.json --batch-size 100 --batch-number 12 --selection-round 1 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-012-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-012-2026-07-24.json --overrides docs/reports/blind-v2-source-classification-maintainer-adjustments-batch-012-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-012-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-012-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-012-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-012-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-012-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-012-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-012-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-012-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-012-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-formal-llm-semantic-v1.json --all-source-cases --batch-number 13 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-013.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-013.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-013-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-013-2026-07-24.json --gemini-case-id zhtw-project-formal-llm-semantic-v1/formal-036 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-009 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-011 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-012 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-015 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-016 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-021 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-024 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-025 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-026 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-027 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-028 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-032 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-033 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-034 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-035 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-036 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-037 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-041 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-042 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-044 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-045 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-046 --gemini-case-id zhtw-project-formal-llm-semantic-v1/llm-049 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-013-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-013-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-013.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-013-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-013-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-013-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-013-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-013.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-013-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-013-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-013-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-013-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --batch-size 100 --batch-number 14 --selection-round 1 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-014.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-014.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-014-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-014-2026-07-24.json --gemini-case-id aosp-framework-zh-rcn-v1/string-04e490f612fcaa02 --gemini-case-id aosp-framework-zh-rcn-v1/string-114f2dd20598dd3d --gemini-case-id aosp-framework-zh-rcn-v1/string-6b65b8fa97b1b2c5 --gemini-case-id aosp-framework-zh-rcn-v1/string-7179b94f61589660 --gemini-case-id aosp-framework-zh-rcn-v1/string-cd5eacc89701c0a9 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-014-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-014-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-014.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-014-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-014-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-014-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-014-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-014.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-014-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-014-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-014-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-014-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-formal-entity-guard-v1.json --all-source-cases --batch-number 15 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-015.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-015.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-015-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-015-2026-07-24.json --gemini-case-id zhtw-project-formal-entity-guard-v1/baseline-001 --gemini-case-id zhtw-project-formal-entity-guard-v1/baseline-002 --gemini-case-id zhtw-project-formal-entity-guard-v1/baseline-007 --gemini-case-id zhtw-project-formal-entity-guard-v1/baseline-008 --gemini-case-id zhtw-project-formal-entity-guard-v1/baseline-019 --gemini-case-id zhtw-project-formal-entity-guard-v1/code-012 --gemini-case-id zhtw-project-formal-entity-guard-v1/code-016 --gemini-case-id zhtw-project-formal-entity-guard-v1/code-018 --gemini-case-id zhtw-project-formal-entity-guard-v1/entity-015 --gemini-case-id zhtw-project-formal-entity-guard-v1/quote-001 --gemini-case-id zhtw-project-formal-entity-guard-v1/quote-003 --gemini-case-id zhtw-project-formal-entity-guard-v1/quote-005 --gemini-case-id zhtw-project-formal-entity-guard-v1/title-009 --gemini-case-id zhtw-project-formal-entity-guard-v1/title-015 --gemini-case-id zhtw-project-formal-entity-guard-v1/title-016 --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-015-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-015.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-015-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-015-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-015-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-015-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-015.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-015-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-015-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-015-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-015-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/cisa-cyber-hygiene-zh-hans-v1.json --all-source-cases --batch-number 16 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-016.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-016.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-016-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-016-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-016-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-016.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-016-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-016-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-016-2026-07-24.json --maintainer tim --decision-date 2026-07-24 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-016-2026-07-24.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-016.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-016-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-016-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-016-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-016-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/cisa-personal-security-zh-hans-v1.json --batch-size 100 --batch-number 17 --selection-round 1 --generated-date 2026-07-24 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-017-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-017-2026-07-24.json --gemini-case-id cisa-personal-security-zh-hans-v1/sentence-010 --gemini-case-id cisa-personal-security-zh-hans-v1/sentence-020 --gemini-case-id cisa-personal-security-zh-hans-v1/sentence-039 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-017-2026-07-24.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-017-2026-07-24.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-017-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-017-2026-07-24.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-017-2026-07-24.json --maintainer tim --decision-date 2026-07-25 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-017-2026-07-25.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-017-2026-07-24.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-017-2026-07-24.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-017-2026-07-25.json --generated-date 2026-07-24 --output docs/reports/blind-v2-source-classification-diff-batch-017-2026-07-24.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-it-llm-ui-guard-v1.json --all-source-cases --batch-number 18 --generated-date 2026-07-26 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-018.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-018.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-018-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-018-2026-07-26.json --gemini-case-id zhtw-project-it-llm-ui-guard-v1/llm-009 --gemini-case-id zhtw-project-it-llm-ui-guard-v1/llm-011 --gemini-case-id zhtw-project-it-llm-ui-guard-v1/llm-024 --gemini-case-id zhtw-project-it-llm-ui-guard-v1/llm-027 --gemini-case-id zhtw-project-it-llm-ui-guard-v1/ui-015 --gemini-case-id zhtw-project-it-llm-ui-guard-v1/ui-019 --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-018-2026-07-26.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-018.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-018-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-018-2026-07-26.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-018-2026-07-26.json --maintainer tim --decision-date 2026-07-26 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-018-2026-07-26.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-018.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-018-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-018-2026-07-26.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-018-2026-07-26.json --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-diff-batch-018-2026-07-26.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --batch-size 100 --batch-number 19 --selection-round 2 --generated-date 2026-07-26 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-019.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-019.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-019-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-019-2026-07-26.json --gemini-case-id aosp-framework-zh-rcn-v1/string-41fe8896d8230745 --gemini-case-id aosp-framework-zh-rcn-v1/string-5a5974d7da8c2911 --gemini-case-id aosp-framework-zh-rcn-v1/string-8df6c3c7d0c01665 --gemini-case-id aosp-framework-zh-rcn-v1/string-bcdd661feca46e04 --gemini-case-id aosp-framework-zh-rcn-v1/string-e4707e773f73e282 --gemini-case-id aosp-framework-zh-rcn-v1/string-f614093d4cc36a75 --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-019-2026-07-26.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-019.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-019-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-019-2026-07-26.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-019-2026-07-26.json --maintainer tim --decision-date 2026-07-26 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-019-2026-07-26.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-019.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-019-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-019-2026-07-26.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-019-2026-07-26.json --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-diff-batch-019-2026-07-26.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/cisa-personal-security-zh-hans-v1.json --source benchmarks/accuracy/external/ftc-heads-up-simplified-v1.json --source benchmarks/accuracy/external/osha-chainsaw-safety-simplified-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/osha-fallen-workers-family-simplified-v1.json --source benchmarks/accuracy/external/osha-small-business-consultation-simplified-v1.json --source benchmarks/accuracy/external/osha-work-zone-traffic-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-earthquakes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-floods-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-hurricanes-zh-hans-v1.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --balanced-remaining --batch-size 100 --batch-number 20 --generated-date 2026-07-26 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-020-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-020-2026-07-26.json --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-020-2026-07-26.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-020-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-020-2026-07-26.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-020-2026-07-26.json --maintainer tim --decision-date 2026-07-26 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-020-2026-07-26.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-020-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-020-2026-07-26.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-020-2026-07-26.json --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-diff-batch-020-2026-07-26.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-balanced-baseline-guard-v1.json --all-source-cases --batch-number 21 --generated-date 2026-07-26 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-021.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-021.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-021-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-021-2026-07-26.json --gemini-case-id zhtw-project-balanced-baseline-guard-v1/ui-010 --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-021-2026-07-26.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-021.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-021-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-021-2026-07-26.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-021-2026-07-26.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-021-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-021.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-021-2026-07-26.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-021-2026-07-26.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-021-2026-07-27.json --generated-date 2026-07-26 --output docs/reports/blind-v2-source-classification-diff-batch-021-2026-07-26.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ready-gov-drought-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-radiation-zh-hans-v1.json --batch-size 100 --batch-number 22 --selection-round 1 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-022-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-022-2026-07-27.json --gemini-case-id ready-gov-drought-zh-hans-v1/sentence-011 --gemini-case-id ready-gov-home-fires-zh-hans-v1/sentence-045 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-001 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-002 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-004 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-009 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-011 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-023 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-025 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-028 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-037 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-047 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-049 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-053 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-061 --gemini-case-id ready-gov-radiation-zh-hans-v1/sentence-035 --gemini-case-id ready-gov-radiation-zh-hans-v1/sentence-036 --gemini-case-id ready-gov-radiation-zh-hans-v1/sentence-050 --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-022-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-022-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-022-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-022-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-022-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-022-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-022-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-022-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-022-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/chromium-strings-zh-cn-v1.json --batch-size 100 --batch-number 23 --selection-round 1 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-023.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-023.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-023-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-023-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-023-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-023.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-023-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-023-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-023-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-023-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-023.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-023-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-023-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-023-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-023-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-formal-llm-balance-v1.json --all-source-cases --batch-number 24 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-024.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-024.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-024-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-024-2026-07-27.json --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-002 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-003 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-004 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-006 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-007 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-009 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-010 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-011 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-012 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-013 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-017 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-027 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-030 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-031 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-038 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-039 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-040 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-042 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-044 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-046 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-047 --gemini-case-id zhtw-project-formal-llm-balance-v1/formal-049 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-024-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-024-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-024.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-024-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-024-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-024-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-024-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-024.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-024-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-024-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-024-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-024-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --batch-size 100 --batch-number 25 --selection-round 1 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-025-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-025-2026-07-27.json --gemini-case-id census-newsroom-zh-hans-v1/page-01-sentence-036 --gemini-case-id census-newsroom-zh-hans-v1/page-02-sentence-012 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-001 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-004 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-005 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-006 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-008 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-011 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-021 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-026 --gemini-case-id census-newsroom-zh-hans-v1/page-03-sentence-027 --gemini-case-id census-newsroom-zh-hans-v1/page-04-sentence-012 --gemini-case-id census-newsroom-zh-hans-v1/page-04-sentence-014 --gemini-case-id census-newsroom-zh-hans-v1/page-08-sentence-029 --gemini-case-id census-newsroom-zh-hans-v1/page-08-sentence-030 --gemini-case-id census-newsroom-zh-hans-v1/page-08-sentence-031 --gemini-case-id census-newsroom-zh-hans-v1/page-08-sentence-034 --gemini-case-id census-newsroom-zh-hans-v1/page-09-sentence-001 --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-025-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-025-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-025-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-025-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-025-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-025-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-025-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-025-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-025-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-competitor-risk-taxonomy-v1.json --all-source-cases --batch-number 26 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-026.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-026.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-026-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-026-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-026-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-026-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-026.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-026-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-026-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-026-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-026-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-026.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-026-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-026-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-026-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-026-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --batch-size 100 --batch-number 27 --selection-round 1 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-027-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-027-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-027-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-027-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-027-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-027-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-027-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-027-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-027-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-027-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-027-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-027-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.json --balanced-remaining --batch-size 90 --batch-number 28 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-028.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-028.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-028-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-028-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-028-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-028-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-028.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-028-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-028-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-028-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-028-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-028.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-028-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-028-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-028-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-028-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/cisa-personal-security-zh-hans-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-drought-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-radiation-zh-hans-v1.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.json --balanced-remaining --batch-size 70 --batch-number 29 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-029.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-029.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-029-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-029-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-029-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-029-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-029.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-029-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-029-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-029-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-029-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-029.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-029-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-029-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-029-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-029-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --source benchmarks/accuracy/external/chromium-strings-zh-cn-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-radiation-zh-hans-v1.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-001.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-002.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-003.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-004.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-005.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-006.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-007.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-008.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-009.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-010.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-011.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-012.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-013.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-014.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-015.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-016.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-017.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-018.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-019.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-020.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-021.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-022.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-023.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-024.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-025.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-026.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-027.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-028.json --exclude-packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-029.json --balanced-remaining --batch-size 96 --batch-number 30 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-030.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-030.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-030-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-030-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-030-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-030-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-030.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-030-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-030-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-030-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-030-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-030.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-030-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-030-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-030-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-030-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/zhtw-project-llm-domain-balance-v1.json --all-source-cases --batch-number 31 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-031.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-031.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-031-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-031-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-031-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-031-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-031.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-031-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-031-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-031-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-031-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-031.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-031-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-031-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-031-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-031-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/chromium-strings-zh-cn-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_032_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 96 --batch-number 32 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-032.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-032.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-032-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-032-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-032-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-032-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-032.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-032-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-032-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-032-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-032-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-032.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-032-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-032-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-032-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-032-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/chromium-strings-zh-cn-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_033_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 96 --batch-number 33 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-033.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-033.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-033-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-033-2026-07-27.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-033-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-033-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-033.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-033-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-033-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-033-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-033-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-033.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-033-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-033-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-033-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-033-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/ready-gov-drought-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-social-baseline-v1.json $(foreach packet,$(BLIND_V2_BATCH_034_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 96 --batch-number 34 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-034.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-034.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-034-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-034-2026-07-27.json --gemini-case-id zhtw-project-llm-social-baseline-v1/llm-046 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-034-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-034-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-034.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-034-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-034-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-034-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-034-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-034.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-034-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-034-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-034-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-034-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-social-baseline-v1.json $(foreach packet,$(BLIND_V2_BATCH_035_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 96 --batch-number 35 --generated-date 2026-07-27 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-035.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-035.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-035-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-035-2026-07-27.json --gemini-case-id census-newsroom-zh-hans-v1/page-02-sentence-002 --gemini-case-id census-newsroom-zh-hans-v1/page-04-sentence-010 --gemini-case-id census-newsroom-zh-hans-v1/page-05-sentence-010 --gemini-case-id zhtw-project-llm-social-baseline-v1/llm-003 --gemini-case-id zhtw-project-llm-social-baseline-v1/llm-009 --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-035-2026-07-27.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-035.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-035-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-035-2026-07-27.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-035-2026-07-27.json --maintainer tim --decision-date 2026-07-27 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-035-2026-07-27.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-035.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-035-2026-07-27.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-035-2026-07-27.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-035-2026-07-27.json --generated-date 2026-07-27 --output docs/reports/blind-v2-source-classification-diff-batch-035-2026-07-27.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-social-baseline-v1.json $(foreach packet,$(BLIND_V2_BATCH_036_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 96 --batch-number 36 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-036.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-036.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-036-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-036-2026-07-28.json --gemini-case-id census-newsroom-zh-hans-v1/page-01-sentence-011 --gemini-case-id census-newsroom-zh-hans-v1/page-02-sentence-011 --gemini-case-id census-newsroom-zh-hans-v1/page-06-sentence-003 --gemini-case-id census-newsroom-zh-hans-v1/page-06-sentence-035 --gemini-case-id census-newsroom-zh-hans-v1/page-08-sentence-028 --gemini-case-id massive-1-0-zh-cn-v1/11605 --gemini-case-id massive-1-0-zh-cn-v1/14294 --gemini-case-id massive-1-0-zh-cn-v1/14674 --gemini-case-id massive-1-0-zh-cn-v1/14717 --gemini-case-id massive-1-0-zh-cn-v1/3006 --gemini-case-id massive-1-0-zh-cn-v1/3820 --gemini-case-id zhtw-project-llm-social-baseline-v1/llm-011 --gemini-case-id zhtw-project-llm-social-baseline-v1/llm-015 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-022 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-023 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-034 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-040 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-043 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-047 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-036-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-036-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-036.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-036-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-036-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-036-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-036-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-036.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-036-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-036-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-036-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-036-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-it-llm-social-guard-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_037_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 37 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-037.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-037.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-037-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-037-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-037-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-037-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-037.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-037-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-037-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-037-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-037-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-037.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-037-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-037-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-037-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-037-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-it-llm-social-guard-v1.json --source benchmarks/accuracy/external/cisa-personal-security-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-home-fires-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-radiation-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_038_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 38 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-038.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-038.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-038-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-038-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-038-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-038-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-038.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-038-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-038-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-038-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-038-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-038.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-038-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-038-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-038-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-038-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-it-ui-baseline-v1.json --source benchmarks/accuracy/external/osha-disaster-cleanup-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-drought-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-floods-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-hurricanes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_039_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 39 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-039.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-039.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-039-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-039-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-039-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-039-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-039.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-039-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-039-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-039-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-039-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-039.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-039-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-039-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-039-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-039-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-it-ui-baseline-v1.json --source benchmarks/accuracy/external/ready-gov-winter-weather-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_040_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 40 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-040.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-040.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-040-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-040-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-040-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-040.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-040-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-040-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-040-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-040-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-040.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-040-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-040-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-040-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-040-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/massive-1-0-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-it-ui-baseline-v1.json --source benchmarks/accuracy/external/ready-gov-tornadoes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-winter-weather-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_041_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 41 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-041.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-041.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-041-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-041-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-041-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-041.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-041-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-041-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-041-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-041-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-041.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-041-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-041-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-041-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-041-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/aosp-framework-zh-rcn-v1.json --source benchmarks/accuracy/external/zhtw-project-it-ui-llm-formal-guard-v1.json --source benchmarks/accuracy/external/ftc-how-to-avoid-scam-simplified-v1.json --source benchmarks/accuracy/external/ftc-identity-theft-simplified-v1.json $(foreach packet,$(BLIND_V2_BATCH_042_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 42 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-042.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-042.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-042-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-042-2026-07-28.json --gemini-case-id ftc-how-to-avoid-scam-simplified-v1/sentence-010 --gemini-case-id ftc-how-to-avoid-scam-simplified-v1/sentence-014 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-002 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-004 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-005 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-006 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-007 --gemini-case-id ftc-identity-theft-simplified-v1/sentence-012 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-042-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-042-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-042.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-042-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-042-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-042-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-042-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-042.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-042-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-042-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-042-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-042-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/chromium-strings-zh-cn-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/ftc-how-to-avoid-scam-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-tornadoes-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-it-ui-llm-formal-guard-v1.json $(foreach packet,$(BLIND_V2_BATCH_043_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 43 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-043.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-043.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-043-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-043-2026-07-28.json --gemini-case-id chromium-strings-zh-cn-v1/translation-5596627076506792578 --gemini-case-id chromium-strings-zh-cn-v1/translation-6248988683584659830 --gemini-case-id chromium-strings-zh-cn-v1/translation-6388799252195623474 --gemini-case-id kubernetes-docs-zh-cn-v1/page-01-sentence-0021 --gemini-case-id kubernetes-docs-zh-cn-v1/page-02-sentence-0033 --gemini-case-id zhtw-project-it-ui-llm-formal-guard-v1/ui-006 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-043-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-043-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-043.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-043-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-043-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-043-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-043-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-043.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-043-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-043-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-043-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-043-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/vscode-loc-zh-hans-v1.json --source benchmarks/accuracy/external/flores-200-zho-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-it-llm-social-guard-v1.json --source benchmarks/accuracy/external/zhtw-project-it-ui-llm-formal-guard-v1.json --source benchmarks/accuracy/external/ready-gov-winter-weather-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-radiation-zh-hans-v1.json --source benchmarks/accuracy/external/ftc-heads-up-simplified-v1.json --source benchmarks/accuracy/external/ftc-identity-theft-simplified-v1.json --source benchmarks/accuracy/external/cisa-personal-security-zh-hans-v1.json --source benchmarks/accuracy/external/census-newsroom-zh-hans-v1.json --source benchmarks/accuracy/external/ftc-how-to-avoid-scam-simplified-v1.json --source benchmarks/accuracy/external/ready-gov-landslides-debris-flow-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-tornadoes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-earthquakes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-floods-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-hurricanes-zh-hans-v1.json $(foreach packet,$(BLIND_V2_BATCH_044_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 44 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-044.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-044.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-044-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-044-2026-07-28.json --gemini-case-id flores-200-zho-hans-v1/devtest-0179 --gemini-case-id ready-gov-floods-zh-hans-v1/sentence-027 --gemini-case-id ready-gov-landslides-debris-flow-zh-hans-v1/sentence-007 --gemini-case-id ready-gov-radiation-zh-hans-v1/sentence-005 --gemini-case-id ready-gov-winter-weather-zh-hans-v1/sentence-012 --gemini-case-id vscode-loc-zh-hans-v1/entry-1bc2d120c0821a7f --gemini-case-id vscode-loc-zh-hans-v1/entry-8c957017a839953e --gemini-case-id vscode-loc-zh-hans-v1/entry-ec63ec66cb3a69b7 --gemini-case-id zhtw-project-it-llm-social-guard-v1/it-021 --gemini-case-id zhtw-project-it-llm-social-guard-v1/llm-017 --gemini-case-id zhtw-project-it-llm-social-guard-v1/social-020 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-044-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-044-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-044.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-044-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-044-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-044-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-044-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-044.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-044-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-044-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-044-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-044-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ready-gov-campus-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-kids-tornadoes-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-winter-weather-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-it-llm-social-guard-v1.json --source benchmarks/accuracy/external/zhtw-project-it-ui-llm-formal-guard-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-it-ui-baseline-v1.json --source benchmarks/accuracy/external/zhtw-project-llm-social-baseline-v1.json $(foreach packet,$(BLIND_V2_BATCH_045_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 45 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-045.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-045.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-045-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-045-2026-07-28.json --gemini-case-id zhtw-project-it-llm-social-guard-v1/social-007 --gemini-case-id zhtw-project-it-ui-llm-formal-guard-v1/ui-010 --gemini-case-id zhtw-project-it-ui-llm-formal-guard-v1/ui-022 --gemini-case-id zhtw-project-llm-social-baseline-v1/social-002 --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-045-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-045-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-045.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-045-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-045-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-045-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-045-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-045.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-045-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-045-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-045-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-045-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/zhtw-project-formal-llm-overconversion-guard-v1.json $(foreach packet,$(BLIND_V2_BATCH_046_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 46 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-046.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-046.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-046-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-046-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-046-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-046-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-046.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-046-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-046-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-046-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-046-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-046.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-046-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-046-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-046-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-046-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ready-gov-evacuation-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-formal-llm-overconversion-guard-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json $(foreach packet,$(BLIND_V2_BATCH_047_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 47 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-047.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-047.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-047-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-047-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-047-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-047-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-047.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-047-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-047-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-047-2026-07-28.json --maintainer tim --decision-date 2026-07-28 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-047-2026-07-28.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-047.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-047-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-047-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-047-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-047-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/ready-gov-cybersecurity-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-formal-llm-context-guard-v1.json --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json $(foreach packet,$(BLIND_V2_BATCH_048_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 48 --generated-date 2026-07-28 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-048.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-048.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-048-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-048-2026-07-28.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-048-2026-07-28.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-048-2026-07-28.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-048.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-048-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-048-2026-07-28.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-048-2026-07-28.json --maintainer tim --decision-date 2026-07-29 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-048-2026-07-29.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-048.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-048-2026-07-28.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-048-2026-07-28.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-048-2026-07-29.json --generated-date 2026-07-28 --output docs/reports/blind-v2-source-classification-diff-batch-048-2026-07-28.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/ready-gov-cybersecurity-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-evacuation-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-kids-tornadoes-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-formal-llm-context-guard-v1.json $(foreach packet,$(BLIND_V2_BATCH_049_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-source-class-remaining --batch-size 96 --batch-number 49 --generated-date 2026-07-29 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-049.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-049.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-049-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-049-2026-07-29.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-049-2026-07-29.json --generated-date 2026-07-29 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-049-2026-07-29.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-049.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-049-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-049-2026-07-29.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-049-2026-07-29.json --maintainer tim --decision-date 2026-07-29 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-049-2026-07-29.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-049.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-049-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-049-2026-07-29.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-049-2026-07-29.json --generated-date 2026-07-29 --output docs/reports/blind-v2-source-classification-diff-batch-049-2026-07-29.md --check
	$(PYTHON) scripts/create_blind_v2_source_classification_packet.py --source benchmarks/accuracy/external/kubernetes-docs-zh-cn-v1.json --source benchmarks/accuracy/external/ready-gov-cybersecurity-zh-hans-v1.json --source benchmarks/accuracy/external/ready-gov-evacuation-zh-hans-v1.json --source benchmarks/accuracy/external/zhtw-project-formal-llm-context-guard-v1.json $(foreach packet,$(BLIND_V2_BATCH_050_PRIOR_PACKETS),--exclude-packet $(packet)) --balanced-remaining --batch-size 80 --batch-number 50 --generated-date 2026-07-29 --output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-050.json --markdown-output benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-050.md --check
	$(PYTHON) scripts/build_blind_v2_codex_synthesis.py --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-050-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-050-2026-07-29.json --synthesis-overrides docs/reports/blind-v2-source-classification-codex-synthesis-adjustments-batch-050-2026-07-29.json --generated-date 2026-07-29 --output docs/reports/blind-v2-source-classification-codex-synthesis-batch-050-2026-07-29.json --check
	$(PYTHON) scripts/record_blind_v2_source_classification_decision.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-050.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-050-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-050-2026-07-29.json --synthesis docs/reports/blind-v2-source-classification-codex-synthesis-batch-050-2026-07-29.json --maintainer tim --decision-date 2026-07-29 --selected-advisory synthesis --output docs/reports/blind-v2-source-classification-maintainer-decision-batch-050-2026-07-29.json --check
	$(PYTHON) scripts/compare_blind_v2_source_classifications.py --packet benchmarks/accuracy/review-packets/blind-v2-source-classification-batch-050.json --codex docs/reports/blind-v2-source-classification-codex-first-pass-batch-050-2026-07-29.json --gemini docs/reports/blind-v2-source-classification-gemini-independent-batch-050-2026-07-29.json --maintainer-decisions docs/reports/blind-v2-source-classification-maintainer-decision-batch-050-2026-07-29.json --generated-date 2026-07-29 --output docs/reports/blind-v2-source-classification-diff-batch-050-2026-07-29.md --check

benchmark-blind-v2-pool-validate: ## Validate Blind-v2 source, dedupe, quota, and size policy
	$(PYTHON) scripts/blind_v2_governance.py validate-pool $(BLIND_V2_POOL) --require-ready

benchmark-blind-v2-freeze-check: ## Reproduce the frozen Blind-v2 pool and freeze report
	$(PYTHON) scripts/blind_v2_governance.py freeze $(BLIND_V2_POOL) --frozen-at $(BLIND_V2_FROZEN_AT) --output $(BLIND_V2_POOL) --report $(BLIND_V2_FREEZE_REPORT) --check

benchmark-blind-v2-replacements-validate: ## Validate deterministic Blind-v2 replacements
	$(PYTHON) scripts/blind_v2_governance.py validate-replacements $(BLIND_V2_POOL) $(BLIND_V2_REPLACEMENTS)

benchmark-blind-v2-sample: ## Deterministically sample the frozen Blind-v2 pool
	$(PYTHON) scripts/blind_v2_governance.py sample $(BLIND_V2_POOL) --selected-n $(BLIND_V2_N) --replacements $(BLIND_V2_REPLACEMENTS) --output $(BLIND_V2_INPUTS)

benchmark-blind-v2-sample-check: ## Reproduce the committed Blind-v2 sample exactly
	$(PYTHON) scripts/blind_v2_governance.py sample $(BLIND_V2_POOL) --selected-n $(BLIND_V2_N) --replacements $(BLIND_V2_REPLACEMENTS) --output $(BLIND_V2_INPUTS) --check

benchmark-blind-v2-annotation-validate: ## Validate public annotation coverage against private expected
	$(PYTHON) scripts/blind_v2_annotation.py validate-confirmation --inputs $(BLIND_V2_INPUTS) --progress $(BLIND_V2_ANNOTATION_DECISIONS) --expected $(BLIND_V2_EXPECTED)

benchmark-blind-v2-decisions-finalize: ## Rebuild the public N/N Blind-v2 decision summary
	$(PYTHON) scripts/blind_v2_governance.py finalize-decisions $(BLIND_V2_INPUTS) $(BLIND_V2_ANNOTATION_DECISIONS) --output $(BLIND_V2_DECISIONS)

benchmark-blind-v2-decisions-validate: ## Require maintainer decisions for every Blind-v2 case
	$(PYTHON) scripts/blind_v2_governance.py finalize-decisions $(BLIND_V2_INPUTS) $(BLIND_V2_ANNOTATION_DECISIONS) --output $(BLIND_V2_DECISIONS) --check
	$(PYTHON) scripts/blind_v2_governance.py validate-decisions $(BLIND_V2_INPUTS) $(BLIND_V2_DECISIONS)

benchmark-blind-v2-ledger-validate: ## Validate the private Blind-v2 one-shot ledger
	$(PYTHON) scripts/blind_v2_governance.py validate-ledger $(BLIND_V2_LEDGER)

accuracy-benchmark: ## Run the published blind-v1 evaluation benchmark
	$(PYTHON) scripts/run_accuracy_benchmark.py --inputs benchmarks/accuracy/blind-v1.inputs.json --expected benchmarks/accuracy/blind-v1.expected.json --competitors-lock benchmarks/accuracy/competitors.lock.json --competitors $(COMPETITORS) --generated-date $(DATE) --output-prefix docs/reports/accuracy-benchmark-$(DATE)

test-python: ## Run Python tests
	$(PYTHON) -m pytest tests/ -v

test-java: ## Run Java SDK tests
	cd sdk/java && mvn verify --batch-mode

test-typescript: ## Run TypeScript SDK tests and type-check
	cd sdk/typescript && pnpm install --frozen-lockfile && pnpm exec tsc --noEmit && pnpm test && pnpm build

test-rust: ## Run Rust SDK and WASM host tests
	cd sdk/rust && cargo test --workspace --release

test-go: ## Run Go SDK tests, vet, and lint
	cd sdk/go && go test ./... -race
	cd sdk/go && go vet ./...
	cd sdk/go && go run github.com/golangci/golangci-lint/cmd/golangci-lint@v1.64.8 run

test-dotnet: ## Run .NET SDK tests
	cd sdk/dotnet && DOTNET_ROLL_FORWARD=Major dotnet test tests/Zhtw.Tests/Zhtw.Tests.csproj -c Release

test-all: test-python test-java test-typescript test-rust test-go test-dotnet ## Run every SDK test suite

test: test-all ## Run every SDK test suite

test-corpus-prepare: ## Clone or verify the pinned public corpus
	@bash scripts/prepare-test-corpus.sh

release-gate: test-corpus-prepare ## Run the exact local/CI release gate
	@$(MAKE) version-check export-check
	uv run zhtw validate
	@$(MAKE) benchmark-validate
	uv run python scripts/audit_idempotency.py --sources cn,hk --curated-only --fail-on-issues
	@$(MAKE) test-all

# === Version management (mono-versioning) ===

version-check: ## Verify all SDK versions are aligned (mono-versioning)
	@PY_VER=$$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/'); \
	 INIT_VER=$$(grep '^__version__' src/zhtw/__init__.py | sed 's/__version__ = "\(.*\)"/\1/'); \
	 JAVA_VER=$$(sed -n 's|.*<version>\(.*\)</version>.*|\1|p' sdk/java/pom.xml | head -1); \
	 TS_VER=$$(grep '"version"' sdk/typescript/package.json | head -1 | sed 's/.*"version": "\(.*\)".*/\1/'); \
	 RUST_VER=$$(sed -n '/\[workspace\.package\]/,/^\[/ s/^version = "\(.*\)"/\1/p' sdk/rust/Cargo.toml); \
	 NET_VER=$$(sed -n 's|.*<Version>\(.*\)</Version>.*|\1|p' sdk/dotnet/Zhtw.csproj); \
	 DATA_VER=$$(grep -o '"version": *"[^"]*"' sdk/data/zhtw-data.json | head -1 | sed 's/.*"version": *"\(.*\)"/\1/'); \
	 WASM_VER=$$(grep '"version"' sdk/rust/zhtw-wasm/package.json | head -1 | sed 's/.*"version": "\(.*\)".*/\1/'); \
	 printf "  %-28s %s\n" "Python (pyproject.toml):" "$$PY_VER"; \
	 printf "  %-28s %s\n" "Python (__init__.py):"    "$$INIT_VER"; \
	 printf "  %-28s %s\n" "Java (sdk/java/pom.xml):" "$$JAVA_VER"; \
	 printf "  %-28s %s\n" "TypeScript (package.json):" "$$TS_VER"; \
	 printf "  %-28s %s\n" "Rust (Cargo.toml):"       "$$RUST_VER"; \
	 printf "  %-28s %s\n" ".NET (Zhtw.csproj):"      "$$NET_VER"; \
	 printf "  %-28s %s\n" "sdk/data/zhtw-data.json:" "$$DATA_VER"; \
	 printf "  %-28s %s\n" "WASM (zhtw-wasm/package.json):" "$$WASM_VER"; \
	 if [ "$$PY_VER" != "$$INIT_VER" ] || [ "$$PY_VER" != "$$JAVA_VER" ] || \
	    [ "$$PY_VER" != "$$TS_VER" ] || [ "$$PY_VER" != "$$RUST_VER" ] || \
	    [ "$$PY_VER" != "$$NET_VER" ] || [ "$$PY_VER" != "$$DATA_VER" ] || \
	    [ "$$PY_VER" != "$$WASM_VER" ]; then \
	   echo ""; \
	   echo "❌ Version mismatch — all SDKs must stay in sync (mono-versioning)"; \
	   echo "   Fix: run 'make bump VERSION=X.Y.Z' or 'make release VERSION=X.Y.Z'"; \
	   exit 1; \
	 fi; \
	 echo ""; \
	 echo "✅ All SDKs aligned at $$PY_VER"
	@if ! cmp -s sdk/data/zhtw-data.json sdk/rust/zhtw/data/zhtw-data.json 2>/dev/null; then \
	  echo ""; \
	  echo "❌ sdk/rust/zhtw/data/zhtw-data.json is out of sync"; \
	  echo "   Fix: run 'make export'"; \
	  exit 1; \
	fi
	@if ! cmp -s sdk/data/zhtw-data.json sdk/go/zhtw/zhtw-data.json 2>/dev/null; then \
	  echo ""; \
	  echo "❌ sdk/go/zhtw/zhtw-data.json is out of sync"; \
	  echo "   Fix: run 'make export'"; \
	  exit 1; \
	fi

bump: ## Bump all SDK versions without commit/tag/release: make bump VERSION=x.y.z
ifndef VERSION
	$(error VERSION is required. Usage: make bump VERSION=4.0.0)
endif
	@echo "📝 Bumping all SDKs to $(VERSION)..."
	@sed -i '' 's/^version = .*/version = "$(VERSION)"/' pyproject.toml
	@sed -i '' 's/^__version__ = .*/__version__ = "$(VERSION)"/' src/zhtw/__init__.py
	@# Only match the project version (4-space indent, top level of <project>).
	@# Plugin versions are nested deeper (12+ spaces) and must not be touched.
	@sed -i '' 's|^    <version>[^<]*</version>|    <version>$(VERSION)</version>|' sdk/java/pom.xml
	@sed -i '' 's/"version": "[^"]*"/"version": "$(VERSION)"/' sdk/typescript/package.json
	@sed -i '' '/^\[workspace\.package\]/,/^\[/ s|^version = "[0-9][0-9.]*"|version = "$(VERSION)"|' sdk/rust/Cargo.toml
	@sed -i '' 's/"version": "[^"]*"/"version": "$(VERSION)"/' sdk/rust/zhtw-wasm/package.json
	@sed -i '' 's|<Version>[^<]*</Version>|<Version>$(VERSION)</Version>|' sdk/dotnet/Zhtw.csproj
	@# AGENTS.md 標頭版本（曾因不在 bump 清單而漂移）
	@sed -i '' 's|^> \*\*v[0-9][0-9.]*\*\*|> **v$(VERSION)**|' AGENTS.md
	@# README files: Maven dep version, Gradle (Kotlin + Groovy), pre-commit rev tag.
	@# Pattern requires the version starts with a digit so we never touch placeholders.
	@sed -i '' 's|<version>[0-9][0-9.]*</version>|<version>$(VERSION)</version>|g' README.md README.en.md
	@sed -i '' 's|com.rajatim:zhtw:[0-9][0-9.]*|com.rajatim:zhtw:$(VERSION)|g' README.md README.en.md
	@sed -i '' 's|rev: v[0-9][0-9.]*|rev: v$(VERSION)|g' README.md README.en.md
	@# README files: Rust crate version in TOML snippets.
	@sed -i '' 's|zhtw = "[0-9][0-9.]*"|zhtw = "$(VERSION)"|g' README.md README.en.md
	@# Java SDK benchmark report header
	@sed -i '' 's,| SDK Version | [0-9][0-9.]* |,| SDK Version | $(VERSION) |,' sdk/java/BENCHMARK.md
	@# README: standalone binary download URL (percent-encoded tag)
	@sed -i '' 's|sdk%2Fgo%2Fv[0-9][0-9.]*|sdk%2Fgo%2Fv$(VERSION)|g' README.md README.en.md
	@# SDK READMEs: version strings in install snippets
	@for f in sdk/java/README.md sdk/go/README.md sdk/dotnet/README.md sdk/rust/zhtw/README.md; do \
	  if [ -f "$$f" ]; then \
	    sed -i '' 's|<version>[0-9][0-9.]*</version>|<version>$(VERSION)</version>|g' "$$f"; \
	    sed -i '' 's|com.rajatim:zhtw:[0-9][0-9.]*|com.rajatim:zhtw:$(VERSION)|g' "$$f"; \
	    sed -i '' 's|zhtw = "[0-9][0-9.]*"|zhtw = "$(VERSION)"|g' "$$f"; \
	    sed -i '' 's|sdk%2Fgo%2Fv[0-9][0-9.]*|sdk%2Fgo%2Fv$(VERSION)|g' "$$f"; \
	  fi; \
	done
	@echo "📦 Regenerating sdk/data (embeds version)..."
	$(PYTHON) -m zhtw export --output sdk/data
	@mkdir -p sdk/rust/zhtw/data
	@cp sdk/data/zhtw-data.json sdk/rust/zhtw/data/zhtw-data.json
	@cp sdk/data/zhtw-data.json sdk/go/zhtw/zhtw-data.json
	@echo "🔒 Refreshing Cargo.lock..."
	@cd sdk/rust && cargo check --quiet 2>/dev/null || true
	@$(MAKE) version-check

# === Release ===

release: ## One-command release（閘門+測試+bump+tag+GH Release）: make release VERSION=x.y.z
ifndef VERSION
	$(error VERSION is required. Usage: make release VERSION=4.0.0)
endif
	@bash scripts/release.sh $(VERSION)

release-dry: ## Release 預演（只跑閘門與測試，不做任何變更）: make release-dry VERSION=x.y.z
ifndef VERSION
	$(error VERSION is required. Usage: make release-dry VERSION=4.0.0)
endif
	@DRY_RUN=1 bash scripts/release.sh $(VERSION)

release-verify: ## 發布後驗證（7 workflows + 7 registries + Homebrew）: make release-verify VERSION=x.y.z
ifndef VERSION
	$(error VERSION is required. Usage: make release-verify VERSION=4.0.0)
endif
	@bash scripts/release-verify.sh $(VERSION)

# === Help ===

help: ## Show this help
	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | \
		awk 'BEGIN {FS = ":.*?## "}; {printf "  \033[36m%-20s\033[0m %s\n", $$1, $$2}'

.DEFAULT_GOAL := help
